【八股文】找实习自用八股文笔记(目标检测)

picture 11

1、目标检测之mAP指标的计算

1.1 计算precision和recall

网络预测出一些候选框时,即可根据预测框与ground truth框的IOU确定是否预测正确。当IOU大于某个阈值时(比如0.5),认为预测正确。

首先计算TP,TN,FN,计算方式如下:

  • True Positive(TP): 一个目标框被正确检测出来, $I O U ≥ t h r e s h o l d$
  • False Positive(FP): 预测框预测错误, $I O U < t h r e s h o l d$
  • False Negative(FN): 目标框没有被预测出来
  • True Negative(TN): 在这里不适用。

之后计算precision和recall:

  • 计算P与R时,只使用预测为当前类别的预测框与当前类别的ground truth框。

1.2 绘制PR曲线

  • 将当前类别的预测框按照置信度conference从大到小排序
  • 然后按照顺序依次只取前n个预测框,其余忽略。
  • 计算Precision与Recall
    如下表所示:
    picture 8

  • 之后以R为x轴,以P为纵轴绘制PR曲线
    如下图所示:
    picture 9

1.3 计算AP(Average Precision)与mAP(mean Average Precision)

AP就是平均精准度,对于pr曲线来说,我们使用积分来进行计算。

在实际应用中,要先对PR曲线进行平滑处理。即对PR曲线上的每个点,Precision的值取该点右侧最大的Precision的值。即:$P_{\text {smooth }}(r)=\max _{r^{\prime}>=r} P\left(r^{\prime}\right)$
picture 11

最终计算平滑后的PR曲线下面积为AP值:

而mAP值为在不同类下计算AP值后的均值:

1.4 参考

https://blog.csdn.net/u010712012/article/details/85108738
https://blog.csdn.net/chris_xy/article/details/103036756
https://zhuanlan.zhihu.com/p/88896868


2、目标检测之RCNN

2.1 算法流程

picture 2

1、输入测试图片
2、利用selective search算法从图像中提取2k左右个region proposals(备选区域)
3、将每一个region proposals缩放成227x227的大小并输入CNN网络,在最后一层全连接输出图像特征(特征提取)
4、把每个region proposal的CNN特征输入到SVM进行分类处理
5、对SVM分类好的region proposal进行边框回归处理,使得预测框和真实框更加吻合(边框回归)

--------------------------------
利用切分方法得到候选的区域集合R = {r1,r2,…,rn}
初始化相似集合S = ϕ
foreach 遍历邻居区域对(ri,rj) do
    计算相似度s(ri,rj)
    S = S  ∪ s(ri,rj)
while S not=ϕ do
    从S中得到最大的相似度s(ri,rj)=max(S)
    合并对应的区域rt = ri ∪ rj
    移除ri对应的所有相似度:S = S\s(ri,r*)
    移除rj对应的所有相似度:S = S\s(r*,rj)
    计算rt对应的相似度集合St
    S = S ∪ St
    R = R ∪ rt

其中第一步生成候选区域R所需算法:
基于图的图像分割(Graph-Based Image Segmentation)
https://blog.csdn.net/guoyunfei20/article/details/78727972

2.2.1 评价相似度

两块区域为$r_i,r_j$

1、颜色相似度
使用L1-norm归一化获取图像每个颜色通道的25 bins的直方图,这样每个区域都可以得到一个75维的向量$\{c_i^1,\dots, c_i^n \}$,区域之间颜色相似度通过下面的公式计算:

每一个颜色通道的直方图累加和为1.0,三个通道的累加和就为3.0,如果区域ci和区域cj直方图完全一样,则此时颜色相似度最大为3.0,如果不一样,由于累加取两个区域bin的最小值进行累加,当直方图差距越大,累加的和就会越小,即颜色相似度越小。
合并后新相似度为:

2、纹理相似度
每个颜色通道的8个不同方向计算方差σ=1的高斯微分(Gaussian Derivative),使用L1-norm归一化获取图像每个颜色通道的每个方向的10 bins的直方图,这样就可以获取到一个240(10x8x3)维的向量$T_i=\{t_i^1\dots t_i^n\}$,区域之间纹理相似度计算方式和颜色相似度计算方式类似,合并之后新区域的纹理特征计算方式和颜色特征计算相同:

