先上git地址:https://github.com/rbgirshick/py-faster-rcnn(也可以上github搜索faster r-cnn,星最多的那个py就是了)
目录
一.目标检测的任务
二.目标检测相关知识
三.传统目标检测算法
四.深度学习目标检测算法
一.目标检测的任务
选择检测窗口
特征提取
分类器
二.目标检测相关知识
Bbox
IOU(intersection over Union)
三.传统目标检测算法V-J
穷举窗口扫描
Haar特征与积分图
级联分类器
三.深度学习目标检测方法
1.Selective search与R-CNN
2.Rol Pooling与SPPNet
3.Fast R-CNN与Faster R-CNN
1.目标检测的发展史以及传统的目标检测算法
原理讲解
faster r-cnn是用来做目标检测的,其根据fast r-cnn改进的,fast r-cnn根据r-cnn改进的。r-cnn又是根据传统目标检测改进的。
目标检测任务主要包含两个子任务,一个是输出这类目标的类别信息,属于分类任务;另一个是输出目标的具体位置信息,属于定位任务。
那么分类的结果就是返回一个标签,数据可以表示为one-hot形式,比如五类目标[1 0 0 0 0 ]表示的就是第一类目标。
定位任务是返回一个矩形框,来限定目标所在位置,比如一个预测的标签为[1,0.30,0.70,0.10,0.20],第一个参数表示的就是标签类别,第二第三个表示的是矩形框的左上角或者中心点的xy坐标,第四第五个表示的就是矩形框的长宽相对于图片的百分比。
在传统的方法时代,很多任务并不是一次性就能解决,而是需要多个步骤。深度学习中基本都是采取end-to-end的形式。完成一个目标检测任务,一个系统一定会遵循3个步骤。
关于目标检测性能评价可以参考:https://blog.csdn.net/qq_29893385/article/details/81213377
目标检测最终的任务是检测出一个窗口中是否有物体。以人脸检测为例(用我粉丝的照片为例),我们需要框出猫脸位置并给出人脸的大小。如下图所示。
但是在不同的距离下检测不同大小的目标时,最简单也是最直接的就是用图像金字塔+各种尺度比例的框+暴力搜索法;从左到右,从上到下滑动窗口,然后利用分类方法对目标框进行识别。但是这样会产生大量的无效的窗口,浪费计算效率。如下图
有了候选窗口后,需要提取图像的特征进行表达,传统的有监督方法和以CNN为代表的无监督特征学习的方法都可以排上用场。传统人脸检测算法有:
Haar,是V-J框架使用的基本特征,表征的是局部的明暗对比关系。特征提取速度较快,能够表达物体多个方向的边缘变化信息,并且可以利用积分图进行快速计算,因此被应用得很广泛。
LBP,是传统人脸检测算法中广泛使用得纹理特征,它采用中心像素和边缘像素得灰度对比,可以表达物体丰富的纹理信息,同时因为使用的是相对灰度值,因此对均匀变化的光照有很好的适应性。
HOG,是在物体检测领域应用非常广泛的特征,通过对物体边缘进行直方图统计来实现编码,相对于Haar和LBP两个特征,HOG的特征表达能力更强、更加通用,广泛使用于物体检测、跟踪和识别等领域。
分类器是目标检测的最后一步,常常被使用的分类器包含Adaboost(将弱分类器中挑选其中分类精度更高的弱分类器,将其进行组合从而实现一个更强的分类器)、SVM(寻找一个最有超平面进行分类)和Decision Tree(决策树)等。
这里不再赘述,说以上只是为了对目标检测有个大的轮廓。
就是检测出物体并且得到的最小矩形框。如图中的红色,蓝色以及绿色的框框就是Bbox
就是交集与并集的比值。
IOU=(Area of OverLap)/(Area of Union)
图形表示为:
也就是说,当预测的bbox与真实bbox重合的时候,IOU的值最大,就说明目标检测越真实。
包含:
传统方法由于在第一阶段,选择滑动窗口上效率低下、特征不够鲁棒等原因限制了目标检测的发展,导致其一直无法在工业界进行大规模落地。基于深度学习的方案致力于解决这些问题。根据检测阶段的不同,可以将深度学习方法分为one-stage检测算法和two-stage检测算法两种。对于two-stage检测算法来说,它先生成了可能包含物体的候选区域Region Proposal,然后对这个候选区域做进一步的分类和校准,得到最终的检测结果,代表方法有R-CNN系列方法。one-stage检测算法直接给出了最终的检测结果,没有经过生成候选区域的步骤,典型代表的算法有YOLO和SSD。
这里先介绍two-stage检测算法
https://zhuanlan.zhihu.com/p/23006190
V-J框架使用的是穷举法的思路而不是生成候选区域方法,每滑动一个窗口检测一次,相邻窗口信息重叠高、检测速度慢,这就导致了会出现很多的无效区域。在2012年的时候,J.R.R.Uijlings提出了Selective search方法,这种方法其实是利用了经典的图像分割方法(可以理解为利用图像的纹理、边缘、颜色等信息,可以保证在选取较少窗口(几钱甚至几百)的情况下保持较高的召回率),用Graphcut首先对图像做初始分割,然后通过分层分组方法对分割的结果做筛选和归并,最终输出所有可能的位置,将候选区域缩小到了2000个左右。这些框框可能有重复的,但是比穷举法的效率就提高了非常多了。比如下图中的狗子猫子和花儿:
主要的做法就是:
(1)首先将图像进行分割得到若干区域,组成区域集合S,这是一个初始化的集合
(2)然后利用颜色、纹理、尺寸和空间交叠等特征,计算区域集里每个相邻区域的相似度,找出相似度最高的两个区域,将其合并为新集并从区域集合中删除原来的两个对应的子集。
(3)重复以上的迭代过程,知道最开始的集合S为空,得到的图像的分割结果和候选的区域边界,也就是初始框。
使用selectcive search大量降低计算量的候选框生成策略之后,基于深度学习的早期目标检测框架开始发展起来,比较典型的就是Ross girshick等人提出来的R-CNN算法,它是一种结合区域提名(Region Proposal)和卷积神经网络的目标检测方法。
在R-CNN框架中使用Selective search将候选区域控制在了2000个左右,然后将对应的框进行缩放操作,送入CNN中进行训练,通过SVM和回归器确定物体的类别并对其进行定位。由于CNN具有非常强大的非线性表征能力,可以对每一个区域进行很好的特征学习,因此性能大大提高。
R-CNN的特点:
R-CNN能够将PASCAL VOC上的检测率从35.1%提升到53.7%。但是selective search方法仍存在计算量过大的问题。
R-CNN的缺点:
之所以要进行缩放到同一固定的尺寸,是因为全连接层的输入需要固定的大小,所以要使用不同大小的图片,就必须在输入全连接层之前进行统一变换。但是不能通过简单的裁剪,因为简单的裁剪会使图片信息发生丢失,比如:
而且缩放会导致图片失真,为了解决这种问题,可以通过一个特殊的池化层,即Spatial Pyramid Pooling层(简称SPP层)来解决。它实现了将输入的任意尺度的特征图组合成了特定维度的输出,从而去掉了原始图像上的裁剪/缩放等操作的约束。它是在卷积特征上的空间金字塔池化层,不管输入的图像多大,假设最终的单个通道的特征图的尺寸都为NXN。利用max pooling操作将其分成1x1,2x2,4x4的3张子图,从而由原来任意的NxN大小的特征图都被表示为21维的固定维度向量,然后输入全连接层,其原理如下图所示:
在R-CNN中,对于每一个候选区域都是用CNN进行特征提取,没有共享计算,这里面其实包含了很多的冗余操作。如果能像V-J中的积分图一样,只需要提取一次特征就能完成操作呢?
Fast R-CNN借鉴SPP的原理来解决这个问题。Fast R-CNN的流程是首先以整张图片为输入,利用CNN得到图片的特征层;然后利用Selective search算法得到原始图像空间中的候选框,并将这些候选框投影到特征层。针对特征层上的每个不同大小的候选框,使用ROI池化操作,得到固定维度的特征表示,最后通过两个全连接层分别用Softmax分类及回归模型进行检测。
与R-CNN的区别之处就在于ROI(Region of Interesting)Pooling层,它是一个简化的SPP层。
一张图经过卷积后,会得到相应的特征图,特征图上的每个像素都可以对应上原始的图像。任何一个候选区域,只需要获取他的左上、右下两个点对应到特征图中的位置,就能从特征图中取到这个候选区域对应的特征,就是一个简单的映射,比如:
令S是stride的大小,也就是从原始分辨率到当前分辨率尺度的降低倍率,则从原图到坐标(x,y)对应到特征图的坐标(x',y'),即
x'=x/S,y'=y/S
同时它的训练和测试不再分多步,不再需要额外的硬盘来存储中间层的特征,梯度也能够通过ROI Pooling层直接传播。Fast R-CNN还是用SVD分解全连接层的参数矩阵,压缩为两个规模小很多的全连接层。
R-CNN、SPPNet和Fast R-CNN都不能解决一个问题,那就是Selective search方法低效率的滑动窗口选择问题,他仍然生成了大量无效区域,多了造成算力的浪费,少了则导致漏检。Faster R-CNN是深度学习中two-stage方法的奠基工作,提出的RPN(Region Proposal Networks)网络取代Selective search算法后使检测任务可以由神经网络端到端地完成。可以理解为Faster R-CNN=RPN+Fast R-CNN,因为Fast R-CNN有共享卷据计算的特性,所以使得新引入的RPN的计算量很小,Faster R-CNN可以在单个GPU上以5FPS的速度运行。
RPN就是一张任意大小的图片作为输入,输出一批矩形区域的提名,每一个区域都会对应目标的分数和位置信息。实际上就是在最终的卷积特征层上,在每个点利用滑窗生成k个不同的矩形框来提取区域,k一般取值为9。k个不同的矩形框被称为anchor,具有不同尺度和比例。用分类器来判断anchor覆盖的图像是前景还是背景,对于每一个anchor,还需要使用一个回归模型来判断回归框的精细位置。
RPN结构如下:
Faster r-cnn框架如下:
从一张图输入到最终结果可以看如下图:
RPN网络将候选区域的选择从图像中移到了特征图中,因为特征图的大小远远小于原始的图像,此时滑动窗口的计算量呈数量级降低,并且RPNs和Roi Pooling还共用了基础的网络,更是大大减少了参数量和预测时间。由于是在特征空间进行候选框生成,可以学到更加高层语义的后向特征,生成的候选区域的可靠程度也得到了大大提高。