小目标物体检测
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。
- paper 111:图像分类物体目标检测 from RCNN to YOLO
- R-FCN每秒30帧实时检测3000类物体,马里兰大学Larry Davis组最新目标检测工作
- 深度学习之目标检测——基于R-CNN的物体检测
- [转] [多尺度物体目标检测技术]调研报告
- 运动物体目标检测实现—基于OpenCV
- 目标检测(三)--DPM
- 基于深度学习的目标检测技术演进:R-CNN、Fast R-CNN、Faster R-CNN
- 大牛讲堂 | 邬书哲:物体检测算法的革新与传承
- mxnet 之 目标检测数据集制作+SSD 模型训练
- 物体检测-从RCNN到YOLO
- 分类以及目标检测发展脉络——从12到17。
- Web漏洞处理--http host头攻击漏洞处理方案/检测到目标URL存在宽字节跨站漏洞/ 检测到目标URL存在SQL注入漏洞
- 【目标检测】OpenCV中dnn模块的SSD demo运行
- 目标检测-- DeNet: Scalable Real-time Object Detection with Directed Sparse Sampling
- 关于毕设的思路整理----图像视觉显著性目标的检测
- 目标检测原理——fast-RCNN
- 目标检测的图像特征提取之LBP特征
- 深度学习目标检测
- 目标检测的图像特征提取之(二)LBP特征
- 图像物体检测识别中的LBP特征