图像读取裁剪与人脸识别

图像读取

Image read ⇒ \Rightarrow torchvision.datasets

from torchvision import datasets
dataset = datasets.ImageFolder(data_dir, transform=transforms.Resize((512, 512)))

在这里插入图片描述

Return value illustration

  1. dataset[0][0]是PIL.Image objects,这利用IPython.display输出image,
from IPython import display
dataset = datasets.ImageFolder(data_dir, transform=transforms.Resize((512, 512)))
print(dataset)
print(len(dataset))
print(dataset.samples)
print(dataset[0][0])
print(dataset[0][1])
display.display(dataset[0][0])
print(dataset.samples[0][0])
print(dataset.samples[0][1])
dataset.samples = [(p, p.replace(data_dir, data_dir + '_cropped'))for p, _ in dataset.samples
]
print(dataset.samples[0][0])
print(dataset.samples[0][1])loader = DataLoader(dataset,num_workers=workers,batch_size=batch_size,collate_fn=training.collate_pil
)for i, (x, y) in enumerate(loader):mtcnn(x, save_path=y)print('\r第 {} 批,共 {} 批'.format(i + 1, len(loader)), end='')# Remove mtcnn to reduce GPU memory usage
del mtcnnhelp(datasets.ImageFolder)

在这里插入图片描述
返回的dataset类有如下函数:

  1. dataset[0][0]=PIL.Image,[1]=tag
  2. dataset.sample[0][0]
  3. len(dataset)

之后DataLoader加载数据集

loader = DataLoader(…)返回的DataLoader是什么,如何使用

`DataLoader`返回的是一个迭代器,用于从给定的`dataset`中按照指定的`batch_size`以及其他参数,生成批次的数据。
每个批次数据是一个元组,其中包含了输入样本和对应的标签。在给定的代码中,`DataLoader`会使用`dataset`作为数据源,设置`num_workers`参数表示同时使用多少个子进程来加载数据,设置`batch_size`参数
表示每个批次的样本数量。`collate_fn`参数是一个用来自定义如何将样本列表组合成一个批次的函数。通过使用`DataLoader`,可以方便地对大规模数据集进行批次加载,以进行训练或推理操作。
使用`DataLoader`的好处是可以自动进行数据并行处理,提高数据加载的效率。
for i, (x, y) in enumerate(loader):

是常用的 图像/样本 使用方式,x是图像batch列表,
在这里插入图片描述
x是图像,y是路径,好繁琐

图像裁剪

MTCNN 说明

facenet_pytorch.MTCNN是一个用于人脸检测和对齐的Python库。它使用了三个级联的神经网络来完成这个任务,分别是P-Net、R-Net和O-Net。在MTCNN中,有三个阈值需要设置,分别是人脸检测的阈值、人脸对齐的阈值和人脸裁剪的阈值。人脸检测的阈值(detection_threshold):用于确定是否存在人脸的阈值,默认值为0.6。当检测到的人脸置信度大于该阈值时,认为存在人脸。人脸对齐的阈值(landmarks_threshold):用于确定是否成功对齐人脸的阈值,默认值为0.7。当对齐后的人脸关键点置信度大于该阈值时,认为对齐成功。人脸裁剪的阈值(min_face_size):用于确定最小人脸尺寸的阈值,默认值为20。当检测到的人脸尺寸小于该阈值时,将被忽略。这些阈值可以根据具体应用场景进行调整,以达到更好的检测和对齐效果。
from facenet_pytorch import MTCNN
mtcnn = MTCNN(image_size=160, margin=0, min_face_size=20,thresholds=[0.6, 0.7, 0.7], factor=0.709, post_process=True,device=device
)
facenet_pytorch.MTCNN是一个用于人脸检测和对齐的模型,它有以下几个参数:min_face_size:最小人脸尺寸。默认值为20,表示检测到的人脸的最小边长为20个像素。thresholds:阈值列表。默认值为[0.6, 0.7, 0.7],表示在三个不同的阈值下进行人脸检测和对齐。factor:图像金字塔的缩放因子。默认值为0.709,用于生成不同尺度的图像。post_process:是否进行后处理。默认值为True,表示进行后处理以去除重叠的人脸框。device:设备类型。默认值为"cuda:0",表示使用GPU进行计算。如果没有可用的GPU,则可以设置为"cpu"。keep_all:是否保留所有检测到的人脸框。默认值为False,表示只保留最大的人脸框。select_largest:是否选择最大的人脸框。默认值为False,表示选择所有检测到的人脸框。prewhiten:是否对图像进行预白化处理。默认值为True,表示对图像进行预处理以提高模型性能。

