超详细资料!使用OpenVINO和OpenCV轻松创建深度学习应用

电子技术资源分享 2021-06-01 15:14

OpenVINO是英特尔推出的视觉推理加速工具包。2018 年 5 月 Intel 发布了 OpenVINO(Open Visual Inferencing and Neural Network Optimization, 开放视觉推理和神经网络优化)工具包,旨在为运行于 Intel 计算平台的基于神经网络的视觉推理任务提供高性能加速方案。


OpenVINO 提供了一整套在 Intel 计算设备上完成深度学习推理计算的解决方案,它支持 Intel CPU、 GPU、FPGA 和 Movidius 计算棒等多种设备。


下载 Intel OpenVINO 开发工具,送57套 Intel AIoT/人工智能资料以及300张京东卡>




OpenVINO 工具包的主要组件是 DLDT(Deep Learning Deployment Toolkit,深度学习部署工具包)。DLDT主要包括模型优化器(Model Optimizer)和推理引擎(Inference engine,IE)两部分。


模型优化器负责将各种格式的深度神经网络模型转换成统一的自定义格式,并在转换过程中进行模型优化;推理引擎接受经过模型优化器转换并优化的网络模型,为Intel的各种计算设备提供高性能的神经网络推理运算。


使用 DLDT 进行神经网络模型的部署,典型工作流程如图所示。


图片


1)训练一个DLDT 支持的深度学习框架网络模型(Train a Model) ;


2)使用模型优化器对网络模型进行编译和优化(Run Model Optimizer),生成Openvino IR(Intermediate Representation,中间表示)格式的网络配置文件(.xml 文件)和模型参数文件(.bin 文件);


3)调用 Inference Engine(即 Intel 推理引擎)进行网络运算,并将结果返回给 User Application(应用程序)。



OpenCV 3.4.1版本加入了英特尔推理引擎后端(英特尔推理引擎是OpenVINO中的一个组件),为英特尔平台的模型推理进行加速。


本文将以MobileNet-SSD模型为例,展示如何使用OpenCV和OpenVINO快速创建深度学习应用。


在深入代码之前,让我们了解一下OpenVINO工具包以及OpenCV是如何跟OpenVINO交互的。



OpenCV如何使用OpenVINO


OpenCV的推理引擎后端使用OpenVINO的推理引擎API完成推理任务。推理引擎后端有两种工作模式:模型优化器模式和构建器模式,如下图所示。


图片


模型优化器模式直接使用DLDT模型优化器编译后的OpenVINO格式(.xml和.bin)的网络模型进行推理计算,这种模式下,网络模型将被直接加载到推理引擎中,创建出一个推理引擎网络对象。而构建器模式则需要在DNN模块内部将网络模型逐层转换成内部表示,并通过推理引擎后端建立内部推理引擎网络。


相比构建器模式,模型优化器模式支持网络中所有的层,不需要逐层建立DNN网络,而是直接加载OpenVINO模型到推理引擎,能够减少在网络加载和运算推理过程中报错的情况。


了解了OpenCV 和 OpenVINO 相关内容之后,接下来详细讲解如何基于OpenCV和OpenVINO构建深度学习应用。


基于OpenCV和OpenVINO创建深度学习应用


第一步:安装OpenVINO


这里我们以 Ubuntu 18.04 上安装 OpenVINO 为例。从官网注册并下载OpenVINO开发包的Linux版本,


官网下载地址:

https://software.intel.com/content/www/us/en/develop/tools/openvino-toolkit/choose-download/linux.html


如果下载顺利,你将得到文件名为 l_openvino_toolkit_p_< 版本号>.tgz 的压缩包,为了兼容更多的网络模型,我们选择安装目前最新的OpenVINO版本(OpenVINO-2020.3.194)。


OpenVINO开发包中包含了相应版本的OpenCV,安装OpenVINO时会默认安装OpenCV,因此无需额外安装OpenCV


1. 解压并安装 OpenVINO 开发包核心组件

$ tar -xvzf l_openvino_toolkit_p_2020.3.194.tgz$ cd l_openvino_toolkit_p_2020.3.194

运行图形化安装命令:

