【深度】工程师必备—AI模型训练+推理优化+嵌入部署

这是一篇带给深度学习与计算机视觉等方向人员的全面教学文章

人人听闻AI

又何人了解AI?全世界70亿人,中国13亿,这么多人都知道AI,风靡一时,然而各式各样的伪科学,伪概念也随之出现。中国计算机算法工程师仅几十万,其中做AI

相关的,例如视觉算法工程师,NLP算法工程师,推荐系统,语音识别等等,就更是占比少了!如果你是小白,计算机小白,在读学生,或者希望孩子接触AI的家长,那么千万不要被社会上美其名曰的培训机构和教育机构诱惑了,花了上万或更多的钱,学了个寂寞!我认识很多培训机构的人,各个层次的都有,一本万利,把你坑得团团转。今天不细说更多,仅以此系列文章,以一名AI视觉算法师身份指引着各界(小白,与本科生,和想要接触AI和正在接触AI的朋友),看技术文章,论文才能更好的进步!

今天将从0到1地分享一个AI视觉应用从开发,模型训练到优化到部署到落地的心得分享!请拿好小本本记笔记~

一 项目展示

在这里插入图片描述

          Yolov3 目标检测

在这里插入图片描述 Yolov5吸烟检测
在这里插入图片描述

   Ssd 安全帽检测

在这里插入图片描述

        Ssd 口罩检测

在这里插入图片描述

       Yolov 4 车牌车速与闯红灯检测

部分可见基于开发模组推理加速后在cpu上也能达到60-80fps,功耗很低,很适合应用落地。

很多有趣的,有商业和科研价值的项目不一一列举了,这些项目都可以部署到开发板,例如我即将介绍的我们的视觉模组上~

二 依赖环境与导读

2.1依赖环境

我的环境是:Ubuntu18.04

Python 3.7(3.x即可) Tensorflow(1.14-gpu)Pytorch(1.5-gpu)

2085模组一件,Openvino2020.3.194, C++, g++ (Ubuntu 7.5.0-3ubuntu1~18.04)

7.5.0 接下来我会在需要到环境时让大家安装的。

2.2 本文导读

本文原创,若无授权,禁止转载。

若您是AI 方向科研人员与工程师:如果您是科研人员,教您手把手训练模型与推理优化与应用部署,您可以重点阅读推理和应用部署上,您能很直观的知道模组推理的效果和落地应用的实际效果。

三 模型训练

3.1 新手也能做对的教学

如果您是第一次接触AI ,不熟悉深度学习于计算机视觉,但您有python或c++基础,希望完成一个简单的视觉基础,我建议您在提升一定基础后(这样能更好的解决遇到的bug)。

这时您想训练一个目标检测模型,您可以选择各式各样的算法,例如Yolo系列,ssd,faster rcnn等等,本节以yolo中的yolov5为例,给您演示一下 吸烟检测参见这篇博客:https://blog.csdn.net/qq_46098574/article/details/107334954,本节其他目标检测或者使用其他各类算法以及效果比较,我们会在后期与您见面。基于这篇博客,我给您大致介绍一下模型训练手把手教程~

下载源码

git clone https://github.com/CVUsers/Smoke-Detect-by-YoloV5/tree/master.git

进入目录,安装依赖环境

pip install-U-r requirements.txt

如果需要使用混合精度模型来做训练:安装Apex

如果您数据未标注:请参看博客

基于生成好的xml文件,os操作写入如图不带后缀xml文件

在这里插入图片描述

然后运行voc_label.py转换成label

切割训练/验证集执行train_test_split.py

运行path_trans补全路径,并写入train.txt

接下来编写yaml文本:见smoke.yaml将我们上一步生成的train.txt 和test.txt 补全路径后的这两个txt路径写入到yaml中,然后nc:修改为自己类别的数量,以及names【‘smoke’】

在这里插入图片描述

在上面我们做好数据预处理后,就可以开始训练了,上面的一些处理步骤,每个人都可能不同,不过大体上思路是一致的。接下来我们可以进行预训练,下载官方的预训练模型:

yolov5s yolov5m yolov5l yolov5x来 我在我的github中放了yolov5s,比较小,只有25mb,专门为移动端考虑了。

开始训练:

python train.py–data data/smoke.yaml–cfg models/yolov5s.yaml–weights weights/yolov5s.pt–batch-size10 --epochs100

如果顺利,你将看到以下迭代训练:
在这里插入图片描述

实时检测 运行detect.py即可

在这里插入图片描述

其中,推理一张图片,那么就在–source中的default写上图片路径,也可以如图写上整个图片文件夹,这样会检测所有图片。也可以写上视频地址和视频文件夹,检测所有视频,存放于inference

的out中。改成0

就是实时检测了~默认电脑摄像头,当然也可以改成手机。这个也很简单,需要的可以私聊我。运行代码你将看到实时检测于您电脑内置摄像头中,这样可能会有些卡顿,如果您使用我下文使用的2085模组,将有另一番全新体验。

3.2 高手也爱的黑科技:无损的半精度模型

上面,我们介绍了以yolov5 吸烟检测为例的目标检测,接下来我们在此基础上提升,说说高手们也想要的黑科技。

1:混合精度模型,半精度模型如何可以以降低显存却可以保持精度呢?

装好apex后在代码中添加,在optimizer中amp初始化一下

优化反向传播。组装到cuda训练

实现半精度,其他资料详见博客,还有一些细节没公布。

3.2 高手也爱的黑科技:为何使用预训练模型

使用预训练模型,官方已经给出了,那么你知道为什么要使用预训练模型吗?

作者已尽其所能设计了基准模型。我们可以在自己的数据集上使用预训练模型,而不是从头构建模型来解决类似的自然语言处理问题。

尽管仍然需要进行一些微调,但它已经为我们节省了大量的时间:通常是每个损失下降更快和计算资源节省。

加快梯度下降的收敛速度

更有可能获得一个低模型误差,或者低泛化误差的模型

降低因未初始化或初始化不当导致的梯度消失或者梯度爆炸问题。此情况会导致模型训练速度变慢,崩溃,直至失败。

其中随机初始化,可以打破对称性,从而保证不同的隐藏单元可以学习到不同的东西

3.3 高手也爱的黑科技:训练被迫中断怎么办,‘迁移学习’帮你搞定?

我在代码中添加了–resume参数,当你在训练中被迫中断了,可以使用这个参数,在你训练中保存的last.pt

上进行迁移学习。这时候,你将在代码中看到细节,用法就是加上–resume

然后不使用官方的预训练模型即可,你将看到接着上次的loss训练,就成功了。

3.3 高手也爱的黑科技:数据增强

人工智能,或者说计算机视觉的一个最终目标在于构建一个真正可适用于真实世界复杂环境的系统。而就目前所应用的机器学习系统而言,大部分采用了有监督的学习方法,也必然导致了需要广泛收集图像样本,并进行对应的图像标注的工作。而人力时有穷尽,高质量的样本集图片又是构建一个优秀的机器学习系统的关键因素。使用适当的数据增强方法可以将数据集的数量增大十倍以上,从而极大化利用小样本集中的每个样本,使之也可以训练得到一个较好的机器学习模型。数据增强方法也可以提高模型的鲁棒性,防止其易在训练中出现过拟合的现象。

常用的数据增强方法主要来自数字图像处理中的几何变换,但不改变图像中的像素值,而是改变了其空间位置,借此希望卷积神经网络学习到图像中更多的不变性特征,也有利于提高其泛化性能。

以下将对各种方法做简单的列举与说明。

平移(Shift)变换:对原始图片在图像平面内以某种方式(预先定义或者随机方式确定平移的步长、范围及其方向)进行平移。

翻转(Flip)变换:沿竖直或者水平方向对原始图片进行翻转。

随机裁剪(Random Crop):随机定义感兴趣区域以裁剪图像,相当于增加随机扰动。

噪声扰动(Noise):对图像随机添加高斯噪声或者椒盐噪声等。