3、优先合并小的区域(小的区域权重更大)
否则,容易使得合并后的区域不断吞并周围的区域。

4、区域的合适度距离
这里定义区域的合适度距离主要是为了衡量两个区域是否更加“吻合”,其指标是合并后的区域的Bounding Box(能够框住区域的最小矩形BBij)越小,其吻合度越高,即相似度越接近1。

合并

2.3 CNN结构与类别预测

Alexnet

picture 3

  • 因为R-CNN的网络结构中存在有全连接层(fc),需要输入图像的尺寸保持一致,所以必须resize成227*227。
  • 一个region proposal经过CNN网络输出4096维的特征
  • 对每一类使用SVM进行二分类,判断是否属于此类。

2.4 边框回归

虽然已经使用了selective search来最大限度地提取目标的候选框,但有些候选框与真实框依旧有很大差距,因此使用一个线性方程来实现位置的精确定位。
picture 4
如上图,黄色框口P表示建议框Region Proposal,绿色窗口G表示实际框Ground Truth,红色窗口表示Region Proposal进行回归后的预测窗口,现在的目标是找到P到$\hat{G}$的线性变换,使得与G越相近。
若 $G=\left(G_{x}, G_{y}, G_{w}, G_{h}\right)$ ,四个元素的位移为:($\Delta_{x}, \Delta_{y}, \Delta_{w}, \Delta_{h}$), RCNN希望网络预测四个变量($d_{x}(P)$, $d_{y}(P)$, $d_{w}(P)$, $d_{h}(P)$ ),来拟合四个元素的位移。最终与原坐标相加来拟合G。建立方程组:

每一个 $d_{*}(P)$ 都是AlexNet的Pool5层特征$\phi_5(P)$ 的线性函数 $d_{*}(P)=w_{*}^{T} \phi_{5}(P)$,其中 $w$ 为需要学习的参数。则损失函数为:

其中:

2.5 NMS(非极大抑制)

假设有6个矩形框,根据分类器的类别分类概率做排序,假设从小到大的概率 分别为A、B、C、D、E、F。

(1)从最大概率矩形框F开始,分别判断A~E与F的重叠度IOU是否大于某个设定的阈值;

(2)假设B、D与F的重叠度超过阈值,那么就扔掉B、D;并标记第一个矩形框F,是我们保留下来的。

(3)从剩下的矩形框A、C、E中,选择概率最大的E,然后判断E与A、C的重叠度,重叠度大于一定的阈值,那么就扔掉;并标记E是我们保留下来的第二个矩形框。

就这样一直重复,找到所有被保留下来的矩形框。

代码:

def NMS(dects,threshhold):
    """
    detcs:二维数组(n_samples,5)
    5列:x1,y1,x2,y2,score
    threshhold: IOU阈值
    """
    x1=dects[:,0]
    y1=dects[:,1]
    x2=dects[:,2]
    y2=dects[:,3]
    score=dects[:,4]
    ndects=dects.shape[0]#box的数量
    area=(x2-x1+1)*(y2-y1+1)
    order=score.argsort()[::-1] #score从大到小排列的indexs,一维数组
    keep=[] #保存符合条件的index
    suppressed=np.array([0]*ndects) #初始化为0,若大于threshhold,变为1,表示被抑制

    for _i in range(ndects):
        i=order[_i]  #从得分最高的开始遍历
        if suppressed[i]==1:
            continue
        keep.append(i) 
        for _j in range(i+1,ndects):
            j=order[_j]
            if suppressed[j]==1: #若已经被抑制,跳过
                continue
            xx1=np.max(x1[i],x1[j])#求两个box的交集面积interface
            yy1=np.max(y1[i],y1j])
            xx2=np.min(x2[i],x2[j])
            yy2=np.min(y2[i],y2[j])
            w=np.max(0,xx2-xx1+1)
            h=np.max(0,yy2-yy1+1)
            interface=w*h
            overlap=interface/(area[i]+area[j]-interface) #计算IOU(交/并)

            if overlap>=threshhold:#IOU若大于阈值,则抑制
                suppressed[j]=1
    return keep

