热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

飞桨带你使用度量学习,提升人脸识别准确率

小测试想必在日常生活中,我们总会有一种感觉,身边认识的一些人,明明没有任何血缘关系,但是长得却可能很像,尤其对

小测试

想必在日常生活中,我们总会有一种感觉,身边认识的一些人,明明没有任何血缘关系,但是长得却可能很像,尤其对于脸盲的同学,真的是傻傻分不清楚。

 

我们这里有一组题,来测测大家的人脸识别水平。

 

先来一道简单的,【人脸识别四级】水平的,下面两位男明星分别是谁?

很简单是吧?

答案应该不需要公布了

应该难不倒大家

 

趁热打铁,我们再来一道【人脸识别六级】的,下面两位女明星分别是谁?

估计已经有一部分人答不出来了

当然很可能原因是

你不认识左边的是谁

答案在这里也不公布了,感兴趣的可以试一下我们的百度识图:http://image.baidu.com/?fr=shitu,一定可以告诉你满意的答案。

 

有的读者肯定觉得,答出以上两题很easy啊,好吧,下一题。

我们的压轴【人脸识别八级】来了!

 

不定项选择题

下面的9张照片中,假设从左到右,按顺序依次是1-3,4-6,7-9,那么,和2号照片同一个人的是几号?()

A、3号  B、4号  C、5号 D、9号

公布答案

没有!

上面的9张照片是9个人!!

一点也不意外是不是?

是的

在某些特殊情况下,人脸识别对于人类已经快成为Impossible mission了。

度量学习的引入

随着人脸识别技术逐渐在身份核验中承担越来越重要的作用,门禁准入,机场安检,金融服务等等领域都对于准确性提出了高要求,如何更精确的区分样本的特征也成为人脸识别技术的巨大挑战。

 

2002年,Eric Xing在NIPS2002提出度量学习 (Metric Learning)的概念。其中度量在数学中的定义为:一个度量(或距离函数)是一个定义集合中元素之间距离的函数。一个具有度量的集合被称为度量空间。常见的度量算法如下表所示。

度量学习目的是在特征空间中,让同一个类别的样本具有较小的特征距离,不同类的样本具有较大的特征距离。算法越来越依赖于在输入空间给定的好的度量。

 

假设我们需要计算图像之间的相似度(或距离),例如识别人脸时,我们需要构建一个距离函数去强化合适的特征(如脸型,五官等);而如果我们想识别姿势,就需要构建一个捕获姿势相似度的距离函数(如关节,动作)。为了处理各种各样的特征相似度,我们需要在特定的任务选择合适的特征并手动构建距离函数。这种方法会需要很大的人工投入,也可能对数据的改变非常不鲁棒。

 

度量学习作为一个理想的替代,可以根据不同的任务来自主学习出针对某个特定任务的度量距离函数。随着深度学习技术的发展,基于深度神经网络的度量学习方法极大的推动了人脸识别、人脸校验、行人重识别和图像检索等众多计算机视觉任务的性能提升。

 

飞桨的深度度量学习实现

 

在本章节,我们将为大家介绍在飞桨里实现的几种度量学习方法和使用方法,具体包括数据准备,模型训练,模型微调,模型评估,模型预测。


安装与依赖

运行本章节代码需要在Paddle Fluid v0.14.0 或更高的版本环境。如果你的设备上的Paddle Fluid版本低于v0.14.0,请及时安装和更新。

 

数据准备

Stanford Online Product(SOP) 数据集下载自eBay,包含120053张商品图片,有22634个类别。我们使用该数据集进行实验。训练时,使用59551张图片,11318个类别的数据;测试时,使用60502张图片,11316个类别。

SOP数据集的ftp网址:

ftp://cs.stanford.edu/cs/cvgl/Stanford_Online_Products.zip。

如果下载速度太慢,也可以到百度AI Studio公开数据集里面下载:

https://aistudio.baidu.com/aistudio/datasetDetail/5103

模型训练

为了训练度量学习模型,首先,我们需要选择一个神经网络模型作为骨架模型(例如ResNet50),其次,我们选择一个代价函数来进行训练(例如softmax 或者 arcmargin)。举例如下:

