清远信息港

当前位置:

25行Python代码实现人脸检测Ope

2019/08/16 来源:清远信息港

导读

25 行 Python 代码实现人脸检测——OpenCV 技术教程按:这是篇是利用 OpenCV 进行人脸识别的技术讲解。阅读本文之前,

  25 行 Python 代码实现人脸检测——OpenCV 技术教程

  按:这是篇是利用 OpenCV 进行人脸识别的技术讲解。阅读本文之前,这是注意事项:

  建议先读一遍本文再跑代码——你需要理解这些代码是干什么的。成功跑一遍不是目的,能够举一反三、在新任务上找出 bug 才是。

  请确保用的是OpenCV v2

  你需要一个络摄像头

  OpenCVOpenCV 是的计算机视觉库,原本用 C 和 C++ 开发,现在也支持 Python。

  它使用机器学习算法在图像中搜索人的面部。对于人脸这么复杂的东西,并没有一个简单的检测能对是否存在人脸下结论,而需要成千上万的特征匹配。算法把人脸识别任务分解成数千个小任务,每个都不难处理。这些任务也被称为分类器。

  对于类似于人脸的对象,你或许需要不少于 6000 个分类器,每一个都需要成功匹配(当然,有容错率),才能检测出人脸。但这有一个问题:对于人脸识别,算法从左上角开始计算一个个数据块,不停问“这是张脸吗”。每个数据块有超过 6000 个检测,加起来的计算量会达到数百万级别,计算机很可能会让你等得花儿都谢了。

  OpenCV 使用cascades 来避免这种情况。Cascade 是什么

  ?答案已经在字典里了:一条瀑布或者连续瀑布。

  好比连续瀑布,OpenCVcascade 把人脸检测问题分解为好几步。对于每个数据块,它都进行一个粗略、快速的检测。若通过,会再进行一个更仔细的检测,以此不断类推。该算法有30 到 50 个这样的阶段,或者说cascade。只有通过全部阶段,算法才会判断检测到人脸。这样做的好处是:大多数图形都会在头几步就产生否定反馈,算法因而不需要在它上面测试所有 6000 个特征,大大节省了时间。相对于“正常流程”耗费数个小时,这可以实时实现人脸检测。

  实践中的 Cascade它的理论也许听起来很复杂,实际操作起来其实是很简单的。这些 cascades 只是一系列包含 OpenCV 数据的 XML 文件。你用想要的cascade 初始化代码,它自会替你做你想要的事。

  由于人脸识别的普遍性,OpenCV 有一系列能检测各种东西的内置cascade,从眼睛到手到腿都可以检测。甚至还有针对非人体物体的cascade。比如说,如果你经营一家卖香蕉的水果店,想要监测偷香蕉的人,就有一个家伙开发了一个针对这一场景的算法!

  安装 OpenCV

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

  我发现,安装OpenCV 是难的一个环节。如果你遇到奇怪的、无法解释的错误,有可能是库崩溃了、32 与 64 比特的兼容问题等等。个人经验是,只用Linux 虚拟机,从头安装OpenCV 简单。

  安装好之后,你可以开启一个Python 会话,敲出下面的代码,来测试它是否能工作:

  $ python

  import cv2

  如果没弹出任何错误,你就可以到下个环节了。

  理解代码源代码可在资源库下载。记得拿好 face_ 文本、g 图片以及 haarcascade_frontalface_l。下面,我把代码分解开来。

  # Get user supplied values

  imagePath = gv[1]

  cascPath = gv[2]

  将图片和 cascade 名字作为命令行参数传入。我们会用 Abba 图片和 OpenCV 提供的默认cascade 来人脸检测。

  # Create the haar cascade

  faceCascade = scadeClassifier(cascPath)

  现在,我们创建一个cascade,并用人脸cascade 初始化。这把人脸cascade 导入内存,所以它随时可以使用。记住,该 cascade 只是一个包含人脸检测数据的XML 文件。

  # Read the image

  image = read(imagePath)

  gray = tColor(image, LOR_BGR2GRAY)

  读取图片把它转化到灰度格式。

  # Detect faces in the image

  faces = tectMultiScale(

  gray,

  scaleFactor=1.1,

  minNeighbors=5,

  minSize=(30, 30),

  flags = _HAAR_SCALE_IMAGE

  )

  该函数做的就是检测人脸,是代码核心部分。所以,我们来过一遍选项。

  DetectMultiScale 函数是一个检测物体的通用函数。我们在人脸cascade 上调用它,它检测的就是人脸。个选项是灰度图片。

  第二个是scaleFactor。有的人脸离镜头近,会比其他人脸更大。ScaleFactor 对此进行补偿。

  检测算法使用移动窗口来检测物体。在系统宣布检测到人脸之前,minNeighbors 会对当前其周围有多少物体进行定义。MinSize 给出每个窗口的大小。

  我用的是这些领域的常用值。现实中,你会拿不同的值试验窗口尺寸、扩展因素等参数,直到找出比较合适的那一个。

  当该函数认为它找到一张人脸时,会返回一个矩形列表。下一步,我们会进行循环,直到它认为检测出了什么。

  print Found {0} faces!.format(len(faces))

  # Draw a rectangle around the faces

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

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

  该函数返回四个值:矩形的 x 和 y 坐标,以及它的高和宽。我们用这些值和内置的 rectangle() 函数,画出矩阵。

  show(Faces found ,image)

  itKey(0)

  ,我们显示该模型,等用户摁下按键。

  检验结果用 Abba 来检验。

  $ python face_ g haarcascade_frontalface_l

  没有问题,试试另一张照片。

  那两个东西不是脸,我们再试一次。我调整了参数,发现把scaleFactor 调成 1.2 能去除错误检测。

  发生了什么?张图片由高清摄像机近距离拍摄,第二章拍摄距离相对更远,而且可能是用拍的。这就是需要调整 scaleFactor 的原因。正如我说的,你需要按照实际场景设置算法,避免假正例。

  这里,提醒大家,由于这基于机器学习,结果永远不会100% 精确。大多数情况下,你会得到不错的结果。但算法偶尔会失误。

  终代码在这里。

  用络摄像头如果你想要用络摄像头呢?OpenCV 从摄像头读取每一帧,你可以通过处理每一帧进行人脸检测。你需要一个性能强大的 PC,不过我的五岁大的笔记本用着还行。

  viarealpython,(公众号:)编译

  相关文章:

  老板来了:人脸识别 + 推送,老板来了你立刻知道!

  手把手教你如何用 OpenCV + Python 实现人脸识别

  版权文章,未经授权禁止转载。详情见转载须知。

小孩流鼻血怎么回事
宝宝不爱吃饭的原因
小孩腹胀不爱吃饭
标签

友情链接