2.6 参考

https://zhuanlan.zhihu.com/p/23006190
https://zhuanlan.zhihu.com/p/53829435
https://blog.csdn.net/qq_43243022/article/details/88895057


3、目标检测之Fast RCNN与Faster RCNN

1

3.1 Fast R-CNN

  • RCNN对每个region都进行CNN提取特征,由于region重叠部分较多,使CNN对相同区域提取多次,耗费时间。
  • 并且RCNN提取region特征之前需要resize,破坏图中内容的结构,影响效果。

所以Fast R-CNN诞生了。

3.1.1 流程

picture 3
picture 4

  • 如图,Fast R-CNN将整张图片resize送入神经网络(RCNN是对每个region进行resize),在最后一层再加入候选框信息(这些候选框还是经过Selective Search提取,再将在原图中的位置映射到最后一层特征图上),这样CNN提取特征只需对整张图做一次提取即可。

  • 使用ROI pooling layer对最后一层特征图中每个region的对应的区域进行pooling,产生固定大小的输出,再送进FC层。

  • FC层的输出两部分,使用了多任务损失函数(multi-task loss)。

3.1.2 ROI pooling layer

作用:对任意大小的输入产生固定的输出

3.1.2.1 输入

  1. 提取特征的网络的最后一个特征图层;

  2. 一个表示图片中所有ROI的N*5的矩阵,其中N表示ROI(region of interest)的数目。第一列表示图像index,其余四列表示坐标(x,y,h,w)。坐标的参考系不是针对feature map的。其中x,y表示RoI的左上角在整个图片中的坐标。

3.1.2.2 输出

输出为,与ROI同数量的vector,vector大小为channel*w*h。channel为最后一层feature map的channel数。w,h为约定好的固定大小的输出。

3.1.2.3 计算过程

  • 1、根据输入image,将ROI坐标映射到feature map对应位置
  • 将映射后的区域划分为相同大小的区域,区域数量与约定好的输出数量相同。
  • 对每个区域进行max pooling操作

具体计算过程如下动图所示(假设输出w,h为2*2):
picture1

3.1.3 损失函数

picture 5
picture 6
smooth的图像为:
picture 7

3.2 Faster R-CNN

Fast R-CNN与R-CNN一样需要预先Selective Search,该过程速度较慢。
所以Faster R-CNN将region提取的过程融入进网络里。

3.2.1 流程

picture 8

从图中可以看出,该网络结构大部分与Fast R-CNN相同,唯一不同的是最后一层卷积的输出feature map输入给了RPN网络来生成region位置,并使用生成的位置和最后一层feature map作为ROI pooling layer的输入。

3.2.2 区域生成网络 ( Region Proposal Networks )

RPN可以帮我们找出可能包含物体的那些区域

RPN使用固定大小的anchor,这些anchor将会均匀地放置在整个原始图像中。不同于原来我们要检测物体在哪里,我们现在利用anchor将问题转换为另外两部分:

  • 某个框内是否含有物体
  • 某个框是否框的准,如果框的不准我们要如何调整框

3.2.2.1 anchors

如果直接学习物体边框$(x_{min},x_{max},y_{min},y_{max})$是困难的:

  • 边框数量不定,网络很难输出变长的数据
  • 物体是不同大小有不同的宽高比,那训练一个效果很好的检测模型将会是非常复杂的
  • 会存在一些无效的预测,比如$x_{max}<x_{min}$时

所以RPN使用anchors的方法。RPN在feature map对应的原图位置上,以每个点为中心上使用9个anchors:

  • 三种面积{128,256,512}
  • 三种比例{1:1,1:2,2:1}

如下图所示:
picture 1

最终将学习每个anchor中是否有东西,以及anchor坐标的偏移(学习偏移比直接学习边框位置简单)。
anchor位置:$(x_{center},y_{center},width,height)$

学习的偏移:$(\Delta x_{center},\Delta y_{center},\Delta width,\Delta height)$