Cropping out 人脸框

用mtcnn对x裁剪,放入地址=y,

for i, (x, y) in enumerate(loader):mtcnn(x, save_path=y)display.display(display.Image(y[0]))print('\r第 {} 批,共 {} 批'.format(i + 1, len(loader)), end='')

IPython中输出如下:
在这里插入图片描述

Resnet 人脸识别

形成(嵌入式表示,索引)对

from facenet_pytorch import MTCNN,InceptionResnetV1
import torch
from torchvision import datasets
from torch.utils.data import DataLoadermtcnn=MTCNN(image_size=240,margin=0,min_face_size=20)
resnet=InceptionResnetV1(pretrained='vggface2').eval()dataset=datasets.ImageFolder('./data/test_images')
idx_to_class={i:c for c,i in dataset.class_to_idx.items()}def collate_fn(x):return x[0]loader=DataLoader(dataset,collate_fn=collate_fn)face_list=[]
name_list=[]
embedding_list=[]
for img,idx in loader:face,prob =mtcnn(img,return_prob=True)if face is not None and prob>0.90:emb=resnet(face.unsqueeze(0))embedding_list.append(emb.detach())name_list.append(idx_to_class[idx])
  • 存入’data.pt’
data=[embedding_list,name_list]
torch.save(data,'data.pt')

找出龙队

  • 将’ml3.jpg’与已有数据库的嵌入式比较,选择欧式距离最小的索引
from PIL import Imagedef face_match(img_path,data_path):img=Image.open(img_path)face,prob = mtcnn(img,return_prob=True)emb=resnet(face.unsqueeze(0)).detach()saved_data = torch.load('data.pt')embedding_list = saved_data[0]name_list = saved_data[1]dist_list = []for idx,emb_db in enumerate(embedding_list):dist = torch.dist(emb,emb_db).item()dist_list.append(dist)idx_min = dist_list.index(min(dist_list))return name_list[idx_min]person=face_match('ml3.jpg','data.pt')
print(person)

在这里插入图片描述
./data/test_images为开头的资源
用于测试的龙队的图片’ml3.jpg’如下:
在这里插入图片描述
用来生成(embed,index)对的图片如下:
在这里插入图片描述
可见,用resnet形成的同一个人的图片的嵌入式表示的欧式距离很接近,算法有效
但这个嵌入式表示是如何形成的呢,有其他方式形成吗?

facenet_pytorch.InceptionResnetV1

facenet_pytorch是一个用于人脸识别的PyTorch库,而InceptionResnetV1是其中的一个模型。
InceptionResnetV1是由Google团队提出的一种深度卷积神经网络架构,它结合了Inception模块和残差连接的思想。Inception模块是一种多分支的卷积结构,通过不同大小的卷积核并行处理输入特征图,然后将它们在通道维度上进行拼接,
从而捕捉不同尺度的特征。这种结构可以有效地提取丰富的特征信息。残差连接是为了解决深度神经网络训练过程中的梯度消失和梯度爆炸问题。通过在网络中引入跳跃连接,将输入直接与输出相加,
可以使得网络更容易学习到残差部分,从而提高网络的性能。InceptionResnetV1结合了Inception模块和残差连接的优点,可以在保持较低计算复杂度的同时提高网络的准确性。
它在人脸识别任务中表现出色,被广泛应用于人脸验证、人脸检测等领域。
from facenet_pytorch import MTCNN,InceptionResnetV1
import torch
from torchvision import datasets
from torch.utils.data import DataLoadermtcnn=MTCNN(image_size=240,margin=0,min_face_size=20)
resnet=InceptionResnetV1(pretrained='vggface2').eval()dataset=datasets.ImageFolder('./data/test_images')
idx_to_class={i:c for c,i in dataset.class_to_idx.items()}def collate_fn(x):return x[0]loader=DataLoader(dataset,collate_fn=collate_fn)face_list=[]
name_list=[]
embedding_list=[]
for img,idx in loader:face,prob =mtcnn(img,return_prob=True)print(face.shape)if face is not None and prob>0.90:emb=resnet(face.unsqueeze(0))print(emb.shape)embedding_list.append(emb.detach())name_list.append(idx_to_class[idx])

