作者:sdfsadfwforever | 来源:互联网 | 2023-10-13 11:42
参考:吴恩达卷积神经网络anchorbox是目标检测中十分重要的概念,虽然最近很多论文都提出anchorfree,但是深入理解anchorbox对我们理解目前主流的fasterrc
参考:吴恩达 卷积神经网络
anchor box 是目标检测中十分重要的概念,虽然最近很多论文都提出anchor free,但是深入理解anchor box对我们理解目前主流的faster rcnn,ssd,yolov2v3等算法很有帮助。
传统方法:
1.滑动窗口:顾名思义,采用一个固定大小的窗口在图上不断滑动截取固定大小的图片,从左到右,从上到下,遍历整个图片。依次判断截取下的框包不包含目标。然后改变框的尺寸继续搜索,类似一种暴力穷举的方法,的确可行,但是但图片尺寸较大的时候,该方法特别浪费时间。(滑动操作可用卷积来实现)
2.Regional Proposal(RPN):建议框,即在滑动窗口的思想上,提取出所有可能包含识別目标的一些候迭区域,相比于传统的候选区域而言,Regional Proposal数量上会更少(通常1K~2K个) ,质量更高。
为什么需要anchor box?
如上图,基于滑动窗口的方法,还有yolov1里的方法,每个网格的框只能预测一个类别,不能进行多类预测。提出anchor box可以很好的解决这个问题。
如图,车和人的中心点正好重合在一点,如果仍然采用原来的输出y,那么将无法结果。必须从两个中选一个。
采用anchor box的思路是,预先定义两个(一般为很多个)不同形状的anchor box,我们需要做的就是将预测结果与这两个anchor box关联起来,
也就是定义输出为右边这个向量y的形式。
对于行人而言,其形状更类似于anchor box1,所以将其分配到y的上半部分,其中行人的类别为为1,即c1=1,c2=c3=0。同理,把车分配到y的下半部分。
和之前相同的是,每个对象都根据中点位置分配到中点所在的网格里,与之间不同的是,每个对象还分配到一个和ground truth iou最高的anchor box ,也就是所,这个对象分配到一对(网格,anchor box),如下图:
如果该网格里只有人,没有车,那么此时输出y中 anchor box2分量还是不变,anchor box1置信度为0,其他的do not care,如下图:
还有一种情况,两个对象都在同一个网格中,且两个对象的anchor box 形状也一样。这是算法处理不好的另一种情况,你需要引入一些打破僵局的默认手段,专门处理这种情况,希望你的数据集里不会出现这种情况,其实出现的情况不多,所以对性能的影响应该不会很大。
建立anchor box的原因是为了处理两个对象出现在同一个格子的情况,实际中这种情况很少发生,特别是如果你用的是19×19网格而不是3×3的网格,两个对象中点处于361个格子中同一个格子的概率很低,确实会出现,但出现频率不高。
怎么选择anchor box?
人们一般手工指定anchor box形状,你可以选择5到10个anchor box形状,覆盖到多种不同的形状,可以涵盖你想要检测的对象的各种形状。还有一个更好的方法,在yolov2中使用的kmeans算法,可以将两类对象形状聚类,如果我们用它来选择一组anchor box,选择最具有代表性的一组anchor box,可以代表你试图检测的十几个对象类别,但这其实是自动选择anchor box的高级方法。如果你就人工选择一些形状,合理的考虑到所有对象的形状,你预计会检测的很高很瘦或者很宽很胖的对象,这应该也不难做。