目标识别(objec recognition)是指明一幅输入图像中包含那类目标。其输入为一幅图像,输出是该图像中的目标属于哪个类别(class probability)。而目标检测(object detection)除了要告诉输入图像中包含了哪类目前外,还要框出该目标的具体位置(bounding boxes)。
很多计算机视觉任务(如人脸识别,车牌识别,场景描述)背后的基础都是目标检测。自从 AlexNet 获得 ILSVRC 2012 挑战赛冠军后,用 CNN 进行目标识别成为主流。目标检测也得益于CNN在目标识别领域的进步发展越来越快。
目标检测流程可以大致分成三步,第一步是提议窗口(region proposal)的生成,第二步是图像特征的提取,第三步是提议区域图像分类。其中最具代表性的环节就是提议窗口的生成和筛选。
边框预测、边框筛选
边框预测(Boxes Prediction)环节负责得出大量提议边框,该部分可采用的模型多种多样;边框筛选(Boxes Filtering)过程则采用非最大抑制来实现。
交并比(IOU)与非最大抑制(NMS)
(1)交并比(IOU)
交并比用来描述两个边框的重合程度,重合度IOU计算公式为:IOU=(A∩B)/(A∪B),即两框覆盖区域的交集与并集的面积比。IOU越大,说明两个边框重合度越高。
(2)非最大抑制(NMS)
当边框预测环节生成了大量提议边框后,接着要为每个矩形框做类别分类概率,最后需要判别哪些矩形框是没用的。
所谓的非极大值抑制就是根据分类器类别分类概率做排序,从小到大排序,先拿最大概率候选框与其他框计算重叠度IOU,丢弃高于阈值的提议框。然后从没有被丢弃的提议框中再找最大概率提议框,重复上述操作.....直到找到所有被保留下来的提议框。
以下将介绍物体检测技术的发展历程。
1、传统的目标检测方法
传统机器学习方法采用的目标检测方案有:
haar/LBP特征+Adaboost决策树分类器
HOG特征 + SVM分类器
其中边框预测技术主要采用滑窗法。
滑窗法(Sliding Window)
首先对输入图像进行不同窗口大小的滑窗进行从左往右、从上到下的滑动。每次滑动时候对当前窗口执行分类器(分类器是事先训练好的)。如果当前窗口得到较高的分类概率,则认为检测到了物体。对每个不同窗口大小的滑窗都进行检测后,会得到不同窗口检测到的物体标记,这些窗口大小会存在重复较高的部分,最后采用非极大值抑制(Non-Maximum Suppression, NMS)的方法进行筛选。最终,经过NMS筛选后获得检测到的物体。
2、R-CNN
该方法作为深度学习用于物体识别的开山之作,后续很多基于提议框为基础的方法都是在该方法上进行改进得到的。该方案首先利用一种选择搜索算法(selective search)从图中选出2000个左右的候选框,对每一个候选框内的图片缩放至指定的大小并放入CNN中进行特征提取,并将指定的特征存储下来。提取出特征后使用SVM进行分类,最后通过非极大值抑制输出结果。
选择搜索法(selective search)
选择搜索算法的主要观点:图像中物体可能存在的区域应该是有某些相似性或者连续性区域的。基于这一想法采用子区域合并的方法进行提取提议边界框。首先,对输入图像用分割算法产生许多小的子区域。其次,根据这些子区域之间相似性(相似性标准主要有颜色、纹理、大小等等)进行区域合并,不断的进行区域迭代合并。每次迭代过程中对这些合并的子区域做外切矩形(bounding boxes),这些子区域外切矩形就是通常所说的提议框。它的计算效率优于滑窗法,而且由于采用子区域合并策略,所以可以包含各种大小的疑似物体框。 合并区域相似的指标多样性,提高了检测物体的概率。
R-CNN的训练可分成下几步:
(1)通过选择性搜索,对待检测的图片进行搜索出约2000个候选窗口。
(2)把这2000个提议窗口的图片都缩放到227*227,然后分别输入CNN中(论文中使用的CNN网络是AlexNet,数据集为ImageNet),每个提议窗口提取出一个特征向量,也就是说利用CNN对每个提议窗口进行提取特征向量,并将提取到的特征存储起来。
(3)把上面每个提议窗口的对应特征向量,利用SVM算法进行分类识别。
R-CNN的缺点是计算量太大。在一张图片中,通过Selective Search得到的有效区域往往在1000个以上,这意味着要重复计算1000多次神经网络,非常耗时。另外,在训练阶段,还需要把所有特征保存起来再通过SVM进行训练,这也是非常耗时且麻烦的。
创新
使用了选择搜索法作为边框预测算法。
使用了CNN提取图像特征
3、SPP-net
R-CNN 需要足够多的提议窗口才能保证准确度, 而很多区域是相互重叠的。R-CNN 的训练和推理过程都很缓慢。例如,我们生成了 2000 个的区域提议,每个区域提议分别进入 CNN。换句话说,我们对不同的候选窗口重复了进行了 2000 次的提取特征。
SPPNet的英文全称是Spatial Pyramid Pooling Convolutional Networks,翻译成中文是“空间金字塔池化卷积网络”,代表特点就是SPP池化层。出自2015年发表在IEEE上的论文-《Spatial Pyramid Pooling in Deep ConvolutionalNetworks for Visual Recognition》
SPP池化层
从下往上看,第一步卷积提取特征图,第二步金字塔池化,第三步将池化结果送入全连接层。第二步的金字塔池化其实就是把原来的特征图分别分成4X4=16块,2X2=4块,1X1=1块(不变),总共21块,取每块的最大值作为代表,即每张特征图就有了21维的参数,总共卷积出来256个特征图,则送入全连接层的维度就是21X256。
对比R-CNN,SPP-net的训练过程是:
(1)通过选择性搜索,对待检测的图片进行搜索出2000个候选窗口。这一步和R-CNN一样。
(2) 特征提取阶段。这一步就是和R-CNN最大的区别了,这一步骤的具体操作是把整张待检测的图片,输入CNN中,进行一次性特征提取,得到feature maps,然后在feature maps中找到各个候选框的区域,再对各个候选框采用金字塔空间池化(SPP池化层),提取出固定长度的特征向量。而R-CNN输入的是每个候选框,然后在进入CNN,因为SPP-Net只需要一次对整张图片进行特征提取,速度会大大提升。
(3)最后一步也是和R-CNN一样,采用SVM算法进行特征向量分类识别。
SPP-net对R-CNN最大的改进就是特征提取步骤做了修改,其他模块仍然和R-CNN一样。特征提取不再需要每个候选区域都经过CNN,只需要将整张图片输入到CNN就可以了,候选窗口特征直接从特征图获取。和R-CNN相比,速度提高了百倍。
创新
提出了一种从候选区域到全图特征之间的对应映射关系,通过此种映射关系可以直接获取到候选区域的特征向量,不需要重复使用CNN提取特征,从而大幅度缩短训练时间(每张图片只需进行一次前向传播即可)。
# -*- coding: utf-8 -*-
"""
SPP池化层
"""
import tensorflow as tf
import numpy as np
import pandas as pd
def spp_layer(input_, levels=4, name = 'SPP_layer',pool_type = 'max_pool'):
'''
Multiple Level SPP layer.
Works for levels=[1, 2, 3, 6].
'''
shape = input_.get_shape().as_list()
with tf.variable_scope(name):
for l in range(levels):
l = l + 1
ksize = [1, np.ceil(shape[1]/ l + 1).astype(np.int32), np.ceil(shape[2] / l + 1).astype(np.int32), 1]
strides = [1, np.floor(shape[1] / l + 1).astype(np.int32), np.floor(shape[2] / l + 1).astype(np.int32), 1]
if pool_type == 'max_pool':
pool = tf.nn.max_pool(input_, ksize=ksize, strides=strides, padding='SAME')
pool = tf.reshape(pool,(shape[0],-1),)
else :
pool = tf.nn.avg_pool(input_, ksize=ksize, strides=strides, padding='SAME')
pool = tf.reshape(pool,(shape[0],-1))
print("Pool Level {:}: shape {:}".format(l, pool.get_shape().as_list()))
if l == 1:
x_flatten = tf.reshape(pool,(shape[0],-1))
else:
x_flatten = tf.concat((x_flatten,pool),axis=1)
print("Pool Level {:}: shape {:}".format(l, x_flatten.get_shape().as_list()))
# pool_outputs.append(tf.reshape(pool, [tf.shape(pool)[1], -1]))
return x_flatten
#x = tf.ones((4,16,16,3))
#x_sppl = spp_layer(x,4)
4、Fast R-CNN
Ross Girshick在2015年推出Fast R-CNN,构思精巧,流程更为紧凑,大幅提升了目标检测的速度。Fast R-CNN和R-CNN相比,测试时间从49秒减少到2.3秒。
相对于R-CNN与SPP-net,Fast R-CNN的主要亮点有:Fast R-CNN借助多任务损失函数将物体识别和位置修正合成到一个网络中,不再对网络进行分步训练,不需要大量内存来存储训练过程中特征的数据;用ROI层代替SPP层,可以更高效地训练更新整个网络。
Fast R-CNN 选择 VGG16 的卷积层 conv5 来生成待合并提议窗口来进行目标检测,其中,包括了与相应特征的映射。利用ROI池化层对图像块进行形变转换成固定大小,然后将其输入到全连接层进行分类和定位(检测出目标的位置)。
创新
整个网络(特征提取器,分类器和边界框回归器)可以通过多任务损失 multi-task losses(分类损失和定位损失)进行端到端的训练。
Fast-RCNN很重要的一个贡献是成功的让人们看到了Region Proposal+CNN这一框架实时检测的希望,原来多类检测真的可以在保证准确率的同时提升处理速度,也为后来的Faster-RCNN做下了铺垫。
5、Faster R-CNN
Fast R-CNN存在的瓶颈是选择性搜索找出所有的提议框,这步也非常耗时。测试时, Fast R-CNN 需要 2.3 秒进行预测,而其中 2 秒花费在生成 2000 个ROIs 上。那我们能不能找出一个更加高效的方法来求出这些提议框呢?
解决:加入一个提取边缘的神经网络,也就说找到提议框的工作也交给神经网络来做了。
Faster R-CNN 采用与 Fast R-CNN 相似的设计,不同之处在于它通过内部深度网络取代区域提议方法。 新的区域提议网络(Region Proposal Network, RPN)效率更高。单副图像生成提议窗口只需要 10ms 。
有了RPN执行边框预测的Faster R-CNN执行一次预测任务只需要0.2~0.3s。
Faster R-CNN 网络工作流如下
区域提议网络(Region proposal network)
Faster RCNN抛弃了传统的滑动窗口和SS方法,直接使用RPN生成检测框,这也是Faster R-CNN的巨大优势,能极大提升检测框的生成速度。
6、RetinaNet
https://github.com/fizyr/keras-retinanet
7、Mask-RCNN
未完待续,更新中...
网友评论