您的位置:首页 > 其它

小目标物体检测

2018-09-06 17:21 218 查看

1.为什么小物体不好检测?

个人的理解:1.输入角度:小物体本身的像素点少,也就是所带的特征信息少  2.网络传递角度:小物体像素小,多次下采样可能就没了  3.特征提取角度:做roi-pooling时候提取的特征少,并且像16像素以下的几乎无法提取信息,因为映射之后像素点为0   4.训练角度:rpn、roi能提取到的正样本少,整个训练的正样本少了

 

王乃岩觉得:小物体本质的问题是在于feature map的分辨率

行人检测有很多讨论小物体的

分辨率:这个到底是个啥子意思!!!???原始stride8和从stride16上采样得到的stride8,两者的像素值应该是一样多的,size也一样大,那应该分辨率一样啊!!!???

王乃岩说好的特征提取比什么都重要

 

2.小物体提升的实验:

  1.把roi从stride16升到stride8,性能提升。

  王乃岩:a.缩图减小stride,和放大图不变stride差不多的。然后你说的roi pooling那个quantization error,其实也是stride小了error就低了。我们试过stride小的时候roi pooling结果比roi align还要更好的。

      b.无论是缩图减小stride, 还是放大图不变stride, 本质是差不多的。 输出stride大小,主要是影响输出能够表达的空间位置的数量。 quantization 本身有好的方面有坏的方面,好的方面是让目标离散,状态空间变少, 并引入少量不变性。 当然检测本身的评价指标(IOU0.5)就对定位要求不是太高。

      c.8这个stride已经挺小了

      d.如果是30左右的话,我会考虑rpn stride16,rcnn8  ------ 个人觉得stride为16,语义信息更加丰富,他可能考虑的是rpn生成的框质量更加高,同时fast阶段保证细节信息不丢失。

  2.浅层和高层的融合。先单独在stage3、stage4上做,会发现stage3和stage4会都有些目标检测不到,这个时候就考虑把浅层和高层做融合concat起来,然后作为左后一层的feature map。也曾经想过在不同层直接做roi-pooling然后concat起来,性能上差不多。

    但有个问题:a层的数量级可能和b层的不一样,会压制住别的层的feature map。比如a层可能在10-100,b层的值可能在0.1到1,concat之后合成一个feature map,虽然在不同通道,但某些通道的值很大,会对最终的结果影响比较大。我自己做的时候是concat起来之后用的1*1来消除这种影响,而没有用scale层。这个和pavnet很像。  

    进一步实验,借鉴hyper-net:把stride为8的feature map作为特征的最后一层,把stride为4的下采样和把stride为16的上采样与stride为8的concat起来。concat之后用了1*1的卷积生成真正的最后一层的feature map。这个做法既借鉴了实验1的stride为8的预测,又进行了浅层、高层的融合。

  3.上采样最暴力也最有效,小物体直接变成大物体。这个实验我没有去做。试想以下,如果在stride16上做上采样,像dssd那样,而不是fpn那样,猜测这种idea应该可能不仅性能上不会比fpn好,时间上肯定也消耗更多。因为从stride16到stride8,这样做语义信息是比较丰富,但细节信息肯定没有直接从stride8丰富,因为越往网络的深层走,图片越模糊,就算是feature map的size变大到stride8,但清晰度肯定赶不上。

  4.采用fpn的方式,性能优于前两种。

  5.roi-pooling换成roi-align。roi-pooling本身会带来位置偏差,物体越小,偏差越明显。由缩放步长可知,该特征图上1个像素的偏差在原图上就是16个像素的差别,这对小物体的检测效果影响很大。

  roi-pooling quantization error

  关于roi-pooling的一个思考:现在我们使用的都是7*7的bin,但是对于小物体来说,你提取7*7个bin,这些bin中好多值应该是相同,这样会不会造成特征重复?如果调小了会不会性能更加好?因为少了很多多余的参数。会不会性能更加差?因为参数计算的少了。

  进一步问题:为什么物体越小,roi-pooling的偏差越明显?

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; line-height: 19.0px; font: 14.0px "Helvetica Neue" } span.s1 { font: 13.0px "Helvetica Neue" }

   对于相等的误差值,大物体误差对检测的影响应小于小物体误差对检测的影响。这是因为,相同的位置偏差占大物体的比例远小于同等偏差占小物体的比例。YOLO将物体大小的信息项(w和h)进行求平方根来改进这个问题。

 

   roi-align的改进 iou-net:http://www.sohu.com/a/246930002_418390

 

  naiyan:在大stride上roi pooling的量化误差会更大

  6.image pyramid。传统image pyramid那样训练在多个scale训练,测试也在多个scale上测试。我们的方式是训练在多个scale上训练,测试在一个scale上测试,并且由于我们图片本身是1900*1200多的像素,一般测试的scale是比原始的图片小。对于小物体,训练的时候把image pyramid往大的方向放,性能会提升,并且就是在测试scale不变的情况下,当然测试的scale也放大也能进一步甚至更大的提升,但严重影响速度。

  7.扩大roi,增加context信息,roi扩的太大效果反而不好。find tiny face 里头做过实验,context 一定范围内越大越好,过大了反而有一点下降。我做的时候是按照以中心点为中心按照每个roi的尺寸增加百分比的方式(比如扩大百分之50),而不是直接加多少像素。并且最好是根据你的数据特征来扩大,而不一定是长宽都增加,或者左侧右侧的宽度都增加。比如路锥我更愿意向下拉长一点,因为可以检测地面。这个增加context信息的方式,我觉得是比较reasonable的,比如人眼看远处的小物体,其实很多时候也是加上了周围的信息进行判断的。

  进一步问题:为什么roi扩的太大效果反而不好?

        个人觉得是引入了太多无关信息或者其他类别的信息。

  进一步的实验:既然想到了扩大roi,那就采用了defomable conv这种方式,性能上比直接扩大roi要好

  8.anchor调整,用yolo2找到适合数据集的size、ratio,这个对小物体影响较大,因为小物体的提取的roi的正样本本来就少,anchor的size大了,只会导致正样本进一步丢失甚至没有      https://arxiv.org/abs/1708.05237论文做了非常细致的anchor配置与召回的实验,可以帮助根据你的问题更合理地设计anchor

  9.对于小物体,在没改rpn训练的情况下(我不记得当时我loss改没改成focal loss,去看看,但rpn_batchsize肯定没改),在roi阶段(当时roi选择的个数是512),正负样本的总个数几乎都低于512,并且正样本的个数很少,有些只有2、3个甚至1个,最多也就100多个,但这种情况很少。我把图片放大了,发现,正样本生成的个数增多了,但增加的个数不多,并且很多图片正样本也没怎么增加,反而是负样本增加的更多。(这里有个很严重的问题,我做这些实验的时候,其实anchor的size是用的wk的,不过就算改成适合当前样本的size,估计依旧会出现正样本个数少的情况,只是可能不会这么少。)这个时候其实fast阶段的roi正负比例已经严重不平衡了,所以最初的实验是通过缩小roi个数,性能得到提升。但这里面也有一些问题,因为有些样本的roi正样本会多一些(毕竟不是所有的都是小物体,即使是小物体,32像素和16像素区别还是大),如果直接设定一个值,有些图片训练的正样本个数会减少。所以想尝试一下focal-loss。当然还可以调小正例判断的iou增加一些正样本,比如0.4,但是不能调的太小。

   同理rpn阶段也会是正例少,负例多,也可以这么调。

   TRAIN.RPNFGFRACTION=0.5->0.4 

   TRAIN.RPN_BATCHSIZE=256->32

   调成32不一定好,因为还是有样本大于32的,但数量较小,具体的值可以通过实验来调。

   总结:在rpn和roi阶段调小样本的判断iou的ratio,调小总训练的个数。

   对于小物体,focal loss既可以用在rpn阶段,也可以用在fast阶段,因为两个部分都是负样本主导,只是主导的没ssd那么厉害。

   两者结合的问题:调小了训练样本的个数和iou的ratio,其实用focal意义不大了,因为正负样本不会出现这种比例严重不平衡的问题了。个人感觉focal的效果可能比调小要好,调小有时候有些样本正负比例依旧很大,并且训练的样本减少了,同时有些样本正样本很多,调成32导致可能只有正样本,那同时你还需要设定正负比例,这个时候可能正样本个数大大减少。focal的话不仅没有这些问题,同时还做了困难样本挖掘。做实验确定这个idea是不是work!

         对于大物体,这种在fast阶段使用focal实际上作用不大,因为本来roi个数少,正负样本比例也不会太大,这个时候采用ohem会比较好。也就说,小物体focal+focal,大物体focal+ohem。

