提高yolov4目标检测的技巧

在训练之前该做些什么

  • 设置.cfg文件中:random=1,通过对Yolo进行不同分辨率的训练,将提高精度。
  • 增加.cfg文件中的网络分辨率(height=608, width=608或32的倍数),这将提高精度。
  • 检查您要检测的每个对象是否在数据集中被强制标记,数据集中的任何对象都不应没有标签。大部分的训练问题都是因为数据集中的错误标签(通过使用一些转换脚本或第三方工具来获取标签)。通过Yolo_mark来检查你的数据集。
  • 我的Loss非常高,而mAP却很低,是训练出错了吗?在训练命令末尾使用-show_imgs标志运行训练,你是否看到正确的有界对象框?如果没有,那么是你的训练数据出错了。
  • 对于要检测的每个对象,训练数据集中必须至少有一个相似的对象,并且它们具有大致相同的形状:对象的形状,侧面,相对大小,旋转角度,倾斜度和照明度。理想情况下,你的训练数据集应包含不同的图像:比例,旋转,亮度,不同侧面,不同背景的图像。你最好为每个类提供2000张或更多不同的图像,并且你应该训练 2000*classes 或更多的iter。
  • 你的训练数据集要包括带有不想检测的为标记对象的图像-无边框的负样本(空的txt文件),使用与带标记图像一样多的负样本。
  • 标记对象的最佳方法是:仅标记对象的可见部分,或标记对象的可见和重叠部分,或标记比整个对象多一点(间隔)。根据你希望如何检测它来作标记。
  • 为了对每个图像的大量对象进行训练,需要在cfg文件的最后一个[yolo]层或[region]层中添加参数 max=200 或更高的值(YoloV3可以检测到的对象的全局最大数量为0.0615234375*(width*height),其中width和height是cfg文件中[net]部分的参数)。
  • 对于小型和大型物体都要训练,使用修改后的模型:
    Full-model: 5 yolo layers: https://raw.githubusercontent.com/AlexeyAB/darknet/master/cfg/yolov3_5l.cfg
    可下载通过:https://download.csdn.net/download/Json111/12561626
    Tiny-model: 3 yolo layers: https://raw.githubusercontent.com/AlexeyAB/darknet/master/cfg/yolov3-tiny_3l.cfg
    可下载通过:https://download.csdn.net/download/Json111/12561628
    YOLOV4: 3 yolo layers: https://raw.githubusercontent.com/AlexeyAB/darknet/master/cfg/yolov4-custom.cfg
    可下载通过:https://download.csdn.net/download/Json111/12561631
  • 如果你训练的模型将左右区分为单独的类(左右手,左右转道路标志等),则禁止用翻转数据增强,在[net]中添加 flip=0 来禁用翻转数据增强。
  • 通用规则:训练集应包括一组要检测的尺寸相当的目标:
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

即对于test数据集中的每个对象,train数据集中必须至少有一个对象具有相同的classid和相同的相对大小:

object width in percent from Training dataset ~= object width in percent from Test dataset

也就是说,如果训练集中仅存在占图像80-90%的对象,则受训练的网络将无法检测到占图像1-10%的对象。

  • 加快训练速度(会降低检测精度)可以在cfg文件136行的参数设置为 stopbackward=1
  • 每个对象模型,侧面,照明度,比例,转弯和倾斜的每个30度,从神经网络的内部角度来看,这些都是不同的对象。所以,要检测的对象越多,应该使用越复杂的网络模型。
  • 为了使检测到的边界框更准确,可以向每个[yolo]层添加3个参数:ignore_thresh=.9, iou_normalizer=0.5, iou_loss=giou 并训练,它将增加[email protected],但减小[email protected]

训练之后检测要做写什么

通过在cfg文件中设置( height=608width=608 ) 或 ( height=832width=832 ) 或 (任何32的倍数) 来提高网络分辨率,这可以提高精度并可以检测到小物件:

  • 不需要再次训练网络,只需要使用已经针对416*416分辨率进行训练的weight文件。
  • 但是要获得更高的精度,应该使用更高分辨率的608608或832832进行训练,注意:如果发生 Out of memory 的错误,则在cfg文件中,应该增加 subdivisions=16, 32或64。

你可能感兴趣的:(Machine,Learning,计算机视觉,yolo,目标检测)