自学内容网 自学内容网

【PYTORCH】使用MTCNN和InceptionResnetV1简单进行人脸检测和相似度匹配

背景

近期看了一博客,想简单实现一下人脸检测和识别,使用了下面的代码,环境是
python 3.7.7
1.13.1+cpu

过程代码

import torch
import torchvision.transforms as transforms
from facenet_pytorch import MTCNN, InceptionResnetV1
from PIL import Image, ImageDraw

from PIL import Image, ImageDraw
from facenet_pytorch import MTCNN

# 初始化 MTCNN 模型
mtcnn = MTCNN(keep_all=True)

# 加载图像
img = Image.open('222.jpg')  # 替换为你自己的图像路径

# 检测人脸
boxes, probs = mtcnn.detect(img)

# 在图像上绘制人脸边框
img_draw = img.copy()
draw = ImageDraw.Draw(img_draw)
for box in boxes:
    draw.rectangle(box.tolist(), outline=(255, 0, 0), width=6)

# 显示图像
img_draw.show()

from facenet_pytorch import InceptionResnetV1
# 初始化人脸识别模型
resnet = InceptionResnetV1(pretrained='vggface2').eval()

# 从之前检测到的人脸中提取特征
img_cropped = mtcnn(img)  # 检测并裁剪出人脸

print(type(img_cropped))
print(img_cropped.shape)
"""
输出
<class 'torch.Tensor'>
torch.Size([1, 3, 160, 160])
"""

# 如果有多个检测结果,可以选择处理第一张人脸
if img_cropped is not None:
    # 提取特征向量
    face_embedding = resnet(img_cropped)
    print(face_embedding)

最终代码


def calculate_distance(embedding1, embedding2):
    """计算两个人脸特征向量之间的欧氏距离"""
    return torch.dist(embedding1, embedding2).item()

# 加载两张人脸的图像并提取特征
img1 = Image.open('11.jpg')  # 替换为第一张图像的路径
img2 = Image.open('222.jpg')  # 替换为第二张图像的路径

# 检测并提取两张人脸的特征
face_embedding1 = resnet(mtcnn(img1))
face_embedding2 = resnet(mtcnn(img2))

# 计算特征向量之间的距离
distance = calculate_distance(face_embedding1, face_embedding2)
print(f"Face distance: {distance}")

# 设定阈值判断是否为同一个人
threshold = 0.6
if distance < threshold:
    print("Same person")
else:
    print("Different person")

遇到的问题

内网环境如何手动下载模型

执行这个代码的时候resnet = InceptionResnetV1(pretrained=‘vggface2’).eval()会去网上下载模型,如果网络不通会报错

urllib.error.URLError: <urlopen error [WinError 10060] 由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试 失败。  

这个时候可以通过如下链接直接去下

https://github.com/timesler/facenet-pytorch/releases/tag/v2.2.9

如何确定模型放置的位置

  1. 打开这个文件D:\Python\Python37\Lib\site-packages\facenet_pytorch\models\inception_resnet_v1.py
  2. 查看这个方法load_weights,在此增加print代码,打印出本地的目录
cached_file = os.path.join(model_dir, os.path.basename(path))  
print(cached_file)  
  1. 新建一个python文件,并运行就会看到打印出的目录
import torch
import torchvision.transforms as transforms
from facenet_pytorch import MTCNN, InceptionResnetV1
from PIL import Image, ImageDraw
from PIL import Image, ImageDraw
from facenet_pytorch import MTCNN
from facenet_pytorch import InceptionResnetV1

resnet = InceptionResnetV1(pretrained='vggface2').eval()
  1. 打印的目录如下,所以下周模型后,就在下面的位置放置就可以了
C:\Users\xxxxx/.cache\torch\checkpoints\20180402-114759-vggface2.pt 

其他

在jupyter上,执行修改的源代码D:\Python\Python37\Lib\site-packages\facenet_pytorch\models\inception_resnet_v1.py,比如加print语句后,运行看不到自己的打印消息。这种情况当前没有找到原因,我是通过新建py文件,然后运行,才能看到自己设定的打印消息的。

参考

https://blog.csdn.net/SWZ156/article/details/142987324?spm=1001.2014.3001.5506
https://github.com/timesler/facenet-pytorch


原文地址:https://blog.csdn.net/m0_60688978/article/details/143742074

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!