$ sudo ./install_GUI.sh

然后一路选择“Next”安装默认组件即可。如果一切顺利,安装文件将位于/opt/intel/openvino_2020.3.194/,同时会生成一个符号链接/opt/intel/openvino 指向最新的安装目录。至此,OpenVINO 核心组件安装完成,接下来安装依赖包。


2. 安装依赖包


使用 OpenVINO 写一个完整的视觉类应用,除了 OpenVINO 本身之外,还需要安装一些依赖包,包括但不限于 FFMpeg视频框架、CMake 编译工具、libusb(Movidius 神经计算棒 插件需要用到)等,安装步骤如下:

$ cd /opt/intel/openvino/install_dependencies

运行以下命令安装必要的依赖包:

$ sudo -E ./install_openvino_dependencies.sh

设置环境变量:

$ source /opt/intel/openvino/bin/setupvars.sh

建议将以上环境变量设置命令加入到用户的环境脚本当中,方法如下:

$ vi <用户目录>/.bashrc

在其中加入以内容:

$ source /opt/intel/openvino/bin/setupvars.sh

按 Esc 键,然后输入“:wq”保存并退出。接下来配置模型优化器,依次运行以下命令:

$ cd /opt/intel/openvino/deployment_tools/model_optimizer/install_prerequisites$ sudo ./install_prerequisites.sh

上面这条命令会安装所有的深度学习框架的支持,如果只希望安装某一个框架的支持,以安装Caffe 框架支持为例,可以这么做:

$ sudo ./install_prerequisites_caffe.sh

至此,安装工作结束,下面验证安装好的 OpenVINO 环境是否可以工作。


3. 验证 OpenVINO 环境


进入推理引擎示例程序目录:

$ cd /opt/intel/openvino/deployment_tools/demo

运行图片分类示例程序的验证脚本:

$ ./demo_squeezenet_download_convert_run.sh

如果一切顺利,输出结果将如图所示。


图片


确保 OpenVINO 安装成功后,重新启动电脑:

$ reboot

检查OpenCV版本:

$ python> import cv2 as cv> print(cv.__version__)

如果安装成功,可以看到如下输出:

4.3.0-openvino-2020.3.0


第二步:模型准备


首先下载MobileNet-SSD的caffe模型:


• 模型参数文件MoblieNetSSD_deploy.caffemodel下载地址:https://drive.google.com/open?id=0B3gersZ2cHIxRm5PMWRoTkdHdHc


• 网络结构文件MoblieNetSSD_deploy.prototxt下载地址:https://raw.githubusercontent.com/chuanqi305/MobileNet-SSD/daef68a6c2f5fbb8c88404266aa28180646d17e0/MobileNetSSD_deploy.prototxt


模型下载好后,将caffe模型转换成OpenVINO格式:


1. 进入OpenVINO安装目录下的模型优化器目录:

cd/deployment_tools/model_optimizer

2. 使用OpenVINO模型优化器脚本mo.py将caffe模型转换成OpenVINO格式的模型:

python3 mo.py --input_model/MobileNetSSD_deploy.caffemodel --input_proto/MobileNetSSD_deploy.prototxt -o


通过input_model和input_proto 两个参数指明模型的参数和结构,并指定转换后网络的存储路径。


通过这一步,我们可以得到OpenVINO格式的MobileNet-SSD网络模型,包括MobileNetSSD_deploy.xml文件和MobileNetSSD_deploy.bin 文件。


第三步:使用OpenVINO模型进行目标检测


接下来开始进入我们的最后一步,使用转换好的OpenVINO格式的MobileNet-SSD模型进行实时目标检测。下面是整个目标检测过程的流程图。


流程图


图片


程序代码


为方便起见,我们采用Python语言来创建应用。首先导入必要的Python库,包括numpy、argparse和cv2(OpenCV)。


# 导入必要的库import numpy as npimport argparseimport cv2

接下来使用argparse对命令行输入参数进行解析。


# 组建参数parseparser = argparse.ArgumentParser( description='Script to run MobileNet-SSD object detection network ')parser.add_argument("--video", help="path to video file. If empty, camera's stream will be used")parser.add_argument("--model", type=str, default="MobileNetSSD_deploy", help="path to trained model")parser.add_argument("--thr", default=0.2, type=float, help="confidence threshold to filter out weak detections")args = parser.parse_args()


