AI学习笔记之物体检测(上)
- 物体检测简介
- 常见检测网络
- IOU
- TP、TN、FP、FN
- precision(精确度)和recall(召回率)
- 边框回归
- 边框回归具体方法
- Selective Search
- Faster R-CNN
- Conv layers
- Conv layers
- 区域生成网络Region Proposal Networks(RPN)
- anchors
- softmax判定positive与negtive
- 对proposal进行bounding box regression
- Proposal Layer
- Proposal layer处理过程
- RoI pooling
- 为何需要RoI Pooling
- RoI Pooling原理
- Classification
- 全连接层InnerProduct layers
- One stage和Two stage
- Two Stage
- One Stage
- YOLO(You Only Look Once)
- YOLOV1
- 关于标定框
- 置信度与准确度
- 类别置信度
- YOLOV2
- YOLOV3
- YOLOV3行人检测
- SSD
物体检测简介

- 物体识别时要分辨出图片有什么物体,输入是图片,输出是类别标签和概率。物体检测算法不仅要检测图片中有什么物体,还要输出物体的外框
来定位物体的位置;
- object detection,就是在给定的图片中精确找到物体所在位置,并标注出物体的类别,其需要解决的问题是物体在哪里以及是什么;
- 然而,这个问题并不容易解决,物体尺寸变化范围很大,摆放物体的角度,姿态不定,而且可以出现在图片的任何地方,更何况物体还可以是多个类别。
常见检测网络
目前学术和工业界出现的目标检测算法分成3类:
1、传统的目标检测算法:Casscade+HOG/DPM+Haar/SVM以及上述方法的诸多改进、优化;
2、候选区域/框+深度学习分类:通过提取候选区域,并对相应区域进行以深度学习方法为主的分类方案,如:
- R-CNN(Slective Serrch + CNN + SVM)
- SPP-net(ROI Pooling)
- Fast R-CNN(Selective Search + CNN + ROI)
- Faster R-CNN(RPN + CNN + ROI)
3、基于深度学习的回归方法:YOLO/SSD/DenseBox等方法;以及最近出现的结合RNN算法的RRC detection;结合DPM的Deformable CNN等。
IOU
**Intersection over Union(IOU)**是一种测量在特定数据集中检测相应五一准确度的一个标准。
IOU是一个简单的测量标准,只要是在输出中得到一个预测范围(bounding boxex)的任务都可以用IOU来进行测量;
为了可以使IOU用于测量任意带下形状的物体检测,我们需要:
1、ground-truth bounding boxex(认为在训练集图像中标出要检测物体的大概范围);
2、算法得出的结果范围;

TP、TN、FP、FN
TP、TN、FP、FN一共出现了4个字母,分别为T(ture),F(false),P(positive),N(negtive)。T、F代表该样本是否被正确分类;P、N代表的是该样本原本是正样本还是负样本;
字母 | 含义 |
TP(True Positives) | 被分为了正样本,而且分对了 |
TN(True Negatives) | 被分为了负样本,而且分对了 |
FP(False Positives) | 被分为了正样本,但是分错了(事实上为负样本) |
FN(False Negatives) | 被分为了正样本,而且分错了(事实上为正样本) |
在mAP计算的过程中主要用到了,TP、FP、FN这三个概念。
precision(精确度)和recall(召回率)
TP是分类器认为是正样本而且确实是正样本的例子,FP是分类器认为是正样本但实际不是正样本的例子,Precision即为分类器认为是正类而且确实是正类的部分所占所有分类器认为是正类的比例。
TP是分类器认为是正样本而且确实是正样本的例子,FN是分类器认为是负样本但实际不是负样本的例子,Recall即为分类器认为是正类而且确实是正类的部分所占确实是正类的比例。精度就是找得对,召回率就是找得全。

- 蓝色的框是真实框。绿色和红色的框是预测框,绿色的框是正样本,红色的框是负样本。
- 一般来讲,当预测框和真实框IOU>=0.5时,被认为是正样本。
边框回归

