介绍

本文是旷视研究院CVPR2018上的一篇工作,在检测行人任务中,由于行人之间互相遮挡,导致传统的检测器容易受遮挡的干扰,给出错误的预测框。

研究人员先是从数据集上进行分析,定量描述了遮挡对行人检测带来的影响。后面受吸引,排斥的启发,提出了Repulsion Loss来尽可能让预测框贴近真实框的同时,又能与同类排斥,进而避免误检。

问题引入

常见的遮挡问题可以再被细分为主要两类

  1. 类间遮挡,即目标被其他类遮挡住。举个例子,一个行人遛狗,人体下半部分就可能被狗狗遮住

  2. 类内遮挡,目标物体被同类遮挡住,在我们问题里面也就是行人遮挡。

我们思考一下行人遮挡会对检测器造成什么影响。
假设我们目标行人是T,旁边被另外一个行人B所遮挡。那么B的真实框会导致我们对T的预测框P,往B去移动(shift),造成类似下图的情况

另外我们再考虑下目标检测常用的后处理NMS,非极大值抑制。NMS操作是为了抑制去除掉多余的框。
但是在行人检测中,NMS操作会带来更糟糕的检测结果。
还是刚刚的例子,我对T有一个预测框P,但因为距离B靠的太近,我可能会被B的预测框给抑制,导致行人检测中出现漏检。这也从另外一个侧面反映出行人检测对NMS阈值的敏感性阈值太低了会带来漏检,阈值太高了会带来假正例(即标出错误的目标)

因此如何稳定的检测出群体中个体行人是行人检测器的关键。

现有的方法仅仅要求预测框尽可能靠近目标框,而没有考虑周围附近的物体。
受磁铁同性相斥,异性相吸的原理,我们提出了一种RepLoss新的损失函数

该损失函数在要求预测框P靠近目标框T(吸引)的同时,也要求预测框P远离其他不属于目标T的真实框(排斥)
该损失函数很好的提升了行人检测模型的性能,并且降低了NMS对阈值的敏感性

人群遮挡的影响

数据集

我们采用了CityPersons数据集,该数据集有共约35000个行人。我们的实验都基于这个数据集进行,在评价当中,我们采用log miss rate的MR−2指标来进行衡量(也就是每张图片的漏检率上取平均值,再进行log计算,该值越低越好)

检测器

我们的基线检测器沿用了Faster RCNN,将骨干网络换成resnet。由于行人检测算是小目标检测任务,因此我们给resnet增加了空洞卷积,并将下采样改为8倍(原始224->7下采样是32倍)

简单改进后的目标检测器的MR指标由15.4下降到14.6,稍微提升了点。

小目标难检测原因(补充)

  1. 传统的分类网络为了减少计算量,都使用到了下采样,而下采样过多,会导致小目标的信息在最后的特征图上只有几个像素(甚至更少),信息损失较多
  2. 下采样扩张的感受野比较利于大目标检测,而对于小目标,感受野可能会大于小目标本身,导致效果较差

对失败案例的分析

我们在CityPerson数据集中,由于该数据集是从分割数据集得来的,因此我们有每个行人的可见区域,即BBox_visible

为了更好分析,我们定义了一个遮挡率,如下公式
occ=1−area(Bboxvisible)area(Bbox)occ = 1 - {{area(Bbox_{visible}}) \above{2pt} {area(Bbox)}} occ=1−area(Bbox)area(Bboxvisible​)​
由公式可知,当行人可见区域越小,遮挡率occ越大

我们设定occ >= 0.1即为一个遮挡的案例

而occ >=0.1 并且与其他行人的IoU >=0.1,我们定义为人群遮挡案例

基于这两类设定,我们又在原数据集上划分出两个子集,分别是reasonable-occ,reasonable-crowd
很显然,reasonable-crowd也是resonable-occ的子集


蓝色,橙色,灰色分别代表Reasonable-crowd子集,Reasonable-occ子集,Reasonable集合。可以看到crowd子集在occ子集中,占据了接近60%。这也从侧面说明了人群遮挡是遮挡中一个主要问题。

假正例分析

我们同时也分析了有多少假正例是由人群遮挡造成的
我们具体分为了三类,background,localization,crowd

  1. background是预测框与真实框的IoU<0.1
  2. localization是预测框仅与一个真实框的IoU>=0.1
  3. Crowd是预测框与多于两个真实框的IoU>=0.1


图中红框就是上述的crowd error,大约有20%的假正例都是由人群导致的
因为相邻的两个真实框,预测框或多或少产生偏移,导致预测错误

Repulsion Loss