对比度变换(Contrast):改变图像对比度,相当于在HSV空间中,保持色调分量H不变,而改变亮度分量V和饱和度S,用于模拟现实环境的光照变化。

缩放变换(Zoom):以设定的比例缩小或者放大图像。

尺度变换(Scale):与缩放变换有点类似,不过尺度变换的对象是图像内容而非图像本身(可以参考SIFT特征提取方法),构建图像金字塔以得到不同大小、模糊程度的图像。

3.3 高手也爱的黑科技:BN

批规范化(Batch normalization)

当训练一个深度神经网络时,由于各层参数不断变化,所以各层输入的概率分布也在不断的变化,也导致了非线性激活函数(如sigmoid等)正负两边都会饱和,使得训练迭代的过程变得极其缓慢甚至无法进行。这时候,通常需要采用较小的学习率以及精细进行权重初始化。loffe等将这种现象称为“内部协方差偏移”(internal

covariate shift),并提出了批规范化(Batch normalization,BN)解决此类问题。

该论文中提出在每次随机梯度下降迭代时,在最小批量样本(mini-batch)内做规范化操作,使得输出结果各个维度的均值为0,方差为1,有效地避免了非线性激活函数的饱和问题(以sigmoid为例,观察sigmoid函数即可知,该函数输入集中在0附近时,其输出梯度较大);同时也让梯度变化受参数及其初值的影响减小。

批标准化: 一般用在非线性映射(激活函数)之前,对 x=Wu+b做规范化,使结果(输出信号各个维度)的均值为0,方差为1 。让每一层的输入有一个稳定的分布会有利于网络的训练。

BN算法在网络中的应用

传统的神经网络,只是在将样本x输入输入层之前对x进行标准化处理(减均值,除标准差),以降低样本间的差异性。BN是在此基础上,不仅仅只对输入层的输入数据x进行标准化,还对每个隐藏层的输入进行标准化。

四 模型优化

前面我们说了训练的优化,接下来我将介绍基于Openvino的推理优化,拿好小本本了吗?

4.1 Openvino 介绍 可以参见这篇博客

OpenVINO是英特尔基于自身现有的硬件平台开发的一种可以加快高性能计算机视觉和深度学习视觉应用开发速度工具套件,支持各种英特尔平台的硬件加速器上进行深度学习,并且允许直接异构执行。支持在Windows与Linux系统,Python/C++语言。优化工具包

OpenVINO

让不懂电脑视觉和深度学习原理的小白可以在很短的时间上手,不必担心如何建置开发平台、选择深度学习框架、训练及优化模型和硬体加速等问题,只需利用预先训练及优化过的语义分割模型,很快就可以做出一组看起来很专业的自驾车视觉分析系统。

主要特点:

1:在Intel平台上提升计算机视觉相关深度学习性能达19倍以上

2:解除CNN-based的网络在边缘设备的性能瓶颈

3:对OpenCV,OpenXV*视觉库的传统API实现加速与优化

4:基于通用API接口在CPU、GPU、FPGA等设备上运行加上

OpenVINO 有2个大模块,第一个是 OR 他是用于把深度学习训练好的模型转换成engine可识别的文件(xml和bin) ,另一个是inference engine 是OpenVINO具体实施单元,利用一个智能引擎完成相应的应用 。

一般流程:

1:根据自己的训练模型需要配置Mode Optimizer.

2: 根据设置的模型参数运行Model Optimizer,生成相对应的IR(主要是xml和bin)

xml-主要用来描述网络拓扑结构

bin-包括生成的weights and biases 二进制数据

3: 在实际应用场景种使用Inference Engine测试生成的IR

4: 在应用程序种调用Inference Engine相应接口,将生成的模型IR部署到实际环境中。

Model Optimizer

Model Optimizer 是一个跨平台命令行工具,用于促进训练与具体实施平台中的过渡,主要是进行静态模型分析 以及根据配置参照自动调整深度模型