- 对于窗口一般使用四维向量
来表示,分贝表示窗口的中心点坐标和宽高;
- 红色的框P代表原始的Proposal
- 绿色的框代表目标的Ground Truth
边框回归是指寻找一种关系使得输入原始的窗口经过映射得到一个跟真实窗口
更接近的回归窗口
;
所以边框回归的目的即是:
给定寻找一种映射
使得:
并且
边框回归具体方法
其主要思路为平移+尺度缩放,R-CNN论文中描述如下:
1、先做平移
2、然后再做尺度缩放
Input
(注:训练阶段输入还包括Ground Truth)
Output
需要进行的平移变换和尺度缩放,或者说是
。有了这四个变换就可以直接得到Ground Truth。
Selective Search
Selective Search通过颜色、纹理、大小等特征的相似度把图像分成许多个不同的区域,目标检测算法可以从这些去榆中检测对象,加快检测速度。

第一步:使用Efficient graph-based image segmentation算法(基于图的图像分割)生成初始区域集R,同样设置区域相似S为空集;
第二步:对于相邻的区域,计算他们的相似度
,并添加到相似集S中;
第三步:获取S中相似度最高的两个区域;
第四步:合并区域和
成
;
第五步:删除与和
有关的相似度;
第六步:计算新区域与相邻区域的相似度
,并添加
添加到S中,
添加到区域集R中;
第七步:如果S不为空,返回第三步。
总的说,Selective Search算法不断合并相似度区域。
Faster R-CNN
Faster RCNN可以分为4个主要内容:
1、Conv layers:作为一种CNN网络目标检测方法,Faster RCNN首先使用一组基础的conv+relu+pooling层提取image的feature maps。该feature maps被共享用于后继RPN层和全连接层;
2、Region Proposal Networks:RPN网络用于生成region proposals。通过softmax判断anchors属于positive或者negative,再利用bounding box regression修正anchors获得精确地proposals;
3、Roi Pooling:该层收集输入的feature maps和proposals,综合这些信息后提取proposal feature maps,送入后续全连接层判断目标类别;
4、Classification:利用proposal feature maps计算proposal的类别,同时再次bounding box regression获得检测框最终的精确位置。

Conv layers
Conv layers
Conv layers包含了conv,pooling,relu三种层。公有13个conv层,13个relu层,4个pooling层。
在Conv layer层中
1、所有的conv层都是:kerner_size=3,pad=1,stride=1;
2、所有的pooling层都是:kerner_size=2,pad=1,stride=2
在Faster RCNN Conv layers中对所有的卷积都做了pad处理(pad=1,即填充一圈0),导致原图变为大小,再做
卷积后输出
。正是这种设置,导致Conv layers中的conv层不改变输入和输出矩阵大小。

类似的是,Conv layers中的pooling层kernel_size=2,stride=2。这样每个经过pooling层的矩阵,都会变成
大小。
综上所述,在整个Conv layers中,conv和relu层不改变输入输出大小,只有pooling层使输出长宽变为输入的。
那么,一个大小的矩阵经过Conv layers固定变为
。这样Conv layers生成的feature map都可以和原图对应起来。
区域生成网络Region Proposal Networks(RPN)
经典的检测方法生成检测框都非常耗时。直接使用RPN生成检测框,是Faster RCNN的巨大优势,能极大特征检测框的生成速度。

- 可以看到RPN网络实际分为两条线:
1、上面一条他通过softmax分类anchors获得positive和negtive分类;
2、下面一条用于计算对于anchors的bounding box regression偏移量,已获得精确的proposal。 - 而最后的Proposal层则负责综合positive anchors和对应bounding box regression偏移量获取proposals,同事剔除太小和超出边界的proposals。
- 其实整个网络到了Proposal Layer这里,就完成了相当于目标定位的功能。
anchors
RPN网络在卷积后,对每个像素点,上采样映射到原始图像一个区域,找到这个区域的中心位置,然后基于这个中心位置按规则选取9中anchor box。
9个矩形公有3中面积:128,256,512;3种形状:长宽比大约为1:1,1:2,2:1(可调)。每行的4个值表示矩形左上和右下角点坐标。

