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

本文分享了一种在YOLOv5训练过程中遇到的labels始终为0的解决方案。通过调整box_candidates函数中的宽高比阈值,成功解决了训练数据未能正确加载的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

        上周五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,然后重新开始训练。

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

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

### 使用 YOLOv8 进行细长目标检测方法 #### 加载模型并配置环境 为了确保能够成功加载预训练模型或自定义构建的新模型,推荐采用绝对路径来指定模型文件的位置。这可以避免因相对路径引起的找到文件错误。 ```python from ultralytics import YOLO model = YOLO(r'/projects/ultralytics/ultralytics/cfg/models/v8/yolov8_Slim-Neck.yaml') ``` 此代码片段展示了如何通过 YAML 文件创建一个新的带有 Slim Neck 结构的 YOLOv8 模型[^2]。Slim Neck 设计有助于提高对于较小尺寸的目标识别能力,这对于细长形状的对象同样适用。 #### 数据集准备 针对特定应用场景的数据集是至关重要的。当处理像栏杆这样细长形态的目标,在 `dataset.yaml` 中正确定义图像目录以及类别名称非常重要: ```yaml path: /your/path/to/dataset/ train: images/train val: images/val nc: 1 names: ['fence'] ``` 上述配置指定了数据集中用于训练和验证图片所在的子文件夹位置,并声明了一个名为 "fence" 的单类标签[^3]。注意这里假设所有标注都围绕着细长形物体展开;如果存在多种同类型的对象,则需相应调整分类数目及其对应的标签名。 #### 改进措施以适应细长目标特性 考虑到细长物体会给常规的目标检测算法带来挑战——比如宽高比例极端失衡可能导致边界框难以准确定位——可以在以下几个方面做出优化: - **Anchor Box 调整**: 对于细长物品而言,默认设置下的 anchor box 可能够合适。可以通过分析训练样本中的实际分布情况来自动生成一组更适合此类特征的比例参数。 - **Data Augmentation 增强技术的应用**: 利用旋转、缩放和平移变换等方式增加数据多样性,使得网络学习到更多关于细长物体的信息。特别是随机裁剪操作可以帮助模拟各种视角下可能出现的同长度与方向的变化[^1]。 - **Loss Function 自定义化**: 如果发现标准损失函数无法很好地收敛或者泛化性能佳的话,考虑引入额外项(如 GIoU Loss 或者 DIoU Loss),这些改进版本能够在一定程度上改善定位精度。 最后一步就是启动训练流程了: ```python # 开始训练过程 model.train() ``` 完成以上步骤之后就可以利用经过特别调优后的 YOLOv8 来实现对细长目标的有效检测了。
评论 24
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Franpper

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值