在windows下使用darknet,YOLO的步骤

参考官网https://github.com/AlexeyAB/darknet#how-to-train-to-detect-your-custom-objects

一.给图片打标签:
删除文件夹里面的所有文件:x64/Release/data/img
把自己的.jpg图片放入上述文件夹
在文件x64/Release/data/obj.data中写出要检测对象的数量(右键用Notepad++编辑)
在文件x64/Release/data/obj.names中写出对象的名字每个写一行
win+R:cmd
cd\x64\Release
yolo_mark.cmd (h-help c-clear)

二.如何训练(检测自定义对象):
1.使用与yolov3.cfg相同的内容创建文件yolo-obj.cfg(或将yolov3.cfg复制到yolo-obj.cfg)并且:
a.更改为 batch = 64(第三行)
b.更改为 subdivision = 8(第四行)
c.将三个[yolo] -layers 的classes= 80更改为你需要检测物体的个数(第610 696 783行)
d.在[yolo]图层之前的3 [卷积]中将[filters = 255]更改为filters =(classes + 5)x3 (第603 689 766行)
因此,如果classes = 1,那么应该是filters = 18。 如果classes = 2则写入filters = 21。
(不要写入cfg文件:filters =(classes + 5)x3)
2.在目录build \ darknet \ x64 \ data \中创建文件obj.names,对象名称 - 每个都在新行中(标定文件夹复制过来就行)
3.在目录build \ darknet \ x64 \ data \中创建文件obj.data,包含(其中classes =对象数):(标定文件夹复制过来就行)
classes= 2
train = data/train.txt
valid = data/test.txt
names = data/obj.names
backup = backup/
4.将对象的图像文件(.jpg)放在目录build \ darknet \ x64 \ data \ obj \中
5. 您应该在数据集的图像上标记每个对象。 使用这个可视GUI软件标记有界的对象框并为Yolo v2和v3生成注释文件:https://github.com/AlexeyAB/Yolo_mark
它将为每个.jpg图像文件创建.txt文件 - 在同一目录中并使用相同的名称,但使用.txt-extension,并将文件放入:对象编号和对象坐标,对于每个对象 在新行中:
6.在目录build \ darknet \ x64 \ data \中创建文件train.txt,其中包含图像的文件名,新行中的每个文件名,以及相对于darknet.exe的路径
7. 下载卷积层的预先训练的权重(154 MB):https://pjreddie.com/media/files/darknet53.conv.74并放入目录build \ darknet \ x64
8. 使用命令行开始培训:darknet.exe detector train data/obj.data yolo-obj.cfg darknet53.conv.74
8.1对于每4个时期的mAP(平均精度)计算训练(在obj.data文件中设置valid = valid.txt或train.txt)并运行:darknet.exe detector train data/obj.data yolo-obj.cfg darknet53.conv.74 -map
9. 训练结束后 - 从路径构建\ darknet \ x64 \ backup \获取结果yolo-obj_final.weights
在每100次迭代后,您可以停止并稍后从此开始训练。 例如,在2000次迭代之后,您可以停止训练,并使用如下命令继续训练:darknet.exe detector train data/obj.data yolo-obj.cfg backup\yolo-obj_2000.weights
(在原始存储库https://github.com/pjreddie/darknet中,如果(迭代次数> 1000),权重文件每10,000次迭代仅保存一次)
此外,您可以比所有45000次迭代更早地获得结果。
注意:如果在训练期间你看到avg(损失)字段的nan值 - 那么训练就出错了,但如果nan在其他一些行中 - 那么训练就会顺利进行。
注意:如果在cfg文件中更改了width =或height =,则新的宽度和高度必须可被32整除。
注意:训练后使用此类命令进行检测:darknet.exe检测器测试数据/ obj.data yolo-obj.cfg yolo-obj_8000.weights
注意:如果出现错误内存不足,那么在.cfg文件中你应该增加细分= 16,32或64:link

注解:
batch: 每一次迭代送到网络的图片数量,也叫批数量。增大这个可以让网络在较少的迭代次数内完成一个epoch。在固定最大迭代次数的前提下,增加batch会延长训练时间,但会更好的寻找到梯度下降的方向。如果你显存够大,可以适当增大这个值来提高内存利用率。这个值是需要大家不断尝试选取的,过小的话会让训练不够收敛,过大会陷入局部最优。
subdivision:这个参数很有意思的,它会让你的每一个batch不是一下子都丢到网络里。而是分成subdivision对应数字的份数,一份一份的跑完后,在一起打包算作完成一次iteration。这样会降低对显存的占用情况。如果设置这个参数为1的话就是一次性把所有batch的图片都丢到网络里,如果为2的话就是一次丢一半。
angle:图片旋转角度,这个用来增强训练效果的。从本质上来说,就是通过旋转图片来变相的增加训练样本集。
saturation,exposure,hue:饱和度,曝光度,色调,这些都是为了增强训练效果用的。
learning_rate:学习率,训练发散的话可以降低学习率。学习遇到瓶颈,loss不变的话也减低学习率。
max_batches: 最大迭代次数。
policy:学习策略,一般都是step这种步进式。
step,scales:这两个是组合一起的,举个例子:learn_rate: 0.001, step:100,25000,35000 scales: 10, .1, .1 这组数据的意思就是在0-100次iteration期间learning rate为原始0.001,在100-25000次iteration期间learning rate为原始的10倍0.01,在25000-35000次iteration期间learning rate为当前值的0.1倍,就是0.001, 在35000到最大iteration期间使用learning rate为当前值的0.1倍,就是0.0001。随着iteration增加,降低学习率可以是模型更有效的学习,也就是更好的降低train loss。
最后一层卷积层中filters数值是 5×(类别数 + 5)。具体原因就不多说了,知道就好哈。
region里需要把classes改成你的类别数。
最后一行的random,是一个开关。如果设置为1的话,就是在训练的时候每一batch图片会随便改成320-640(32整倍数)大小的图片。目的和上面的色度,曝光度等一样。如果设置为0的话,所有图片就只修改成默认的大小 416*416。(训练的时候obj和noobj会出现全为0的情况,设置为0后一切正常。)

4.训练输出
Region Avg IOU: 这个是预测出的bbox和实际标注的bbox的交集 除以 他们的并集。显然,这个数值越大,说明预测的结果越好。
Avg Recall: 这个表示平均召回率, 意思是 检测出物体的个数除以标注的所有物体个数。
count: 标注的所有物体的个数。 如果 count = 6, recall = 0.66667, 就是表示一共有6个物体(可能包含不同类别,这个不管类别),预测出来了4个,Recall 就是 4 除以 6 = 0.66667 。
有一行跟上面不一样的,最开始的是iteration次数,然后是train loss,然后是avg train loss, 然后是学习率, 然后是一batch的处理时间, 然后是已经一共处理了多少张图片。 重点关注 train loss 和avg train loss,这两个值应该是随着iteration增加而逐渐降低的。如果loss增大到几百那就是训练发散了,如果loss在一段时间不变,就需要降低learning rate或者改变batch来加强学习效果。当然也可能是训练已经充分。这个需要自己判断。

[1]https://blog.csdn.net/renhanchi/article/details/71077830

猜你喜欢

转载自blog.csdn.net/weixin_43981221/article/details/88908069