01
概述
本文是OpenVINO 工具套件與百度飛槳PaddlePaddle模型轉(zhuǎn)換/部署系列的第二部。這篇文章專注于展示如何將百度飛槳PaddelSeg項目下的DeepLabV3+路面語義分割模型轉(zhuǎn)換為OpenVINO工具套件的IR模型并且部署到CPU上。
為了使本文擁有更廣的受眾面,文章的目標部署平臺選擇了CPU和iGPU。關(guān)于如何部署到邊緣設(shè)備例如Intel Movidius MyraidX VPU上,請參考第一篇文章:
Ubuntu20.04環(huán)境下使用OpenVINO部署B(yǎng)iSeNetV2模型
那么我們重述一下什么是語義分割:
語義分割(Semantic Segmentatio)是計算機視覺對現(xiàn)實世界理解的基礎(chǔ),大到自動駕駛,小到個人應(yīng)用只要細心觀察都可以發(fā)現(xiàn)語義分割的應(yīng)用場所無處不在。其實語義分割相當(dāng)于是圖像分割+ 對分割區(qū)域的理解。
因此圖像語義分割也稱為圖像語義標注,由于圖像語義分割不僅要識別出對象還要標出每個對象的邊界,所以相關(guān)的模型會具有像素級別(Pixel Level)的密集預(yù)測能力。
本篇文章的主要目的是展示如何把已有的百度飛槳Paddle模型一步一步的部署到Intel的Movidius Myriad X VPU上。同時本文也展示了一種思路:如何在浩瀚的Internet網(wǎng)絡(luò)找到正確的信息,少走彎路。
1.1
OpenVINO工具套件的重要性
面對當(dāng)下眾多流行的AI框架,比如PaddlePaddle、PyTorch、Tensorflow等等,每個框架都有自己特殊的神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)和文件類型,每個框架內(nèi)的設(shè)計也盡不一樣, 如此訓(xùn)練出來的模型則千差萬別,這對軟件開發(fā)和重用造成了一定的麻煩。
是否可以有一種工具可以使我們,不管選用什么AI框架來構(gòu)建專屬于自己的神經(jīng)網(wǎng)絡(luò)時,在最后部署到生產(chǎn)環(huán)境中的環(huán)節(jié),都可以擁有統(tǒng)一的接口,可重用的代碼呢?
答案是肯定的。OpenVINO工具套件就是這樣的一款工具,有了它的幫助,AI工程師可以在模型構(gòu)建、訓(xùn)練階段,選擇自己熟悉的任何AI框架來搭建起符合要求的個性化神經(jīng)網(wǎng)絡(luò), 而在后期使用OpenVINO快速構(gòu)建起專屬的解決方案,提供統(tǒng)一的接口,并在Intel 的硬件上優(yōu)化性能。
1.2
這篇文章的著重點和非著重點
正如前面提到的,,這篇文章的著重點在于一步一步演示怎樣導(dǎo)出已經(jīng)訓(xùn)練好的或者已有的百度飛槳PaddleSeg模型,并且怎樣轉(zhuǎn)換Paddle模型到ONNX格式,最后再轉(zhuǎn)到OpenVINO 工具套件IR模型,直至部署到CPU上為止。在每一步我都會提供相應(yīng)的官方網(wǎng)址,一步一步的把讀者推向正確的官網(wǎng)文檔,減少走彎路。
再來講一下這篇文章不講什么。這篇文章不講解怎樣安裝Python,Anaconda,OpenVINO工具套件這樣的基礎(chǔ)需求框架。以上幾個產(chǎn)品的官方網(wǎng)站教程都做的非常詳細,而且會實時更新,相信對于每個不同的技術(shù),閱讀相對應(yīng)的官方文檔可以省去很多麻煩,少走彎路。這篇文章更多的精力會用在講解模型之間的轉(zhuǎn)換,部署,以及排錯。
1.3
Intel OpenVINO簡介
OpenVINO工具套件(以下簡稱OV)是Intel 發(fā)布的一個綜合性工具套件,用于快速開發(fā)解決各種任務(wù)的應(yīng)用程序和解決方案。它包括人類視覺,自動語音識別,自然語言處理,推薦系統(tǒng)等。該工具套件基于最新一代人工神經(jīng)網(wǎng)絡(luò),包括卷積神經(jīng)網(wǎng)絡(luò) (CNN)、Recurrent Network和基于注意力的網(wǎng)絡(luò),可跨英特爾 硬件擴展計算機視覺和非視覺工作負載,從而最大限度地提高性能。
1.4
百度飛槳
百度飛槳(以下簡稱Paddle)是百度旗下一個致力于讓AI深度學(xué)習(xí)技術(shù)的創(chuàng)新與應(yīng)用更加簡單的工具集。其中包括,PaddleCV,PaddleSeg,PaddleClas等工具幫助您快速的搭建起AI應(yīng)用程序,最快落地AI模型項目。對于有過Tensorflow, PyTorch經(jīng)驗的朋友來說, Paddle的角色和前面二者是一樣的,都是高度集成的AI框架。目前Paddle有很活躍的開發(fā)者社區(qū),有利于快速找到自己需要的答案和幫助。
02
概述面向的讀者和需要的軟件
2.1
面向的讀者
本文面向的讀者是具有一定編程能力和經(jīng)驗的開發(fā)人員,AI模型開發(fā)員,熟悉Python語言,并使用Anaconda,已有訓(xùn)練好的模型,期待能部署到邊緣設(shè)備上來投入實際生產(chǎn)中。對于0基礎(chǔ)的讀者也是一個很好的機會通過一篇文章一并了解以上的幾個技術(shù)以及怎樣綜合使用這些技術(shù),讓它們成為您得心應(yīng)手的工具來幫助您最快的實現(xiàn)AI部署。
2.2
需要的軟件
Anaconda,Python(創(chuàng)建Anaconda虛擬環(huán)境的時候會自帶),OpenVINO工具套件,Paddle,PaddleSeg,Paddle2Onnx,mamba。
03
安裝PaddlePaddle & PaddleSeg
在介紹完以上內(nèi)容或,現(xiàn)在可以正式動工啦。由于本文用到的BiSeNetV2路面分割模型是用PaddleSeg訓(xùn)練的,所以需要先安裝PaddleSeg的基礎(chǔ)庫PaddlePaddle。然后再安裝PaddelSeg。
在安裝Paddle組件之前,請確保您已經(jīng)安裝好了Anaconda。(地址:
https://docs.anaconda.com/anaconda/install/index.html)
第一步:創(chuàng)建一個conda 虛擬環(huán)境:
conda create -n "paddle" python=3.8.8 ipython
創(chuàng)建好環(huán)境后 別忘了激活環(huán)境:
conda activate paddle
第二步:安裝GPU或者CPU版本的PaddlePaddle:
至于是選擇GPU還是CPU版本的Paddle,主要是根據(jù)您的硬件配置。如果您有NVIDIA最近幾年的顯卡例如:RTX 1060,RTX 2070等,那么請選擇安裝GPU版本。查看CUDA對GPU支持的具體信息,請閱讀NVIDIA官網(wǎng)的GPU Compute Capability(地址:
https://developer.nvidia.com/cuda-gpus)
首先安裝NVIDIA的cudnn
conda install cudnn
安裝的時候也可以把conda 換成mamba(地址:https://github.com/mamba-org/mamba),從而得到更快的下載速度。
圖四:使用Mamba安裝cudnn
這里快速介紹一下mamba。它是Conda的C++實現(xiàn)。相比于Conda,它提供多線程下載,這也就意味著它可以比Conda更好的利用網(wǎng)絡(luò)資源,下載的更快。同時它也能更快的解析依賴項。估計用Conda多的朋友應(yīng)該會遇到過,Conda有時候查找依賴項非常慢、很耽誤時間。Mamba是您的好朋友,以下教程種再看到conda的命令,大家都可以自動替換成mamba來提高速度, 讓您的效率飛起來~!
安裝PaddlePaddle的時候,Paddle的官網(wǎng)(https://www.paddlepaddle.org.cn/)是您的好朋友,(任何時候安裝任何東西,找到官網(wǎng)一般就能獲取最新的指南), 我以Ubuntu 20.04的系統(tǒng)為例(如果您用其他的系統(tǒng),那么請選擇相應(yīng)的選項)
具體命令如下:
conda install paddlepaddle-gpu==2.1.2 cudatoolkit=11.2 -c https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/Paddle/ -c conda-forge
安裝完底層框架之后,是時候安裝PaddleSeg(地址:https://github.com/PaddlePaddle/PaddleSeg)啦。同理, 安裝PaddleSeg的時候您的好朋友還是它的官網(wǎng)或者它的Github倉庫。
pip install paddleseg
git clone https://github.com/PaddlePaddle/PaddleSeg
安裝完P(guān)addleSeg之后 我們就可以開始激動人心的步驟:導(dǎo)出已經(jīng)訓(xùn)練好的模型~!
04
模型轉(zhuǎn)換
模型的轉(zhuǎn)換分為4個步驟:
1. 導(dǎo)出已經(jīng)訓(xùn)練好的模型
2. 轉(zhuǎn)換到ONNX模型
3. 通過ONNX模型轉(zhuǎn)換到OpenVINO工具套件的 IR模型
4. 最后編譯IR模型成為.blob模型(只適用于Intel VPU,神經(jīng)棒等, CPU不需要)
其中3和4都是可以在Intel Movidius Myriad X VPU上部署測試的。
4.1
導(dǎo)出已經(jīng)訓(xùn)練好的模型
本文將會以PaddleSeg官方的DeepLabV3P模型(DeepLabV3+[2](地址:
https://github.com/PaddlePaddle/PaddleSeg/tree/release/2.2/configs/deeplabv3p)
是一款相對較新的神經(jīng)網(wǎng)絡(luò)構(gòu)架,擁有不錯的準確度和性能)為例(如果您有自己的模型,請?zhí)鎿Q掉下面例子中的模型,并且更新相應(yīng)的配置即可)。本文選中的是以Pascol VOC 2012 + Aug 為數(shù)據(jù)集訓(xùn)練好的, ResNet50_OS8為骨干網(wǎng)絡(luò)的DeepLabV3P模型。
命令的格式如下:
conda activate paddle
cd PaddleSeg
python export.py
--config / Github/PaddleSeg/configs/deeplabv3p/deeplabv3p_resnet50_os8_voc12aug_512x512_40k.yml
--model /Models/Paddle/Segmentation/deeplabv3p_pascalvoc2012.pdparams
如果一切運行正常您將會看到類似如下的信息:
W0922 2341.752403 25116 device_context.cc:404] Please NOTE: device: 0, GPU Compute Capability: 7.5, Driver API Version: 11.2, Runtime API Version: 11.2
W0922 2341.775831 25116 device_context.cc:422] device: 0, cuDNN Version: 8.1.
2021-09-22 2344 [INFO] Loading pretrained model from https://bj.bcebos.com/paddleseg/dygraph/resnet50_vd_ssld_v2.tar.gz
Connecting to https://bj.bcebos.com/paddleseg/dygraph/resnet50_vd_ssld_v2.tar.gz
Downloading resnet50_vd_ssld_v2.tar.gz
[==================================================] 100.00%
Uncompress resnet50_vd_ssld_v2.tar.gz
[==================================================] 100.00%
2021-09-22 2304 [INFO] There are 275/275 variables loaded into ResNet_vd.
2021-09-22 2305 [INFO] Loaded trained params of model successfully.
/anaconda3/envs/paddle/lib/python3.8/site-packages/paddle/fluid/layers/utils.py DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated since Python 3.3, and in 3.9 it will stop working
return (isinstance(seq, collections.Sequence) and
2021-09-22 2307 [INFO] Model is saved in ./output.
具體的模型deeplabv3p_resnet50_os8_voc12aug_512x512_40k.yml配置文件可以在PaddleSeg的官方Github閱讀。
(地址:
https://github.com/PaddlePaddle/PaddleSeg/blob/release/2.2/configs/deeplabv3p/deeplabv3p_resnet50_os8_voc12aug_512x512_40k.yml)
如果想知道更多參數(shù),您的好朋友還是PaddleSeg的官方Github Repository:模型導(dǎo)出(地址:
https://github.com/PaddlePaddle/PaddleSeg/blob/release/2.2/docs/export/export/model_export.md)
來講解一下這條命令。
--config 是用來指定模型配置參數(shù)的文件。在這個文件里它說明了您使用的模型叫什么名字, 比如在我的例子中,使用的模型叫做:BiSeNetV2, 您需要的分類有多少種,用了什么優(yōu)化器,損失函數(shù)是什么,batch size是多少等等都在這個文件里面。
來看一下
deeplabv3p_resnet50_os8_voc12aug_512x512_40k.yml配置文件 (地址:
https://github.com/PaddlePaddle/PaddleSeg/blob/release/2.2/configs/deeplabv3p/deeplabv3p_resnet50_os8_voc12aug_512x512_40k.yml)的內(nèi)容
_base_: '../_base_/pascal_voc12aug.yml'
model:
type: DeepLabV3P
backbone:
type: ResNet50_vd
output_stride: 8
multi_grid: [1, 2, 4]
pretrained: https://bj.bcebos.com/paddleseg/dygraph/resnet50_vd_ssld_v2.tar.gz
backbone_indices: [0, 3]
aspp_ratios: [1, 12, 24, 36]
aspp_out_channels: 256
align_corners: False
pretrained: null
可以看出, 它只需要在本配置文件里面指出了和模板文件pascal_voc12aug.yml (地址:
https://github.com/PaddlePaddle/PaddleSeg/blob/release/2.2/configs/_base_/pascal_voc12aug.yml)
不一樣的參數(shù). 而它的模板文件又參照了pascal_voc12.yml (地址:
https://github.com/PaddlePaddle/PaddleSeg/blob/release/2.2/configs/_base_/pascal_voc12.yml)
作為更上一層的模板文件。
這樣做的好處顯而易見. 您在自己的模型配置文件里, 只需要做少許改動,指出和模板文件不同的配置便可以,大量的相同配置則被重復(fù)使用了。
一個小竅門就是,參考PaddleSeg項目里已有的模板 (例如您剛克隆的PaddleSeg代碼下面的 deeplabv3p_resnet50_os8_voc12aug_512x512_40k.yml) (地址:
https://github.com/PaddlePaddle/PaddleSeg/blob/release/2.2/configs/deeplabv3p/deeplabv3p_resnet50_os8_voc12aug_512x512_40k.yml)
一級一級的追查回到最底層的模板,您就差不多可以知道在xml文件里有哪些參數(shù)可以指定的了。同時也參考自己在訓(xùn)練AI模型的時候代碼里用到了哪些參數(shù),基本上都是要在這個config文件里面反映出來的。
--model 指向的是您已經(jīng)訓(xùn)練好的模型文件。
4.2
轉(zhuǎn)模型到ONNX: Paddle --> ONNX
模型導(dǎo)出后第一道轉(zhuǎn)換現(xiàn)在開始了.Paddle提供了轉(zhuǎn)換工具 Paddle2onnx. (地址:
https://github.com/PaddlePaddle/Paddle2ONNX)我們先來安裝它:
pip install paddle2onnx
是時候轉(zhuǎn)化模型到ONNX啦
paddle2onnx --model_dir inference --model_filename model.pdmodel --params_filename model.pdiparams --save_file road_seg.onnx --opset_version 11
--enable_onnx_checker True
這里 model_dir, model_filename, 以及params_filename和Save_file替換成自己的文件路徑就好.
--model_dir是轉(zhuǎn)換后的模型要保存的目錄
--enable_onnx_checker 把這個也啟動,讓轉(zhuǎn)換程序幫我們檢查模型
我當(dāng)時遇到的問題:
Opset_version的默認值是9(地址:
https://github.com/PaddlePaddle/Paddle2ONNX#parameters),當(dāng)我在轉(zhuǎn)BiSeNetV2的時候一開始并沒有指定這個,而且出錯了,經(jīng)過研究,發(fā)現(xiàn)是因為BiSeNetV2的框架比較新,需要把這個opset_version調(diào)高到11,更改到11后就好了。目前看到官網(wǎng)能穩(wěn)定支持的是 11,但是也有看到過別人用12的,大家可以邊試邊用。
如果轉(zhuǎn)換成功啦則會看到類似的如下信息:
2021-08-23 2233 [INFO] ONNX model generated is valid.
2021-08-23 2233 [INFO] ONNX model saved in /onnx_models/road_seg.onnx
4.3
轉(zhuǎn)換ONNX模型到OpenVINO IR模型
鋪墊了很久,終于來到了這一步。
先來快速介紹一下OpenVINO的IR模型。IR的全稱叫做Intermediate Representation. IR格式的模型是由2個文件組成的,它們分別是 .xml 和 .bin.
來到這一步之前請確保您的Intel OpenVINO安裝成功啦。怎樣安裝Intel OpenVINO呢?您的好朋友又要出現(xiàn)了:Intel OpenVINO官網(wǎng)安裝教程(地址:
https://docs.openvinotoolkit.org/cn/latest/openvino_docs_install_guides_installing_openvino_linux.html#install-openvino),這里是Intel OpenVINO官方下載地址(https://software.seek.intel.com/openvino-toolkit)
Intel OpenVINO的安裝包里3種安裝選項分別是:
1. 圖像界面GUI安裝
2. 命令行安裝
3. 命令行安裝安靜模式
對于新手,推薦用GUI安裝,清清楚楚、明明白白。
4.3.1
設(shè)置外部軟件依賴
安裝成功后,記得把Install External Software Dependencies(地址:
https://docs.openvinotoolkit.org/cn/latest/openvino_docs_install_guides_installing_openvino_linux.html#install-external-dependencies)這個部分的要求也跟完這一步是需要的。
4.3.2
激活I(lǐng)ntel OpenVINO環(huán)境變量
小提示:接下來要使用OV就要設(shè)置好它的環(huán)境變量。官方教程(地址:
https://docs.openvinotoolkit.org/cn/latest/openvino_docs_install_guides_installing_openvino_linux.html#set-the-environment-variables)要求把環(huán)境變量加載到您的 .bashrc文件里,這樣每次打開任何命令行接口都可以自動加載OV的環(huán)境變量。但是我在實際使用過程中發(fā)現(xiàn)了一個問題。安裝完OV后,我的一部分程序開始報錯,出現(xiàn)了一個和Gstreamer相關(guān)的錯誤信息。經(jīng)過研究發(fā)現(xiàn)原來OV的環(huán)境變量會和Anaconda的虛擬環(huán)境沖突,導(dǎo)致GStreamer出現(xiàn)問題。
其實解決方法也很簡單。我們一般只會在模型轉(zhuǎn)換的時候用到OV,那么就不要把OV的環(huán)境變量設(shè)置到.bashrc文件里面,只需要在使用OV之前,在命令行里激活OV的環(huán)境變量就行。激活環(huán)境變量的方法如下:
source /opt/intel/openvino_2021/bin/setupvars.sh
記住/opt/intel/openvino_2021/bin 是默認的OV安裝路徑,如果您改變了路徑,請記得也隨之改變這里的路徑。
4.3.3
配置模型優(yōu)化器
Model Optimizer(MO)
相信我同志們,我知道過程很長,但是曙光就在眼前啦~!這個就是開始轉(zhuǎn)OpenVINO IR模型前要調(diào)整的最后一步,堅持住~!
MO是一個基于Python的命令行工具,可以用來從其他流行的人工智能框架例如Caffe,ONNX,TensorFlow等導(dǎo)入訓(xùn)練好的模型。沒有用MO優(yōu)化過的模型是不能用來在OV上做推理的。
在這一步可以只為您需要的環(huán)境比如ONNX,或者Tensorflow等做配置,但也可以一下配置好可以適用于各種人工智能框架的環(huán)境。我在這里選擇了后者,畢竟路慢慢其修遠 現(xiàn)在用ONNX 之后也有可能用到任何其他網(wǎng)絡(luò)。
那么第一步先CD到MO設(shè)置的文件夾里面:
4.3.4
轉(zhuǎn)ONNX模型到IR模式
cd /opt/intel/openvino_2021/deployment_tools/model_optimizer
python mo_onnx.py --input_model /inference/onnx_models/road_seg.onnx
--output_dir /openvino/FP16
--input_shape [1,3,224,224]
--data_type FP16
--scale_values [127.5,127.5,127.5]
--mean_values [127.5,127.5,127.5]
這里需要提一下怎樣找出—input_shape 的參數(shù)值.
一般來說模型是自己訓(xùn)練的 那么您在訓(xùn)練的時候就要指定輸入圖片的尺寸大下, 那么這個512,512就是指圖片的寬和高. 前面的1是batch size,3是圖片的顏色通道數(shù).
-data_type來指定模型的精度,
如果轉(zhuǎn)換成功,您將會看到如下輸出:
Model Optimizer arguments:
Common parameters:
- Path to the Input Model: /Models/Paddle/Segmentation/DeepLabV3+/Onnx/pascalvoc.onnx
- Path for generated IR: /Models/Paddle/Segmentation/DeepLabV3+/OpenVINO/
- IR output name: pascalvoc
- Log level: ERROR
- Batch: Not specified, inherited from the model
- Input layers: Not specified, inherited from the model
- Output layers: Not specified, inherited from the model
- Input shapes: [1,3,512,512]
- Mean values: Not specified
- Scale values: Not specified
- Scale factor: Not specified
- Precision of IR: FP16
- Enable fusing: True
- Enable grouped convolutions fusing: True
- Move mean values to preprocess section: None
- Reverse input channels: False
ONNX specific parameters:
- Inference Engine found in: /opt/Intel/OpenVINO_2021/python/python3.8/OpenVINO
Inference Engine version: 2021.4.0-3839-cd81789d294-releases/2021/4
Model Optimizer version: 2021.4.0-3839-cd81789d294-releases/2021/4
[ SUCCESS ] Generated IR version 10 model.
[ SUCCESS ] XML file: /Models/Paddle/Segmentation/DeepLabV3+/OpenVINO/pascalvoc.xml
[ SUCCESS ] BIN file: /Models/Paddle/Segmentation/DeepLabV3+/OpenVINO/pascalvoc.bin
[ SUCCESS ] Total execution time: 18.65 seconds.
[ SUCCESS ] Memory consumed: 640 MB.
4.4
驗證轉(zhuǎn)換后的IR模型
在繼續(xù)下去之前我們應(yīng)該先檢驗一下這個模型是否真的轉(zhuǎn)換成功。
在運行如下代碼之前,請換一個命令行窗口,并且啟動之前創(chuàng)建的Anaconda 環(huán)境,這樣做是為了確保OV的環(huán)境變量和Conda的不互相沖突,產(chǎn)生錯誤。
運行如下代碼infer_deeplabv3p.py(地址:https://github.com/franva/Intel-OpenVINO-Paddle/blob/main/infer_deeplabv3p.py
)檢測轉(zhuǎn)換后的模型的正確性:
import cv2
import numpy as np
from OpenVINO.inference_engine import IENetwork, IECore
import paddleseg.transforms as T
from colors_pascalvoc import ColorMap_PASCALVOC
# Please update the pathes to xml and bin files respectively on your machine
model_xml = r'/Models/Paddle/Segmentation/DeepLabV3+/OpenVINO/pascalvoc.xml'
model_bin = r'/Models/Paddle/Segmentation/DeepLabV3+/OpenVINO/pascalvoc.bin'
ie = IECore()
# Read IR
net = IENetwork(model=model_xml, weights=model_bin)
input_blob = next(iter(net.inputs))
out_blob = next(iter(net.outputs))
exec_net = ie.load_network(network=net, device_name="CPU")
del net
transforms = [
T.Resize(target_size=(512,512)),
T.Normalize()
]
def show_img(img, window_name, channel_first=True):
visual = img
if channel_first:
visual = img.transpose(1,2,0)
visual = cv2.resize(visual, (600, 600))
else:
visual = cv2.resize(visual, (600,600))
cv2.imshow(window_name, visual)
def save_img(img, img_fn):
cv2.imwrite(img_fn, img)
# Run inference, replace this mp4 file with your own video
video = '/Testing Videos/mel_highway.mp4'
cap = cv2.VideoCapture(video)
read_successfully, frame = cap.read()
while read_successfully:
if read_successfully == False:
continue
resized_frame, tesrt = T.Compose([transforms[0]])(frame)
img, _ = T.Compose(transforms)(frame)
# add an new axis in front
img_input = img[np.newaxis, :]
result = exec_net.infer(inputs={input_blob: img_input})
img_segmentation = result['save_infer_model/scale_0.tmp_1']
img_segmentation = np.squeeze(img_segmentation)
class_colors = ColorMap_PASCALVOC.COLORS
class_colors = np.asarray(class_colors, dtype=np.uint8)
img_mask = class_colors[img_segmentation]
img_mask = img_mask.transpose(2, 0, 1)
img_overlayed = cv2.addWeighted(resized_frame, 1, img_mask, 1, 0.5)
img_overlayed = img_overlayed.transpose(1,2,0)
img_overlayed = cv2.cvtColor(img_overlayed, cv2.COLOR_RGB2BGR)
show_img(img_overlayed, 'overlayed', False)
show_img(img_mask, 'mask', True)
if cv2.waitKey(1) == ord('q'):
break
read_successfully, frame = cap.read()
cap.release()
cv2.destroyAllWindows()
4.5
模型性能和吞吐量
測試好模型之后,我們還可以檢查一下模型的性能和吞吐量。幸運的是,Intel DevCloud已經(jīng)提供了現(xiàn)有的工具來幫助我們快速完成這項工作。
我們?nèi)我馓暨x了幾套硬件搭配,來看一下剛轉(zhuǎn)換好的IR模型性能。
圖八: Benchmark of DeepLabV3+模型
由上圖可以看出,更好的GPU支持會帶來更多的性能提升。同樣大部分AI模型檢測,分類,分割任務(wù)不需要很高的分辨率,所以適當(dāng)降低輸入圖像的尺寸后也能大幅度提高模型的性能。
關(guān)于如何使用Intel DevCloud,更詳細的步驟請參考:
使用OpenVINO優(yōu)化和部署DenseNet模型并在DevCloud上完成性能測試-上篇
使用OpenVINO 優(yōu)化和部署DenseNet模型并在DevCloud上完成性能測試-下篇
至此,整個流程結(jié)束。恭喜大家成功的把模型落地,并且部署到了邊緣設(shè)備上。期待看到你們各個精彩的應(yīng)用啦!
最后貼上Github 的本文章的陪同代碼庫(地址:https://github.com/franva/Intel-OpenVINO-Paddle),歡迎大家提出寶貴的意見。
05
總結(jié)
本文一開始先介紹了圖像分割和語義分割,闡述了用OpenVINO 工具套件部署模型的重要性。快速介紹了OpenVINO 工具套件以及百度的 PaddlePaddle框架。然后以一個訓(xùn)練好的百度飛槳Paddle模型為例開始,一步一步帶著大家把模型轉(zhuǎn)換到了OpenVINO 工具套件的IR格式,直到部署到CPU上面。對于不同的模型,只需要適量的改動,便可以快速獨立的開發(fā)屬于自己的AI應(yīng)用程序。
編輯:jq
-
圖像分割
+關(guān)注
關(guān)注
4文章
182瀏覽量
17995 -
代碼
+關(guān)注
關(guān)注
30文章
4779瀏覽量
68522 -
GitHub
+關(guān)注
關(guān)注
3文章
469瀏覽量
16428
原文標題:如何使用OpenVINO? 部署PaddleSeg模型庫中的DeepLabV3+模型?
文章出處:【微信號:英特爾物聯(lián)網(wǎng),微信公眾號:英特爾物聯(lián)網(wǎng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論