文章目录
目标检测
1 定义
目标检测(Object Detection)的任务是找出图像中所有感兴趣的目标,并确定它们的类别和位置。
目标检测中能检测出来的物体取决于当前任务(数据集)需要检测的物体有哪些。假设我们的目标检测模型定位是检测动物(牛、羊、猪、狗、猫五种结果),那么模型对任何一张图片输出结果不会输出鸭子、书籍等其它类型结果。
目标检测的位置信息一般由两种格式(以图片左上角为原点 (0,0)):
1、极坐标表示:(xmin, ymin, xmax, ymax)
- xmin,ymin:x,y 坐标的最小值
- xmin,ymin:x,y 坐标的最大值
2、中心点坐标:(x_center, y_center, w, h)
- x_center, y_center: 目标检测框的中心点坐标
- w,h: 目标检测框的宽、高
2 常用数据集
经典的目标检测数据集有两种,PASCAL VOC 数据集 和 MS COCO 数据集。
2.1 PASCAL VOC 数据集
PASCAL VOC 是目标检测领域的经典数据集。PASCAL VOC 包含约 10,000 张带有边界框的图片用于训练和验证。PASCAL VOC 数据集是目标检测问题的一个基准数据集,很多模型都是在此数据集上得到的,常用的是 VOC2007 和 VOC2012 两个版本数据,共 20 个类别,分别是:
也就是:
1. 人:人
2. 动物:鸟,猫,牛,狗,马,羊
3. 交通工具:飞机,自行车,船,公共汽车,汽车,摩托车,火车
4. 室内:瓶子,椅子,餐桌,盆栽,沙发,电视 / 显示器
下载地址:https://pjreddie.com/projects/pascal-voc-dataset-mirror/
整个数据的目录结构如下所示:
其中:
- JPEGImages 存放图片文件
- Annotations 下存放的是 xml 文件,描述了图片信息,如下图所示,需要关注的就是节点下的数据,尤其是 bndbox 下的数据.xmin,ymin 构成了 boundingbox 的左上角,xmax,ymax 构成了 boundingbox 的右下角,也就是图像中的目标位置信息
- ImageSets 包含以下 4 个文件夹:
- Action 下存放的是人的动作(例如 running、jumping 等等)
- Layout 下存放的是具有人体部位的数据(人的 head、hand、feet 等等)
- Segmentation 下存放的是可用于分割的数据。
- Main 下存放的是图像物体识别的数据,总共分为 20 类,这是进行目标检测的重点。该文件夹中的数据对负样本文件进行了描述。
2.2 MS COCO 数据集
MS COCO 的全称是 Microsoft Common Objects in Context,微软于 2014 年出资标注的 Microsoft COCO 数据集,与 ImageNet 竞赛一样,被视为是计算机视觉领域最受关注和最权威的比赛之一。
COCO 数据集是一个大型的、丰富的物体检测,分割和字幕数据集。这个数据集以场景理解为目标,主要从复杂的日常场景中截取,图像中的目标通过精确的分割进行位置的标定。图像包括 91 类目标,328,000 影像和 2,500,000 个 label。目前为止目标检测的最大数据集,提供的类别有 80 类,有超过 33 万张图片,其中 20 万张有标注,整个数据集中个体的数目超过 150 万个。
图像示例:
coco 数据集的标签文件标记了每个 segmentation+bounding box 的精确坐标,其精度均为小数点后两位一个目标的标签示意如下:
{“segmentation”:[[392.87, 275.77, 402.24, 284.2, 382.54, 342.36, 375.99, 356.43, 372.23, 357.37, 372.23, 397.7, 383.48, 419.27,407.87, 439.91, 427.57, 389.25, 447.26, 346.11, 447.26, 328.29, 468.84, 290.77,472.59, 266.38], [429.44,465.23, 453.83, 473.67, 636.73, 474.61, 636.73, 392.07, 571.07, 364.88, 546.69,363.0]], “area”: 28458.996150000003, “iscrowd”: 0,“image_id”: 503837, “bbox”: [372.23, 266.38, 264.5,208.23], “category_id”: 4, “id”: 151109},
3 常用的评价指标
3.1 IOU
在目标检测算法中,IoU(intersection over union,交并比)是目标检测算法中用来评价 2 个矩形框之间相似度的指标:
IoU = 两个矩形框相交的面积 / 两个矩形框相并的面积,
如下图所示:
通过一个例子看下在目标检测中的应用:
其中上图蓝色框框为检测结果,红色框框为真实标注。
那我们就可以通过预测结果与真实结果之间的交并比来衡量两者之间的相似度。一般情况下对于检测框的判定都会存在一个阈值,也就是 IoU
的阈值,一般可以设置当 IoU
的值大于 0.5
的时候,则可认为检测到目标物体。
实现方法:
1 | import numpy as np |
假设我们检测结果如下所示,并展示在图像上:
1 | import matplotlib.pyplot as plt |
计算 IoU:
1 | Iou(True_bbox,predict_bbox) |
结果为:
1 | 0.5114435907762924 |
3.2 mAP(Mean Average Precision)
目标检测问题中的每个图片都可能包含一些不同类别的物体,需要评估模型的物体分类和定位性能。因此,用于图像分类问题的标准指标 precision 不能直接应用于此。 在目标检测中,mAP 是主要的衡量指标。
mAP 是多个分类任务的 AP 的平均值,而 AP(average precision)是 PR 曲线下的面积,所以在介绍 mAP 之前我们要先得到 PR 曲线。
TP、FP、FN、TN
查准率、查全率
- 查准率(Precision): TP/(TP + FP)
- 查全率(Recall): TP/(TP + FN)
二者绘制的曲线称为 P-R 曲线
先定义两个公式,一个是 Precision,一个是 Recall,与上面的公式相同,扩展开来,用另外一种形式进行展示,其中 all detctions
代表所有预测框的数量, all ground truths
代表所有 GT 的数量。
AP 是计算某一类 P-R 曲线下的面积,mAP 则是计算所有类别 P-R 曲线下面积的平均值。
假设我们有 7 张图片(Images1-Image7),这些图片有 15 个目标(绿色的框,GT 的数量,上文提及的 all ground truths
)以及 24 个预测边框(红色的框,A-Y 编号表示,并且有一个置信度值):
根据上图以及说明,我们可以列出以下表格,其中 Images 代表图片的编号,Detections 代表预测边框的编号,Confidences 代表预测边框的置信度,TP or FP 代表预测的边框是标记为 TP 还是 FP(认为预测边框与 GT 的 IOU 值大于等于 0.3 就标记为 TP;若一个 GT 有多个预测边框,则认为 IOU 最大且大于等于 0.3 的预测框标记为 TP,其他的标记为 FP,即一个 GT 只能有一个预测框标记为 TP),这里的 0.3 是随机取的一个值。
通过上表,我们可以绘制出 P-R 曲线(因为 AP 就是 P-R 曲线下面的面积),但是在此之前我们需要计算出 P-R 曲线上各个点的坐标,根据置信度从大到小排序所有的预测框,然后就可以计算 Precision 和 Recall 的值,见下表。(需要记住一个叫累加的概念,就是下图的 ACC TP 和 ACC FP)
- 标号为 1 的 Precision 和 Recall 的计算方式:Precision=TP/(TP+FP)=1/(1+0)=1,Recall=TP/(TP+FN)=TP/(
all ground truths
)=1/15=0.0666 (all ground truths 上面有定义过了
) - 标号 2:Precision=TP/(TP+FP)=1/(1+1)=0.5,Recall=TP/(TP+FN)=TP/(
all ground truths
)=1/15=0.0666 - 标号 3:Precision=TP/(TP+FP)=2/(2+1)=0.6666,Recall=TP/(TP+FN)=TP/(
all ground truths
)=2/15=0.1333 - 其他的依次类推
然后就可以绘制出 P-R 曲线
得到 P-R 曲线就可以计算 AP(P-R 曲线下的面积),要计算 P-R 下方的面积,有两种方法:
- 在 VOC2010 以前,只需要选取当 Recall >= 0, 0.1, 0.2, …, 1 共 11 个点时的 Precision 最大值,然后 AP 就是这 11 个 Precision 的平均值,取 11 个点 [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1] 的插值所得
得到一个类别的 AP 结果如下:
要计算 mAP,就把所有类别的 AP 计算出来,然后求取平均即可。
- 在 VOC2010 及以后,需要针对每一个不同的 Recall 值(包括 0 和 1),选取其大于等于这些 Recall 值时的 Precision 最大值,如下图所示:
然后计算 PR 曲线下面积作为 AP 值:
计算方法如下所示:
4 NMS(非极大值抑制)
非极大值抑制(Non-Maximum Suppression,NMS),顾名思义就是抑制不是极大值的元素。例如在行人检测中,滑动窗口经提取特征,经分类器分类识别后,每个窗口都会得到一个分数。但是滑动窗口会导致很多窗口与其他窗口存在包含或者大部分交叉的情况。这时就需要用到 NMS 来选取那些邻域里分数最高(是行人的概率最大),并且抑制那些分数低的窗口。 NMS 在计算机视觉领域有着非常重要的应用,如视频目标跟踪、数据挖掘、3D 重建、目标识别以及纹理分析等 。
在目标检测中,NMS 的目的就是要去除冗余的检测框,保留最好的一个,如下图所示:
NMS 的原理是对于预测框的列表 B 及其对应的置信度 S, 选择具有最大 score 的检测框 M, 将其从 B 集合中移除并加入到最终的检测结果 D 中。通常将 B 中剩余检测框中与 M 的 IoU 大于阈值 Nt 的框从 B 中移除。重复这个过程,直到 B 为空。
使用流程如下图所示:
- 首先是检测出一系列的检测框
- 将检测框按照类别进行分类
- 对同一类别的检测框应用 NMS 获取最终的检测结果
通过一个例子看些 NMS 的使用方法,假设定位车辆,算法就找出了一系列的矩形框,我们需要判别哪些矩形框是没用的,需要使用 NMS 的方法来实现。
假设现在检测窗口有:A、B、C、D、E 5 个候选框,接下来进行迭代计算:
- 第一轮:因为 B 是得分最高的,与 B 的 IoU>0.5 删除。A,CDE 中现在与 B 计算 IoU,DE 结果>0.5,剔除 DE,B 作为一个预测结果,有个检测框留下 B,放入集合
- 第二轮:A 的得分最高,与 A 计算 IoU,C 的结果>0.5,剔除 C,A 作为一个结果
最终结果为在这个 5 个中检测出了两个目标为 A 和 B。
单类别的 NMS 的实现方法如下所示:
1 | import numpy as np |
假设有检测结果如下:
1 | bounding = [(187, 82, 337, 317), (150, 67, 305, 282), (246, 121, 368, 304)] |
返回结果:
1 | 阈值threshold为: 0.3 |
5 目标检测方法分类
目标检测算法主要分为 two-stage(两阶段)和 one-stage(单阶段)两类:
5.1 two-stage 的算法
先由算法生成一系列作为样本的候选框,再通过卷积神经网络进行样本分类。如下图所示,主要通过一个卷积神经网络来完成目标检测过程,其提取的是 CNN 卷积特征,进行候选区域的筛选和目标检测两部分。网络的准确度高、速度相对较慢。
two-stages 算法的代表是 RCNN 系列:R-CNN 到 Faster R-CNN 网络
5.2 One-stage 的算法
直接通过主干网络给出目标的类别和位置信息,没有使用候选区域的筛选网路,这种算法速度快,但是精度相对 Two-stage 目标检测网络降低了很多。
one-stage 算法的代表是: YOLO 系列:YOLOv1、YOLOv2、YOLOv3、 SSD 等
6 经典深度学习网络
6.1 RCNN
2014 年提出 R-CNN 网络,该网络不再使用暴力穷举的方法,而是使用候选区域方法(region proposal method)创建目标检测的区域来完成目标检测的任务,R-CNN 是以深度神经网络为基础的目标检测的模型 ,以 R-CNN 为基点,后续的 Fast R-CNN、Faster R-CNN 模型都延续了这种目标检测思路。
步骤是:
- 候选区域生成:使用选择性搜索(Selective Search)的方法找出图片中可能存在目标的侯选区域
- CNN 网络提取特征:选取预训练卷积神经网网络(AlexNet 或 VGG)用于进行特征提取。
- 目标分类:训练支持向量机(SVM)来辨别目标物体和背景,对每个类别,都要训练一个二元 SVM。
- 目标定位:训练一个线性回归模型,为每个辨识到的物体生成更精确的边界框。
1 候选区域生成
在选择性搜索(SelectiveSearch,SS)中,使用语义分割的方法,它将颜色、边界、纹理等信息作为合并条件,采用多尺度的综合方法,将图像在像素级上划分出一系列的区域,这些区域要远远少于传统的滑动窗口的穷举法产生的候选区域。
SelectiveSearch 在一张图片上提取出来约 2000 个侯选区域,需要注意的是这些候选区域的长宽不固定。 而使用 CNN 提取候选区域的特征向量,需要接受固定长度的输入,所以需要对候选区域做一些尺寸上的修改。
2 CNN 网络提取特征
采用预训练模型 (AlexNet 或 VGG) 在生成的候选区域上进行特征提取,将提取好的特征保存在磁盘中,用于后续步骤的分类和回归。
1. 全连接层的输入数据的尺寸是固定的,因此在将候选区域送入 CNN 网络中时,需进行裁剪或变形为固定的尺寸,在进行特征提取。
2. 预训练模型在 ImageNet 数据集上获得,最后的全连接层是 1000,在这里我们需要将其改为 N+1 (N 为目标类别的数目,例如 VOC 数据集中 N=20,coco 数据集中 N=80,1 是加一个背景) 后,进行微调即可。
3. 利用微调后的 CNN 网络,提取每一个候选区域的特征,获取一个 4096 维的特征,一幅图像就是 2000x4096 维特征存储到磁盘中。
3 目标分类(SVM)
假设我们要检测猫狗两个类别,那我们需要训练猫和狗两个不同类别的 SVM 分类器,然后使用训练好的分类器对一幅图像中 2000 个候选区域的特征向量分别判断一次,这样得出 [2000, 2] 的得分矩阵,如下图所示:
对于 N 个类别的检测任务,需要训练 N(目标类别数目)个 SVM 分类器,对候选区域的特征向量(4096 维)进行二分类,判断其是某一类别的目标,还是背景来完成目标分类。
4 目标定位
通过选择性搜索获取的目标位置不是非常的准确,实验证明,训练一个线性回归模型在给定的候选区域的结果上去预测一个新的检测窗口,能够获得更精确的位置。修正过程如下图所示:
通过训练一个回归器来对候选区域的范围进行一个调整,这些候选区域最开始只是用选择性搜索的方法粗略得到的,通过调整之后得到更精确的位置,如下所示:
5 预测过程
使用选择性搜索的方法从一张图片中提取 2000 个候选区域,将每个区域送入 CNN 网络中进行特征提取,然后送入到 SVM 中进行分类,并使用候选框回归器,计算出每个候选区域的位置。 候选区域较多,有 2000 个,需要剔除掉部分检测结果。 针对每个类,通过计算 IOU, 采取非最大值抑制 NMS 的方法,保留比较好的检测结果。
算法总结
1、训练阶段多,训练耗时: 微调 CNN 网络 + 训练 SVM + 训练边框回归器。
2、预测速度慢:使用 GPU, VGG16 模型处理一张图像需要 47s。
3、占用磁盘空间大:5000 张图像产生几百 G 的特征文件。
4、数据的形状变化:候选区域要经过缩放来固定大小,无法保证目标的不变形
6.2 Fast RCNN
6.2.1 模型特点
相比于 R-CNN, Fast R-CNN 主要在以下三个方面进行了改进:
1、提高训练和预测的速度
R-CNN 首先从测试图中提取 2000 个候选区域,然后将这 2000 个候选区域分别输入到预训练好的 CNN 中提取特征。由于候选区域有大量的重叠,这种提取特征的方法,就会重复的计算重叠区域的特征。在 Fast-RCNN 中,将整张图输入到 CNN 中提取特征,将候选区域映射到特征图上,这样就避免了对图像区域进行重复处理,提高效率减少时间。
2、不需要额外的空间保存 CNN 网络提取的特征向量
RCNN 中需要将提取到的特征保存下来,用于为每个类训练单独的 SVM 分类器和边框回归器。在 Fast-RCNN 中,将类别判断和边框回归统一使用 CNN 实现,不需要在额外的空间存储特征。
3、不在直接对候选区域进行缩放
RCNN 中需要对候选区域进行缩放送入 CNN 中进行特征提取,在 Fast-RCNN 中使用 ROIpooling 的方法进行尺寸的调整。
6.2.2 算法流程
Fast_RCNN 的流程如下图所示:
步骤是:
1、候选区域生成:使用选择性搜索(Selective Search)的方法找出图片中可能存在目标的侯选区域,只需要候选区域的位置信息
2、CNN 网络特征提取:将整张图像输入到 CNN 网络中,得到整副图的特征图,并将上一步获取的候选区域位置从原图映射到该特征图上
3、ROIPooling: 对于每个特征图上候选框,RoI pooling 层从特征图中提取固定长度的特征向量每个特征向量被送入一系列全连接(fc)层中。
4、目标检测:分两部分完成,一个输出各类别加上 1 个背景类别的 Softmax 概率估计,另一个为各类别的每一个类别输出四个实数值,来确定目标的位置信息。
6.3 Faster RCNN
在 R-CNN 和 Fast RCNN 的基础上,在 2016 年提出了 Faster RCNN 网络模型,在结构上,Faster RCNN 已经将候选区域的生成,特征提取,目标分类及目标框的回归都整合在了一个网络中,综合性能有较大提高,在检测速度方面尤为明显。
1、特征提取:将整个图像缩放至固定的大小输入到 CNN 网络中进行特征提取,得到特征图。
2、候选区域提取:输入特征图,使用区域生成网络 RPN,产生一些列的候选区域
3、ROIPooling: 与 Fast RCNN 网络中一样,使用最大池化固定候选区域的尺寸,送入后续网络中进行处理
4、目标分类和回归:与 Fast RCNN 网络中一样,使用两个同级层:K+1 个类别的 SoftMax 分类层和边框的回归层,来完成目标的分类和回归。
Faster R-CNN 的流程与 Fast R-CNN 的区别不是很大,重要的改进是使用 RPN 网络来替代选择性搜索获取候选区域,所以我们可以将 Faster R-CNN 网络看做 RPN 和 Fast R-CNN 网络的结合。
将网络分为四部分:
- Backbone:Backbone 由 CNN 卷积神经网络构成,常用的是 VGG 和 resnet, 用来提取图像中的特征,获取图像的特征图。该特征图被共享用于后续 RPN 层生成候选区域和 ROIPooling 层中。
- RPN 网络:RPN 网络用于生成候选区域,用于后续的目标检测。
- Roi Pooling: 该部分收集图像的特征图和 RPN 网络提取的候选区域位置,综合信息后获取固定尺寸的特征,送入后续全连接层判定目标类别和确定目标位置。
- 目标分类与回归:该部分利用 ROIpooling 输出特征向量计算候选区域的类别,并通过回归获得检测框最终的精确位置。
6.4 YOLO
Yolo 意思是 You Only Look Once,它并没有真正的去掉候选区域,而是创造性的将候选区和目标分类合二为一,看一眼图片就能知道有哪些对象以及它们的位置。
Yolo 模型采用预定义预测区域的方法来完成目标检测,具体而言是将原始图像划分为 7x7=49 个网格(grid),每个网格允许预测出 2 个边框(bounding box,包含某个对象的矩形框),总共 49x2=98 个 bounding box。我们将其理解为 98 个预测区,很粗略的覆盖了图片的整个区域,就在这 98 个预测区中进行目标检测。
YOLO 的结构非常简单,就是单纯的卷积、池化最后加了两层全连接,从网络结构上看,与前面介绍的 CNN 分类网络没有本质的区别,最大的差异是输出层用线性函数做激活函数,因为需要预测 bounding box 的位置(数值型),而不仅仅是对象的概率。所以粗略来说,YOLO 的整个结构就是输入图片经过神经网络的变换得到一个输出的张量,如下图所示:
网络结构比较简单,重点是我们要理解网络输入与输出之间的关系。
4.1 网络输入
网络的输入是原始图像,唯一的要求是缩放到 448x448 的大小。主要是因为 Yolo 的网络中,卷积层最后接了两个全连接层,全连接层是要求固定大小的向量作为输入,所以 Yolo 的输入图像的大小固定为 448x448。
4.2 网络输出
网络的输出就是一个 7x7x30 的张量(tensor)。那这个输出结果我们要怎么理解那?
4.2.1 7X7 网格
根据 YOLO 的设计,输入图像被划分为 7x7 的网格(grid),输出张量中的 7x7 就对应着输入图像的 7x7 网格。或者我们把 7x7x30 的张量看作 7x7=49 个 30 维的向量,也就是输入图像中的每个网格对应输出一个 30 维的向量。如下图所示,比如输入图像左上角的网格对应到输出张量中左上角的向量。
4.2.2 30 维向量
30 维的向量包含:2 个 bbox 的位置和置信度以及该网格属于 20 个类别的概率
- 2 个 bounding box 的位置 每个 bounding box 需要 4 个数值来表示其位置,(Center_x,Center_y,width,height),即 (bounding box 的中心点的 x 坐标,y 坐标,bounding box 的宽度,高度),2 个 bounding box 共需要 8 个数值来表示其位置。
- 2 个 bounding box 的置信度 bounding box 的置信度 = 该 bounding box 内存在对象的概率 * 该 bounding box 与该对象实际 bounding box 的 IOU,用公式表示就是:
Pr (Object) 是 bounding box 内存在对象的概率
- 20 个对象分类的概率
Yolo 支持识别 20 种不同的对象(人、鸟、猫、汽车、椅子等),所以这里有 20 个值表示该网格位置存在任一种对象的概率.