Pytorch Facenet MTCNN图像输出

问题描述

我正在使用两种方法在python中使用facenet pytorch(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在黑暗中返回张量,如何解决它,在这个问题上帮助我,

谢谢

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)