Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >CPU上跑深度学习模型,FPS也可以达100帧

CPU上跑深度学习模型,FPS也可以达100帧

作者头像
OpenCV学堂
发布于 2019-11-11 05:28:58
发布于 2019-11-11 05:28:58
2K00
代码可运行
举报
运行总次数:0
代码可运行

英特尔从去年推出OpenVINO开发框架,从此以后几乎每三个月就更新一个版本,最新版本2019R03,但是此版本跟之前的版本改动比较大,所以在配置Python SDK支持与开发API层面跟之前都有所不同。这里假设你已经正确安装好OpenVINO框架。如果不知道如何安装与配置OpenVINO可以看我在B站视频教程

https://www.bilibili.com/video/av71979782

Python语言支持

01

OpenVINO支持的Python版本SDK与系统列表如下:

首先需要配置好OpenVINO的python SDK支持,这个步骤其实很简单,只需要把安装好的OpenVINO目录下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
openvino_2019.3.334\python\python3.6

下的openvino文件夹copy到安装好的python3.6.5的 site-packages 目录下面,然后就可以正常使用啦。注意,上述的配置方式只对Windows下面有效。

推理引擎SDK API

02

API函数列表与说明

其中最重要的是IECore与IENetwork。

在Python语言中导入SDK支持的python代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from openvino.inference_engine import IENetwork, IECore

初始化IE(inference Engine)插件,查询设备支持的代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ie = IECore()
for device in ie.available_devices:
         print("Device: {}".format(device))

执行结果截图如下:

可以看到,在我的电脑上支持的设备还是挺多的,计算棒支持没问题!

在通过ie创建可执行网络的时候,会需要你指定可执行网络运行的目标设备。我们就可以从上述支持的设备中选择支持。这里需要注意的是CPU需要扩展支持,添加扩展支持的代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ie.add_extension(cpu_extension, "CPU")

创建可执行的网络的代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 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提取的程序,完整的代码实现如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def face_landmark_demo():
    # query device support
    ie = IECore()
    for device in ie.available_devices:
        print("Device: {}".format(device))
    ie.add_extension(cpu_extension, "CPU")

    # LUT
    lut = []
    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 IR
    log.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 image
    n, c, h, w = net.inputs[input_blob].shape
    mn, mc, mh, mw = landmark_net.inputs[lm_input_blob].shape

    # 释放网络
    del net
    del landmark_net

    cap = cv2.VideoCapture("D:/images/video/SungEun.avi")

    cur_request_id = 0
    next_request_id = 1

    log.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 = True
    render_time = 0
    ret, 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:
            break
        initial_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 CHW
            in_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 CHW
            in_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]

            # 解析DetectionOut
            for 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] * rw
                            y = landmark_res[m][1] * rh
                            cv2.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 stats
            inf_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_start

        if is_async_mode:
            cur_request_id, next_request_id = next_request_id, cur_request_id
            frame = next_frame

        key = cv2.waitKey(1)
        if key == 27:
            break

    cv2.waitKey(0)
    # 释放资源
    cv2.destroyAllWindows()
    del exec_net
    del lm_exec_net
    del ie

