本网站使用Cookies 以优化阁下的用户体验。继续浏览网页,以示阁下同意本站使用Cookies。详情请参阅Cookie政策私隐政策

确定
马来西亚

网志

中信国际电讯CPC > 网志
2020-05-29

如何实现AI人脸识别及口罩佩戴检测功能?

By 中企通信高级AI应用开发工程师 曾晓斌先生

我们依然采用以上三个阶段来逐步阐述实现细节。


第一阶段:资料收集

事实上,收集的原始口罩资料是包含多余的额外背景信息。为了仅保留面部区域的照片,我们用到了MTCNN算法进行人脸检测。MTCNN算法不仅可以判断当前照片是否有人,而且若有人出现,能相应地检测出人脸的坐标位置。


通过MTCNN进行人脸检测,我们可以对所有的原始数据进行处理,仅保留脸部信息,最后还需要对图片的尺寸统一缩放到112×112。MS-Celeb-1M的图片数据也需要进行同样的检测、截取、缩放操作。


我们将口罩数据按如下划分为训练集(训练模型参数)和验证集(验证模型精度)

训练集:1,300张口罩照片、1,300张无口罩照片

验证集:300张口罩照片、300张无口罩照片

人脸识别数据的训练集使用了MS-Celeb-1M,验证集则选用了LFW (Labeled Faces in the Wild),后者是业界普遍用于评判一个识别模型精度的基准图像库。


第二阶段:训练

我们选用了MobileNet V2作为口罩判断模型的网络,MobileNet V2是一个轻量级的卷积神经网络,该网络的设计原则是预测精度有略微的减少的同时,显著地减少模型参数和数学计算量,最终使模型的运算性能达到较佳的状态。MobileNet V2的网络架构使用到的两种block设计,另外,我们把该网络的数据输入层的尺寸设定为112×112(原网络的输入为224×224),这也是在数据处理时需要把图片尺寸统一为112×112的原因。


我们使用了MrCPlusPlus提供的预训练模型作为口罩检测模型的初始化模型,将原网络的输出层修改为2(因为只有戴口罩和没戴口罩两个类别),然后再进行微调训练。训练参数设置为batch size=32(每次取32张照片同时进行训练),使用ADAM优化器用作网络参数的更新,初始学习率设置为0.1,损失函数我们选用了Softmax Loss并加入了权重L2正则化。参数更新迭代了40次后,模型的验证集精度已经达到了98%,并趋于稳定。


在项目mask_wear_detection路径下,包含以下文件结构:


./data/ 主要存放口罩的图片数据

./output/ 存放预训练的模型文件以及训练后得到的模型文件

至于目录下的Python脚本,则对应以下功能:

data_process.py: 将原有的jpg档转换成Tensorflow的特定文件格式tfrecords。

train_nets_transfer_learning.py: 训练口罩佩戴检测模型。

eval_ckpt_file.py: 评估模型的识别精度

freeze_graph.py: 冻结模型。将训练所得的.ckpt格式的模型转换成最终部署的.pb格式。

inference_predict_pb.py: 对单张图片进行推理运算。

common.py: 包含一些模型训练的设置。

MobileFaceNet.py: 使用的MobileNet V2神经网络结构。


首先需要进行文件格式转换,打开data_process.py可以看到:

我们分别对使用预设定的clear_train.txt和clear_val.txt生成了没戴口罩的训练集和验证集,mask_train.txt和mask_val.txt生成了戴口罩的训练集和验证集。

打开train_nets_transfer_learning.py,我们需要在脚本的开头导入以下开发包


我们设置了如下训练超参数

优化器默认选择了Adam

将data_process.py中已生成的训练集和验证集的tfrecords文件路径设置为train_file_path和validate_file_path,然后使用Tensorflow的iterator函数每次获取训练/验证数据。


我们对网络的卷积权重参数进行了L2正则化处理,加上顶层的Softmax Loss,构成最终的总损失total_loss

