我们检测到你可能使用了 AdBlock 或 Adblock Plus,它的部分策略可能会影响到正常功能的使用(如关注)。
你可以设定特殊规则或将知乎加入白名单,以便我们更好地提供服务。 ( 为什么?
关注专栏 写文章

TridentNet:处理目标检测中尺度变化新思路

1,083 人 赞同了该文章

今天破天荒地为大家介绍一篇我们自己的工作(Scale-Aware Trident Networks for Object Detection),因为我是真的对这个工作很满意,哈哈。这篇文章主要要解决的问题便是目标检测中最为棘手的scale variation问题。我们使用了非常简单干净的办法在标准的COCO benchmark上,使用ResNet101单模型可以得到MAP 48.4的结果,远远超越了目前公开的单模型最优结果。(代码已经开源在SimpleDet中:TuSimple/simpledet

在正式介绍我们的方法之前,我先简单回顾一下现有的两大类方法。第一大类,也是从非Deep时代,乃至CV初期就被就被广泛使用的方法叫做image pyramid。在image pyramid中,我们直接对图像进行不同尺度的缩放,然后将这些图像直接输入到detector中去进行检测。虽然这样的方法十分简单,但其效果仍然是最佳,也后续启发了SNIP这一系列的工作。单论性能而言,multi-scale training/testing仍然是一个不可缺少的组件。然而其缺点也是很明显的,测试时间大幅度提高,对于实际使用并不友好。另外一大类方法,也是Deep方法所独有的,也就是feature pyramid。最具代表性的工作便是经典的FPN了。这一类方法的思想是直接在feature层面上来近似image pyramid。非Deep时代在检测中便有经典的channel feature这样的方法,这个想法在CNN中其实更加直接,因为本身CNN的feature便是分层次的。从开始的MS-CNN直接在不同downsample层上检测大小不同的物体,再到后续TDM和FPN加入了新的top down分支补充底层的语义信息不足,都是延续类似的想法。然而实际上,这样的近似虽然有效,但是仍然性能和image pyramid有较大差距。

几种处理scale variation方法的比较

我们方法的motivation其实早在16年刷KITTI榜单的时候就有初步形成,但是一直因为各种原因搁置,直到今年暑假有两位很优秀的同学一起将这个初步的想法改进,做扎实,结果其实也很出乎我最开始的意料。我们考虑对于一个detector本身而言,backbone有哪些因素会影响性能。总结下来,无外乎三点:network depth(structure),downsample rate和receptive field。对于前两者而言,其影响一般来说是比较明确的,即网络越深(或叫表示能力更强)结果会越好,下采样次数过多对于小物体有负面影响。但是没有工作,单独分离出receptive field,保持其他变量不变,来验证它对detector性能的影响。所以,我们做了一个验证性实验,分别使用ResNet50和ResNet101作为backbone,改变最后一个stage中每个3*3 conv的dilation rate。通过这样的方法,我们便可以固定同样的网络结构,同样的参数量以及同样的downsample rate,只改变网络的receptive field。我们很惊奇地发现,不同尺度物体的检测性能和dilation rate正相关!也就是说,更大的receptive field对于大物体性能会更好,更小的receptive field对于小物体更加友好。于是下面的问题就变成了,我们有没有办法把不同receptive field的优点结合在一起呢?


所以我们最开始的一个想法便是直接加入几支并行,但是dilation rate不同的分支,在文中我们把每一个这样的结构叫做trident block。这样一个简单的想法已经可以带来相当可观的性能提升。我们进一步考虑我们希望这三支的区别应该仅仅在于receptive field,它们要检测的物体类别,要对特征做的变换应该都是一致的。所有自然而然地想到我们对于并行的这几支可以share weight。 一方面是减少了参数量以及潜在的overfitting风险,另一方面充分利用了每个样本,同样一套参数在不同dilation rate下训练了不同scale的样本。最后一个设计则是借鉴SNIP,为了避免receptive field和scale不匹配的情况,我们对于每一个branch只训练一定范围内样本,避免极端scale的物体对于性能的影响。

总结一下,我们的TridentNet在原始的backbone上做了三点变化:第一点是构造了不同receptive field的parallel multi-branch,第二点是对于trident block中每一个branch的weight是share的。第三点是对于每个branch,训练和测试都只负责一定尺度范围内的样本,也就是所谓的scale-aware。这三点在任何一个深度学习框架中都是非常容易实现的。

在测试阶段,我们可以只保留一个branch来近似完整TridentNet的结果,后面我们做了充分的对比实验来寻找了这样single branch approximation的最佳setting,一般而言,这样的近似只会降低0.5到1点map,但是和baseline比起来不会引入任何额外的计算和参数。

TridentNet网络结构

我们在论文中做了非常详尽的ablation analyses,包括有几个branch性能最好;trident block应该加在网络的哪个stage;trident block加多少个性能会饱和。这些就不展开在这里介绍了,有兴趣的读者可以参照原文。这里主要介绍两个比较重要的ablation。

第一个当然是我们提出的这三点,分别对性能有怎样的影响。我们分别使用了两个很强的结构ResNet101和ResNet101-Deformable作为我们的backbone。这里特地使用了Deformable的原因是,我们想要证明我们的方法和Deformable Conv这种 去学习adaptive receptive field的方法仍然相兼容。具体结果见下。

可以看到,在接近map 40的baseline上,我们提出的每一部分都是有效的,在这两个baseline上分别有2.7和1.9 map的提升。

另外一个值得一提的ablation是,对于我们上面提出的single branch approximation,我们如何选择合适的scale-aware training参数使得近似的效果最好。其实我们发现很有趣的一点是,如果采用single branch近似的话,那么所有样本在所有branch都训练结果最好。这一点其实也符合预期,因为最后只保留一支的话那么参数最好在所有样本上所有scale上充分训练。如果和上文40.6的baseline比较,可以发现我们single branch的结果比full TridentNet只有0.6 map的下降。这也意味着我们在不增加任何计算量和参数的情况,仍然获得2.1 map的提升。这对于实际产品中使用的detector而言无疑是个福音。


我们还和经典的feature pyramid方法FPN做了比较。为了保证比较公平,我们严格遵循Detectron中的实现方式,并使用两层fc作为detector的head。可以看到在这样的setting下,FPN其实对于baseline而言小物体有一定提升,然而大物体性能下降,综合下来并没有比baseline有提高,但是我们的方法仍然可以持续地提升2.2个点map,就算使用single branch approximation,仍然也有1.2个点的提升。这充分证明了我们的方法的普适性。


最后我们将我们的方法和各paper中报告的最好结果相比较。但是其实很难保证绝对公平,因为每篇paper使用的trick都不尽相同。所以我们在这里报告了两个结果,一个是ResNet101不加入任何trick直接使用TridentNet的结果,一个是和大家一样加入了全部trick(包括sync BN,multi-scale training/testing,deformable conv,soft-nms)的结果。在这样的两个setting下,分别取得了在COCO test-dev集上42.7和48.4的结果。这应该分别是这样两个setting下目前最佳的结果。single branch approximation也分别取得了42.2和47.6的map,不过这可是比baseline不增加任何计算量和参数量的情况下得到的。


最后的最后,我们会在本月内开源整套训练代码,可以很方便复现TridentNet结果以及各种常见trick。这个框架下也包含了其他Detection和Instance Segmentation方面的经典工作,敬请期待!

编辑于 2019-01-29
深度学习(Deep Learning)
目标检测
赞同 1.1K​ 353 条评论
分享
收藏

文章被以下专栏收录

推荐阅读

  • 2019 GCNet(attention机制,目标检测backbone性能提升)论文阅读笔记

    背景《GCNet: Non-local Networks Meet Squeeze-Excitation Networks and Beyond》是最近挂在arxiv上的论文,作者Yue Cao来自于微软和清华,另外三作Han Hu也是大名鼎鼎realation network的…

    2019AAAI目标检测论文M2Det(One-stage算法)

    背景论文《M2Det: A Single-Shot Object Detector based on Multi-Level Feature Pyramid Network》是2019 AAAI的paper,作者来自于北大和达摩院。其思路类似本专栏之前介绍的RFBNet和CFENe…

    基于Movidius的目标检测算法开发(YOLOv3+MobileNet)

    基于Movidius的目标检测算法开发(YOLOv3+MobileNet)

    最新的Anchor-Free目标检测模型FCOS,现已开源!

    最新的Anchor-Free目标检测模型FCOS,现已开源!

353 条评论

切换为时间排序
精选评论(1)
  • beyond
    beyond 回复 Naiyan Wang (作者) 9 个月前

    看了这个人的回复,我就知道我的论文审稿人都是哪来的了,他们这种说法往极端了就是已经有人用CNN来做物体检测了,你这有什么novelty

评论(353)
  • 长安太保
    长安太保 9 个月前

    请问有paper link吗?Google搜不到。

  • Naiyan Wang
    Naiyan Wang (作者) 回复 长安太保 9 个月前

    sorry,已经更新在第一段里了

  • 李韶华
    李韶华 9 个月前

    我在一些classification问题上用了类似的trick。。还以为这trick早有了

  • Naiyan Wang
    Naiyan Wang (作者) 回复 李韶华 9 个月前
    分类和检测本质不同,没什么可比性。
  • 李韶华
    李韶华 回复 Naiyan Wang (作者) 9 个月前

    是medical image,某种abnormal pattern可以在image中以多尺度多次出现,其实和detection差不多,只是label不精细

  • 查看全部 6 条回复
  • 尼箍纳斯凯奇
    尼箍纳斯凯奇 9 个月前
    性能刷的很高,简单实用,很多检测任务都可以直接上啊[机智] 准备这几天就试试了。
  • eric
    eric 9 个月前
    该评论已删除
  • Naiyan Wang
    Naiyan Wang (作者) 回复 eric 9 个月前

    哥?还有什么区别?还同一波人?醒醒再来喷?

  • 鲭兜
    鲭兜 回复 eric 9 个月前

    还是有明显区别的,这个工作可以看成是rfb-net的延伸

  • 查看全部 11 条回复
  • 知乎用户 知乎用户 9 个月前
    1. 即使只用一个branch,但由于backbone的输出分辨率比较大,是不是还是比较慢。。
    2.小目标利用的特征依旧是大目标特征的局部,这个在fpn里面存在的问题,本篇文章是不是还是存在。。
  • Naiyan Wang
    Naiyan Wang (作者) 回复 deepDrowner 9 个月前
    1. 现在的downsample rate是16,和baseline保持一致。
    2. 并不是,小目标检测的还是完整的小物体,因为weight和检测大物体的weight是完全一致的,只是RF有差。这也就是我们说的FPN 对不同scale物体的representation power不同的原因。这是一个很好的问题。
  • 冬日的海
    冬日的海 回复 deepDrowner 9 个月前

    大佬,能否解释一下为什么小目标利用的特征是大目标特征的局部这句话啊

  • 查看全部 7 条回复
  • Gundam
    Gundam 9 个月前
    nice work,期待源码
  • Zhaozhe Song
    Zhaozhe Song 9 个月前

    single branch approximation论文里提了,但是这里是不是漏了

  • Naiyan Wang
    Naiyan Wang (作者) 回复 Zhaozhe Song 9 个月前

    嗯,我怕写太长大家不爱读了,所以在这里只贴了一个对single branch的ablation实验。。。

  • Naiyan Wang
    Naiyan Wang (作者) 回复 Zhaozhe Song 9 个月前

    哦,我知道你意思了。。。那我还是补充下吧。。

  • 展开其他 2 条回复
  • Bin GAO
    Bin GAO 9 个月前
    每次读大佬的文章,都觉得思路很清晰,解决问题有理有据,特别insights,但是到自己就是想不到 。
  • Wayne
    Wayne 9 个月前

    single branch approximation为啥还能提升呢? 和baseline的区别有: 1带了dilation,2训练时是三个branch一起训练。不清楚这两点哪个贡献大?

  • Naiyan Wang
    Naiyan Wang (作者) 回复 Wayne 9 个月前

    同样重要,我们开始讲motivation的时候有一个只train dilation=2的branch的结果,可以看到还没有我们三个一起训练然后保留一个的效果好。

  • Wayne
    Wayne 回复 Naiyan Wang (作者) 9 个月前

    厉害!看到了,在Table 1 --

  • 查看全部 9 条回复
  • Qjtbs
    Qjtbs 9 个月前

    简单实用的方法,赞;但是各个trident不共享weight效果却变差了,感觉这里还可以深入的找下原因

  • Naiyan Wang
    Naiyan Wang (作者) 回复 Qjtbs 9 个月前

    啊?没变差啊,table2里面res101和res101-deformable都涨了的啊。

  • longbye0
    longbye0 回复 Naiyan Wang (作者) 9 个月前

    Table 2(c)在multi branch上用了weight sharing涨了,是因为文章里讲的不共享的多分支版本overfitting吗?

  • Naiyan Wang
    Naiyan Wang (作者) 回复 longbye0 9 个月前

    一方面是,另一方面也是训练的更充分了

  • chaser
    chaser 回复 Qjtbs 5 个月前

    我也想问这个问题,为什么不shared weight效果反而变差?只是因为过拟合吗?作者回复的这意思是两个比较的训练轮数不一样??那还具有可比性吗?

  • Andy
    Andy 9 个月前

    很棒的工作!论文中大佬是基于Faster-RCNN的工作做的实验吧,不知道有没有在one-stage框架上做过实验啊~

  • Naiyan Wang
    Naiyan Wang (作者) 回复 Andy 9 个月前

    这个还没有,因为我们内部不用one stage的方法。等我们放了代码你可以迁移下试试哈~

  • zxhr2793
    zxhr2793 回复 Andy 9 个月前

    ECCV18有篇使用SPP构建了多分支并行的特征金字塔可以看一下,

  • 查看全部 10 条回复
  • 知乎用户 知乎用户 9 个月前
    gluoncv来一波?
  • Naiyan Wang
    Naiyan Wang (作者) 回复 whjxnyzh 9 个月前

    会放在我们另外一套mxnet的detection框架里。。。

  • whjxnyzh
    whjxnyzh 回复 Naiyan Wang (作者) 9 个月前
    为啥重复造轮子
  • 查看全部 6 条回复
  • 孙杨威
    孙杨威 9 个月前

    Table 6有点没看懂。。。另外table2里(d)相对于(b) Multi-branch加了Scale-aware,res101和res101-deformable一个涨点一个掉点是为啥?

  • Naiyan Wang
    Naiyan Wang (作者) 回复 孙杨威 9 个月前

    table 6就是说如果最后只保留一个branch,每个branch的valid range怎样影响性能。

    没有weight sharing其实很容易导致训练不充分和overfitting,加了deformable自由度更高,我猜这个问题吧。。不过就差0.2,也可能就是没啥用差不多啦。

  • Angzz
    Angzz 回复 Naiyan Wang (作者) 9 个月前

    按照我的理解,Table 6的(b)结果应该比(d)高才对啊,因为野weight share了,也有valid range了,求解~

  • 展开其他 1 条回复
  • Tyrone
    Tyrone 9 个月前
    什么时候开源呀[飙泪笑]
  • Naiyan Wang
    Naiyan Wang (作者) 回复 Tyrone 9 个月前

    快了快了,本月内一定。

  • ning ji
    ning ji 回复 Naiyan Wang (作者) 8 个月前

    还没出??说话不算话!!!!

  • merlin
    merlin 9 个月前
    大佬大佬~简单明了~
  • 孙杨威
    孙杨威 9 个月前

    Table6的实验是说三个分支都用所有scale来训练,最后inference的时候只在branch-2上做这个意思吗?这个结果会比三个分支不同scale分别训练最后三个分支同时预测这个标准做法稍微差一点是吗?

  • Naiyan Wang
    Naiyan Wang (作者) 回复 孙杨威 9 个月前

    对的,就是我文章里提到的single branch approximation

  • 王贺璋
    王贺璋 回复 Naiyan Wang (作者) 9 个月前

    这个地方看论文的时候确实有些疑惑,然后我就回来翻评论了,哈哈

  • 查看全部 8 条回复
  • zzzz
    zzzz 9 个月前
    其实我们可不可以理解为深度学习并不能以同一套kernel去拟合所有情况
    所以我们一方面尽可能的共享数据,学到common knowledge
    另一方面需要在一些层做一些显式的alignment,这样让他们在不同数据上的feature map是可比的。
    比如snip trident都是在做scale的alignment,我理解deformable是在做shape的alignment。
    如果是这样的话,最后深度学习会不会“倒退”回需要(至少在训练阶段)显式对不同情况(如光照)建模的状态。。
  • Naiyan Wang
    Naiyan Wang (作者) 回复 zzzz 9 个月前

    你理解基本是对的,不过deformable某种意义上也有scale的alignment。本质问题还是我之前在SNIP那个文章里说的,CNN现在没有能对scale invariant的meta operator。alignment我觉得是需要的,但是像光照这种,其实conv本身是应该有能力invariant的。

  • 王康康
    王康康 回复 zzzz 9 个月前

    我理解这个网络就跟你说的一样,前半部分就是在学common knowledge 即不分尺度提特征,后半部分的trident就是在显式的处理不同尺度。

  • autocyz
    autocyz 9 个月前

    网络固定了,怎么使用小的感受野的呢?

  • Naiyan Wang
    Naiyan Wang (作者) 回复 autocyz 9 个月前

    和别的branch比小的。。

  • 匿各用户
    匿各用户 9 个月前
    该评论已删除
  • Naiyan Wang
    Naiyan Wang (作者) 回复 匿各用户 9 个月前

    我建议您先读一下原文,并了解一下CV中如dilated conv这些广泛使用的操作,如果还有问题我们再深入讨论。

  • 匿各用户
    匿各用户 回复 Naiyan Wang (作者) 9 个月前

    这个细节不重要了,没什么本质的重要性,可以放过,您可以回答其他的问题,谢谢。比如和FPN的差异,似乎那里也可以同时提取不同尺度上的模式,和现在这个方法差不多啊,二者区别主要在哪里?

  • 展开其他 3 条回复