python train_elem.py \--model=ResNet50 \--train_batch_size=256 \--test_batch_size=50 \--lr=0.01 \--total_iter_num=30000 \--use_gpu=True \--pretrained_model=${path_to_pretrain_imagenet_model} \--model_save_dir=${output_model_path} \--loss_name=arcmargin \--arc_scale=80.0 \ --arc_margin=0.15 \--arc_easy_margin=False

其中,参数介绍:

  • model: 使用的模型名字. 默认:"ResNet50".

  • train_batch_size: 训练的 mini-batch大小. 默认: 256.

  • test_batch_size: 测试的 mini-batch大小. 默认: 50.

  • lr: 初始学习率. 默认:0.01.

  • total_iter_num: 总的训练迭代轮数. 默认:30000.

  • use_gpu: 是否使用GPU. 默认:True.

  • pretrained_model: 预训练模型的路径. 默认:None.

  • model_save_dir: 保存模型的路径. 默认:"output".

  • loss_name: 优化的代价函数. 默认:"softmax".

  • arc_scale: arcmargin的参数. 默认: 80.0.

  • arc_margin:arcmargin的参数. 默认: 0.15.

  • arc_easy_margin: arcmargin的参数. 默认: False.


模型微调

模型微调是在指定的任务上加载已有的模型来微调网络。在用softmax和arcmargin训完网络后,可以继续使用triplet,quadruplet或eml来微调网络。下面是一个使用eml来微调网络的例子:

python train_pair.py \--model=ResNet50 \--train_batch_size=160 \--test_batch_size=50 \--lr=0.0001 \--total_iter_num=100000 \--use_gpu=True \--pretrained_model=${path_to_pretrain_arcmargin_model} \--model_save_dir=${output_model_path} \--loss_name=eml \--samples_each_class=2

其中,参数介绍同训练过程一致。

 

模型评估

模型评估主要是评估模型的检索性能。这里需要设置path_to_pretrain_model。可以使用下面命令来计算Recall@Rank-1。

python eval.py \--model=ResNet50 \--batch_size=50 \--pretrained_model=${path_to_pretrain_model} \


模型预测

模型预测主要是基于训练好的网络来获取图像数据的特征,举例如下:

python infer.py \--model=ResNet50 \--batch_size=1 \ --pretrained_model=${path_to_pretrain_model}


模型性能

下面列举了几种度量学习的代价函数在SOP数据集上的检索效果,这里使用Recall@Rank-1来进行评估。

更多详细内容可以参见:

https://github.com/PaddlePaddle/models/tree/v1.4/PaddleCV/metric_learning