在这里插入图片描述
resnet的输入维度为(1,3,240,240),Output.shape=[1,512]

衡量嵌入表示相似性的其他方式

  • 上面,我们采用torch.dist(emb,emb_db)比较test_sample和dict的相似性,还有其他聚类,idea=减小类内损失,扩大类间损失
torch.dist函数的语法如下:
torch.dist(input, other, p=2)其中,input和other是两个张量,表示要计算距离的两个向量或矩阵。p是一个可选参数,表示要计算的距离类型,默认为2,即欧氏距离。具体来说,torch.dist函数根据p的取值,计算不同类型的距离:当p=0时,计算非零元素的数量(L0范数)。
当p=1时,计算曼哈顿距离(L1范数)。
当p=2时,计算欧氏距离(L2范数)。
当p=float(‘inf’)时,计算切比雪夫距离(L∞范数
  • Next,we mainly talk about ArcFace

Resnet+ArcFace

where to find lfw dataset for evaluating?

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

音视频技术-电脑连接调音台时交流声的产生与消除

当电脑(笔记本/台式机)声卡通过音频线与调音台(或扩音机)连接时,能听到“交流声”。有时很轻微,有时很明显,甚至干扰正常的演讲或发言。 很多时候,我们在台上演讲时,都会…

Easy-Jmeter: 性能测试平台

目录 写在开始1 系统架构2 表结构设计3 测试平台生命周期4 分布式压测5 压力机管理6 用例管理6.1 新增、编辑用例6.2 调试用例6.3 启动测试6.4 动态控量6.5 测试详情6.6 环节日志6.7 实时数据6.8 测试结果 7 测试记录7 用例分析8 系统部署8.1普通部署8.2容器化部署 写在最后 写…

嵌入式C语言(三)

typeof() 使用typeof可以获取一个变量或表达式的类型。 typeof的参数有两种形式:表达式或类型。 int i;typeof(i) j 20; --> int j 20;typeof(int *) a; -->int *a; int f(); -->typeof(f()) k;--? int k我们可以看出通过typeof获取一个变量的…

前后端分离Vue+node.js在线学习考试系统gqw7o

与其它应用程序相比,在线学习平台的设计主要面向于学校,旨在为管理员和学生、教师、院系提供一个在线学习平台。学生、教师、院系可以通过系统及时查看公告信息等。 在线学习平台是在Windows操作系统下的应用平台。为防止出现兼容性及稳定性问题&#xf…

使用 Verilog 做一个可编程数字延迟定时器 LS7211-7212

今天的项目是在 Verilog HDL 中实现可编程数字延迟定时器。完整呈现了延迟定时器的 Verilog 代码。 所实现的数字延迟定时器是 CMOS IC LS7212,用于生成可编程延迟。延迟定时器的规格可以在这里轻松找到。基本上,延迟定时器有 4 种操作模式:…

用c# 自己封装的Modbus工具类库源码

前言 Modbus通讯协议在工控行业的应用是很多的,并且也是上位机开发的基本技能之一。相关的类库也很多也很好用。以前只负责用,对其并没有深入学习和了解。前段时间有点空就在这块挖了挖。想做到知其然还要知其所以然。所以就有了自己封装的Modbus工具类库…

Leetcode3014. 输入单词需要的最少按键次数 I

题目&#xff1a; 代码(首刷看解析 2024年2月21日&#xff09;&#xff1a; class Solution { public:int minimumPushes(string word) {int n word.size();if (n < 8) return n;int mo n % 8;int x n / 8;int res 0;for (int i 1; i < x 1; i) {res i * 8;}res …

leet hot 100-6 三数之和

三数之和 原题链接思路代码 原题链接 leet hot 100-5 15. 三数之和 思路 从前往后定义第一个数字 first 开始遍历整个数组 然后要求 frist和上一个数字不重复否则就是重复组合 从frist往后遍历第二个数字 同样要求第二个数字不能重复 再定义第三个数字从后往前面数 三个数字…

iOS面试:4.多线程GCD

一、多线程基础知识 1.1 什么是进程&#xff1f; 进程是指在系统中正在运行的一个应用程序。对于电脑而已&#xff0c;你打开一个软件&#xff0c;就相当于开启了一个进程。对于手机而已&#xff0c;你打开了一个APP&#xff0c;就相当于开启了一个进程。 1.2 什么是线程&am…

http协议基础与Apache的简单介绍

一、相关介绍&#xff1a; 互联网&#xff1a;是网络的网络&#xff0c;是所有类型网络的母集因特网&#xff1a;世界上最大的互联网网络。即因特网概念从属于互联网概念。习惯上&#xff0c;大家把连接在因特网上的计算机都成为主机。万维网&#xff1a;WWW&#xff08;world…

二叉树和堆

二叉树和堆 一、树的概念和结构二、二叉树的概念三、堆四、堆的创建one、堆的插入(需要与向上或者向下调整算法配合(取决于你建大堆还是小堆)two、剔除堆中的根节点 五、堆的简单排序 一、树的概念和结构 树是一种非线性的的数据结构&#xff0c;逻辑结构就是一颗倒挂的树&…

Linux使用Docker部署Nacos容器并结合内网穿透实现公网访问本地服务

文章目录 推荐1. Docker 运行Nacos2. 本地访问Nacos3. Linux安装Cpolar4. 配置Nacos UI界面公网地址5. 远程访问 Nacos UI界面6. 固定Nacos UI界面公网地址7. 固定地址访问Plik 推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff…

精美的WordPress外贸独立站模板

WordPress外贸独立站主题 简洁实用的WordPress外贸独立站主题&#xff0c;适合时尚服装行业搭建wordpress企业官网使用。 https://www.jianzhanpress.com/?p4999 简洁wordpress独立站模板 绿色精美、简洁大气的wordpress外贸独立网站模板 https://www.jianzhanpress.com/?…

本地配置多个git账户及ll设置

本地配置多个git账户 清除全局配置将命令行&#xff0c;切换到ssh目录生成GitLab和Gitee的公钥、私钥去对应的代码仓库添加 SSH Keys添加私钥ll设置 管理密钥验证仓库配置关于gitgitee.com: Permission denied (publickey) 清除全局配置 此步骤可以不做&#xff0c;经测试不影…

微信小程序本地开发

微信小程序本地开发时不需要在小程序后台配置服务器域名直接在小程序项目中填写后端在本机的IP地址和端口号 如图&#xff08;第一步&#xff09; 填写地址后发现报错&#xff0c;url不是合法域名&#xff0c;则在详情设置不校验合法域名 如图&#xff08;第二歩&#xff09;…

AI:134-基于深度学习的社交媒体图像内容分析

🚀点击这里跳转到本专栏,可查阅专栏顶置最新的指南宝典~ 🎉🎊🎉 你的技术旅程将在这里启航! 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 ✨✨✨ 每一个案例都附带有在本地跑过的关键代码,详细讲解供…

猫头虎分享已解决Bug || AttributeError: ‘Sequential‘ object has no attribute ‘session‘

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

Remainder Problem(根号分治)

Educational Codeforces Round 71 (Rated for Div. 2) F. Remainder Problem 题目链接 F. Remainder Problem 题意&#xff1a; 给你一个由 500000 500000 500000 个整数&#xff08;编号从 1 1 1 到 500000 500000 500000 &#xff09;组成的数组 a a a 。最初 a a a…

SpringBoot -【SmartInitializingSingleton】基础使用及应用场景

SmartInitializingSingleton 在继续深入探讨 SmartInitializingSingleton接口之前&#xff0c;让我们先了解一下 Spring Framework 的基本概念和背景。Spring Framework 是一个开源的 JavaEE&#xff08;Java Enterprise Edition&#xff09;全栈&#xff08;full-stack&#x…

PureFlash v1.9.1特性介绍

PureFlashv1.9.1版本特性主要有3个&#xff1a; 1. 支持RDMA网络 使用RDMA协议可以大大减少对CPU的消耗&#xff0c;性能提升30%以上。 PureFlash的网络配置分为存储节点间网络&#xff08;存储后端网&#xff09;和客户端网络&#xff08;前端网&#xff09;。都支持使用RD…