返回列表

10th place solution — 2xYOLOv5 + tracking

476. TensorFlow - Help Protect the Great Barrier Reef | tensorflow-great-barrier-reef

开始: 2021-11-22 结束: 2022-02-14 环境监测 数据算法赛
第10名方案 — 2xYOLOv5 + 跟踪

第10名方案 — 2xYOLOv5 + 跟踪

作者: Aleksandr Snorkin (parapapapam) & danjafish
比赛: TensorFlow - Help Protect the Great Barrier Reef

祝贺所有参赛者,非常感谢组织者。这是一场充满挑战且有趣的比赛。

这篇文章是与 @danjafish 联合撰写的,我们要向我们的团队表示衷心的感谢。

摘要

我们的解决方案是两个不同训练方式的 YOLOv5 模型的集成 + 跟踪算法。

summary

我们的最终提交代码在此处可用:
https://www.kaggle.com/parapapapam/2xyolov5l6-tracking-lb-0-678-private-0-722

模型

在我们的解决方案中,我们使用了两个以不同方式训练的 YOLOv5 模型。

YOLOv5l6 1280

(作者: @parapapapam)

思路

本次比赛的主要技巧是使用高分辨率。但是,当你仅仅调整图像大小时,你增加了噪声而没有添加任何额外的信息,所以效果更好的原因并不在于图像本身。

我的假设是,这种效果的原因在于小目标的锚框分配。当你增加图像分辨率时,你使目标变大,但锚框网格步长是相同的,因此你获得了更好的对齐,模型效果更好。

因此,我决定不增加输入分辨率,而是在模型内部使用更高的分辨率。为此,我将第二个卷积层的步长从 2 改为 1:

...
[-1, 1, Conv, [128, 3, 1]],  # 1-P2/4
...

因此,该模型从第 3 个卷积层开始将具有 2 倍的分辨率,并且应该表现得像 2560 模型一样,但无需调整原始图像大小。

验证策略

按视频分割。视频 1 用作验证集。提交模型在视频 0 和 1 上重新训练,并在视频 2 上进行验证。

数据

我使用了 Kaggle 数据,并进行了 6 轮标签修正。我检查了高置信度模型的误报(FP)错误,并使用 labelImg 手动修复它们。这提高了 CV 分数,但对 LB 没有影响。
我在标记图像 + 随机选取的 10% 未标记数据上进行训练。

数据增强

我使用了 albumentations 库,流程如下:

aug_strong = [
    A.HorizontalFlip(p=0.5),
    A.VerticalFlip(p=0.5),
    A.RandomRotate90(p=1.0),
    A.OneOf([
        HueSaturationValue(p=0.5, hue_limit=0.05, sat_limit=0.7, val_limit=0.4),
        A.RandomBrightnessContrast(p=0.5, brightness_limit=0.15, contrast_limit=0.15),
        A.ToGray(p=0.1),
    ], p=0.8),
    A.OneOf([
        ShiftScaleRotate(p=0.4, shift_limit=0.1, rotate_limit=3, scale_limit=(0.5, 2.0), min_bbox=27, max_bbox=None, border_mode=0, value=(114, 114, 114)),
        A.Perspective(p=0.1, scale=0.1, pad_mode=0, pad_val=(114, 114, 114)),
    ], p=0.8),
    A.OneOf([
        A.GaussianBlur(p=0.5, blur_limit=(3, 5)),
        A.MotionBlur(p=0.5, blur_limit=(3, 5)),
        A.MultiplicativeNoise(p=0.5, multiplier=(0.9, 1.1), per_channel=False, elementwise=True),
    ], p=0.2),
]
bbox_params = A.BboxParams(format="yolo", label_fields=["class_labels"], min_area=16, min_visibility=0.2)
transform = A.Compose