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

news2024/11/26 15:43:30

在上一篇博文《基于facenet+faiss开发构建人脸识别系统》中,我们实践了基于facenet和faiss的人脸识别系统开发,基于facenet后续提出来很多新的改进的网络模型,arcFace就是其中一款优秀的网络模型,本文的整体开发实现流程与前文相同,只是在深度学习模型节点上将facenet替换为了arcFace网络模型,整体流程示意图如下所示:

 

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

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

ArcFace是一种人脸识别模型,它是基于深度学习的卷积神经网络构建的。ArcFace模型在人脸识别领域具有很高的准确性和可靠性,广泛应用于人脸识别技术和安全系统中。

ArcFace模型的核心思想是通过学习将人脸图像映射到一个高维特征空间中的稠密特征表示。它采用余弦距离作为判别指标,使得同一个人的人脸特征向量之间的余弦距离较小,不同人的人脸特征向量之间的余弦距离较大。通过训练过程,模型可以学习到人脸的判别性特征,实现人脸之间的区分和识别。

ArcFace模型的优点有以下几个方面:

  1. 准确性高:ArcFace在常见的人脸识别任务中取得了非常好的性能,能够实现高准确性的人脸匹配和识别。

  2. 抗干扰能力强:ArcFace模型在面对光照变化、表情变化、遮挡等干扰因素时,仍能保持较高的稳定性和可靠性,对人脸图像的变化有较好的适应性。

  3. 特征嵌入明显:ArcFace模型通过学习得到的人脸特征向量在高维空间中有较明显的嵌入效果,同一个人的人脸特征向量距离较近,不同人的特征向量距离较远,增加了模型的判别力。

然而,ArcFace模型也存在一些缺点:

  1. 复杂性高:ArcFace模型相比其他简单的人脸识别模型,比如FaceNet,模型结构更加复杂,需要更大的计算资源和更长的训练时间。

  2. 数据依赖性强:ArcFace模型的性能与训练数据的质量和数量密切相关,需要大规模的人脸数据集进行训练,从而使模型具有更好的泛化能力。

  3. 隐私问题:由于ArcFace模型具有较强的人脸识别能力,潜在的隐私问题也随之出现。在应用和部署过程中,需要遵循隐私保护的原则和规定。

ArcFace模型以其高准确性和鲁棒性在人脸识别领域占据重要地位,但在实际应用中也需要考虑到模型复杂性、数据依赖性和隐私问题。

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

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

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

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

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

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

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

Faiss算法的一些缺点包括:

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

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

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

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

def batch2Vec(picDir="datasets/", saveDir="vector/"):
    """
    批量数据向量化处理
    """
    if not os.path.exists(saveDir):
        os.makedirs(saveDir)
    feature=[]
    person={}
    count=0
    for 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_pic
            one_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+=1
    print("feature_length: ", len(feature))
    with open(saveDir+"faceDB.json", "w") as f:
        f.write(json.dumps(feature))
    with open(saveDir+"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")

同前文是一致的,这里也是保证了接口数据的一致,所以faiss模块的逻辑可以复用。

接下来看下实际检索效果:
【查询输入】

 【检索输出】

 【查询输入】

 【检索输出】

  【查询输入】

 【检索输出】

 【查询输入】

 【检索输出】

  【查询输入】

 【检索输出】

 整体来看效果还是非常不错的,而且整体的时耗也是很出色的。

下一篇文章中,我会对faiss的时耗进行实验分析。

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

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

相关文章

vCenter Server Appliance(VCSA )7.0 部署指南

部署准备 1、下载VMware-VCSA-all-7.0.0-xxxx.iso文件,用虚拟光驱挂载或者解压运行,本地系统以win10拟光驱挂载为例,运行vcsa-ui-installer/win32/installer.exe。 2、选择“安装”,VCSA 7.0版本同时提供其他选项。 第一阶段 3、…

leetcode 35.搜索插入位置

⭐️ 题目描述 🌟 leetcode链接:搜索插入位置 ps: 题目给的是一个有序的数组,所以采用二分查找算法最优,只需要计算出如果目标值不存在则返回按顺序插入的位置,其实刚好是 left 位置。 代码: …

EtherCAT转Modbus网关连接TwinCAT3的配置方法

捷米JM-ECT-RTU 是自主研发的一款 ETHERCAT 从站功能的通讯网关。该产品主要功能是将 ETHERCAT 网络和 MODBUS-RTU 网络连接起来。 网关连接到 ETHERCAT 总线中做为从站使用,连接到 MODBUS-RTU 总线中做为主站或从站使用。 ​编辑切换为居中 添加图片注释&#x…

【计算机网络】NAT技术

文章目录 1. NAT技术简介2. 使用NAT技术转换IP的过程3. NAPT4. NAT技术的缺陷5. NAT和代理服务器 1. NAT技术简介 NAT(Network Address Translation,网络地址转换)技术,是解决IP地址不足的主要手段,并且能够有效避免外…

合合信息通过ISO/IEC国际标准双认证,为全球用户提供高合规标准AI服务