程序执行命令行只需输入下列 3 个参数。

• video:图片或视频路径,不设置则从摄像头读取数据。

• model:训练好的模型路径。

• thr:分类阈值。


定义一个变量classNames,存储分类标签。注意,我们下载的模型是基于20分类数据集训练出来的,因此这里的类别标签有20个(加上背景是21个)。也有针对90分类数据集训练的模型,此处需要使用相对应的标签定义。


# 类别标签变量.classNames = { 0: 'background', 1: 'aeroplane', 2: 'bicycle', 3: 'bird', 4: 'boat', 5: 'bottle', 6: 'bus', 7: 'car', 8: 'cat', 9: 'chair', 10: 'cow', 11: 'diningtable', 12: 'dog', 13: 'horse', 14: 'motorbike', 15: 'person', 16: 'pottedplant', 17: 'sheep', 18: 'sofa', 19: 'train', 20: 'tvmonitor' }


定义模型输入大小,MobileNet-SSD接受的输入图片大小为300*300


input_size = (300, 300)

接下来通过cv2.dnn.Net_readFromModelOptimizer()函数读取转换好的OpenVINO模型文件,初始化网络对象 net,并设置加速后端:


# 加载模型 net = cv2.dnn.Net_readFromModelOptimizer(args.model+".xml", args.model+".bin")# 设置推理引擎后端net.setPreferableBackend(cv2.dnn.DNN_BACKEND_INFERENCE_ENGINE)

注意,这里cv2.dnn.DNN_BACKEND_INFERENCE_ENGINE指明使用的是推理引擎后端。

# 设置运算设备net.setPreferableTarget(cv2.dnn.DNN_TARGET_CPU)

推理引擎后端支持多种类型的运算设备,这里指定使用CPU作为运算设备。如果平台有英特尔集成显卡,也可以设置成cv2.dnn.DNN_TARGET_OPENCL,使用GPU来进行加速。

下一步设置图像输入设备,根据参数video选择可用输入设备或者输入路径:

# 打开视频文件或摄像头 if args.video: cap = cv2.VideoCapture(args.video)else: cap = cv2.VideoCapture(0)

现在进入程序关键步骤,开始循环处理输入设备读到的帧图像,将读取到的图像转换成网络输入:


while True: # 读取一帧图像 ret, frame = cap.read() # 将图片转换成模型输入 blob = cv2.dnn.blobFromImage(frame, 0.007843, input_size, (127.5, 127.5, 127.5), False)

这一步参数比较多,也比较重要,做一下重点讲解:


1)frame是输入图像,0.007843是缩放因子,

2)input_size是模型所接受的输入大小,(127.5, 127.5, 127.5)是图像均值,它结合前面的缩放因子,在函数内部对输入图像做正规化处理。

3)False表示不进行R和B通道置换。当模型接受的通道顺序和图像均值的通道顺序不一致时,swapRB 需要设置成 true。


接下来是设置网络输入和运行网络推理:

# 转换后的待输入对象blob设置为网络输入 net.setInput(blob) # 开始进行网络推理运算 detections = net.forward()

然后是结果解析。


MobileNet-SSD 模型的检测结果detections是一个4维数组,数组的4个维度大小分别是[1,1,N,7]。

N表示检测出的对象数目,7表示每个对象用一个含有7个元素的数组描述,7个元素分别代表图片id、类型id、置信度、对象框左上角x坐标,对象框左下角y坐标、对象框右下角x坐标、对象框右下角y坐标,接下来根据这个4维数组绘制运行结果。


首先获取图像大小,根据再通过遍历所有检测出的对象,通过参数thr筛除部分置信度较低的对象:

 # 获取输入图像尺寸(300x300)cols = input_size[1]rows = input_size[0] for i in range(detections.shape[2]): confidence = detections[0, 0, i, 2] # 目标对象置信度  if confidence > args.thr: # Filter prediction class_id = int(detections[0, 0, i, 1]) # 目标对象类别标签

