YOLO v3上训练自己的图片集

1. 目录树

新建项目文件夹project_yolov3,建立如下目录树。(并不是一定要这样组织,只是很多项目,
包括官网上面的,都把文件放到darknet的编译目录,显得文件组织结构不清晰)

project_yolov3
- data
- - images
- - labels
- - .names
- - train_list.txt
- - test_list.txt
- cfg
- - .data
- - .cfg
- backup

2. 准备图片、标签文件

将准备训练的图片放在images文件夹;对应的标签放在labels文件夹。
每张图片对应一个同名的label txt文件,比如images/abc.jpg – > labels/abc.txt。
labels文件每行存放一个标注的Boungding Box,一行五个数分别代表类别(从0开始编号),
BoundingBox中心X坐标,中心Y坐标,宽,高。这些坐标都是0~1的相对坐标。比如,图片
的宽和高分别为WIDTH和HEIGHT像素,BoundingBox中心X、Y分别为x、y像素,宽、高
分别为w、h像素,label文件里面的值可以用下面的公式计算:

yolo_x = x/WIDTH
yolo_y = y/HEIGHT
yolo_w = w/WIDTH
yolo_h = h/HEIGHT

未验证:
(1)标签文件可以为空,表示对应的图片里没有目标
(2)如果图片较多,图片和标签可以在各自目录下以相同的目录树存储。
比如:

images
- class1
- class2
labels
- class1
- class2

3. .names文件

.names文件存放训练的物体类别,比如car、person等,每行一个,和标签文件里面的类别编号
对应,第一行在标签文件里编号为0。

4. train_list.txt和test_list.txt

这两个文件,文件名称并不固定,分别存放训练和测试的图片路径,文件里每行存放一个图片
路径。比如,

PATH/TO/YOUR/PROJECT/project_yolov3/data/images/abc.jpg

5. .data文件

.data文件存放训练的物体类别数目,train_list.txt文件路径等。
例子:

classes= 4
train = PATH/TO/YOUR/PROJECT/project_yolov3/data/train_list.txt
valid = PATH/TO/YOUR/PROJECT/project_yolov3/data/test_list.txt
names = PATH/TO/YOUR/PROJECT/project_yolov3/data/XXX.names
backup= PATH/TO/YOUR/PROJECT/project_yolov3/backup
(backup目录下文叙述)

6. .cfg文件

.cfg文件是darknet描述神经网络结构的文件。
在darknet编译目录下面的cfg文件夹,有很多.cfg,比如yolov2.cfg,yolov3.cfg等。
需要根据自己训练的物体种类数目,做一些修改。

[convolutional]
size=1
stride=1
pad=1
filters=27###75
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=4###20
num=9
jitter=.3
ignore_thresh = .5
truth_thresh = 1
random=0###1
classes的值改为物体种类数目,filters的值改为3 * (classes + 5),比如classes = 4,则filters = 3
* (classes + 5) = 3 * (4 + 5) = 27。在.cfg文件中搜索“yolo”,每一个对应的classes,filters都需
要修改。
其它的值,比如batch大小,输入网络的图片的像素等,可以根据自己的需要修改,当出现
“cuda, out of memory”错误,是显存不够的错误,可以改小batch,增大subdivisions;chanels是
图片通道数,比如灰度图像为1,rgb图像为3。.cfg文件的其它部分可以在对网络结构比较熟
悉之后修改,甚至定义自己的网络结构。
batch=64
subdivisions=16 #8
width=416
height=416
channels=3

7. backup目录

backup目录存放训练过程中的权值备份,每100次保存一个XXX.weights,后面产生的会覆盖
之前的,所以它一直是最新的,前9个会同时命名为XXX_100.weights~XXX_900.weights,可
以作为断点备份继续训练。

8. 下载权值文件,训练,测试

参照官网https://pjreddie.com/darknet/yolo/上的说明,下载darknet53.conv.74权值文件(这是
YOLO作者在ImageNet上预训练的权值)。

训练:

./darknet detector train PATH/TO/YOUR/PROJECT/project_yolov3/cfg/XXX.data
PATH/TO/YOUR/PROJECT/project_yolov3/cfg/XXX.cfg darknet53.conv.74

测试:

./darknet detector test PATH/TO/YOUR/PROJECT/project_yolov3/cfg/XXX.data
PATH/TO/YOUR/PROJECT/project_yolov3/cfg/XXX.cfg XXX.weights XXX.jpg

Leave a Comment