遍历Conv layers获得的feature maps,为每一个点都配备这9汇总anchors作为初始的检测框。
这些anchor box都是对应于原图的尺寸,可以直接使用标记的候选框和分类结果进行训练,其中:
1、把每个标定的ground-truth box与其重叠最大的anchor box记为正样本。(保证每个ground-truth box至少对应一个正样本anchor)
2、剩余的anchor box与某个ground-truth box重叠大于0.7的记为正样本。(每个ground-truth box可能会对应多个正样本anchor。但每个正样本anchor只可能对应一个grand-truth box)
3、与任意一个标记ground-truth box重叠小于0.3的anchor box记为负样本,其余的舍弃。
这样做获得的检测框很不准确,通过后面的2次bounding box regression可以修正检测框位置。
softmax判定positive与negtive
其实RPN最终就是在原图尺度上,设置了密密麻麻的候选anchor。然后从cnn去判断那些anchor是里面有目标的positive anchor,哪些是没目标的negtive anchor。所以,仅仅是个二分类而已。

可以看到其num_output=18,也就是经过该卷积的输出图像为大小。
这也就刚好对应了feature maps每一个点都有9个anchors,同时每个anchors又有可能是positive和negative,所有这些信息都保存在大小的矩阵。
这样做的原因是后面接softmax分类获得positive anchors,也就相当于初步提取了检测目标候选区域box(一般认为目标在positive anchors中)。
由此可知,在softmax前后都接一个reshape layer其实只是为了便于softmax分类。
前面的positive/negtive anchors的矩阵,其在caffe中的存储形式为。而在softmax分类时需要进行positive/negtive二分类,所以reshape layer会将其变为
大小,即单独“腾空”出来一个维度以便softmax分类,之后再reshape恢复原状。
对proposal进行bounding box regression

可以看到起num_output=36,即经过该卷积输出图像为。这里相当于feature maps每个点都有9个anchors,每个anchors又都有4个用于回归的变换量:
Proposal Layer
Proposal Layer负责综合所有变换量和positive anchors,计算出精准的proposal,送入后学RoI Pooling Layer。
Proposal Layer有4个输入:
1、positive vs negative anchors分类器结果rpn_cls_prob_reshape;
2、对应的bbox reg的变换量rpn_bbox_pred,
3、im_info:对于一幅任意大小图像,传入Faster RCNN前首先reshape到固定
则保存了此次缩放的所有信息。
4、参数teat_stride=16
输入图像经过Conv Layers,经过4次pooling变为大小,其中feature_stride=16则保存了该信息,用于计算anchor偏移量。
Proposal layer处理过程
1、利用变换量对所有的anchors做bbox regression回归;
2、按照输入的positive softmax scores由大到小排序anchors,提取前pre_nums_topN(e.g. 6000)个anchors,即提取修正位置后的postive anchors;
3、限定超出图像边界的positive anchors为图像边界,防止后续roi pooling时proposak超出图像边界;
4、提出尺寸非常小的positive anchors;
5、对剩余的positive anchors进行NMS(non-maximum suppression)。
6、输出proposal
注意,由于在第三步中将anchors映射回原图判断是否超出边界,所以这里输出的proposal是对应输入图像尺寸的,这点在后续网络中有用。严格意义的检测应该到此就结束了,后续部分应该属于识别了。
RPN网络结构总结起来即为:
生成anchorssoftmax分类器提取positive anchors
bbox reg回归positive anchors
Proposal Layer生成proposals
RoI pooling
RoI Pooling层负责收集proposal,并计算proposal feature maps,送入后续网络。
RoI Pooling层有两个输入:
1、原始的feature maps
2、RPN输出的proposal boxes(大小各不相同)
为何需要RoI Pooling
对于传统的CNN(如AlexNet和VGG),当网络训练好后输入的图像尺寸必须是固定值,同时网络输出也是固定大小的vector or matrix。如果输入图像大小不定,这个问题就变得比较麻烦。其解决方法如下:
1、从图像中crop一部分传入网络(破坏了图像的完整结构)
2、warp称需要的大小传入网络(破坏了图像原始形状信息)

