YOLO训练的坑
install
git clone https://github.com/pjreddie/darknet.git
cd darknet
make
如果需要支持gpu。make前修改Makefile
中GPU=1
和CUDNN=1
。
坑1:如果出现 invalid device function 错误,说明Makefile
中指定的Compute Capability跟你的机器上的CUDA不一致,具体可以参考1。
ARCH= -gencode arch=compute_52,code=compute_52
在官网可以找到各种训练好的模型weights。
训练
label格式
label文件为txt文件,文件名跟图片一致,并跟图片处于同一个目录下。每行的格式如下:
<object-class> <x_center>/w <y_center>/h <width>/w <height>/h
其中w, h表示图片宽跟高。x_center,y_center表示识别框的中心点坐标,width和height表示识别框的宽和高。
坑2:即使对于不包含识别对象的图片,也要提供空白的txt文件。
此外要提供train.txt,包含所有训练图片的完整路径,每个图片一行。
cfg文件修改
此处以yolov3为例,复制yolov3.cfg
为yolo-obj.cfg
,再对yolo-obj.cfg
做如下修改:
- 根据训练机器内存大小修改
batch
和subdivisions
,注意实际的batch_size为batch
/subdivisions
。 width
和height
表示训练图片被统一resize的大小。一般来说,越大识别效果越好。注意到width
和height
要被32整除。- 将三个yolo层中出现的
classes
修改为实际的类别数,此处以2为例。坑3:注意有三处。同时将yolo层之前对应的卷积层的filters
修改成对应的个数。对于yolo-v3,filters=(classes+5)*3,对于yolo-v2,filters=(classes+5)*5。以classes=2
为例,则filters=21
。
[convolutional]
filters=21
[region]
classes=2
其他文件修改
- 在
data
目录下创建obj.names
文件,一行一个类名。 - 在
data
目录下创建obj.data
文件,包含如下内容。其中classes
表示类别数,train
和valid
分别表示记录训练和测试图片路径的文件。backup
是训练生成的模型存放地址。
classes= 2
train = data/train.txt
valid = data/test.txt
names = data/obj.names
backup = backup/
开始训练
./darknet detector train data/obj.data cfg/yolo-obj.cfg darknet53.conv.74 -gpus 2
其中darknet53.conv.74
是从官网下载的预训练好的模型权重。 backup
中保存模型,默认10000步保存一个模型,在examples/detector.c
中train_detector
中写死了,需要修改代码重新编译。
测试模型
./darknet detector recall cfg/yolo-obj.cfg backup/yolo-obj.backup
注意原代码中测试图片路径文本是写死的,可以参考validate_detector
的写法对validate_detector_recall
进行修改,变成可配置。
pyyolo
目前pyyolo已经支持yolov3。安装使用方法参考官网。
提高yolo训练效果的几个trick
- 在cfg中,将
random
字段设置为1,模型会自动选择不同的resolutions的。 - 增加cfg中
height
和width
,越大越好。 - 训练图片中包括不同大小、旋转角度、光线、不同视角的识别目标。至少包含每类2000张图片。
- 如果单张图片中包括很多个识别目标,在最后一层[region]中增加参数
max=200
- 如果只需要微调,可以在倒数第二层的卷积层中增加
stopbackward=1
。这样前面层的网络参数将不再变化。 - 在测试的时候可以继续改大
height
和width
。(不需要重新训练网络)
Written on July 4, 2018