YOLO训练的坑

install

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

如果需要支持gpu。make前修改MakefileGPU=1CUDNN=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.cfgyolo-obj.cfg,再对yolo-obj.cfg做如下修改:

  • 根据训练机器内存大小修改batchsubdivisions,注意实际的batch_size为batch/subdivisions
  • widthheight表示训练图片被统一resize的大小。一般来说,越大识别效果越好。注意到widthheight要被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表示类别数,trainvalid分别表示记录训练和测试图片路径的文件。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.ctrain_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中heightwidth,越大越好。
  • 训练图片中包括不同大小、旋转角度、光线、不同视角的识别目标。至少包含每类2000张图片。
  • 如果单张图片中包括很多个识别目标,在最后一层[region]中增加参数max=200
  • 如果只需要微调,可以在倒数第二层的卷积层中增加stopbackward=1。这样前面层的网络参数将不再变化。
  • 在测试的时候可以继续改大heightwidth。(不需要重新训练网络)
Written on July 4, 2018