一、项目介绍
视觉是我们获取环境信息的基本途径,然而视障人士由于视觉功能受限,不仅在环境感知中遇到了障碍,也面临着社会交际、工作学习、生活娱乐等诸多方面的困扰。在基本社会交际中,无法准确辨识他人面容成给视障人士带来了尴尬与不便。综合运用CV技术、影像采集技术、AR技术等科技成果,打造无障碍化视障产品,成为视障人士看清世界的外部力量。
我们设想的无障碍化视障系统可以把眼前的场景“翻译”成语言,告诉人们眼前有人、有物、有风景。不管最终技术如何呈现,技术路径是相似的,通过计算机视觉来帮助人们看清世界。而人脸恰恰也是人类情感交流最直接、最重要的载体,它是人类视觉中最为普遍的模式,所反映的视觉信息在人与人的交流和交往中有着重要的意义。
在本项目中,我们初步打算帮助视障人士甄别在路上的遇到的行人,判断是“熟人”还是“陌生人”,并做出相应的提示,方便他们打招呼。后期会逐步增加判断路况,识别物品、风景等功能。
二、项目设计思路
1.搭建开发环境(Windows SDK 模型部署环境 + WSL 模型训练及量化环境)
由于该板卡仅支持在Windows中进行AI模型部署,模型训练和量化还需在Linux环境下进行。因此我们需要搭建Linux环境(双系统、虚拟机、WSL),考虑到双系统切换比较麻烦、虚拟机占用电脑资源太多等原因,最终我选择了WSL。WSL(Windows Subsystem for Linux),它是适用于 Linux 的 Windows 子系统,使用它可以省去很多麻烦,并且安装步骤也比较简单,还可以使用 Vscode 链接进行开发。对于WSL的安装我在CSDN上写了一篇博客来记录,下面把文章的链接附上。
(https://blog.csdn.net/m0_52529907/article/details/127136072?spm=1001.2014.3001.5501)
准备好了WSL那么接下来就要搭建FTHR板卡的开发环境了,搭建环境的过程主要是参考官方的文档,过程较为繁琐就不在这儿一一列出了,搭建环境的过程以及遇到的一些问题我也写了几篇文章来记录。
2.准备数据集(YALE和YALEB)
3.搭建人脸识别模型
搭建模型前我们首先要分析一下如何对人脸进行识别,美信的官方技术文档中有提到,对于人脸识别问题的解决分为三个主要步骤:
- 人脸提取:检测图像中的人脸以提取仅包含一张人脸的矩形子图像。
- 人脸对齐:确定子图像中人脸的旋转角度(3D)以通过仿射变换补偿其效果。
- 人脸识别:使用提取和对齐的子图像识别人。
在三个步骤中,人脸检测与对齐已经被多任务级联卷积神经网络 (MTCNN)解决了。我们主要研究的是如何识别人脸,即判断摄像头拍到的人脸是否为我们样本中的人脸。对于这个问题,我们采用基于相似度的方法来学习每个面部图像的embedding,计算其与参考图像的嵌入相似度距离,可以观察到同一个人的面部嵌入向量之间的距离小,而不同人面部嵌入向量之间的距离大。
比较方便的是官方也提供了相应模型的思路,即FaceNet(如上图),它是目前最流行的基于嵌入的人脸识别的 CNN 模型之一。The Triplet Loss是其成功背后的关键。该损失函数采用三个输入样本:锚点、来自与锚点相同身份的正样本和来自不同身份的负样本。当锚点的距离接近正样本而远离负样本时,Triplet Loss函数给出较低的值。
但是,FaceNet的模型有约750万个参数,对于MAX78000来说太大了。它还需要 1.6G 浮点运算,这使得该模型很难在许多移动或物联网设备上运行。因此,需要设计一种新的模型架构,其参数少于 450k,以适应 MAX78000。因此知识蒸馏是一种很好的解决方法。 采用知识蒸馏方法从 FaceNet 开发更小的 CNN 模型,这也是 FaceNet 用于应用程序广受赞赏的原因。
4.模型量化(量化感知训练和训练后量化)
5.模型评估及优化
6.模型转换
7.模型部署
三、搜集素材的思路
对于人脸样本素材的搜集,我们初步打算寻找两套数据集,一套作为“熟人”进行训练,一套作为“陌生人”进行训练。
目前,我们决定采用美国耶鲁大学计算视觉与控制中心创建的 YALE 人脸数据库与YALE 人脸数据库B。 YALE人脸数据库包含的是15位志愿者在不同光照下以及不同表情和姿态变化的165张图片,相比较ORL人脸数据库YALE数据库中的每个对象采集的样本包含更明显的光照、表情和姿态以及遮挡变化。而 YALE人脸数据库B包含了10个人的5850幅在9种姿态,64种光照条件下的图像,其中的姿态和光照变化的图像都是在严格控制的条件下采集的。
四、预训练实现过程
1.数据集预处理
1)整理与切分样本数据
下载好 YALE 和 YALEB 数据集后,我将同一人脸数据放在一个文件夹内,总计整理出25种数据集,然后将其中 YALE 的数据集作为“熟人”来训练,YALEB 数据集作为“陌生人”来训练。在所有数据集中,我打算拿90%的数据集用于训练,10%用于测试训练结果。
2)将数据集转换为.npy格式
2.准备训练
1)搭建模型前,初步搭建用于训练的迭代器
2)搭建人脸识别神经网络模型
3)逐步修改学习率,调整策略
4)开始训练
备注:原理部分与代码部分参考于微信公众号“AI研修 潜水摸大鱼”、官网的技术文档(使用MAX78000进行人脸识别)与项目“用于人脸检测的无电池远程智能摄像头”