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

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

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个坐标点的位置如下图所示

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

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

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

人脸检测代码

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

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代码实现人脸检测功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

您可能感兴趣的文章:

  • python中使用OpenCV进行人脸检测的例子
  • python结合opencv实现人脸检测与跟踪
  • python利用OpenCV2实现人脸检测
  • Python+OpenCV人脸检测原理及示例详解
  • Python基于OpenCV实现视频的人脸检测
(0)

相关推荐

  • Python基于OpenCV实现视频的人脸检测

    本文实例为大家分享了基于OpenCV实现视频的人脸检测具体代码,供大家参考,具体内容如下 前提条件 1.摄像头 2.已安装Python和OpenCV3 代码 import cv2 import sys import logging as log import datetime as dt from time import sleep cascPath = "haarcascade_frontalface_default.xml" faceCascade = cv2.CascadeCla

  • Python+OpenCV人脸检测原理及示例详解

    关于opencv OpenCV 是 Intel 开源计算机视觉库 (Computer Version) .它由一系列 C 函数和少量 C++ 类构成,实现了图像处理和计算机视觉方面的很多通用算法. OpenCV 拥有包括 300 多个 C 函数的跨平台的中.高层 API .它不依赖于其它的外部库 -- 尽管也可以使用某些外部库. OpenCV 对非商业应用和商业应用都是免费 的.同时 OpenCV 提供了对硬件的访问,可以直接访问摄像头,并且 opencv 还提供了一个简单的 GUI(graph

  • python利用OpenCV2实现人脸检测

    最近,带领我的学生进行一个URTP项目设计,需要进行人脸识别.由于现在的OpenCV已经到了2.X版本,因此就不想用原来的1.X版本的代码,而网上存在的代码都是1.X版本的代码,尝试自己写一段2.X版本的代码,反复查阅资料,今天终于测试成功(很明显2.X版本的代码要比1.X的代码更简单),供大家好参考,代码如下:(2017年5月12日在python3.6.1下做一简单的修改) import cv2 import numpy as np cv2.namedWindow("test")#命

  • python结合opencv实现人脸检测与跟踪

    模式识别课上老师留了个实验,在VC++环境下利用OpenCV库编程实现人脸检测与跟踪. 然后就开始下载opencv和vs2012,再然后,配置了好几次还是配置不成功,这里不得不吐槽下微软,软件做这么大,这么难用真的好吗? 于是就尝试了一下使用python完成实验任务,大概过程就是这样子的: 首先,配置运行环境: 下载opencv和python的比较新的版本,推荐opencv2.4.X和python2.7.X. 直接去官网下载就ok了,python安装时一路next就行,下载的opencv.exe

  • python中使用OpenCV进行人脸检测的例子

    OpenCV的人脸检测功能在一般场合还是不错的.而ubuntu正好提供了python-opencv这个包,用它可以方便地实现人脸检测的代码. 写代码之前应该先安装python-opencv: 复制代码 代码如下: $ sudo apt-get install python-opencv 具体原理就不多说了,可以参考一下这篇文章.直接上源码. 复制代码 代码如下: #!/usr/bin/python# -*- coding: UTF-8 -*- # face_detect.py # Face De

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

    现在的人脸识别技术已经得到了非常广泛的应用,支付领域.身份验证.美颜相机里都有它的应用.用iPhone的同学们应该对下面的功能比较熟悉 iPhone的照片中有一个"人物"的功能,能够将照片里的人脸识别出来并分类,背后的原理也是人脸识别技术. 这篇文章主要介绍怎样用Python实现人脸检测.人脸检测是人脸识别的基础.人脸检测的目的是识别出照片里的人脸并定位面部特征点,人脸识别是在人脸检测的基础上进一步告诉你这个人是谁. 好了,介绍就到这里.接下来,开始准备我们的环境. 准备工作 本文的人

  • 50行Python代码获取高考志愿信息的实现方法

    最近遇到个任务,需要将高考志愿信息保存成Excel表格,BOSS丢给我一个网址表格之后就让我自己干了.虽然我以前也学习过Python编写爬虫的知识,不过时间长了忘了,于是摸索了一天之后终于完成了任务.不得不说,Python干这个还是挺容易的,最后写完一看代码,只用了50行就完成了任务. 准备工作 首先明确一下任务.首先我们要从网址表格中读取到一大串网址,然后访问每个网址,获取到页面上的学校信息,然后将它们在写到另一个Excel中.显然,我们需要一个爬虫库和一个Excel库来帮助我们完成任务. 第

  • 使用50行Python代码从零开始实现一个AI平衡小游戏

    集智导读: 本文会为大家展示机器学习专家 Mike Shi 如何用 50 行 Python 代码创建一个 AI,使用增强学习技术,玩耍一个保持杆子平衡的小游戏.所用环境为标准的 OpenAI Gym,只使用 Numpy 来创建 agent. 各位看官好,我(作者 Mike Shi--译者注)将在本文教大家如何用 50 行 Python 代码,教会 AI 玩一个简单的平衡游戏.我们会用到标准的 OpenAI Gym 作为测试环境,仅用 Numpy 创建我们的 AI,别的不用. 这个小游戏就是经典的

  • 50行Python代码实现视频中物体颜色识别和跟踪(必须以红色为例)

    目前计算机视觉(CV)与自然语言处理(NLP)及语音识别并列为人工智能三大热点方向,而计算机视觉中的对象检测(objectdetection)应用非常广泛,比如自动驾驶.视频监控.工业质检.医疗诊断等场景. 目标检测的根本任务就是将图片或者视频中感兴趣的目标提取出来,目标的识别可以基于颜色.纹理.形状.其中颜色属性运用十分广泛,也比较容易实现.下面就向大家分享一个我做的小实验---通过OpenCV的Python接口来实现从视频中进行颜色识别和跟踪. 下面就是我们完整的代码实现(已调试运行): i

  • 只用50行Python代码爬取网络美女高清图片

    一.技术路线 requests:网页请求 BeautifulSoup:解析html网页 re:正则表达式,提取html网页信息 os:保存文件 import re import requests import os from bs4 import BeautifulSoup 二.获取网页信息 常规操作,获取网页信息的固定格式,返回的字符串格式的网页内容,其中headers参数可模拟人为的操作,'欺骗'网站不被发现 def getHtml(url): #固定格式,获取html内容 headers

  • 只用20行Python代码实现屏幕录制功能

    一.模块安装 首先,我们需要用到两个python的两个模块,win32gui和PyQt5 1.pip install win32gui 2.pip install PyQt5 1.pip install win32gui PS C:\Users\lex\Desktop> pip install win32gui Looking in indexes: http://mirrors.aliyun.com/pypi/simple Requirement already satisfied: win3

  • 利用ImageAI库只需几行python代码实现目标检测

    什么是目标检测 目标检测关注图像中特定的物体目标,需要同时解决解决定位(localization) + 识别(Recognition).相比分类,检测给出的是对图片前景和背景的理解,我们需要从背景中分离出感兴趣的目标,并确定这一目标的描述(类别和位置),因此检测模型的输出是一个列表,列表的每一项使用一个数组给出检出目标的类别和位置(常用矩形检测框的坐标表示). 通俗的说,Object Detection的目的是在目标图中将目标用一个框框出来,并且识别出这个框中的是啥,而且最好的话是能够将图片的所

  • 20行python代码实现人脸识别

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

  • 仅用50行Python代码实现一个简单的代理服务器

    之前遇到一个场景是这样的: 我在自己的电脑上需要用mongodb图形客户端,但是mongodb的服务器地址没有对外网开放,只能通过先登录主机A,然后再从A连接mongodb服务器B. 本来想通过ssh端口转发的,但是我没有从机器A连接ssh到B的权限.于是就自己用python写一个. 原理很简单. 1.开一个socket server监听连接请求 2.每接受一个客户端的连接请求,就往要转发的地址建一条连接请求.即client->proxy->forward.proxy既是socket服务端(监

  • 如何通过50行Python代码获取公众号全部文章

    前言 我们平时阅读公众号的文章会遇到一个问题--阅读历史文章体验不好. 我们知道爬取公众号的方式常见的有两种:通过搜狗搜索去获取,缺点是只能获取最新的十条推送文章.通过微信公众号的素材管理,获取公众号文章.缺点是需要申请自己的公众号. 今天介绍一种通过抓包PC端微信的方式去获取公众号文章的方法.相比其他的方法非常方便. 如上图,通过抓包工具获取微信的网络信息请求,我们发现每次下拉刷新文章的时候都会请求 mp.weixin.qq.com/mp/xxx (公众号不让添加主页链接,xxx表示profi

随机推荐