【计算机视觉|人脸识别】 facenet-pytorch 项目中文说明文档

news2025/1/14 1:12:19

下文搬运自GitHub,很多超链接都是相对路径所以点不了,属正常现象。点击查看原文档。转载请注明出处。

原作者暂时并未对我的提交做出回应,这里同步提交到CSDN,点击查看项目源码

使用 Pytorch 进行人脸识别

Click here to return to the English document

译者注:

本项目 facenet-pytorch 是一个十分方便的人脸识别库,可以通过 pip 直接安装。

库中包含了两个重要功能

  • 人脸检测:使用MTCNN算法
  • 人脸识别:使用FaceNet算法

利用这个库,可以轻松实现人脸检测和人脸向量映射操作。

为了方便中文开发者研究学习人脸识别相关任务、贡献代码,我将本项目的README文件以及位于 examples 里面的几个示例脚本中必要的部分翻译成了中文,以供参考。

向本项目的所有贡献者致敬。

英译汉:远哥挺乐

Translator’s Note:

This project facenet-pytorch is a very convenient face recognition library that can be installed directly via pip.

The library contains two important features:

  • Face detection: using the MTCNN algorithm
  • Face recognition: using the FaceNet algorithm

With this library, one can easily carry out face detection and face vector mapping operations.

In order to facilitate Chinese developers in studying face recognition and contributing code, I have translated the README file of this project and some necessary parts of several example scripts located in the examples directory into Chinese.

Salute to all contributors to this project.

Translated from English to Chinese by 远哥挺乐.

在这里插入图片描述

这是 pytorch 中 Inception Resnet (V1) 模型的存储库,在 VGGFace2 和 CASIA-Webface 上进行了预训练。

Pytorch 模型权重使用从 David Sandberg 的 tensorflow Facenet repo 移植的参数进行初始化。

该存储库中还包含 MTCNN 的高效 pytorch 实现,用于推理之前的人脸检测。这些模型也是经过预训练的。据我们所知,这是最快的 MTCNN 实现。

目录

  • 目录
  • 快速启动
  • 预训练模型
  • 示例笔记本
    • 完整的检测和识别流程
    • 视频流中的人脸跟踪
    • 使用新数据微调预训练模型
    • facenet-pytorch 中的 MTCNN 指南
    • 人脸检测包的性能比较
    • FastMTCNN 算法
  • 使用 docker 运行
  • 在您自己的 git 项目中使用此存储库
  • Tensorflow 到 Pytorch 的参数转换
  • 参考资料

快速启动

  1. 安装:
# 使用pip安装:
pip install facenet-pytorch

# 或克隆此存储库,删除“-”以允许 python 导入:
git clone https://github.com/timesler/facenet-pytorch.git facenet_pytorch

# 或使用 docker 容器(参见 https://github.com/timesler/docker-jupyter-dl-gpu):
docker run -it --rm timesler/jupyter-dl-gpu pip install facenet-pytorch && ipython
  1. 在python中,导入 facenet-pytorch 并实例化模型:
from facenet_pytorch import MTCNN, InceptionResnetV1

# 如果需要,使用 MTCNN 创建人脸检测模型:
mtcnn = MTCNN(image_size=<image_size>, margin=<margin>)

# 创建一个 inception resnet(在 eval 模式下):
resnet = InceptionResnetV1(pretrained='vggface2').eval()
  1. 处理图像:
from PIL import Image

img = Image.open(<image path>)

# 获取裁剪和预白化的图像张量
img_cropped = mtcnn(img, save_path=<optional save path>)

# 计算嵌入(解压缩以添加批量维度)
img_embedding = resnet(img_cropped.unsqueeze(0))

# 或者,如果用于 VGGFace2 分类
resnet.classify = True
img_probs = resnet(img_cropped.unsqueeze(0))

有关使用和实现详细信息,请参阅 help(MTCNN)help(InceptionResnetV1)

预训练模型

请参阅:models/inception_resnet_v1.py

以下模型已移植到 pytorch(包含下载 pytorch state_dict 的链接):

模型名称LFW 准确度(如此处列出)训练数据集
20180408-102900 (111MB)0.9905CASIA-Webface
20180402-114759 (107MB)0.9965VGGFace2

无需手动下载预训练的state_dict;它们会在模型实例化时自动下载,并缓存在 torch 缓存中以供将来使用。要在 pytorch 中使用 Inception Resnet (V1) 模型进行面部识别/识别,请使用:

from facenet_pytorch import InceptionResnetV1

# 对于在 VGGFace2 上预训练的模型
model = InceptionResnetV1(pretrained='vggface2').eval()

# 对于在 CASIA-Webface 上预训练的模型
model = InceptionResnetV1(pretrained='casia-webface').eval()

