本文我们会讲讲怎样利用不到 25 行 Python 代码和开源库 OpenCV,以很简单的方式实现人脸识别。

在正式开始前,先提以下两点小小的建议:先别急着跳到代码部分,最好在前文理解一下代码是干什么的。

确保你使用的是OpenCV v2。

OpenCV

OpenCV 是计算机视觉领域最受欢迎的开源库,起初它由 C/C ++ 编写,现在用 Python 也能使用。

OpenCV 可以使用机器学习算法搜索图像中的人脸。由于人脸比较复杂,所以并没有一种简单的测试可以告诉我们它是否发现了人脸。但是,算法能够匹配到数千个很小的模式和特征。算法会将识别人脸的任务分解为几千个非常非常小的任务,像这种很小的任务,解决起来就比较容易了。这样的微小任务就被称为分类器。

对于人脸这样的物体,我们可能会有6千多个分类器,它们全都和检测到的人脸匹配(当然是在有限误差内)。但是这样也存在一个问题:对于人脸检测来说,算法从图像的左上角开始,一点点向下移动,经过一个个数据小方块,然后挨个查看它们,不断地问“这是个人脸吗?”···“这是个人脸吗?”···“这是个人脸吗?”因为每个小方块都要进行6千多次测试,那么我们就要进行数百万次计算,这么下去...电脑估计都要歇菜了。

为了解决这个问题,OpenCV 使用了 cascades 的概念?什么是 cascades?如果查字典,会告诉你 cascades 意为“瀑布或一系列的瀑布流”。

和瀑布流一样,OpenCV cascades 会把人脸识别问题分解为很多个阶段。对于每个数据小方块,它会进行非常粗略和迅速的测试。如果测试通过,会进一步进行更详细的测试,以此类推。算法会有 30 到 50 个这样的阶段,或者说 cascades,在所有阶段都通过测试时,就能确认识别的是人脸了。

它的优点是,在开始几个阶段内,若不是人脸,图像大部分就会返回否定结果,这意味着算法就不用再浪费时间测试全部6千余个特征。因此,现在我们完全能够实时做到人脸检测,不用花费几个小时。

Cascades 实践

虽然理论听上去有些复杂,但实践起来并不难。Cascades 就是一堆 XML 文件,包含了用于检测物体的 OpenCV 数据。用你想使用的 cascades 初始化你的代码后,它就能为你工作了。

由于人脸检测是一种常见的任务,所以 OpenCV 内置了很多 cascades,用于检测人体身上的很多部位,比如人脸、眼睛和手指等等。也能检测人体之外的物体,比如此前就有人开发了能识别香蕉的程序,可以帮水果店追踪偷拿香蕉的人!

安装 OpenCV

首先,你需要针对你的操作系统,找到正确的设置文件。

我发现安装 OpenCV 是识别人脸任务中最难的部分。如果你遇到了奇怪的很难解释的错误,那可能是因为库不兼容,操作系统是 32位/64位 等等此类的问题。我觉得使用 Linux 虚拟机从头安装 OpenCV 最容易。

等完成安装后,就可以用如下 Python 会话测试一下 OpenCV 能否工作:

>>> import cv2

>>>

如果没出什么问题,就接着往下看吧。

理解代码