Model Optimizer 被用来设计成支持常用的框架(Caffe, TensofFlow, MXNet, Kaldi, ONNX等),相当于封装了一层,便于进行开发。

Model Optimizer主要工作流程:

1:根据需要所用到的框架,配置Model Optimizer

2: 提供训练模型作为输入,包括网络拓扑以及参数

3:运行Model Optimizer(根据选择的网络拓扑进行训练)

4:IR作为Model Optimizer输出

Inference Engine:

Inference Engine是主要运行单元,并提供相应API

将IR作为输入

在目标硬件优化执行

提供嵌入式平台最佳执行性能方案

在这里插入图片描述

4.2 Openvino安装

环境:Ubuntu18.04

参见官网教学 或根据以下步骤:

1.下载OpenVINO工具包:

https://docs.openvinotoolkit.org/latest/_docs_install_guides_installing_openvino_linux.html

2.安装:

解压:

tar -zxvf l_openvino_toolkit_p_2019.2.242.tgz

GUI界面安装:

cd /home//l_openvino_toolkit_p_2019.2.242

sudo ./install_GUI.sh

注意:如果以前安装过OpenVINO,请删除/home/目录下的inference_engine_samples和openvino_models.

root用户安装,默认安装目录为/opt/intel/openvino_

到此步,点击Customize…,可以看到默认的安装路径,支持自定义路径,点击save按钮,一路install。

安装依赖环境:

cd /opt/intel/openvino_2019.2.242/install_dependencies

sudo -E ./install_openvino_dependencies.sh

设置临时环境变量(关闭shell终端就会删除环境变量,建议设置永久)

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

设置永久环境变量:

vi/.bashrc

添加下列代码:

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

配置模型优化器,同时配置所有的框架:

cd /opt/intel/openvino/deployment_tools/model_optimizer/install_prerequisites

sudo ./install_prerequisites.sh

3.验证

运行图像分类验证脚本:

cd /opt/intel/openvino/deployment_tools/demo

sudo -E -H ./demo_squeezenet_download_convert_run.sh

在这里插入图片描述

运行推理管道验证脚本:

sudo -H ./demo_security_barrier_camera.sh

测试成功,安装完成!

4.3 Openvino 模型转换与推理

例如yolo系列的原生pt,pb模型文件模型转换为Openvino的xml和bin参见此处,我们转换好了xml和bin文件就可以基于模型做实时检测了~,如下图是一个简单的使用过程。

模型推理的简单使用

在这里插入图片描述
在这里插入图片描述

五 模型部署

5.1 模型转换 部署自己训练好的算法模型,经过openvino推理后应用于2085模组

这时候xml转换成blob文件,我们就可以部署到我们的模组中啦:

找到本地转换文件。

执行

./myriad_compile

-ip U8 -VPU_MYRIAD_PLATFORM VPU_MYRIAD_2480 -VPU_NUMBER_OF_SHAVES 4

-VPU_NUMBER_OF_CMX_SLICES 4 -m pathto.xml -o pathto.blob

就可以在路径下生成blob文件

部署前需要配置环境,主要有以下几个步骤~

5.2 配置Hidapi

git clone https://github.com/signal11/hidapi.git

以Linux为例,详细清查看readme.txt

sudo apt-get install autotools-dev autoconf automake libtool

./bootstrap

./configure --enable-testgui --prefix=/usr

make

make install

六 模组使用

6.1运行cnn目标检测demo

在上方我们安装好依赖后,你将可以直接使用我们为您提供的CNN 目标检测模型,连接好2085模组。

  1. install dependencies: make install_dependencies

  2. build the app with command: make build

./cnn-demo /dev/video2 data/CNN_2x8x.blob left

如果报错,请加上sudo

如此,你将看到实时目标检测的画面,例如

在这里插入图片描述

在这里插入图片描述

6.2 部署自己训练好的算法模型,经过openvino推理后应用于2085模组

由模型训练篇 我们已经经过了不懈努力训练好了模型,那么我们只需要简单的做一下IR转换,将pb模型转化为Openvino的xml,和bin模型文件,再将xml文件通过模型转化为blob(见上文推理)

