分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow
也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!
基于SVM的猫咪图片识别器
一、实验介绍
1.1 实验内容
SVM(支持向量机)是一种常用的机器学习分类算法。本课程使用HOG+SVM算法和OpenCV实现一个图片分类器,通过自己训练分类器,达到可以判断任意图片是否是猫咪的效果。
1.2 实验知识点
HOG+SVM
分类器的基本原理OpenCV
处理图片- 训练分类器,以得到适合自己项目的分类器
Python
文件操作
1.3 实验环境
python2.7
Xfce
终端
1.4 适合人群
本课程难度为中等,适合掌握Python
基础的用户,建立对SVM
分类器的基础知识。
1.5 代码获取
你可以通过下面命令将代码下载到实验楼环境中,作为参照对比进行学习。
$ wget http://labfile.oss.aliyuncs.com/courses/794/train.py$ wget http://labfile.oss.aliyuncs.com/courses/794/predict.py
二、实验原理
SVM
(支持向量机)分类器的原理是利用“分类超平面”来实现数据分类。在利用“分类超平面”对数据进行划分时,遵循“间距最大”原则。例如,将二维平面内的两组数据分类,可以确定很多个“分类超平面”,在二维维度下,超平面退化为一条直线:
上图中使用绿线将蓝色圆圈和红色方块进行分类,可以有多种方式。那么根据SVM
原理,哪一条线是最佳分类线呢?答案是,最佳分类线因该是距离蓝色圆圈和红色方框的距离都是最大的那一条,即找到两组数据的最大间距,在最大间距中点画一条线,如下:
如果分类3维数据,我们就使用一个平面来分割数据。如果分类4维数据,我们将会使用一个体来分割数据。以此类推,如果分类1024维数据,我们将使用1023维平面来分割数据。1023维的平面是什么样子?天知道。所以这个时候,将1023维度的平面命名为“分类超平面”。
SVM
是一个由分类超平面定义的判别分类器。也就是说给定一组带标签的训练样本,算法将会输出一个最优超平面对新样本(测试样本)进行分类。
这也是监督类型机器学习的特点,即,把一堆带有标签的数据输入到机器中,让机器根据给定的数据计算出规则,再利用这个规则,去对未知数据进行分类。说白了,就是先积累几年工作经验,然后去工作。
本实验是读入输入图片的灰度图,即黑白的。然后计算该图片的hog
值,将计算得到的结果作为向量来代表该图片。对由很多张图片组成的向量集进行计算,找到最大间距的分类超平面,进而分类数据。
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特征是特别适合于做图像中的人体检测的。
三、开发准备
打开Xfce终端,下载并安装 OpenCV
的相关依赖。
$ sudo pip install numpy$ sudo apt-get install python-opencv
遇到是否安装的询问时,输入y,按回车键继续安装。安装时间较长,并且视网络状态而定。
下载实验所需的图片数据:
$ 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
这三组数据分别是含有猫的图片,没有猫的图片,以及用于测试SVM
分类器的数据集。
下载后,解压得到图片:
$ unzip cat.zip$ unzip other.zip$ unzip predict.zip
这些图片都是从网上下载的。如果想使用自己下载的图片,也没有问题。需要注意爹是,输入到分类器的图片都是固定像素的。我们需要对下载的图片数据进行处理,使其符合我们程序的要求。将大图片裁减成固定像素的小图片的程序如下:
# -*- coding: utf-8 -*-import numpy as npimport cv2from os.path import dirname, join, basenamefrom glob import globnum=0for 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'D:\ECLIPSE-PROJECT\Python\my_opencv\other_64_128\test'+str(num)+'.jpg',res) num=num+1print 'all done!' cv2.waitKey(0)cv2.destroyAllWindows()
使用程序时,请替换输出路径为一个已存在的路径,即替换这一句中的路径:
cv2.imwrite(r'D:\ECLIPSE-PROJECT\Python\my_opencv\other_64_128\test'+str(num)+'.jpg',res)
这段代码会扫描Python
脚本所在的文件夹的子文件夹other
文件夹下的所有.jpg
文件,然后使用OpenCV
读取图片数据,并按照指定的大小进行缩放,将缩放后的结果写入到指定目录下的指定图片中。
四、实验步骤
4.1 训练数据集
首先,我们根据已经分类好的数据集来对分类器进行训练。我们的cat
文件夹下全是猫的照片,而other
文件夹下全不是猫,已经完成了贴标签这个过程了。让程序从这两组数据里学习,计算分类的方法。
使用HOG+SVM
算法进行训练前