获取被检测对象框的顶点坐标和图像的缩放比,并获取实际目标对象框的坐标:

# 目标位置xLeftBottom = int(detections[0, 0, i, 3] * cols)yLeftBottom = int(detections[0, 0, i, 4] * rows)xRightTop = int(detections[0, 0, i, 5] * cols)yRightTop = int(detections[0, 0, i, 6] * rows)# 变换尺度heightFactor = frame.shape[0]/300.0 widthFactor = frame.shape[1]/300.0# 获取目标实际坐标xLeftBottom = int(widthFactor * xLeftBottom)yLeftBottom = int(heightFactor * yLeftBottom)xRightTop = int(widthFactor * xRightTop)yRightTop = int(heightFactor * yRightTop)

最后将检测结果绘制到原始图像上:

 # 框出目标对象cv2.rectangle(frame, (xLeftBottom, yLeftBottom), (xRightTop, yRightTop), (0, 255, 0))# 标记标签和置信度if class_id in classNames: label = classNames[class_id] + ": " + str(confidence) labelSize, baseLine = cv2.getTextSize(label, cv2.FONT_HERSHEY_SIMPLEX, 0.5, 1)  yLeftBottom = max(yLeftBottom, labelSize[1]) cv2.rectangle(frame, (xLeftBottom, yLeftBottom - labelSize[1]), (xLeftBottom + labelSize[0], yLeftBottom + baseLine), (255, 255, 255), cv2.FILLED) cv2.putText(frame, label, (xLeftBottom, yLeftBottom), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 0)) print(label) # 输出类别和置信度cv2.namedWindow("frame", cv2.WINDOW_NORMAL) cv2.imshow("frame", frame)key = cv2.waitKey(1) & 0xFFif key == ord("q"): # 按下q键退出程序 breakif key == ord("s"): # 按下s键保存检测图像 cv2.imwrite('detection.jpg', frame)

至此,整个目标检测应用的代码就完成了,接下来输入以下命令运行目标检测程序:

$ python mobilenet_ssd_python.py

这里我们使用的默认参数,通过摄像头直接采集图像,默认模型采用我们转换好的MobileNetSSD_deploy(.xml/.bin)文件,阈值设为0.2。


这时候我们可以看到终端中将输出检测到的目标置信度,同时在视频图像中框处检测到的目标,左上角为目标分类结果和分类置信度。


终端中的检测结果输出:

chair: 0.9978288chair: 0.29011992person: 0.9536861tvmonitor: 0.6713625tvmonitor: 0.26635352...

实际检测图像如下:


图片


参考资料

[1]  Ubuntu 安装OpenVINO : https://docs.openvinotoolkit.org/latest/_docs_install_guides_installing_openvino_linux.html

[2] 《OpenCV深度学习应用与性能优化实践》


作者: 吴至文 ,我爱计算机视觉 

