连接远程服务器ubuntu利用yolov3训练数据集visdrone2019

连接远程服务器ubuntu利用yolov3训练数据集visdrone2019

趁着服务器在训练数据集,过来写篇帖子记录一下训练过程。

不断更新中…

需要的工具
本地计算机安装:

  1. Windows Terminal
  2. ssh
  3. vscode

远程服务器环境配置:

  1. 系统:ubuntu20.04
  2. GPU:Tesla P100 16G显存
  3. python环境: 2.7 && 3.6

需要的文件

  1. darknet文件包
  2. 预训练网络权重
  3. 数据集

准备工作

下载darknet框架

git clone https://github.com/pjreddie/darknet.git
cd darknet

修改makefile文件夹
连接远程服务器ubuntu利用yolov3训练数据集visdrone2019_第1张图片
开启GPU

GPU=1
CUDNN=1
OPENCV=0
OPENMP=0
DEBUG=0

更改nvcc位置,不然会报错

CC=gcc
CPP=g++
NVCC= /usr/local/CUDA/bin/nvcc  ##原来是nvcc,改成你的nvcc文件所在位置
AR=ar
ARFLAGS=rcs

结束后保存makefile文件并退出
(如果用记事本编辑直接保存关闭)

vim makefile  #进入文档

键盘按a 进行编辑,编辑完按键盘左上角esc退出便捷模式

:wq   #在文件底部输入,意思是保存修改并退出

在darknet文件下下make一下

make

下载数据集并修改格式

预处理pre_code代码,需要自取
链接:https://pan.baidu.com/s/1XjaWF5AAeKy_ciPFKPVXYw
提取码:mubn
数据集代码
链接:https://pan.baidu.com/s/1qnyAfp5TPsxgL0C2UTZRWQ
提取码:3cy7

全部解压缩

连接远程服务器ubuntu利用yolov3训练数据集visdrone2019_第2张图片
数据集压缩包里的jpg图片拷贝到JPEGImages目录下。将标注txt文件拷贝到Annotations目录下
连接远程服务器ubuntu利用yolov3训练数据集visdrone2019_第3张图片
连接远程服务器ubuntu利用yolov3训练数据集visdrone2019_第4张图片
打开pre_code文件夹
依次运行以下文件。
连接远程服务器ubuntu利用yolov3训练数据集visdrone2019_第5张图片
使用 rename.py 对图像文件和标注文件进行重命名,修改一下你的路径,很简单,看一下程序就行了。

运行main.py 进行转换,注意修改程序中的路径。稍微读一下程序,注意需要新建对应文件夹Annotations_否则会报错。
visdrone的标注方式与yolo标注不一样。这个步骤是将annotations中的txt将标注转换为VOC格式的xml.

运行 trainnamelist.py 形成了列表txt。对训练集和测试集图片进行随机划分,并把路径写入txt文件中。
如果后面发现需要修改.txt文件里图片的路径,则可以用以下代码。
不需要修改什么,直接用就可以。

# 替换txt 文件中的内容
def file_replace(filename, rep_part, new_part):
    f = open(filename)
    count = 0
    content = []
    for eachline in f:
        count += eachline.count(rep_part)
        eachline = eachline.replace(rep_part, new_part)
        content.append(eachline)
    choice = input('%s文件中共有%d处的%s,要全部替换成%s吗?(yes or no)' % (filename, count,
                                                   rep_part, new_part))
    if choice in ['YES', 'Yes', 'yes']:
        f.close()
        f1 = open(filename, 'w')
        f1.writelines(content)
        f1.close()
        print('全部替换成功!')
    else:
        f.close()
        print('没有选择替换')


filename = input('请输入目标文件名:')
rep_part = input('请输入需要被替换的内容:')
new_part = input('请输入需要新的内容:')
file_replace(filename, rep_part, new_part)

运行label.py就会在目录下生成一个labels文件夹,三个txt文件。

至此,准备工作结束。

开始训练

参数修改

,/cfg 里修改这两个文件
连接远程服务器ubuntu利用yolov3训练数据集visdrone2019_第6张图片

连接远程服务器ubuntu利用yolov3训练数据集visdrone2019_第7张图片
./cfg/voc.data 修改

classes= 10    #共10类
train  = /home/user/darknet/VOC/train.txt   #生成的训练数据集索引txt文件
valid  = /home/user/darknet/VOC/val.txt
names = data/voc.names
backup = backup                 #训练过程中产生的weighs权重文件和backup断点保存在backup下

