YOLOV3和YOLOV4的精度提升策略

本文详细介绍了如何通过调整YOLOv3的cfg文件参数,优化数据集,以及调整网络分辨率来提高对象检测的精度。重点包括设置randomflag、调整网络结构、正确标注、负样本处理和训练策略。
摘要由CSDN通过智能技术生成

以下内容整理自官方,网址为:https://github.com/AlexeyAB/darknet?tab=readme-ov-file#how-to-train-to-detect-your-custom-objects

训练前

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

在这里插入图片描述

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

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

(4)在training命令结束时使用-show_imgs标志运行训练好的模型,看是否有正确的对象框,如果没有,则您的训练数据集是错误的。

(5)对于要检测的每个对象,训练数据集中必须至少有一个类似的对象,其形状、侧面、相对大小、旋转角度、倾斜、照明等条件大致相同。数据集中应包括对象的不同缩放、旋转、照明、不同的面、不同背景的图像,最好为每个类提供2000个以上不同的图像,并且训练(2000*类的数量)的迭代次数或更多。

(6)确保训练的数据集中包含不想被检测的不带标签的对象(一张图里不能全是要检测的物体,还应有不需要检测的物体),即负样本,负样本的数量最好和正样本的数量相同。加一些背景图片,里面没有待检测物体的那种

(7)标记对象的最佳方法是:只标记对象的可见部分,或标记对象的可视和重叠部分,或比整个对象多一点(有一点间隙)。

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

(9)训练小物体时(图像大小调整为416x416后物体小于16x16),并且还要设置三个地方,以yolov4.cfg为例:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

(10)对于都包含小对象和大对象可以使用以下的修改模型:
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

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

在这里插入图片描述

(12)一般规律——训练数据集应该包含一组您想要检测的对象的相对大小相近的样本。简单来说,就是需要检测的对象在图像中的百分比是多少,那么训练的图像中也应该包含这个百分比的对象。例如:如果训练的时候目标在图像中都占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

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

(14)为了使检测到的有界框更准确,可以向每个[yolo]层添加3个参数 ignore_thresh = .9 iou_normalizer=0.5 iou_loss=giou 并进行训练,它将增加mAP@0.9,但减少mAP@0.5.

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

训练后(对于检测)

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

在这里插入图片描述

(2)这里提高了网络的分辨率,但是可以不需要重新训练(即使之前使用416*416分辨率训练的)。

(3)为了提高精度,还是建议使用更高的分辨率608x608 or 832x832来重新训练。注意:如果出现了Out of memory的错误,建议提高.cfg文件中的subdivisions=1参数,改成16、32或者64等。以yolov3为例

在这里插入图片描述

  • 33
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值