作者 | Jin.Carlo 编辑 | 汽车人
原文链接:https://www.zhihu.com/question/567414823/answer/2767617257
点击下方卡片,关注“自动驾驶之心”公众号
ADAS巨卷干货,即可获取
点击进入→自动驾驶之心【目标检测】技术交流群
后台回复【2D检测综述】获取鱼眼检测、实时检测、通用2D检测等近5年内所有综述!
这是目标检测内卷后时代的跨领域交叉作品,和2020年旷视出品的基于深度均衡模型DEQ的i-FPN是一个类型。同属于具有一定理论深度的迁移型应用类文章。
模型的结构是朴实的backbone+neck,没有其他花里胡哨的模块,全篇可以说只在训练策略与推理策略上进行调整,因而可以视为在给定现有检测网络的前提下所探索的新优化方式。
每一次训练,都会以1到T中间随机取样一个t,对真实box扰动,生成带有高斯噪声的box,用这些box去crop feature,送进head,得到预测box,然后set prediction (一对一匈牙利匹配)。
每一次推理,都是从采样于标准高斯分布的noisy box (random guess)出发,crop一下框内的feature,送进head,得到预测box。
与通常的Diffusion model一样,这里也可以用每一次head的输出box,作为依据,计算出新的初始box (当然也可以直接拿head的输出box作为初始),继续crop feature,送进head,得到又一轮的预测box。对于到处乱飞的box,则会重新采样noisy box填充。
论文成功地向我们展示了diffusion model在检测上优化可行,但同时从另一个角度,也向人们展示了这一新优化方式好像也无法带来具有颠覆性意义的前进(论文中ResNet-50的最好结果为46.2)。这再一次表明,优化范式所能起到的作用还是比较有限,feature才是重要,因为每一轮的feature都是由box crop而出。
此时如果仔细注意整个优化框架,会发现它的初始状态是一种随机性很大的RoI,我们要以它为基础去预测真实label。噪声共有T种,由t控制,随t的增大逐渐加强。由于t是随机的,在训练过程中,模型逐渐掌握了在这T种噪声下应该如何预测到真实box的方式。而最终的答案是:box refinement。
从random guess开始,逐渐refine预测box,同时设定阈值,随时将分类得分低的box用新的random guess替代。
由此可见,DiffusionDet本质上是初始条件远差于RPN给的region proposal的Cascade Sparse R-CNN,因为需要Cascade,所以让部分低质量box以noisy box的身份重新加入。这么一看,感觉像是一次文艺复兴式的革新。(PS: Cascade Sparse R-CNN已经在Sparse R-CNN原文中提出)
一言概括:DiffusionDet是具有粗糙位置先验的多阶段sparse检测器。
优点:得益于模型学习到了从各种各样的粗糙框映射到真实框的能力,因此推理时,初始框数量可以任意。而其他检测器的出发点并不是随机框,而是学习好的object query,因此强行改变query数量会导致大幅性能下降。
从DETR的发展历程来看,query-based检测器的成功很大程度上还是依赖于特征工程与先验知识的合理利用,与set prediction这一优化方式关联不大,这一点看Sparse R-CNN也可见一斑。
Dense/set prediction,说到底就是个label assign的区别。
set prediction个数少,天然就需要有更多的位置先验知识才能更好收敛,而dense prediction在先进的label assign下,训练前期即可获得目标明确的优化方向,收敛更快。
set prediction意在于end2end但收敛慢,dense prediction在于优化目标定义明确但需要NMS,二者都可以进行box refine。
set prediction显然更需要globle特征的加持,很适合与transformer搭配。dense prediction则更适合local特征,适合CNN。
由于decoder的存在,使得sparse检测器在每个decoder阶段都可以进行set prediction,因而整个模型有多处地方计算了loss,带来更好的监督。而dense prediction……别了吧,每个阶段都生成H*W*(4+num_class)的输出,搞label assign,那还得了,推理速度慢成狗。
现如今DiffusionDet的一大问题也在于初始化太过random,且没有Sparse R-CNN附加的proposal feature作为head的输入,这导致它需要450K个iteration (5x training schedule)才能使R50达到46左右的精度(Sparse R-CNN是3x即可46)。因此为了加速它的收敛,后面可能不得不又要加入位置先验知识这一与论文核心背道而驰的改进策略,重走一遍DETR老路?
另一大问题是表3(f) Accuracy vs. speed,当迭代次数达到4次时,FPS从31.3断崖式地掉到12.4,AP只能涨点0.8,这不得不让人担忧它的speed-accuracy trade-off代价太大了,似乎我只需要一次迭代(或者说one-stage)就已经可以获得足够可观的精度了,当然这还是在以收敛缓慢的前提下获得的。
不过嘛,论文也有一些实验凸显了DiffusionDet的优势,见图4,DiffusionDet不会因为推理时的box数量增多而引发性能退化,这是DETR,Sparse R-CNN等测试与训练必须具有相同box个数的检测器所不具备的。
我们知道一个有着300个某东西输入的网络,在测试时改变输入数量会发生什么?理所应当的性能下降啊。但DiffusionDet支持任意数量的random guess,测试与训练不必输出数量一致。但是吧,要说问题也有,就是测试时还是得选定一个经验性的random guess数量,而无法做到用多少拿多少。根据图4,好巧不巧又是300个box比较好,或许对于COCO数据集,300真是个吉祥的数字。
最后再补充一点个人对diffusion的看法吧。diffusion model究竟能不能像transformer那样在各种CV任务里乱杀?我个人是偏悲观的,当然以科学螺旋上升的发展规律来看,业界可能会用diffusion先席卷一遍再说。
我之所以不看好,原因在于,它相比于transformer普适性要差。transformer是基础网络模块,起到特征加工的作用,这对DL社区是万金油。而diffusion是优化策略,这注定它只能在适合的任务上大放异彩,而不适合的任务无异于东施效颦。
diffusion是迭代式的优化策略,这注定它天然就不适合对模型速度有要求的任务。
diffusion的特点是从无到有,因而适合生成任务,尤其适合对结果有精细要求的任务。
因为diffusion无中生有,这注定它更适合复杂的任务,而对简单任务则是大炮打蚊子。
还是因为无中生有,这注定它天然适合对实例要求不高的任务。比如生成个猫,训练集全是猫,所以我训练的生成器自然也会生成猫,而不会生成狗。这也即是说,diffusion是带条件生成。一个高斯噪声,你怎么知道它最后会生成狗?还是生成猫?更别说如果我希望它输出拉布拉多犬,不加条件则不堪入目。因此训练集要么全部采样于某一特定分布,要么就必须搭配“某个条件”作为生成器的输入,比如DiffusionDet的随机框搭配了feature。
以上四条主要是对diffusion模型的推理来说的。
第1与第2条意味着如果一个任务需要速度且可以允许结果粗糙一点,diffusion就没有必要。
第3条意味着如果一个任务简单,简单到现有方法过一个小模块即可获得不错的精度,则diffusion除非能够极大地提高精度,否则速度大幅下降就得不偿失。
第4条意味着给定条件的质量往往能够决定生成的质量,如果条件质量差,最终生成的结果就可能被带跑偏或者低质量。
我们看到,训练时的扩散操作可视为随机扰动,因此前向扩散过程倒是一个普适性更高的操作,可以给模型增加多样化的监督。后向复原过程就是个反复的multi-stage refinement。因此二者分开后,它们仍然可以执行。
这其实从控制变量法也可以看出。
如果我们固定逆向生成过程的step不变,那么必然是添加了前向扩散的模型生成质量更好。(添加随机扰动,加强监督)
进而导出,扩散过程分的越细,最终生成质量越好。(随机扰动的版本越多,抗扰动越好)
由于分1次总比分0次要多,所以随机扰动哪怕固定1个版本都比不随机扰动好。因此我猜测如果对DETR的object query也增加随机扰动,则它也可以multi-stage refine不退化。
经验性上来讲,对复杂任务的细化可以带来优化难度降低,所以性能提高。但反过来对简单任务复杂化,是需要代价的。
以前我曾试过对GT box添加随机扰动,使添加扰动后的GT box与原始GT box保持高IoU (>0.9这样),但是性能没有改善。
而DiffusionDet则是想说对anchor box加扰动有效果。
因为anchor box一旦变化,要么会影响到RoI feature的变化,要么对其他one-stage检测器来说会影响到正负样本定义的变化,总之会让训练过程更加具有随机性。轻微加一点应该没事,可以提高一定的鲁棒性,而如果加太多,优化难度剧增,不仅收敛速度极剧变慢,还得依靠multi-stage来弥补预测质量的下降,最终得不偿失。
因此,要想缩短逆向生成的时间,一个是采用较少次数的refinement,一个是使用极其轻量级的网络作为生成网络。
由于检测器的预测是在head网络上,对DETR系列来说是6个串联decoder,输出是300个box;而对CNN检测器来说是几层卷积,输出是高分辨率的密集预测。
因此diffusion要想在检测任务上加速,就只能缩减decoder数量(DETR系列),或者减少卷积层数量(CNN检测器),并且refine次数要少一些。
比如decoder数量从6个改成2个(这里其实已经会大幅降低性能了),然后refine次数设为3次,这样前向经过的decoder数量仍然为6个。
可是这么一通操作之后,和原来的推理结构几乎就没有差异了,绕了一大圈又回到起点。
究其根本原因,可能还是在于box预测是简单任务。这是因为
预测box的定位质量不需要完美与GT box重合,只需要IoU>0.95就够了,这是为了满足最严格的评价指标AP95。
预测box的分类得分不需要趋近于1,而是要与定位质量相匹配,有个不错的排序就行了。
背景大部分是简单易分类的地方,分类得分很容易趋于0,且背景位置不需要box回归。
优化策略应该与任务的特性相匹配,所以diffusion能否乱杀各种CV任务?笔者目前还看不到希望,留待未来的探索了。届时再来狠狠打脸。
往期回顾
多模态3D目标检测发展路线方法汇总!(决策级/特征级/点/体素融合)
【自动驾驶之心】全栈技术交流群
自动驾驶之心是首个自动驾驶开发者社区,聚焦目标检测、语义分割、全景分割、实例分割、关键点检测、车道线、目标跟踪、3D目标检测、BEV感知、多传感器融合、SLAM、光流估计、深度估计、轨迹预测、高精地图、规划控制、模型部署落地、自动驾驶仿真测试、硬件配置、AI求职交流等方向;
添加汽车人助理微信邀请入群
备注:学校/公司+方向+昵称
自动驾驶之心【知识星球】
想要了解更多自动驾驶感知(分类、检测、分割、关键点、车道线、3D目标检测、多传感器融合、目标跟踪、光流估计、轨迹预测)、自动驾驶定位建图(SLAM、高精地图)、自动驾驶规划控制、领域技术方案、AI模型部署落地实战、行业动态、岗位发布,欢迎扫描下方二维码,加入自动驾驶之心知识星球(三天内无条件退款),日常分享论文+代码,这里汇聚行业和学术界大佬,前沿技术方向尽在掌握中,期待交流!