干货 | 使用OpenVINO加速Pytorch表情识别模型

干货分享 专栏收录该内容
11 篇文章 0 订阅

干货 | 使用OpenVINO加速Pytorch表情识别模型

以下文章来源于OpenCV学堂 ,作者gloomyfish
微信公众号:OpenCV学堂 - 关注获取更多计算机视觉与深度学习知识

关于模型

OpenVINO自带的表情识别模型是Caffe版本的,这里使用的模型是前面一篇文章中训练生成的pytorch全卷积网络,模型基于残差网络结构全卷积分类网络。

输入格式:NCHW=1x3x64x64
输出格式:NCHW=1x8x1x1

支持八种表情识别,列表如下:

["neutral","anger","disdain","disgust","fear","happy",

"sadness","surprise"]

转ONNX

训练好的Pytorch模型可以保存为pt文件,通过pytorch自带的脚本可以转换为ONNX模型,这一步的转换脚本如下:

dummy_input = torch.randn(1, 3, 64, 64, device='cuda')
 model = torch.load("./face_emotions_model.pt")
 output = model(dummy_input)
 model.eval()
 model.cuda()
 torch.onnx.export(model, dummy_input, "face_emotions_model.onnx", output_names={"output"}, verbose=True)

OpenCV DNN调用ONNX模型测试

转换为ONNX格式的模型,是可以通过OpenCV DNN模块直接调用的,调用方式如下:

 1landmark_net = cv.dnn.readNetFromONNX("landmarks_cnn.onnx")
 2image = cv.imread("D:/facedb/test/464.jpg")
 3cv.imshow("input", image)
 4h, w, c = image.shape
 5blob = cv.dnn.blobFromImage(image, 0.00392, (64, 64), (0.5, 0.5, 0.5), False) / 0.5
 6print(blob)
 7landmark_net.setInput(blob)
 8lm_pts = landmark_net.forward()
 9print(lm_pts)
10for x, y in lm_pts:
11    print(x, y)
12    x1 = x * w
13    y1 = y * h
14    cv.circle(image, (np.int32(x1), np.int32(y1)), 2, (0, 0, 255), 2, 8, 0)
15cv.imshow("人脸五点检测", image)
16cv.imwrite("D:/landmark_det_result.png", image)
17cv.waitKey(0)
18cv.destroyAllWindows()

运行结果如下:

在这里插入图片描述
ONNX转IR

如何把ONNX文件转换OpenVINO的IR文件?答案是借助OpenVINO的模型优化器组件工具,OpenVINO的模型优化器组件工具支持常见的Pytorch预训练模型与torchvision迁移训练模型的转换,

在这里插入图片描述
要转换ONNX到IR,首先需要安装ONNX组件支持,直接运行OpenVINO预安装脚本即可获得支持,截图如下:

在这里插入图片描述
然后执行下面的转换脚本即可:

在这里插入图片描述
不用怀疑了,转换成功!

加速推理

使用OpenVINO的Inference Engine加速推理,对得到的模型通过OpenVINO安装包自带的OpenCV DNN完成调用,设置加速推理引擎为Inference Engine,这部分的代码如下:

1dnn::Net emtion_net = readNetFromModelOptimizer(emotion_xml, emotion_bin);
2emtion_net.setPreferableTarget(DNN_TARGET_CPU);
3emtion_net.setPreferableBackend(DNN_BACKEND_INFERENCE_ENGINE);

其中readNetFromModelOptimizer表示使用OpenVINO模型优化器来加载文件,并使用inference engine执行加速推理。

执行推理与输出解析,得到表情分类的结果,代码如下:

 1Rect box(x1, y1, x2 - x1, y2 - y1);
 2Mat roi = frame(box);
 3Mat face_blob = blobFromImage(roi, 0.00392, Size(64, 64), Scalar(0.5, 0.5, 0.5), false, false);
 4emtion_net.setInput(face_blob);
 5Mat probs = emtion_net.forward();
 6int index = 0;
 7float max = -1;
 8for (int i = 0; i < 8; i++) {
 9    const float *scores = probs.ptr<float>(0, i, 0);
10    float score = scores[0];
11    if (max < score) {
12        max = score;
13        index = i;
14    }
15}
16rectangle(frame, box, Scalar(0, 255, 0));

最终的运行结果如下图:

在这里插入图片描述
在这里插入图片描述

  • End -

*OpenVINO and the OpenVINO logo are trademarks of Intel Corporation or its subsidiaries.

原文发布于2020-07-17:干货 | 使用OpenVINO加速Pytorch表情识别模型

关注我们,让开发变得更有趣👇
在这里插入图片描述
微信号:openvinodev
B站:OpenVINO 中文社区

  • 1
    点赞
  • 0
    评论
  • 3
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

<p><span style="color: #333333; font-family: 'Hiragino Sans GB', 'Microsoft Yahei', arial, 宋体, 'Helvetica Neue', Helvetica, STHeiTi, sans-serif; font-size: 16px; background-color: #ffffff;">详细介绍了OpenVINO整体架构、基本组件、核心组件DLDT与IE的使用OpenVINO模型加速执行推断的开发流程与步骤、相关SDK API函数如何在C++与Python环境下进行API调用,如何使用预训练模型快速开发图像分类、对象检测、语义分割、实例分割、车牌识别、行人检测、场景文字检测与识别、YOLOv5模型部署加速与推理、表情识别与landmark提取等高实时视频分析程序,使用模型优化器进行模型压缩转换与优化等OpenVINO核心技术演示与代码教学。一步一步教你构建CPU级别可实时的深度学习模型应用程序。部分演示程序截图如下(</span><strong style="color: #333333; font-family: 'Hiragino Sans GB', 'Microsoft Yahei', arial, 宋体, 'Helvetica Neue', Helvetica, STHeiTi, sans-serif; font-size: 16px; background-color: #ffffff;">均基于CPU达到实时帧率,基于OpenVINO2021.02版本录制</strong><span style="color: #333333; font-family: 'Hiragino Sans GB', 'Microsoft Yahei', arial, 宋体, 'Helvetica Neue', Helvetica, STHeiTi, sans-serif; font-size: 16px; background-color: #ffffff;">):</span></p> <p><span style="color: #424242; background-color: #ffffff;"><img src="https://img-bss.csdn.net/201911090640507040.png" alt="" /><br /></span></p>
©️2021 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值