推荐阅读
  • 表面缺陷检测数据集综述及GitHub开源项目推荐
    本文综述了表面缺陷检测领域的数据集,并推荐了多个GitHub上的开源项目。通过对现有文献和数据集的系统整理,为研究人员提供了全面的资源参考,有助于推动该领域的发展和技术进步。 ... [详细]
  • 2019年后蚂蚁集团与拼多多面试经验详述与深度剖析
    2019年后蚂蚁集团与拼多多面试经验详述与深度剖析 ... [详细]
  • 2019年斯坦福大学CS224n课程笔记:深度学习在自然语言处理中的应用——Word2Vec与GloVe模型解析
    本文详细解析了2019年斯坦福大学CS224n课程中关于深度学习在自然语言处理(NLP)领域的应用,重点探讨了Word2Vec和GloVe两种词嵌入模型的原理与实现方法。通过具体案例分析,深入阐述了这两种模型在提升NLP任务性能方面的优势与应用场景。 ... [详细]
  • 本文探讨了将PEBuilder转换为DIBooter.sh的方法,重点介绍了如何将DI工具集成到启动层,实现离线镜像引导安装。通过使用DD命令替代传统的grub-install工具,实现了GRUB的离线安装。此外,还详细解析了bootice工具的工作原理及其在该过程中的应用,确保系统在无网络环境下也能顺利引导和安装。 ... [详细]
  • 计算 n 叉树中各节点子树的叶节点数量分析 ... [详细]
  • BZOJ4240 Gym 102082G:贪心算法与树状数组的综合应用
    BZOJ4240 Gym 102082G 题目 "有趣的家庭菜园" 结合了贪心算法和树状数组的应用,旨在解决在有限时间和内存限制下高效处理复杂数据结构的问题。通过巧妙地运用贪心策略和树状数组,该题目能够在 10 秒的时间限制和 256MB 的内存限制内,有效处理大量输入数据,实现高性能的解决方案。提交次数为 756 次,成功解决次数为 349 次,体现了该题目的挑战性和实际应用价值。 ... [详细]
  • 本文深入探讨了 MXOTDLL.dll 在 C# 环境中的应用与优化策略。针对近期公司从某生物技术供应商采购的指纹识别设备,该设备提供的 DLL 文件是用 C 语言编写的。为了更好地集成到现有的 C# 系统中,我们对原生的 C 语言 DLL 进行了封装,并利用 C# 的互操作性功能实现了高效调用。此外,文章还详细分析了在实际应用中可能遇到的性能瓶颈,并提出了一系列优化措施,以确保系统的稳定性和高效运行。 ... [详细]
  • HBase在金融大数据迁移中的应用与挑战
    随着最后一台设备的下线,标志着超过10PB的HBase数据迁移项目顺利完成。目前,新的集群已在新机房稳定运行超过两个月,监控数据显示,新集群的查询响应时间显著降低,系统稳定性大幅提升。此外,数据消费的波动也变得更加平滑,整体性能得到了显著优化。 ... [详细]
  • 进程(Process)是指计算机中程序对特定数据集的一次运行活动,是系统资源分配与调度的核心单元,构成了操作系统架构的基础。在早期以进程为中心的计算机体系结构中,进程被视为程序的执行实例,其状态和控制信息通过任务描述符(task_struct)进行管理和维护。本文将深入探讨进程的概念及其关键数据结构task_struct,解析其在操作系统中的作用和实现机制。 ... [详细]
  • 获取贵州省毕节市高分辨率谷歌卫星影像图
    毕节市,作为贵州省西北部的重要地级市,地处乌蒙山脉核心区域,是连接四川、云南和贵州三省的关键节点。本研究旨在获取该地区的高分辨率谷歌卫星影像图,以全面展示其独特的地理特征和城市布局。通过这些高清影像,研究人员能够更深入地分析毕节市的自然环境、城市规划及发展状况。 ... [详细]
  • 深入解析 C 语言与 C++ 之间的差异及关联
    深入解析 C 语言与 C++ 之间的差异及关联 ... [详细]
  • voc生成xml 代码
    目录 lxmlwindows安装 读取示例 可视化 生成示例 上面是代码,下面有调用示例 api调用代码,其实只有几行:这个生成代码也很简 ... [详细]
  • 【Python爬虫实操】 不创作小说,专精网站内容迁移,超高效!(含源代码)
    本文详细介绍了如何利用Python爬虫技术实现高效网站内容迁移,涵盖前端、后端及Android相关知识点。通过具体实例和源代码,展示了如何精准抓取并迁移网站内容,适合对Python爬虫实战感兴趣的开发者参考。 ... [详细]
  • 在Python 3环境中,当无法连接互联网时,可以通过下载离线模块包来实现模块的安装。具体步骤包括:首先从PyPI网站下载所需的模块包,然后将其传输到目标环境,并使用`pip install`命令进行本地安装。此方法不仅适用于单个模块,还支持依赖项的批量安装,确保开发环境的完整性和一致性。 ... [详细]
  • 本文提供了PyTorch框架中常用的预训练模型的下载链接及详细使用指南,涵盖ResNet、Inception、DenseNet、AlexNet、VGGNet等六大分类模型。每种模型的预训练参数均经过精心调优,适用于多种计算机视觉任务。文章不仅介绍了模型的下载方式,还详细说明了如何在实际项目中高效地加载和使用这些模型,为开发者提供全面的技术支持。 ... [详细]
author-avatar
llliu
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有