主要参考https://github.com/AlexeyAB/darknet
步骤1:yolov3 darknet输入数据准备
打标:
(图片均需要转换为JPG格式)
标注软件:https://github.com/tzutalin/labelImg
下载标注软件解压后,打开labelImg.py,配置interpreter环境,然后run。之后会出现一个界面可以开始进行打标。
标注后数据处理:
标注后的文件为xml文件,保存在图片目录。
提取xml文件保存至
/darknet-master/build/darknet/x64/data/voc/tpy/Annotations
原始图片保存至
/darknet-master/build/darknet/x64/data/voc/tpy/JPEGImages
在/darknet-master/build/darknet/x64/data/voc/tpy/ImageSets/Main/
创建需要训练的图片列表txt文件,详见train.txt。
并在terminal终端进入到/darknet-master/build/darknet/x64/data/voc/目录输入python voc_label.py将xml文件转换成yolov3 darknet训练所需要的txt文件。Txt文件保存在/darknet-master/build/darknet/x64/data/voc/tpy/labels。
(voc_label.py需要做一些更改,如果保存位置需要改变)
步骤2:训练
进入/darknet-master,更改Makefile文件,GPU=1,CUDNN=1,CUDNN_HALF=1,OPENCV=1,前三项开启GPU加速,最后一项开启OPENCV训练过程平均损失曲线可视化。
打开terminal终端,进入/darknet-master,输入make,产生darknet文件。
打开terminal终端,进入/darknet-master,输入
./darknet detector train data/myv3.data cfg/yolov3.cfg darknet53.conv.74
在darknet53.conv.74权重下训练yolov3于之前保存好的图片以及相对应标注
myv3.data为保存图片路径,探测目标种类名称,保存权重路径的描述文件。
cfg/目录下还有其他模型,如tiny-yolo,yolo,yolov2,densenet201-yolo等等。在使用时需要更改某些参数,详见https://blog.csdn.net/lilai619/article/details/79695109。
darknet53.conv.74为yolov3训练初始权重
改变种类后需要更改的文件:
- voc_label.py
- yolov3.cfg
- myv3.data
- myv3.names
步骤3:探测
探测单张图片:
./darnet detector test data/myv3.data cfg/yolov3.cfg darknet53.conv.74 1.img -dont_show
-ext_output -thresh 0
img在/darknet-master路径下。
成像结果保存在同路径prediction.png文件。
-ext_output(可选)为输出探测图片的坐标及其种类结果
-dont_show(可选)不显示损失窗口
-thresh 0(可选)显示阈值大于0的探测对象
探测多张图片:
./darknet detector test data/myv3.data cfg/yolov3.cfg darknet53.conv.74-dont_show -ext_output < data/train.txt > result.txt
data/train.txt 为需要探测图片保存路径集合的txt文件,result.txt为结果保存文件,文件结果为每张需要探测图片的探测到对象的坐标及其种类。
探测多张图片命令暂时不能保存多张探测后的成像图片。
探测视频
./darknet detector demo
附录1:
Yolov3-增加精度;增加探测小样本的准确率
- 多尺度训练
increase precision by training Yolo for different resolutions
set flag random=1 in your .cfg-file - 增加模型输入尺寸
increases the precision and makes it possible to detect small objects
Increase network-resolution by set in your .cfg-file (height=608 and width=608) or (height=832 and width=832) or (any value multiple of 32) - 重新计算anchors
recalculate anchors for your dataset
darknet.exe detector calc_anchors data/obj.data -num_of_clusters 9 -width 416 -height 416 - 增加正样本多样性,增加负样本
- for training for small objects - set layers = -1, 11 instead of https://github.com/AlexeyAB/darknet/blob/6390a5a2ab61a0bdf6f1a9a6b4a739c16b36e0d7/cfg/yolov3.cfg#L720 and set stride=4 instead of https://github.com/AlexeyAB/darknet/blob/6390a5a2ab61a0bdf6f1a9a6b4a739c16b36e0d7/cfg/yolov3.cfg#L717
附录2:
训练的权重不一定越到后期越好,所以有必要比较不同时期的权重
./darknet detector map data/obj.data yolo-obj.cfg backup\yolo-obj_700.weights
./darknet detector map data/obj.data yolo-obj.cfg backup\yolo-obj_800.weights
./darknet detector map data/obj.data yolo-obj.cfg backup\yolo-obj_900.weights
输出 mAP, F1, IoU, Precision-Recall,采用最好的权重。
附录3:
./darknet为linux环境下make生成的命令,在windows下的话在
darknet-master\build\darknet目录下有darknet_no_gpu.sln或darknet.sln,需要在vs下进行集成为exe文件,具体操作流程参见https://github.com/AlexeyAB/darknet。在windows下另一种生成exe文件的方法就是直接在Cygwin64 Terminal下make生成exe文件。