简单的Facenet_Pytorch人脸识别教程(windows+cpu)

2023-05-16

本文使用的编译器是Pycharm,具体的安装教程可参考:Pycharm安装参考链接

一、新建项目

首先打开Pycharm,点击【new project】进行新建,选择项目的保存位置,将项目名称改为【test】,并选择已安装的python版本作为解释器,点击【create】,等待项目生成。

然后在左边目录栏,【test】处右键选择【new】->【Directory】,创建一个名为【facenet_test】的文件夹,并在该文件夹下右键【new】->【python file】,创建一个名为【fp】的py文件。

二、安装Pytorch

打开PyTorch官网Start Locally | PyTorch,在主页中根据自己的电脑选择Linux、Mac或Windows,其余如下图所示,系统将给出对应的安装语句,如我这里为“pip3 install torch torchvision torchaudio”。

 复制红色框中的语句,到Pycharm中,点击底部的【Terminal】打开终端,粘贴上述语句后回车,就会开始下载Pytorch。(如果这个过程中下载速度太慢的话可以尝试在后面加上清华镜像,即将上述语句改为:

pip install torch torchvision torchaudio -i https://pypi.tuna.tsinghua.edu.cn/simple

稍等片刻后,系统显示“successfully installed……”,表明成功。可以继续在Terminal终端中输入以下命令,来测试是否安装成功。

Python
import torch
torch.__version__    #注意此处是两个“_”符号连在一起

效果如下所示,说明安装成功了。

 测试完成后可以ctrl+z并回车退出python环境。

三、安装facenet_pytorch

继续在Pycharm的Terminal终端中键入如下命令,就会开始下载。

pip install facenet_pytorch

 安装好之后到“C:\Users\用户名\”路径下查看是否有“.cache”文件夹。如果没有,则在Terminal终端中进入python环境,运行以下命令:

python
import torchvision.models as models
alexnet=models.alexnet(pretrained=True)

成功之后重新查看“C:\Users\用户名\”路径,发现已经有了“.cache”文件夹。

四、下载预训练模型

到如下网盘链接中下载预训练模型,并将压缩包解压放置在“C:\Users\用户名\.cache\torch\hub\checkpoints”或“C:\Users\用户名\.cache\torch\checkpoints”路径下。如图所示。

链接:https://pan.baidu.com/s/1UrnggoOLL8lv2Nj4odBfWw?pwd=w6x8 
提取码:w6x8 

 五、代码实现

 首先选择两张图片作为待识别的图片,并将它们与fp.py放置在同一目录中,即保存到facenet_test文件夹中。在这里我选择以下两张图片,分别命名为“zj.jpg”和“zj2.jpg”。

然后将如下代码输入到fp.py文件中。

import cv2
import torch
from facenet_pytorch import MTCNN, InceptionResnetV1
 
# 获得人脸特征向量
def load_known_faces(dstImgPath, mtcnn, resnet):
    aligned = []
    knownImg = cv2.imread(dstImgPath) # 读取图片
    face = mtcnn(knownImg)  # 使用mtcnn检测人脸,返回【人脸数组】
 
    if face is not None:
        aligned.append(face[0])
    aligned = torch.stack(aligned).to(device)
    with torch.no_grad():
        known_faces_emb = resnet(aligned).detach().cpu()  # 使用resnet模型获取人脸对应的特征向量
    print("\n人脸对应的特征向量为:\n", known_faces_emb)
    return known_faces_emb, knownImg
 
# 计算人脸特征向量间的欧氏距离,设置阈值,判断是否为同一个人脸
def match_faces(faces_emb, known_faces_emb, threshold):
    isExistDst = False
    distance = (known_faces_emb[0] - faces_emb[0]).norm().item()
    print("\n两张人脸的欧式距离为:%.2f" % distance)
    if(distance < threshold):
        isExistDst = True
    return isExistDst
 
if __name__ == '__main__':
    # help(MTCNN)
    # help(InceptionResnetV1)
    # 获取设备
    device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu')
    print(device)
    # mtcnn模型加载【设置网络参数,进行人脸检测】
    mtcnn = MTCNN(min_face_size=12, thresholds=[0.2, 0.2, 0.3], keep_all=True, device=device)
    # InceptionResnetV1模型加载【用于获取人脸特征向量】
    resnet = InceptionResnetV1(pretrained='vggface2').eval().to(device)
    MatchThreshold = 0.8    # 人脸特征向量匹配阈值设置
 
    known_faces_emb, _ = load_known_faces('zj.jpg', mtcnn, resnet)  # 已知人物图
    # bFaceThin.png  lyf2.jpg
    faces_emb, img = load_known_faces('zj2.jpg', mtcnn, resnet) # 待检测人物图
    isExistDst = match_faces(faces_emb, known_faces_emb, MatchThreshold)  # 人脸匹配
    print("设置的人脸特征向量匹配阈值为:", MatchThreshold)
    if isExistDst:
        boxes, prob, landmarks = mtcnn.detect(img, landmarks=True)  # 返回人脸框,概率,5个人脸关键点
        print('由于欧氏距离小于匹配阈值,故匹配')
    else:
        print('由于欧氏距离大于匹配阈值,故不匹配')

 注意:如果你的待识别图片是别的图片,保存的名字和我的不一样,那就需要将上述代码的第43行和45行的对应的图片名称改为你的图片名称。

还有一个问题,如果输入代码后,第1行import cv2处显示No model named cv2,则需要手动添加opencv的包,如下图所示:

 点击【File】->【Settings】->【Python Interpreter】,点击加号,搜索【opencv】,依次选中红框中的两个包,点击【Install Package】,等待下载完成,然后就可以运行fp.py了。

第一次运行时系统需要下载预训练的vggface模型,时间会比较久,耐心等待下载好之后程序便可以运行。

 程序的输出结果包括运行设备、两张图片中人脸对应的特征向量、两张人脸的欧式距离、设置的人脸特征向量匹配阈值和两张人脸是否匹配。

部分运行结果如下所示:

 根据运行结果,两张图片中人脸的欧氏距离小于设定的匹配阈值,故匹配,也就是说两张人脸是同一个人。下面,我们尝试将zj2.jpg替换为周杰伦的照片zjl.jpg,来看看会有什么结果。(注意:同样的要修改45行处的文件名)

结果显示,两张图片中人脸的欧氏距离大于设定的匹配阈值,故不匹配,也就是说两张人脸不是同一个人。

这样的话,我们的代码就能实现简单的人脸识别啦。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

简单的Facenet_Pytorch人脸识别教程(windows+cpu) 的相关文章

  • Boost + Visual Studio 2010 + Windows 平台 SDK 7.1

    有人可以告诉我 bjam 的命令行开关或其他可以使用新的 Windows Platform SDK 7 1 工具链使用 VS2010 进行 boost 编译的东西吗 您可以在普通的视觉工作室项目中设置该选项 默认值是 v100 是平台 7
  • 如何使用 python 在 Windows 中禁用/启用特定 USB 端口? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想在图形窗口中创建一个切换开关 可以使用 python 禁用 启用 Windows 中的特定 USB 端口 我可以使用哪个外部命令或
  • MinGW Make 抛出“系统找不到指定的路径。”错误

    我正在尝试在 Windows 7 上使用 cmake 生成一个 c 项目 在实际创建项目之前 cmake 会对您的工具链进行快速测试 我正在使用 MinGW 这就是我的问题所在 Cmake 触发 make 构建 最终失败并返回 系统找不到指
  • 如何通过命令行将Flash .fla编译为.swf? [复制]

    这个问题在这里已经有答案了 如何在基于 Windows 的操作系统上通过命令行将 Flash fla 文件编译为 swf 需要安装的命令行工具就可以了 谁能建议我该怎么做 以直接的方式 谢谢 您可以使用JSFL为 Flash IDE 编写脚
  • 将 gnuplot 嵌入现有 QtWidget 中

    我正在用 C 创建一个 伪 实时绘图应用程序 使用 gnuplot 作为绘图后端 我的要求之一是绘图必须位于现有窗口内 而不是有一个单独的绘图窗口 gnuplot 默认为 Gnuplot 有一个选项可以指定 Qt 小部件 ID 这似乎适合我
  • 批处理脚本 FOR 循环仅设置输出的第一个字母 wsl --list -q

    我正在编写一个批处理脚本 将文件从 Windows 目录复制到 WSL 发行版 其中一部分是选择将文件复制到哪个发行版 如果我使用命令wsl list q如果给我以下输出 Ubuntu 22 04 Ubuntu 18 04 我正在尝试使用此
  • PyTorch:如何批量进行推理(并行推理)

    如何在PyTorch中批量进行推理 如何并行进行推理以加快这部分代码的速度 我从进行推理的标准方法开始 with torch no grad for inputs labels in dataloader predict inputs in
  • Rails Windows Vagrant 响应时间非常慢

    我在跑 Vagrant 1 7 1 Rails 4 1 4 Thin 1 6 1 Windows 7 每个静态文件的发送时间都超过一秒 在我的 PC 上加载一个页面可能需要大约 20 秒 而在同事的 Linux 机器上则只需瞬间 有一些帖子
  • 串行 I/O 与 Windows/Windows CE 重叠/不重叠

    抱歉 这不是一个大问题 但更多的是帮助那些在这些特定问题上遇到问题的人 我正在解决的问题需要使用串行 I O 但主要在 Windows CE 6 0 下运行 然而 最近有人问我该应用程序是否也可以在 Windows 下运行 所以我开始着手解
  • 在Windows 7上安装curl后缺少libcurl-4.dll

    按照这个人的安装curl后指示 https stackoverflow com a 28757477 1186038 除了第 2 步 已安装Win64 OpenSSL v1 0 1u 轻型相反 因为下载页面中缺少版本 k http slpr
  • C++ 使用 Windows 命名管道

    由于某种原因 桅杆和从属装置都失败了 但是我可以找到任何关于它们如何工作的好例子 所以我不确定我哪里出了问题 在 ConnectNamedPipe 之后 主设备永远不会退出 WaitForSingleObject 并且从设备在第一个 boo
  • 为什么 fopen 无法打开已存在的文件?

    我在 Windows XP 上使用 Visual Studio 6 是的 我知道它很旧 构建 维护 C DLL 我遇到了 fopen 无法打开现有文件的问题 它总是返回 NULL 我试过了 通过将 errno 和 doserrno 设置为零
  • conio.h 不包含 textcolor()?

    我一直在考虑在我用 C 编写的 DOS 程序中使用颜色 有人告诉我conio h有textcolor 函数 但是当我在代码中使用它时 编译器 链接器会向我抛出错误 说我对该函数有未定义的引用 Does conio h真的有这个功能还是有人告
  • Python3 在 DirectX 游戏中移动鼠标

    我正在尝试构建一个在 DirectX 游戏中执行一些操作的脚本 除了移动鼠标之外 我一切都正常 是否有任何可用的模块可以移动鼠标 适用于 Windows python 3 Thanks I used pynput https pypi or
  • Windows 上的 Apache Pig 在运行“pig -x local”时出现“hadoop-config.cmd”未被识别为内部或外部命令”错误

    如果您由于以下错误而无法在 Windows 上运行 Apache Pig hadoop 2 4 0 bin hadoop config cmd is not recognized as an internal or external com
  • Windows 8 Metro 应用程序(网格应用程序)过渡时出现黑色闪烁

    我正在基于网格应用程序模板构建 Windows 8 Metro 应用程序 一切都很顺利 直到我尝试更改应用程序的主题和背景 我将图像背景应用于所有 3 个 XAML 页面的网格 另外 我在应用程序包清单中将主题更改为 Light 但它没有执
  • 代码 GetAsyncKeyState(VK_SHIFT) & 0x8000 中的这些数字是什么?它们是必不可少的吗?

    我试图在按下按键的简单动作中找到这些数字及其含义的任何逻辑解释 GetAsyncKeyState VK SHIFT 0x8000 可以使用哪些其他值来代替0x8000它们与按键有什么关系 GetAsyncKeyState 根据文档返回 如果
  • 从其可执行文件的路径获取服务名称

    我有一个可执行文件的路径 它是一个正在运行的服务应用程序 例如 C Program Files x86 Someapp somesvc exe 我想停止并启动它 为此我想我需要获取服务的名称 如下所示 this https stackove
  • 已达到网络 BIOS 命令限制

    我的 ASP Net 应用程序从另一台 Windows 服务器上的共享文件夹获取文件 当请求增加时 我收到以下错误 The network BIOS command limit has been reached 我已按照以下步骤操作微软 K
  • Tkinter - 浮动窗口 - 调整大小

    灵感来自this https stackoverflow com a 22424245 13629335问题 我想为我的根窗口编写自己的调整大小函数 但我刚刚注意到我的代码显示了一些性能问题 如果你快速调整它的大小 你会发现窗口没有像我希望

随机推荐

  • C/C++数据结构(十二)—— 红黑树

    文章目录 1 红黑树的概念2 红黑树的性质3 红黑树节点的定义4 红黑树的旋转5 红黑树的插入 x1f351 情况一 x1f351 情况二 x1f351 情况三 x1f345 叔叔结点存在且为红色 x1f345 叔叔结点存在且为黑色 x1f
  • 机器学习数学基础

    文章目录 一 学习任务二 学习内容1 梯度下降法的一般求解步骤2 梯度下降法手工求解极值2 1 计算过程 3 Excel中利用梯度下降求解近似根4 线性回归问题求解4 1 最小二乘法4 2 梯度下降法 三 参考资料 一 学习任务 解释微分
  • 一篇文章吃透算法时间复杂度

    文章目录 前言1 什么是好的算法2 算法的效率度量3 时间复杂度4 大 O 时间复杂度表示法5 算法时间复杂度计算规则 x1f351 规则 1 xff1a 只关注循环中的代码段 x1f351 规则 2 xff1a 加法规则 x1f351 规
  • 2023 年最佳 C++ IDE

    文章目录 前言1 Visual Studio2 Code Blocks3 CLion4 Eclipse CDT xff08 C C 43 43 开发工具 xff09 5 CodeLite6 Apache NetBeans7 Qt Creat
  • 掌握顺序表,成为数据结构和算法的高手

    文章目录 1 线性结构与线性表2 线性表的顺序存储3 顺序表的基础操作 x1f351 顺序表接口总览 x1f351 初始化顺序表 x1f351 销毁链表 x1f351 插入操作 x1f351 删除操作 x1f351 获取元素操作 x1f34
  • 数据结构中常见的哈希表,到底是什么?

    文章目录 1 哈希概念 x1f351 举例说明 2 哈希冲突3 哈希函数 x1f351 常见哈希函数 4 哈希冲突解决 x1f351 闭散列 xff08 开放定址法 xff09 x1f345 线性探测 x1f345 二次探测 x1f351
  • 探索数据结构之精髓:单链表解密

    文章目录 1 前言2 单链表的特点3 单链表的基础操作 x1f351 接口总览 x1f351 初始化操作 x1f351 插入操作 x1f345 优化操作 x1f351 删除操作 x1f345 优化操作 x1f351 获取元素 x1f345
  • 引用与指针:在C++中如何做出正确的选择?

    文章目录 前言1 引用入门2 引用作为函数传参3 引用作为函数返回值4 引用和指针5 其他区别 前言 引用是 C 43 43 的新增内容 xff0c 在实际开发中会经常使用 xff0c 它就如同C语言的指针一样重要 xff0c 但它比指针更
  • C++引用进阶篇:让你的程序更加高效、安全、简洁

    文章目录 前言1 引用和临时数据 x1f351 什么样的临时数据会放到寄存器中 x1f351 关于常量表达式 x1f351 引用也不能指代临时数据 x1f351 引用作为函数参数 2 为const引用创建临时变量3 const引用与转换类型
  • 二叉树基础概念详解

    文章目录 前言1 树的基本概念2 二叉树的基本概念3 特殊二叉树 x1f351 满二叉树 x1f351 完全二叉树 x1f351 斜树 4 二叉树的性质 x1f351 性质一 x1f351 性质二 x1f351 性质三 x1f351 性质四
  • 链队列知识总结及代码实现

    目录 链队的存储方式 链队的优点 链队功能函数 代码实现 链队的存储方式 可以通过 单链表 的方式来实现 xff0c 使用链式队的优点在于它能够克服用数组实现的顺序队空间利用率不高的特点 xff0c 但是需要为每个队元素分配额外的指针空间用
  • 【C语言】全面解析结构体,结构体知识点整理

    文章目录 结构体的概念结构体类型的声明结构体变量的创建typedef关键字结构体的嵌套结构体变量的初始化结构体成员的访问结构体的传参总结 结构体的概念 结构体是由一系列具有相同类型或不同类型的数据构成的数据集合 组成结构型数据的每个数据称为
  • 逻辑回归案例 练习

    文章目录 一 学习任务二 学习内容1 常用评价指标2 实验分析 三 参考资料 一 学习任务 学习理解逻辑回归的基本概念 xff0c 练习python代码的实现 xff0c 在notebook中写入自己的理解注释 准确理解机器学习算法的常用评
  • APM飞控学习笔记——自动模式下一分钟自动降落

    提示 xff1a 文章写完后 xff0c 目录可以自动生成 xff0c 如何生成可参考右边的帮助文档 文章目录 前言一 自动模式简介二 添加自动降落功能 1 飞控主循环调用逻辑2 功能添加总结 前言 APM是一款功能齐全的开源多轴飞行器无人
  • Linux基础入门之常用命令

    1 命令的基本格式 1 1 命令的提示符 root 64 localhost xff1a 这是提示符的分隔符号 xff0c 没有特殊含义 root xff1a 显示的是当前的登录用户 xff0c 目前使用的是root用户登录 64 xff1
  • windows10安装python详细过程

    1 下载与安装Python 首先访问网址 https www python org xff0c 进入Downloads 页面 xff0c 即可下载Python 如下图 这里直接下载的是最新版的Python 如果需要下载其他版本的Python
  • 深度学习笔记(二)

    计算机视觉 xff1a 人类肉眼识别的错误率大概在5 到2016年的时候 xff0c 计算机视觉中 xff0c 用深度学习网络达到的错误率已经远低于人类 卷积神经网络 xff08 CNN xff09 1 应用领域 神经网络和卷积神经网络都是
  • YOLOv4从配置环境到跑通代码的小白教程

    一直以来都只是看论文和网上的一些纯文字的讲解 xff0c 但从来没有实操过 xff0c 非常想自己跑一下代码 xff0c 看一下算法的整个实现过程 xff0c 于是就有了这次尝试 系统环境介绍 windows 10 NVIDIA GeFor
  • YOLO系列算法详解(一)

    一 深度学习经典检测方法 1 检测任务中阶段的意义 对于单阶段 one stage 检测来说 xff0c 输入一张图像 xff0c 经过一个卷积神经网络 xff0c 输出一个边界框 xff0c 只需要得到框的 xff08 x1 y1 xff
  • 简单的Facenet_Pytorch人脸识别教程(windows+cpu)

    本文使用的编译器是Pycharm xff0c 具体的安装教程可参考 xff1a Pycharm安装参考链接 一 新建项目 首先打开Pycharm xff0c 点击 new project 进行新建 xff0c 选择项目的保存位置 xff0c