2020年AI竞赛获奖方案复盘系列(一) 目标检测竞赛trick-违法广告检测比赛

前言

博主去年参加了一系列比赛,取得了还可以的成绩,拿了几个国内比赛的top10,也拿到了kaggle的银牌。博主的梦想是有一天能够成就kaggle GM,成为一流的Data Scientist。有个遗憾的事是参加完这些比赛以后并没有好好的分析、学习其中出现的各种优秀的思路和技巧。博主并不想错过这种吸前排"欧气"的机会,所以打算写一个系列,记录我们能从这种竞赛前排选手的作品中,学到哪些内容。毕竟学到了就是自己的了。

博主只记录和学习很新的trick和模型,这些竞赛也都是20年的,所以很多trick和method都很新,比如模型涉及yolov5、efficientdet、doubleunet、HRnet、vision transformer,trick涉及自适应anchor、nosiy student、auto augmentation等等,有没有引起爱学习的你的兴趣?希望大家看完也有所收获。
2020年AI竞赛获奖方案复盘系列(一) 目标检测竞赛trick-违法广告检测比赛_第1张图片
第一篇带来的是20年参加的第一个竞赛是违法广告的目标检测类竞赛,违法广告分为一店多招、遮窗、非合法交通标志三类。需要我们用目标检测技术去识别出来。

首先贴上竞赛地址,没有参加的小伙伴可以先了解下赛题,再看分享会比较好:

赛题传送门

我们最终取得了top10的成绩,用了yolov5+efficientdet的ensemble。当时限于水平用的trick都比较中规中矩,值得一提的创新点我会放在最后提一下,我们先看看前排选手值得学习的内容。

第六名 (吸到1点欧气)

1.目标检测=>multi-head

目标检测任务可以拆分为分类+目标检测,二分类模型判断是否是纯背景,目标检测模型则在分类结构的基础上去具体定位前景框的位置。(写到这里突然想到这样做不就是把任意模型强行改成two-stage么,不就是faster rcnn的思路么,可见这些思路都是互相融汇贯通的)。在具体实践上可以使用单模型做multi-head也可以单独训练分类模型+检测模型。具体哪种思路好要看实验结果,在这个比赛中获胜选手是采取了multi-head的思路。

multi-head的位置:选手采用了efficientdet的模型,在BiFPN Layer的后面接了二分类的head,最终成绩第六名。这个比赛的评判结果是0.2ACC + 0.8MAP,ACC只考虑前景背景的判断精度,所以在这个标准的基础上,我觉得二分类的head刚好加强了这个部分,应该是有一定积极作用的。这种multi-head的思路我在kaggle比赛中也经常见到,值得研究的是如何更好的独立训练各个部分还是端到端的训练整个网络。这里我觉得可以参考faster-RCNN论文里的训练技巧,反复迭代训练(这部分未详细验证)。

专家对这个选手的点评是遮窗广告,广告位置一变就可能从违法变为不违法,和窗户的位置有很大关系,如何把localization做的更好呢?大家也可以思考下。

第五名 (吸到3点欧气)

1.架构分析

这个选手的架构如下所示:

backbone neck RPN header
resnet101+deformable conv fpn rpn cascade RCNN

这个架构中可以学习的是在backbone的最后两层采用deformable convolution,这个我认为和使用dilated concvolution有异曲同工之妙。dilated convolution的作用就是增大感受野,在使用dilated convolution的时候要注意使用HPC设计,避免棋盘效应,比如resnet系列最后采用125,125的叠加。使用deformable convolution可以自适应感受野,避免使用dilated convolution不好控制或者说找到最佳的感受野的复杂性。FPN可以有效在多尺度上进行预测,尤其是增加小目标的识别能力。cascade RCNN在很多比赛中都表现良好是一个必备的值得测试的baseline之一。

2.类间不平衡

对于类间不平衡,选手是在loss上进行了加权,这块没有详细说明,但是从效果看提升很大。我在竞赛中也发现,如果不进行类别不平衡的处理,那么基本上数量占比很小的类别的AP是非常低的。我们队伍采用了另一种思路,最后会提到。加权的比例可以观测loss或者是计算GT中类别的比例来决定,是可调参数。

3.全局信息的提取

这里参赛选手讲的不是很细,但是思路是这样的:因为two-stage的model会先通过RPN获取ROI,再在ROI上进行detection,这样就会忽略掉一些全局的信息。对这个赛题来讲,很明显的是背景的影响是巨大的,比如说遮窗广告,很明显的会受到窗户位置影响,multisigns的广告之间互相作用。

所以在这里选手对于全局feature map进行提取(这里号称是用dilated conv提取了一下)叠加到ROI上面,增强了ROI中对于全局信息的能力。

4.其他idea

  1. 选手通过EDA分析,发现框的比例多种多样,于是增加了base anchor的数量。
  2. 使用了OHEM:OHEM的思路很简单,就是在计算loss后,对于batch内的样本进行排序,最不准的样本要继续加入训练,这样使得模型多“看”困难样本,从而增强对于这些样本的识别能力。

