我正在用两种方法在python中使用facenet py手电筒(https://github.com/timesler/facenet-pytorch)做人脸识别应用程序。
第一方法代码-
resnet = InceptionResnetV1(pretrained='vggface2').eval()
mtcnn = MTCNN(image_size=96)
img = Image.open(image_path)
image_prep = mtcnn(img)
plt.figure()
plt.axis('off')
plt.imshow(image_prep.permute(1, 2, 0))
if image_prep is not None:
image_embedding = resnet(image_prep.unsqueeze(0))
在这段代码中,我从给定的图像中提取人脸,并获得用于识别人脸的512编码。
在这个例子中,我使用了两个不同的面孔,并绘制了两张脸之间的距离。
a.jpg b.jpg
a.jpg 0.000000 1.142466
b.jpg 1.142466 0.000000
效果很好..。
第二方法代码-
img = Image.open(image)
boxes, probs = mtcnn.detect(img) # Gives the coordinates of the face in the given image
face = img.crop((boxes[0][0], boxes[0][1], boxes[0][2], boxes[0][3])) # Cropping the face
plt.figure()
plt.imshow(face)
pil_to_tensor = transforms.ToTensor()(face).unsqueeze_(0) # Converting to tensor type
image_embedding = resnet(pil_to_tensor)
在这段代码中,我首先得到面部的坐标,然后是嵌入。两张脸之间的距离-
a.jpg b.jpg
a.jpg 0.000000 0.631094
b.jpg 0.631094 0.000000
在第一种方法中,直接将图像输入到mtcnn中,得到了较好的效果,两面之间的距离大于1.0。在第二种方法中,我使用mtcnn.detect()
获取人脸的坐标,从给定的图像中裁剪人脸,然后输入resnet。这种方法减少了两个不同人脸之间的距离。
然后,通过在resnet中绘制结果(面),找出第一种方法优于第二种方法的原因。
在第二种方法中,通过使用mtcnn.detect()
对人脸进行裁剪,给出与输入图像相同的人脸(清晰图像)。
但是,在第一种方法中,我直接给出了mtcnn(img)
的输入,它在黑暗中返回人脸的张量,而不是输入图像。这个较暗的图像不是一个清晰的图像(眼睛周围的区域比较暗,我用了很多照片测试),不能清楚地看到眼睛。这就是原因所在,第一种方法显示出两面之间的距离较高。
我的疑问是,为什么mtcnn在黑暗中返回张量,如何解决它,在这个问题上帮助我,
谢谢
发布于 2022-01-03 10:30:53
可能是因为张量在-1:1范围内?你必须把它转换回uint8 0-255。
https://stackoverflow.com/questions/64387540
复制相似问题