这是整个代码库(https://github.com/shantnu/FaceDetect/),你可以从上面把代码下载下来。我们来解析一下代码。找到face_detect.py脚本,ABBA.png图像和haarcascade_frontalface_default.xml文件。

# 获取用户提供的值

imagePath = sys.argv[1]

cascPath = sys.argv[2]

你首先将图像和 cascade 名称作为命令行属性传入。我们会使用 abba 图像和默认 cascades 检测 OpenCV 提供的人脸。

# 创建 haar cascade

faceCascade =

cv2.CascadeClassifier(cascPath)

现在我们创建 cascade,以我们的人脸 cascade 将其初始化。这里会将人脸 cascade 加载到内存中,因此它是随时可用的。记住,cascade 只是一个包含了检测人脸的数据的 xml 文件。

# 读取图像

image = cv2.imread(imagePath)

gray = cv2.cvtColor(image,

cv2.COLOR_BGR2GRAY)

这里,我们读取图像,将其转换为灰度图。OpenCV 中的很多操作都是以灰度图完成的。

# 检测图像中的人脸

faces =

faceCascade.detectMultiScale(

gray,

scaleFactor=1.1,

minNeighbors=5,

minSize=(30, 30),

flags = cv2.cv.CV_HAAR_SCALE_IMAGE

)

该函数会检测实际的人脸,也是我们代码的核心部分,我们看看具体操作:

这里的detectMultiScale函数是一个能够检测物体的通用函数。因为我们在人脸cascade里调用它,那么它的目标就是检测人脸了。

第一个操作是灰度图像。

第二个是scaleFactor。由于很多人脸可能离摄像头很近,所以它们会比靠后的人脸看着要大很多。这一步中的比例因子(scale factor)就是为了缓解这个问题。

检测算法使用一个移动的窗口检测物体。minNeighbors 会定义在它声明检测到人脸前,在当前物体附近还要检测多少个物体。minSize 会定义每个窗口的大小。

注意,在这里的代码中,用的都是一些常见的值。在你实际操作中,可以试试不同的窗口大小、比例因子等等,直到发现最理想的参数值。

函数会返回一列边框,表示它发现了一个人脸。接着我们会循环函数认为检测到物体的地方。

print "Found{0}

faces!".format(len(faces))

# 画出围绕人脸的边框

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

cv2.rectangle(image,

(x, y), (x+w, y+h), (0, 255, 0), 2)

该函数返回了 4 个值:边框的 x 和 y 位置,以及边框的宽和高(w,h)。

我们利用内置的 retangle() 函数用这些值画出一个边框。

cv2.imshow("Faces

found", image)

cv2.waitKey(0)

检查结果

咱们用代码库里的这张 ABBA 乐队的照片测试一下:

$ python face_detect.py

abba.png haarcascade_frontalface_default.xml

看样子程序能识别出人脸。再换一张照片试试:

呃···那个地方不是人脸···好吧咱们再试试。调整一下参数,发现将 scaleFactor 设为 1.2 后,就能把错误识别出的人脸给修正了。

刚才发生了什么?

第一张图拍摄距离比较近,照片质量也较高,而第二张图拍摄距离较远,很可能是用手机拍的。这就是为何需要调整 scaleFactor 的值。因此,必须根据自己的实际情况,设置算法的参数,避免出现假阳性。

提醒一下,虽然用我们的这种方法能很容易的识别人脸,但正确率不会达到 100%。不过在大部分情况下,你仍能得到足够理想的结果。

好了,现在可以自己去试试。

最终完整代码见这里:

https://github.com/shantnu/FaceDetect/blob/master/face_detect.py​github.com

或许你还喜欢:

景略集智:用Python和深度学习实现iPhone X的Face ID​zhuanlan.zhihu.com

python人脸检测代码_如何用不到25行Python代码实现人脸检测相关推荐

  1. 读懂python代码_读懂花里胡哨的14行Python代码!

    最近在项目里发现一段代码,初看比较难看懂,细看,也还是比较难看懂.遂研究了一下,证实了这段代码确实,没啥作用,遂删之.记录在下. 去掉几个用于封装的函数,保留最小代码后,剩下以下14行代码.你能说出这 ...

  2. python简单好玩的代码_只需要9步100行Python代码就可以实现一个简单又好玩的弹球游戏...

    今天给大家分享一个有趣又好玩的弹球的游戏,一来可以把类的知识融会一下,二来加深对Python的兴趣.你会发现哎呀Python写小游戏还是蛮方便的,蛮有意思的~~ 需要本文源码:私信回复[源码]即可获取 ...

  3. python酷炫图形代码_牛批了,1 行 Python 代码就可实现炫酷可视化

    之前画图一直在用 matlibplot.pyecharts,最近学习了一个新的可视化库--cufflinks,用了两天我已经深深爱上它了 主要是因为它用法简单.图形漂亮.代码量少,用一两行代码,就能画 ...

  4. y空间兑换代码_如何用不到 2KB 的 JavaScript 代码写一个 3D 赛车游戏?

    几个月前,JS1k游戏制作节(JS1K game jam)传出不再举办消息后,许多游戏迷开始哀嚎. Frank Force 也是其中一位,但他还有另一层身份--一位德克萨斯州奥斯汀的独立游戏设计师.F ...

  5. python好学吗 小木虫-25行Python代码完成人脸识别

    以下是Shantnu Tiwari的客座文章,作者有着在底层编程和嵌入式领域十年的工作经验.在发现Python语言之前的几年时间里,Shantnu Tiwari一直忍受着C/C++语言编程的不便,但P ...

  6. 25行AS3代码编程大赛的第一名!25行代码构造的AS3游戏

    叫做Marius Heil的AS开发者使用AS3构造了一个25行代码的AS3游戏,并且获得了25行AS3代码编程大赛的第一名! /** * 25-Line ActionScript Contest E ...

  7. c语言将图像转换成字符画,25行Java代码将普通图片转换为字符画图片和文本的实现...

    本文主要介绍了25行Java代码将普通图片转换为字符画图片和文本的实现,分享给大家,具体如下: 原图 生成字符画文本(像素转换字符显示后,打开字符画显示相当于原图的好几倍大,不要用记事本打开,建议用n ...

  8. python200行代码_如何用200行Python代码“换脸”

    本文将介绍如何编写一个只有200行的Python脚本,为两张肖像照上人物的"换脸". 这个过程可分为四步: 检测面部标记. 旋转.缩放和转换第二张图像,使之与第一张图像相适应. 调 ...

  9. 用python画机器猫代码_如何用Python画一只机器猫?| 原力计划

    原标题:如何用Python画一只机器猫?| 原力计划 作者 | 人邮异步社区 责编 | 胡巍巍 出品 | CSDN博客 自信心是成功的源泉,对刚入门编程行业的初级程序员来说,多敲代码多做项目就是构建自 ...

最新文章

  1. 【数学建模】MATLAB应用实战系列(九十二)-教你怎么挑对象,层次分析法应用案例(附MATLAB代码)
  2. 年底了,如何准备 Java 初级和高级的技术面试?
  3. sas univariate 结果解释_PROC UNIVARIATE过程
  4. python os模块system_Python如何使用OS模块调用cmd
  5. window环境变量
  6. 高质量JAVA代码编写规范
  7. android设备报警推送,Firebase推送通知未送达所有android设备
  8. oracle odbc驱动 linux,linux下oracle的odbc驱动的安装与配置
  9. 我的Go+语言初体验——Go+语言构建神经网络实战手写数字识别
  10. SQL server2016 数据库 基础知识
  11. 心理学推荐书籍——《九型人格》
  12. linux系统清理磁盘空间
  13. 可视化框架、Axure原型、大屏可视化、图表组件、图表元件库、统计图表、数据可视化模板、条形图、折线图、散点图、时间轴、仪表盘、饼图、散点图、雷达图、高山图、登录模板、弹窗、弹幕、预警、散点图
  14. NO_ACCESS Protection
  15. 从Google Maglev到UCloud Vortex,如何造一个牛逼的负载均衡?
  16. directX 正试图在 OS 加载程序锁内执行托管代码
  17. 使用opencv打开笔记本摄像头
  18. (笔记总结)单片机与单片机的通信
  19. 万万没想到!我拒绝了一位知名VC大佬的创业合伙人邀请
  20. html5网页中加入播放器,6 个 HTML5 的多媒体播放器

热门文章

  1. 基于JSP的人力资源管理系统
  2. 伊吹萃香_纪中2556_spfa
  3. 智慧路口:未来都市的智能节点
  4. java中抽象类(abstract class)
  5. python中的select()以及choose()的用法
  6. 基于springboot校园二手交易市场源码 转转二手交易带视频部署教程和文档
  7. 签核网页通过和驳回的免扣印章
  8. chatGPT流式回复是怎么实现的
  9. JAVA基础(索引越界and空指针)
  10. Java基础题——15只狮子围成一圈,依次报数,报到7被剔除,最后剩下的狮子成为狮王,求狮王为第几只?