前面分析了这么多错误,现在才是重头戏
Repulsion Loss主要由三部分构成
L=LAttr+α∗LRepGT+β∗LRepBoxL = L_{Attr} + \alpha*L_{RepGT} + \beta*L_{RepBox} L=LAttr​+α∗LRepGT​+β∗LRepBox​
Lattr是为了预测框更接近真实框(即吸引)

Lrep则是为了让预测框远离周围的真实框(即排斥)

参数α和β用于平衡两者的权重

我们设
P(lP , tP , wP , hP )为候选框
G(lG, tG, wG, hG)为真实框

P+为正候选框集合,正候选框的意思是,至少与其中一个真实框的IoU大于某个阈值,这里是0.5
g = {G} 是真实框集合

Attraction term

这一项loss在其他算法也广泛使用,为了方便比较,我们沿用smoothL1 Loss

BP是根据预测框P回归调整得来的GAttrP则是与预测框P有最大IoU的真实框GAttrP=argmaxG∈gIoU(G,P)B^P是根据预测框P回归调整得来的 \\ G^P_{Attr}则是与预测框P有最大IoU的真实框 \\ G^P_{Attr} = arg max_{G∈g} IoU(G, P) BP是根据预测框P回归调整得来的GAttrP​则是与预测框P有最大IoU的真实框GAttrP​=argmaxG∈g​IoU(G,P)
Smooth L1 Loss公式如下

这里我们的平滑系数取2

Repulsion Term (RepGT)

RepGT loss设计是为了远离非目标的真实框
对于一个候选框P,其排斥对象被定义为,除去本身要回归目标的真实框外,与其IoU最大的真实框

受IoU loss启发,我们定义了一个IoG
IoG(B,G)=area(B∩G)area(G)IoG(B, G) = {area(B∩G) \above{1pt} area(G)} IoG(B,G)=area(G)area(B∩G)​
损失定义如下

这里没有采用smooth l1 loss而是smooth ln loss,其公式如下


不同平滑系数,最后陡峭程度不一样。当一个候选框P与非目标的真实框重叠越多,其惩罚也越大。

Repulsion Term (RepBox)

这项损失是针对人群检测中,NMS处理对阈值敏感的问题
我们先将P+集合划分成互斥的g个子集(因为一共有g个目标物体)
P+=P1∩P2∩...∩P∣GP+ = P1 ∩ P2 ∩ . . . ∩ P|G P+=P1∩P2∩...∩P∣G
然后从两个不同子集随机采样,分别得到两个互斥集合的预测框,即
Pi∈Pi,Pj∈Pj(wherei,j=1,2,...,∣G∣,andi≠j)Pi ∈ Pi \space ,\space Pj ∈ Pj (where \space i, j = 1, 2, . . . , |G|, and \space i \not = j) Pi∈Pi , Pj∈Pj(where i,j=1,2,...,∣G∣,and i​=j)
我们希望这两个互斥集合出来的回归框,交叉的范围尽可能小,于是有了RepBox loss,公式如下

其中 I\IotaI是identity函数,即
y=xy = x y=x
这里限制大于0,为了避免分式除0,我们这里加了个ϵ\epsilonϵ极小值
上面依旧采用Smooth ln函数来计算。

引申讨论

距离函数选择

在惩罚项中,我们分别选择了IoG和IoU来进行度量。
其原因是IoG和IoU把范围限定在了(0, 1),与此同时 SmoothL1是无界的。
如果SmoothL1用在RepGT中,它会让预测框与非目标的gt框离的越远越好,而我们的初衷只是想减少交叉部分,相比之下,IoG更符合我们的思想

另外在RepGT中使用IoG而不使用IoU的原因是,IoG的分母下,真实框大小area(G)是固定的,因此其优化目标是去减少与目标框重叠,即area(B∩G)。而在IoU下,回归器也许会尽可能让预测框更大(即分母)来最小化loss

实验部分

这里只简单介绍一下
我们在CityPerson和Caltech-USA分别训练了80k和160k个iter

根据不同平滑系数,得到的提升也不一样
我们进一步调整两个loss的权重,相对得到了更好的效果


实验效果图如下,这是未经过NMS处理的锚框图

可以看到加了RepBox后,明显少了很多夹在在两个人中间的预测框,这也减少了后续NMS处理出错的情况。

总结

旷厂的这篇算法工作做的还是很扎实的,作者先是对数据集进行分析,进而根据遮挡度,拆分出两个子集,通过直观的统计来表明行人遮挡是检测行人的一大难点。然后从预测框和NMS处理上出发,找到问题所在,进而提出RepLoss,其中两项loss分别针对两个独立的问题。简单改进模型后,加上RepLoss的效果展示还是非常不错的。