专家大佬点评:一直在问训练集和测试集分布不同,如何进行分布补偿的问题,选手没有考虑。这块我也不是很了解,有读者懂这个点的可以留言交流一下。
另外专家建议先区分非交通性的指示牌和其他的广告类型。

第四名 (吸到4点欧气)

1.类间不平衡

对于类间不平衡,选手是采用了在线的类别重采样,从sample的角度去解决类别数据不平衡的问题。

2.ATSS 自适应anchor assign算法

关于使用这个trick的思路是这样的:首先选手观察了GT的信息,发现存在很多类的anchor比例,所以第一个思路是增加更多的anchor,但是选手认为这种做法有几个坏处:

  1. 进一步的增加了负样本的比例,加剧了正负样本的不平衡问题。
  2. 增加了模型的复杂度。
  3. 如果采用传统的kmeans聚类出anchor的话,很容易产生过拟合的风险,因此选手采用了ATSS的算法来取代聚类anchor的方法。
    ATSS是一种基于retinanet(anchor based代表)和FCOS(anchor free中center point的代表)来验证的自适应anchor算法,目的是缩小anchor based和anchor free算法之间的精度差距。作者通过进行消融实验逐步减少两类算法的差距,最终确定了正负样本的定义不同是导致anchor based和anchor free之间效果差异的主要问题。

ATSS从每个尺度的feature map上通过不同anchor与GT box的中心点距离来选择一批最近的anchor,然后通过计算IOU的均值和方差来“自动”生成阈值,再根据这个阈值来判断是正样本还是负样本。整个过程中的均值和方差都是一直在变化的。比如一批anchor的IOU均值比较大的时候,就说明这批样本和GT的重叠度普遍较高,那么阈值自然也要增加来获取更好的正样本。ATSS只有一个参数k,就是每个level上预置的anchor数量,实验证明这个k是比较鲁棒的(意味着其实是超参数free的东东),在作者的实验中最佳值是9。
下面是这种方法的论文和一篇不错的分析。

1.ATSS论文地址
2.知乎分析推荐
3.ATSS源码实现

推荐大家阅读下论文和知乎的中文解析。

这里就很有讨论点,比如two stage和one stage,anchor based和anchor free之间的区别、联系和共通性。作者写到这里突然想到如果使用ATSS+multihead,既通过ATSS来弥补了anchor free和anchor based的gap,又通过multi-head去汲取two stage的优势,是否能进一步提升模型精度?

3.脑洞大开的multi-signs留一半策略

这个点就是选手通过认真观察数据,提出的脑洞大开的一种策略了。我个人非常佩服这种脑洞。我们都知道multi-signs是一店多招的违法广告类型,这些广告牌都是成对或者更多以一组组的形式一起出现的。这些成对出现的multi-signs的广告牌在内容上具备一定的相似性,但是很难去使用到这种相似性。所以经常会出现其他类别的违法广告或者未违法的店铺招牌被错误的分类识别为了multi-signs类别。
这个选手在此基础上进行了一种非常有创意的训练思路,就是把multisigns成对出现的招牌中的其中一个用纯色去填充。这样可以迫使模型去学习multi-signs内容上的细节关联,减少把正常店招或者不相干的广告牌识别成multi-signs的概率。

4.SAC:可切换的空洞卷积

2020年AI竞赛获奖方案复盘系列(一) 目标检测竞赛trick-违法广告检测比赛_第2张图片

这个模块是DetectoRS中提出来的。我看了下就是通过不同dilation rate的空洞卷积提取多尺度的特征,再进行融合,有点像googlenet那种并行结构。然后又加了一个平均池化的注意力机制,注意力做了个“分叉”。先上论文地址和知乎上的推荐分析:

论文地址
知乎分析推荐

5.其他idea

  1. 加入了正常的(纯背景图片)进行训练,来进一步提升有无违法广告的判断。这点实际上帮助这个team涨了很多个点。
  2. 针对GT的多尺度复杂问题使用了叠加的BiFPN结构来增大不同尺度之间的features的融合。

专家点评:问有没有进一步研究训练集和测试集的数据分布之间的不平衡的问题,选手表示未考虑这方面。

第三名 (吸到2点欧气)

1.数据增强

这个选手做了大量的数据增强,涉及到的有:

  1. grid mask
    grid mask是一种基于分析cutout存在的问题而提出的数据增强手段,因为cutout容易出现把整个样本切掉或者是一点样本都没有切掉的现象出现。作者认为避免过度删除或保持连续区域是之前类似算法存在的核心问题。如果删除了过多信息,可能破坏掉原始数据,造成noisy data;如果删除过少信息,可能没有起到数据增强,改善模型鲁棒性的目的。

