当前位置: 首页 > 科技观察

厉害了,40行代码人脸识别练习

时间:2023-03-16 01:11:15 科技观察

最近听说有这么个黑科技,让以前闯红灯的人都不怕报警,求交警叔叔拿下他们的照片.....闯红灯一直是一个主要的交通问题。自交通法对机动车闯红灯扣6分以来,不少司机朋友都表示不敢怠慢。机动车可以,非机动车和行人怎么能闯红灯呢?当中国式过马路开始流行,这不,黑科技来了。乍一看,真的像是警方在抓捕嫌疑人。近期,山东、江苏、深圳等部分城市开始在交通路口使用人脸识别系统,对行人、非机动车闯红灯等违法行为进行抓拍和曝光。对行人和非机动车闯红灯,交管部门将处以20元至50元的罚款。虽然罚款不多,但大家最怕的就是大屏幕上会全天候播放你不文明行为的视频和你的个人信息。交警叔叔说完,被拍到的市民纷纷表示,下次再也不敢闯红灯了。人脸抓拍系统的工作原理是:当红灯亮起时,如果行人和非机动车越过停车线,系统会自动抓拍四张照片,并保留15秒的视频,抓拍违章者头部,即使在夜间也能清晰成像。除了现场回放,交管部门还将公开接入的户籍信息。人脸识别技术是如何实现的?许多人认为人脸识别是一项非常困难的工作。他们看到名字就害怕,然后带着忐忑的心情去网上搜索。放弃。这些人包括我以前的自己。其实如果不用深究原理,只是想实现这个工作,人脸识别并没有那么难。今天我们就来看看如何用40行代码轻松实现人脸识别。一点点区分对于大多数人来说,区分人脸检测和人脸识别根本不是问题。但是网上有很多教程有意无意地将人脸检测称为人脸识别,误导大众,导致一些人认为两者是一样的。其实人脸检测解决的问题是判断一张图片上是否有人脸,人脸识别解决的问题是谁的脸。可以说,人脸检测是人类识别的前期工作。我们今天要做的是人脸识别。使用的工具Anaconda2-Python2Dlibscikit-imageDlib今天要用到的主要工具,有必要多说几句。Dlib是一个基于现代C++的跨平台通用框架。作者很用心,不断更新。Dlib涵盖了广泛的机器学习、图像处理、数值算法、数据压缩等,而且Dlib的文档非常齐全,例子也非常丰富。和很多库一样,Dlib也提供了Python接口,安装非常简单。使用pip只需要一句:pipinstallscikit-image需要在pipinstalldlib上使用的也只需要这一句:pipinstallscikit-image注意:如果使用pipinstalldlib安装失败,安装起来会比较麻烦。报错信息很详细,按照报错信息一步步来就可以了。人脸识别之所以使用Dlib来实现人脸识别,是因为它已经帮我们完成了大部分工作,我们只需要调用它即可。Dlib中有一个人脸检测器,一个训练好的人脸关键点检测器,一个训练好的人脸识别模型。今天我们的主要目的是体会,而不是钻研原理。由于示例代码不超过40行,其实并不难。首先通过文件树看一下今天需要用到的代码:准备六张候选人的图片放在candidate-faces文件夹下,然后test.jpg需要识别的人脸图片。我们的工作是检测test.jpg中的人脸,然后确定她在候选人中是谁。额外的girl-face-rec.py是我们的python脚本。shape_predictor_68_face_landmarks.dat是经过训练的人脸关键点检测器。dlib_face_recognition_resnet_model_v1.dat是经过训练的ResNet人脸识别模型。ResNet是何凯明在微软时提出的深度残差网络,获得ImageNet2015冠军。通过让网络学习残差,它在深度和准确性方面比CNN更强大。准备前的shape_predictor_68_face_landmarks.dat和dlib_face_recognition_resnet_model_v1.dat可以在这里找到。无法点击超链接的可以直接输入以下网址:http://dlib.net/files/。然后准备几个人的人脸图片作为候选人脸,最好是正面。把它放在candidate-faces文件夹中。本文在这里准备了六张图片,如下:分别是:然后准备四张需要识别的人脸图片。其实一个就够了。这里只是看不同的情况:可以看到前两个和候选人档案里的人长得还是挺不一样的。第三张图是候选人中的原图,第四张是一张略显侧脸的脸,右边有个影子。识别过程数据准备好后,接下来就是代码了。识别的一般过程如下:首先对候选进行人脸检测、关键点提取、描述符生成,然后保存候选描述符。然后对测试人脸进行人脸检测、关键点提取、描述子生成。***求测试图像的人脸描述符与候选人脸描述符之间的欧氏距离,距离最小的人判定为同一人。代码code就不过多解释了,因为已经注释的很好了。下面是girl-face-rec.py:#-*-coding:UTF-8-*-importsys,os,dlib,glob,numpyfromskimageimportioiflen(sys.argv)!=5:print"请检查参数是否正确“退出()#1。人脸关键点检测器predictor_path=sys.argv[1]#2。人脸识别模型face_rec_model_path=sys.argv[2]#3.候选人脸文件夹faces_folder_path=sys.argv[3]#4.待识别人脸img_path=sys.argv[4]#1。加载正面检测器detector=dlib.get_frontal_face_detector()#2。加载人脸关键点检测器sp=dlib.shape_predictor(predictor_path)#3.加载人脸识别模型facerec=dlib.face_recognition_model_v1(face_rec_model_path)#win=dlib.image_window()#candidatefacedescriptorlistdescriptors=[]#执行每个人脸在文件夹中:#1。人脸检测#2。关键点检测#3。finglob.glob(os.path.join(faces_folder_path,"*.jpg")):print("Processingfile:{}".format(f))img=io的描述符提取。imread(f)#win.clear_overlay()#win.set_image(img)#1。人脸检测dets=detector(img,1)print("Numberoffacesdetected:{}".format(len(dets)))fork,dinenumerate(dets):#2.关键点检测shape=sp(img,d)#Draw人脸区域和关键点#win.clear_overlay()#win.add_overlay(d)#win.add_overlay(shape)#3.描述符提取,128维向量face_descriptor=facerec。compute_face_descriptor(img,shape)#转换为numpyarrayv=numpy.array(face_descriptor)descriptors.append(v)#对要识别的人脸进行同样的处理#提取描述符,不再注释img=io.imread(img_path)dets=detector(img,1)dist=[]fork,dinenumerate(dets):shape=sp(img,d)face_descriptor=facerec.compute_face_descriptor(img,shape)d_test=numpy.array(face_descriptor)#计算iindescriptors的欧氏距离:dist_=numpy.linalg.norm(i-d_test)dist.append(dist_)#候选列表candidate=['Unknown1','Unknown2','Shishi','Unknown4','Bingbing','Feifei']#候选人物和距离组成一个dictc_d=dict(zip(candidate,dist))cd_sorted=sorted(c_d.iteritems(),key=lambdad:d[1])print"\nThepersonis:",cd_sorted[0][0]dlib.hit_enter_to_continue()结果我们在.py所在文件夹打开命令行,运行如下命令:pythongirl-face-rec.py1.dat2.dat./candidate-faecstest1.jpg由于shape_predictor_68_face_landmarks.dat和dlib_face_recognition_resnet_model_v1.dat名称太长,所以我将它们重命名为1.dat和2.dat。运行结果如下:此人是冰冰。记性不好的同学可以翻出来看看test1.jpg是谁的图片。有兴趣的可以尝试把四张测试图都跑一遍。这里需要说明的是,前三张图片的输出结果都非常理想。但是第四张测试图像的输出是候选4。比较这两张图像可以很容易地找出混淆的原因。机器毕竟不是人,机器的智能还需要人类去提高。有兴趣的朋友可以继续研究如何提高识别准确率。比如每个人用多张候选图片,然后和每个人比较平均距离等等,全靠你了。