Why:目标检测的输出个数是未知的,除了Ground-Truth(标注数据)训练,模型永远无法百分百确信自己要在一张图上预测多少物体。
目标检测中,模型往往会提出远高于实际数量的区域提议, 模型的输出边界框往往是堆叠在一起的。因此,我们需要NMS从堆叠的边框中挑出最好的那个。
When:NMS使用在回归边框之后,即所有的框已经被分类且精修了位置。且所有区域提议的预测结果已经由置信度与阈值初步筛选之后。
How:最大的置信度B_BOX为局部最大值,与其 IOU > 阈值的 Box 是它的局部比较对象要被抑制。
算法输入
算法对一幅图产生的所有的候选框,每个框有坐标与对应的打分(置信度)。
如一组5维数组:
注意:每次输入的不是一张图所有的边框,而是一张图中属于某个类的所有边框(因此极端情况下,若所有框的都被判断为背景类,则NMS不执行;反之若存在物体类边框,那么有多少类物体则分别执行多少次NMS)。
除此之外还有一个自行设置的参数:阈值 TH
算法输出
输入的一个子集,同样是一组5维数组,表示筛选后的边界框。
算法流程
Python 实现注意,这里的NMS是单类别的!多类别则只需要在外加一个for循环遍历每个种类即可
解释:
NMS存在问题
红色框和绿色框是当前的检测结果,二者的得分分别是0.95和0.80。如果按照传统的NMS进行处理,首先选中得分最高的红色框,然后绿色框就会因为与之重叠面积过大而被删掉。
另一方面,NMS的阈值也不太容易确定,设小了会出现下图的情况(绿色框因为和红色框重叠面积较大而被删掉),设置过高又容易增大误检。
Soft-NMS引入
思路:不要粗鲁地删除所有IOU大于阈值的框,而是降低其置信度。
soft NMS算法的大致思路为:M为当前得分最高框,bi 为待处理框,bi 和M的IOU越大,bi 的得分_si_ 就下降的越厉害。
NMS算法可以用下面的式子表示:
soft NMS中:
(1)线性加权:
(2)高斯加权:但是上面这个公式是不连续的,这样会导致box集合中的score出现断层,因此就有了下面这个Soft NMS式子(也是大部分实验中采用的式子):
综上,soft-nms的核心就是降低置信度。比如一张人脸上有3个重叠的bounding box, 置信度分别为0.9, 0.7, 0.85 。选择得分最高的建议框,经过第一次处理过后,得分变成了0.9, 065, 0.55(此时将得分最高的保存在D中)。这时候再选择第二个bounding box作为得分最高的,处理后置信度分别为0.65, 0.45(这时候3个框也都还在),最后选择第三个,处理后得分不改变。最终经过soft-nms抑制后的三个框的置信度分别为0.9, 0.65, 0.45。最后设置阈值,将得分si小于阈值的去掉。
FPN是一个多尺度物体检测特征提取方法,然而大尺寸的物体检测效果一直比较理想,所以FPN主要大幅提升了小像素目标检测的效果。
思想:把高层的特征传下来,补充低层的语义,这样就可以获得高分辨率、强语义的特征,有利于小目标的检测。
1、 怎么做的上采样?
C5是 resnet最顶层的输出,它会先通过一个1×1的卷积层,同时把通道数转为256,得到FPN 的最上面的一层 P5。 C5 -> P5 直接复制
这里的实现使用的是最简单的上采样,没有使用线性插值,没有使用反卷积,而是直接复制。
2、 怎么做的横向连接,横向连接的作用是什么?像素加法 add, 不是Concate
4就是上采样之后的 P5加上1×1 卷积之后的 C4,这里的横向连接实际上就是像素加法,先把 P5和C4转换到一样的尺寸,再直接进行相加。
如果不进行特征的融合(也就是说去掉所有的1x1侧连接),虽然理论上分辨率没变,语义也增强了,但是AP下降了10%左右!作者认为这些特征上下采样太多次了,导致它们不适于定位。
3、特征融合为什么不用concate简短地说:add等价于concat之后对应通道共享同一个卷积核,且add来替代concat,这样更节省参数和计算量(concat之后一般还要接卷积恢复维度)。
如果不在乎计算量且数据足够的时候,用concat也是可以的,因为这两个本身就是包含关系。实际上concat在skip connection里用的也比add更普遍,比如题主提到的U-Net[6]、DenseNet[7]。yolov3里就是concat,做concat操作的两层通道数不同
Add 也有缺点会带来信息损失。concate保留了信息。
4、为什么相加前要通过1×1的卷积层?1x1的卷积我认为有三个作用:1、使bottom-up对应层降维至256;2、缓冲作用,防止梯度直接影响bottom-up主干网络,更稳定;3、组合特征。
5、融合特征后为什么又使用了3×3卷积?另外这里 P2-P5最后又做了一次3×3的卷积,作用是消除上采样带来的混叠效应。
6、上面得到的5个融合了不同层级的特征图怎么使用?这里只使用P2-P5四个特征图,不同大小的ROI使用不同特征图ROIpooling。
7、如何确定某个 ROI 使用哪一层特征图进行 ROIpooling ?不同尺度的ROI,使用不同特征层作为ROI pooling层的输入,大尺度ROI就用后面一些的金字塔层,比如P5;小尺度ROI就用前面一点的特征层,比如P4。具体层级判断:
224是ImageNet的标准输入,k0是基准值,设置为5,代表P5层的输出(原图大小就用P5层),w和h是ROI区域的长和宽,image_area是输入图片的长乘以宽,即输入图片的面积,假设ROI是112 * 112的大小,那么k = k0-1 = 5-1 = 4,意味着该ROI应该使用P4的特征层。k值会做取整处理,防止结果不是整数。
BiFPN (也就是大名鼎鼎的 EfficientDet)
NAS-FPN
简介:
先进行区域生成(region proposal,RP)(一个有可能包含待检物体的预选框),再通过卷积神经网络进行样本分类。
任务:特征提取—>生成RP—>分类/定位回归。
常见的two stage目标检测算法有:R-CNN、SPP-Net、Fast R-CNN、Faster R-CNN和R-FCN等。
目录:
Faster RCNN则抛弃了传统的滑动窗口和Selective Search方法,直接使用RPN生成检测框。
四个主要部分:
其实RPN最终就是在原图尺度上,设置了密密麻麻的候选Anchor。然后用cnn去判断哪些Anchor是里面有目标的positive anchor,哪些是没目标的negative anchor。所以,仅仅是个二分类而已!
输入:feature maps操作:
上面一条通过softmax分类anchors获得positive和negative分类,下面一条用于计算对于anchors的bounding box regression偏移量,以获得精确的proposal。而最后的Proposal层则负责综合positive anchors和对应bounding box regression偏移量获取proposals,同时剔除太小和超出边界的proposals。其实整个网络到了Proposal Layer这里,就完成了相当于目标定位的功能。
anchors box
每次滑窗所划到的3x3的区域,就以该区域中心点为坐标,生成9个anchor
Anchor一共有多少个?原图800x600,VGG下采样16倍,feature map每个点设置9个Anchor,所以:
上文提到的k就是anchors的数量,所以2k个分数就是9个anchors的共18个分数,36个坐标。对于每个anchor, 计算anchor与ground-truth bounding boxes的IoU,大于0.7则判定为有目标,小于0.3则判定为背景,介于0.3-0.7,则设为0,不参与训练
positive和negative anchor 判定
推理时,采用 Softmax判断。
训练时:计算anchor与ground-truth bounding boxes的IoU,大于0.7则判定为有目标,小于0.3则判定为背景,介于0.3-0.7,则设为0,不参与训练。
补充:全部anchors拿去训练太多了,训练程序会在合适的anchors中随机选取128个postive anchors+128个negative anchors进行训练
RPN的Loss
分类:交叉熵损失 回归:smooth L1 损失
soomth L1 loss,计算公式如下:
** bounding box regression 原理**
Faster-RCNN论文中在RoI-Head网络中,将128个RoI区域对应的feature map进行截取,而后利用RoI pooling层输出7×7大小的feature map。
RoI Pooling层则负责收集proposal,并计算出proposal feature maps,送入后续网络。从图2中可以看到Rol pooling层有2个输入:
Why?proposals 的 box 大小形状各不相同
创新:
faster-RCNN 整体还是采用了RCNN 那种 proposal+classifier 的思想,只不过是将提取 proposal 的步骤放在 CNN 中实现了,而 YOLO 则采用直接回归的思路。
2、由于损失函数的问题,定位误差是影响检测效果的主要原因。
检测框分配:
损失函数
\begin{equation}\begin{array}{l}\lambda_{\text {coord }} \sum_{i=0}^{S^{2}} \sum_{j=0}^{B} \mathbb{1}{i j}^{\text {obj }}\left[\left(x{i}-\hat{x}{i}\right)^{2}+\left(y{i}-\hat{y}{i}\right)^{2}\right] \\qquad \begin{array}{rl}+\lambda{\text {coord }} \sum_{i=0}^{S^{2}} \sum_{j=0}^{B} & \mathbb{1}{i j}^{\text {obj }}\left[(\sqrt{w{i}}-\sqrt{\hat{w}{i}})^{2}+(\sqrt{h{i}}-\sqrt{\hat{h}{i}})^{2}\right] \& +\sum{i=0}^{S^{2}} \sum_{j=0}^{B} \mathbb{1}{i j}^{\text {obj }}\left(C{i}-\hat{C}{i}\right)^{2} \+\lambda{\text {noobj }} \sum_{i=0}^{S^{2}} \sum_{j=0}^{B} & \mathbb{1}{i j}^{\text {noobj }}\left(C{i}-\hat{C}{i}\right)^{2} \& +\sum{i=0}^{S^{2}} \mathbb{1}{i}^{\text {obj }} \sum{c \in \text { classes }}\left(p_{i}(c)-\hat{p}_{i}(c)\right)^{2}\end{array}\end{array}\end{equation}
变化
1、Batch Normalization通过对 YOLO 的每一个卷积层增加 Batch Normalization,最终使得 mAP 提高了 2%,同时还使模型正则化。使用 Batch Normalization 可以从模型中去掉 Dropout,而不会产生过拟合。
2、High resolution classifier (高分辨率预训练)
目前业界标准的检测方法,都要先把分类器(classifier)放在ImageNet上进行预训练。从 Alexnet 开始,大多数的分类器都运行在小于 256×256 的图片上。而现在 YOLO 从 224×224 增加到了 448×448,这就意味着网络需要适应新的输入分辨率。
为了适应新的分辨率,YOLO v2 的分类网络以 448×448 的分辨率先在 ImageNet上进行微调,微调 10 个 epochs,让网络有时间调整滤波器(filters),好让其能更好的运行在新分辨率上,还需要调优用于检测的 Resulting Network。最终通过使用高分辨率,mAP 提升了 4%。
3、Convolution with anchor boxes
YOLO 一代包含有全连接层,从而能直接预测 Bounding Boxes 的坐标值。 Faster R-CNN 的方法只用卷积层与 Region Proposal Network 来预测 Anchor Box 偏移值与置信度,而不是直接预测坐标值。作者发现通过预测偏移量而不是坐标值能够简化问题,让神经网络学习起来更容易。
4、Dimension clusters在训练集的 Bounding Boxes 上跑一下 k-means聚类,得到Anchor Box 的尺寸。
5、Multi-Scale Training
作者希望 YOLOv2 能健壮地运行于不同尺寸的图片之上。
区别于之前的补全图片的尺寸的方法,YOLOv2 每迭代几次都会改变网络参数。每 10 个 Batch,网络会随机地选择一个新的图片尺寸,由于使用了下采样参数是 32,所以不同的尺寸大小也选择为 32 的倍数 {320,352…..608},最小 320320,最大 608608,网络会自动改变尺寸,并继续训练的过程。
6、Datasets combination with wordtree
用 WordTree 把数据集合中的类别映射到分层树中的同义词上,例如上图 Figure 6,WordTree 混合 ImageNet 与 COCO。号称训练9000类。
变化1、多尺度预测 (类FPN),并使用了 anchor box
YOLO v3可以进行3种不同尺度的预测。检测层在分别具有步幅32,16,8的三种不同尺寸的特征图上进行检测。
2.更好的基础分类网络(类ResNet)和分类器 darknet-53
3.分类器-类别预测:
YOLOv3 不使用 Softmax 对每个框进行分类,主要考虑因素有:
聚类 anchor box
在YOLOv3中,获取数据集的全部anchor box,通过K-Means算法,将这些边界框的宽高,聚类为9类,获取9个聚类中心,面积从小到大排列,作为9个anchor box。
EarlyStopping
训练或验证集中的loss不再减小,即减小的程度小于某个阈值,则会停止训练。
作者将那些增加模型性能,只在训练阶段耗时增多,但不影响推理耗时的技巧称为 ——赠品(bag of freebies),也就是白给的提高精度的方法。而那些微微提高了推理耗时,却显著提升性能的,叫做——特价(bag of specials),就是那些不免费,但很实惠的技巧。
数据增强方法
其他:
新引入:
正则化方法
Bounding box 回归 loss 的改进
增大感受野技巧
特征融合集成
后处理非最大值抑制算法
注意力机制
激活函数
difficult to train
choose
跨批量归一化 CmBN
这里的CmBN,是对CBN的改进,收集一个batch内多个mini-batch内的统计数据。BN, CBN, CmBN的区别如下图所示:
CSPDarknet53 (backbone) + SPP+PAN(Neck,也就是特征增强模块)+ YoloV3组成
训练难度大 4 gpu 训练
Softmax函数:
其梯度:
解决难易样本数量不平衡(注意,有区别于正负样本数量不平衡)的问题思想:易分样本(即,置信度高的样本)对模型的提升效果非常小,模型应该主要关注与那些难分样本(这个假设是有问题的,是GHM的主要改进对象)
二分类版:标准CE:
进一步 为解决难以样本不均衡 把高置信度(p)样本的损失再降低一些:
综合最终的 Focal Loss:
L1 Loss
L2 Loss
Smooth L1 Loss其实是 L1 Loss 与 L2 Loss 的综合
L1 Loss 相比较于L2 Loss收敛速度慢,0点处无梯度且其他位置梯度为常数,因此在极值点附近容易产生震荡,但其对离群点的处理上要好于L2 Loss。(离群点指远离序列的一般水平的极端大值和极端小值也称为歧异值)
Faster RCNN中:soomth L1 loss,计算公式如下:
YOLO_v1中:
评价标准:
FCN提出可以把后面几个全连接都换成卷积,这样就可以获得一张2维的feature map,后接softmax获得每个像素点的分类信息,从而解决了分割问题
FCN是语义分割的开山之作,主要特色有两点:
1.全连接层换成卷积层
缺点:1、是得到的结果还是不够精细2、是对各个像素进行分类,没有充分考虑像素与像素之间的关系。
特点:能够适应很小的训练集(大约30张图),完全对称。
U-net用于解决小样本的简单问题分割,比如医疗影片的分割。它遵循的基本原理与FCN一样:
2.更丰富的信息融合:如灰色剪头,更多的前后层之间的信息融合。这里是把前面层的输出和后面层concat(串联)到一起,区别于FCN的逐元素加和。不同Feature map串联到一起后,后面接卷积层,可以让卷积核在channel上自己做出选择。注意的是,在串联之前,需要把前层的feature map crop到和后层一样的大小。
语义分割网络在特征融合时也有2种办法:
总结一下,CNN图像语义分割也就基本上是这个套路:
看,即使是更复杂的DeepLab v3+依然也是这个基本套路
介绍:
3、使用修改过的 Xception
有几种方法如PSPNet采用基于金字塔的模块或全局池化来有规律的聚合区域或全局上下文信息。然而,它们捕获了同类的上下文关系,却忽略了不同类别的上下文。
最近基于注意力的方法,如通道注意力、空间注意力,有选择地聚合不同类别之间的上下文信息。
DANet引入了双注意力机制(Dual[ˈduːəl] Attention)来获取上下文关系:通道(channel)以及空间(spatial)的 Attention 机制。