50行Python代码实现人脸检测功能


Posted in Python onJanuary 23, 2018

50行Python代码实现人脸检测功能 

现在的人脸识别技术已经得到了非常广泛的应用,支付领域、身份验证、美颜相机里都有它的应用。用iPhone的同学们应该对下面的功能比较熟悉

50行Python代码实现人脸检测功能 

iPhone的照片中有一个“人物”的功能,能够将照片里的人脸识别出来并分类,背后的原理也是人脸识别技术。

这篇文章主要介绍怎样用Python实现人脸检测。人脸检测是人脸识别的基础。人脸检测的目的是识别出照片里的人脸并定位面部特征点,人脸识别是在人脸检测的基础上进一步告诉你这个人是谁。

好了,介绍就到这里。接下来,开始准备我们的环境。

准备工作

本文的人脸检测基于dlib,dlib依赖Boost和cmake,所以首先需要安装这些包,以Ubuntu为例:

$ sudo apt-get install build-essential cmake 
$ sudo apt-get install libgtk-3-dev 
$ sudo apt-get install libboost-all-dev

我们的程序中还用到numpy,opencv,所以也需要安装这些库:

$ pip install numpy 
$ pip install scipy 
$ pip install opencv-python 
$ pip install dlib

人脸检测基于事先训练好的模型数据,从这里可以下到模型数据

http://dlib.net/files/shape_predictor_68_face_landmarks.dat.bz2

下载到本地路径后解压,记下解压后的文件路径,程序中会用到。

dlib的人脸特征点

上面下载的模型数据是用来估计人脸上68个特征点(x, y)的坐标位置,这68个坐标点的位置如下图所示

50行Python代码实现人脸检测功能 

我们的程序将包含两个步骤:

第一步,在照片中检测人脸的区域

第二部,在检测到的人脸区域中,进一步检测器官(眼睛、鼻子、嘴巴、下巴、眉毛)

人脸检测代码

我们先来定义几个工具函数:

def rect_to_bb(rect): 
  x = rect.left() 
  y = rect.top() 
  w = rect.right() - x 
  h = rect.bottom() - y   
  return (x, y, w, h)

这个函数里的rect是dlib脸部区域检测的输出。这里将rect转换成一个序列,序列的内容是矩形区域的边界信息。

def shape_to_np(shape, dtype="int"): 
  coords = np.zeros((68, 2), dtype=dtype)   
  for i in range(0, 68): 
      coords[i] = (shape.part(i).x, shape.part(i).y)   
  return coords

这个函数里的shape是dlib脸部特征检测的输出,一个shape里包含了前面说到的脸部特征的68个点。这个函数将shape转换成Numpy array,为方便后续处理。

def resize(image, width=1200): 
  r = width * 1.0 / image.shape[1] 
  dim = (width, int(image.shape[0] * r)) 
  resized = cv2.resize(image, dim, interpolation=cv2.INTER_AREA)   
  return resized

这个函数里的image就是我们要检测的图片。在人脸检测程序的最后,我们会显示检测的结果图片来验证,这里做resize是为了避免图片过大,超出屏幕范围。

接下来,开始我们的主程序部分

import sys import numpy as np 
import dlib import cv2 
if len(sys.argv) < 2:   
  print "Usage: %s <image file>" % sys.argv[0] 
  sys.exit(1) 
image_file = sys.argv[1] 
detector = dlib.get_frontal_face_detector() 
predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")

我们从sys.argv[1]参数中读取要检测人脸的图片,接下来初始化人脸区域检测的detector和人脸特征检测的predictor。shape_predictor中的参数就是我们之前解压后的文件的路径。

image = cv2.imread(image_file) 
image = resize(image, width=1200) 
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) 
rects = detector(gray, 1)

在检测特征区域前,我们先要检测人脸区域。这段代码调用opencv加载图片,resize到合适的大小,转成灰度图,最后用detector检测脸部区域。因为一张照片可能包含多张脸,所以这里得到的是一个包含多张脸的信息的数组rects。