因为我们此次训练使用了迁移学习,我们需要导入设定的pretrained_model, 并且加载除了顶层以后的所有网络层参数作为初始化参数。



通过执行Tensorflow的会话session,我们可以针对images_train(训练集图片数据)和labels_train(训练集标签)进行参数训练了。通过观察total_loss_train和acc_train获知当前训练集的损失值(越低越好)和准确率(越高越好)。


我们设定了每训练次数达到10次(validate_interval的值),就进行验证集损失(inference_loss)和准确率(acc_val)计算,实时获知当前模型的泛化能力。


若当前的验证集准确率有提升,则以ckpt的格式保存当前的模型。



我们选用了ResNet50作为人脸识别模型的网络, ResNet50 归属于Residual Network系列。 Residual Network的设计思路是首次提出了直连接,即底层的特征与高层的特征进行迭加融合,这种设计解决了训练过程中的梯度消失和梯度爆炸问题,使底层的网络参数也能得到有效的训练更新。同样地,网络的数据输入层也设定为112×112。。


我们参考了deepinsight的ResNet50模型,并选用了该模型作为预训练模型,然后进行微调训练。训练参数设置为batch size=8,epoch=10(训练集的数据训练10次),使用ADAM优化器用作网络参数的更新,学习率按下表设置:

epoch

1

2

3

4

5

6

7

8

9

10

学习率

0.1

0.01

0.01

0.01

0.001

0.001

0.0001

0.0001

0.00001

0.00001

损失函数我们选用了Softmax Loss并加入了权重L2正则化。最终训练得到的ResNet50在LFW的准确率能到达99.8%。


在项目InsightFace_Tensorflow路径下,包含以下文件结构:


./data/ 存放了MS-Celeb-1M数据(train.rec和train.idx)、LFW数据(lfw.bin)以及tfrecords数据

./output/ 存放预训练的模型文件以及训练后得到的模型文件

至于目录下的Python脚本,则对应以下功能:

data_process.py: 将train.rec和train.idx转换成Tensorflow的特定文件格式tfrecords。

train_nets.py: 训练人脸识别模型。

eval_ckpt_file.py: 评估模型在LFW的识别精度

freeze_graph.py: 冻结模型。将训练所得的.ckpt格式的模型转换成最终部署的.pb格式。

inference_extract_pb.py: 对单张图片进行推理运算。

common.py: 包含一些模型训练的设置。

ResNet50.py: 使用的ResNet50神经网络结构。


首先需要进行文件格式转换,打开data_process.py可以看到:


我们把train.rec和train.idx文件路径赋值给idx_path和bin_path,可以生成Tensorflow指定的文件格式tfrecords,该生成的文件作为模型的训练集文件。

打开train_nets.py,我们需要在脚本的开头导入以下开发包


我们设置了如下训练超参数


优化器默认选择了Adam


将data_process.py中已生成的训练集tfrecords文件路径设置为tfrecords_file_path,然后使用Tensorflow的iterator函数每次获取训练数据。


我们对网络的卷积权重参数和瓶颈层的特征进行了L2正则化处理,加上顶层的inference Loss,构成最终的总损失total_loss


因为我们此次训练使用了迁移学习,我们需要导入设定的pretrained_model, 并且加载除了顶层以后的所有网络层参数作为初始化参数。


通过执行Tensorflow的会话session,我们可以针对images_train(训练集图片数据)和labels_train(训练集标签)进行参数训练了。通过观察total_loss_train和acc_train获知当前训练集的损失值(越低越好)和准确率(越高越好)。


我们设定了每训练次数达到10次(validate_interval的值),就评估模型在LFW的准确率,我们使用了verification.py的evaluate函数进行准确率评估。


我们主要关注np.mean(accuracy)这项指标,假如该值有所提升,则以ckpt的格式保存当前的模型。


值得注意的是,我们本次选用的MTCNN模型是源自OAID提供的预训练后的人脸检测模型。


第三阶段:部署

