超级好玩!教你用Python实现实时“人脸检测”从人的角度来看,计算机看到图像后看到的东西还是比较模糊的。”近年来,计算机视觉这个神奇的领域逐渐火了起来。该技术已在全球范围内使用,而我们才刚刚开始!关于这个空间,我最喜欢的事情之一是我们的社区接受开源的概念。即便是各大科技巨头也愿意与大家分享新的突破和创新,让这项技术不至于成为“有钱人的玩物”。人脸检测就是这样一种技术,在实际用例中具有广泛的潜在用途(如果使用得当且合乎道德)。在本文中,我将介绍如何使用开源工具构建强大的人脸检测算法。人脸检测的前景广阔让我举几个例子来说明人脸检测技术的广泛应用。我相信您在某个时候遇到过这些用例,只是没有意识到幕后使用了什么技术!例如,Facebook为每张上传到平台的图片建议使用自动生成的标签代替手动标记图片。Facebook使用一种简单的人脸检测算法来分析图像中人脸的像素并将其与相关用户进行比较。我们将学习如何自己构建人脸检测模型,但在深入了解其技术细节之前,有必要讨论一些其他用例。我们习惯于使用最新的“面部解锁”功能来解锁我们的手机。这是一个关于如何使用人脸检测技术保护个人数据安全的小例子。同样的技术可以在更大范围内实施,使相机能够捕捉图像和检测面部。在广告、医疗保健和银行业等行业中,人脸检测还有其他一些鲜为人知的应用。大多数公司,甚至很多会议,都需要带身份证才能进去。但是如果我们能想办法不用带身份证也能进去呢?人脸检测有助于使过程顺利和容易。一个人只需要看一眼摄像头,它就会自动检测他或她是否应该被允许进入。人脸检测的另一个值得注意的应用是能够计算参加会议或音乐会等活动的人数。我们没有手动计算参与者人数,而是安装了一个摄像头来捕捉参与者的图像并为我们提供总人数。这有助于自动化整个过程并节省大量手动工作。你觉得它有用吗?在本文中,我将重点关注人脸检测的实际应用,并简要描述该算法的工作原理。如何使用手头的开源工具实现人脸检测既然您已经看到了人脸检测技术的潜在应用场景,那么让我们来看看我们如何使用手头的开源工具来实现这项技术。专门针对本文,这里是我使用和推荐的硬件和软件:网络摄像头(LogitechC920),用于在LenovoE470ThinkPad笔记本电脑(Corei57thGen)上构建实时人脸检测系统。您还可以在任何其他合适的系统上使用笔记本电脑的内置摄像头或闭路电视摄像头进行实时视频分析,而不是我使用的设置。使用GPU进行更快的视频处理总是一个好处。在软件方面,我们使用了安装了所有先决条件的Ubuntu18.04操作系统。让我们更深入地研究一下,并确保在构建人脸检测模型之前一切都已正确设置。第1步:硬件设置您需要做的第一件事是检查您的网络摄像头是否设置正确。Ubuntu中的一个简单技巧是查看设备是否已在操作系统中注册。方法如下:在将网络摄像头连接到膝上型电脑之前,通过转到命令提示符并键入ls/dev/video*检查所有连接的视频设备。这将输出连接到系统的视频设备。连接网络摄像头,再次运行上面的命令。如果网络摄像头连接成功,该命令将显示一个新设备。可以做的另一件事是使用任何网络摄像头软件检查网络摄像头是否正常工作。您可以在Ubuntu中使用“Cheese”来执行此操作。在这里我们可以看到网络摄像头设置正确。硬件方面就是这样!第二步:软件设置①安装Python本文中的代码是使用Python3.5版本构建的。虽然有多种安装Python的方法,但我建议使用Anaconda,这是最流行的数据科学Python发行版。以下是在您的系统中安装Anaconda的链接:https://www.anaconda.com/download②安装OpenCVOpenCV(开源计算机视觉)是一个旨在构建计算机视觉应用程序的库。它有许多用于图像处理任务的预写函数。要安装OpenCV,pip安装库:pip3installopencv-python③安装face_recognitionAPI最后,我们将使用face_recognition,它号称是世界上最简单的Python人脸识别API。要安装它,请运行以下命令:pipinstalldlibpipinstallface_recognition深入了解实现现在您已经设置了系统,您终于可以深入了解实际实现了。首先,我们将快速构建程序,然后将其分解以查看我们在做什么。首先创建一个文件face_detector.py,然后复制下面的代码:)toRGBcolor(whichface_recognitionuses)rgb_frame=frame[:,:,::-1]#Findallthefacesinthecurrentframeofvideoface_locations=face_recognition.face_locations(rgb_frame)#Displaytheresresultsfortop,right,bottom,leftinface_locations:#Drawaboxaroundthefacecv2.rectangle(frame,(left,top),(right,bottom),(0,0,255),2)#Displaytheresultingimagecv2.imshow('Video',frame)#Hit'q'onthekeyboardtoquit!ifcv2.waitKey(1)&0xFF==ord('q'):break#Releasehandletothewebcamvideo_capture复制代码.release()cv2.destroyAllWindows()然后,输入以下命令运行Python文件:pythonface_detector.py如果一切正常,会弹出一个新窗口,实时人脸检测正在运行。总而言之,以上代码的作用如下:首先,我们定义将进行视频分析的硬件。此后,我们逐帧实时捕获视频。然后我们处理每一帧并提取图像中所有面部的位置。最后,我们将这些帧连同面部位置一起渲染为视频。是不是很简单?如果您需要更具体的详细信息,我在每个代码部分都包含了注释。您可以随时回来查看。面部检测用例的乐趣不止于此!我们可以做的另一件很酷的事情是围绕上述代码构建一个完整的用例。而且您不必从头开始,我们只需要对代码进行一些小的更改。例如,假设您想构建一个基于摄像头的自动化系统来实时跟踪说话者的位置。根据其位置,系统会转动摄像头,使说话者始终位于视频的中间。我们如何解决这个问题?第一步是构建一个系统,该系统可以识别视频中的一个人或多个人,重点关注说话者的位置。让我们看看如何实现这一目标。对于这篇文章,我从Youtube(https://youtu.be/A_-KqX-RazQ)下载了一个人在2017年DataHack峰会上发言的视频。首先,我们导入必要的库:importcv2importface_recognition然后,阅读视频并获得长度:input_movie=cv2.VideoCapture("sample_video.mp4")length=int(input_movie.get(cv2.CAP_PROP_FRAME_COUNT))之后,我们创建一个具有所需分辨率和帧率的输出文件,类似于输入文件。加载说话人的示例图像以在视频中识别他:image=face_recognition.load_image_file("sample_image.jpeg")face_encoding=face_recognition.face_encodings(image)[0]known_faces=[face_encoding,]这一切都完成了,现在我们运行将执行以下操作的循环:从视频中提取帧。找到所有面孔并认出他们。创建一个新视频,将原始帧与带注释的演讲者面部位置相结合。不要看这个代码:#Initializevariablesface_locations=[]face_encodings=[]face_names=[]frame_number=0whileTrue:#Grabasingleframeofvideoret,frame=input_movie.read()frame_number+=1#Quitwhentheinputvideofileendsifnotret:break#ConverttheimagefromBGRcolor(toOpenCVcolorbuses)=frame[:,:,::-1]#Findallthefacesandfaceencodingsinthecurrentframeofvideoface_locations=face_recognition.face_locations(rgb_frame,model="cnn")face_encodings=face_recognition.face_encodings(rgb_frame,face_locations)face_names=[]forface_encodinginface_encodings:#Seeifthefaceisamatchfortheknownface(s)匹配=face_recognition.compare_faces(known_faces,face_encoding,tolerance=0.50)name=Noneifmatch[0]:name="PhaniSrikant"face_names.append(name)#Labeltheresultsfor(top,right,bottom,left),nameinzip(face_locations,face_names):ifnotname:continue#Drawaboxaroundthefacecv2.rectangle(frame,(left,top),(right,bottom),(0,0,255),2)#Drawalabelwithanamebelowthefacecv2.rectangle(frame,(left,bottom-25),(right,bottom),(0,0,255),cv2.FILLED)font=cv2.FONT_HERSHEY_DUPLEXcv2.putText(frame,name,(left+6,bottom-6)),font,0.5,(255,255,255),1)#Writetheresultingimagetotheoutputvideofileprint("Writingframe{}/{}".format(frame_number,length))output_movie.write(frame)#Alldone!input_movie.release()cv2.destroyAllWindows()代码然后给出以下输出:人脸检测是一项壮举结论恭喜!您现在知道如何为许多潜在用例构建人脸检测系统。深度学习是一个引人入胜的领域,我期待着它接下来的发展方向。在本文中,我们学习了如何利用开源工具构建具有实际用途的实时人脸检测系统。我鼓励您构建许多这样的应用程序并亲自试用。相信我,您可以学到很多东西,而且会很有趣。【原创稿件,合作网站转载请注明原作者和出处为.com】