Repulsion Loss解决行人遮挡问题相关推荐

  1. 解决目标检测中密集遮挡问题——Repulsion loss

    解决目标检测中密集遮挡问题--Repulsion loss Rep loss Attr RepGT RepBox 之前参加了df的钢筋检测比赛,比赛中的一个难点是密集遮挡问题,为了解决这个问题,参考了 ...

  2. Repulsion Loss: Detecting Pedestrians in a Crowd 详解(遮挡下的行人检测)

    最近做行人检测Re-ID的工作,读了Repulsion Loss: Detecting Pedestrians in a Crowd,所以刚好记录一下对论文的阅读和个人理解.文章中部分内容为引用别人的 ...

  3. ECCV 2018 | Bi-box行人检测:‘行人遮挡’为几何?

    极市平台是专业视觉算法平台,主要为开发者提供真实项目需求,视觉算法开发等服务,点击填表加入极市专业CV交流群,与6000+来自腾讯,华为,百度,北大,清华,中科院等名企名校视觉开发者互动交流!更有机会 ...

  4. 解决输入法遮挡--ios手机

    // 解决输入法遮挡----一般是 ios上 var timer = null; $('.input').on('focus', function() { clearInterval(timer); ...

  5. 论文笔记之Repulsion Loss: Detecting Pedestrians in a Crowd

    一.摘要 本文首先通过实验探索人群遮挡对检测器性能的伤害,然后提出了一种专门针对人群场景的边界框回归损失,称为排斥力. 这种损失是由两部分组成:目标的吸引力和周围其他物体的排斥.***(就像磁铁的同性 ...

  6. native固定吸顶 react_React Native固定底部TextInput,解决键盘遮挡、列表滚动问题

    效果图 timer.gif 做类似于微信聊天输入框,可能会遇到下面三个小困扰,记录一下. 目录 # 1.React Native固定底部TextInput # 2.键盘遮挡问题 # 3.列表滚动问题 ...

  7. android 记一次解决键盘遮挡问题

    文章链接:https://mp.weixin.qq.com/s/1gkMtLu0BTXOUOj6isDjUw 日常android开发过程中,会遇到编辑框输入内容弹出软键盘,往往会出现键盘遮挡内容,或者 ...

  8. flutter - 使用 SingleChildScrollView() 解决键盘遮挡输入框的问题

    写好了,感觉可好 点击输入框,输入内容时发现如下,键盘遮挡了输入框 使用 SingleChildScrollView 解决遮挡问题, 就是让它滚动起来 直接使用 SingleChildScrollVi ...

  9. iOS 解决键盘遮挡输入框问题,输入框随键盘弹起上移,切换输入法时动态调整 (Swift)

    最近在项目中需要解决苹果系统输入法遮挡输入框的问题,预期结果为: 若键盘弹出后会遮挡输入框,则输入框随键盘弹起上移,输入法切换时输入框始终保持在距键盘上方 4pt 处; 若键盘弹出后不会遮挡输入框,但 ...

最新文章

  1. transform.Normalize()用法后面参数为什么用(0.5,0.5,0.5)(0.5,0.5,0.5)
  2. 掌握好这些不变的底层知识,任他东西南北风!
  3. 互联网运营期产品评审杂思,互联网营销
  4. 关于 equals 和 hashCode,看这一篇真的够了!
  5. CoreAnimation编程指南(十)KVC
  6. Linux ftp 命令
  7. java界面化二叉排序树_105-线索化二叉树代码实现2
  8. 直接选择排序与冒泡排序
  9. MySQL远程访问权限,允许远程连接的开启
  10. 格式化Curl返回的Json字符
  11. VS Code\unins000.exe创建报错解决方法
  12. java对接支付宝三方登录
  13. 七代处理器装win7_为什么7代cpu装不了win7
  14. java web 站内信 设计
  15. Ubuntu KVM安装过程
  16. 可转债网格交易策略回测
  17. dropdownList获取值
  18. c语言二级指针的作用,为什么要使用二级指针?
  19. Python实现自动控制登录网页
  20. SpringBoot(SpringMVC)拦截Druid数据监控页面

热门文章

  1. php许愿墙模板,PHP+jQuery+Ajax漂亮的许愿墙效果
  2. Python爬虫实现电影资源下载方法
  3. 前端开发【短信分享】——H5调起短信,发送指定内容到指定号码
  4. Qt平台编写的五子棋单机版
  5. 怎样实现ZBrush中Magnify膨胀笔刷的应用
  6. Redis入门与应用
  7. 7805和78l05可以代换吗_78L05和7805有什么区别
  8. 贾跃亭微博发新车 外观奇特酷似科幻
  9. 初始化 Microsoft Visual SourceSafe 源代码管理提供程序时失败问题处理
  10. C/C++#include简单介绍