CPU上跑深度学习模型,FPS也可以达100帧
点击我爱计算机视觉标星,更快获取CVML新技术
本文转载自OpenCV学堂。
英特尔从去年推出OpenVINO开发框架,从此以后几乎每三个月就更新一个版本,最新版本2019R03,但是此版本跟之前的版本改动比较大,所以在配置Python SDK支持与开发API层面跟之前都有所不同。这里假设你已经正确安装好OpenVINO框架。如果不知道如何安装与配置OpenVINO可以看我在B站视频教程:
https://www.bilibili.com/video/av71979782
Python语言支持
01
OpenVINO支持的Python版本SDK与系统列表如下:
首先需要配置好OpenVINO的python SDK支持,这个步骤其实很简单,只需要把安装好的OpenVINO目录下:
openvino_2019.3.334\python\python3.6
下的openvino文件夹copy到安装好的python3.6.5的 site-packages 目录下面,然后就可以正常使用啦。注意,上述的配置方式只对Windows下面有效。
推理引擎SDK API
02
API函数列表与说明
其中最重要的是IECore与IENetwork。
在Python语言中导入SDK支持的python代码如下:
from openvino.inference_engine import IENetwork, IECore
初始化IE(inference Engine)插件,查询设备支持的代码如下:
ie = IECore()
for device in ie.available_devices:print("Device: {}".format(device))
执行结果截图如下:
可以看到,在我的电脑上支持的设备还是挺多的,计算棒支持没问题!
在通过ie创建可执行网络的时候,会需要你指定可执行网络运行的目标设备。我们就可以从上述支持的设备中选择支持。这里需要注意的是CPU需要扩展支持,添加扩展支持的代码如下:
ie.add_extension(cpu_extension, "CPU")
创建可执行的网络的代码如下:
# CPU 执行
exec_net = ie.load_network(network=net, device_name="CPU", num_requests=2)
# 计算棒执行
lm_exec_net = ie.load_network(network=landmark_net, device_name="MYRIAD")
这里我们创建了两个可执行网络,两个深度学习模型分别在CPU与计算棒上执行推理,其中第一个可执行网络的推理请求数目是2个,执行异步推理。
人脸检测演示
03
基于OpenVINO的人脸检测模型与landmark检测模型,实现了一个CPU级别高实时人脸检测与landmark提取的程序,完整的代码实现如下:
def face_landmark_demo():# query device supportie = IECore()for device in ie.available_devices:print("Device: {}".format(device))ie.add_extension(cpu_extension, "CPU")# LUTlut = []lut.append((0, 0, 255))lut.append((255, 0, 0))lut.append((0, 255, 0))lut.append((0, 255, 255))lut.append((255, 0, 255))# Read IRlog.info("Reading IR...")net = IENetwork(model=model_xml, weights=model_bin)landmark_net = IENetwork(model=landmark_xml, weights=landmark_bin)# 获取输入输出input_blob = next(iter(net.inputs))out_blob = next(iter(net.outputs))lm_input_blob = next(iter(landmark_net.inputs))lm_output_blob = next(iter(landmark_net.outputs))log.info("create exec network with target device...")exec_net = ie.load_network(network=net, device_name="CPU", num_requests=2)lm_exec_net = ie.load_network(network=landmark_net, device_name="MYRIAD")# Read and pre-process input imagen, c, h, w = net.inputs[input_blob].shapemn, mc, mh, mw = landmark_net.inputs[lm_input_blob].shape# 释放网络del netdel landmark_netcap = cv2.VideoCapture("D:/images/video/SungEun.avi")cur_request_id = 0next_request_id = 1log.info("Starting inference in async mode...")log.info("To switch between sync and async modes press Tab button")log.info("To stop the demo execution press Esc button")is_async_mode = Truerender_time = 0ret, frame = cap.read()print("To close the application, press 'CTRL+C' or any key with focus on the output window")while cap.isOpened():if is_async_mode:ret, next_frame = cap.read()else:ret, frame = cap.read()if not ret:breakinitial_w = cap.get(3)initial_h = cap.get(4)# 开启同步或者异步执行模式inf_start = time.time()if is_async_mode:in_frame = cv2.resize(next_frame, (w, h))in_frame = in_frame.transpose((2, 0, 1)) # Change data layout from HWC to CHWin_frame = in_frame.reshape((n, c, h, w))exec_net.start_async(request_id=next_request_id, inputs={input_blob: in_frame})else:in_frame = cv2.resize(frame, (w, h))in_frame = in_frame.transpose((2, 0, 1)) # Change data layout from HWC to CHWin_frame = in_frame.reshape((n, c, h, w))exec_net.start_async(request_id=cur_request_id, inputs={input_blob: in_frame})if exec_net.requests[cur_request_id].wait(-1) == 0:# 获取网络输出res = exec_net.requests[cur_request_id].outputs[out_blob]# 解析DetectionOutfor obj in res[0][0]:if obj[2] > 0.5:xmin = int(obj[3] * initial_w)ymin = int(obj[4] * initial_h)xmax = int(obj[5] * initial_w)ymax = int(obj[6] * initial_h)if xmin > 0 and ymin > 0 and (xmax < initial_w) and (ymax < initial_h):roi = frame[ymin:ymax,xmin:xmax,:]rh, rw = roi.shape[:2]face_roi = cv2.resize(roi, (mw, mh))face_roi = face_roi.transpose((2, 0, 1))face_roi = face_roi.reshape((mn, mc, mh, mw))lm_exec_net.infer(inputs={'0':face_roi})landmark_res = lm_exec_net.requests[0].outputs[lm_output_blob]landmark_res = np.reshape(landmark_res, (5, 2))for m in range(len(landmark_res)):x = landmark_res[m][0] * rwy = landmark_res[m][1] * rhcv2.circle(roi, (np.int32(x), np.int32(y)), 3, lut[m], 2, 8, 0)cv2.rectangle(frame, (xmin, ymin), (xmax, ymax), (0, 0, 255), 2, 8, 0)inf_end = time.time()det_time = inf_end - inf_start# Draw performance statsinf_time_message = "Inference time: {:.3f} ms, FPS:{:.3f}".format(det_time * 1000, 1000 / (det_time*1000 + 1))render_time_message = "OpenCV rendering time: {:.3f} ms".format(render_time * 1000)async_mode_message = "Async mode is on. Processing request {}".format(cur_request_id) if is_async_mode else \"Async mode is off. Processing request {}".format(cur_request_id)cv2.putText(frame, inf_time_message, (15, 15), cv2.FONT_HERSHEY_COMPLEX, 0.5, (200, 10, 10), 1)cv2.putText(frame, render_time_message, (15, 30), cv2.FONT_HERSHEY_COMPLEX, 0.5, (10, 10, 200), 1)cv2.putText(frame, async_mode_message, (10, int(initial_h - 20)), cv2.FONT_HERSHEY_COMPLEX, 0.5,(10, 10, 200), 1)#render_start = time.time()cv2.imshow("face detection", frame)render_end = time.time()render_time = render_end - render_startif is_async_mode:cur_request_id, next_request_id = next_request_id, cur_request_idframe = next_framekey = cv2.waitKey(1)if key == 27:breakcv2.waitKey(0)# 释放资源cv2.destroyAllWindows()del exec_netdel lm_exec_netdel ie
1920x1080大小的视频画面检测,超高实时无压力!有图为证:
模型压缩与应用部署交流群
关注最新最前沿的深度模型压缩、剪枝、轻量级网络设计、边缘设备部署技术,扫码添加CV君拉你入群,(如已为CV君其他账号好友请直接私信)
(请务必注明:部署)
喜欢在QQ交流的童鞋,可以加52CV官方QQ群:805388940。
(不会时时在线,如果没能及时通过验证还请见谅)
长按关注我爱计算机视觉
CPU上跑深度学习模型,FPS也可以达100帧相关推荐
- 如何在浏览器上跑深度学习模型?并且一行JS代码都不用写
翻译 | 林椿眄 编辑 | 周翔 2017 年 8 月,华盛顿大学的陈天奇团队发布了 TVM,和 NNVM 一起组成深度学习到各种硬件的完整优化工具链,支持手机.CUDA.OpenCL.Metal.J ...
- 在英特尔硬件上部署深度学习模型的无代码方法 OpenVINO 深度学习工作台的三部分系列文章 - CPU AI 第一部
作者 Taylor, Mary, 翻译 李翊玮 关于该系列 了解如何转换.微调和打包推理就绪的 TensorFlow 模型,该模型针对英特尔®硬件进行了优化,仅使用 Web 浏览器.每一步都在云中使用 ...
- 利用远程云服务器跑深度学习模型
利用远程云服务器跑深度学习模型主要有三个问题需要解决. 一是深度学习环境的搭建,二是已搭建环境的保存,三是远程数据的传输. 深度学习环境的搭建 以阿里云为例,在购买服务器创建实例时,可以在镜像市场选择 ...
- 通过MACE在Android手机上部署深度学习模型
1. MACE的环境搭建 参考我的博客:MACE的环境搭建--conda实现 2. 构建项目 (1)下载MACE项目到本地 git clone https://github.com/XiaoMi/ma ...
- 使用aws跑深度学习_RNN示例项目从开发到部署(三):在AWS上部署深度学习模型...
虽然我很喜欢为自己建立数据科学和编程项目,但我同样乐于与世界上的任何人在线分享它.幸好,我们以使用AWS(Amazon Web Services),这样我们可以在几分钟内免费将Python Web应用 ...
- 本地没有环境跑深度学习模型? 阿里云天池实验室它不香吗
一.前言 前几天做深度学习模型训练使用 Google 的 colab 总是掉,搞得很烦.然后那天我队友 "叶伏天" 和我说有一个类似于 Google colab 的平台,可以训练, ...
- 猫狗图像数据集上的深度学习模型性能对比
LeNet模型简介 1. LeNet LeNet-5由七层组成(不包括输入层),每一层都包含可训练权重.通过卷积.池化等操作进行特征提取,最后利用全连接实现分类识别,下面是他的网络结构示意图: C:卷 ...
- 端上智能——深度学习模型压缩与加速
摘要:随着深度学习网络规模的增大,计算复杂度随之增高,严重限制了其在手机等智能设备上的应用.如何使用深度学习来对模型进行压缩和加速,并且保持几乎一样的精度?本文将为大家详细介绍两种模型压缩算法,并展示 ...
- 用超算平台跑深度学习模型【新用户赠送200元体验金】
文章目录 前言 一.北鲲云-一站式云超算平台介绍 二.如何领取 总结 前言 最近在训练YOLO模型,奈何自己的笔记本跑不起来,通过朋友介绍,才了解到北鲲云--一站式超算平台,跑深度模型真的很nic ...
最新文章
- DD3D:基于预训练的单目3D目标检测
- vue中使用百度地图为啥是空白_vue中使用腾讯地图(尝试篇)
- boost::mpi模块sendrecv() 操作的测试
- blob转成json js_javascript – 文件API – Blob到JSON
- PostBox使用小记
- [Redis6]配置文件详解
- 用JAVA制作小游戏——推箱子(二)
- Python学习笔记:字典(dict)
- 大家可以在十分钟内入睡吗?有什么快速入睡的方法吗?
- 微信小程序获取用户的头像和昵称
- 点击button后改变文字_24. 教你零基础搭建小程序:小程序的常见组件(5)— button标签...
- GitHub 给已存在的仓库增加开原协议LICENSE
- Thinkphp5笔记七:设置错误页面②
- 南阳理工ACM 题目252 01串
- docker daemon配置阿里云加速器
- 51单片机 矩阵键盘
- imx6 vpu程序分析
- PTC过流保护器件工作原理及选型方法
- Python加密word文档
- 图像识别(2)——《OpenCV3编程入门》毛星云编著
热门文章
- 汇编8086CPU常用指令——详解
- python list合并_python基础===两个list合并成一个dict的方法
- mathcal 对应于什么库_数据库理论
- jlink怎么调试linux程序_STM32开发板JLINK调试步骤
- 计算机系统结构循环间相关,计算机系统结构(双语)
- 51单片机c语言测距,超声波HM55B测距(STC10F08单片机C程序)
- springboot 获取bean_3W 字的 Spring Boot 超详细总结
- python高手能做什么_python高手们、能不能给新手写点心得,迷茫过、好方法、过渡期等等...
- 【debug】json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
- 参会人员管理系统C语言代码,某小型会议参会人员管理系统