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

devtools/2024/11/18 5:40:03/

【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

如何确定模型放置的位置

  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 InceptionResnetV1resnet = 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


http://www.ppmy.cn/devtools/134879.html

相关文章

【Linux】进程的优先级

进程的优先级 一.概念二.修改优先级的方法三.进程切换的大致原理&#xff1a;四.上下文数据的保存位置&#xff1a; 一.概念 cpu资源分配的先后顺序&#xff0c;就是指进程的优先权&#xff08;priority&#xff09;。 优先权高的进程有优先执行权利。配置进程优先权对多任务环…

【Google Cloud】Cloud Run jobs 解说

系列文章目录 了解使用谷歌云的无服务器架构 Cloud Run 彻底解说 Cloud Run functions 彻底解说 Cloud Run jobs 解说 Cloud Run jobs 解说 ​ TL; DR Cloud Run 新增了一项便捷功能——“Cloud Run 任务”&#xff08;Cloud Run jobs&#xff09;。与传统的云运行不同&…

机器学习系列----KNN分类

目录 前言 一.KNN算法的基本原理 二.KNN分类的实现 三.总结 前言 在机器学习领域&#xff0c;K近邻算法&#xff08;K-Nearest Neighbors, KNN&#xff09;是一种非常直观且常用的分类算法。它是一种基于实例的学习方法&#xff0c;也被称为懒学习&#xff08;Lazy Learnin…

Jmeter中的前置处理器(二)

5--JDBC PreProcessor 功能特点 数据库操作&#xff1a;执行SQL语句&#xff0c;支持插入、删除、更新和查询操作。灵活配置&#xff1a;可以连接多种数据库&#xff08;如MySQL、Oracle、PostgreSQL等&#xff09;。适用于数据准备&#xff1a;特别适合需要在测试前准备数据…

docker安装宝塔,Mac也可以使用宝塔搭建开发环境了

宝塔没有mac版本&#xff0c;如果想在Mac本地搭建宝塔环境做php开发的&#xff0c;可以使用docker的方式部署 新建一个目录baota&#xff0c;目录下新建文件docker-compose.yml services:dzhbt-ubuntu:image: registry.cn-heyuan.aliyuncs.com/gzdzh/baota:dzhbt-ubuntu-arm-l…

编写一个生成凯撒密码的程序

plain list(input("请输入需要加密的明文&#xff08;只支持英文字母&#xff09;&#xff1a;"))key int(input("请输入移动的位数&#xff1a;"))base_A ord(A)base_a ord(a)cipher []for each in plain:if each :cipher.append( )else:if each.i…

某杀软环境下的添加账户

某杀软环境下的添加账户 我们在某个杀软环境下&#xff0c;正常添加账户一般是会被直接拦截的 白&#xff0b;黑 在这个环境下&#xff0c;白&#xff0b;黑是最实用的绕过方式&#xff0c;我们可以通过调用winapi来创建账户&#xff0c;这些代码再存储到dll里面&#xff0c…

SQL Server Management Studio 的JDBC驱动程序和IDEA 连接

一、数据库准备 &#xff08;一&#xff09;启用 TCP/IP 协议 操作入口 首先&#xff0c;我们要找到 SQL Server 配置管理器&#xff0c;操作路径为&#xff1a;通过 “此电脑” 右键选择 “管理”&#xff0c;在弹出的 “计算机管理” 窗口中&#xff0c;找到 “服务和应用程…