讲讲我现在认识的anchor机制

一:出现

  目标检测中anchor的使用兴起于Faster RCNN中,这拥有anchor-based方法在目标检测时代中的里程碑一般的重要意义。但其实主要是为了解决目标检测中目标的multi-scale和multi-aspect ratio。多多少少FPN也是解决这个问题的一个方法,不过显然anchor能让网络学得更好,现在一般都是结合anchor和FPN,比如Mask RCNN,Yolo v3,SSD等之后的一系列算法。当然是在今年兴起的anchor-free方法之前的那些方法。

二:个人对anchor的理解

  其实我最开始看faster rcnn时候,前后两次读了Faster RCNN的论文,感觉都是一知半解,今天发现对anchor的理解上还是不行,就在重读一遍,所以说像这种经典,每次读你都能从中获得新的知识,这就是经典的魅力,大神作品的价值。

  最直接的anchor表现就是在backbone网络的最后一层卷积特征图上(分类层之前的)用一个3x3的滑动窗口对此特征图进行卷积操作,然后特征图上的每个像素点或者每个location上,这个准确来说应该是3x3滑动窗口的中心center位置,然后每个location设置一定的scale和aspect ratio,去“逼迫”CNN学习拟合每一种scale和aspect ratio的anchor box。在Faster RCNN中的每个scale我理解为就是当前特征图上不同大小的区域,然后映射回原图input上的对应区域,比如128x128,256x256,512x512。最开始我也误解成这就是这个anchor的box的大小,其实是不对的,anchor这种东西其实都是不存在的,只是我们认为设置的一个东西在网络里面,但是cnn也不学习这部分只是让它往这个anchor方向去学习拟合出不同的proposals,然后刚才说的128x128,256x256,512x512对应的应当是这个具体的anchor的receptive field,也就是感受野才是。在这个大的感受野下让cnn去学习propose出不同的aspect ratio的anchor box,比如说1:1,1:2,2:1等等,但是具体的heigth和weight这个就没有定死,根据论文在ZFNet上的结果,不同的scale和aspect ratio上学到的那个anchor box的height和weight都是不同的,具体就看论文吧。这里可以看到Faster RCNN中是在一个layer的feature map上用anchor,后来的yolov3,mask rcnn等借鉴FPN的思想,在不同layer上使用anchor,不过这也可以理解为加强版的anchors。到这里,我有一个猜测就是achor box的几个坐标是怎么来的,因为anchor本身是不存在的东西,具体在RPN网络中是怎么计算的regression的呢?因为不同的anchor在原图上对应着不同的感受野,然后在这个感受野下去propose不同的candidate region,那么这个region的矩形框就对应的box的坐标,其实就是学到的这个anchor的box的坐标,在和GT做loss计算从而初步地refine,更精确的refine要到后面的detection header部分的regressor上。所以才有了论文的predicted box,anchor box,ground truth box的三种说法,并且不是直接回归GT和predicted box,而是借助一个anchor box在中间当桥梁去分别回归predicted box和anchor box,ground truth box和anchor box。

三:(待看完代码在更新以上理解是否和代码对应上)

你可能感兴趣的:(Deep,Learning)