基于Triplet+VGG16 & 百度API的人脸识别器设计与实现

本文是从智慧门禁系统项目工程实践中摘取出人脸识别模块来进行一个记录。

一、人脸识别器软件设计

1.1 总体流程图

在这里插入图片描述

1.2 系统代码目录结构

在这里插入图片描述

二、模块详细设计

人脸识别器模块为了方便后台进行调用,给出了一个接口,通过不同参数的传入可以选择训练或识别,并且根据选择的功能返回不同的返回值,代表不同的含义。人脸识别器分为训练模块,识别模块,并且有着与本地文件交互的相关工具函数集,用来读取和处理本地文件到内存中方便训练和识别模块来运行。

在这里插入图片描述

2.1 训练模块(train)的实现

此模块共有两个主要部分,siamese class决定着神经网络的相关配置,将Triplet网络结构的相关参数、前向传播和损失函数等;siamese train主要为主接口face_inference.py提供调用的接口,每一次调用只遍历一轮数据并采用随机采样的三元组图像数据作为输入。训练模块在开始训练前读取log文件来判断是否为第一次训练,如果不是第一次训练则读取日志中保存的相关参数做相应处理作为本轮训练的参数。

2.1.1 Siamese class

Siamese网络是一种相似性度量方法,当类别数多,但每个类别的样本数量少的情 况下可用于类别的识别、分类等。Siamese网络也非常适合于进行人脸识别研究,被测者 仅需提供最少1张照片,即可正确识别出被测者。这与利用分类器来识别人脸有着很大的 不同,利用分类器进行训练的方法需要每一类中有足够多的样本才行,这其实在实际生活中是不现实的。原因如下:无法对每一个人采取足够多的样本,当类别过多,每一类别的 样本也足够多时,机器性能也就跟不上了,无法训练出合适的模型;无法对陌生人脸进行 划分,主要指不属于分类器中的类别会被划分为分类器中的类别,例如,分类器可以识别 3个人的人脸,当第4个人要识别时,他就会被误识别为这3个人中的其中一个。
Siamese 网络的主要思想是通过一个函数将输入映射到目标空间,在目标空间使用 简单的距离(欧式距离等)进行对比相似度。在训练阶段去最小化来自相同类别的一对样 本的损失函数值,最大化来自不同类别的一堆样本的损失函数值。Siamese网络训练时的 输入是一对图片,这一对图片是X1 ,X2标签是y。当X1, X2是同类时,y为0,当X1, X2不同类时,y为1。Siamese网络的损失函数为L=(1 - y)LG (EW(X1, X2 )) + yLI (EW(X1, X2)),其中EW(X1, X2)=||G W(X1) - GW(X2 )||。GW (X)就是神经网络中的参数,其中LG是只计算相同类别对图片的损失函数,LI是只计算不相同类别对图片的损失函数。
训练模块通过使用Siamese网络的改进版——Triplet网络,使用三元组(Anchor, Positive, Negative)来作为网络结构的输入。通过训练一个参数共享的网络(VGG16,网络结构如图3-4所示),得到三个元素的特征表,记为f(x_a), f(x_p), f(x_n)。通过学习,尽可能让x_a与x_n之间的距离和x_a与x_p之间距离之间有一个最小的间隔t,即||f(x_a) - f(x_p)|| + t < ||f(x_a) - f(x_n)||。损失函数为:L = {||f(x_a) - f(x_p)|| - ||f(x_a) - f(x_n)|| + t}_+

VGG16网络结构图:
在这里插入图片描述

Triplet网络结构图:
在这里插入图片描述

2.1.2 Siamese train

为了方便后台服务器的调用,只将训练一轮的流程封装起来,如果要不停的训练则只需在后台服务程序中循环调用即可,为了达成这一目的,每进行一轮训练则需保存当前相关参数。训练时每128组数据为一个batch,循环每个人为一轮。

训练流程图:
在这里插入图片描述

2.2 识别模块(recognition)的实现

识别模块封装好识别函数以供人脸识别接口调用,传入需要识别照片的系统路径,返回不同的返回值。根据训练日志提取出训练总轮数,判定选择哪种识别方式进行识别。
使用训练好的模型需要加载模型,将要识别照片与证件照库中每个人的照片分别传入已经训练好的网络当中做一次正向传递操作,并且计算两张图片最终的距离,根据提前设定好的阈值来判定是否识别为本照片库中人脸,取得距离值最小的匹配人脸返回人名。
使用第三方API选择百度人脸识别接口,通过Python的requests库向接口发送POST请求,利用jason库来对接口传回的jason格式数据进行解析,并使用os库与本地文件进行交互,成功则返回人名,失败则根据具体失败原因返回不同的值。

识别总框图:
在这里插入图片描述

识别系统流程图:
在这里插入图片描述

2.3 工具集(tools)的实现

为了使代码得结构更加鲜明,增加代码复用率,封装了几个和本地文件交互并且生成目标数据的函数。

主要工具函数图:
在这里插入图片描述

三、测试

3.1 测试训练模块

运行训练模块的代码文件,查看是否能够成功运行,打印每一batch训练后的结果:时间,步数,损失值,总损失值;并且打开(创建)日志文件并写入:时间,步数,总损失值和学习率。

训练运行图:
在这里插入图片描述

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值