目标检测比赛思路、tricks集锦、资料汇总!

作者 | 清风明月  编辑 | 汽车人

原文链接:https://zhuanlan.zhihu.com/p/345657476

点击下方卡片,关注“自动驾驶之心”公众号

ADAS巨卷干货,即可获取

点击进入→自动驾驶之心【目标检测】技术交流群

作为一个没有计算资源,没有接触过目标检测的渣硕第一次参加2021广东工业大赛的比赛

2021广东工业智造创新大赛-智能算法赛-天池大赛-阿里云天池
https://tianchi.aliyun.com/competition/entrance/531846/introduction?spm=5176.12281957.1004.6.56893eafcpsqpc

  1. 资源:租了一张2080ti(五百多租一周好贵啊);

  2. 成绩:初赛 90/4432(进复赛啦),成绩一般,受制于资源以及后期单打独斗参加比赛。

  3. 最终方案:Cascade R-CNN, Backbone: ResNet-50, 在线切图策略训练,测试时使用分水岭算法去了一下黑边(很简单,很多tricks都没尝试,最简单的模型融合也没做,时间和资源都不够用啊。。。)

  4. 悄悄告诉大家,在github中搜tianchi defect detection即可搜到很多开源的冠军方案(我可真是个机灵鬼skr),同理,搜kaggle + 领域也能搜到很多方案。

https://github.com/search?q=tianchi+defect+detection

  1. 声明:第一次写文章以及接触目标检测,若有错误还请善意指正哈,感谢。

接下来讲讲思路以及分享我花了大量时间收集的资料(后面有XMIND总结,分享给大家),一句话概括这个任务:超大尺寸图像的极小目标检测

1一、数据分析

数据集图像的尺寸是8192* 6000,而目标object则特别小(不知道大家能不能找到可视化出来的红色bbox,注意:这张图一共有三个bbox)

671f24bb4df3c0faa3e277884ff6b41e.png
训练集里面的一张图像以及其三个bbox

看不到就放大它吧

68efc04f2f0f51046c5c8a8c1f8d29f5.png
放大好几倍,截图出来的结果(还是那么小啊)

并且每张图的object特别少(即稀疏)

做一个统计:

a0614727b58b76236036aca181be06d0.png
每张图的bbox的数量大部分集中在1-5个

看看bbox的面积大小吧:

d3c83799aa1694959a4811186bcbcd97.png
面积都很小啊

EDA的代码参考(ps,第一次看到EDA这三个字母我也是懵逼的,查了一下就是探索性数据分析(Exploratory Data Analysis,简称EDA),可能这样看起来更牛):

https://github.com/Ying-Kang/TianCHI_guangdong/blob/main/eda.ipynb?spm=5176.12282029.0.0.26b21aaa83A2vL&file=eda.ipynb

2二、比赛思路

对于这种超大尺寸图像的极小目标的检测,第一时间想到卫星图像中的目标检测,查了一下相关资料

30afb076b7c0e8267234c47ceeecb554.png
图源《You Only Look Twice: Rapid Multi-Scale Object Detection InSatellite Imagery》,该论文以YOLT代称。

https://arxiv.org/pdf/1805.09512v1.pdf
https://blog.csdn.net/u014380165/article/details/81556805

参考这篇论文的思路:将原输入图像切块,分别输入模型进行检测,然后再融合结果。

具体切块策略(记切图的大小是1333* 800):

1、离线切图(先把训练集切图,然后再让网络训练);2、在线切图(训练时使用RandomCrop等)

因为就一块2080ti,想要做到每天都可以有两次结果提交,就先考虑的是离线切图策略。

离线切图的三种策略:

1.1、做滑动窗口切图:bbox面积特别小,又很稀疏,因此注意排除没有bbox的切图(这会引入很多正常的样本,注意这里,是个坑,后面再讲)。注意需要考虑是否做有overlap的滑动窗口切图。

1.2、遍历每个bbox,然后以该bbox作为切图中心坐标,做中心切图;如果其他bbox的坐标满足在该切图范围内,则加入该bbox。例如红色切图是以bbox#1作为中心的,但是bbox#2在红色切图范围内,则该红色切图则会有两个bbox。

d8fa468ded548f9caecc17f1e4acf816.png
对于中心切图策略,切图个数应该等于bbox的个数(手残党画的切图框示意)

中心切图可能存在的问题:对于bbox很密集的情况,有大量的几乎相差不大的切图(这个对于这个比赛影响不大)。

