OpenVINO(Open visual inference and neural network optimization),开放视觉推理和神经网络优化工具集。
滑雪板的边缘像素值从200降到60,这种急剧的变化可以表示为滑雪板的边缘。
我们将每个像素的值替换为周围8个像素的平均值。如果我们对图像中的每一个像素执行相同的操作。意味着我们正在对图像进行平滑处理。我们把这种操作方法称之为“模糊”
如果我们不取像素的平均值或者进行平滑处理,而是反向扩大每个像素点与它周围8个像素点的差异。这种叫做“锐化”,让边缘过渡变得更陡峭
OpenVINO可以轻松的在英特尔硬件上加速
有4条腿或者4条平行线,外加尾巴等特征的对象。
这就是我们的小猫检测器,我们要构建一个特征检测器,检测对象是否有4条腿,是否有尾巴,以及相应的颜色、相应的大小等等。
我们需要将所有输入特征放到一个函数中,如何组合是正确的,那么我们就找到一只猫,通常我们会获取一张输入图片,提取特征值,每个特征值乘以一个权重,特征1乘以权重w1,特征2乘以权重w2,以此类推,这些相乘的结果如果是1,表示它是猫。如果是0,表示它不是猫。
我们取一张猫的图片,进行特征乘法运算,这也是一只猫,但颜色完全不同,所以我们需要适当调整颜色特征的权重w3。以便之前和这只黑猫都被检测为猫。
这个桌子也有4条腿,因此需要更改权重值w1
这只老鼠也有一个尾巴,所以要对应更改尾巴特征对应权重值w2
如果我们想检测出所有的猫,而不是检测老鼠、桌子或其他对象,就需要一个更复杂的函数,并且这个函数与特征之间同时也需要一些非线性关系,因此我们构建一个更复杂的函数。
我们可以拿一个各种猫的数据集,我们要对每个数据执行“前向”操作,通常这意味着我们要将图像与网络“相乘”,或者应用由神经网络构成的函数,看看答案是否真的一只猫,是否存在误差,然后我们倒回去,并更改神经网络的权重,将结果错误率降到最低。不断重复这个过程,可以将错误率降到最低-----我们向神经网络输入大量图像,改进权重、降低错误率,以获得一个具有特定权重的神经网络,这一流程称为“训练”。向神经网络输入一张新的“猫”图像,并得到答案的过程,称为“推理”。
深度学习中的分类模型可以告诉我们图像包含特定对象的概率。
分割模型可以对图像中的每个像素进行分类,并告诉我们它是否为特定对象。它是一个目标对象,所有的像素都是橙色,而球员的像素都是蓝色
ResNet50是一种用于分类的常见神经网络,当以32位浮点数表示时,它的权重可高达168MB,同时运算量也非常大,高达70亿次浮点运算。很明显它需要占用大量的内存,而且需要计算机有强大的计算能力,英特尔提供了可高效执行神经网络的各种硬件平台。
OpenVINO优化AI推理开始于一个训练完成的模型,因此我们使用一个训练好的模型,我们可以处理来自多种深度学习框架的模型,如Pytorch、paddlepaddle、TensorFlow、Caffe、MXNET或ONNX格式。
如果你使用Pytorch的话,可以通过Python API将读取的Torch模型使用convert model函数转为OV model数据结构并存在内存中。这样当你需要使用OpenVINO进行推理加速的时候,直接读取这个OV model数据结构就可以直接进行推理加速。剩下的推理框架训练出来的模型,可以通过Python API的方式得到OV model数据结构,这个结构可以save model保存为IR文件。
第二条路也可以通过OVC将预训练模型先转为中间表示。Intermediate Representation简称为IR,包含了XML和BIN两个文件。OVC是一个命令行模型转换器,它结合了convert model和save model两个函数,得到的是同样的IR文件,之后这个IR文件可以用来进行推理加速。OpenVINO也支持低精度推理,成功转为IR文件的模型可以通过NNCF工具将精度校准至int 8精度或者更低精度。使用低精度模型可以有效缩短推理时间,所以对于部署来说十分重要。之后OpenVINO RunTime将读取这些IR文件,他其实就是我们之前所使用的推理引擎
OpenVINO Runtime引擎
推理引擎使用不同的低层运算库来实现神经网络的运算并且在英特尔的各种设备上执行计算,以插件的架构可以灵活的调用不同设备,也可以非常方便的组合调用硬件或者是绑定硬件。
现在让我们来看看经过OpenVINO优化之后的推理性能数据,例如运行公开模型Resnet50时,在原生Caffe和Tensorflow框架下的模型可以在apollo-Lake的凌动设备上每秒运行两次推理.而在OpenVINO加持后,便可以提供5倍于原生框架的每秒推理数。在I7级别的Coffee-Lake CPU上,
OpenVINO Runtime可提供每秒134ci推理。
视频的概念
每秒25帧 --- 每秒切换25张图片,所以画面连贯自然
一分钟我们需要超过90亿字节(即9GB)的存储空间。
我们可以知道摄像头传输视频与下载视频文件不同,摄像头会不断提供视频流,如果想要实时传输庞大的数据量,唯一办法就是压缩视频数据。
压缩本质上就是用较少的比特来呈现大量数据的同时,尽量不丢失太多信息。视频上有很多冗余
什么是冗余呢?
第一种是空间冗余,天空中相同的矩形位置所有像素都是几乎相同的颜色,所以我们不需要存储这几张图片中该矩形位置的所有像素,只需要存储矩形中所有像素的颜色平均值。在显示的时候,我们把这个颜色应用于整个矩形中的每一个像素。
另一种是时间冗余,他们在屏幕中的位置不断变化,但依然是相同的,因此基本上不需要重复存储这些像素。当然一些帧包含独特且关键的新信息,所以我们需要储存这一帧的所有像素,这些帧称为I帧。在I帧之间我们可以只记录两帧之间的差异。差异的称为P帧。它们包含了如何从之前的I 帧生成此帧的方法。P帧的数据通常只有I帧的一半。这意味为了生成P帧,我们需要记住上一个I帧,并对该帧进行必要的更改。在I帧与P帧之间是B帧,B帧是帧与帧之间的插值,数据只有I帧的四分之一,也就是它们之间的变化可以自动生成
编解码器规则
最常用的是h.264或称为AVC,另一个是h.265或称为HEVC。通常需要3倍的资源进行编码,例如,我们通常所说的视频文件实际上是一个能够容纳许多其他文件的“容器”。.mp4文件实际上是一个容器文件,它保存待显示的视频流,如h.264,它还可以保存待播放的音频,例如编码的mp3还有元数据,它可以保存比特率、分辨率等各种信息,其中最重要的信息当然是这个视频文件使用的编解码器,为了能够解码和编码视频,我们需要将海量数据存储在大型缓冲器中,并每一帧进行处理,我们还需要对两帧进行对比。英特尔核芯显卡包含两大硬件模块EU和快速视频同步技术,EU(执行单元)可视为微型处理器,用于处理3D图形渲染等任务,快速视频同步技术本身的固定功能已经包括了加速视频处理、解码、编码等,下面表格展示了GPU预期的性能。
使用英特尔核芯显卡的快速视频同步技术可帮助你同时解码超过20个高清1080p H264视频流。
或者同时编码大约12个视频流,为了节省编解码花费的时间,集成GPU可以在睿频模式下运行。再比如英特尔的酷睿coffee-Lake集成GPU,可以同时解码多达31个视频流或者16个视频流,具体的性能数据根据你的实际系统而有所不同还与视频的复杂程度因素相关
下面我们谈谈基于集成显卡的软件堆栈,通常而言,驱动程序会在GPU固件的上层,而在驱动程序之上我们有VAAPI,它是一个开源软件库,它为上层应用提供图像处理硬件加速功能的接口,LibVA算是VAAPI的一个实现方式,我们使用OneVPL调用集成显卡进行视频解码、编码和视频处理。OpenVPL是之前Media-SDK的继承者,在包含原有功能的前提下,新增了一些对h265进行处理的API,而且简化了许多函数,优化了内存调用策略以及任务分布机制,也增加了Python API的支持,它同样位于VAAPI的上层,它是英特尔免费提供的一款软件,它可帮助你跨多个平台编程,在多个操作系统上轻松完成编解码工作。对于开发者来说,针对Tiger-Lake之后的GPU都可以使用OneVPL进行应用程序开发。你还可以很方便地通过FFmpeg或G-streamer轻松访问OneVPL的Codec。如果你使用OpenCV的话,也可以通过G-API调用OneVPL的实现。
我们之前介绍了如何处理图像以提高图像锐度,锐度增加直至看到图像中各种对象的边缘,获得边缘之后,我们可以观察特定像素的排列,并检测到图像中包含角、线、圆等图案,我们把这些图像称为图像的“特征”。
OpenVINO的演示
你无需编写代码,只需要运行一些脚本。
就可以轻松运行这些演示,我们使用的所有模型以及示例代码,都在OpenVIVO toolkit的open_model_zoo
让我们来运行这个目标检测demo
python3 object_detection_demo.py -i '/home/abc/open_model_zoo/demos/object_detection_demo/python/cars.mp4' -m '/home/abc/open_model_zoo/demos/object_detection_demo/intel/vehicle-detection-0202/FP32/vehicle-detection-0202.xml' -at ssd -d CPU
该演示通过“i”参数输入一个需要检测视频的地址,“m“参数需要输入模型优化器转换成功的模型地址,通过model downloader(模型下载器)可以下载预训练模型来使用,”d“选择的AI推理设备是CPU
这里我们使用Open Model Zoo提供预训练好的模型
检测框上的数值是置信度
第二个演示(行人检测追踪)
这个案例用的是英特尔的Arc770独立显卡。
第三个演示(多通道检测行人)
”i“指定4个视频流
”m detect“对应的是一个行人检测模型,它是一个面向零售应用的检测模型
”m reid“是用于识别同一行人的模型
第四个案例(分割)
可以看到
调用OpenVINO进行AI推理加速十分方便
如何使用英特尔的R工具实现从数据采集到AI产品的诞生?
1、首先需要做的是获得一个深度学习模型。我们可以通过多种方法来实现。第一种方法是:去到OpenVINO toolkit提供的Open Model Zoo寻找你需要的预训练模型。当你安装好OpenVINO之后,我们也提供一个Model Downloader的应用程序,可以快速帮你在Open Model Zoo里面下载你需要的模型。
比如我想要下载一个名叫SqueezeNet的模型,只要赋予”name“参数相应的模型名称,便可以下载模型了。
如果你不清楚是吗模型可以下载,可以给这个应用增加”print all“参数。可以看到所有可下载的模型。
像这个带有四个数字后缀的,就是英特尔预训练模型。下载这些模型得到的就是已经转换好的IR文件,分别是XML和BIN文件,包括了FP32和更低的精度,这样的模型文件是可以直接给OpenVINO Runtime进行推理的
而之前那个下载的SqueezeNet是第三方模型,所以下载下来的文件是原始框架下的caffe模型文件,要用OpenVINO的模型优化器转换为IR文件才能给Runtime进行推理。
当然你可以给下载器使用” --help“参数,获得下载器的所有参数指南。
获取模型第二种方式是从零开始训练模型,这通常需要大量的计算资源,一般在GPU集群中进行训练,也需要花费很长的时间。在训练模型的第一步是收集数据,数据必须尽可能地接近你最终想要推理地数据,这意味着最佳选择是从相同的摄像头收集图像或视频,因为摄像头角度、对象距离、照明条件等,有时会对收集的数据造成重大影响。在你收集了正确的数据后,很多时候需要使用计算机视觉技术来清洗数据,分离或裁剪你尝试检测的相关对象。
例如如果我们正在训练一款用于LPR - 车牌识别的模型,我们需要裁剪出车辆图片,然后裁剪出车牌图片,有时还要使用图像处理技术来清洗或锐化图像等等,下一步是对图像进行标注。当我们从训练集中得到了一个新图像,并尝试对其进行训练,我们为训练程序提供了这个新图像的结果答案,这样我们可以计算在训练过程中出现的错误,然后反向调整模型参数,正因为我们提供了模型训练的答案,所以这样的训练方式被称为”监督式学习“。
有一款非常实用的软件产品是名叫Computer Vision Annotation Tool --- CVAT,它是OpenCV的组件之一,是它是一款开源并且非常易于使用的图片标注工具,而且它可以输出各种格式的数据集文件,CVAT是一款基于web的交互式软件,它的用户界面非常简洁。你可以为用于检测、分类和分割的模型,进行多种方式和形式的标注。它提供了一个跨帧连续跟踪标注功能,它可以帮你节省大量时间。同时你还可以联合OpenVINO进行自动标注,仅根据需要进行细微调整,接下来是将这些标注好的图像喂给神经网络进行训练。但是训练确实也是一门很大的学问,图中给大家展示了许多管理与训练数据会用到工具。
OpenVINO的核心就是我们可以用训练好的模型,更快地进行推理,回归在模型准备这步,我们的目的是获得一个训练好的模型就可以了。如果你想获得训练好的深度学习模型,最简单的方法可能就是从我们的Open Model Zoo中下载。OMZ拥有面向检测、识别、分类和分割、语音识别、文本识别等超过80种模型。如果你想构建安防应用、零售、或文本相关应用。OMZ针对零售摄像头或安防摄像头等等提供了不同的模型,这些模型并非学术性模型。它们针对推理而优化,你可以下载并立即使用它们,许多OMZ中的模型都包含了原始训练格式,包括支持你使用自己的数据集对其进行重新训练的所有数据。当使用特定数据集进行训练时,我们发现准确性和性能显著提升。提升的程度取决于模型,training extensions是openvino工具集的一个部分,它是一种用于计算机视觉的低代码迁移学习框架,该CLI命令允许用户轻松快速地训练、推断、优化和部署模型。OpenVINO Traning Extensions提供了基于PyTorch和OpenVINO的模型体系结构、学习方法和任务类型的多种组合工具包,OpenVINO Training Extensions为每种受支持的任务类型,提供了一个”模型模板“,它整合了构建模型所需的信息,模型模板在各种数据集上进行验证,并为获得最佳模型提供一站式服务。因此你可以复制整个训练项目,下载模型,你可以使用你自己的数据集,从零开始或从我们提供的检查点继续运行训练。
下一个阶段是为推理准备模型,我们的”模型优化器“可以转换多种类型的模型,因此无论你是在TF、Torch、Paddle-Paddle、Caffe还是其他框架中训练模型都不重要,我们可以将各种模型转换成中间表示,也就是IR文件,然后推理引擎执行IR文件的推理工作,我们还可以转换ONNX的模型,因此pytorch、Caffe2、CNTK甚至Matlab训练出来的模型都可以,通过先转换成ONNX格式再使用模型优化器,转换为IR来使用OPENVINO,模型优化器可以转换模型,将其映射到正确的库函数或内核,它可以使用水平或垂直融合、batch normalization等各种技术优化模型,它还可以添加或删除一个或多个层,添加归一化、缩放、调整输入大小尺寸等操作,最终得到一个优化过的精简模型,我们还提供将IR模型校准为INT8的量化流程,使用低精度的模型进行推理,可以大大提升边缘设备的推理速度,如果你需要,还可以开发自定义层,现在我们得到了一个可运行推理的模型,这里有两个文件分别是xml文件和bin文件。我们想要对其进行基准性能测试,
为此,我们提供了一款简单的基准性能测试实用程序。只需要输入你的模型,我们将在任何支持的设备上运行模型,如果不进行设备选择,程序会默认选择CPU进行测试。
最后会在屏幕上打印出延迟、吞吐量和其他参数数据,然后我手动选择在GPU上测试我的模型
加入-d。
独立显卡的性能会好很多。
你也可以使用模型优化器中其他优化参数,对各种数据格式的模型进行性能测试,最终选择能够满足你性能要求的平台。了解更多优化参数介绍可以添加” -help “参数进行查看。开发者一般来说可能并不能拥有所有的硬件目标平台,也没有打算购买所有硬件进行测试。所以,英特尔推出了developer Cloud,你可以将它想象成一个大型云测试平台,里面拥有的硬件包含从凌动、酷睿到至强处理器以及各种各样的英特尔加速卡,测试环境已经都搭建好了,你可以随时上传自己的模型或者网上下载开源模型进行性能测试。你只需通过自己电脑的网页端远程连接到developer Cloud不同的硬件设备节点上,你就可以在目标英特尔硬件上运行你的设计好的工作负载。执行性能测试最后比较结果,当然developer Cloud上也有些notebook示例帮助你学习OpenVINO的使用以及Cloud平台的使用。
如果你需要对网络进行深层调试,OpenVINO API中内置了性能计数器。因此你可以运行benchmark工具,并添加”-pc“ 参数以启动性能计数器。
这样可以打印出每一次推理的详细数据,在某一次推理中每一层的统计数据,可以看到每一层的执行精度,每层运算消耗的时间,可以看到这里卷积层消耗了大量的运算时间。你也可以根据这些数据定位模型热点,针对热点层进行模型性能优化加速。
DL Workbench是一款web应用,为深度学习模型的性能分析和调试提供了直观的图形界面,你可以插入你的数据集,加载模型,使用多个参数进行性能测试,然后比较结果,使用 DL Workbench无需你编写代码,所有工作都在浏览器中完成。它还可以将模型的数据类型转换为INT8或执行其他的优化操作。
现在我们需要了解一下解码和编码的能力,我们正在考虑的系统实际上能解码或处理几路视频?
OneVPL是基于英特尔显卡的视频处理库,可以为你提供一些视频处理API以及帮你快速入门的示例,它支持市面上绝大多数编码解码格式。如果你想使用英特尔集成显卡获得更高的解码或编码密度,这便是你的最佳选择。如你所见,OneVPL不仅可以使用GPU进行解码与编码,还可以执行各种图像处理如缩放、色彩空间转换等等图像操作。现在我们了解了系统的解码能力和推理性能。但是由于工作负载包含许多环节,有时必须进行全面模拟才能了解系统的性能。问题是我们并不想构建一个完整应用,只想简单验证工作负载是否适合当前的系统。所以我们需要一种快速方便的方法来模拟这个流程
因此我们可以使用DL-Streamer帮助我们快速构建视频分析完整的pipeline。DL-Streamer是一款开源用于构建视频处理流程的实用框架。他是基于G-streamer的多媒体框架,多用于在云端或者边缘端创建一些复杂的媒体分析流程。在AI推理方面在DL-streamer的pipeline可以添加OpenVINO作为推理引擎,可以实现进行检测、分类、识别和可视化等功能。作为若干个新元素加入到pipeline中。
以下是使用DL-Streamer构建视频分析pipeline的一些关键步骤和特定:
1、集成深度学习模型:DL-Streamer支持多种深度学习框架,如Tensorflow、Pytroch等,可以方便地集成预训练的模型或自定义模型。
2、视频输入:DL-Streamer可以处理来自不同来源的视频输入,包括实时摄像头捕获、视频文件或网络视频流。
3、预处理:在模型处理之前,DL-Streamer可以对视频帧进行预处理,如缩放、裁剪、颜色空间转换等,以适应模型的输入要求。
4、模型推理:DL-Streamer可以对视频帧进行实时推理,执行对象检测,图像分类、场景识别等任务。
5、后处理:推理结果可以进行后处理,如非极大值抑制(NMS)用于去除重叠的检测框,或者进一步的分类和属性分析。
6、结果展示:DL-Streamer提供了结果展示的功能,可以将检测结果叠加在视频帧上,并支持视频输出到屏幕或文件。
现在我们可以使用DL-Streamer去构建一个视频分析应用了。我们来看一下这个AI视频分析应用的全部流程,这个应用是包含了两个推理阶段的工作。首先需要做检测推理。DL-Stramer只需要
用一行代码就轻松的构建与模拟这个视频分析流程了。
看到这一行代码的开头,我们的输入视频文件Video1.mp4,通过decodebin这个元素对这个视频进行解码,videoconvert在这里是转换解码视频的输出格式,为下一阶段的推理工作做准备。gvainference model=face-detection.xml在这里使用OpenVINO工具套件进行AI推理,用一个面部检测模型进行人脸检测,gvaCLASSIFY model=emotions-recognition.xml然后我们使用输出的检测结果并执行情绪识别,结论是你可以通过一行代码定义完整的工作负载,如果你想要多路识别,只需重复以上的代码便可以实现。如果你有别的设备,你也可以在你需要的任何设备上运行它,并获得性能结果
你可以随意选择是在本地设备上运行或者是Docker容器中运行。