基于facenet+faiss开发构建人脸识别系统

facenet是一款非常经典的神经网络模型,它可以直接学习从人脸图像到欧几里德空间的映射(直接将人脸映射到欧几里得空间)。在欧几里德空间中,距离直接对应于人脸相似性的度量。一旦这个空间产生,使用标准技术,将FaceNet嵌入作为特征向量,就可以很容易地实现人脸识别、验证和聚类等任务。作者使用经过训练的深度卷积网络来直接优化嵌入本身,而不是像以前的深度学习方法那样使用中间瓶颈层。为了训练,作者使用了一种新的online triplet mining方法生成的粗略对齐的匹配/非匹配的人脸块的 triplets。该方法的好处是更大的recognition performance:实现了最先进的人脸识别性能,每一张脸仅使用128字节(128维空间向量)。

在之前的一些项目就有使用到facenet模型,用于人脸识别本质上来说是借助于facenet模型将输入的标准的人脸图像数据转化为了128维的向量,之后通过对向量的计算,比如:相似度计算、距离计算,转化为了人脸识别的计算,当然了后面也可以使用机器学习模型来接收facenet的输出向量做进一步的预测都是可以的,我们之前的项目采用的是向量直接匹配计算的方式,由于当时数据量不大,所以向量的匹配计算等价于暴力搜索,但是一旦数据量激增,这种方式带来的时间成本就是难以接受的了。

最近正好在用faiss,就有一个想法,想要将facenet模型和faiss做一个集成来开发一套高性能的人脸识别系统,我将整体的构思绘制如下图所示:

 整体的思路还是比较清晰明了的。

接下来先简单回顾一下相关技术原理。

Facenet是一种用于人脸识别和人脸验证的深度学习模型,通过将人脸图像转换成高维空间中的嵌入向量来表示每个人脸。该模型由Google的研究科学家Florian Schroff、Dengyong Zhou和Christian Szegedy于2015年提出。

Facenet模型的构建原理基于卷积神经网络(Convolutional Neural Network, CNN)。下面是Facenet模型的主要构建原理:

  1. 输入图像:首先,将人脸图像作为输入提供给Facenet模型。

  2. 卷积神经网络(CNN):Facenet模型通过多个卷积层和池化层来提取图像中的特征。卷积层用于捕获空间特征,如边缘和纹理等。池化层用于减小特征图的尺寸并保留重要的特征。

  3. Triplet Loss:Facenet模型使用三元组损失函数(Triplet Loss)来学习一个紧凑的人脸嵌入向量空间。Triplet Loss的目标是使同一人的嵌入向量之间的距离尽可能小,不同人的嵌入向量之间的距离尽可能大。这样可以使得不同人的嵌入向量在空间上得到有效的分离。

Facenet算法的优点:

  1. 高准确率:Facenet模型在人脸识别和人脸验证任务上取得了非常出色的准确率,甚至在大规模人脸识别数据集上也表现优异。

  2. 基于嵌入向量的表示:Facenet将人脸图像转换为紧凑的嵌入向量,使得不同人的人脸之间能够得到有效的分离,并且嵌入向量具有良好的可比性。

  3. 大规模训练:Facenet模型可以通过使用大规模的人脸图像数据集进行训练,从而获得更好的泛化能力。

Facenet算法的缺点:

  1. 高计算资源需求:由于Facenet模型的深度和复杂性,需要大量的计算资源来进行训练和推理。这使得在某些设备或场景下应用Facenet模型变得困难。

  2. 影响因素敏感:Facenet模型对输入图像的光照、角度和尺度等因素敏感。在实际应用中,需要考虑这些因素对人脸识别或验证的影响。

Faiss是一种用于高效相似性搜索的库,由Facebook人工智能研究实验室开发。它基于近似最近邻(Approximate Nearest Neighbor, ANN)算法,旨在解决大规模数据集的相似性搜索问题。Faiss可以在GPU和CPU上运行,并提供了多种近似搜索算法和索引结构。

