2020-05-29
我们依然采用以上三个阶段来逐步阐述实现细节。
第一阶段:资料收集
事实上,收集的原始口罩资料是包含多余的额外背景信息。为了仅保留面部区域的照片,我们用到了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
通过执行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.
一般查询 / 销售热线 +852 2170 7401
客户服务热线 +852 2331 8930
Copyright © 中信国际电讯(信息技术)有限公司 CITIC Telecom International CPC Limited
恭喜您提交信息成功