【YOLO】如何提高目标检测效果

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

1. 训练前

(1)在.cfg文件中设置flag random=1,它将通过不同分辨率来训练yolo以提高精度。

(2)提高.cfg文件中网络的分辨率,(例如height = 608width = 608或者任意32的倍数),这样可以提高精度。

(3)确保数据集中每个类都带有标签,并且保证标签正确。(可以用这个工具来检查数据集: https://github.com/AlexeyAB/Yolo_mark )

(4)对于要检测的每个对象,训练数据集中必须至少有一个类似的对象,其形状、侧面、相对大小、旋转角度、倾斜、照明等条件大致相同。

(5)数据集中应包括对象的不同缩放、旋转、照明、不同的面、不同背景的图像,最好为每个类提供2000个以上不同的图像,并且训练(2000* 类的数量)的迭代次数或更多。

(6)确保训练的数据集中包含不想被检测的不带标签的对象,即负样本,负样本的数量最好和正样本的数量相同。

(7)对于目标物体较多的图像,在.cfg文件中最后一个[yolo]层和[region]层加入max=200参数或者更高的值。(yolov3可以检测到的对象的全局最大数目是0.0615234375 *(width*height),其中width和height是.cfg文件中[net]部分的参数)

(8)训练小物体时(图像调整到416x416后物体小于16x16),将.cfg文件中720行左右的[route]参数替换为layers = -1, 11,并且将717行左右的[upsample]参数改为stride =4

(9)对于都包含小对象和大对象可以使用以下的修改模型:
Full-model: 5 yolo layers: https://raw.githubusercontent.com/AlexeyAB/darknet/master/cfg/yolov3_5l.cfg
Tiny-model: 3 yolo layers: https://raw.githubusercontent.com/AlexeyAB/darknet/master/cfg/yolov3-tiny_3l.cfg
Spatial-full-model: 3 yolo layers: https://raw.githubusercontent.com/AlexeyAB/darknet/master/cfg/yolov3-spp.cfg

(10)如果要训练区分左右的对象(例如左手右手,道路上左转右转标志等),需要禁用数据翻转增强,在.cfg文件中17行左右的位置加入flip=0

(11)一般规律——训练数据集应该包含一组您想要检测的对象的相对大小相近的样本。简单来说,就是需要检测的对象在图像中的百分比是多少,那么训练的图像中也应该包含这个百分比的对象。例如:如果训练的时候目标在图像中都占80-90%,那检测的时候很可能就检测不出目标占0-10%情况。

train_network_width * train_obj_width / train_image_width ~= detection_network_width * detection_obj_width / detection_image_width
train_network_height * train_obj_height / train_image_height ~= detection_network_height * detection_obj_height / detection_image_height
object width in percent from Training dataset ~= object width in percent from Test dataset

(12)同一个对象在不同的光照条件、侧面、尺寸、倾斜或旋转30度的情况下,对于神经网络的内部来说,都是不同的对象。因此,如果想检测更多的不同对象,就应该选择更复杂的神经网络。

(13)在.cfg中重新计算锚(anchors)的width和height:在.cfg文件中的3个[yolo]层中的每个层中设置相同的9个锚,但是应该为每个[yolo]层更改锚点masks=的索引,以便[yolo]第一层的锚点大于60x60,第二层大于30x30,第三层剩余。此外,还应在每个[yolo]层之前更改过滤器filters=(classes + 5) * 。如果许多计算出的锚找不到适当的层,那么只需尝试使用所有的默认锚。

2. 训练后(对于检测)

通过在.cfg文件中设置(height=608width=608)或(height=832width=832)或(32的任意值倍数)来提高网络的分辨率,这将提高精度并使检测小对象成为可能。
这里提高了网络的分辨率,但是可以不需要重新训练(即使之前使用416*416分辨率训练的)。但是为了提高精度,还是建议使用更高的分辨率来重新训练。
注意:如果出现了Out of memory的错误,建议提高.cfg文件中的subdivisions=16参数,改成32或者64等。

拓展

1)如何使用官方模型进行检测:https://blog.csdn.net/qinchang1/article/details/89435023
2)如何训练自己的YOLO模型:https://blog.csdn.net/qinchang1/article/details/89608058

如有错误,欢迎指正!

你可能感兴趣的:(YOLO,YOLO,目标检测,提高效果)