我们选用了FLIR C3作为本项目的图像采集摄像机,该款摄像头能通过热成像原理测量当前画面目标的表面温度。FLIR C3 SDK的开发语言是C#,因此我们选用C#作为软件开发语言,并将AI功能编译成dll的形式提供给软件加载并调用。

在上一阶段,我们已经训练得到了口罩判断模型、人脸识别模型以及现有的人脸检测模型。我们使用Neargye编译的Tensorflow C库对以上三个模型进行加载、推理等操作运算。最后,我们把这些C++实现的AI功能函数编译成了dll(因为C#调用C++源码,需要将后者编译成dll)。软件最终运行的系统平台是Windows 10。10。

< 返回阅读更多>





引用


[1] Guo, Yandong, et al. "MS-Celeb-1M: A Dataset and Benchmark for Large-Scale Face Recognition." european conference on computer vision (2016): 87-102.

[2] G. B. Huang, M. Ramesh, T. Berg, and E. Learned-Miller. Labeled faces in the wild: A database for studying face recognition in unconstrained environments. Technical report, 2007.

[3] Sandler, Mark, et al. "MobileNetV2: Inverted Residuals and Linear Bottlenecks." computer vision and pattern recognition (2018): 4510-4520.

[4] Open source code. Available from https://github.com/MrCPlusPlus/MobileFaceNet_Tensorflow_Pretrain.

[5] He, Kaiming, et al. "Deep Residual Learning for Image Recognition." computer vision and pattern recognition (2016): 770-778.

[6] Open source code. Available from https://github.com/deepinsight/insightface.

[7] Open source code. Available from https://github.com/OAID/FaceDetection.

[8] Open source code. Available from https://github.com/Neargye/hello_tf_c_api.


热门文章

遥距工作新常态:网络安全威胁

商业活动新常态:在线模式崭露头角

云端转移之旅 – 7个成功法则

SD-WAN的机遇与挑战

医药无小事 现代制药如何重塑网络「现代化」

分享这个帖子
选择标签

所有 人工智能 大数据 云端 连接 数据中心 资料私隐 教育科技 大湾区 资讯安全 创新 一带一路 SD-WAN 数码转型 专题 商业视野
相关产品

如果您想了解更多有关以上的资讯,欢迎提供您的联络资料,我们会尽快与您联络。

联络我们

产品与服务
专用网络 信息安全管理 云端运算方案 云数据中心 互联网服务 管理平台 欧洲及CIS方案
解决方案
建筑、工程及建造 汽车 银行及金融 电子商贸 物流及运输 制造 专业服务 零售 贸易 其他
客户服务
客户登录 客户服务热线 服务中心
资源中心
产品单页 最新优惠 视频 白皮书 成功案例
关于我们
我们公司 合作伙伴 新闻中心 认证及奖项 成功案例 视频 联系我们 职位招聘 网志 COVID-19
联络我们

一般查询 603 2280 1500

销售热线 603 2280 1500

联络我们

网站地图 | 免责声明 | 防止盗用网络政策 | 私隐政策 | Cookie 政策

中信集团品牌认证 | 中信云赋能
Copyright © 中信国际电讯(信息技术)有限公司 CITIC Telecom International CPC Limited

关注我们

欢迎来到中信国际电讯CPC

你即将前往我们的网站

请选择地点:

南非

南美

美国及加拿大

中企通信

亚太区
欧洲及CIS
南非
南美
美国及加拿大
需要帮忙?联络CPC聊天机械人
浏览器支持:IE11、Firefox、Chrome和Safari 的最新版本
条款及细则
欢迎来到中信国际电讯(信息技术)有限公司。阁下与CPC聊天机器人的对话内容可能会被记录,以作培训、质量监控和纠纷处理之用。如阁下点击「继续」并使用CPC聊天机器人,即表示阁下接受并同意受本公司之私隐政策约束,并同意本站使用Cookies。详情请参阅Cookie政策私隐政策
继续