图像读取裁剪与人脸识别

图像读取

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.mzph.cn/news/704198.shtml

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

相关文章

小红书关键词爬虫

标题 1 统计要收集的关键词,制作一个文件夹2 爬取每一页的内容3 爬取标题和内容4 如果内容可以被查看,爬取评论内容5 将结果进行汇总,并且每个帖子保存为一个json文件,具体内容6 总结1 统计要收集的关键词,制作一个文件夹 例如,我要收集旅游相关的,就收集: 旅游、旅行…

关系型数据库事务的四性ACID:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)

关系型数据库事务的四性ACID:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability) 事务的四性通常指的是数据库事务的ACID属性,包括原子性&…

Python从入门到精通指南【第101篇—入门到精通】【文末送书-24】

文章目录 Python从入门到精通指南第一步:入门基础1.1 安装Python1.2 Hello World1.3 变量和数据类型1.4 控制流程 第二步:深入学习2.1 函数和模块2.2 列表、元组和字典2.3 文件操作 第三步:高级主题3.1 面向对象编程3.2 异常处理3.3 正则表达…

大型电商日志离线分析系统(一)

一、项目需求分析 某大型网站日志离线分析系统 1.1 概述 该部分的主要目标就是描述本次项目最终七个分析模块的页面展示。 1.2 工作流 在我们的demo展示中,我们使用jqueryecharts的方式调用程序后台提供的rest api接口,获取json数据,然后…

《极简C++学习专栏》之结束语

朋友们,经过这么长的时间,《极简C学习专栏》的文章创作就要结束了,感谢你们一路陪伴! 也希望你们能支持我接下来的其他专栏的创作! 专栏的初衷 《极简C学习》专栏的初衷源自于我个人的学习笔记,记录下自己…

网络安全与信创产业发展:构建数字时代的护城河

✨✨ 欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭❤~✨✨ 🌟🌟 欢迎各位亲爱的读者,感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua,在这里我会分享我的知识和经验。&#x…

数字人的未来:数字人对话系统 Linly-Talker + 克隆语音 GPT-SoVITS

🚀数字人的未来:数字人对话系统 Linly-Talker 克隆语音 GPT-SoVITS https://github.com/Kedreamix/Linly-Talker 2023.12 更新 📆 用户可以上传任意图片进行对话 2024.01 更新 📆 令人兴奋的消息!我现在已经将强…

Vue | (六)使用Vue脚手架(下)| 尚硅谷Vue2.0+Vue3.0全套教程

文章目录 📚Vue 中的自定义事件🐇使用方法🐇案例练习🐇TodoList案例优化 📚全局事件总线🐇使用方法🐇案例练习🐇TodoList案例优化 📚消息订阅与发布🐇使用方法…

嵌入式C语言(一)

最初我是golang出生,当时做项目的时候java、c、js、python都折腾过,但是关于c语言的接触,基本上都停留在大一的那个暑假。 后面一个项目需要写驱动,再到后门需要做DFX,再到我打开内核的源码,我一脸懵逼&am…

改进 RAG:自查询检索

原文地址:Improving RAG: Self Querying Retrieval 2024 年 2 月 11 日 让我们来解决构建 RAG 系统时的一个大问题。 我们不能依赖语义搜索来完成每个检索任务。只有当我们追求单词的含义和意图时,语义搜索才有意义。 But in case,我们正…

【读文献】DynamicBind生成式模型预测蛋白配体复合物

published at nature communication (2024.01.24) code link paper link 摘要 尽管在预测静态蛋白质结构方面取得了重大进展,但蛋白质的内在动态性,受到配体调节,对于理解蛋白质功能和促进药物发现至关重要。 传统的对接方法,常…

LCR 172. 统计目标成绩的出现次数

解题思路&#xff1a;二分查找 题解一 class Solution {public int countTarget(int[] scores, int target) {// 搜索右边界 rightint i 0, j scores.length - 1;while(i < j) {int m (i j) / 2;if(scores[m] < target) i m 1;else j m - 1;}int right i;// 若数…

wpf 简单实验 数据更新 列表更新

1.概要 1.1 需求 一个列表提供添加修改删除的功能&#xff0c;添加和修改的内容都来自一个输入框 1.2 要点 DisplayMemberPath"Zhi"列表.ItemsSource datalist;(列表.SelectedItem ! null)(列表.SelectedItem as A).Zhi 内容.Text;datalist.Remove((列表.Selec…

9.网络游戏逆向分析与漏洞攻防-游戏网络架构逆向分析-接管游戏连接服务器的操作

内容参考于&#xff1a;易道云信息技术研究院VIP课 上一个内容&#xff1a;游戏底层功能对接类GameProc的实现 码云地址&#xff08;master 分支&#xff09;&#xff1a;https://gitee.com/dye_your_fingers/titan 码云版本号&#xff1a;44c54d30370d3621c1e9ec3d7fa1e2a0…

IDEA配置有道翻译插件

目录 安装Translation插件有道云配置翻译APIIDEA配置有道翻译引擎 关于IDEA Translation插件中有道智云&#xff08;有道翻译&#xff09;应用ID&#xff0c;密钥申请教程 安装Translation插件 File -> Settings ->Plugins ->搜索Translation ->insatll 有道云…

YOLOv9中“CBLinear”的结构!

ADown结构出炉啦&#xff0c;收藏起来写论文用&#xff01; 1.代码&#xff1a; 代码路径&#xff1a;yolov9-main->models->common.py&#xff0c;代码如下&#xff1a; class CBLinear(nn.Module):def __init__(self, c1, c2s, k1, s1, pNone, g1): # ch_in, ch_outs…

nginx设置缓存时间

一、设置缓存时间 当网页数据返回给客户端后&#xff0c;可针对静态网页设置缓存时间&#xff0c;在配置文件内的http段内server段添加location&#xff0c;更改字段expires 1d来实现&#xff1a;避免重复请求&#xff0c;加快访问速度 第一步&#xff1a;修改主配置文件 #修…

WSL里的Ubuntu 登录密码忘了怎么更改

环境&#xff1a; Win10 专业版 WSL2 如何 Ubuntu22.04 问题描述&#xff1a; WSL里的Ubuntu 登录密码忘了怎么更改 解决方案&#xff1a; 在WSL中的Ubuntu系统中&#xff0c;忘记了密码&#xff0c;可以通过以下步骤重置密码&#xff1a; 1.打开命令提示符或PowerShel…

[NOIP2011 普及组] 数字反转

AC代码&#xff1a; #include<iostream>using namespace std;int main() {long long n;cin >> n;long long temp n;long long sum 0;while(temp ! 0){int c temp % 10;sum sum * 10 c;temp temp / 10;}printf("%lld",sum);return 0; }

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

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