DarkNet项目:https://github.com/AlexeyAB/darknet
YOLO-Mark工具:https://github.com/AlexeyAB/Yolo_mark
在darknet的项目基础之上训练属于自己的物体检测模型——识别狗的物体检测模型。
收集数据集
考虑到机器的性能问题,决定收集200张左右数据集。数据集中每张图片中都带有狗。并且数据集中狗的种类不止一种,包括金毛,拉布拉多,阿拉斯加等多种类型的狗,平均每种狗的图片数量在16张。
数据预处理
在训练狗的物体检测模型中要求,对每幅图片的目标位置进行确定。对存储位置数据的文件格式具有明确的规定:
- 数据集中每幅图片跟着一个.txt文件。
- .txt文件中的内容格式为:对象的序号 对象中心的x坐标 对象中心的y 坐标 对象的宽 对象的高,如下图所示。
由于数据集中的图像较多,采用工具YOLO-mark进行标注。进入Github下载YOLO-mark的源代码进行编译生成。采用生成后的工具对图像进行标志,如下图所示。
然后将所有.txt文件和对应的图片放到\darknet-master\build\darknet\x64\data\img目录下,然后将YOLO-master生成的train.txt文件放到\darknet-master\build\darknet\x64\data目录下。
修改相应文件
- 在\darknet-master\build\darknet\x64\data路径下新建obj.data文件,修改文件内容如下图所示。
- 在\darknet-master\build\darknet\x64\data路径下新建obj.names文件,修改其内容,输入所检测目标的名称dog(独占一行)。
- 复制yolov3.cfg文件,粘贴到相同目录下并重命名为yolo-obj.cfg 。修改其内容。修改Tainting下的batch=64,subdivisions=8。在每个[yolo]下修改classes=1。在每个[yolo]上的[convolutional]中修改filters=18。(其中classes为所检测对象的数量,filters=(classes+1)* 3,在训练中如果出现GPU的Out of memory错误,则修改subdivisions的值为16,32,64)。
物体检测模型的训练
首先下载权重文件darknet53.conv.74,并将该权重文件放入到\darknet-master\build\darknet\x64目录下。其次,在含有darknet.exe的文件目录下,打开powershell窗口输入命令行./darknet.exe detector train data/obj.data yolo-obj.cfg darknet53.conv.74进行训练,模型训练时如图4.4所示。在该过程中,每100次,生成或更新一次/backup/yolo-obj_last.weights文件,而每一千次生成一个yolo-obj_xxxx.weights。(.weights文件为生成的物体检测模型)。
相关参数:
Average IOU :是标记的框和预测的框重复的部分 除以 他们的和,这个值越接近1越好。Avg loss:平均损失,越小越好。Class: 标注物体分类的正确率,期望该值趋近于1。Avg Recall: 是在recall/count中定义的,是当前模型在所有subdivision图片中检测出的正样本与实际的正样本的比值。count后的值是所有的当前subdivision图片中包含正样本的图片的数量。
精度检测
首先,运用YOLOV-mater工具制作测试集。并将生成的测试集放入\darknet-master\build\darknet\x64\data文件夹下,并将YOLO-master工具生成的train.txt文件内容复制到F:\DarkNet\darknet-master\darknet-master\build\darknet\x64\data路径下test.txt文件中。
其次修改yolo-obj.cfg文件,#Testing下的batch和subdivisions的注释取消,而#Training下的batch和subdivisions注释掉。
最后,在powershell命令行中输入.\darknet.exe detector map data/obj.data yolo-obj.cfg yolo-obj_2000.weights,则在powershell中计算检测精度。如下图所示。