使用YOLOv5检测大宽高比(细长目标)时无法检测问题的解决方法

在深度学习的工程中总会遇到许许多多的奇奇怪怪的问题,使人头大

        上周五Franpper在使用yolov5-5.0训练时就遇到了这么一个奇怪的问题:在训练过程中labels一直为0,表示没有读进去标签,虽然可以训练,但是是无效训练,因为网络也不知道目标在哪里,只能自由发挥了。

最开始Franppe在网络上寻找答案无果(怎么大家都没遇见过这种问题呀啊啊啊),之后问了几位博主,也和朋友们讨论了一下,大家都认为很玄学,觉得数据集有问题的可能性比较大,但是Franpper检查又检查,真的没发现数据集有什么问题,文件夹格式无问题、标注的.txt文件也无问题,但是也找不到什么其他原因,于是Franpper就只能重新标注数据,甚至将labelimg重新安装并标注数据然后训练,但是都没什么卵用(愁人

但是在标注过程中Franpper发现了一个有意思的现象:工程中需要识别的目标是位于整图下方的从最左边到最右边的细长条的信息框,当把目标全部框住时(即图中蓝色标注框)训练过程中无法加载labels,不能正常训练。但是把目标框选一半(即图中红色标注框)时,就可以正常训练了,所以Franpper觉得YOLOV5可能会对标注框进行宽高比的过滤,于是就边debug边寻找。

果然!!!在datasets.py中有一个box_candidates函数,它会对图像的label进行筛选,具体筛选条件请见下方注释


def box_candidates(box1, box2, wh_thr=2, ar_thr=20, area_thr=0.1, eps=1e-16):
    """
    用在random_perspective中 对透视变换后的图片label进行筛选
    去除被裁剪过小的框(面积小于裁剪前的area_thr) 还有长和宽必须大于wh_thr个像素,且长宽比范围在(1/ar_thr, ar_thr)之间的限制
    Compute candidate boxes: box1 before augment, box2 after augment, wh_thr (pixels), aspect_ratio_thr, area_ratio
    :params box1: [4, n]
    :params box2: [4, n]
    :params wh_thr: 筛选条件 宽高阈值
    :params ar_thr: 筛选条件 宽高比、高宽比最大值阈值
    :params area_thr: 筛选条件 面积阈值
    :params eps: 1e-16 接近0的数 防止分母为0
    :return i: 筛选结果 [n] 全是True或False   使用比如: box1[i]即可得到i中所有等于True的矩形框 False的矩形框全部删除
    """
    w1, h1 = box1[2] - box1[0], box1[3] - box1[1]  # 求出所有box1矩形框的宽和高  [n] [n]
    w2, h2 = box2[2] - box2[0], box2[3] - box2[1]  # 求出所有box2矩形框的宽和高  [n] [n]
    ar = np.maximum(w2 / (h2 + eps), h2 / (w2 + eps))  # 求出所有box2矩形框的宽高比和高宽比的较大者  [n, 1]
    # 筛选条件: 增强后w、h要大于2   增强后图像与增强前图像面积比值大于area_thr   宽高比大于ar_thr
    return (w2 > wh_thr) & (h2 > wh_thr) & (w2 * h2 / (w1 * h1 + eps) > area_thr) & (ar < ar_thr)  # candidates

默认的宽高比、高宽比最大阈值是20,但是实际工程中的宽高比肯定远远超过了20,于是Franpper将ar_thr设置为了50,然后重新开始训练。

见证奇迹的时候到了!!!   

终于可以正常训练了!!!训练结果也非常喜人!!!

猜你喜欢

转载自blog.csdn.net/weixin_58283091/article/details/128441085