修正过程:(g为ground-truth,a为anchor)

3.2.2.2 输入与输出

我们使用第一部分返回的feature map进行输入,以全卷积的方式实现RPN。我们首先使用一个3*3*512的卷积层,然后使用两个并行的1*1的卷积内核,其中两个并行卷积层的通道数取决于每个点的Anchor数量(k个)。

如图所示:
picture 2

  • 第一部分为分类层(左侧),我们为每个Anchor输出2个预测值:背景得分以及前景得分(实际含有物体)。
  • 第二部分为回归层,输出4个预测值:为anchor的偏移值$(\Delta x_{center},\Delta y_{center},\Delta width,\Delta height)$

卷积过程如下图所示:
picture 3

  • 第一个33卷积相当于将每个3\3的滑动窗口转化为一个1维向量代表该滑动窗口内的特征。该滑动窗口的感受野包括了9个以该点位中心的anchor的面积。该卷积需要1*1 padding,即边缘部分的滑动窗口也需要计算。
  • 之后的两个1*1卷积相当于FC层,相当于将每个滑动窗口的特征向量进行计算,得到该滑动窗口内的9个anchor的输出值。
  • 两次卷积的输出的w,h不变,代表该这些滑动窗口的计算结果。

3.2.2.3 RPN网络的训练以及损失函数

监督标签

与ground-truth的IoU大于0.7的Anchor视为前景(如果没有就找一个与ground-truth的IoU最大的anchor),而与真实物体IoU小于0.3的视为背景。而IoU处于两个阈值中间的则忽略。

  • 每个ground-turth可能有多个anchor对应
  • 打上正标签的anchor,将对应的groud-truth位置作为回归学习的目标
平衡正负样本

由于图中大部分区域都是背景,所以负标签较多。则每次使用mini-batch采样训练(一般为256)。每次采样128正样本anchor,并采样同数量负样本。(若正样本不足128,则采样同数量负样本)。

损失函数
  • 对于分类损失,通过二分类交叉熵进行计算
  • 对应回归损失,只会针对那些正样本进行回归,具体来说就是对偏移进行回归$(\Delta x_{center},\Delta y_{center},\Delta width,\Delta height)$。损失函数使用Smooth L1损失

3.2.2.4 RPN的输出处理

  • 取所有输出为正的region的得分前M个region作为输出。
  • clip限定超出图像边界的前景anchor作为图像边界
    picture 4
  • 忽略掉长或者宽太小的建议框
  • 进行NMS
  • 最后重新再按得分排序,取得分前N个框

3.2.3 Faster-RCNN整体训练过程

picture 7

第一步:用ImageNet模型初始化,独立训练一个RPN网络;
第二步:仍然用ImageNet模型初始化,但是使用上一步RPN网络产生的proposal作为输入,训练一个Fast-RCNN网络,至此,两个网络每一层的参数完全不共享;
第三步:使用第二步的Fast-RCNN网络参数初始化一个新的RPN网络,但是把RPN、Fast-RCNN共享的那些卷积层的learning rate设置为0,也就是不更新,仅仅更新RPN特有的那些网络层,重新训练,此时,两个网络已经共享了所有公共的卷积层;
第四步:仍然固定共享的那些网络层,把Fast-RCNN特有的网络层也加入进来,形成一个unified network,继续训练,fine tune Fast-RCNN特有的网络层,此时,该网络已经实现我们设想的目标,即网络内部预测proposal并实现检测的功能。

3.3 参考

https://zhuanlan.zhihu.com/p/24780395
https://zhuanlan.zhihu.com/p/24916624
https://zhuanlan.zhihu.com/p/123962549
https://blog.csdn.net/w437684664/article/details/104238521
https://www.cnblogs.com/jiangnanyanyuchen/p/9433791.html


4、目标检测之YOLO系列v1v2v3

picture 3

4.1 YOLO v1

4.1.1 优点

  • 1、YOLO是一阶段的方法,速度比RCNN系列更快。
  • 2、YOLO在CNN中计算了图像中的全部特征,而RCNN在分类时系列只看到了局部特征。即YOLO使用全图作为 Context 信息,背景错误(把背景错认为物体)比较少。