Faiss的主要构建原理是使用索引结构对数据进行预处理,以便于在搜索时快速定位到相似的数据点。下面是Faiss的主要特点和优势:

  1. 高效:Faiss通过高度优化的算法和索引结构,实现了非常高效的相似性搜索。它可以处理包含数百万或上亿个数据点的大规模数据集。

  2. 支持多种索引算法:Faiss提供多种索引算法,包括快速扫描、k-means、倒排文件等等。这些算法可以针对不同的数据特点和搜索需求选择最合适的索引结构,以提高搜索性能。

  3. 可扩展性:Faiss可以在单个GPU或多个GPU上运行,并且支持分布式计算。这使得它能够有效地处理大规模数据集并实现快速搜索。

  4. 索引更新和存储:Faiss允许动态地更新索引结构,可以添加、删除或修改数据点。此外,Faiss还提供了存储和加载索引结构的功能,方便在不同环境中使用。

  5. 多种语言支持:Faiss支持多种编程语言接口,如C++、Python等,使得它在不同的开发环境下都易于使用和集成。

Faiss算法的一些缺点包括:

  1. 近似性:Faiss提供的是近似最近邻搜索,并不保证精确的最近邻搜索结果。虽然近似搜索能够在处理大规模数据时显著提高搜索速度,但在对结果的准确性有严格要求的应用中,可能需要使用精确搜索算法。

  2. 参数调优:Faiss中的索引算法有多个参数需要调整,以获得最佳的搜索性能。对于不熟悉Faiss的用户来说,可能需要一些实验和调优才能找到最优的配置。

  3. 存储需求:基于索引结构的相似性搜索常常需要占用较大的存储空间,尤其是当数据集非常大时。这可能对存储资源造成压力。

接下来我们来实现自己的想法,facenet本身模型网上有开源的,这里我就不再自己训练了,直接使用了网上开源的模型,自己搜索就有很多的,选择合适自己使用的即可,接下来就是要实现人脸向量数据库的构建,核心实现如下所示:

def batch2Vec(picDir="datasets/", save_path="faceDB.json"):"""批量数据向量化处理"""feature=[]person={}count=0for one_person in os.listdir(picDir):oneDir=picDir+one_person+"/"print("one_person: ", one_person, ", one_num: ", len(os.listdir(oneDir)), ", count: ", count)for one_pic in os.listdir(oneDir):one_path=oneDir+one_picone_vec=sinleImg2Vec(pic_path=one_path)if one_person in person:person[one_person].append([one_pic, one_vec])else:person[one_person]=[[one_pic, one_vec]]feature.append([one_path, one_vec])count+=1print("feature_length: ", len(feature))with open(save_path, "w") as f:f.write(json.dumps(feature))with open("person.json", "w") as f:f.write(json.dumps(person))

之后我们就可以基于人脸向量数据库来构建faiss索引,输入单个查询向量来进行计算了,核心实现如下所示:

#检索计算
start=time.time()               
distances, indexs = index.search(query, topK)
print("distances_shape: ", distances.shape)
print("indexs_shape: ", indexs.shape)
end=time.time()
delta=round(end-start, 4)
#对比可视化
plt.clf()
plt.figure(figsize=(36,6))
plt.subplot(1,6,1)
plt.imshow(Image.open(pic_path))
plt.title("OriginalImage\nSearchTime: "+str(delta)+"s")
indexs=indexs.tolist()[0]
print("indexs: ", indexs)
for i in range(len(indexs)):one_ind=indexs[i]plt.subplot(1,6,i+2)plt.imshow(Image.open(images[one_ind]))one_dis= distance(query, vectors[one_ind])plt.title("Top"+str(i)+" SearchImage\nDis is: "+str(round(one_dis, 4)))
plt.savefig("compare.jpg")

接下来我们看下实际结果详情。

查询输入:

 检索输出如下:
 

 查询输入:

 检索输出:

 查询输入:

 检索输出:

 查询输入:

 检索输出:

 整体体验下来感觉精度和速度还是非常不错的,可见这个流程是没有问题的。

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

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