grid mask通过形成与原图分辨率一致的gird(0,1)网格与原图进行相乘,达到类似正则化的目的。
凭借grid mask算法,作者在imagenet上获得了超过auto-augment的提升(1.4个点)。

下面是知乎上一篇关于gird mask算法的推荐,大家可以查看。

知乎分析推荐

这个选手进一步借鉴了gird mask的初衷,在这个比赛中统计了最小GT框的长宽,避免出现grid mask遮盖了整个GT的情况出现。

2.auto augment
选手使用了google在coco数据集上搜索出的auto augment策略,涉及到强化学习,能够有效的训练集和测试集之间的样本分布漂移问题。
这个点博大精深,我还不是很了解,在此不过多的评论。但是现场专家很重视强化学习带来的优势。

2.其他idea

  1. 使用了cascade RCNN作为baseline,backbone是resnest101。
  2. 使用了Deformable Convolution来自适应提取感受野,这个不少选手采用了。
  3. 因为样本间难以区分,所以使用注意力机制去增强细粒度的特征提取:SE、CBAM等。值得注意的是选手没有在backbone的位置去增加注意力机制,而是在ROI之后增加,起到了对feature进行refine的作用。
  4. 针对一店多招的目标之间的相似性,引入了一个Feature Similarity Check模块,这块选手没有详细解释,大概就是目标feature之间进行余弦距离的计算,保留大的confidence,其余的与大目标进行相似度计算,去除小于阈值的。(个人感觉很难实际操作,评委也说了这个问题,因为一店多招未必绝对的在内容上具备高相似度。)

第二名 (吸到2点欧气)

1.类间不平衡

发现不同组选手对于类别不平衡的问题采取的方案都是各式各样的。前面已经提到了有loss加权、线上重采样的方案。第二名的方案里是只针对数量少的图像类别进行离线的数据增强,扩充样本。最后我还会提到我们组发明的一种新的数据平衡方案。

2.其他idea

  1. 发现数据集中部分目标是有重叠的,因而引入了mixup策略来缓解重叠的问题。(这是一般使用mixup的借口,哦不对,初衷,whatever)
  2. res2net作为backbone,res2net在一众比赛中都表现比较出色,可以作为重点测试的backbone之一,另一个是senet。
  3. 沿用了FCOS的架构+GCnet的注意力机制+Deformable Convolution。
  4. 使用了基于边框融合的非极大值抑制的手段(WBF)。

专家点评探讨了接入OCR网络的可能性,推荐了一篇论文,用以解决形变下的文字识别,下面附上论文地址,我对于OCR了解较浅,就不盲目分析了:

Mask TextSpotter: An End-to-End Trainable Neural Network for Spotting Text with Arbitrary Shapes

第一名 (吸到3点欧气)

笔者是边重新听译答辩现场录像边写下这篇博客,边回顾各种论文和材料,到这里已经持续写了六七个小时了,码了7k个字了。但是despite the tiresome,我们下面来振作一下精神,重点看下这个比赛的关于会给我们带来什么知识吧:

1.难点分析

这个选手对于赛题难点的剖析做的非常不错。这种思路值得借鉴。

首先这组选手剖析了这个赛题的一个难点,就是目前的目标检测网络,对于类别的判断,更多是focus框内的特征,而较少的收到背景影响。这就和一般的分类任务有了明显的区别,一般的分类任务对于背景的变化是鲁棒的,比如一只猫不会因为从桌子上变到草地上就变成了一只狗。但是这个比赛最致命的点就在于,它的前背景的类别(违法还是不违法)、类别间(一店多招、遮窗、非交通指示牌)都是严重依赖背景的。

比如遮窗广告依赖背景是窗户;multisigns在位置上有互相关联,属于框与框的关系;非交通性指示牌更多的是在道路上等等。这些显然都不能单纯的依赖框内的特征进行判断。

我觉得这个思路是非常有道理的。

对于上面这个问题,选手做的尝试是在提取ROI 之后,那这个ROI的size扩大1.5x,以融合到更多的背景信息辅助判断。

2.类间不平衡

这里只是提一下,选手解决类别不平衡的手段是Focal loss,这是很常见的思路。
但是大家可以总结下仅仅这个比赛前六名就有三种不同的解决类别不平衡的思路。我觉得复盘起来非常过瘾。

3.其他idea

  1. multi-head/分类+检测双模型处理区分分类任务和检测任务。选手最后选择了multi-head的思路。
  2. atss+resnet50+FPN
  3. SEPC(尺度均衡空间金字塔结构)
  4. 采用了GIOU loss

最后附上冠军的CSDN博客总结:

冠军总结传送门

放一张冠军的涨点图:

2020年AI竞赛获奖方案复盘系列(一) 目标检测竞赛trick-违法广告检测比赛_第3张图片

对于还有几个点没有展开,比如auto augment、SEPC、SAC等等,今天持续写了七八千字,实在是写不动了,后续会展开详细叙述。

你可能感兴趣的