python dlib人脸比对
如果想鉴别某两张脸是同一个人,那么首先要得到人脸上的某些特殊的点,比如眼角、嘴角,然后根据这些点的位置关系,得到一些不随着人脸移动和表情变化而变化的不变量,并以此作为鉴别人物的依据。
特征点识别
如果想鉴别某两张脸是同一个人,那么首先要得到人脸上的某些特殊的点,比如眼角、嘴角,然后根据这些点的位置关系,得到一些不随着人脸移动和表情变化而变化的不变量,并以此作为鉴别人物的依据。
为此需要从dlib.net下载68点的人脸模型。
import dlib
img = plt.imread('test.jpg')
detector = dlib.get_frontal_face_detector()
rect = detector(img, 1)[0] # 此为人脸区域
# 加载68点人脸模型
predictor = dlib.shape_predictor('shape_predictor_68_face_landmarks.dat')
# 此为人脸的特征点列表
face = predictor(img, rect)
keyPts = face.parts()
其中,shape_predictor为关键点检测器,face
可以理解为检测到关键点的脸,keyPts
为其检测后的关键点列表。shape_predictor_68_face_landmarks.dat就是68点人脸模型。
下面在matplotlib中对检测到的点进行绘制
for i, pt in enumerate(keyPts):
plt.text(pt.x,pt.y, str(i))
plt.scatter([pt.x], [pt.y], marker='*')
plt.imshow(img)
plt.axis('off')
plt.show()
效果如下
从这个图可以看到人脸特征点总共有68个,分布在脸的轮廓和五官的边缘,每个点有 x , y x,y x,y两个坐标,则总共有136个值,可以组成一个新的向量。
对比两张脸是否相同,本质就是对比这136个值是否相近,只不过这种方案误差很大就是了。
人脸比对
在dlib中,face_recognition_model_v1提供了人脸对比模型,当然需要调用的模型还是需要到dlib中下载。考虑到在寻找脸部的68个特征点时,并未保证特征点之间是线性无关的,所以通过这个模型后,得到的是一个128维的向量,代码如下
pReg = "dlib_face_recognition_resnet_model_v1.dat"
faceRec = dlib.face_recognition_model_v1(pReg)
vec1 = faceRec.compute_face_descriptor(img, face)
接下来再打开两张图片,并求得对应的特征向量
def getReg(im):
rect = detector(im, 1)[0] # 此为人脸区域
face = predictor(im, rect)
vec = faceRec.compute_face_descriptor(im, face)
return np.array(vec)
img2 = plt.imread('test2.jpg')
vec2 = getReg(img2)
img3 = plt.imread('test3.jpg')
vec3 = getReg(img3)
接下来查看一下这三张图片的距离
>>> np.linalg.norm(vec1-vec2)
0.40060397645976
>>> np.linalg.norm(vec1-vec3)
0.8248735552156338
可见,vec1和vec2很有可能是一个人,和vec3则是两个人。
>>> fig = plt.figure()
>>> ax = fig.add_subplot(131)
>>> ax.imshow(img)
>>> plt.axis('off')
>>> ax = fig.add_subplot(132)
>>> ax.imshow(img2)
>>> plt.axis('off')
>>> ax = fig.add_subplot(133)
>>> ax.imshow(img3)
>>> plt.axis('off')
>>> plt.show()
而这三张人脸分别如下,都是鬼畜界的精英人物,dlib
的判定结果,也支持前两者是同一个人,而川普则是另一个人的事实。然而图像挂掉了……
更多推荐
所有评论(0)