前言
赛题介绍:天池竞赛-津南数字制造算法挑战赛【赛场二】
团队: ALL FATHER GIVE ME SIGHT
队长:Bloodhound
初赛:23/2157 A榜:0.6095 B榜:0.5728
复赛:32 A榜:0.7239 B榜:0.7114
虽然成绩一般,这也算是第一次正式参加比赛吧,权当记录下这两个月的工作。
初赛
最开始初赛任务是,判断出图像中包含哪些违禁品。
使用herbert-chen 分享的代码,一个分类模型。
- 考虑到该任务是判断图中包含的违禁品,如果对图像做crop可能会裁减掉一部分处于图片边缘的违禁品,但label中又包含该违禁品,会干扰模型,于是在训练和测试过程中都不再做crop.
- 因为这是个存在性问题,所以将label重新处理成[0,1,0,0,1](包含第二和第五类违禁品)
- 将CrossEntropyLoss替换成SmoothL1Loss
在对模型进行简单修改过后,得分到了1。
之后越来越多的队伍都到了1,所以官方对初赛任务进行了修改,变成了目标检测任务。
一、模型选择
之前对目标检测有过一定的了解,所以一开始就选择了faster-rcnn和maskrcnn,过后发现这两版太纯净了,需要自己加很多东西。直到后来了解到了mmdetection果断入坑。
mmdetection大法好!!!
二、数据增强
- 常规的上下翻转和水平翻转
-
此次竞赛除了提供包含违禁品的训练图像外,还提供了一部分正常的图像。我将这部分正常图像和包含违禁品图像进行拼接,做成一张新的训练图像,以此来提升模型辨别背景的能力。
做拼接的这个思路的是在看别人关于目标检测的trick时,有人提到两张图片逐像素带权相加来生成一张新的图像。考虑到这种方法不太适合这个任务,加之看到之前的模型得到的结果中很多误检,感觉模型对背景的识别效果不是很好,于是就想到了拼接。
三、选择的架构和用到的tricks
之后又观察了下ground truth中框的长宽比差别比较大,所以就在anchor_ratios中加了两个更小的尺度[0.125, 0.25, 0.5, 1.0, 2.0]
复赛
复赛从目标检测进阶成了语义分割。
因为初赛的效果还不错,就继续使用了mmdetection。
中间也尝试过其他的模型,但是最后的效果最好的还是mmdetection框架。
数据增强方式和初赛相同。
开始使用和初赛相同的架构,复赛要求模型不超过600M,所以选择Resnet-50作为backbone,加入Group Normalization和模型融合(这里主要是两个不同模型结果做与运算,来提高mask的准确度)过后 最高A榜达到了0.7150
之后框架换成了Hybrid Task Cascade
同样也使用了FPN和sotf-nms,之后再加了一个二分类网络做辅助,达到了最好效果。
使用二分类网络辅助
通过对分割结果的可视化,发现很多正常的图像也被检测到有违禁品,想到最开始初赛的判断是否存在很容易就取得了很好的效果,就想用之前初赛的网络来指导分割。
具体的做法用之前分类模型的结果来对分割结果进行过滤,即若分类模型认为该图片中包含第一和第二类违禁品,最后在提交结果时就只考虑第一和第二类。
但是训练分类模型时发现验证集的准确度最高只能达到0.7+,过滤过后的得分也并不高。
之后就对分类模型进行了简化,做二分类只考虑图像中是否存在违禁品,二分类模型在验证集的准确度达到了100%。
用二分类模型的结果对htc模型的结果进行过滤,达到了最好效果。
其他模型的尝试
之前考虑到 htc 其实是做的实例分割,难度比语义分割要大,觉得如果用单纯的语义分割模型的话效果应该会更好。
于是就尝试了deeplabv3,做了很多尝试,和调整,但是得分一直不是很高,最高只达到了0.6+。
比赛结束后听说有大佬 deeplabv3 单模就到0.7+了,我可能是跑了个假的deeplab - -
当时也跑了mask scoring rcnn,感觉效果应该会挺好的,但是效果不是很好,中间想在mmdetction写一个mask scoring rcnn的实现,后来发现看源码都要看很久,就暂时搁置了。
总结
这次比赛将近做了两个月,虽然成绩不算太好,但是第一次正经参加比赛能做到这个成绩也很满足了。
最开始刷榜上不去的时候真的挺煎熬的,到处去看了很多资料,也经常对着预测结果发呆。不过后面,随着分数慢慢的提升,成就感还是挺强的。
之前一直觉得做比赛的过程中自己做了很多的工作,但是现在写出来才发现,这段时间自己做了很多废操作。
不过也是收获了很多,至少把很多框架(可能只是名字 0 0)研究了一遍。
最后,这次比赛收获还是很多的,之后想写个mmdetection的源码解读,同时尝试下在mmdetection上实现mask scoring rcnn。