待解决问题:

小物体fast阶段用focal好不好?  

  10.https://blog.aigrant.org/ai-grant-research-small-object-detection-8e7f71408096 这篇博客提出了数据增强的方式解决小物体,把小物体cut出来并进行random rotation和translation,然后在图片中没有object的地方贴上去,能提高3%

  11.加全局的context信息,idea是如果在道路上这个东西更可能是路锥,人判断的时候其实也是会根据全局来的,就相当于加了一个场景识别。就是说在最后一层整个feature map上加roi-pooling,然后跟roi做的roi-pooling相加。但是这种方式无论是大小物体都work,并且你其实不能很好证明你这个pooling出来的就真的是全局的context,或者说就是我们想要的情景,比如马路。

 

 



 

 

 

非常好的一个博客总结:https://blog.aigrant.org/ai-grant-research-small-object-detection-8e7f71408096

优秀的知乎回答:https://www.zhihu.com/question/64861580这个问题好好看看,特别是第一个问题王乃岩的回答!!!

这个话题下的这两个trick还不太懂:

3,如果对速度要求不高,考虑切图

5,设置更合理的anchor size,避免出现“田”字,anchor没有覆盖中间的区域

 

优秀的开源社区回答:https://discuss.gluon.ai/t/topic/7250/4

优秀的知乎回答:https://www.zhihu.com/question/49722539 看王乃岩回答的,王乃岩说他们发现了影响小物体检测性能同等重要的因素(小物体本质的问题是在于feature map的分辨率),那个到底是指的什么

