一、获取数据集
1、如果可以下载好标注好的数据集,那就直接使用即可,注意查看一下数据集的组织格式是否和VOC的格式相同。
2、如果没有现成的数据集,那么可能需要自己去标注,这个以后有机会再细说吧。需要使用一些标注工具,如labelImg,具体使用方法可以参考以下两篇文章!!!
二、下载并编译darknet(Ubuntu下)
1、下载编译
git clone https://github.com/AlexeyAB/darknet
cd darknet
make
注意: 这里下载的是最新的darknet
源码,上一篇文章下载的是旧的darknet
源码。不过新的darknet
无论是yolov3
还是yolov4
都是支持的,所以如果你想要训练yolov3
,也完全可以使用最新的darknet
。但是旧的darknet
是不支持yolov4
的,这一点还是要注意一下!!!
2、编译完成之后,可以使用下面的命令来检验一下
./darknet
如果没有问题,就会输出以下信息:
usage: ./darknet <function>
3、如果想要支持GPU和OPENCV,可以在编译之前修改Makefile
,将所需编译的项的值修改为1即可,如下所示:
三、VOC数据集格式转YOLO数据格式
上篇文章已经详细说明了,传送门:VOC格式数据集转yolo(darknet)格式
另外说明一点,可以在转换好格式后,在VOCdevkit
同级目录下,运行以下命令:
cat 2007_train.txt 2007_val.txt > train.txt
目的是将训练数据和验证数据合并成一个文件,都用来做训练,这个不是必须的,不过我看别人都是这么弄的,emmm!!!
四、参数修改
需要修改的地方主要有以下几项:
1、cfg/voc.data
文件:根据自己的实际路径修改即可。backup是用来存放训练之后的权重的。
2、data/voc.names
文件:根据自己数据集的实际种类和类别的名字进行修改。
3、cfg/yolov4-custom.cfg
文件:
-
把第6行的
batch
改为batch=64
-
把第7行的
subdivisions
改为subdivisions=16
-
将第20行的
max_batch
更改为(数据集标签种类数(classes)*2000
但不小于4000 ) -
将第22行的
steps
改为max_batch
的0.8
倍和0.9
倍 -
把第8.9两行设为
width=416 height=416
或者其他32
的倍数
[net]
# Testing
#batch=64
#subdivisions=16
# Training
batch=64 # 显存不够的图像可以改为16,32等
subdivisions=16 # 这里需要改
width=416 #可以改为32的倍数
height=416 #可以改为32的倍数
channels=3
momentum=0.949
decay=0.0005
angle=0
saturation = 1.5
exposure = 1.5
hue=.1
learning_rate=0.001
burn_in=1000
max_batches = 4000 #改为classses*2000,但不小于4000
policy=steps
steps=3200,3600 #改为max_batch的0.8倍和0.9倍
scales=.1,.1
filters
和classes
参数;一共有三个部分,快捷的办法就是直接搜索yolo
,然后将其上面的filters
和classes
改为自己所需的实际值。这两个值满足以下公式:
filters = 3*(5+len(classes));
classes = len(classes)
五、训练
1、下载yolov4.conv.137
的预训练模型
因为需要科学上网,所以,这里把网盘链接发出来吧,emmm!!!
链接:https://pan.baidu.com/s/1IWyTILlHUOgBGeDUIi4HhQ
提取码:w8x4
2、开始训练:
./darknet detector train cfg/voc.data cfg/yolov4-custom.cfg yolov4.conv.137
六、小结
如果你不想使用yolov4-custom.cfg
也是可以的,只需要选择自己想要使用的网络结构,然后找到其对应的配置文件和预训练权重即可。如下图所示(链接奉上:传送门):
例如为了模型小一些,你可以选择yolov4-tiny.cfg
,只要记住训练完成之后产生的权重文件对应的是yolov4-tiny
即可。这样,你在加载该权重文件的时候,将加载该权重的模型的结构也设置成yolov4-tiny
就可以。
并且可以看到,这里面也包括yolov3
的相关配置文件和预训练权重,同样可以训练yolov3
,相关设置都是差不多的。
注意: 还有一点需要说明的是,这里的数据集处理的方式和官方文档中说的是不一样的,你也可以参考官方文档里面的步骤:
https://github.com/AlexeyAB/darknet#how-to-train-tiny-yolo-to-detect-your-custom-objects