7 行 Python 的人脸识别

  随着去年alphago 的震撼表现,AI 再次成为科技公司的宠儿。AI涉及的领域众多,图像识别中的人脸识别是其中一个有趣的分支。百度的BFR,Face++的开放平台,汉王,讯飞等等都提供了人脸识别的API,对于老码农而言,自己写一小段代码,来看看一张图片中有几个人,没有高大上,只是觉得好玩,而且只需要7行代码。

  import cv2

  face_patterns = cv2.CascadeClassifier('/usr/local/opt/opencv3/share/OpenCV/haarcascades/haarcascade_frontalface_default.xml')

  sample_image = cv2.imread('/Users/abel/201612.jpg')

  faces = face_patterns.detectMultiScale(sample_image,scaleFactor=1.1,minNeighbors=5,minSize=(100, 100))

  for (x, y, w, h) in faces:

  cv2.rectangle(sample_image, (x, y), (x+w, y+h), (0, 255, 0), 2)

  cv2.imwrite('/Users/abel/201612_detected.png', sample_image);

  第1行 引入 OpenCV

  开源是伟大的,使我们视野更开阔,而且不用重复造轮子。这里没有用PIL,再结合特定算法,而是直接使用了OpenCV(http://opencv.org)。OpenCV是一个基于BSD许可发行的跨平台计算机视觉库,可以运行在Linux、Windows和Mac OS操作系统上,轻量而且高效,用C/C++编写,同时提供了Python、Ruby、MATLAB等接口,实现了图像处理和计算机视觉方面的很多通用算法。

  第2行 加载分类器 cv2.CascadeClassifier

  CascadeClassifier是Opencv中做人脸检测时候的一个级联分类器,该类中封装的是目标检测机制即滑动窗口机制+级联分类器的方式。数据结构包括Data和FeatureEvaluator两个主要部分。Data中存储的是从训练获得的xml文件中载入的分类器数据;而FeatureEvaluator中是关于特征的载入、存储和计算。这里采用的训练文件是OpenCV中默认提供的haarcascade frontalface default.xml。至于Haar,LBP的具体原理,可以参考opencv的相关文档,简单地,可以理解为人脸的特征数据。

  第3行 加载目标图片 imread

  人脸识别系统一般分为:人脸图像采集、人脸图像预处理、人脸图像特征提取以及匹配与识别。 简化起见,之间读入图片,这是一张去年中生代北京闭门会的集体照。

  第4行 多尺度检测 detectMultiScale

  调用 CascadeClassifier 中的调detectMultiScale函数进行多尺度检测,多尺度检测中会调用单尺度的方法detectSingleScale。 参数说明:

  scaleFactor 是 图像的缩放因子

  minNeighbors 为每一个级联矩形应该保留的邻近个数,可以理解为一个人周边有几个人脸

  minSize 是检测窗口的大小

  这些参数都是可以针对图片进行调整的,处理结果返回一个人脸的矩形对象列表。

  第5行 和 第6行 为每个人脸画一个框

  循环读取人脸的矩形对象列表,获得人脸矩形的坐标和宽高, 然后在原图片中画出该矩形框,调用的是OpenCV的rectangle 方法,其中矩形框的颜色等是可调整的。

  第7行 保存检测后的结果

  万事具备了,调用imwrite,将检测后的结果保存到指定的位置。结果图如下:

  神秘感不是这7行代码,而是OpenCV中的相关实现,OpenCV的中文网也是一个学习体会的好场所。

  因此,7行代码只是个噱头,真正的核心是OpenCV。然后,安装OpenCV环境的时候就是有一些坑,特别记录一下。

  基于Mac的OpenCV环境

  建议使用Brew 安装,如果没有安装brew,先执行下面命令:

  $/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)”

  然后,指定目标仓库 $brew tap homebrew/science

  安装OpenCV3 $brew install opencv3

  安装速度取决于网络,安装完毕需要绑定Python开发环境,有多种土方法:

  1)增加环境变量,将opencv 的site-packages 添加到PYTHONPATH中

  2)使用ln 软连接,将cv2.so 链接到python 环境的 site-packages中

  3)直接cp cv2.so 到 python 环境的 site-packages 目录下

  更简单地是执行如下命令:

  echo /usr/local/opt/opencv3/lib/python2.7/site-packages >> /usr/local/lib/python2.7/site-packages/opencv3.pth