百度黄埔学院:交通枢纽高密人流下的防疫筛查解决方案技术理解(2)
最近我在第三期百度黄埔学院支持下进行了一些学习,还是很有收获的,本文主要记录学习过程中的技术细节和想法。
课程1:交通枢纽高密人流下的防疫筛查解决方案,主讲人为百度视觉技术部:奉孝老师。
课程主要有以下四个方面的内容:
- AI多人体温度快速检测系统——人脸检测算法Pyramidbox
- 口罩检测分类模型
- 企业AI入场解决方案
- 基于深度学习的嵌入式人脸技术及行业应用
ps:本来是准备一篇文章都整理完的,写着写着发现篇幅太长了。。。只好分成几部分
本文介绍第二部分:口罩检测分类模型、企业AI入场解决方案和嵌入式开发
一、口罩检测分类模型
该模型是业界的首个开源口罩人脸检测及分类模型,开源地址为https://www.paddlepaddle.org.cn/hub/scene/maskdetect ,感兴趣的可以看一下。
在这里简单的介绍一下。百度飞桨提供了一个全流程的开发者套件,包含了从训练到部署的全过程。在训练端,我们知道采取预训练加Fine-tune的方式能够加速训练,甚至如果有匹配度非常好的预训练模型,干脆就不用从头训练了,直接调用预训练模型中的参数就可以了。
百度开源的口罩检测分类模型采取了这种策略,通过飞桨的预训练模型管理和迁移学习工具PadddleHub,可以调用两个预训练模型,pyramidbox_lite_mobile_mask和pyramidbox_lite_server_mask,这两个预训练模型都是基于Pyramidbox开发的,区别在于前者对应移动端部署,后者对应服务器端部署。
课程中提到了一个比较重要的点,就是数据闭环。深度学习本身是数据驱动型的模型,数据的好坏直接影响算法的好坏。但是现实情况中存在几个问题:一是训练数据和真实数据可能并不服从同分布;二是某些场景下数据量较少,尤其体现在工业界。
解决上述两个问题的方法主要有四种,一是采取迁移学习的策略,将相似场景下的技能迁移过来;二是采取若监督训练的方式,少量的标注样本+大量的非标注样本;三是数据扩增,采取某些动态的模拟真实场景的数据扩增方式,增加样本量;以上三种方法是比较常用的策略,效果也不错,但是治标不治本。第四种方案是数据闭环,在初期因为数据量小、不服从同一分布,导致检测效果差。没关系,在使用过程中通过慢慢收集真实场景下的样本,然后回流至模型,用于模型迭代,让模型具备在线增强的能力。
百度开源的口罩检测分类模型上线之后就采取了这种数据闭环的策略,上线以来完成了3次模型迭代,效果越来越好。
二、企业AI入场解决方案
与口罩检测分类模型不同,企业AI入场解决方案的核心是人脸识别的身份认证。不光要看看你有没有戴口罩,还要识别出戴口罩的人是谁。
这一部分的主要内容是口罩人脸识别模型。
有三个方面的内容:
1.基于人脸关键点的三维图像融合技术进行人脸数据生成
2.spatial-attention机制引导网络学习非口罩区域的人脸信息
3.基于Paddle大规模分类库PLSC快速对数百万ID的训练数据进行训练
先来介绍第一点,人脸数据生成
目前关于人脸的数据是比较多的,但是并没有大规模的戴口罩的人脸数据,所以首先得解决数据问题。考虑到时间成本和效率,现场采集戴口罩的人脸数据是不现实的,百度采取的方案是在现有的人脸数据上生成口罩,形成戴口罩人脸的数据库。从下图可以看出生成效果还是很不错的。
生成策略是基于人脸的关键点获取与嘴部遮挡相关的区域,来生成三角剖分区域,然后将口罩与目标人脸的坐标进行仿射变换,使口罩与人脸对齐,实现自动化的人脸口罩生成策略。课程中没有详细讲,不过典型的人脸识别算法,比如face_recognition,都可以返回人脸中关键点的数据,比如脸颊左点、右点和下点组成的三角区域。
if model == 'large':
return [{
"chin": points[0:17],
"left_eyebrow": points[17:22],
"right_eyebrow": points[22:27],
"nose_bridge": points[27:31],
"nose_tip": points[31:36],
"left_eye": points[36:42],
"right_eye": points[42:48],
"top_lip": points[48:55] + [points[64]] + [points[63]] + [points[62]] + [points[61]] + [points[60]],
"bottom_lip": points[54:60] + [points[48]] + [points[60]] + [points[67]] + [points[66]] + [points[65]] + [points[64]]
} for points in landmarks_as_tuples]
elif model == 'small':
return [{
"nose_tip": [points[4]],
"left_eye": points[2:4],
"right_eye": points[0:2],
} for points in landmarks_as_tuples]
代码中特征点索引的含义如下图所示:
接下来是第二点,空间注意力机制引导网络学习非口罩遮盖区域的人脸信息
通过空间注意力机制的引导,让网络更多的去学习眼部、眉毛等非遮盖区域的人脸信息,然后通过这一部分信息对人进行身份信息验证。
注意力机制的本质就是定位到感兴趣的信息,抑制不感兴趣的信息。看PPT中给的图有点像Convolutional Block Attention Module中的空间注意力机制部分,CBAM中的空间注意力机制的输入的是一个C x H x W的特征图,首先在通道轴上进行平均池化和最大池化,生成两个维度为1x H x W的特征图,并将特征图拼接到一起,然后通过几个卷积核大小为7x7的卷积层生成一个大小为1 x H x W的特征图,最后经过广播机制扩展至C x H x W维度后,逐元素与原始的C x H x W维特征图相乘。经过广播机制的注意力特征图实际上是一个二维特征图被复制到了C个通道上,二维特征图每个像素位置的值不一样,但C维度上每个值都一样(广播机制嘛)。
将特征图可视化后,可以看到眼睛附近的相应是比较强烈的。
最后基于Paddle的大规模分类库PLSC快速对数百万ID的训练数据进行训练,这部分就不再展开了。
三、基于深度学习的嵌入式人脸技术及行业应用
基于深度学习的嵌入式人脸技术主要应用于手机等电子消费品的人脸解锁、远程认证、人脸支付,还有考勤检验、门禁通行和金融支付等。
技术需求有:
(1)模型小型化:模型需要在保证精度的情况下做到足够小以保证在低算力芯片上的稳定运行;
(2)多模态算法:模型需要支持RGB、NIR、DEPTH(分别为图像、红外和点云)以保证人脸支付等操作的安全性;
(3)易于部署:SDK产品需要支持多种操作系统以保证用户能够快速、高效完成部署;
(4)软硬结合:SDK需要与更多的镜头模组、计算芯片进行适配以保证软硬结合效果最优。
下图是百度飞桨基于深度学习的嵌入式人脸技术的架构。百度系统层面的深度学习框架为飞桨(PaddlePaddle),来实现模型的训练和预测。训练后模型进入到基础技术层,基础技术层的工作是完成高效的网络结构设计、模型压缩至小型化和针对预测库的性能优化。在能力层来说,要实现人脸检测、人脸关键点提取、人脸活体检测和人脸识别等功能。然后将以上功能封装成支持多系统、模块化、硬件支持率高的SDK。最后是保证SDK与更多的芯片和模组适配,或者说开发软硬结合的套件,真正实现即插即用,提升集成效率。
解释一下百度FaceID_SDK的技术架构。
在系统层面:使用Paddle-cv进行模型训练,使用Paddle-slim进行模型压缩,使用Paddle-cv进行模型部署。
在技术基础层面上:通过算法设计、多模态数据的积累和数据闭环迭代来保证算法的领先。通过模型量化、蒸馏、剪枝等方法压缩模型,使其小型化。对预测库、图像处理库和部分硬件进行优化加速。
在能力层面上,实现与人脸相关的人脸检测、人脸识别等共计19种能力。
在SDK层面,将19种功能封装,做成接口,支持多平台的模块化调用。
在软硬结合层面,百度自己开发了一些软硬结合套件(比如百度的人脸识别产品套件:壁虎),支持华为海思等大量芯片与镜头,并支持多个模态。
目前,嵌入式人脸技术广泛应用于安防监控、人脸支付、人脸交互、人脸通行等领域,在未来大有所为。
- 数据库无响应问题的紧急处理和分析 (r10笔记第42天)
- 【转载】记Golang数据库查询封装的坑
- Golang 基本语法学习笔记之流程控制
- Go 语言的演化历程
- JS 评分五角星随鼠标移动显示
- Golang标准库学习——buffio包 ---转
- 【Go 语言社区】Go语言条件变量的两个例子
- mysqlimport导入报错的排查(r10笔记第58天)
- 【Go 语言社区】POJ 1047 Round and Round We Go 循环数新解
- 【Go 语言社区】删除redis所有KEY
- 【Go 语言社区】Golang 动态实例化结构体
- 【Go 语言社区】Go 错误处理
- 【Go 语言社区】Go 语言范围(Range)
- 【Go 语言社区】JS 相关---Window Location
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 如何实现一个高效的启发式算法?
- Python数据可视化:豆瓣电影TOP250
- 容器化 FRP 使用方案
- 任意图像转素描:Python分分钟实现
- Python数据科学:相关分析
- Python数据科学:正态分布与t检验
- Python数据科学:方差分析
- 推荐3个开源的快速开发平台,前后端都有,项目经验又有着落了!
- Python数据科学:卡方检验
- Java 中使用 Redis
- Python数据科学:线性回归
- 人生苦短,我用k8s--------------单节点二进制部署
- 人生苦短,我用k8s--------------k8s集群二进制部署
- 从零开始学习 JD Chain(四)-使用穿透式检索-Release
- 用Python清除文件夹中的重复视频