优秀的知乎回答:https://www.zhihu.com/question/272322209

 

 

相关论文:finding tiny face

     Combining deep features for object detection at various scales: finding small birds in landscape images,DOI: 10.1186/s41074-016-0006-z(不知道有用不)

     cascade是2001年viola&jones的人脸检测器,看看以前的cascade文章

       Seeing Small Faces From Robust Anchor's Perspective cvpr18一篇解决anchor iou的,多看人脸的文章!!! 

 

 

知乎:尼箍纳斯凯奇

1. data-augmentation。简单粗暴有效,正确的做sampling可以很大提升模型在小物体检测上的性能。这里面其实trick也蛮多的,可以参考pyramidbox里面的data-anchor-sampling。

2. fpn,dssd等特征融合方法。最简单粗暴有效的方法,但是速度上影响较大。

3. 在主干网络的low level(stride较小部分)出feature map,对应的anchor size可以设置较大。    finding tiny face好像有这么一个观察

4. 利用context信息,建立小物体与context的关系。或者上dilated类似混合感知野,或者在head部分引入SSH相似的模块。

5. 小物体检测如何把bbox做的更准,参考iou loss和cascade rcnn的思路。

6. 参考CVPR论文SNIP。

7. 在anchor层面去设计,比如anchor densitification(出自faceboxes论文),或者anchor matching strategy(出自SFD论文)。

8. 建模物体间关系,relation network等思路。

9. 上GAN啊,在检测器后面对抗一把。

10. 用soft attention去约束confidence相关的feature map,或者做一些pixel wise的attention。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: