目标检测简介

先上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

就是检测出物体并且得到的最小矩形框。如图中的红色,蓝色以及绿色的框框就是Bbox

  • IOU(intersection over Union)

就是交集与并集的比值。

IOU=(Area of OverLap)/(Area of Union)

图形表示为:

也就是说,当预测的bbox与真实bbox重合的时候,IOU的值最大,就说明目标检测越真实。

 

 


三.传统目标检测算法V-J

包含:

  • 利用Haar特征描述人脸的共有属性
  • 建立了被称为积分图像的特征,可以快速获取几种不同的矩形特征;
  • 利用Adaboost算法进行训练,通过弱分类器的组合实现速度较快且精度不错的检测方案。
  1. 穷举窗口扫描

    1. V-J框架使用的就是最简单的滑动窗口法,训练尺度是24X24的滑动窗口。
  2. Haar特征与积分图

    1. 一个24X24的窗口,共包含576个像素点。在V-J框架中彩色图像会被转换为灰度图像,不使用像素点的灰度值作为特征,二十需要抽象层次更高的特征。
    2. 人脸的图像有很多的共性,比如眼睛区域会比脸颊区域暗,而鼻子一般属于脸部的高光区域,因此比周围的脸颊更亮。以及五官都固定,眼睛在上,鼻子在中间,嘴巴在下方。
    3. Haar特征正式考虑了这样的明暗关系,原理就是将一个矩形检测区域分为两个部分,将这两部分各自的灰度和相减得到一个值,这就反映了该矩形区域的明暗对比关系。
  3. 级联分类器

    1. 主要的作用就是人脸通常只占用很小的一块区域,因此没有必要对所有的窗口计算所有的特征,需要对特征进行选择,V-J框架使用了Adaboost层级分类器。
    2. 主要是用少量的特征将大部分没有人脸的区域剔除。对于级联分类器中位置靠前的分类器,挑选出一些简单的特征来过滤掉大部分非人脸的负样本。

三.深度学习目标检测方法

传统方法由于在第一阶段,选择滑动窗口上效率低下、特征不够鲁棒等原因限制了目标检测的发展,导致其一直无法在工业界进行大规模落地。基于深度学习的方案致力于解决这些问题。根据检测阶段的不同,可以将深度学习方法分为one-stage检测算法和two-stage检测算法两种。对于two-stage检测算法来说,它先生成了可能包含物体的候选区域Region Proposal,然后对这个候选区域做进一步的分类和校准,得到最终的检测结果,代表方法有R-CNN系列方法。one-stage检测算法直接给出了最终的检测结果,没有经过生成候选区域的步骤,典型代表的算法有YOLO和SSD。

这里先介绍two-stage检测算法

1.Selective search与R-CNN

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的特点:

  • 利用Selective search方法,即先通过实例分割将图像分割为若干小块,然后选择相似度较高的小块,把这些相似的小块合并为一个大块,然后整个物体生成一个大的矩形框,通过这种方法大大提高了候选区域的筛选速度。
  • 利用ImageNet数据集上进行学习的参数对神经网络进行预处理,解决了目标检测训练过程中标注数据不足的问题。
  • 通过线性回归模型对边框进行校准,减少图像中的背景空白,得到了更精准的定位。

R-CNN能够将PASCAL VOC上的检测率从35.1%提升到53.7%。但是selective search方法仍存在计算量过大的问题。

2.Rol Pooling与SPPNet

R-CNN的缺点:

  • R-CNN是先生成候选区域,然后对区域进行卷积,其中候选区域会有一定的重叠,因为selective search方法仍然不够好,导致CNN对相同区域进行重复卷积提取特征。并且将提取后的特征存储下来,然后使用传统的SVM分类器进行分类,导致需要很大的存储空间
  • 候选区域缩放到同一尺度进行网络训练,实际上Selective search选取的目标框有各种尺寸,可能导致目标变形,无论是裁剪还是缩放都不能解决这个问题。

之所以要进行缩放到同一固定的尺寸,是因为全连接层的输入需要固定的大小,所以要使用不同大小的图片,就必须在输入全连接层之前进行统一变换。但是不能通过简单的裁剪,因为简单的裁剪会使图片信息发生丢失,比如:

而且缩放会导致图片失真,为了解决这种问题,可以通过一个特殊的池化层,即Spatial Pyramid Pooling层(简称SPP层)来解决。它实现了将输入的任意尺度的特征图组合成了特定维度的输出,从而去掉了原始图像上的裁剪/缩放等操作的约束。它是在卷积特征上的空间金字塔池化层,不管输入的图像多大,假设最终的单个通道的特征图的尺寸都为NXN。利用max pooling操作将其分成1x1,2x2,4x4的3张子图,从而由原来任意的NxN大小的特征图都被表示为21维的固定维度向量,然后输入全连接层,其原理如下图所示:

3.Fast R-CNN与Faster R-CNN

在R-CNN中,对于每一个候选区域都是用CNN进行特征提取,没有共享计算,这里面其实包含了很多的冗余操作。如果能像V-J中的积分图一样,只需要提取一次特征就能完成操作呢?

  • Fast R-CNN简介

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分解全连接层的参数矩阵,压缩为两个规模小很多的全连接层。

  • Faster R-CNN简介

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还共用了基础的网络,更是大大减少了参数量和预测时间。由于是在特征空间进行候选框生成,可以学到更加高层语义的后向特征,生成的候选区域的可靠程度也得到了大大提高。

 

 

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值