然后我们只需要简单的修改一下cnn_host 中的几个地方就行了~

1:修改目标检测类别,如图,注释掉原本的,并且新增你的类别
在这里插入图片描述

执行完修改,就可以重新进行make clean 然后再make build,就可以做你的目标检测了,如果您的检测需求有变动,例如姿态描绘等,请按需修改decode_mobilenet方法即可,或者联系我们帮助修改。

在这里插入图片描述

./cnn-demo /dev/video2 data/CNN_2x8x.blob left

运行cnn-demo以后你将看到经过推理加速后的实时视觉体验:

在这里插入图片描述

具体效果,根据模型而定~

七 实际对比

没有经过openvino推理加速的yolov3模型,检测速度尚可,精度很高,如下图所示

在这里插入图片描述

经过openvino推理加速之后的,这是-d CPU下,速度那是很快

在这里插入图片描述

如过您也按照上文的方法,简单地部署了yolov3模型于模组中,那么将看到下图,速度也很快。5
在这里插入图片描述

八 总结

8.1 部署自己训练好的算法模型,经过openvino推理后应用于2085模组 简单示例

在你配置好环境后,你可以简单的使用open_model_zoo的demo,以行人识别为例:

cd/home/{your path}/open_model_zoo/tools/downloader

./downloader.py–name person-vehicle-bike-detection-crossroad-0078

记录xml文件下载路径:

/home/zxx/open_model_zoo/tools/downloader/intel/person-vehicle-bike-detection-crossroad-0078/FP32/person-vehicle-bike-detection-crossroad-0078.xml

转换xml为blob

./myriad_compile

-ip U8 -VPU_MYRIAD_PLATFORM VPU_MYRIAD_2480 -VPU_NUMBER_OF_SHAVES 4

-VPU_NUMBER_OF_CMX_SLICES 4 -m

/home/zxx/open_model_zoo/tools/downloader/intel/person-vehicle-bike-detection-crossroad-0078/FP32/person-vehicle-bike-detection-crossroad-0078.xml

-o

/home/zxx/open_model_zoo/tools/downloader/intel/person-vehicle-bike-detection-crossroad-0078/FP32/person-vehicle-bike-detection-crossroad-0078.blob

修改源码cpp中186行的class 为“crossed-person”

sudo make clean

sudo make build

执行

./cnn-demo /dev/video2 path/person-vehicle-bike-detection-crossroad-0078.blob left

使用这个模组,将获得极致推理体验

你将看到:

在这里插入图片描述

(你将在模组上获得实时显示体验)简单的demo就这样成功了,

8.2 模组推荐:

在这里插入图片描述在这里插入图片描述

                   经过推理加速的实时目标检测

软硬件模组,包括Movidius

VPU芯片,多摄像头惯性跟踪系统(双目跟踪系统+前置摄像头+深度相机)。主流“视觉-惯性导航融合SLAM方案”,并且配合定制的VPU(视觉处理器)加速,软硬件协同优化后,可以达到惊人的稳定性。另外需要说明的是,以上描述的多摄像头跟踪系统中,深度相机主要用于手势跟踪,前置摄像头用于拍照,真正参与vslam空间跟踪的其实周有左右两个摄像头构成的双目系统。

实际使用时在cpu上的推理加速,pfs可达80余,功耗很低,很适合落地应用,如有需要,请联系叶总,邮箱:[email protected]

欢迎关注公众号 DeepAI 视界

在这里插入图片描述

作者:cv调包侠

欢迎关注我的抖音,哔哩哔哩,csdn博客搜索:cv调包侠

Reference

[1] https://blog.csdn.net/qq_46098574/article/details/107334954

[2] https://blog.csdn.net/qq_46098574/article/details/105615297

[3] https://blog.csdn.net/kan2016/article/details/97371100

[4] https://blog.csdn.net/qq_46098574/article/details/107742860

猜你喜欢

转载自blog.csdn.net/qq_46098574/article/details/108397541