4.1.2 流程

  • 1、Resize成448*448,图片分割得到7*7网格(cell)
  • 2、CNN提取特征和预测:卷积提取特征。全链接部分负责预测。
  • 3、过滤bbox(通过nms

4.1.3 输入与输出

图片缩放到448*448的大小,因为网络结构最后欧全连接层

picture 3

4.1.4 输出

YOLO将输入图像分成SxS(S=7)个格子,每个格子负责检测‘落入’该格子的物体。若某个物体的中心位置的坐标落入到某个格子,那么这个格子就负责检测出这个物体。

picture 1

4.1.4.1 bounding box

为每个格子预先设置B个bounding box(B=2)。则每个格子的输出要包含B个bounding box的信息,包括x,y,w,h,和confidence。
其中x,y代表在该格子内的相对偏移,取值[0,1]。w,h取值可以大于1。

bounding box的置信度Label计算方式为:

  • $\operatorname{Pr}(\text { Object })$代表该bounding box中是否包含物体。若包含物体,则P(object) = 1;否则P(object) = 0。
  • $I O U_{\text {pred }}^{\text {truth }}$为预测的bounding box与真实bounding box的接近程度。
  • Label中的IOU是在训练阶段通过ground truth计算的。在测试时无法计算,也无需计算。

4.1.4.2 输出结构

YOLO原来需要检测图片中的20中物体,所以要进行20类分类,输出结构如图所示:
picture 2

所以输出是一个 7*7*30 的张量

4.1.5 网络结构

YOLO检测网络包括24个卷积层和2个全连接层,如下图所示。
picture 7

4.1.6 损失函数

picture 8

最上部分为坐标误差,中间部分为IOU误差,最后部分为分类误差

其中w与h需要先开根号再使用均方误差,原因如下:
对不同大小的bbox预测中,相比于大bbox预测偏一点,小box预测偏一点更不能忍受。在下图中small bbox的横轴值较小,发生偏移时,反应到y轴上的loss(下图绿色)比big box(下图红色)要大。
picture 9


4.2 YOLO v2

4.2.1 网络结构

picture 12

4.2.2 一系列改进

4.2.2.1 引入BN

在每一个卷积层后添加batch normalization,极大的改善了收敛速度同时减少了对其它regularization方法的依赖(舍弃了dropout依然没有过拟合),使得mAP获得了2%的提升。

4.2.2.2 高分辨率预训练

YOLOv1在训练时先使用224x224的图片输入来预训练自己的特征提取网络,再使用448x448的数据集进行finetune。这说明网络需要重新学习识别大尺度(448)的图片以及学习进行其上的目标检测工作。

YOLOv2首先修改预训练分类网络的分辨率为448*448,在ImageNet数据集上训练10轮(10 epochs)。这个过程让网络有足够的时间调整filter去适应高分辨率的输入。然后fine tune为检测网络。mAP获得了4%的提升。

4.2.2.3 使用anchor box

YOLO(v1)使用全连接层数据进行bounding box预测(要把14701的全链接层reshape为77*30的最终特征),这会丢失较多的空间信息定位不准。

  • 移除全连接层
  • 去掉最后的池化层确保输出的卷积特征图有更高的分辨率。
  • 缩减网络,让图片输入分辨率为416 * 416,目的是让后面产生的卷积特征图宽高都为奇数
  • 使用卷积层降采样(factor 为32),最终得到13 * 13的卷积特征图(416/32=13)。
  • 把预测类别的机制从空间位置(cell)中解耦,由9个anchor box同时预测类别和坐标。

picture 10

共会预测13 * 13 * 9 = 1521个boxes,而之前的网络仅仅预测7 * 7 * 2 = 98个boxes。

4.2.2.4 Kmeans寻找预设anchors形状

选择了更好的、更有代表性的先验boxes维度,那么网络就应该更容易学到准确的预测位置。
使用K-means聚类方法,通过对数据集中的ground truth box做聚类,找到ground truth box的统计规律。
若使用欧式距离,则大boxes比小boxes产生更多error。使用以下距离:

最终选择k=5。

4.2.2.5 预测相对位置

由于借鉴了Faster-RCNN的anchor,但使用Faster-RCNN的位置回归计算方式不容易收敛,因为

这个公式没有任何限制,无论在什么位置进行预测,任何anchor boxes可以在图像中任意一点。
所以要预测相对位置,网络在特征图(13 *13 )的每个cell上预测5个bounding boxes,每一个bounding box预测5个坐标值:tx,ty,tw,th,to。如果这个cell距离图像左上角的边距为(cx,cy)以及该cell对应的box的长和宽分别为(pw,ph),那么对应的box为:

picture 11

4.2.2.6 细粒度特征

在不同层次的特征图上产生区域建议以获得多尺度的适应性。
YOLO v2使用passthrough layer,将倒数第二层特征图(26*26)叠加相邻特征到不同通道,把26 * 26 * 512的特征图叠加成13 * 13 * 2048的特征图,与原生的深层特征图相连接。

picture 2

4.2.2.7 多尺度训练

由于网络取消了全连接层,所以可以使用多种分辨率的输入图片进行训练。

4.2.3 损失函数

picture 3

  • 第一行计算的是当前anchor box内无物体时,希望预测结果为0。(也就是背景置信度误差)
  • 第二行为预测结果与预设anchor box形状的误差,让网络从启动后快速学到anchor的形状的过程,只在前12800次迭代正起作用。
  • 第三行为坐标损失预测结果与ground truth的误差
  • 第四行为置信度损失,也就是每个anchor box的conferen的损失
  • 第五行为分类损失,均方误差与YOLO v1一样。
  • 其中第2行需要变为$(2-w_i*h_i)*(prior_k^r-b_{ijk}^r)$,第三行同理。原因与YOLO v1相同,大目标对wh约束不强,小目标更严格。而YOLO v1中的开根号方式作者认为没用。所以改用这样的形式。

4.3 YOLO v3

4.3.1 网络结构

picture 13

picture 1

此结构主要由75个卷基层构成,没有池化层和全连接层,张量的尺寸变换是通过改变卷积核的步长来实现的。
yolo_v2中对于前向过程中张量尺寸变换,都是通过 最大池化来进行,一共有5次。而v3是通过卷积核 增大步长来进行,也是5次。

网络预测部分类似FPN结构:
picture 4

4.3.2 输出

每个输出都为255维向量,规模分别为13,26,52为在不同尺度上进行预测的结果。输出使用3个bounding box,COCO数据集共80类,每个box有(x,y,w,h,conference)信息,所以(80+5)*3=255。

与YOLOv2一样,YOLOv3也是在feature map上对每个位置进行bbox预测。预测相对当前grid的相对值,分别是(tx,ty,tw,th)。最终的预测bbox为:bx,by,bw,bh,这是在image的bbox。(唯一不同是YOLOv2用5个box)

4.3.3 替换softmax层:对应多重label分类

Softmax层被替换为一个1x1的卷积层+logistic激活函数的结构。使用softmax层的时候其实已经假设每个输出仅对应某一个单个的class,但是在某些class存在重叠情中,使用softmax就不能使网络对数据进行很好的拟合。

4.3.4 损失函数

picture 5

  • 上面两行为bounding box预测误差,与YOLO v2相同。
  • 第三行第四行为bounding box 的conference的二元交叉熵误差,第三行为有物体情况,第四行为无物体情况。由于图片中大部分区域无物体,所以无物体情况乘衰减系数$\lambda_{noobj}$,比如0.5
  • 第五行为分类误差,使用二元交叉熵。

4.4 参考

https://zhuanlan.zhihu.com/p/46691043
https://zhuanlan.zhihu.com/p/24916786
https://zhuanlan.zhihu.com/p/25236464/
https://blog.csdn.net/c20081052/article/details/80236015
https://zhuanlan.zhihu.com/p/25167153
https://blog.csdn.net/leviopku/article/details/82660381
https://zhuanlan.zhihu.com/p/40332004
https://blog.csdn.net/just_sort/article/details/103232484
https://zhuanlan.zhihu.com/p/142408168