face_recognition是一个功能强大、简单易用的开源人脸识别项目,并配有完整的开发文档和应用案例,特别兼容树莓派系统.face_recognition一经开源就受到广泛好评。简单易用,功能强大,这已经成为它非常显着的标签。face_recognition是一款非常好用的工具,适用于公司或者一些工程实际应用场景。不需要太多的理论基础就可以相对轻松的完成一个识别项目,所以今天我们就来具体讲解一下。首先,face_recognition项目的开源地址在这里:https://github.com/ageitgey/face_recognition网上有比较完整的API说明和示例应用,这里不再赘述。首先,使用face_recognition需要安装,可以通过pip完成。如果安装遇到错误,请参考:https://yishuihancheng.blog.csdn.net/article/details/102679177安装完成后即可使用。在编码之前,可以通过简单的测试来判断是否安装成功,如下图:安装成功后,就可以进入使用了。1.定位图片中的人脸defdemoFunc():'''在一张包含人脸的图片中圈出人脸'''image=face_recognition.load_image_file("test.jpg")face_locations=face_recognition.face_locations(image)foroneinface_locations:y0,x1,y1,x0=onecv2.rectangle(image,pt1=(x0,y0),pt2=(x1,y1),color=(0,0,255),thickness=3)cv2.imshow('aaa',image)ifcv2.waitKey(0)&0xFF==ord('q'):cv2.destroyAllWindows()从网上随便找了一张图,如下图:定位结果如下:感觉很厉害,当然在在我实践的过程中,我也发现了一些图像识别检测不到人脸的问题。毕竟这不是100%的问题。face_recognition更像是一个基础框架,帮助我们更高效地构建自己的人脸。确定相关应用。2.将图片中的每张人脸裁剪并保存到本地test.jpg”)face_locations=face_recognition.face_locations(image)#(top,right,bottom,left)foriinrange(len(face_locations)):y0,x1,y1,x0=face_locations[i]cropped=img.crop((x0,y0,x1,y1))#(left,upper,right,lower)cropped.save(str(i)+"_.jpg")cropped.show()使用的原图同上,结果如下:五张人脸都被成功检测并保存。这里要注意face_locations函数的返回结果。返回的子列表中的每个子列表包含4个元素,分别是单张人脸图像的左上顶点和右上角。对于下顶点的坐标,主要需要注意的是这四个参数的顺序。在我给出的结果中,(x0,y0)代表左上顶点的坐标,(x1,y1)代表右下顶点的坐标。3.将图像中的每张人脸编码成128维的向量defdemoFunc():'''将图像中的每张人脸编码成128维的向量'''image=face_recognition.load_image_file("cl.jpg")face_locations=face_recognition.face_locations(image)#(top,right,bottom,left)face_encodings=face_recognition.face_encodings(image,face_locations)#将单个人脸数据转化为128维向量foroneinface_encodings:print('one:',one)在说到这里,不得不说一下face_recognition的一些应用原理。以下是我的一些总结。如有不妥,欢迎指教。face_recognition模块的人脸识别应用原理:(1)给定一张待识别人脸的图片并对其进行编码(每个人只需要一张),将这些不同的人脸编码构建成一个列表。编码其实就是将人脸图片映射成128维的特征向量。(2)计算图像向量之间的相似度,根据阈值或容错度判断是否为同一个人(3)输出识别结果标签。毫不夸张的说,整个face_recognition的核心就在于这块的向量化处理。每一张输入的人脸图像都会转化为128维的特征向量进行存储,而128维特征向量的生成也是一种算法。有兴趣的可以去看看,加深了解。这里就不展开了,后面的人脸识别就转化为两张人脸图像向量相似度的问题。这里我们使用成龙的形象进行测试。原图如下:向量化结果如下:如果你想构建自己的个性化应用,一般会选择在这里修改。首先,您需要在此处保存特征向量。4、输入两张人脸图片,判断是否为同一人defdemoFunc(one_pic='c1.jpg',two_pic='c2.jpg'):'''给定两张图片,判断是否为同一人'''成龙=face_recognition.load_image_file(one_pic)unknown_image=face_recognition.load_image_file(two_pic)biden_encoding=face_recognition.face_encodings(chenglong)[0]unknown_encoding=face_recognition.face_encodings(unknown_image)[0]results=face_recognition.compare_faces([biden_encoding],unknown_encoding)print('results:',results)returnresults[0]这里其实和上面的第三部分有点类似,这部分是基于第三部分的,但是自带了compare_faces相似度计算接口,这里其实可以替换它自己。同样,使用两张成龙图像进行测试。原图如下:测试结果如下:5.人脸关键点识别和标注defdemoFunc(pic_path='cl.jpg'):'''人脸关键点识别,标注'''image=face_recognition.load_image_file(pic_path)face_landmarks_list=face_recognition.face_landmarks(image)print("Ifound{}face(s)inthisphotograph.".format(len(face_landmarks_list)))pil_image=Image.fromarray(image)d=ImageDraw.Draw(pil_image)forface_landmarksinface_landmarks_list:forfacial_featureinface_landmarks.keys():print("The{}inthisfacehasthefollowingpoints:{}".format(facial_feature,face_landmarks[facial_feature]))forfacial_featureinface_landmarks.keys():d.line(face_landmarks[facial_feature],width=5)pil_image。show()人脸的关键点包括:鼻子、嘴巴、眼睛、眉毛等。这里还是上面成龙的图,输出结果如下:6.化妆以第五部分为基础。获得的面部特征可用于自动化妆。下面是具体实现:defdemoFunc(pic_path="haiwang.jpg"):'''makeup'''image=face_recognition.load_image_file(pic_path)face_landmarks_list=face_recognition.face_landmarks(image)pil_image=Image.fromarray(image)forface_landmarksinface_landmarks_list:demo=ImageDraw.Draw(pil_image,'RGBA')demo.polygon(face_landmarks['left_eyebrow'],fill=(68,54,39,128))demo.polygon(face_landmarks['right_eyebrow'],fill=(68,54,39,128))demo.line(face_landmarks['left_eyebrow'],fill=(68,54,39,150),width=2)demo.line(face_landmarks['right_eyebrow'],fill=(68,54,39,150),width=2)demo.polygon(face_landmarks['top_lip'],fill=(150,0,0,128))demo.polygon(face_landmarks['bottom_lip'],fill=(150,0,0,128))演示。线(face_landmarks['top_lip'],填充=(150,0,0,64),宽度=2)demo.line(face_landmarks['bottom_lip'],填充=(150,0,0,64),宽度=2)demo.polygon(face_landmarks['left_eye'],fill=(255,255,255,30))demo.polygon(face_landmarks['right_eye'],fill=(255,255,255,30))demo.line(face_landmarks['left_eye']+[face_landmarks['left_eye'][0]],fill=(0,0,0,110),width=2)demo.line(face_landmarks['right_eye']+[face_landmarks['right_eye'][0]],fill=(0,0,0,110),width=2)pil_image.show()这里用海王星的图片做测试。原图如下:处理后的结果如下:也可以这样:7.基于face_recognition构建自己的简单人脸识别应用上面介绍了face_recognition的很多应用,这里介绍最重要的内容。我认为是这样的。在现有功能的基础上实现自己的个性化应用,我只是抛砖引玉,倾其所有。简单实现:deffaceRecognitionDemo(picDir='data/',test_pic='test.png'):'''基于face_recognition构建人脸识别模块'''pic_list=os.listdir(picDir)forone_picinpic_list:one_pic_path=picDir+one_picone_res=demo6(one_pic=one_pic_path,two_pic=test_pic)one_name=one_pic.split('.')[0].strip()ifone_res:print('ThisPersonis:',one_name)breakelse:print('ThisPersonisnot:',one_name)data文件夹数据截图如下:test.png内容如下:结果输出如下:当然,现在的计算方式肯定不能满足实时计算。这只是最简单的应用。我只想从这里开始。face_recognition接口的形式用于完成相似度判定的工作。另一种很常见的方法是在得到人脸图像的128维特征向量后,基于机器学习模型将人脸识别问题转化为简单的分类问题。例如:SVM、RF、GBDT等都可以很好的完成上述任务。本篇到此结束,欢迎交流!
