您当前所在位置:首页安装教程「秀操作」仅用25行Python代码,即可实现人脸检测

「秀操作」仅用25行Python代码,即可实现人脸检测

更新:2023-08-09 13:05:13编辑:tooool归类:安装教程人气:81

在本文中,我们将介绍一种使用 Python 和开源库 OpenCV 进行人脸识别的非常简单的入门方法。

「秀操作」仅用25行Python代码,即可实现人脸检测

注意事项:

1)确保使用 的是OpenCV v2。

2)有一个可用的网络摄像头,以便此脚本可以正常工作。

OpenCV

OpenCV 是最流行的计算机视觉库。它最初是用 C/C++ 编写的,现在为 Python 提供绑定。

OpenCV 使用机器学习算法来搜索图片中的人脸。由于人脸非常复杂,因此没有一个简单的测试可以告诉你是否找到了人脸。相反,有数以千计的小模式和特征必须匹配。这些算法将识别人脸的任务分解为数千个较小的、一口大小的任务,每个任务都很容易解决。这些任务也称为分类器。

对于像人脸这样的东西,你可能有 6,000 个或更多分类器,所有分类器都必须与要检测的人脸匹配(当然,在错误限制内)。但问题就在这里:对于人脸检测,算法从图片的左上角开始,向下移动到小数据块,查看每个数据块,不断问,这是一张人脸吗? ……这是人脸吗? ……这是人脸吗?由于每个块有 6,000 次或更多测试,你可能需要进行数百万次计算,这会使你的计算机停止运行。

为了解决这个问题,OpenCV 使用了级联。

OpenCV 级联将检测人脸的问题分解为多个阶段。对于每个块,它都会进行非常粗略和快速的测试。如果通过,它会做一个更详细的测试,依此类推。

该算法可能有 30 到 50 个这样的阶段或级联,并且只有在所有阶段都通过时才会检测到人脸。 优点是大部分图片会在前几个阶段返回负值,这意味着算法不会浪费时间测试所有 6,000 个特征。

现在可以实时完成面部检测,而不是花费数小时。 级联实践 虽然这个理论听起来可能很复杂,但实际上它很容易。 级联本身只是一堆 XML 文件,其中包含用于检测对象的 OpenCV 数据。 你用想要的级联初始化代码,然后代码会为你工作。

由于人脸检测是如此常见,OpenCV 附带了许多内置级联,用于检测从面部到眼睛、手到腿的所有内容。 甚至还有非人类事物的级联。

安装 OpenCV

首先,需要为你的操作系统找到正确的安装文件。 我发现安装 OpenCV 是任务中最困难的部分。 如果你遇到奇怪的无法解释的错误,可能是由于库冲突、32/64 位差异等等。

我发现只使用 Linux 虚拟机并从头开始安装 OpenCV 是最简单的。 完成安装后,你可以通过启动 Python 会话并键入以下内容来测试它是否有效:

importcv2
复制代码

如果没有收到任何错误,则可以继续进行下一部分。

理解代码

让我们分解实际代码,可以从 repo 下载。 获取 face_detect.py 脚本、abba.png 图片和haarcascade_frontalface_default.xml。

Get user supplied valuesimagePath = sys.argv[1]
cascPath = sys.argv[2]
复制代码

首先将图像和级联名称作为命令行参数传递。 我们将使用 ABBA 图像以及 OpenCV 提供的默认级联来检测人脸。

Create the haar cascadefaceCascade = cv2.CascadeClassifier(cascPath)
复制代码

现在我们创建级联并使用我们的面部级联对其进行初始化。 这会将人脸级联加载到内存中,以备使用。 请记住,级联只是一个包含用于检测人脸的数据的 XML 文件。

Read the imageimage = cv2.imread(imagePath)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
复制代码

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

Detect faces in the imagefaces=faceCascade.detectMultiScale(gray,scaleFactor=1.1,minNeighbors=5,minSize=(30, 30),flags=cv2.cv.CV_HAAR_SCALE_IMAGE)复制代码

