YOLOv3提高目标检测效果方法

本文主要针对AlexeyAB版本分析 AlexeyAB代码

1. 训练前

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

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

(3)确保数据集中每个待检测对象都带有标签,并且保证标签正确。(可以用这个工具来检查数据集: Yolo_mark

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

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

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

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

(8)训练小物体时(图像调整到416x416后物体小于16x16),将yolov3.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)的widthheight:在.cfg文件中的3个[yolo]层中的每个层中设置相同的9个锚,更改每个[yolo]层锚点的索引masks=,以便[满足第一个[yolo]层的锚点大于60x60,第二个大于30x30,第三个[yolo]层剩余。此外,还应在每个[yolo]层之前更改过滤器filters=(classes + 5) * <number of mask>。如果许多计算出的锚找不到适当的层,那么只需尝试使用所有的默认锚。

(14)加快训练速度(降低检测精度)在cfg文件中为第136层设置参数stopbackward=1

(15)为了使检测到的边界框更准确,在每个[yolo]层上添加3个参数ignore_thresh = .9 iou_normalizer=0.5 iou_loss=giou并进行训练,它将增加[email protected],但减少[email protected]

2. 训练后(对于检测)

通过在.cfg文件中设置(height=608,width=608)或(height=832,width=832)或(32的任意值倍数)来提高网络的分辨率,这将提高精度并使检测小对象成为可能。

这里提高了网络的分辨率,但是可以不需要重新训练(即使之前使用416*416分辨率训练的)。但是为了提高精度,还是建议使用更高的分辨率来重新训练。

注意:如果出现了Out of memory的错误,建议提高.cfg文件中的subdivisions=16参数,改成32或者64等。

发布了2 篇原创文章 · 获赞 2 · 访问量 91

猜你喜欢

转载自blog.csdn.net/weixin_42783784/article/details/105726687