相关文章

车载软件架构 —— 车载软件安全启动关键技术解读

车载软件架构 —— 车载软件安全启动关键技术解读 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 没有人关注你。也无需有人关注你。你必须承认自己的价值,你不能站在他人的角度来反对自己。人生…

【java】继承

java继承 继承的基本概念super、this构造方法 继承的基本概念 面向对象中有3个重要的特征:继承、封装、多态。继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法&…

Mac 安装不在 Apple 商店授权的应用程序

文章目录 一、场景介绍二、实操说明 一、场景介绍 在日常的工作生活中,发现一些好用的应用程序,但是出于某些原因,应用程序的开发者并没有将安装包上架到苹果商店。 那么这些优秀的应用程序下载安装以后就会出现如下弹框被拒之门外 二、实操…

Spring Boot读取yml或者properties配置信息

文章目录 Spring Boot读取yml或者properties配置信息方法一:Value获取基本信息,适用于少量信息方法二:通过注解ConfigurationProperties(prefix "spring.datasource")方法三:通过api Environment Spring Boot读取yml或…

Flask简介与基础入门

一、了解框架 Flask作为Web框架,它的作用主要是为了开发Web应用程序。那么我们首先来了解下Web应用程序。Web应用程序 (World Wide Web)诞生最初的目的,是为了利用互联网交流工作文档。 1、一切从客户端发起请求开始。 所有Flask程序都必须创建一个程序…

vue diff 双端比较算法

文章目录 双端指针比较策略命中策略四命中策略二命中策略三命中策略一未命中四种策略,遍历旧节点列表新增情况一新增情况二 删除节点双端比较的优势 双端指针 使用四个变量 oldStartIdx、oldEndIdx、newStartIdx 以及 newEndIdx 分别存储旧 children 和新 children …

41.利用matlab 平衡方程用于图像(matlab程序)

1.简述 白平衡 白平衡的英文为White Balance,其基本概念是“不管在任何光源下,都能将白色物体还原为白色”,对在特定光源下拍摄时出现的偏色现象,通过加强对应的补色来进行补偿。 所谓的白平衡是通过对白色被摄物的颜色还原&…

机器学习——SMO算法推导与实践

一、 硬间隔-SMO算法推导 明天再说,啊。。。。感觉天空明朗了很多,即使现在已经很晚了 还是要打开柯南,看看电视,等待天气预报所说的台风天吧! 一时之间,忽然失去了用markdown语法写下推导过程的勇气。。。…

使用Dockerfile构建镜像

使用Dockerfile构建镜像 使用Dockerfile构建镜像 创建一个空目录 docker mkdir docker进入此目录 cd docker创建并编辑DockerFile文件 vi touch DockerfileDockerfile文件的内容如下: from node label maintainer xxxqq.com RUN git clone -q https://github…

fishing之第二篇Gophish钓鱼平台搭建

文章目录 一、Gophish介绍二、Gophish部署三、Gophish配置0x01 功能介绍0x02 Sending Profiles(钓鱼邮箱发送配置)0x03 Email Templates(钓鱼邮件模板)0x04 Landing Pages(伪造钓鱼页面)0x05 Users & Groups(用户和组)0x06 Campaigns(钓鱼测试)0x07 Dashboard(仪…

Stable Diffusion - Stable Diffusion WebUI 支持 SDXL 1.0 模型的环境配置

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/132056980 SDXL 1.0 版本 是 Stable Diffusion 的最新版本,是基于潜在扩散模型的文本到图像生成技术,能够根据输入的任何文…

【VUE】前端实现防篡改的水印

效果 水印的作用 图片加水印的操作一般是由后端来完成,有些站点保护的知识产权的类型可能比较多,不仅仅是图片,可能还有视频、文字等等,对于不同类型的对象添加水印后端操作比较复杂,所有有些站点逐步的让前端去进行水…