1.3、遍历每个bbox然后随机进行坐标偏移:考虑到中心切图引入了先验信息,即每个切图的中心一定会有一个bbox,因此引入随机性。具体的:遍历每个bbox,生成该bbox在切图坐标系中的随机坐标,例如生成的随机坐标是(0,0),该bbox则在切图的左上角,随机坐标是(1333,800),则该bbox在切图的右下角。注意:细节上还需要考虑该bbox的长宽,引入长宽后随机坐标会有一个进一步的约束(即切图大小和bbox的长宽来共同限制随机坐标)。同样的,对于随机切图策略,切图个数应该等于bbox的个数。和中心切图一样会包含在切图范围内的所有bbox。

两个细节需要考虑:1、切图要不要避免把bbox一分为几。滑动窗口切图策略加入overlap即可;其他两种策略肯定会包括每个完整的bbox(只要bbox的大小不超过切图设定的大小,即1333800)。2、一般的backbone的下采样率(stride)是32,也就是到最后的feature map的一个特征点对应原图的3232的区域;而大多数bbox的area基本都在100左右,最小的bbox面积为9。YOLT的做法是将stride变为16。

对于随机偏移的离线切图,可以做多次即可得到多倍的数据。

在线切图(我用的是mmdetection,在线切图的GPU利用率低啊,所以训练起来就比较慢):

2.1、使用RandomCrop

2.2、使用RandomCenterCropPad

这两个在线切图策略的不同请自己看mmdet的官方实现,提醒一个细节,RandomCrop有参数允许切图中不包括bbox,而RandomCenterCropPad不允许。我理解的是RandomCrop这种设置可以引入不包含bbox的负样本,避免最终结果的误检较多。

总结:离线切图相当于网络模型只能看到你给的这些数据了,在线切图每次都用random,数据更多样吧。在线切图的结果会比离线切图的结果好,就是训练慢了一点。

回复上面提及到的那个坑:离线切图均考虑的是切图中必须包含bbox才行,在线切图的RandomCenterCropPad得到的切图也是必须包括bbox。但是根据验证集上的可视化结果来看,误检比较多。因此加入没有bbox的切图进行训练是很有必要的。但是呢,细看官方实现RandomCenterCropPad和RandomCrop时(此时已经是比赛最后一天了),发现后者就只需要设置alllow_neg_positive = True即可,由于时间关系没有尝试该策略。

测试:因为计算资源受限,使用原图做inference显存不够啊(原图大概需要19G,而2080ti就11G),那没办法啊,把测试集也切图呗。比如切成3600* 3600的,再把结果融合到原图的坐标系。注意:1、如果训练时用了多尺度,测试时一般resize到多尺度的中间倍数值,例如训练时resize的多尺度范围是640到1280,测试时进行1.5倍的resize即可。2、如果bbox比较密集的时候,测试时还是参考YOLT做有overlap的切图吧,后面再用NMS过滤一下即可(overlap的比例得统计bbox的面积大小才能更好的设置)。

3三、模型:

列出几个重要的

  • 没有速度要求的话,通用就是Cascade R-CNN + Big backbone + FPN (Bbox长宽比例极端的话考虑加入DCN以及修改anchor的比例值,默认是0.5,1,2,比如可以修改为[0.2, 0.5, 1, 2, 5]),有速度要求就可以尝试YOLO系列(听说YOLO v5在kaggle的小麦检测上霸榜,可以看看他们的notebook),anchor的比例设置还是要多EDA分析得到一个合适的选择。

  • 多尺度训练和测试,参考这个关于多尺度的解释

https://linzhenyuyuchen.github.io/2020/02/13/MMDetection-%E5%A4%9A%E5%B0%BA%E5%BA%A6%E8%AE%AD%E7%BB%83%E6%B5%8B%E8%AF%95/ linzhenyuyuchen.github.io/2020/02/13/MMDetection-%E5%A4%9A%E5%B0%BA%E5%BA%A6%E8%AE%AD%E7%BB%83%E6%B5%8B%E8%AF%95/

MMDetection 多尺度训练测试 linzhenyuyuchen.github.io/2020/02/13/MMDetection-%E5%A4%9A%E5%B0%BA%E5%BA%A6%E8%AE%AD%E7%BB%83%E6%B5%8B%E8%AF%95/

https://posts.careerengine.us/p/5f94519f324fe34f723bcbed posts.careerengine.us/p/5f94519f324fe34f723bcbed

  • fp16精度训练可以减少训练时间

  • 伪标签策略(在kaggle小麦检测上可以提三个点),请参考如下

https://www.kaggle.com/code/nvnnghia/yolov5-pseudo-labeling/notebook
https://www.kaggle.com/code/nvnnghia/fasterrcnn-pseudo-labeling/notebook

14e3b595fe44106481ebbe63ae6c4bf8.png
模型总结

