Yolov3训练自己数据的步骤

时间:2019-01-19
本文章向大家介绍Yolov3训练自己数据的步骤,主要包括Yolov3训练自己数据的步骤使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

安装并配置yolov3
官网链接:https://pjreddie.com/darknet/yolo/

 1、下载并安装yolo:

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

修改darknet文件夹中的Makefile文件,使用GPU训练令GPU=1,CUDNN=1

GPU=1
CUDNN=1
...

编译源文件

sudo make -j

 

测试安装是否正确

wget https://pjreddie.com/media/files/yolov3.weights
./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg

darknet文件夹中会保存这张图片

 

2、给数据打标签制作voc格式数据集

    使用labelimg给图片打标签

    接着构建voc数据集样式的目录结构

----VOCdevkit 

—VOC2007 

—Annotations 

—ImageSets 

—Main 

—JPEGImages 

Annotations中存放打标签产生的xml文件 

JPEGImages中存放用来打标签的训练图片 

Main中是几个txt文件,其中test.txt是测试集,train.txt是训练集,val.txt是验证集(需要自己创建TXT文件,并填写图片文件的文件名前缀,如1.jpg,则填写1,需要用空格隔开)

    生成路径文件:

构建好层级目录,将文件放入相应目录中,然后分好训练集、验证集和测试集以后,将VOCdevkit文件夹放入darknet/scripts目录中

修改scripts文件夹中的voc_label.py文件,因为没用到2012的数据集,只保留带2007字样的

修改第7行

sets=[('2012', 'train'), ('2012', 'val'), ('2007', 'train'), ('2007', 'val'), ('2007', 'test')]

将“(‘2012’, ‘train’), (‘2012’, ‘val’),”删除掉,改为

sets=[('2007', 'train'), ('2007', 'val'), ('2007', 'test')]


修改类别名字:

classes = ["aeroplane",...],将其修改为自己的标签:

classes = [“0”,”1”,”2”]


修改最后几行

os.system("cat 2007_train.txt 2007_val.txt 2012_train.txt 2012_val.txt > train.txt")

os.system("cat 2007_train.txt 2007_val.txt 2007_test.txt 2012_train.txt 2012_val.txt > train.all.txt")


将 2012_train.txt 2012_val.txt删除掉,改为:

os.system("cat 2007_train.txt 2007_val.txt > train.txt")

os.system("cat 2007_train.txt 2007_val.txt 2007_test.txt > train.all.txt")

在这里打开终端,运行scripts文件夹中的voc_label.py文件,scripts文件夹中会生成几个TXT文件。

python voc_label.py

3:修改yolov3的训练配置文件

    打开cfg/voc.data文件,进行如下修改:

classes= 3  # 自己数据集的类别数
train  = /home/xxx/darknet/train.txt  # train文件的路径
valid  = /home/xxx/darknet/2007_val.txt   # test文件的路径
names = data/voc.names
backup = backup


在darknet文件夹下面新建文件夹backup,用于存放训练中生成的模型,1000次以前,是每训练100次保存一次,1000次以后,每训练1000次保存一次,10000次以后,每训练10000次保存一次

分别修改data/voc.name,data/coco.name为样本集的标签名

0
1
2

修改cfg/yolov3-voc.cfg

最开始需要将Testing的配置注释掉,并解除Training配置的注释

batch/subdivisions配置足够可以设置的大一些,可以是64/4

如果不收敛,可以将batch设置的大些,学习率可以设置的小点

其中width、height设置为32的倍数,需要相同越大准确率越高

每个yolo层及其前一层都需要设置,共3个需要修改的地方

filters设置为3*(类别数+1+3),这里类别数是3,所以设置为3*(3+1+3)=24

class设置为类别数,这里是3

以3类目标检测为例主要有以下几处调整:


[net]

# Testing            ### 测试模式                                         

# batch=1               

# subdivisions=1

# Training           ### 训练模式,每次前向的图片数目 = batch/subdivisions

batch=100

subdivisions=64

width=416            ### 网络的输入宽、高、通道数

height=416

channels=3

momentum=0.9         ### 动量

decay=0.0005         ### 权重衰减

angle=0

saturation = 1.5     ### 饱和度

exposure = 1.5       ### 曝光度

hue=.1               ### 色调

learning_rate=0.0001  ### 学习率

burn_in=1000         ### 学习率控制的参数

max_batches = 50200  ### 迭代次数                                         

policy=steps         ### 学习率策略

steps=40000,45000    ### 学习率变动步长

scales=.1,.1         ### 学习率变动因子 







[convolutional]

batch_normalize=1    ### BN

filters=32           ### 卷积核数目

size=3               ### 卷积核尺寸

stride=1             ### 卷积核步长

pad=1                ### pad

activation=leaky     ### 激活函数



......



[convolutional]

size=1

stride=1

pad=1

filters=24  #3*(3+4+1)

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=3  #类别

num=9

jitter=.3

ignore_thresh = .5

truth_thresh = 1

random=1  #如果显存很小,将random设置为0,关闭多尺度训练;

......



[convolutional]

size=1

stride=1

pad=1

filters=24  #3*(3+4+1) 4是坐标数量 1是置信度

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=3  #类别

num=9

jitter=.3

ignore_thresh = .5

truth_thresh = 1

random=1 #如果显存很小,将random设置为0,关闭多尺度训练;

......



[convolutional]

size=1

stride=1

pad=1

filters=24  #3*(1+4+1)

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=3  #类别

num=9

jitter=.3  # 数据扩充的抖动操作

ignore_thresh = .5 

truth_thresh = 1 

random=1  #如果显存很小,将random设置为0,关闭多尺度训练;

4:下载预训练权重文件开始训练检测模型

#下载预训练权重文件
wget https://pjreddie.com/media/files/darknet53.conv.74
#开始训练检测模型
./darknet detector train cfg/voc.data cfg/yolov3-voc.cfg darknet53.conv.74

训练好以后的模型在darknet/backup文件夹当中
./darknet detector test cfg/voc.data cfg/yolov3-voc.cfg backup/yolov3-voc_final.