在上一篇文章中,我们实现了对照片中人脸的检测,并标记了人脸的特征点(鼻子、眼睛、眉毛等)。在本文中,我们将建立在上一篇文章的基础上,进一步实现人脸识别,告诉你照片中的人是谁。准备工作我们的人脸识别是基于face_recognition库。face_recognition基于dlib实现,使用深度学习训练数据,模型准确率高达99.38%。在开始我们的工作之前,我们首先安装face_recognitionpipinstallface_recognition。人脸识别的第一步是检测照片中的人脸区域,然后将人脸的图像数据转换成长度为128的向量。这128个数据代表了人脸的128个特征指标,如下图,对于每个已知的面孔,都会生成这样一个128位向量。对于一张未知人脸,将其128位向量与所有已知人脸的128位向量逐一比较,找到相似度最高的,即找到未知人脸对应的人。图片资料我们准备了两张照片,分别是凯特王妃和威廉王子的单人照,分别保存为catherine.jpg和william.jpg。这两张照片中的面孔是我们已知的面孔。我们的目标是识别下面合影中两人的面孔,并在图像中标记他们的名字。下图另存为unknown.jpg代码实现接下来开始我们的编程工作标签名称也是我们图像的文件名。images=[]fornameinnames:filename=name+".jpg"image=face_recognition.load_image_file(filename)images.append(image)unknown_image=face_recognition.load_image_file("unknown.jpg")调用face_recognition.load_image_file从图像中读取数据。这里读取包含已知人脸和未知人脸图片的数据,未知人脸图片就是上面的photounknown.jpg。face_encodings=[]forimageinimages:encoding=face_recognition.face_encodings(image)[0]face_encodings.append(encoding)unknown_face_encodings=face_recognition.face_encodings(unknown_image)face_recognition.face_encodings会返回图片中所有人脸的128位向量。一张照片只有一张脸,所以face_recognition.face_encodings(image)[0]只取第一个元素。合影包含两张脸,因此unknown_face_encodings包含两个128位向量。face_locations=face_recognition.face_locations(unknown_image)foriinrange(len(unknown_face_encodings)):unknown_encoding=unknown_face_encodings[i]face_location=face_locations[i]top,right,bottom,left=face_locationcv2.rectangle(unknown_top,top),(right,bottom)面部位置,(0,255,0),2)results=face_recognition.compare_faces(face_encodings,unknown_encoding)forjinrange(len(results)):ifresults[j]:name=names[j]cv2.putText(unknown_image,name,(左10,top-10),cv2.FONT_HERSHEY_SIMPLEX,0.5,(0,255,0),2)unknown_image_rgb=cv2.cvtColor(unknown_image,cv2.COLOR_BGR2RGB)cv2.imshow("Output",unknown_image_rgb)cv2.waitKey(0)face_locations存储每个人脸的位置信息。在循环中,我们调用cv2.rectangle来框定每个检测到的人脸。face_recognition.compare_faces将已知人脸的128位向量与每个未知人脸的128位向量进行比较,并将结果存储在结果数组中。结果数组中的每个元素为True或False,长度等于面数。results中的每个元素都与已知人脸一一对应,某个位置的元素为True,表示将未知人脸识别为这张已知人脸。对于每个识别出的人脸,我们调用cv2.putText来标记图像。以上是全部代码。激动人心的测试时刻又来了!让我们检查一下我们的结果。运行上面的程序,可以看到如下结果,威廉王子和凯特王妃的人脸都被准确识别出来了。绿色边框勾勒出人脸区域,边框上方标注识别出的人名。至此,我们就成功实现了人脸识别。后续还会不定期更新图像处理中其他有趣的应用,比如图像抠图、手绘效果、二维码识别、验证码识别等。