这个函数检测真实的人脸,是我们代码的关键部分,让我们回顾一下选项:

  • detectMultiScale 函数是一个检测对象的通用函数。 由于我们在人脸级联上调用它,这就是它检测到的。
  • 第一个选项是灰度图像。
  • 第二个是scaleFactor。 由于某些人脸可能离相机更近,因此它们看起来会比后面的人脸大。 比例因子对此进行了补偿。
  • 检测算法使用移动窗口来检测对象。minNeighbors 定义在声明找到人脸之前在当前对象附近检测到多少对象。 同时,minSize 给出了每个窗口的大小。

注意:我采用了这些字段的常用值。 在现实生活中,尝试使用不同的窗口大小、比例因子等值,直到找到最适合值。

该函数返回一个矩形列表,它认为它在其中找到了一张脸。 接下来,我们将在它认为找到某些东西的地方循环。

print"Found {0} faces!".format(len(faces))Draw a rectangle around the facesfor(x,y,w,h)in faces:cv2.rectangle(image,(x,y),(x+w,y+h),(0,255,0),2)复制代码

此函数返回 4 个值:矩形的 x 和 y 位置,以及矩形的宽度和高度 (w , h)。

我们使用这些值使用内置的 rectangle() 函数绘制一个矩形。

cv2.imshow("Faces found", image)cv2.waitKey(0)
复制代码

最后,我们显示图像并等待用户按下一个键。

检查结果

让我们对照 ABBA 照片进行测试:

$ python face_detect.py abba.png haarcascade_frontalface_default.xml
复制代码

那奏效了。 再来一张照片怎么样:

那……不是脸。 让我们再试一次。 我改了参数,发现把scaleFactor设置为1.2就去掉了错误的脸。

发生了什么? 嗯,第一张照片是用高质量的相机拍摄的。

第二个似乎是从远处拍摄的,可能是用手机拍摄的。 这就是必须修改 scaleFactor 的原因。

正如我所说,必须根据具体情况设置算法以避免误报。 但请注意,由于这是基于机器学习,因此结果永远不会 100% 准确。 在大多数情况下,将获得足够好的结果,但有时算法会将不正确的对象识别为人脸。

拓展:行人检测

为了迎合和满足现代化的市场需求,我们开发了支持提供多种协议设备接入的视频平台EasyCVR,前期我们做好了EasyCVR在视频能力上的各项铺垫,包括摄像头的云台控制、语音对讲、告警上报等功能,现在我们踏入了人脸识别的领域,目前也正在测试视频平台的人脸识别功能,如果大家感兴趣可以翻阅我们以前的博文了解一下,欢迎大家关注。

我们使用python进行AI识别测试,具体方式是是开启本地电脑的摄像头进行实时的识别,或者直接传入一张图片进行行人检测,在分析代码把数据源传入到识别,看到的是source=’0’,但是这个参数是打开本地电脑的摄像头流,再进行行人检测。

但我们需要对此处进行修改,使用rtsp流,进行AI行人识别,下面需要进行分析代码,找到可以修改的地方,或者摸个参数,来进行RTSP流的修改。

已经找到了视频流在哪里传进去的了,下面就是进行分析里面的代码进行改成rtsp流,把rtsp流写进去,来做到实时分析,实现行人检测的效果。

在进行分析的时候,发现source这个参数只有LoadStreams用到过,而且是直接传进去的。

进入source参数里面查看,发现里面有一个默认的值,就是读文件,如果不是文件,就把source=[source],再进行source值遍历。在遍历中还使用到了opencv打开本地电脑的摄像机流,再开一个线程进行实时行人识别。

代码中使用了opencv中cv2.VideoCapture的函数,从网上查找这个函数的用法得知,此函数是可以直接传入rtsp流地址的,所以问题解决就简单多了。cv2.VideoCapture这个函数是可以传入rtsp地址的,所以传入rtsp地址进行尝试,发现传入rtsp地址是没有问题的。

只要修改source这个参数即可,最终实现了检测:

我告诉你msdn版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

Win10 UWP《记事本Next》支持免费下载:具有简洁的特性 Windows10系统下使用Win+X组合键没反应如何解决

游客 回复需填写必要信息