# 对于具有 100 个类的未经训练的模型
model = InceptionResnetV1(num_classes=100).eval()

# 对于未经训练的 1001 类分类器
model = InceptionResnetV1(classify=True, num_classes=1001).eval()

两个预训练模型均在 160x160 像素图像上进行训练,因此如果应用于调整为该形状的图像,则效果最佳。为了获得最佳结果,还应该使用 MTCNN 将图像裁剪到脸部(见下文)。

默认情况下,上述模型将返回 512 维图像嵌入。要启用分类,请将 classify=True 传递给模型构造函数,或者您可以随后使用 model.classify = True 设置对象属性。对于 VGGFace2,预训练模型将输出长度为 8631 的 logit 向量,对于 CASIA-Webface 则输出长度为 10575 的 logit 向量。

示例笔记本

完整的检测和识别流程

通过首先使用 MTCNN 检测人脸,然后使用 Inception Resnet 模型计算嵌入或概率,可以轻松地将人脸识别应用于原始图像。 examples/infer_cn.ipynb 中的示例代码提供了一个利用数据集、数据加载器和可选 GPU 处理的完整示例流程。

视频流中的人脸跟踪

MTCNN 可用于构建人脸跟踪系统(使用 MTCNN.detect() 方法)。完整的面部跟踪示例可以在 examples/face_tracking_cn.ipynb 中找到。

请添加图片描述

使用新数据微调预训练模型

在大多数情况下,实现人脸识别的最佳方法是直接使用预训练模型,通过聚类算法或简单的距离度量来确定人脸的身份。但是,如果需要微调(即,如果您想根据模型的输出 logits 选择标识),可以在 examples/finetune_cn.ipynb 中找到示例。

facenet-pytorch 中的 MTCNN 指南

本指南演示了 MTCNN 模块的功能。涵盖的主题有:

  • 基本用法
  • 图像标准化
  • 面边距
  • 单张图像中的多个面孔
  • 批量检测
  • 边界框和面部标志
  • 保存人脸数据集

请参阅kaggle 笔记本。

人脸检测包的性能比较

本笔记本演示了三个人脸检测包的使用:

  1. facenet-pytorch
  2. mtcnn
  3. dlib

每个包都经过测试,测试其在启用 GPU 支持的情况下检测一组 300 张图像(来自一个视频的所有帧)中的面部的速度。性能基于 Kaggle 的 P100 笔记本内核。结果总结如下。

套餐FPS (1080x1920)FPS (720x1280)FPS (540x960)
facenet-pytorch12.9720.3225.50
facenet-pytorch(非批处理)9.7514.8119.68
dlib3.808.3914.53
mtcnn3.045.708.23

在这里插入图片描述

请参阅kaggle 笔记本。

FastMTCNN 算法

该算法演示了如何通过利用相邻帧之间的相似性来实现极其高效的人脸检测,特别是在视频中。

