kaggle往期赛 | 海星目标检测比赛银牌经验分享

42 篇文章 2 订阅
37 篇文章 6 订阅

来源:投稿 作者:摸奖成功
编辑:学姐

比赛经验

此次比赛名次:

最终获得前2%的成绩,简单点就是银牌🥈!

此次比赛总结

1.给自己的实验记录,一定要制作一个lb和cv的参数表,最后可以根据参数表来权衡。

2.不要盲目相信discussion的做法, 人家可能是有目的的误导。

3.准备一套自己的推断notebook可以省很多时间。

4.发现一个模块不work,尽量理解不work的原因 而不是盲目的去遍历。

比赛复盘

赛题背景

澳大利亚令人惊叹的美丽大堡礁是世界上最大的珊瑚礁,拥有 1,500 种鱼类、400 种珊瑚、130 种鲨鱼、鳐鱼和大量其他海洋生物。

不幸的是,珊瑚礁受到威胁,部分原因是一种特殊的海星——以珊瑚为食的棘冠海星(或简称 COTS)的数量过多。科学家、旅游经营者和珊瑚礁管理者建立了一个大规模干预计划,以将 COTS 爆发控制到生态可持续的水平。

本次比赛的目标是通过建立一个在珊瑚礁水下视频上训练的物体检测模型,实时准确地识别海星。

评测指标

常见的评测指标:F2score

数据介绍

提供三段视频的图像切片

需要检测的目标较小

比赛方案

工具库:mmdetection,yolov5

开源代码链接:the framework of ensemble | Kaggle

https://www.kaggle.com/toongzhhang/the-framework-of-ensemble

比赛最终的方案是fasterrcnn和yolov5通过wbf模型融合

定义模型

config_file = f'../input/fastrcnn2000/faster_rcnn_cbv2d1_r50_fpn_1x_coco.py'
checkpoint_file = '../input/faster-rcnn/faster_rcnn_cbv2/epoch_8.pth' 
m1 = init_detector(config_file, checkpoint_file, device='cuda:0')
m2 = torch.hub.load('../input/yolov5-lib-ds', 
                       'custom', 
                       path='../input/yolov5s6/f2_sub2.pt',
                       source='local',
                       force_reload=True)  # local repo
m2.conf = 0.48

wbf示例代码

  • 每个模型的每个预测框都添加到List B,并将此列表按置信度得分C降序排列

  • 建立空List L 和 F(用于融合的)

  • 循环遍历B,并在F中找到于之匹配的box(同一类别MIOU > 0.55)

  • 如果step3中没有找到匹配的box就将这个框加到L和F的尾部

  • 如果step3中找到了匹配的box就将这个框加到L,加入的位置是box在F中匹配框的Index. L中每个位置可能有多个框,需要根据这多个框更新对应F[index]的值。

def wbf_one_img_result(result_cbnet, result_yolo, IOU_WBF=0.2):
    boxes_list = [[],[]]
    scores_list = [[], []]
    labels_list = [[], []]
    weights = [1, 1]
    iou_thr = 0.5
    skip_box_thr = 0.3
    #sigma = 0.1
    for cbnet in result_cbnet[0]:
        x1, y1, x2, y2, conf = cbnet
        boxes_list[0].append([x1/1280, y1/720, x2/1280, y2/720])
        scores_list[0].append(conf)
        labels_list[0].append(0)
for idx, row in result_yolo.pandas().xyxy[0].iterrows():
        boxes_list[1].append([row.xmin/1280, row.ymin/720, row.xmax/1280, row.ymax/720])
        scores_list[1].append(row.confidence)
        labels_list[1].append(0)
    
    boxes, scores, labels = weighted_boxes_fusion(boxes_list, scores_list, labels_list, weights=weights, iou_thr=iou_thr, skip_box_thr=skip_box_thr)
    
    length = len(scores)
    res = ''
    for idx in range(length):
        conf = scores[idx]
        xmin, ymin, xmax, ymax = boxes[idx]
        if conf > 0.4:
            res += f'{conf} {xmin*1280} {ymin*720} {(xmax-xmin)*1280} {(ymax-ymin)*720} '
    return res.strip(' ')

上分技巧

1.加大分辨率:提高yolo输入图片的size可以提高模型的性能

2.工具库:ensemble-boxes

https://github.com/ZFTurbo/Weighted-Boxes-Fusion

关注下方《学姐带你玩AI》🚀🚀🚀

回复“上分”获取本文银牌方案完整代码

码字不易,欢迎大家点赞评论收藏!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值