张毅宁
(鞍山师范学院 物理科学与技术学院,辽宁 鞍山 114007)
基于Python语言的模式识别应用
张毅宁
(鞍山师范学院 物理科学与技术学院,辽宁 鞍山 114007)
摘要以模式识别中英文文字识别和人脸检测为例,利用PIL库、pytesser 库和OpenCV库实现了图像灰度转换、降噪处理、文字识别和目标检测.应用表明,Python处理实验数据的方法简便灵活,表征数据图形直观明了,适合在数字图像处理课程的模式识别章节中应用.
关键词Python;英文文字识别;人脸检测
针对图像模式识别问题的研究,国内学者多使用MATLAB作为分析工具.与MATLAB相比Python是一门更易学、更严谨的程序设计语言,最重要的是其开源和免费.Python语言应用灵活、广泛,在图像处理中VideoCapture库、PIL库(Python Imaging Library Python)和pytesser 库给研究者们留下最初印象,而后Scikit Learn突起,其构建于NumPy、SciPy和matplotlib基础上,凭借通用性、开源性成为简单高效的数据挖掘和数据分析工具[1].还有OpenCV(Open Source Computer Vision Library)开源跨平台计算机视觉库表现也尤为突出,已经实现了的图像处理和计算机视觉方面的通用算法,其用C++语言编写,它的主要接口包括C、C++、Python、Java 和 MATLAB[2].
1基本英文文字识别
文字识别是图像模式识别应用中首先要研究的基本问题.在文字识别中更多的是利用K最近邻(kNN,k-Nearest Neighbor)分类算法和BP网络(Back-Propagation Networks)算法进行手写体字符识别,本文中主要利用PIL库、pytesser库(Google OCR开源项目的一个模块,可将图片中的英文文字转换成文本)和Tesseract(开源的OCR识别引擎,初由HP实验室研发,后经Google改进)库,对如图1带噪声的文字图像(“text01.tif”)进行文字识别.基本英文文字识别过程简单,主要包括图像灰度转换、降噪和文字识别3个过程.其可用于验证码识别应用.文字的旋转、缩放与形变以及汉字不在本次研究范围.Python代码如下:
from PIL import Image,ImageEnhance,ImageFilter #导入PIL中的相关库#
import sys
sys.path.append("pytesser")#将pytesser库添加到系统库中#
from pytesser import *
im = Image.open('text01.tif')#加载噪声英文文字图像#
imggry=im.convert('L')#把彩色图像转化为灰度图像#
im = im.filter(ImageFilter.MedianFilter())#过滤噪声#
enhancer = ImageEnhance.Contrast(im)
img = enhancer.enhance(2) #加强图像对比度#
img.save("g2.jpg")#存储降噪后英文文字图像如图2#
text=image_file_to_string("g2.jpg")
print text #读出英文文字#
图1噪声英文文字图像图2降噪后英文文字图像
2人脸检测
人脸检测属于目标检测,是自动人脸识别系统中的一个关键环节.主要过程是对于任意一幅给定的图像,采用一定的策略对其进行搜索以确定其中是否含有人脸,并返回人脸在图像中的位置、大小和姿态[3].在人脸检测中可以利用其主成分分析来降维和支持向量机来分类进行模式识别,而本文借助开源跨平台计算机视觉库OpenCV的haar分类器[3]实现人脸检测.
2.1基本方法
人脸检测方法分基于知识和基于统计两类[4].前者主要利用先验知识将人脸看作器官特征的组合,根据眼睛、眉毛、嘴巴、鼻子等器官的特征以及相互之间的几何位置关系来检测人脸,包括模板匹配、人脸特征、形状与边缘、纹理特性、颜色特征.后者将人脸看作一个整体的二维像素矩阵,从统计的观点通过大量人脸图像样本构造人脸模式空间,根据相似度量来判断人脸是否存在,包括神经网络方法ANN(Artificial Neural Network)、支持向量机SVM(Support Vector Machine)、隐马尔可夫模型HMM(Hidden Markov Model)、迭代算法Adaboost算法.其中,Adaboost学习算法利用特征选择和分类器训练,把弱分类器组合成强分类器,是目前人脸检测最为成功的算法之一[5],对应在OpenCV中,物体检测上使用的是haar分类器,其主要过程是:使用Haar-like特征做检测;使用积分图(Integral Image)对Haar-like特征求值进行加速;使用AdaBoost算法训练区分人脸和非人脸的强分类器;使用筛选式级联把强分类器级联到一起提高准确率.
2.2基本过程
用一张集体合影照片(第五届索尔维物理会议)做为识别目标,验证对一张或多张人脸的识别能力.基本过程Python代码如下:
import cv2
import numpy as np
frame= cv2.imread("wuli.jpg")#读取当前文件夹下的图片#
classfier=cv2.CascadeClassifier("haarcascade_frontalface_alt_tree.xml")#定义分类器#
while 1:
faceRects=detect(frame)# 调用2.2.2检测目标函数进行检测#
if len(faceRects)>0:
draw_rects(frame,faceRects) #调用2.2.3目标标记函数#
cv2.imshow("zzqtest",frame) #显示图像#
cv2.waitKey(0) #等待键盘中断退出#
cv2.imwrite('out.jpg',frame)#保存被标记过的目标文件#
cv2.destroyWindow("zzqtest")
2.3检测目标
先将彩色图转为灰度图,去掉一些噪声信号减少数据量,然后将这个灰度图的对比度增高,使暗的地方更暗,亮的地方更亮一些,以便提高图片识别率.Python代码如下:
def detect(frame):
size=frame.shape[:2]#获得当前桢彩色图像的大小#
image=np.zeros(size,dtype=np.float16)#定义一个与当前桢图像大小相同的灰度图像矩阵#
image = cv2.cvtColor(frame,cv2.cv.CV_BGR2GRAY)#将当前桢图像转换成灰度图像#
cv2.equalizeHist(image,image)#灰度图像进行直方图等距化#
minSize=(size [0]/8,size [1]/8)#定义识别面部最小图是捕获图像大小的1/8,经验值,需调整#
faceRects = classfier.detectMultiScale(image,1.3,5,cv2.CASCADE_SCALE_IMAGE,minSize)#人脸检测#
return faceRects
detectMultiScale函数中image表示的是要检测的输入图像,1.3表示每次图像尺寸减小的比例为1.3,5表示每一个目标至少要被检测到5次才算是真的目标(因为周围的像素和不同的窗口大小都可以检测到人脸),cv2.CASCADE_SCALE_IMAGE表示不是缩放分类器来检测,而是缩放图像,minSize为目标最小尺寸.
OpenCV中,对于人脸检测的模型已经建立为一个XML文件,其中包含了上面提到的harr特征的分类器的训练结果,只需要将待检测图片和级联表一同传递给OpenCV的目标检测算法即可得到一个检测到的人脸的集合[6].
2.4标记目标
图3 第五届索尔维物理会议人脸检测结果图
在图片上绘制矩形做为人脸标记,检测结果如图3.Python代码如下:
def draw_rects(img,rects):
color = (255,255,0) #定义画线颜色#
for x,y,w,h in rects:#对每一个人脸画矩形框#
cv2.rectangle(img,(x,y),(x+w,y+h),color)
出席第五届索尔维物理会议学术泰斗中有爱因斯坦,郎之万,洛仑兹、居里夫人等22名被检测出;德拜,薛定谔,海森堡等7人没有被识别.
3小结
从Python语言英文文字识别和人脸检测中的实验应用中,可以看出Python在机器学习或模式识别中,代码简洁,使用快捷方便又不失基本理论的验证,可以很大程度上提高模式识别章节的课堂教学质量.不仅Python执行效率高于MATHLAB[7],而且最重要的是Python是免费的,相对而言是最值得应用和推广的.
参考文献
[1] Gavin Hackeling.Mastering Machine Learning with scikit-learn[M].Birmingham:Packt Publishing,2014.
[2] 百度百科.人脸检测技术[EB/OL].http://baike.baidu.com,2015-06-10.
[3] 陈胜勇.基于OpenCV的计算机视觉技术实现[M].北京:科学技术出版社,2008.
[4] Joseph Howse.OpenCV Computer Vision with Python[M].Birmingham:Packt Publishing,2013.
[5] zouxy09的专栏.浅析人脸检测之Haar分类器方法[EB/OL].http://blog.csdn.net/zouxy09/article/details/7922923,2015-06-10.
[6] abruzzi.人脸检测原理及示例[EB/OL].http://www.iteye.com/topic/463668,2015-06-10.
[7] 小码哥.python使用opencv进行人脸识别[EB/OL].http://www.cnblogs.com/ma6174/archive/2013/03/31/2991315.html,2015-06-10.
(责任编辑:张冬冬)
Recognition application based on Python language
ZHANG Yining
(School of Physical Science and Technology,Anshan Normal University,Anshan Liaoning 114007,China)
AbstractTaking the example of the English recognition face detection in machine learning,by using the PIL library,pytesser library and OpenCV library,this paper realizes Image gray transition,noise reduction processing,word recognition and target detection.It shows that experimental data processing is simple and flexible and data graphical is intuitive and convenient.Therefore,this method should be widely used in the Pattern Recognition in Digital Image Processing course.
Key wordsPython;english recognition;face detection
收稿日期2016-01-05
基金项目2014年辽宁省普通高等学校本科教育教学改革研究项目(UPRP20140403):面向工程实践,提高专业核心能力-电子类专业;2015年鞍山师范学院校级科研项目(15kjxm04):大学生教育机器人竞赛人才培养模式研究.
作者简介张毅宁(1974-),男,辽宁海城人,鞍山师范学院物理科学与技术学院实验师.
中图分类号G434
文献标识码A文章篇号1008-2441(2016)02-0074-03