您的位置:首页 > 编程语言 > Python开发

基于Python和Opencv的目标检测与特征

2017-08-12 09:46 387 查看
1.目标检测

(1)什么是目标检测?

判断一副图像或者视频的一帧存不存在目标物体,例如检测一幅图片中有没有花,有 没有人脸,或者检测一段视频中行驶过的车辆、行人等 检测完成后,也可以继续往深做目标识别,例如判断检测出的车是什么车,检测出的人脸是谁等等,在今后机器学习算法以及深度学习、人工智能的发展下,对目标的快速精准识别已经成为可能

(2)基本步骤



从上图我们可以看出来,通过对一副输入图像或视频帧先进行特征提取然后再通过一个分类器对其分类,即可得到分类后的结果是否是我们需要得到的目标物体,这两个是目标检测的关键,我们从分类器说起:
分类器:简单的理解就是输入一个张三的特征x,通过一个函数f来判断最后输出的y确实是张三

而我们训练分类器的过程就是给这个分类函数(数学模型)找到一系列最优的参数,使得通过这个函数来判断时能达到最好的分类效果(更高级一点的分类器就加入了学习和自适应的概念使得分类更精准),那么通过什么可以得到这个分类器呢?就是分类算法

提到算法我们不得不提到机器学习的概念,机器学习算法简单来说可以通过对其不同的角度来看分为三类:

①有监督学习(分类算法、回归算法)、无监督学习(聚类)、半监督学习

②分类与回归、标注

③生成模型、判别模型

因为我最近也刚开始学机器学习这部分,具体的以后再谈
训练分类器的算法有:SVM、决策树、knn、Adaboost算法等(比如一般检测行人是HOG特征+SVM算法;Opencv里检测人脸是Haar特征+Adaboost算法;检测拳头一般LBP特征+Adaboost算法)

同时呢,另一个关键的步骤就是特征提取,它包括特征选择和特征提取

针对不同的目标选取不同的特征才是需要解决的首要问题,但其实做到后面你就会发现,其实对特征的选择就是对算法的选择,因为不同的算法他会使用不同的特征,你选择了算法其实也就是选择了某种特征,但要是你想对算法进行改进那就是另外一回事了,你需要创建你自己的一种得到特征的方式

2.特征
(1)什么是特征?

用我自己的话来说就是,当我们要完成某些检测或者其它目的时(例如匹配、识别等等)需要对图像区域进行一个选取、计算的过程,最后得到一个能够帮我们完成这个检测目标的一个描述的东西(描述子、特征)

(2)特征都有些什么?

可以分为颜色特征、纹理特征、形状特征、特征学习等这几大类

①颜色特征:颜色直方图 (常使用HSV颜色空间)------主要应用于图像检索方面

②纹理特征:

(1)HOG(梯度方向直方图):具有图像几何和光学形变的不变性(也就是说对光照变化好) 一般应用:HOG+SVM行人检测

(Haar:一系列的模板,haar特征定义为模板内白色矩形像素和减去黑色矩形像素和)

(2)LBP特征(局部二值模式):具有旋转不变性和灰度不变性 一般应用:SVM等机器学习算法训练分类器,人脸、手掌、拳头等

(LBP:原始的LBP算子定义为在3*3的窗口内,以窗口中心像素为阈值,将相邻的8个像素的灰度值与其 进行比较,若周围像素值大于中心像素值,则该像素点的位置被标记为1,否则为0,把这个8位二进制 数叫做LBP值)

(3)Haar小波特征:具有边缘特征的特性;线性特性;中心特性和对角特性

应用:在opencv中结合Adaboost算法进行人脸检测,检测率很高

(Haar:一系列的模板,haar特征定义为模板内白色矩形像素和减去黑色矩形像素和)

(4)SIFT(尺度不变特征变换):具有尺度不变性、缺点是复杂度高、耗时长(1999年提出)

(5)SURF(Speed-upRobust Features):对SIFT的改进,大体相似、相比之下速度快几倍 (2006年提出)

(6)ORB:Fast关键点+Brief描述符,2011年首次发布、是目前最快的一种描述符

③形状特征:BOW词袋技术(Bag of word),一般应用:BOW+SVM构建的分类器进行目标检测

④特征学习:分为监督学习(分类)和无监督学习(聚类),前者包括神经网络、决策树、SVM等;后者包括主成分分析法、k均值聚类等各种聚类算法

一般常用的特征基本就是上面这些了,接下来我们具体看一下:

Harris角点检测、SIFT、SURF、ORB这几个特征或者特征算法:

①harris角点检测:用sobel算子通过对图像行列变化来边缘检测,且具有旋转不变性,但若在缩放图像时,则会相应的丢失或增加一些角点,造成检测不准确,也就是说需要一种与比例无关的检测方法

②SIFT(尺度不变特征变换):使用Difference of Gaussian(DOG)来检测关键点(即对同一图像使用不同的高斯滤波器),得到一系列关键点,并且会对关键点周围的区域计算一个特征向量(在图片上用方向来描述),得到一系列对应的描述符

③SURF:用快速Hessian算法来检测关键点(即用每个像素的Hessian矩阵行列式的近似值构成),并且跟SIFT一样计算得到一系列描述符

④ORB(Oriented Brief):Fast关键点检测技术+基于Brief描述符的技术(Brief也是一种描述子),同样的,得到的特征也是关键点+描述符的形式

可以看到,正是因为harris角点的不足之处,才有了后面这几个新的改进特征,基本都是关键点+描述符的形式来对其进行描述,他们用的最多的地方是在特征匹配上

说了这么多,我们看看这几个特征提取出来都是什么样子吧!~

1.harris角点检测



可以看到,haris角点对这种格子即使是手画的格子都能够很好地检测出角点,但在我最近检测的下面这个例子有可能是光线的原因,检测效果不太理想,也可以看看



2.sift尺度不变特征



具体都是类似于这种,图片中不只检测到了关键点,还画出了关键点周围的描述符和特征方向,至于其他SURF和ORB类似上图
4000

这几个特征由于其尺度不变等特性,主要应用在特征匹配上面,特征匹配应用的面就比较广了,可以做特定的检测(例如通过纹身来找潜在犯人)、也可以用在视频跟踪中求3维到二维平面的投影畸变,也就是在无人机、机器人自主导航时的航向校正,通过前后帧的特征匹配求单应性矩阵,也就是相机标定里的旋转R和平移矩阵t

应用很是广泛,值得重点学习!

在opencv中主要有这么几个匹配算法:

①Brute-Force暴力匹配(描述符匹配方法):比较两个描述符,产生匹配结果的列表,每次比较都会给出一个距离值,把这些距离存到列表中

②Knn最近邻匹配算法

③由knn推广出的FLANN匹配(速度最快):(FLANN is alibrary for perfoming fast approxiamate nearest neghbour searches in high dimensional spaces)

基于c++写的一个库,在大量数据情况下,可以根据数据本身来选择合适的算法处理数据,之后进行knn匹配

下面还是举几个例子吧:
1.knn匹配:



SIFT做的knn匹配

SURF做的knn匹配

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息