1920x1080大小的视频画面检测,超高实时无压力!有图为证:

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-11-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 OpenCV学堂 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
系列 | OpenVINO使用之行人属性识别
OpenVINO不仅通过其IE组件实现加速推理,其提供的预训练库还支持各种常见的图像检测、分割、对象识别等的计算机视觉任务。前面小编写过一系列的文章详细介绍过OpenVINO的各种应用,可以看这里回顾一下:
OpenCV学堂
2019/07/30
2.6K0
系列 | OpenVINO使用之行人属性识别
教程 | 100行代码搞定实时视频人脸表情识别
好就没有写点OpenCV4 + OpenVINO的应用了,前几天上课重新安装了一下最新OpenVINO2020.3版本,实现了一个基于OpenCV+OpenVINO的Python版本人脸表情识别。100行代码以内,简单好用!
OpenCV学堂
2020/07/08
2.5K0
OpenVINO中两个高分辨率的人脸检测模型
OpenVINO中提供了八个人脸检测的相关模型,其中有两个与剩余的六个是基于不同的对象检测头实现。今天这里就重点介绍一下这两个与众不同的人脸检测预训练模型的使用。 模型说明
OpenCV学堂
2021/11/16
6060
OpenVINO中两个高分辨率的人脸检测模型
OpenVINO + OpenCV实现点头与摇头识别验证
OpenVINO支持头部姿态评估模型,预训练模型为:head-pose-estimation-adas-0001,在三个维度方向实现头部动作识别,它们分别是:
OpenCV学堂
2020/11/06
1.9K0
OpenVINO开发教程之八 – 道路分割
基于OpenVINO预训练模块中的道路分割模型,实现像素级别的图像分割,把像素划分为如下四个类别
OpenCV学堂
2019/06/14
2.9K3
OpenVINO开发教程之八 – 道路分割
亲测有效 | OpenVINO支持ONNX格式文件直接读取了
OpenVINO 2020R04版本支持ONNX格式文件的直接读取了,使用的函数还是跟之前读取IR文件函数保持一致,只是第二个参数缺省为空时候,就会尝试读取ONNX格式文件。相关的函数与参数解释如下:
OpenCV学堂
2020/09/24
4.1K0
亲测有效 | OpenVINO支持ONNX格式文件直接读取了
系列 | OpenVINO视觉加速库使用七
还用介绍吗,直接看下面的系列文章了解OpenVINO是干什么用的,还有如何与OpenCV一起使用,实现对DNN模块的加速运行,OpenVINO SDK开发使用等相关技术。
OpenCV学堂
2019/05/13
3.9K1
系列 | OpenVINO视觉加速库使用七
OpenVINO实时人脸表面3D点云提取
2019出现的一个可以在移动端实时运行的人脸3D表面提取模型-FaceMesh,被很多移动端AR应用作为底层算法实现人脸检测与人脸3D点云生成。相关的论文标题为:
OpenCV学堂
2021/05/07
1.1K0
OpenVINO实时人脸表面3D点云提取
OpenVINO + OpenCV实现车辆检测与道路分割
模型介绍 OpenVINO支持道路分割与车辆检测,预训练模型分别为: - road-segmentation-adas-0001 - vehicle-detection-adas-0002 其中道路分割模型的输出四个分类,格式如下: BG, road, curb, mark, 输出格式[NCHW]=[1x4x512x896] 车辆检测模型基于SSD MobileNetv1实现,输出格式为: NCHW = [1x1xNx7],其中N表示检测到boxes数目 代码演示 01 道路分割模型加载与推理 首先加载道
OpenCV学堂
2020/11/06
1.1K0
OpenVINO + OpenCV实现车辆检测与道路分割
【全流程】从头在树莓派4B上部署自己训练的yolov5模型(配合NCS2加速)
最近这一个月基本没写过博客,因为一直在树莓派4B上部署yolov5的模型,已经数不清楚踩了多少坑了,来来回回折腾了一个月,终于完成了。于是写下这篇博客,一是记录下全部的流程,方便以后其他项目借鉴;二是希望和我一样有类似需求的朋友能少走些弯路。
全栈程序员站长
2022/09/02
7.4K0
OpenCV + OpenVINO实现人脸AR – 请戴上口罩
最近在看我之前的写的一篇关于人脸landmark的文章,里面有提到OpenVINO自带模型人脸的35个点位,有人问我这个landmark检测有什么用,我斗胆抛砖引玉一下,做了个简单的自动戴口罩的AR演示。
OpenCV学堂
2021/11/25
8870
OpenCV + OpenVINO实现人脸AR – 请戴上口罩
场景文字检测模型PixelLink详解与使用….
OpenVINO是英特尔推出基于CPU/GPU新一代视觉加速框架,可以对常见的各种检测模型与分割模型在CPU端侧实现10倍以上加速。其自带预训练模型库支持多种常见视觉感知与识别应用场景,可以快速搭建原型演示程序与极简应用。相关视频教程可以点击下面链接学习:
OpenCV学堂
2019/06/19
1.3K0
场景文字检测模型PixelLink详解与使用….
OpenVINO场景文字检测与识别
OpenVINO提供的场景文字检测模型准确率是非常的高,完全可以达到实用级别,其实OpenVINO还提供了另外一个场景文字识别的模型,总体使用下来的感觉是没有场景文字检测那么靠谱,而且只支持英文字母与数字识别,不支持中文,不得不说是一个小小遗憾,但是对比较干净的文档图像,它的识别准确率还是相当的高,速度也比较快,基本上都在毫秒基本出结果。
OpenCV学堂
2019/06/21
3K1
OpenVINO场景文字检测与识别
OpenVINO中的图象修复模型与示例演示
在OpenVINO的公开模型库中有一个图象修复的模型的,它支持使用mask作为参考,实现对输入的修复。模型来自:
OpenCV学堂
2021/12/29
7540
OpenVINO中的图象修复模型与示例演示
用 OpenVINO 对图像进行分类
今天我们进行我们的第一个 Hello World 项目--用 OpenVINO 对图像进行分类。
IT蜗壳-Tango
2023/12/20
3290
用 OpenVINO 对图像进行分类
轻松学Pytorch – 人脸五点landmark提取网络训练与使用
大家好,本文是轻松学Pytorch系列文章第十篇,本文将介绍如何使用卷积神经网络实现参数回归预测,这个跟之前的分类预测最后softmax层稍有不同,本文将通过卷积神经网络实现一个回归网络预测人脸landmark,这里主要是预测最简单的五点坐标。
OpenCV学堂
2020/06/11
2.5K1
OpenCV + MediaPipe实现眼睛虹膜检测
MediaPipe的人脸landmark提供了468个点位的人脸点云数据,这些数据的编号图示如下:
OpenCV学堂
2021/11/25
2.7K0
OpenCV + MediaPipe实现眼睛虹膜检测
​行为分析:视觉跟踪技术在零售分析中的应用
在零售业中,了解顾客行为对于优化店铺布局、提升顾客体验和增加销售额至关重要。视觉跟踪技术,作为行为分析的一种手段,通过分析摄像头捕获的视频数据,提供了一种自动化和高效的解决方案。本文将深入探讨视觉跟踪技术的原理、在零售分析中的应用案例、面临的挑战以及未来的发展方向。
数字扫地僧
2024/05/07
2420
从Pytorch 的ONNX到OpenVINO中IR中间层
ONNX是一种深度学习权重模型的表示格式,ONNX格式可以让AI开发者在不同框架之间相互转换模型,实现调用上的通用性。当前PyTorch*, Caffe2*, Apache MXNet*, Microsoft Cognitive Toolkit* 、百度飞桨都支持ONNX格式。OpenVINO的模型优化器支持把ONNX格式的模型转换IR中间层文件。
OpenCV学堂
2020/08/11
3.7K0
从Pytorch 的ONNX到OpenVINO中IR中间层
YOLOv5x6模型来了! 同样支持CPU上ONNX部署与推理
说一下是YOLOv5的第五个版本,不是YOLO的第五个版本!是YOLOv5又又改进了!
3D视觉工坊
2021/07/01
2.6K0
YOLOv5x6模型来了! 同样支持CPU上ONNX部署与推理
相关推荐
系列 | OpenVINO使用之行人属性识别
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验