zoukankan      html  css  js  c++  java
  • snip

    首先明确物体太小太大都不好检测(都从roi的角度来分析):   1.小物体: a.本身像素点少,如果从anchor的点在gt像素内来说,能提取出来的正样本少

                                      b.小物体会出现iou过低。具体来说,假设a是一个框,b是一个小框(gt),就算a的框和b的框重叠的部分占到了b的90%,但是如果a的框比较大,iou还是会低,正样本也就少了,并且容易错判成负样本

                                2.大物体:大物体也容易出现iou过低。同理,假设a是一个大框(gt),b是一个框,就算a的框和b的框重叠的部分占到了b的90%,但是如果b的框比较小,iou还是会低,正样本也就少了,并且容易错判成负样本

    naiyan说过过小和过大的性能都会下降,https://zhuanlan.zhihu.com/p/36431183 这个的评论里面说的

    snip从scale的角度解决小物体问题和scale invariance

    网络设计:

        整个网络有3个scale,从大到小依次是(480,800)、(800,1200)、(1400,2000),每个scale对应的像素范围为:[0,80]、[40,160]、[120,正无穷]。

        [0,80]对应(1400,2000),也就是说大约是把小物体在大像素的图片上检测,中物体在中像素的图片上检测,大物体在小像素的图片上检测。为什么说大约,因为[0,80]、[40,160]都包含了[40,80]这个范围,相当于这个范围的gt同时会在两种resolution上进行识别检测。

        原论文中是说roi不在这个范围内就不选择,一般小像素的定义是32,如果原始的定义就是小物体在大尺寸图片检测,那范围的设定应该是[0,32]、[32,96]、[96,正无穷],但如果这样去设定,就会忽略掉很多gt框,因为有些gt框的尺寸可能比32大,比如35、45这种,但这些roi却是对训练有帮助的。所以作者这种范围存在交集的方式,比较有效的解决这个问题,但也会出现一个问题,有些gt会在多个网络训练。

        如果是单纯为了达到,小的就在大的尺寸上,大的就在小的尺寸上,其实这个可以把gt的范围设置成[0,32]、[32,96]、[96,正无穷]这种无交集的,roi的范围设置成[0,80]、[40,160]、[120,正无穷]这种有交集的。但是不知道是不是这种单纯在一个尺度上训练会带来更好的效果。

        但作者设计这个交集的目的却是:We have an overlap of 40 pixels over adjacent ranges. These ranges were design decisions made during training, based on the consideration that after re-scaling, the resolution of the valid RoIs does not significantly differ from the resolution on which the backbone CNN was trained. 

        1.train阶段:1.ground_truth: ground_truth在尺寸范围内,标记为有效,超过标记为无效。

             2.roi:roi在尺寸范围内,标记为有效,超过标记为无效。

             3.anchor:anchor与invalid ground_truth的iou大于0.3的不进行反向传播。

             ground_truth、roi与anchor有些不同:ground_truth的框如果不在范围内就不会选取,也就是不会与anchor和roi进行assign;roi如果不在范围内,在proposal阶段不会选取作为训练;原论文中说不符合的anchor不进行反向传播,rpn阶段anchor也是选取一定数目并标记正负样本,那这些不符合的anchor是选进了训练里面然后不反传?还是直接不选取?

        这样设计,肯定也会带来每个scale的图片训练的时候,roi个数减少的问题

         Since in RPN even a one pixel feature map can generate a proposal we use a validity range of [0,160] at (800,1200) for valid ground truths for RPN.这个有点没理解到

        2.test(inference)阶段:

             测试阶段anchor和roi都不过滤,而是在每个scale生成框之后,如果框的尺寸不在范围内就过滤掉,最后把所有尺寸有效的框一起用nms。

      

    第二个实验:

          1.第一组对比:800和1400

          论文中说: training at higher resolutions scales up small objects for better classification, but blows up the medium-to-large objects which degrades performance.作者觉得小物体的性能在放大后应该是提升了,性能提升不明显是因为中等和大的物体的性能下降

         2.第二组对比:1400只检测80像素以下,1400检测all

          首先我会觉得会不会是过拟合,因为数量减少太多?这个不确定;再者,像论文所说的,可能就是因为scale减少,导致检测性能降低,比如测试集中有两个物体是差不多的,但是尺寸不一样;还有可能就是像naiyan说的大物体可以增加语义信息,但这个点我没想通,是指同一种label吗?还是说其他的label也可以?个人更倾向于同一种label。

          延伸问题:为什么大物体可以增加语义信息?

          3.第三组对比:mst和之前3个比

          论文中说:It ensures training instances are observed at many different resolutions, but it also degraded by extremely small and large objects.

          个人感觉这句话的比较对象应该是和1400all比较的,他说的extremely small and large确实可能会比1400all下降,我自己做image pyramid,特别小的物体,你如果用了很小的scale,确实会下降。个人感觉可能特别大的物体放大特别多也可能下降(这个没做实验)。所以他做出来性能没有原尺寸好,是不是因为他自己的image pyramid的尺寸设计的不好,这个不确定。但是他确实给了一些特别重要的点:a.用image pyramid的时候,用哪些scale其实是有讲究的,并不是越放大或者越放小就好   b.大物体可能放大之后性能下降,也就是说过大的物体可能也不好检测。一个点:image pyramid调的合适,是不是能超过snip呢?个人觉得第三个实验如果好好调参数应该是比1400all性能好的,但是不一定赶得上snip。作者其实是想用这种方式表达,image pyramid可以修改,他的snip其实就是在改image pyramid。

    本质上,snip就是在改进image pyramid,相当于还是在不同scale上训练,不同scale共享一个网络、共享参数,但是每个scale不是把所有的gt都拿来训练,而是在每种scale图片上选择相应适合的gt(尺寸适合的gt)进行训练(这个scale适合不是说大的gt用大scale的图片,而是小的gt用大的scale图片,因为小物体需要放大提升性能,大物体需要缩小提高性能),并且roi也只训练一个范围的scale,anchor也选择一定尺寸范围(只是实现的方式不同)。如果你只选一定范围的gt,不去修改roi阶段的范围,是有问题的。为什么这么说?因为每个scale的gt虽然都在一定范围内,但是roi阶段是3个scale共享的,其实提取出来的roi的size应该是一样的,如果你不这样去过滤,本质上和image pyramid没区别,其实会造成问题,正样本。同理可以推导到rpn的anchor阶段。

     待解决:

    1.既然实验2说了大小物体一起训练比单独训练小物体好,为什么要在大scale上只用小物体,不加大物体或者中型物体??

    2.anchor阶段为什么不直接用范围去过滤,而要通过这种跟invalid的方式? 

    3.延伸问题:为什么大物体可以增加语义信息?

    4.第一组实验为什么放大了对性能提升不明显?大中型物体检测性能为什么还下降?

    目前的detector没有很好解决多尺度的问题,所以每个尺度单独训练

    论文到底在讲诉什么问题?

    为什么要这样设计能解决问题?

    snip类似于图像金字塔,但不同的是他让一定scale的框单独在一个scale的detector上训练和测试,也就是说一个检测器只负责一个尺寸,跟adaboost有点像,而image pyramid是每个检测器都负责所有尺寸。原始的无论是image pyramid还是faster,都是一个检测器训练许多scale,测试的时候,其实也是一个网路检测多个scale,这也就说明,其实目前的检测器并不能很好学习scale这个变量。如果你原本是在大scale上训练的网络,但是要检测小scale的东西可能性能就不好,最有效的方式还是这个网络在训练和测试的时候都处理scale差不多大的物体。

    通过这样的一个对比实验,SNIP非常solid地证明了就算是数据相对充足的情况下,CNN仍然很难使用所有scale的物体。个人猜测由于CNN中没有对于scale invariant的结构,CNN能检测不同scale的“假象”,更多是通过CNN来通过capacity来强行memorize不同scale的物体来达到的,这其实浪费了大量的capacity,而SNIP这样只学习同样的scale可以保障有限的capacity用于学习语义信息。

    https://blog.csdn.net/qq416261970/article/details/79774909

    https://zhuanlan.zhihu.com/p/43579317

    https://zhuanlan.zhihu.com/p/35956039

    https://zhuanlan.zhihu.com/p/36431183

    https://www.imuo.com/a/b9667dec518c3355270e677207a850460ce9ba335dd76ce9dd613115f12c12ed

  • 相关阅读:
    2015年新的征程,我的博客开通啦!
    基于USB3.0、DP1.2的网络隔离数据安全传输方案
    USB OTG to PC USB API简介
    SMA2SATA、PCIe2SATA转换模块(也有叫:Sata Test Fixtures)
    SATA接口硬盘加密器
    SVN二次开发——让SVN、TSVN(TortoiseSVN)支持windows的访问控制模型、NTFS ADS(可选数据流、NTFS的安全属性)
    About USB Data Link Cable API
    蓝牙4.0BLE抓包(三) – 扫描请求和扫描响应
    nRF51822外设应用[2]:GPIOTE的应用-按键检测
    蓝牙4.0BLE抓包(二) – 广播包解析
  • 原文地址:https://www.cnblogs.com/ymjyqsx/p/9664063.html
Copyright © 2011-2022 走看看