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
  mkdir -p /Users/hecom/.local/lib/python2.7/site-packages
  echo ‘import site; site.addsitedir("/usr/local/lib/python2.7/site-packages")‘ >> /Users/hecom/.local/lib/python2.7/site-packages/homebrew.pth

对于强迫症患者

可以全面安装opencv的各种插件,如3方插件,视频插件等:

$brew install opencv3 --with-contrib --with-cuda --with-ffmpeg --with-tbb --with-qt5

可能会遇到很多坑,如

Error: You must ‘brew link texi2html’ before homebrew/science/opencv3 can be installed

当你执行 $brew link texi2html时又会遇错:

Error: Cowardly refusing to ‘sudo brew link‘

You can use brew with sudo, but only if the brew executable is owned by root.

However, this is both not recommended and completely unsupported so do so atyour own risk

说明brew 的权限有问题, 需要解决:

$sudo chown root:wheel ‘which brew’

在Ubuntu上OpenCV3的源码安装

在Ubantu上安装先要做一下准备活动

$ aptitude -f install
$ sudo apt-get update

然后安装编译环境:

$sudo apt-get install build-essential

安装依赖库

$sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev

还要安装python 依赖及其它依赖库

$sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev

获得opencv源代码

git clone https://github.com/Itseez/opencv.git

终于可以编译安装了:

$cd opencv
$cmake -D CMAKE_INSTALL_PREFIX=/home/opencv/build -D CMAKE_BUILD_TYPE=RELEASE   ..

最后,安装python-opencv:

$sudo apt-get install python-opencv

OpenCV的Python环境简单验证

一行代码验证OpenCV的Python环境是否成功:

$python -c “import cv2; print dir(cv2)”

如果输出了很多cv2 的属性和函数名的字典,就表示成功;否则的话,还需要继续填坑。

时间: 2024-12-15 01:48:38

7行Python代码的人脸识别的相关文章

25 行 Python 代码实现人脸识别——OpenCV 技术教程

OpenCV OpenCV 是最流行的计算机视觉库,原本用 C 和 C++ 开发,现在也支持 Python. 它使用机器学习算法在图像中搜索人的面部.对于人脸这么复杂的东西,并没有一个简单的检测能对是否存在人脸下结论,而需要成千上万的特征匹配.算法把人脸识别任务分解成数千个小任务,每个都不难处理.这些任务也被称为分类器. 对于类似于人脸的对象,你或许需要不少于 6000 个分类器,每一个都需要成功匹配(当然,有容错率),才能检测出人脸.但这有一个问题:对于人脸识别,算法从左上角开始计算一个个数据

[转]7行Python代码的人脸识别

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

40行代码的人脸识别实践【转】

转自:http://blog.csdn.net/xingchenbingbuyu/article/details/68482838?ref=myrecommend 版权声明:本文为博主原创文章,转载请联系作者取得授权. 目录(?)[+] 40行代码的人脸识别实践 40行代码的人脸识别实践 前言 一点区分 所用工具 Dlib 人脸识别 前期准备 识别流程 代码 运行结果 前言 很多人都认为人脸识别是一项非常难以实现的工作,看到名字就害怕,然后心怀忐忑到网上一搜,看到网上N页的教程立马就放弃了.这些

Python 使用 face_recognition 人脸识别

Python 使用 face_recognition 人脸识别 官方说明:https://face-recognition.readthedocs.io/en/latest/readme.html 人脸识别 face_recognition 是世界上最简单的人脸识别库. 使用 dlib 最先进的人脸识别功能构建建立深度学习,该模型准确率在99.38%. Python模块的使用 Python可以安装导入 face_recognition 模块轻松操作,对于简单的几行代码来讲,再简单不过了. Pyt

10 行Python 代码,实现 AI 目标检测技术,真给力!

只需10行Python代码,我们就能实现计算机视觉中目标检测. from imageai.Detection import ObjectDetection import os execution_path = os.getcwd() detector = ObjectDetection() detector.setModelTypeAsRetinaNet() detector.setModelPath( os.path.join(execution_path , "resnet50_coco_b

10 行 Python 代码实现模糊查询/智能提示

10 行 Python 代码实现模糊查询/智能提示 1.导语: 模糊匹配可以算是现代编辑器(如 Eclipse 等各种 IDE)的一个必备特性了,它所做的就是根据用户输入的部分内容,猜测用户想要的文件名,并提供一个推荐列表供用户选择. 样例如下: Vim (Ctrl-P) Sublime Text (Cmd-P) '模糊匹配'这是一个极为有用的特性,同时也非常易于实现. 2.问题分析: 我们有一堆字符串(文件名)集合,我们根据用户的输入不断进行过滤,用户的输入可能是字符串的一部分.我们就以下面的

200行Python代码实现2048

200行Python代码实现2048 一.实验说明 1. 环境登录 无需密码自动登录,系统用户名shiyanlou 2. 环境介绍 本实验环境采用带桌面的Ubuntu Linux环境,实验中会用到桌面上的程序: LX终端(LXTerminal): Linux命令行终端,打开后会进入Bash环境,可以使用Linux命令 GVim:非常好用的编辑器,最简单的用法可以参考课程Vim编辑器 3. 环境使用 使用GVim编辑器输入实验所需的代码及文件,使用LX终端(LXTerminal)运行所需命令进行操

基于Tkinter用50行Python代码实现简易计算器

Tkinter一般是python自带的,所以代码不需要其他组件,本程序是在python2.7版本实现的. 主要涉及了tkinter的使用,函数定义和调用,匿名函数的使用,类成员函数定义等python基础知识,适合新手学习. 代码如下: from Tkinter import * #创建横条型框架 def frame(root, side): w = Frame(root) w.pack(side = side, expand = YES, fill = BOTH) return w #创建按钮

一起来写2048(160行python代码)

前言: Life is short ,you need python. --Bruce Eckel 我与2048的缘,不是缘于一个玩家,而是一次,一次,重新的ACM比赛.四月份校赛初赛,第一次碰到2048,两周后决赛再次遇到2048,后来五月份的广东省赛,又出现了2048.在这三次比赛过程中,我一次2048都没玩过..全靠队友的解释,直到昨天,我突然想起写个2048吧,于是下了个2048玩了几盘,之后就開始用python来写了,心想就不写界面了,为了简洁. 我对python并不熟悉,可是我在之前