Paddle实现人脸对比(二)

我之前发过一篇基于孪生网络的人脸对比的文章,这篇文章也到了百度的推荐位置:

但是,效果并不是很好。经过大量的搜索,我发现了一种新的方法,可以非常好的实现人脸对比。

原理分析

我们先训练一个普通的人脸分类模型,这个人脸分类模型可以认为是这样的:

因此,在训练完分类模型后,只需要去掉底下的分类层(在模型中一般是全连接层),只看特征提取层的输出的相似程度即可。

如何比较两个输出的相似度呢?其实,这两个输出都是向量,因此我们可以采用两向量之间的夹角判断相似度。这个方法甚至在高中的信息技术课本里就有提到:

课本中是使用这种方法进行自然语言处理的,我们也可以使用这种方法进行人脸对比。其实就是根据两向量的乘积等于两向量的长度乘上两向量之间夹角的余弦值。

在paddle中,提供了专门的函数计算这个相似度:

import paddle.nn.functional as F
cosine_similarity = F.cosine_similarity(vec1, vec2) 

注意,这里的vec1、vec2都应该是paddle的张量类型,可以使用paddle.to_tensor()函数转换为张量类型。

数据集加载

我们可以按照正常的图片分类的方式加载图片,我采用这个开源的数据集:

人脸数据_数据集-飞桨AI Studio星河社区 (baidu.com)

代码如下:

import numpy as np
from PIL import Image
import paddle
from random import shuffle
import pickle


class FaceData(paddle.io.Dataset):

    def __init__(self, mode):
        super().__init__()
        # 训练集/测试集
        file = 'facecap/facecap/train_list.txt' if mode == 'train' else 'facecap/facecap/test_list.txt'
        self.imgs = []
        self.labels = []
        with open(file) as f:
            # 读取数据集文件信息数据并洗牌
            lines = f.readlines()
            shuffle(lines)
            print('read down')
            # 加载数据集
            for line in lines:
                line = line.strip()
                img, label = line.split(' ')
                pil_img = Image.open(f'facecap\\facecap\\{img}').convert('RGB').resize((96, 96))
                self.imgs.append(np.array(pil_img).transpose((2, 0, 1)))
                self.labels.append(label)
        self.imgs = np.array(self.imgs, dtype=np.float32)
        self.labels = np.array(self.labels, dtype=np.int32)
        print('load down')

    def __getitem__(self, idx):
        return self.imgs[idx], self.labels[idx]

    def __len__(self):
        return len(self.labels)


if __name__ == '__main__':
    train_dataset = FaceData(mode='train')
    test_dataset = FaceData(mode='test')

    pickle.dump(train_dataset, open('./database/train.data', 'wb'), protocol=4)
    pickle.dump(test_dataset, open('./database/test.data', 'wb'), protocol=4)

脚本采用pickle存储加载后的数据集,方便使用。

训练脚本

训练脚本非常简单,我们采用resnet模型,如下:

import paddle
from dataset import FaceData
import pickle

paddle.set_device('gpu')

train_dataset = pickle.load(open('./database/train.data', 'rb'))
test_dataset = pickle.load(open('./database/test.data', 'rb'))

net = paddle.vision.resnet18(num_classes=500)
model = paddle.Model(net)

model.load('./output/model')

model.prepare(
    paddle.optimizer.Adam(parameters=model.parameters()),
    paddle.nn.CrossEntropyLoss(),
    paddle.metric.Accuracy()
)

model.fit(train_dataset, epochs=20, batch_size=64, verbose=1, save_dir='./cache/model')

model.evaluate(test_dataset, batch_size=64, verbose=1)

model.save('./output/model')

推理脚本

推理脚本需要注意去除最后的全连接层,代码如下:

import paddle
from dataset import FaceData
import numpy as np
import paddle.nn.functional as F

state_dict = paddle.load('./output/model.pdparams')

old_net = paddle.vision.resnet18(num_classes=500)
old_net.load_dict(state_dict)

new_layers = list(old_net.children())[:-1]  # 移除全连接层
net = paddle.nn.Sequential(*new_layers)