for (i, rect) in enumerate(rects): 
  shape = predictor(gray, rect) 
  shape = shape_to_np(shape) 
  (x, y, w, h) = rect_to_bb(rect) 
  cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2) 
  cv2.putText(image, "Face #{}".format(i + 1), (x - 10, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)   
for (x, y) in shape: 
      cv2.circle(image, (x, y), 2, (0, 0, 255), -1) 
cv2.imshow("Output", image) 
cv2.waitKey(0)

对于每一张检测到的脸,我们进一步检测脸部的特征(鼻子、眼睛、眉毛等)。对于脸部区域,我们用绿色的框在照片上标出;对于脸部特征,我们用红色的点标出来。

最后我们把加了检测标识的照片显示出来,waitKey(0)表示按任意键可退出程序。

以上是我们程序的全部

测试

接下来是令人兴奋的时刻,检验我们结果的时刻到来了。

下面是原图

50行Python代码实现人脸检测功能 

下面是程序识别的结果

50行Python代码实现人脸检测功能 

可以看到脸部区域被绿色的长方形框起来了,脸上的特征(鼻子,眼睛等)被红色点点标识出来了。

总结

以上所述是小编给大家介绍的50行Python代码实现人脸检测功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
解析Mac OS下部署Pyhton的Django框架项目的过程
May 03 Python
浅析Python中元祖、列表和字典的区别
Aug 17 Python
Python中matplotlib中文乱码解决办法
May 12 Python
python pandas中DataFrame类型数据操作函数的方法
Apr 08 Python
对python插入数据库和生成插入sql的示例讲解
Nov 14 Python
Python正则表达式实现简易计算器功能示例
May 07 Python
关于torch.optim的灵活使用详解(包括重写SGD,加上L1正则)
Feb 20 Python
快速解决jupyter启动卡死的问题
Apr 10 Python
利用jupyter网页版本进行python函数查询方式
Apr 14 Python
关于matplotlib-legend 位置属性 loc 使用说明
May 16 Python
pytorch快速搭建神经网络_Sequential操作
Jun 17 Python
一文轻松掌握python语言命名规范规则
Jun 18 Python
Python基于OpenCV实现视频的人脸检测
Jan 23 #Python
Python求出0~100以内的所有素数
Jan 23 #Python
python之matplotlib学习绘制动态更新图实例代码
Jan 23 #Python
彻底搞懂Python字符编码
Jan 23 #Python
Python实现PS滤镜的万花筒效果示例
Jan 23 #Python
python处理csv数据动态显示曲线实例代码
Jan 23 #Python
Python+matplotlib实现华丽的文本框演示代码
Jan 22 #Python
You might like
PHP的substr_replace将指定两位置之间的字符替换为*号
2011/05/04 PHP
php警告Creating default object from empty value 问题的解决方法
2014/04/02 PHP
PHP命令行脚本接收传入参数的三种方式
2014/08/20 PHP
CI框架学习笔记(二) -入口文件index.php
2014/10/27 PHP
详解php伪造Referer请求反盗链资源
2019/01/24 PHP
PHP+RabbitMQ实现消息队列的完整代码
2019/03/20 PHP
Laravel 将数据表的数据导出,并生成seeds种子文件的方法
2019/10/09 PHP
兼容多浏览器的iframe自适应高度(ie8 、谷歌浏览器4.0和 firefox3.5.3)
2009/11/04 Javascript
使用js获取QueryString的方法小结
2010/02/28 Javascript
Jquery图形报表插件 jqplot简介及参数详解
2012/10/10 Javascript
jquery全选/全不选/反选另一种实现方法(配合原生js)
2013/04/07 Javascript
JavaScript中的依赖注入详解
2015/03/18 Javascript
JQuery实现的图文自动轮播效果插件
2015/06/19 Javascript
jQuery实现html table行Tr的复制、删除、计算功能
2017/07/10 jQuery
ES6学习之变量的两种命名方法示例
2017/07/18 Javascript
使用jQuery实现购物车结算功能
2017/08/15 jQuery
微信小程序实现跟随菜单效果和循环嵌套加载数据
2017/11/21 Javascript
vue.js 底部导航栏 一级路由显示 子路由不显示的解决方法
2018/03/09 Javascript
解决layui动态加载复选框无法选中的问题
2019/09/20 Javascript
js DOM的事件常见操作实例详解
2019/12/16 Javascript
JavaScript 接口原理与用法实例详解
2020/05/12 Javascript
使用Python编写一个简单的tic-tac-toe游戏的教程
2015/04/16 Python
使用FastCGI部署Python的Django应用的教程
2015/07/22 Python
Python递归函数定义与用法示例
2017/06/02 Python
详解python上传文件和字符到PHP服务器
2017/11/24 Python
python用WxPython库实现无边框窗体和透明窗体实现方法详解
2020/02/21 Python
jupyter notebook 恢复误删单元格或者历史代码的实现
2020/04/17 Python
Keras 实现加载预训练模型并冻结网络的层
2020/06/15 Python
keras.layer.input()用法说明
2020/06/16 Python
Europcar比利时:租车
2019/08/26 全球购物
小区门卫值班制度
2014/01/24 职场文书
财务部副经理岗位职责
2014/03/14 职场文书
青春飞扬演讲稿
2014/09/11 职场文书
Django对接elasticsearch实现全文检索的示例代码
2021/08/02 Python
Jpa Specification如何实现and和or同时使用查询
2021/11/23 Java/Android
Python实现学生管理系统并生成exe可执行文件详解流程
2022/01/22 Python