(超详细)基于MTCNN+FaceNet实现人脸识别及轻量级网络探索和改进(附数据集及预训练模型)

这篇博客详细介绍了使用MTCNN和FaceNet进行人脸识别的系统,包括原理分析、FaceNet源码使用、自制亚洲人脸数据集、加载预训练模型、验证文档的创建、轻量级网络研究、FaceNet扩展应用以及部署中的问题。作者分享了如何通过深度学习提升人脸识别准确率,并探讨了FaceNet与SVM、KNN的结合使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  完整系统是一个基于人脸识别的签到系统,包含一种改进卷积神经网络算法和基于FaceNet的人脸识别,耗时三个月,之前试过opencv+cnn、vgg16等,但是效果还是FaceNet更好些。因为一些原因,暂时还不能公开整个系统,后面会尽快更新的~,这里我们先介绍FaceNet这一部分,欢迎大家一起交流。

一、原理分析

  FaceNet由谷歌提出,发表在CVPR 2015,论文地址FaceNet: A Unified Embedding for Face Recognition and Clustering,论文翻译解读可以参考https://blog.csdn.net/chenriwei2/article/details/45031677
  FaceNet是一种端到端的人脸识别网络,它直接学习图像到欧式空间上点的映射,对输入数据经过深度卷积神经网络生成特征向量,通过对比特征向量欧式距离,判断是否大于阈值来区分是否是同一个人脸。
  模型结构如下图所示。
在这里插入图片描述
  Batch为输入的图像,通过deep architecture(深度学习网络)提取特征,然后通过L2得到128维特征向量。
  FaceNet的创新点是Triplet Loss,目标是使相同人的不通图片特征距离尽可能的小,不同人的特征距离尽可能的大,三元组损失如图所示。
在这里插入图片描述
  损失函数的目的是让当前人脸图片Anchor与当前人的其他不同姿态人脸图片Positive距离尽量小,与当前不同人的人脸图片Negative距离尽量大,并且a、n和a、p之间有一个间隔 α \alpha α ,目标公式如下。
在这里插入图片描述
  从而损失函数如下
在这里插入图片描述
  训练时所有样本都生成三元组计算资源太大,有的无需进行训练,所以训练时在每个batch里面,先选择a、p,然后选择符合条件的所有可能负样本,之后随机选出一个构造出三元组(a,p,n)进行训练。

二、FcaeNet源码使用

  FaceNet的源码使用可以参考下面这篇文章,具有详细的步骤介绍。https://blog.csdn.net/u013044310/article/details/79556099
  精简版源码下载地址:FaceNet精简
  官方源码下载地址:FaceNet源码
  精简版项目结构如下,适合初学者使用。
在这里插入图片描述
  大家学习参考上面博客可以试着运行源码,就会对FaceNet有一些了解了,然后我们训练自己的数据集并对上述博客进行补充、优化。

三、爬虫自制数据集(提高亚洲人脸准确率)

  网上对FaceNet大部分是通过训练svm分类器进行自制数据集的训练,可以参考这篇文章FaceNet源码使用方法及其迁移学习训练自己数据集的代码修改
  但是实用效果并不是很好,而且输入图片后需要经过svm得到类别,这样的话每次增加新的人脸都要重新训练svm分类模型,但是我们更希望通过FaceNet把特征向量存入数据库,然后通过比较特征向量的距离来区分人脸,这样有一个人脸图片输入后,只需要经过FaceNet得到特征向量后,把特征向量与数据库中的特征向量对比欧氏距离判断是否大于阈值就可以得到是否是同一个人的人脸,不需要重新训练模型。如下图模型得到的结果,相同人脸特征向量距离小于1,不同人脸特征向量距离大于1。

在这里插入图片描述
在这里插入图片描述
  网上公开预训练模型为西方人脸图片,在亚洲人脸识别效果不是很好,那么如何增加亚洲人脸识别准确率呢,接下来我们进入探索吧。首先自制人脸数据集,我们通过爬虫进行网络亚洲明星人脸图片,然后结合公开亚洲人脸数据集CASIA-FaceV5制作出自制亚洲人脸数据集。用亚洲人脸数据集在预训练模型上进行再训练,也就是迁移学习训练模型,得到的亚洲人脸识别准确率就提高了很多,本文模型在自制数据集准确率达到99.8%,根据不同复杂度数据集进行十折交叉验证,准确率基本都在97%以上。当然如果感觉数据集数量再想增加一些,得到更好地亚州人脸识别模型,可以通过爬取更多的图片或者通过旋转一定的角度等进行数据增强。爬取图片代码如下。
1.写入想要下载的明星名字.

// An highlighted block
import json
import requests

//爬取网站明星名字并存入文件starName.txt
def getManyPages(pages):
    params = []
    for i in range(0, 12 * pages + 12, 12):
        params.append({
   
            'resource_id': 28266,
            # 'from_mid': 1,
            # 'format': 'json',
            # 'ie': 'utf-8',
            # 'oe': 'utf-8',
            'query': '明星',
            # 'sort_key': '',
            # 'sort_type': 1,
            # 'stat0': '',
            'stat1': '内地',
            # 'stat2': '',
            # 'stat3': '',
            'pn': i,
            'rn': 12
        })
    url = 'https://sp0.baidu.com/8aQDcjqpAAV3otqbppnN2DJv/api.php'
    x = 0
    f = open('starName.txt', 'w',encoding='utf-8') #要写入的文件名
    for param in params:
        try:
            res = requests.get(url, params=param)
            print(res)
            print(res.text)
            js = json.loads(res.text)
            print(js.get('data')[0])
            print(js.get('data')[0
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值