./cfg/yolov3-voc.cfg 修改
注释掉test参数 打开train参数

[net]
# Testing
 #batch=1
 #subdivisions=1
# Training
batch=64    #越大训练效果越好,前期可以设置32 有利于快速收敛,否则batch太大前期收敛较慢,训练5000轮后可以变为64
subdivisions=64   #根据自己GPU的显存来设置 一般为8的倍数:8.16.32,意思是一次扔训练的图片数量。
          #如果subdivisions = 1 就是一个batch训练64张图片
          #如果subdivisions = 32 就是一个batch训练2张图片
          #......

有关学习率问题,建议一开始稍微大一些,之后根据训练参数再调小。
1000轮前学习率自动变化,之后可以手动调参。
0.01训练1000轮;
0.005训练1000轮;
改为0.001一直训练;

learning_rate=0.001
burn_in=1000
max_batches = 5020              #50200
policy=steps
steps=40000,45000
scales=.1,.1
convolutional]
size=1
stride=1
pad=1
filters=45                            #调为45  计算公式=3*(class+5)
activation=linear

[yolo]
mask = 6,7,8
anchors = 10,13,  16,30,  33,23,  30,61,  62,45,  59,119,  116,90,  156,198,  373,326
classes=10                         #   改为10类
num=9
jitter=.3
ignore_thresh = .5
truth_thresh = 1
random=1         #GPU不行的可以变为0,每轮随机图片训练

[convolutional]
size=1
stride=1
pad=1
filters=45                         #调为45  计算公式=3*(class+5)
activation=linear

[yolo]
mask = 3,4,5
anchors = 10,13,  16,30,  33,23,  30,61,  62,45,  59,119,  116,90,  156,198,  373,326
classes=10                            #改为10类
num=9
jitter=.3
ignore_thresh = .5
truth_thresh = 1
random=1

[convolutional]
size=1
stride=1
pad=1
filters=45                                #调为45  计算公式=3*(class+5)
activation=linear

[yolo]
mask = 0,1,2
anchors = 10,13,  16,30,  33,23,  30,61,  62,45,  59,119,  116,90,  156,198,  373,326
classes=10                           #改为10类
num=9
jitter=.3
ignore_thresh = .5
truth_thresh = 1
random=1

./data/voc.names 修改
连接远程服务器ubuntu利用yolov3训练数据集visdrone2019_第8张图片
顺序别乱。

pedestrian
people
bicycle
car
van
truck
tricycle
awning-tricycle
bus
motor

基本改结束了。

查看一下所有修改的文件是不是unix格式,

vim train.txt

页面底部有文件格式 dos 或者 unix.
如果是dos格式的话,程序会报错,需要将dos格式的文件改为unix格式
很简单,两句话就可以。

sudo apt-get install dos2unix #首先安装一下dos2unix 命令
dos2unix [文件1] [文件2] [文件3]

训练

下载预训练模型,因为这是纯卷积结构,可以作为预训练模型。

cd ./scripts
wget https://pjreddie.com/media/files/darknet53.conv.74

回到darknet文件夹开始训练

cd ./darknet
./darknet detector train cfg/voc.data cfg/yolov3-voc.cfg darknet53.conv.74

中途暂停 Ctrl + z
停止训练 Ctrl + c

修改完文件需要重新make 一下

make clean
make

修改何时输出weighs权重文件
./darknet/examples/decetor.c
第138行

        if((i>=10000 && i%6000==0)  || (i < 1000 && i%100 == 0)){

训练完成,自动保存权重文件。
连接远程服务器ubuntu利用yolov3训练数据集visdrone2019_第9张图片

linux基本操作文件夹命令大全
https://www.linuxcool.com/

参考自:
https://blog.csdn.net/qq_21578849/article/details/84980298
https://blog.csdn.net/daisy_d_/article/details/105748051
https://blog.csdn.net/weixin_42747301/article/details/96636614
https://blog.csdn.net/lumingha/article/details/89038863#_373
https://blog.csdn.net/weixin_43091087/article/details/103850546
https://blog.csdn.net/lilai619/article/details/79695109
https://blog.csdn.net/StrongerL/article/details/81023603

你可能感兴趣的:(深度学习,目标检测)