RoI Pooling原理
新参数pooled_w、pooled_h和spatial_scale(1/16)
RoI Pooling layer farward过程:
1、由于proposal是对应尺度的,所以首先使用spatial_scale参数将其映射回
大小的feature map尺度;
2、再讲每个proposal对应的feature map区域水平分为pooled_wpooled_h的网络;
3、对网络的每一份都进行max pooling处理
这样处理后,即使大小不同的proposal输出结果都是pooled_wpooled_h固定大小,实现了固定长度输出。

Classification
Classification部分利用已经获得的proposal feature maps,通过full connect层与softmax计算每个proposal具体属于哪个类别(如人,车,电视等),输出cls_prob概率向量;
同时再次利用bounding box regression获得每个proposal的位置偏移量bbox_pred,用于回归更加精确的目标检测框。

从RoI Pooling获取到pooled_w*pooled_h大小的proposal feature maps后,送入后续网络,做了如下两件事:
1、通过全连接和softamx对proposal进行分类,这实际上已经是识别的范畴了
2、再次对proposal进行bounding box regression,获得更高精度的预测框
全连接层InnerProduct layers
输入X和输出Y是固定大小。所以,这也就印证了之前RoI Pooling的必要性。

One stage和Two stage
Two Stage
Two stage算法会使用一个网络生成proposal,如selective search和RPN网络,前者是基于一些人造特征来的,RPN是一个需要训练的网络,RPN出现后,ss方法基本就被放弃。RPN网络接在图像特征提取网络backbone后(和之后的fast-RCNN网络架构公用特征提取层),会设置RPN loss(bbox regression loss + classification loss)对RPN网络进行训练,RPN生成的proposal再送到后面的网络中进行更精细的bbox regression和classification。
Two stage算法主要是RCNN系列,包括RCNN,fast-RCNN,Faster-RCNN。之后的Mask-RCNN融合了Faster-RCNN框架、Resnet和FPN(Feature Pyramid Networks) backbone,以及FCN里的segmentation方法,在完成了segmention的同时也提高了detection的AP。
One Stage
One stage追求速度舍弃了two stage架构,即不再设置网络单独生成proposal,而是直接在feature map上进行密集抽样,产生大量的先验框,如YOLO的网络方法和SSD沿用Faster-RCNN的anchor方法。这些西安兖矿没有经过两步处理,且框的尺寸往往是认为设定,精度肯定会比较低。而且Retina-Net论文中提到,one stage产生的先验框正负样本比例严重失衡(背景样本占多数),会引起训练上的问题。
One Stage算法最早是YOLO(后面又更新了YOLO2,YOLO3),该算法速度极快。之后出现了SSD。还有解决了one stage算法里正负样本极不均衡问题的Retina-Net。
YOLO(You Only Look Once)
YOLOV1

YOLO算法采用了一个单独的CNN模型实现end-to-end的目标检测:
1、Resize成,图像分割得到
网格(cell)
2、CNN提取特征和预测:卷积部分负责提取特征,全连接部分负责预测;
3、过滤bbox(通过nms)

