目标检测算法一般可分为anchor-based、anchor-free、两者融合类,区别就在于有没有利用anchor提取候选目标框。下面我们来具体介绍。
目标检测是"在哪里有什么"的任务,在这个任务中,目标的类别不确定、数量不确定、位置不确定、尺度不确定,传统非深度学习方法如VJ和DPM,和早期深度学习方法如OverFeat,都要金字塔多尺度+遍历滑窗的方式,逐尺度逐位置判断"这个尺度的这个位置处有没有认识的目标",非常笨重耗时。
anchor的概念最早出现在FasterRCNN的论文中,首先预设一组不同尺度不同位置的固定参考框,覆盖几乎所有位置和尺度,每个参考框负责检测与其交并比大于阈值 (训练预设值,常用0.5或0.7) 的目标,anchor技术将问题转换为"这个固定参考框中有没有认识的目标,目标框偏离参考框多远",不再需要多尺度遍历滑窗,极大的提升了速度。同时anchor的存在,也解决不同物体的中心点落到一个grid cell中的问题。
目标检测最简单、最暴力的方法就是“定步长搜索法”。
基本思想
step1 按照网格的生成规律,计算所有生成框的四个点的坐标;
step2 对每个框,判断其中是否包含”猫";
step3 将包含猫的框的坐标返回,这时候你就得到了最终的结果。
在“网格生成“过程中,每个网格都会有一个自己的中心,每个小格子都可以抽象成为在自己的中心生成了一个指定大小为16个像素的矩形框,在这里,我们把这些中心称之为 “锚点”,把每个锚点处的框称之为 “锚框”。
为了检测小猫,需要在每一个锚点生成一个小框;而为了检测大猫,可以在每个锚点的位置设置一个尺度更大的框,用来框住尺寸比较大的物体。此时,目标检测算法应该设计为:在图片中以一定的步长选取一定的锚点。以每个中心点为框的中心画多个具有固定高度和宽度的框。
注意
- 相比于上一次设计的算法,现在我们要求等距生成的内容不再是框本身,而是锚点,我们依旧要求锚点是以16为步长,但是现在我们不要求框是”一个挨着一个的“,我们只要求在每个锚点处生成固定尺寸的框。
- 框的高度和宽度,与你设定的生成框的中心的步长并不需要一致。其实最好是怎么符合物体在图片中的分布怎么来(大名鼎鼎的yolo就是这么设计的)。
- 始终注意,我们的任务是找出图中的物体,框的设计规则始终只是我们自己的一种“设计”。
抛弃Anchor之后,一个比较核心的问题是怎么描述Box,这方面CornerNet提出了一个比较有意思的思路,就是将Box转化为关键点描述,即用box左上角和右下角两个点去确定一个box,将问题转化为对top-left和bottom-right两个点的检测与匹配问题。
anchor-base的优点在于有着更高的精度,所提取到的特征更丰富。但是two stage阶段产生预选框所需要的耗时和算力大大增大,尽管one stage阶段在一定程度上解决了这个问题,将检测器整合成end-to-end的形式,通过不同特征尺度的每个特征点都进行预设不同尺度不同大小的三个anchor,缩减了RPN的步骤,提升了检测速度,尽管近几年one stage发展迅速,但精度达不到two stage的SOTA程度。
和anchor-base进行比较,anchor-free最大的优势就在于其检测器的检测速度,因为不需要预设anchor,只需要对不同尺度的特征图的目标中心点和宽高进行回归,极大的减少了耗时和需要的算力。其缺点则是在于它的精度并不能达到anchor-base方法的SOTA。近两年还提出了一些结合anchor-base和anchor-free的检测器。