model = paddle.Model(net)


def predict(img1, img2):
    """
    推理两张图片的相似度
    :param img1: 第一张图片的PIL数据
    :param img2: 第二张图片的PIL数据
    :return: 相似度,属于区间[0, 1]。越大越相似
    """
    d1 = np.array(img1, dtype=np.float32).transpose((2, 0, 1))
    d2 = np.array(img2, dtype=np.float32).transpose((2, 0, 1))

    p1 = model.predict_batch(np.expand_dims(d1, axis=0))[0]
    p2 = model.predict_batch(np.expand_dims(d2, axis=0))[0]
    t1 = paddle.to_tensor(p1)
    t2 = paddle.to_tensor(p2)
    return float(F.cosine_similarity(t1, t2)[0][0][0])

测试

采用网上的图片进行一次测试,结果也非常的好,相同的人脸相似度为0.9,不同的人脸为0.8。实际应用中,可以将当前人脸与数据库中的所有人脸进行对比,确定当前人脸

参考

使用PaddlePaddle实现人脸对比和人脸识别_paddle 人脸识别-CSDN博客

教育科学出版社 高中教材 信息技术 选择性必修4 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

关于机器学习/深度学习的一些事-答知乎问(二)

进化算法与深度强化学习算法结合如何进行改进? (1)进化算法普遍存在着样本效率低下的问题,虽然其探索度较高,但其本质为全局随机性搜索,需要在整个回合结束后才能更新其种群,而深度强化学习在每…

深入理解计算机网络分层结构

一、 为什么要分层? 计算机网络分层的主要目的是将复杂的网络通信过程分解为多个相互独立的层次,每个层次负责特定的功能。这样做有以下几个好处: 模块化设计:每个层次都有清晰定义的功能和接口,使得网络系统更易于设…

023——搭建图形化客户端(基于pySimpleGUI)

目录 一、pysimplegui 1.1 安装 1.2 测试 二、 pysimplegui学习 2.1 学习地址 2.2 人类早期驯服pysimplegui珍贵流水账 三、 实现项目专属的界面 一、pySimpleGUI 1.1 安装 pip install pysimplegui -i https://pypi.tuna.tsinghua.edu.cn/simple Command pip not fo…

GAN:对抗生成网络【通俗易懂】

一、概述 对抗生成网络(GAN)是一种深度学习模型,由两个神经网络组成:生成器G和判别器D。这两个网络被训练来协同工作,以生成接近真实数据的新样本。 生成器的任务是接收一个随机噪声向量,并将其转换为与真…

【Web】DASCTF X GFCTF 2022十月挑战赛题解

目录 EasyPOP hade_waibo EasyLove BlogSystem EasyPOP 先读hint.php sorry.__destruct -> secret_code::secret() exp: $anew sorry(); $bnew secret_code(); $a->password"suibian"; $a->name"jay"; echo serialize($a); 真暗号啊&…

基于Java停车场管理系统设计与实现(源码+部署文档)

博主介绍: ✌至今服务客户已经1000、专注于Java技术领域、项目定制、技术答疑、开发工具、毕业项目实战 ✌ 🍅 文末获取源码联系 🍅 👇🏻 精彩专栏 推荐订阅 👇🏻 不然下次找不到 Java项目精品实…

即插即用模块之DO-Conv(深度过度参数化卷积层)详解

目录 一、摘要 二、核心创新点 三、代码详解 四、实验结果 4.1Image Classification 4.2Semantic Segmentation 4.3Object Detection 五、总结 论文:DOConv论文 代码:DOConv代码 一、摘要 卷积层是卷积神经网络(cnn)的核心组成部分。在本文中…

【Java虚拟机】简单易懂的ZGC原理分析

简单易懂的ZGC原理分析 GC垃圾收集器ZGC的特点ZGC相关技术Region染色指针 & 转发表 & 读屏障染色指针转发表读屏障 内存多重映射 ZGC流程详解ZGC与其他垃圾搜集器比较与CMS比较与G1比较 GC垃圾收集器 GC垃圾收集器的作用就是帮我们清理堆内存里面的垃圾,无…

