《实验楼:基于SVM的猫咪图片识别器》实验报告(更新中)
一 知识储备
首先要理解SVM和HOG的基本原理和思想。
SVM
是一个由分类超平面定义的判别分类器。也就是说给定一组带标签的训练样本,算法将会输出一个最优超平面对新样本(测试样本)进行分类。SVM的思想和感知机类似,也就是找出一条能分割两类的线,让两者离这个线的距离最远。
hog
的全称是Histogram of Oriented Gradient, HOG
,即方向梯度直方图
。它是一种在计算机视觉和图像处理中用来进行物体检测的特征描述子。它通过计算和统计图像局部区域的梯度方向直方图来构成特征。
Hog特征结合SVM分类器已经被广泛应用于图像识别中,尤其在行人检测中获得了极大的成功。HOG+SVM进行行人检测的方法是法国研究人员Dalal在2005的CVPR上提出的,今天的很多行人检测算法基本都是以HOG+SVM的思路。
- 主要思想:在一副图像中,局部目标的表象和形状(appearance and shape)能够被梯度或边缘的方向密度分布很好地描述。(本质:梯度的统计信息,而梯度主要存在于边缘的地方)。
- 具体的实现方法是:首先将图像分成小的连通区域,我们把它叫细胞单元。然后采集细胞单元中各像素点的梯度的或边缘的方向直方图。最后把这些直方图组合起来就可以构成特征描述器。
- 提高性能:把这些局部直方图在图像的更大的范围内(我们把它叫区间或block)进行对比度归一化(contrast-normalized),所采用的方法是:先计算各直方图在这个区间(block)中的密度,然后根据这个密度对区间中的各个细胞单元做归一化。通过这个归一化后,能对光照变化和阴影获得更好的效果。
- 优点:与其他的特征描述方法相比,HOG有很多优点。首先,由于HOG是在图像的局部方格单元上操作,所以它对图像几何的和光学的形变都能保持很好的不变性,这两种形变只会出现在更大的空间领域上。其次,在粗的空域抽样、精细的方向抽样以及较强的局部光学归一化等条件下,只要行人大体上能够保持直立的姿势,可以容许行人有一些细微的肢体动作,这些细微的动作可以被忽略而不影响检测效果。因此HOG特征是特别适合于做图像中的人体检测的。
二 实验内容
本实验是读入输入图片的灰度图。然后计算该图片的hog
值,将计算得到的结果作为向量来代表该图片。
对由很多张图片组成的向量集进行计算,找到最大间距的分类超平面,进而分类数据。
三 环境设置
这一步,我们配置opencv环境和其依赖,下载数据并对图片进行处理,调整图片的大小,设置程序的输出路径。
首先,准备opencv环境,下载numpy以及python-opencv包。
$ sudo pip install numpy $ sudo apt-get update $ sudo apt-get install python-opencv
接下来,下载数据:
$ wget http://labfile.oss.aliyuncs.com/courses/794/cat.zip $ wget http://labfile.oss.aliyuncs.com/courses/794/other.zip $ wget http://labfile.oss.aliyuncs.com/courses/794/predict.zip
其中:
- cat-含有猫的图片
- other-没有猫的图片
- predict-测试数据
解压数据
$ unzip cat.zip $ unzip other.zip $ unzip predict.zip
输入到分类器的图片都是固定像素的。我们需要对下载的图片数据进行处理,使其符合我们程序的要求。
将大图片裁减成固定像素的小图片的程序如下:
# -*- coding: utf-8 -*- import numpy as np import cv2 from os.path import dirname, join, basename from glob import glob num=0 for fn in glob(join(dirname(__file__)+'other', '*.jpg')): img = cv2.imread(fn) res=cv2.resize(img,(64,128),interpolation=cv2.INTER_AREA) cv2.imwrite(r'./otherprepocess'+str(num)+'.jpg',res) num=num+1 print 'all done!' cv2.waitKey(0) cv2.destroyAllWindows()
第一次运行的时候出现了报错,然后输入以下指令就可以了。
最后得到:
别忘了对cat和predict数据集做相同的操作。
四 程序实验
4.1 训练数据集
使用HOG+SVM
算法进行训练前,需要先计算每张图片的HOG
值以得到供SVM
分类器使用的输入向量。计算该值的算法实现的一般过程为:
- 灰度化(
OpenCV
处理图像时,一般都处理为灰度图像,忽略颜色干扰) - 采用Gamma校正法对输入图像进行颜色空间的标准化(归一化);目的是调节图像的对比度,降低图像局部的阴影和光照变化所造成的影响,同时可以抑制噪音的干扰;
- 计算图像每个像素的梯度(包括大小和方向);主要是为了捕获轮廓信息,同时进一步弱化光照的干扰。
- 将图像划分成小cells(例如6*6像素/cell);
- 统计每个cell的梯度直方图(不同梯度的个数),即可形成每个cell的descriptor;
- 将每几个cell组成一个block(例如3*3个cell/block),一个block内所有cell的特征descriptor串联起来便得到该block的HOG特征descriptor。
- 将图像image内的所有block的HOG特征descriptor串联起来就可以得到该image(你要检测的目标)的HOG特征descriptor了。这个就是最终的可供分类使用的特征向量了。