请参阅[kaggle 笔记本](https://www.kaggle.com/timesler/fast-mtcnn- detector-55-fps-at-full-resolution)。

使用 docker 运行

该包和任何示例笔记本都可以使用 docker(或 nvidia-docker)运行:

docker run --rm -p 8888:8888
    -v ./facenet-pytorch:/home/jovyan timesler/jupyter-dl-gpu \
    -v <path to data>:/home/jovyan/data
    pip install facenet-pytorch && jupyter lab 

导航到 example/ 目录并运行任何 ipython 笔记本。

有关 docker 容器的详细信息,请参阅 timesler/jupyter-dl-gpu。

在您自己的 git 项目中使用此存储库

要在您自己的 git 存储库中使用此代码,我建议首先将此存储库添加为子模块。请注意,当克隆为子模块时,应删除存储库名称中的破折号(“-”),因为它会在导入时破坏 python:

git submodule add https://github.com/timesler/facenet-pytorch.git facenet_pytorch

或者,可以使用 pip 将代码安装为包:

pip install facenet-pytorch

Tensorflow 到 Pytorch 的参数转换

请参阅:models/utils/tensorflow2pytorch.py

请注意,使用此存储库中的模型不需要此功能,该功能仅依赖于pytorch保存的 state_dict

实例化 pytorch 模型后,每层的权重均从 davidsandberg/facenet 的预训练 Tensorflow 模型中的等效层加载。

原始 Tensorflow 模型和 pytorch 移植模型的输出的等效性已经过测试并且是相同的:


>>> compare_model_outputs(mdl, sess, torch.randn(5, 160, 160, 3).detach())

Passing test data through TF model (通过TF模型传递测试数据)

tensor([[-0.0142,  0.0615,  0.0057,  ...,  0.0497,  0.0375, -0.0838],
        [-0.0139,  0.0611,  0.0054,  ...,  0.0472,  0.0343, -0.0850],
        [-0.0238,  0.0619,  0.0124,  ...,  0.0598,  0.0334, -0.0852],
        [-0.0089,  0.0548,  0.0032,  ...,  0.0506,  0.0337, -0.0881],
        [-0.0173,  0.0630, -0.0042,  ...,  0.0487,  0.0295, -0.0791]])

Passing test data through PT model (通过PT模型传递测试数据)

tensor([[-0.0142,  0.0615,  0.0057,  ...,  0.0497,  0.0375, -0.0838],
        [-0.0139,  0.0611,  0.0054,  ...,  0.0472,  0.0343, -0.0850],
        [-0.0238,  0.0619,  0.0124,  ...,  0.0598,  0.0334, -0.0852],
        [-0.0089,  0.0548,  0.0032,  ...,  0.0506,  0.0337, -0.0881],
        [-0.0173,  0.0630, -0.0042,  ...,  0.0487,  0.0295, -0.0791]],
       grad_fn=<DivBackward0>)

Distance 1.2874517096861382e-06 (距离1.2874517096861382e-06)

为了重新运行 Tensorflow 参数到 pytorch 模型的转换,请确保使用子模块克隆此存储库,因为 davidsandberg/facenet 存储库作为子模块包含在内,并且转换需要其中的一部分。

参考资料

  1. David Sandberg’s facenet repo: https://github.com/davidsandberg/facenet

  2. F. Schroff, D. Kalenichenko, J. Philbin. FaceNet: A Unified Embedding for Face Recognition and Clustering, arXiv:1503.03832, 2015. PDF

  3. Q. Cao, L. Shen, W. Xie, O. M. Parkhi, A. Zisserman. VGGFace2: A dataset for recognising face across pose and age, International Conference on Automatic Face and Gesture Recognition, 2018. PDF

  4. D. Yi, Z. Lei, S. Liao and S. Z. Li. CASIAWebface: Learning Face Representation from Scratch, arXiv:1411.7923, 2014. PDF

  5. K. Zhang, Z. Zhang, Z. Li and Y. Qiao. Joint Face Detection and Alignment Using Multitask Cascaded Convolutional Networks, IEEE Signal Processing Letters, 2016. PDF

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/780691.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

git 和adb

一、git 1、git的作用 git是一个版本控制系统&#xff0c;是一种记录一个或若干文件内容变化&#xff0c;以便将来查阅特定版本修订情况的系统。 我的理解就是代码管理器&#xff1a; 第一点你可将代码备份到git仓上&#xff1b; 第二点可记录的你修改记录&#xff1b; 第三点…

Vue中TodoLists案例_删除

与上一篇Vue中TodoList案例_勾选有三个文件变化了 App.vue&#xff1a;添加了一个deleteTodo根据id删除方法&#xff0c;传递给儿子组件MyList <template><div id"root"><div class"todo-container"><div class"todo-wrap"…

Android ObjectBox数据库的使用与详解

一、介绍 Room数据库 之前我已介绍了jetpack组件的数据库&#xff1a;Room&#xff0c;有小伙伴需要了解Room数据库可以查看这个地址&#xff1a;Android JetPack组件之Room数据库的集成与详解_android room数据库_蜗牛、Z的博客-CSDN博客 数据库的性能对设备来说很重要&#…

【雕爷学编程】Arduino动手做(168)---ATTINY85迷你USB开发板

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

【Spring MVC学习】连接 接收请求参数 响应返回参数

目录 前言&#xff1a;认识Spring MVC &#x1f337;1、什么是MVC&#xff1f; 一、建立连接&#xff08;5个注解&#xff09; &#x1f337;1、RequestMapping注解:注册接⼝的路由映射&#xff08;默认返回页面&#xff09; &#x1f337;2、ResponseBody注解&#xff1a…

从简单线性回归到TensorFlow深度学习

大家好&#xff0c;人工智能近年来变得越来越流行&#xff0c;学习人工智能的需求也随之增加&#xff0c;尤其是许多IT专业人士希望利用机器学习的强大功能&#xff0c;但面临不小的挑战&#xff0c;尤其是在理论和数学上。 步骤1&#xff1a;线性回归 线性回归是一种统计学中…

Centos7:http/PhP升级

系列文章目录 RHCE第0章&#xff1a;RHCE开始前的准备 RHCE第1章&#xff1a;Web服务器&#xff08;上&#xff09; RHCE第1章&#xff1a;Web服务器&#xff08;下&#xff09; RHCE第2章&#xff1a;DNS服务 RHCE第3章&#xff1a;DHCP服务器 RHCE第4章&#xff1a;Firewall…

第一天基础名词

文章目录 一、域名1、域名的概念2、域名注册3、域名的分类 二、DNS1、DNS的概念2、DNS解析3、本地hosts文件与DNS的关系4、如何查看本地Hosts文件 三、CDN1、CDN的概念2、CDN原理&#xff08;1&#xff09;回顾域名解析&#xff08;2&#xff09;CDN原理 3、常见DNS攻击 四、脚…

【C语言】结构体与offsetof实现

远看山有色&#xff0c;近听水无声。春去花还在&#xff0c;人来鸟不惊。 — 唐代王维《画》 这篇博客我们会详细介绍结构体相关知识&#xff0c;干货满满。 结构体的声明&#x1f340; 一般来说结构体应该有成员列表和变量列表这两个基础的模式。 例如描述一个学生&#xf…

Windows下YUICompress实现js、css混淆压缩

首先&#xff0c;我们针对Linux下的部分命令进行Windows系统的对应实现 ls————cmd /c dir/b rm————cmd /c del mv————cmd /c move pwd————cmd /c chdir 注&#xff1a;cmd /c是执行完命令后关闭命令行窗口、cmd /k是执行完命令后不关闭命令行窗口、cmd /c sta…

Vue第五篇:电商网站登录时vuex的使用

页面&#xff1a; 代码资源见&#xff1a;https://download.csdn.net/download/benben044/88071987 其中css使用开源库的UI&#xff0c;Main里面的元素是一张截图。 通过vuecli脚手架生成的代码架构如下&#xff1a; 一、入口组件App.vue解析 主页面主要由两部分组成&#x…

Leetcode-每日一题【114.二叉树展开为链表】

题目 给你二叉树的根结点 root &#xff0c;请你将它展开为一个单链表&#xff1a; 展开后的单链表应该同样使用 TreeNode &#xff0c;其中 right 子指针指向链表中下一个结点&#xff0c;而左子指针始终为 null 。 展开后的单链表应该与二叉树 先序遍历 顺序相同。 示例…

OSI七层模型和TCP/IP四层模型以及五层模型

OSI七层模型&#xff08;Open System Interconnect&#xff09;即开放系统互连参考模型&#xff0c;是由ISO&#xff08;International Organization for Standardization&#xff09;国际标准化组织提出的&#xff0c;用于计算机或通信系统间互联的标准体系。 从上到下可分为…

Flask 导航栏,模版渲染多页面

项目结构 app.py from flask import Flask, render_templateapp Flask(__name__)app.route(/) def index():return render_template(index.html)app.route(/secondpage) def secondpage():return render_template(secondpage.html)app.route(/threepage) def threepage():ret…

Linux驱动开发实战(一)——设备驱动模型

文章目录 前言设备驱动模型概述设备驱动模型的功能sysfs文件系统sysfs文件系统的目录结构 设备驱动模型的核心数据结构kobject结构体设备属性kobj_type 注册kobject到sysfs中的实例设备驱动模型结构kset集合kset与kobject的关系kset相关的操作函数注册kobject到sysfs中的实例实…

绘出「星辰大海」:华为云Astro轻应用新手指南-第一章

第1章 旅程的开端 发现Astro轻应用地图 第1站&#xff1a;创建账户 首先&#xff0c;你需要在华为云Astro官网注册专属账号。若已有华为账户&#xff0c;可直接登录。 在官网点击「立即使用」&#xff0c;即可跳转至「登录界面」 在「登录界面」点击「注册」&#xff0c;注册…

后端(四):博客系统项目

咱们在这里实现的是后端项目&#xff0c;前端代码就提一提&#xff0c;不全做重点介绍&#xff0c;在开始讲解这个博客系统项目之前&#xff0c;我们先看看这个项目的前端界面&#xff1a; 登录界面&#xff1a; 个人主页&#xff1a; 博客详情页&#xff1a; 写博客页&#x…

Python实战

官方文档 请点击下面工程名称&#xff0c;跳转到代码的仓库页面&#xff0c;将工程 下载下来 Demo Code 里有详细的注释 LearnPythonPython 实现功能点demo

Mac苹果系统安装双系统Windows10 Windows11 BOOTCAMP

Mac系统安装双系统Windows10 BOOTCAMP详细 1.下载Windows系统2.开始安装3.安装驱动4.默认启动5.备注 1.下载Windows系统 注意一下所有安装全程接充电器操作&#xff0c;以免安装过程中电脑断电带来不必要影响。 从下列方式选择合适的系统进行下载。 MSDN https://msdn.itelly…

【NLP】无服务器问答系统

一、说明 在NLP的眼见的应用&#xff0c;就是在“ 当你在谷歌上提出一个问题并立即得到答案时会发生什么&#xff1f;例如&#xff0c;如果我们在谷歌搜索中询问谁是美国总统&#xff0c;我们会得到以下回答&#xff1a;Joe Biden&#xff1b;这是一个搜索问题&#xff0c;同时…