来源:投稿 作者:摸奖成功
编辑:学姐
比赛经验
此次比赛名次:
最终获得前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》🚀🚀🚀
回复“上分”获取本文银牌方案完整代码
码字不易,欢迎大家点赞评论收藏!