专栏首页贾志刚-OpenCV学堂使用OpenVINO加速Pytorch表情识别模型

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

微信公众号: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));

最终的运行结果如下图:

本文分享自微信公众号 - OpenCV学堂(CVSCHOOL),作者:gloomyfish

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-07-09

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • OpenCV+OpenVINO实现人脸Landmarks实时检测

    自从OpenCV3.3版本引入深度神经网络(DNN)模块之后,OpenCV对DNN模块支持最好的表现之一就是开始支持基于深度学习人脸检测,OpenCV本身提供了...

    OpenCV学堂
  • 系列 | OpenVINO视觉加速库使用七

    还用介绍吗,直接看下面的系列文章了解OpenVINO是干什么用的,还有如何与OpenCV一起使用,实现对DNN模块的加速运行,OpenVINO SDK开发使用等...

    OpenCV学堂
  • OpenCV基于标记控制的分水岭分割算法演示

    图像分水岭分割是基于图像形态学的语义分割算法,常见的算法实现主要基于标记的分水岭分割方法,图示如下:

    OpenCV学堂
  • 新变革开启,何为新零售赋能互联网家装的正确姿势?

    当互联网式的去中间化无法给家装行业的发展带来新的动力,人们开始从新的角度去寻找破解当下互联网家装发展困境的方式和方法。作为后互联网时代最惹人注目的领域,新零售自...

    孟永辉
  • 当新零售渐成风口,深陷资本和流量的互联网家装如何告别困局?

    对于互联网家装来讲,热度减退已经是非常确定的事情。仅仅只是用互联网的手段去对家装行业进行去中间化的处理并不能够真正能够从根本上解决家装行业的根本痛点和难题。当资...

    孟永辉
  • 风口、套路伴随其中,新零售与互联网家装最佳结合姿势在哪?

    站在当前的市场状态下,我们再来看互联网家装的时候,可以确定的是互联网家装无疑是一种营销。

    孟永辉
  • 新零售赋能互联网家装?等你想好了再谈赋能吧!

    当互联网的红利结束,恐慌和焦躁的情绪一直都在困扰着家装行业。为了延缓这种恐慌的情绪,我们看到很多的家装从业者开始寻找新的发展风口。但是,有一点我们必须要明白,如...

    孟永辉
  • 无需数学就能写AI,MIT提出AI专用编程语言Gen

    众所周知,人工智能对计算机科学和数学知识的要求之高,阻碍了人工智能研究的普及,以及初学者的入门动力。

    新智元
  • 叶伟民:被低估的.net(中) - 广州.net俱乐部2019年纲领

    这是被低估的.net系列的中篇。 上篇在这里:被低估的.net(上) - 微软MonkeyFest 2018广州分享会活动回顾

    寒树Office与RPA
  • windows net命令集

    开始菜单Win+R输入cmd启动控制台,help查询帮助信息,输入net查询网络命令

    sofu456

扫码关注云+社区

领取腾讯云代金券