kaggle-CowBoy Outfits Detection 竞赛方案学习
# kaggle-CowBoy Outfits Detection 竞赛方案学习
# 01、沐神总结
# 1.1 数据重采样
- 将不足的类别样本复制多次
- 在随机采样小批量时对每个类别使用不同的采样频率
- 在计算损失时增大不足类别样本的权重
- SMOTE: 在不足类样本的中选择相近对做插值
- 数据增强:mixup 等
# 1.2 所使用模型
- YOLOX:YOLOv3 + anchor free
- YOLOv5
- Detectron2:Faster RCNN
- 大都采用了多模型、k fold 融合
# 02、Kaggle 社区方案解析
# 1、2nd 解决方案:yolox-for-cowboyoutfits (opens new window)
- 使用 Yolox-m 模型,训练了40个epoch,前5个epoch为warm up,中间 20 epoch 为加入aug的训练,后15个 epoch 为不加入 augmentation 的训练
- 最后的测试结果为 58.46
- 代码链接:https://github.com/Megvii-BaseDetection/YOLOX
# 2、4th 解决方案:yolov5-transformer-module-ensemble (opens new window)
- 使用三个模型
- Yolov5x6
- Yolov5x6-transformer(1 transformer module)
- Yolov5l6-transformer(2 transformer modules)
- 构建验证集时:按照训练集比例抽样
- 构建 model config 时候添加了 C3TR ,代表 Transformer module
# 3、5th 解决方案:Challenge with imbalanced training data (opens new window)
# 统计count的轮子 from collections import Counter for ann in data["annotations"]: list_cat.append(dict_cat[ann["category_id"]]) Counter(list_cat)
1
2
3
4
5使用 SMOTE 算法处理样本不平衡问题,使得所有的类别训练样本都是 2097 了
使用的库是 https://github.com/scikit-learn-contrib/imbalanced-learn
from imblearn.over_sampling import SMOTE x_train_only_id = pd.DataFrame(x_train['id']) X_SMOTE, Y_SMOTE = SMOTE().fit_resample(x_train_only_id.values,y_train.values) Counter(Y_SMOTE)
1
2
3
4
使用模型是 yolov5s
# 4、6th 解决方案:cowboy detectron2 faster-rcnn (opens new window)
# 定义的数据增强 class myMapper: def __init__(self, cfg, is_train: bool = True): if is_train: aug_list = [T.ResizeShortestEdge([640, 800], sample_style='range'), T.RandomBrightness(0.8, 1.2), T.RandomContrast(0.8, 1.2), T.RandomSaturation(0.8, 1.2), T.RandomFlip(prob=0.5, horizontal=True, vertical=False)] else: aug_list = [T.ResizeShortestEdge(800, sample_style='choice')]
1
2
3
4
5
6
7
8
9
10
11五折训练,每个模型 25 个 epoch,大概 10 个 epoch 就足以达到比较好的 mAP 值,最终使用 weighted boxes fusion 做结果的集成
# 5、8th 解决方案:MMDetection+CascadeRCNN (opens new window)
- CascadeRCNN 12 个 epoch
- 为啥我的结果这么差???
# 6、Megvii_YOLOX (opens new window)
- 使用模型 yolox_x,分数为 64.36084,在初榜排第9
# 7、YOLOV5+k-fold+ensemble (opens new window)
- 如题所示,分组思路是基于
StractifiedKfold
, 但是因为对于目标检测,除了label balance 还有很多因素需要考虑,比如说目标检测框的数量分布,种类分布,甚至面积大小分布,所以这边参考了一下stackoverflow 上一个讨论 (opens new window)。 使用了floor division//5
# 8、windows_YOLOv5L (opens new window)
- 没什么trick,算是一个工程上的实践
# 03、总结
此次目标检测的竞赛并不像图像分类的竞赛那样,大家在各类 trick 上都有所尝试。因为图像分类任务简单,训练迭代快,并且大家基本都能从零搭建起自己的分类代码框架,所以在修改上是十分自由的。而对于目标检测竞赛,大家基本都是在使用别人的框架:
- YOLOv5 以及 最新出的 YOLOX 都受到了大家的青睐
- 此外还是老朋友 mmDetection 和 Detectron2
社区所分享方案中,大家所使用的个性化方案其实是比较有限的
- 针对不平衡数据的过采样
- 多折数据的划分
- 多折训练及 WBF 集成
这也充分说明了搞 CV 的同学对于大型框架的修改动手能力还是较弱的(和我一样),改改 config 是不能成为核心竞争力的,等把我的分割框架搭建完成就来从别人代码的基础上搞一个自己的检测框架
上次更新: 2021/09/05, 19:05:19
- 02
- README 美化05-20
- 03
- 常见 Tricks 代码片段05-12