- YOLO算法整体来说就是把输入的图片分为
格子,这里是
个格子。
- 当被检测的目标的中心点落入这个格子时,这个格子负责检测这个目标,如图中的人。
- 把图片输入到网络中,最后输出的尺寸也是
(n是通道数),这个输出的
与原输入图片
相对应(都是
)。
- 假如我们网络一共能检测20个类别的目标,那么输出的通道数
。这里的2指的是每个格子有两个标定框(论文指出的),4代表标定框的坐标信息,1代表标定框的置信度,20是检测目标的类别数。
- 所以网络最后输出结果的尺寸是
。
关于标定框
- 网络的输出是
的一个tensor(S-尺寸,B-标定框个数,C-检测类别数,5-标定框的信息)。
- 其中5分为4+1。4代表标定框的位置信息,框的中心点(x,y),框的高宽h,w;1表示每个标定框的置信度以及标定框的准确度信息。
一般情况下,YOLO不会预测边界框中心的确切坐标,而预测与预测目标的网格单元左上角相关的偏移;使用特征图单元的维度进行归一化的偏移。
例如:
以上图为例,如果中心的预测是,则中心在
特征图上的坐标是
(红色单元的左上角坐标是
。
但是,如果预测到的x,y坐标大于1,比如。那么预测的中心坐标是
。注意该中心在红色单元右侧的单元中。这打破了YOLO背后的理论,因为如果我们假设红色框负责检测目标狗,那么狗的中心必须在红色单元中,不应该在它旁边的网格单元中。因此,为了解决这个问题,对输出执行sigmod函数,将输出压缩到区间
,有效确保中心处于执行预测的网格单元中。
置信度与准确度
左边代表包含这个标定框的格子里是否有目标,有为1无为0。
右边的部分是把两个标定框(一个是Ground truth一个是预测的标定框)进行一个IOU操作,即两个标定框的交集比并集,数值越大,越准确。
类别置信度
由此可计算出各个标定框的类别置信度(class-specific confidence scores/class scores)来表示该标定框中目标属于各个类别的可能性大小以及标定框匹配目标的好坏。
每个网络预测的class信息和bounding box预测的confidence信息相乘,就得到每个bounding box的class-specific confidence score。

- 其进行了二十多次卷积还有四次最大池化。其中
卷积用于压缩特征,最后将图像压缩到
的大小,相当于将整个图像划分为
的网络,每个网络负责自己这一块区域的目标检测。
- 整个网络最后利用全连接层使其结果的size为
,其中
代表的是
的网格,30的前20个代表的是预测的种类,后10个代表两个预测框及其置信度
。



对每一个网格的每一个bbox执行同样操作,(每个bbox既有对应的class信息又有坐标信息)。


得到每个bbox的class-specific confidence score以后,设置阈值,滤掉得分低的boxes,对保留的bbox进行NMS处理,就得到最终的检测结果。

排序后,不同位置的框内,概率不同:

以最大值作为bbox_max,并与比它小的非0值(bbox_cur)做比较:IOU

递归,以下一个非0 bbox_cur(0.2)作为bbox_max继续作比较IOU:

最终,剩下n个框:

对bb3()类别的分数,找分数对最大类别的索引
class bb3(
)中最大的分
score



Yolo的缺点:
- YOLO对相对靠近的很近的物体(挨在一起且中心点都落在同一个格子上的情况),还有很小的群体检测效果不好,这是因为一个网格中只预测了两个框并且归属于一类;
- 测试图像中,当一类物体出现不常见的长宽比和其他情况是泛化能力偏弱。
YOLOV2
1、YOLOV2使用了一个新的分类网络作为特征提取器;
2、网络使用了较多的卷积核,在每一次赤化操作后把通道数翻倍;
3、把的卷积核置于
的卷积核之间,用来压缩特征;
4、使用Batch normalization稳定模型训练,加速收敛;
5、保留了一个shortcut用于存储之前的特征;
6、出去网络结构的优化外,YOLOV2相比YOLOV1加入了先验框部分,最后输出的conv_dec的shape为:
是把整个图分为
的网格用于检测。
- 425可以分解为
,在85中,由于YOLO2常用的是coco数据集,其中具有80个类;剩余的5指的是x、y、w、h和其置信度。
意味着预测结果包含5个框,分别对应5个先验框。

YOLOV3

YOLOV3相比于之前的YOLOV1和YOLOV2,改进较大,主要改进方向如下:
1、使用了残差网络Residual
2、提取多特征层进行目标检测,一共提取3个特征层,它的shape分别为,
,
。最后一个维度为75是因为该图是基于voc数据集的,它的类为20类。YOLOV3针对每一个特征层存在3个先验框,所以最后的维度为
。
3、其采用反卷积UpSampling2d设计,逆卷积相对于卷积在神经网络结构的正向和反向传播中做相反的运算,其可以更多更好的提取出特征。
YOLOV3行人检测

SSD

SSD也是一个多特征网络层,其一共具有11层,前半部分结构是VGG16:
1、首先通过了多个卷积层,5次步长为2的最大池化取出特征,形成了5个block,其中第四个Block用于提取小目标(多次卷积后大目标的特征保存得更好,小目标特征会消失,需要在比较靠前的层提取小目标特征);
2、进行一次卷积核膨胀dilate;
3、读取第七个Block7的特征;
4、分别利用和
的卷积提取特征,在
卷积的时候使用步长2,缩小特征数,获取第八个Block的特征;
5、重复步骤4,获得9、10、11卷积层特征。
















