当前位置: 首页 > article >正文

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

【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, 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


http://www.kler.cn/a/397258.html

相关文章:

  • Go语言中的类型
  • MySQL:表设计
  • 当微软windows的记事本被AI加持
  • python的matplotlib实现数据分析绘图
  • Hybird和WebView
  • 计算机视觉 ---常见图像文件格式及其特点
  • docker:docker: Get https://registry-1.docker.io/v2/: net/http: request canceled
  • 中心扩展算法
  • 使用 Grafana api 查询 Datasource 数据
  • 小程序如何完成订阅
  • 每天五分钟机器学习:支持向量机算法数学基础之核函数
  • Centos 9 安装 PostgreSQL 16 并支持远程访问
  • 编程初学者的第一个 Rust 系统
  • java模拟键盘实现selenium上下左右键 table中的左右滚动条实现滚动
  • NVR录像机汇聚管理EasyNVR多品牌NVR管理工具视频汇聚技术在智慧安防监控中的应用与优势
  • Docker 命令大全
  • 力扣 LeetCode 541. 反转字符串II(Day4:字符串)
  • Vue3 模板语法
  • C#调用方法时获取方法名、类名、命名空间
  • Spring-boot 后端java配置接口返回jsp页面
  • leetcode100:相同的树
  • 前端面试笔试(三)
  • MySQL:表设计
  • Ubuntu24.04上安装和配置MariaDB
  • 内容营销专家刘鑫炜:AI搜索会让内容营销变得更容易吗?
  • html + css 自适应首页布局案例