4四、Tricks:

列出几个重要的:

  • WBF,TTA是涨点神器

  • 比赛中无脑降低score的阈值会提升mAP,会有较多误检

  • 两个重要的数据增强策略:Mixup以及填鸭式,下面是一个简单的实现

https://github.com/chuliuT/Tianchi_Fabric_defects_detection/blob/master/final_commit/Duck_inject.py

36c1871de474f3c5bef730934f669827.png
总结的一些tricks

5很好的参考资料:

https://www.cvmart.net/community/detail/1500
https://cloud.tencent.com/developer/beta/article/1486440
http://spytensor.com/index.php/archives/53/?aazqne=u9pzg2&lktala=z15jb3
https://zhuanlan.zhihu.com/p/102817180
https://www.cnblogs.com/zi-wang/p/12537034.html

6最后:

  1. 参加比赛可以学到很多东西,尤其是在不懂该领域时。这会让你去了解一些细节而不是单纯看paper时的囫囵吞枣。但是呢,现在detection有很多集成得很好的库了(例如mmdetection),很多细节也是只需要改一些参数,配置一些configs即可。若想细致的了解,还需要看具体的实现。

  2. 参加比赛很重要的一点是团队。作为队长你想要取得什么样的成绩,同时队友也有致力于这个目标的自驱动力,即设置一个合理的目标。如何激发每个成员的主观能动性是很重要的!作为队长,对于整个比赛的进度把控是很重要的,什么时候出一个baseline,基于baseline结果的各种可能细分为各种方向,每个成员在哪些方向进行探索(数据处理/模型等),定期的头脑碰撞很重要。

  3. 实验设置/结果记录,实验结果的管理也很重要,推荐使用一些共享文档来记录(例如腾讯文档,石墨文档)。学会利用身边的一切资源(能找到有卡的队友真是太幸福了),在比赛群里看到有同样思路的其他队伍积极交流啊(这个对我来说帮助很大),避免局部最优,闭门造车嘛。

  4. 自己的总结是参考了很多其他的博客以及知乎文章,因此有一些‘抄袭’吧。若原作者看见了请联系我,可以删除或者加上你的文章链接。感谢!

  5. 知乎图片应该会有压缩,因此上传一个Xmind源文件给大家,有需要的下载即可。里面不仅有上面那些图片的总结源文件,还有mmdetection的使用总结(因为我是一个爱写笔记的人,所以啥都总结),还有一些服务器的使用总结等等,关于Xmind中一些是我加工处理过的,信息传递会存在gap嘛甚至会存在错误,所以欢迎批评指正

XMIND源文件网盘链接: https://pan.baidu.com/s/1ltfQJmC4lMcNO_gX9rcM6w 密码: 9c20

总结来一个 目标检测预训练模型(基于对比学习)相关论文梳理,见:
https://zhuanlan.zhihu.com/p/361310467

视频课程来了!

自动驾驶之心为大家汇集了毫米波雷达视觉融合、高精地图、BEV感知、传感器标定、传感器部署、自动驾驶协同感知、语义分割、自动驾驶仿真、L4感知、决策规划、轨迹预测等多个方向学习视频,欢迎大家自取(扫码进入学习)

e532d450fa8e784d6b8604cdcafcbd3e.png

(扫码学习最新视频)

国内首个自动驾驶学习社区

近1000人的交流社区,和20+自动驾驶技术栈学习路线,想要了解更多自动驾驶感知(分类、检测、分割、关键点、车道线、3D目标检测、Occpuancy、多传感器融合、目标跟踪、光流估计、轨迹预测)、自动驾驶定位建图(SLAM、高精地图)、自动驾驶规划控制、领域技术方案、AI模型部署落地实战、行业动态、岗位发布,欢迎扫描下方二维码,加入自动驾驶之心知识星球,这是一个真正有干货的地方,与领域大佬交流入门、学习、工作、跳槽上的各类难题,日常分享论文+代码+视频,期待交流!

1c14147540b02f6a7224af2173a82629.jpeg

自动驾驶之心】全栈技术交流群

自动驾驶之心是首个自动驾驶开发者社区,聚焦目标检测、语义分割、全景分割、实例分割、关键点检测、车道线、目标跟踪、3D目标检测、BEV感知、多传感器融合、SLAM、光流估计、深度估计、轨迹预测、高精地图、NeRF、规划控制、模型部署落地、自动驾驶仿真测试、产品经理、硬件配置、AI求职交流等方向;

bd721544453de7c0b7adabb3e7bf72b9.jpeg

添加汽车人助理微信邀请入群

备注:学校/公司+方向+昵称

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值