TensorFlow 2.x 算法基础
1. 简介
1.1 IoU (Intersection over Union)
- GT_Box:Ground Truth的Bounding Box
- Pre_Box:Predicted的Bounding Box
- IoU = GT_Box与Pre_Box交集的面积/GT_Box与Pre_Box并集的面积
2. 目标检测中的Anchor
- 定义:Anchor就是预先定义的方框,通常一次使用K个
- 训练过程:
- 此Anchor是不是接近Ground Truth的Bounding Box
- 修正Anchor与Ground Truth的Bounding Box的差异,通过平移+缩放
- Anchor是什么?
- 每个像素分配几个不同scale和ratio的矩形窗口就是Anchor
- 本质就是把基于像素遍历的一个过程直接分配到每个像素来做,然后CNN是可以直接做基于像素的一个Dense Map的预测
- Anchor本质
- 就是一堆变scale和ratio的滑动窗口
- 步骤:
- 第一步:为每个像素分配多个Anchor
- 第二步:根据CNN提取到的特征,判断此Anchor的分类,即是否为待找目标物体;判断方法:计算IoU(当前Anchor与给定矩形框的IoU),IoU>0.5为Positive, IoU<0.2为Negative,如下图中,绿色的矩形框为Positive的Anchor
2.1 目标检测
- 目标检测
- 目标检测是"在哪里有什么"的任务,在这个任务中,目标的类别不确定、数量不确定、位置不确定、尺度不确定
- 传统方法
- 传统非深度学习方法如VJ和DPM,和早期深度学习方法如OverFeat,都要金字塔多尺度+遍历滑窗的方式,逐尺度逐位置判断"这个尺度的这个位置处有没有认识的目标",非常笨重耗时
- 传统的解决目标检测问题的方法是使用“滑动窗口”,所有窗口都会共享一个判别器,如SVM。当不同尺度的窗口,在图像中顺次滑动时,判别器可以判断窗口内的目标是什么,有多大,最后再将所有窗口的判别结果做一些后处理,如NMS,就可以找到目标在哪里,并且得到每个目标的类别信息,如DPM。
2.2 感受野
-
感受野概念
- 感受野有理论感受野和有效感受野之分,网络确定之后理论感受野的大小是确定的,有效感受野受网路参数影响,网络训练的好,有效感受野也会相对大一些。但有效感受野远远小于理论感受野,随着网络深度的加深,有效感受野与理论感受野的比值从最大约90%可能会降到30%左右。
-
好的anchor设置需要满足如下关系:Anchor大小 < 实际感受野 < 理论感受野
-
通用的目标检测相对困难一些,不仅仅类内目标尺度有较大差别,而且类间尺度变化更加多样
-
不同类间的有效感受野差别也很大,如上图,左边一列是pool5 layer的不同类别目标的有效感受野,右边是不同类别的图片,从图中可以看出不同类别的目标的有效感受野差别较大
-
但是在通用目标检测中,所有类别的目标是共享anchor的,有效感受野参考难度更大,故关于anchor大小的设计规则可以参考:目标大小<=Anchor大小<理论感受野。因此,如果需要手动设计anchor大小时,基于这个规则,再参考ssd的anchor设计公式进行设计。
2.3 Anchor与特征表达
-
在一个feature map上,不同尺度的anchor的数量是相同的,使用的特征是统一的,造成了anchor有以下问题:
- 问题1: 小尺度的anchor与相应小目标框的IOU可能会比较小,造成小目标正样本变少
- 问题2: 不同尺度的anchor应该对应不同的特征才有利于不同尺度目标的表达
-
这两个问题从两个角度提出,一个是anchor本身的问题,一个是特征表达的问题,那就从这两个角度分别出一些解决方案
-
问题1:Anchor本身的问题
- 本质: 这里小尺度的anchor指的非常小的anchor,比如长宽个10多个像素,造成与小目标框IoU较小的原因还是anchor不够密集,与小目标目标的匹配概率比较小。
- 方法1: 围绕着每一个 anchor 的中心,将其进行扩展,可以扩展出2倍,3倍,4倍的anchor,这里仅对小尺度anchor进行扩展
- 方法2: 在ssd的设计中,不同尺度的anchor在设计时,其scale指标是线性的,可以在小尺度anchor设置更密集的变化,使其可以与小目标有更好的匹配
-
问题2:特征表达的问题
- 本质: 想要检测出不同尺度的目标,特征表达是关键,下面介绍几种不同尺度特征表达的方式
- 方法1:特征reshape
- Yolov2使用了该方式。将不同大小的feature map,通过reshape的方式统一,最后在进行特征串联,作为最终的目标检测特征
- 如:目标输出的检测特征图为 w × h × c w \times h \times c w×h×c,上一层的特征图大小为 ( 2 w ) × ( 2 h ) × c 1 (2w)\times(2h)\times c1 (2w)×(2h)×c1,通过特征reshape得到 w × h × ( 4 c 1 ) w \times h \times(4c1) w×h×(4c1),再与目标特征图串联后可以得到最终的目标检测的特征图为: w × h × ( c + 4 c 1 ) w \times h \times (c+4c1) w×h×(c+4c1)。最后不同尺度的anchor将在这个包含不同尺度特征的特征图上回归目标框。
- 方法2: dilation-conv
- TridentNet使用了感受野思想:当感受野与目标尺寸相互匹配时,相应的目标能够获得最佳性能,而dilation-conv可以改变有效感受野
- 方法3: FPN
- FPN的提出还是为了解决目标检测中物体尺度不同的问题,它利用多级的feature map去预测不同尺度大小的物体
- 其中高层特征带有高级语义信息和较大的感受野,适合检测大物体,浅层特征带有低级的细节语义信息和较小的感受野,适合检测小物体
- 与ssd不同,FPN逐步融合深层特和浅层特征,使得逐步增加浅层的特征的高级语义信息来提高特征表达能力,提升检测效果
2.4 Anchor
-
深度学习中的“滑动窗口”
- 此“滑动窗口”叫做anchor-box。anchor翻译过来就是锚,多用来固定船。用到图像中,这个anchor就用来固定“滑动窗口”了,表示box的中心,叫做锚点。当不同尺度的anchor-box被密集地固定在图像的每个像素处时,其作用就与“滑动窗口”相同了。anchor-box的提出主要是为了解决目标框定位的问题。
-
Anchor技术
- 首先预设一组不同尺度不同位置的固定参考框,覆盖几乎所有位置和尺度
- 每个参考框负责检测与其交并比大于阈值 (训练预设值,常用0.5或0.7) 的目标
- anchor技术将问题转换为"这个固定参考框中有没有认识的目标,目标框偏离参考框多远",不再需要多尺度遍历滑窗,真正实现了又好又快,如在Faster R-CNN和SSD两大主流目标检测框架及扩展算法中anchor都是重要部分。
-
Anchor工作过程
- 由于anchor是预先放置在图像的每个像素处,如上图,每个黑色方框代表图像特征提取过程中某个特征图上的特征点,蓝色的点表示预先放置在特征图上的anchor的锚点,这样就可以知道目标大约在哪儿,但是目标精确位置与大小还是未知
- 关于目标的精确位置,anchor将原来大海捞针(从整张图中找目标)的问题,转换为以anchor作为参考,寻找目标精确位置,也就是计算目标位置相对anchor锚点的偏移,这个问题就简单多了。而对于目标大小的回归,就涉及到anchor的设计了
-
Anchor Box参数
- scale:尺度(缩放,如上图展示了红绿蓝三种颜色不同尺度的anchor)
- ratio:宽高比
- 在同一个锚点,也可以有多种尺度的anchor
- 调整scale和ratio的目的是得到与目标框有最优IOU匹配的anchor,即正样本,对目标框回归起关键作用的anchor
- 根据两个参数的获得方式,可以分为人工设计的anchor,即handcrafted-anchor,和学习得到的anchor,即learned-anchor。
-
人工设计的Anchor
- 基于单个特征的Anchor:single-feature based anchor
- 基于多个特征的Anchor:multi-feature based anchor
-
学习得到的Anchor
- 基于k-means算法的anchor
- guided anchor
2.4.1 基于单个特征的Anchor
-
Anchor首次在Faster-RNN的检测框架中提出来,用于候选框提取,并且具有平移不变性,即一种Anchor可以在图像的某个位置检测到一个目标,那么该种anchor同样也可以检测图像其他位置处相同的目标
-
在文中,作者其实将anchor等同于“滑动窗口”,如下图,在一个“conv feature map”处有一个红色的“sliding window”,该窗口的中心点对应anchor的锚点,即box中心点;而且图中还展示出,k个anchor boxes的尺度是多种多样的,具体数量通过设定scale和ratio参数来获得
-
在实验Pascal Voc中,分别设置了3种scale:{128, 256, 512},和3种ratio:{1:1, 1:2, 2:1},得到9种anchor,如下图所示,黑点表示锚点,红绿蓝分别代表了anchor的不同scale,红框表示128,绿框表示256,蓝框表示512,而每个scale下都有3种不同ratio。
-
由于anchor是放置在特征图的每个像素位置处,假设“conv feature map“大小为WxH,则最终的anchor个数k=WxHx9
-
最初的anchor比较简单,作为目标框回归的参考框,没有具体说明scale和ratio两个参数如何设计。但是从作者的实验可以看出,scale的设计对不同大小目标的回归很重要,比如在使用MS COCO做目标检测时,增加了{64}这个scale,则anchor最终有4种scale,即:{64, 128, 256, 512},增加的目的作者也进行了解释“mainly motivated by handling small objects on this dataset”,也就是为了检测小目标。
2.4.2 基于多个特征的Anchor
- 在不同大小的feature map上设计一组anchor用于检测特定尺度范围的目标
- 假设有m个feature map需要用于回归目标框,每个feature map中anchor的scale系数可以由以下公式确定:
S k = S m i n + S m a x − S m i n m − 1 ( k − 1 ) , k ∈ [ 1 , m ] S_k = S_{min} + \frac{S_{max} - S_{min}}{m-1} (k-1), \quad k \in [1, m] Sk=Smin+m−1Smax−Smin(k−1),k∈[1,m]- S m i n = 0.2 , S m a x = 0.9 S_{min}=0.2, S_{max}=0.9 Smin=0.2,Smax=0.9:分别对应了最大feature map和最小feature map的scale系数
- 需要学习ssd中的anchor设计思想,针对不同尺度的目标,使用不同尺度的feature以及anchor,来得到更好的检测效果
2.4.3 基于k-means算法的anchor
- Yolo-V2使用了k-means算法来获得对数据库中目标框更好的表达的anchor。原始的k-means距离计算使用欧式距离,但是框之间的欧式距离对大框和小框的处理不公平,而IoU的值与框的大小无关,故k-means中的距离计算使用IoU,公式如下,其中centroid指的是anchor
d ( b o x , c e n t r o i d ) = 1 − I o U ( b o x , c e n t r o i d ) d(box, centroid) = 1 - IoU(box, centroid) d(box,centroid)=1−IoU(box,centroid) - K-Means算法流程:
- 随机选择k个真实框作为anchor;
- 对数据库中的每个框,计算和k个anchor之间的距离,选择距离最近(即IOU最大)的anchor,并成为该anchor的聚类列表中的一个元素;
- 对每一个anchor的聚类列表,分别计算长和宽的均值,长宽组合成为新的类中心,即新的anchor;
- 重复计算2~3步,直到anchor不变,获达到最大迭代次数,此时的类中心k个框的长和宽即为最终的anchor。
2.4.4 Guided anchor
-
作者认为anchor的设计是目标检测算法的关键,但是通过人工设计的方式获得的anchor,需要调节超参,得不到最优的目标检测效果。guided-anchor的目的是获得稀疏,且位置和大小可变的anchor。
-
具体方法如下图:anchor 的生成过程可以分解为两个步骤:
- anchor 位置预测(location)
- 形状预测(shape)
- 位置预测分支的目标是预测那些区域应该作为中心点来生成 anchor,是一个二分类问题。大概思路就是将 ground truth 框的中心一小块对应在 feature map 上的区域标为物体中心区域,在训练的时候作为正样本,其余区域按照离中心的距离标为忽略或者负样本。
- 形状预测分支的目标是给定 anchor 中心点,预测最佳的长和宽,这是一个回归问题。使用 bounded IoU Loss 作为监督,来学习 w 和 h。整个流程是end-to-end训练的,作者通过这种方式得到了高质量的anchor。
2.5 Anchor本质
- Anchor box 实际上就是用来生成一系列先验框的规则,其生成的先验框有以下三部分构成:
- CNN提取的Feature Map的点,来定位边框的位置
- Anchor box的Scale来表示边框的大小
- Anchor box的Aspect Ratio来表示边框的形状
- 在One-Stage中的目标检测,是直接在最后提取的Feature map上使用预定义的Anchor生成一系列的边框,最后再对这些边框进行回归
- 在Two-Stage中的目标检测,提取的Feature map上使用预定义的Anchor生成一系列的边框,这些边框经过RPN网络,生成一些的ROI区域。将提取到的ROI输入到后续网络中进行边框回归,这就比one stage的方法多了一步,所以精度和耗时上都有所增加
- 在使用Anchor生成边框时,要注意其定义在那种尺度上,最好将生成的边框使用归一化的坐标表示,在使用的时候,乘以原图像的尺度就行了
2.6 Anchor总结
- 从基于anchor的目标检测的文章中,可以看到anchor的设计对目标检测的效果影响很大。如果scale和ratio设置不合适,可能会导致recall不够高,或者 anchor 过多影响分类性能和速度。
- 一方面,anchor过于密集,绝大部分anchor分布在背景区域,对目标框回归的loss起的作用的不大;
- 另一方面,预先设定的anchor形状不能应对一些极端大小以及极端长宽比的目标。
- 因此,我们在面对实际中的目标检测中的anchor设计时,要从scale、ratio、anchor在特征图的分布、以及anchor对不同长宽比的目标覆盖率上来考虑。当某种尺度的目标(如小目标)召回率较低时,要考虑增加一种小尺度anchor;同样在漏检的目标中,长宽比比较统一时,也要增加一种ratio;当目标检测结果中虚警(误检)较高时,考虑anchor的数量是否太高,或者在正负样本的选择时,没有选到更好的负样本。
- 总而言之,anchor是目标框回归的参考标准,用于预测最终的目标边界框。进行anchor设计可以参考两条标准:
- 中心对齐
- 特征一致
- 首先:卷积特征作为anchor的表示特征,anchor的中心要与Feature map的中心很好的对齐。
- 其次:感受野的大小及语义范围在一个feature map上的不同区域要一致,不同区域的anchor的大小及尺寸要保持一致。
- 想得到比较好的检测效果,单独anchor的设计是不够的,需要和网络设计(感受野),特征表达(如fpn)同时考虑,其实,ssd的anchor设计很好的遵循了这两条原则。