【PYTORCH】使用MTCNN简单进行人脸检测
- 背景
- 过程代码
- 最终代码
- 遇到的问题
- 内网环境如何手动下载模型
- 如何确定模型放置的位置
- 其他
- 参考
背景
近期看了一博客,想简单实现一下人脸检测和识别,使用了下面的代码,环境是
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, ImageDrawfrom 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
如何确定模型放置的位置
- 打开这个文件D:\Python\Python37\Lib\site-packages\facenet_pytorch\models\inception_resnet_v1.py
- 查看这个方法load_weights,在此增加print代码,打印出本地的目录
cached_file = os.path.join(model_dir, os.path.basename(path))
print(cached_file)
- 新建一个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 InceptionResnetV1resnet = InceptionResnetV1(pretrained='vggface2').eval()
- 打印的目录如下,所以下周模型后,就在下面的位置放置就可以了
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