;;在“图像特征检测”这一章节中,我们采取检测图像的主要特征的办法,通过单应性来检测这些图像是否存在另一幅图像中。而目标检测与识别,即是通过遍历检测图像各个区域是否有感兴趣的对象,并在已检测到对象的区域中对该对象进行识别。
在该章节中,我们将首先从OpenCV进行行人检测的探讨,然后再利用相关的技术进行猫和狗的目标检测与识别。
;;要实现目标检测,我们需要了解到涉及该方面的技术——梯度直方图(HistogramofOrientedGradient,HOG)、支持向量机与非极大值抑制。;梯度直方图是一种特征描述符,与“图像分割”一章的各个特征描述符SIFT、Fast、ORB为相同类型。HOG在计算直方图时并不是通过颜色值进行计算,而是通过图像局部区域的梯度方向进行计算和统计,从而构建特征。
如图中,首先将图像进行灰度化的预处理,是否进行灰度化处理其实对梯度计算影响并不是很大,彩色图像也可以进行直接计算。在此为了简单起见,从而进行灰度化处理,接着进行计算每一个像素点的梯度值,得到梯度图,如图右下角。
;对梯度图进行水平梯度与竖直梯度的计算,即可获得水平梯度为150-70=80,竖直梯度为110-50=60。如图左和图右分别为处理过的水平梯度图与竖直梯度图。
;将水平梯度图与竖直梯度图进行压缩。例如,创建一个64(8×8)个梯度向量的直方图,然后创建各个方向的箱子(将180°切分为多个20°,则总共为180°/20°=9个箱子),这样即可将64个梯度向量总结到仅9个值,如图所示。;将以上方法对图像所有像素块逐个进行压缩后的梯度直方图进行显示,即可得到我们所需的HOG特征,如图所示。;HOG特征非常强大,它可以被用来和支持向量机分类器SVM结合进行目标检测;也可以使用一个滑窗探测器在图像上滑动检测图像各个区域,并计算各个区域的HOG特征;也可以使用图像金字塔来处理图像的缩放问题。;支持向量机(SVM)用于解决支持分类和回归问题。在此使用SVM对带有标签的训练数据集进行分类,如图所示为SVM示意图,在一个超平面中对所有数据进行分类,实心球与空心球分别代表不同的类别,并且两种类别的数据显然是线性可分的,其中黑色实线为决策边界,决策边界则是对应着一个线性分类器,并为此两种代表不同的类别进行分类。;在大多数情况,大部分的数据并不是线性可分的,则在这种情况中SVM还使用了一种称为KernalTrick(支持向量机的核函数)的技术进行数据的转换。将原始空间中的向量作为输入向量,并返回特征空间中向量的点积(内积)的函数称为核函数。核函数通常表示为:
K(x_i,x_j)=f(x_i),f(x_j)
其中K()为核函数,xi和xj是n维的输入值,为内积,f()是从n维到m维的映射。
;核函数的本质作用为将低维空间的线性不可分类问题,选用恰当的核函数将可以转化为高维空间的线性可分,进而可以在高维空间找到分类的最优边界(超平面),如图所示。
;在机器学习中,有几类常用的核函数用于SVM分类器的训练,并且在OpenCV的SVM中也自带有这几类核函数:;非极大值抑制(Non-MaximumSuppression,NMS),其作用就是抑制不是极大值的元素,也是对图像数据的局部最大搜索。;如图所示的行人检测中,滑动探测器经过滑动提取HOG特征,并且经过分类器分类识别后,每个窗口就会得到一个分数,但是滑动探测器有可能会导致图像中有些窗口与其他窗口存在包含的情况。所以在这时候就需要用到NMS来选取那些邻域里分数最高的窗口,并且抑制住其他分数低的窗口。;OpenCV中具有自带的HOG特征提取函数为HOGDescriptor()函数。以下将以该函数完成行人的检测,并对行人进行标记框选。效果如图。;程序中首先创建一个OpenCV自带的HOGDescriptor()函数,并且采用OpenCV自带的已经训练好的SVM分类器进行图像检测。在进行图像检测时,将图像进行预处理比例缩放,之后采用detectMultiScale()函数进行图像行人检测,再对检测完成后的结果进行非极大值抑制处理(此处采用了imutils库中的非极大值抑制处理函数进行处理),在处理完成后将检测结果进行可视化。;用于提取图像的HOG特征的实例:
第一个参数,tuple类型的winSize,表示遍历图像的每个滑动探测器窗口的大小。
第二个参数,tuple类型的blockSize,表示每个滑动探测器窗口里的块大小。
第三个