评论 (0)
  • 医疗影像设备(如CT、MRI、超声诊断仪等)对PCB的精度、可靠性和信号完整性要求极高。这类设备需要处理微伏级信号、高频数据传输,同时需通过严格的EMC/EMI测试。制造此类PCB需从材料选择、层叠设计、工艺控制等多维度优化。以下是关键技术与经验分享。 1. 材料选择:高频与生物兼容性优先医疗影像设备PCB常采用 Rogers RO4000系列 或 Isola FR4高速材料,以降低介电损耗并保证信号稳定性。例如,捷多邦在客户案例中曾为某超声探头厂商推荐 Rogers RO4350B
    捷多邦 2025-04-07 10:22 64浏览
  • 引言:POPO声的成因与影响在语音芯片应用中,WT588F08A作为一款支持DAC+功放输出的高集成方案,常因电路设计或信号处理不当,在音频播放结束后出现POPO声(瞬态噪声)。这种噪声不仅影响用户体验,还可能暴露电路设计缺陷。本文将基于实际案例,解析POPO声的成因并提供系统化的解决方案。一、POPO声的根源分析1. 功放电路状态切换的瞬态冲击当DAC输出的音频信号突然停止时,功放芯片的输入端若处于高阻态或无信号状态,其内部放大电路会因电源电压突变产生瞬态电流,通过喇叭表现为POPO声。关键因
    广州唯创电子 2025-04-07 09:01 72浏览
  • 伴随无线技术的迅速发展,无线路由器市场商机日益庞大。现代消费者在选购无线路由器(Wi-Fi AP)时,通常依赖的是该产品在无干扰的实验室环境中,量测得到的数据报告。然而,这些数据往往是在受控的RF隔离环境中进行测试,无法完全反映真实使用场景。这种情况导致许多消费者抱怨,他们购买的产品效能与宣称的数据不符。在实际应用中,消费者常因Wi-Fi讯号不稳定、传输速度不如预期或设备过热而产生客诉。产品仰赖实验室的数据够吗?无线路由器(Wi-Fi AP)ODM供货商遇到什么挑战?一家台湾知名的无线路由器(W
    百佳泰测试实验室 2025-04-05 00:12 44浏览
  • 文/杜杰编辑/cc孙聪颖‍2025年的3月,成功挺过造车至暗时刻的小米创始人雷军,接连迎来人生的高光。(详情见:雷军熬过黑夜,寄望小米SU7成为及时雨)在颜值即正义的舆论导向之下,全国两会期间,雷军凭借得体的衣着、挺拔的身姿赢得赞誉。面对雷军的压人表现,连行事一向沉稳、不愿跟风的海尔,都推出“leadership”组合拳,试图助力自家boss,不落下风。(详情见:两会声音|本届全国两会,周云杰为海尔省了多少广告费?)喜事接连不断,紧接着的3月18日,雷军重磅宣布小米 “史上最强年报”。雷军的公关
    华尔街科技眼 2025-04-03 20:30 39浏览
  •   安全生产预警系统作为现代工业与安全管理的重要组成部分,正以前所未有的技术引领力,创新性地塑造着未来的安全管理模式。这一系统通过集成多种先进技术,如物联网、大数据、人工智能、云计算等,实现了对生产环境中潜在危险因素的实时监测、智能分析与及时预警,为企业的安全生产提供了坚实的技术保障。   技术引领:   物联网技术:物联网技术使得各类安全监测设备能够互联互通,形成一张覆盖全生产区域的安全感知网络。传感器、摄像头等终端设备实时采集温度、压力、气体浓度、人员位置等关键数据,为预警系统提供丰富的
    北京华盛恒辉软件开发 2025-04-05 22:18 49浏览
  • 在追求环境质量升级与产业效能突破的当下,温湿度控制正成为横跨多个行业领域的核心命题。作为环境参数中的关键指标,温湿度的精准调控不仅承载着人们对舒适人居环境的期待,更深度关联着工业生产、科研实验及仓储物流等场景的运营效率与安全标准。从应用场景上看,智能家居领域要求温湿度系统实现与人体节律的协同调节,半导体洁净车间要求控制温湿度范围及其波动以保障良品率,而现代化仓储物流体系则依赖温湿度的实时监测预防各种产品的腐损与锈化。温湿度传感器作为实现温湿度监测的关键元器件,其重要性正在各行各业中凸显而出。温湿
    华普微HOPERF 2025-04-07 10:05 65浏览
  • 引言:小型化趋势下的语音芯片需求随着消费电子、物联网及便携式设备的快速发展,产品设计对芯片的小型化、高集成度和低功耗提出了更高要求。厂家凭借其创新的QFN封装技术,推出WTV系列(如WTV380)及WT2003H系列语音芯片,以超小体积、高性能和成本优势,为紧凑型设备提供理想解决方案。产品核心亮点1. QFN封装技术赋能超小体积极致尺寸:WTV380采用QFN32封装,尺寸仅4×4毫米,WT2003H系列同样基于QFN工艺,可满足智能穿戴、微型传感器等对空间严苛的场景需求。高密度集成:QFN封装
    广州唯创电子 2025-04-07 08:47 57浏览
  • 及时生产 JIT(Just In Time)的起源JIT 起源于 20 世纪 70 年代爆发的全球石油危机和由此引发的自然资源短缺,这对仰赖进口原物料发展经济的日本冲击最大。当时日本的生产企业为了增强竞争力、提高产品利润,在原物料成本难以降低的情况下,只能从生产和流通过程中寻找利润源,降低库存、库存和运输等方面的生产性费用。根据这种思想,日本丰田汽车公司创立的一种具有特色的现代化生产方式,即 JIT,并由此取得了意想不到的成果。由于它不断地用于汽车生产,随后被越来越多的许多行业和企业所采用,为日
    优思学院 2025-04-07 11:56 77浏览
  • 一、为什么流量可见性如此重要?在网络管理中,及时掌握流量状况至关重要,这不仅有助于快速排查故障、优化性能,还能提升安全防护能力。为了实现这一目标,企业通常依赖 SPAN 端口(交换机端口镜像)或 网络 TAP(测试接入点)来捕获和分析流量。然而,这两种方法在数据完整性、性能影响和监控能力上存在显著差异。如何选择合适的方案,以确保网络监控的精准性和高效性?本文将深入解析 SPAN 端口与网络 TAP 的核心区别,帮助你做出明智决策。二、SPAN 端口:简单易用,但有局限SPAN 端口也称为镜像端口
    艾体宝IT 2025-04-03 16:41 36浏览
  • 【拆解】+南孚测电器拆解 之前在天猫上买了一盒南孚电池,他给我送了一个小东西—测电器。今天我们就来拆解一下这个小东西,看看它是怎么设计和工作的。 三颗指示灯显示电池剩余电量。当点亮3颗LED时,则表示点亮充足。当点亮2颗LED时,则表示还能用。当点亮1颗LED时,表示点亮地建议更换,当无法点亮LED时,则表示没电了。外壳上还印有正负极,以免用户将电池放反。 这个小东西拆解也很方便,一个螺丝刀稍微撬几下。外壳就下来了,它是通过卡扣连接。 开盖后,测电线路板清晰呈现在眼前。 让我们看看小小的线路板有
    zhusx123 2025-04-05 15:41 47浏览
  • 在科技浪潮奔涌的当下,云计算领域的竞争可谓是如火如荼。百度智能云作为其中的重要参与者,近年来成绩斐然。2024年,百度智能云在第四季度营收同比增长26%,这样的增速在行业内十分惹眼。回顾全年,智能云业务的强劲增长势头也十分明显,2024年第一季度,其收入达到47亿元,同比增长12%;第二季度营收51亿元,同比增长14%。从数据来看,百度智能云在营收方面一路高歌猛进,展现出强大的发展潜力。然而,市场对百度智能云的表现似乎并不完全买账。2024年,尽管百度智能云数据亮眼,但百度股价却在震荡中下行。在
    用户1742991715177 2025-04-06 20:25 61浏览
  • 【拆解】+沈月同款CCD相机SONY DSC-P8拆解 这个清明假期,闲来无事,给大伙带来一个老古董物品的拆解--索尼SONY DSC-P8 CCD相机。这个产品是老婆好几年前在海鲜市场淘来的,由于显示屏老化,无法正常显示界面了,只有显示背光。但是这也无法阻止爱人的拍照。一顿盲操作依旧可以拍出CCD古董相机的质感。如下实拍: 由于这个相机目前都在吃灰。我就拿过来拆解,看看里面都是怎样个设计,满足下电子爱好者的探索。 首先给大伙展示下这台老相机的全貌。正视图  后视图 
    zhusx123 2025-04-06 17:38 78浏览
  • 在影像软的发展历程中,美图曾凭借着美图秀秀等一系列产品,在“颜值经济”的赛道上占据了领先地位,成为了人们日常生活中不可或缺的一部分,也曾在资本市场上风光无限,2016 年上市时,市值一度超过46亿美元,备受瞩目。 然而,随着市场的不断发展和竞争的日益激烈,美图逐渐陷入了困境。商业模式单一,过度依赖在线广告收入,使得其在市场波动面前显得脆弱不堪;多元化尝试,涉足手机、电商、短视频、医美等多个领域,但大多以失败告终,不仅未能带来新的增长点,反而消耗了大量的资源。更为严峻的是,用户流失问题日
    用户1742991715177 2025-04-05 22:24 61浏览
我要评论
0
3
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