互联网、AI等技术的全球普及为人们提供便捷服务的同时,也带来了信息安全领域的诸多挑战。保护用户隐私及数据安全,是科技企业规范、健康发展的重心。近期,上海合合信息科技股份有限公司(简称“合合信息”)顺利通过国际…

量子纠错跨越式发展!Quantinuum科学家成功模拟氢分子

​ (图片来源:网络) 量子计算公司Quantinuum表示,它能在该公司的H1量子计算机上使用“容错法”来模拟氢分子。这是一种新的错误检测代码,能准确地进行模拟,通过在量子处理器上成功模拟化学分子,…

yolov5中的best.pt是如何确定的

在yolov5 的使用过程中几乎都会发现的问题: 训练结果有last.pt和best.pt , last.pt好理解,就是最后一个epoch的输出,但是best是啥意思?怎么才算best? 我们来一行行看train.py源码 追溯到./utils/metrics.py中的fitn…

LeetCode541.反转字符串II

541.反转字符串II 简单的反转不够看,来一手花式反转 题目描述 给定一个字符串s和一个整数k,从字符串开头算起,每计数至2k个字符,就反转这2k个字符中的前k个字符。 1、如果剩余字符少于k个,则将剩余字符全部反转 2、…

HCIP-Storage-H13-624 v5.0 题库真题和机构资料

华为认证存储高级工程师HCIP-Storage V5.0(中文版)自2020年11月27日起,正式中国区发布。 机构的考试大纲、录播课程、考试题库,有需要的同学自行领取哈: HCIA、HCIP-storage存储资料---提取码:1234https://pan.baidu…

【Git】标签管理与Git Flow模型

目录 一、操作标签 二、推送标签 三、删除标签 四、Git Flow模型分支设计 一、操作标签 git tag # 查看有哪些标签 git tag [name] # 给最近一次commit打标签 git tag [name] [commitID] #给指定的commit打标签 git tag -a [name] -m desc # 打标签并添加描述 二、推送标…

深入了解 PostgreSQL 扩展插件

深入了解 PostgreSQL 扩展插件 在 PostgreSQL 数据库中,扩展插件是极具价值的工具,它们为我们提供了丰富多样的功能增强。本篇博客将深入介绍几个常用的 PostgreSQL 扩展插件,包括 pg_stat_statements、uuid、postgis 以及 postgis_raster。…

解决Linux下PyCharm无法新建文件

一、问题描述 如图,在Ubuntu Linux系统中使用pycharm管理项目时,提示无法新建.py源文件: 二、问题解决 将问题定性为文件夹(目录)权限问题,在终端中打开项目文件夹的上级目录,将整个项目目录的…

勒索软件Epsilon Red:Microsoft Exchange服务器新威胁

虽然Microsoft Exchange针对存在的代码漏洞一直更新补丁,但这并未能阻止网络黑客停手。最新发现,一种自称为 Epsilon Red的新型勒索软件,利用Microsoft Exchange服务器的系统漏洞对网络上的机器进行加密。在进入加密阶段之前,Epsi…

使用公式与格式控制Excel快速实现计划甘特图

项目中都会遇到做任务计划的需求,有的客户要求需要有甘特图的形式本文介绍如何使用excel 单元格实现甘特图显示,调整任务时间自动填充单元格填色实现甘特图效果。废话不多说,先看效果。 准备工作先创建两列开始时间与完成时间,这…

山西电力市场日前价格预测【2023-08-05】

日前价格预测 预测明日(2023-08-05)山西电力市场全天平均日前电价为445.97元/MWh。其中,最高日前电价为486.65元/MWh,预计出现在19: 30。最低日前电价为403.37元/MWh,预计出现在13: 15。 价差方向预测 1: 实…

牛客周赛 Round 5

# 游游的字母变换题目大意 对给定的字符串进行变换,将大写字母变为下一个字母,小写字母变为上一个字母,其他字符不做变换。 思路分析 如果字符是大写字母,则判断是否为’Z’,如果是则变为’A’,否则将其…

国内物流园区数字化改革趋势

随着科技的进步和物流业的发展,数字化技术在物流园区的应用逐渐普及。数字化管理和物联网技术使得物流园区的运营更加智能化、高效化,并提供更优质的服务,本文和大家一起了解一下国内物流园区数字化改革现状和进程。 国内数字化园区数字化改…

【C++】模拟实现string

目录 🌞专栏导读 🌛定义string类 🌛构造函数 🌛拷贝构造函数 🌛赋值函数 🌛析构函数 🌛[]操作符重载 🌛c_str、size、capacity函数 🌛比较运算符重载 &#…

CuratorFramework接口的作用和使用

CuratorFramework接口是Apache Curator库中的核心接口之一,用于与ZooKeeper集群进行交互。它提供了一组丰富的方法和功能,用于简化与ZooKeeper的交互操作,包括创建、删除、读取和更新节点等。 CuratorFramework接口的主要作用是封装了底层与…

uni-app:实现列表单选功能

效果图&#xff1a; 核心解析&#xff1a; 一、 <view class"item_all" v-for"(item, index) in info" :key"index"><view classposition parameter-info text-over :classitem.checked?"checked_parameter":""…