第1章、react基础知识;

一、react学习前期准备; 1、基本概念; 前期的知识准备: 1.javascript、html、css; 2.构建工具:Webpack:https://yunp.top/init/p/v/1 3.安装node:npm:https://yunp.top/init/p/v/1 …

cmake制作并链接动静态库

cmake制作并链接动静态库 制作静态库add_library(库名称 STATIC 源文件1 [源文件2] ...)LIBRARY_OUTPUT_PATH指定库的生成路径 制作动态库add_library(库名称 SHARED 源文件1 [源文件2] ...) 连接动静态库link_libraries连接静态库link_directories到哪个路径去找库target_link…

UnityShader学习计划

1.安装ShaderlabVS,vs的语法提示 2. 常规颜色是fixed 3.FrameDebugger调试查看draw的某一帧的全部信息,能看到变量参数的值

雅马哈电钢琴YDP145

数据线:MIDI 琴可以通过MIDI、线直接连接手机,播放声音 琴通过线连接电脑,不能直接播放声音 https://www.bilibili.com/video/BV1ws4y1M7yw 操作: https://usa.yamaha.com/support/updates/yamaha_steinberg_usb_driver_for_win…

王道汽车4S企业管理系统 SQL注入漏洞复现

0x01 产品简介 王道汽车4S企业管理系统(以下简称“王道4S系统”)是一套专门为汽车销售和维修服务企业开发的管理软件。该系统是博士德软件公司集10余年汽车行业管理软件研发经验之大成,精心打造的最新一代汽车4S企业管理解决方案。 0x02 漏洞概述 王道汽车4S企业管理系统…

完美照片由构图决定,摄影构图基础到进阶

一、资料描述 本套摄影构图资料,大小1.04G,共有51个文件。 二、资料目录 新手必备-摄影构图技巧.doc 无忌版的《摄影构图学》.pdf 完美照片的十大经典拍摄技法.pdf 数码摄影曝光手边书.pdf 数码摄影不求人.30天学会数码摄影构图.pdf 数码单反摄影…

sheng的学习笔记-AI-决策树(Decision Tree)

AI目录:sheng的学习笔记-AI目录-CSDN博客 目录 什么是决策树 划分选择 信息增益 增益率 基尼指数 剪枝处理 预剪枝 后剪枝 连续值处理 另一个例子 基本步骤 排序 计算候选划分点集合 评估分割点 每个分割点都进行评估,找到最大信息增益的…

靠谱的大型相亲交友婚恋平台有哪些?相亲app软件前十名

靠谱交友软件,个人感觉还是要选择大型的,口碑好的进行选择,以下是我用过的婚恋平台,分享给大家 1、丛丛 这是我用的最久的一款脱单小程序,我老公就是在这个小程序找到的!!! 这是一款…

CSS边框

目录 内容区(content): 边框(border): 前言: 示例: 内容区(content): 内容区就是盒子里面用来存放东西的区域,里面你可以随便放如:…

计算机三级数据库技术备考笔记(十三)

第十三章 大规模数据库架构 分布式数据库 分布式数据库系统概述 分布式数据库系统是物理上分散、逻辑上集中的数据库系统。系统中的数据分布在物理位置不同的计算机上(通常称为场地、站点或结点,本章均用场地来描述),由通信网络将…

大语言模型总结整理(不定期更新)

《【快捷部署】016_Ollama(CPU only版)》 介绍了如何一键快捷部署Ollama,今天就来看一下受欢迎的模型。 模型简介gemmaGemma是由谷歌及其DeepMind团队开发的一个新的开放模型。参数:2B(1.6GB)、7B&#xff…

VMware安装Red Hat7.9

1、下载Red Hat Enterprise Linux7.9版本 【百度网盘下载】 链接:https://pan.baidu.com/s/1567NfZRF48PBXfUqxumvDA 提取码:bm7u 2、在虚拟机中创建Red Hat7.9 【点击创建虚拟机】 【自定义高级】 【选择光盘映像安装】 全名自定义即可 【虚拟机命…