ModelArts和彈性云服務器ECS的AI全流程開發 昇騰工業質檢應用實戰
【摘要】 基于華為云ModelArts和彈性云服務器ECS完成從訓練到部署的AI全流程開發,介紹如何使用昇思MindSpore框架構建U-Net網絡模型,使用線上昇騰澎湃算力在工業質檢的模擬數據集上進行訓練,并將保存的模型編譯生成適配昇騰AI處理器的離線模型,使用MindX SDK mxVision進行推理,從而實現圖像分割的任務。
前言
隨著新一輪科技革命和產業變革的加速演進,全球各國都在借助新技術推動制造業升級,從工業2.0自動化開始興起,到工業3.0信息化普及,如今正邁向工業4.0智能化。借助IoT、工業大數據、人工智能等先進技術實現從低端勞動密集型產業向高端科技型產業的制造升級。
在應用人工智能技術之前,部分場景下已出現傳統機器視覺進行質檢的案例。但是由于產品零件復雜、光源多樣等因素的限制,更多場景還是依賴于人工質檢。而人工智能技術的融合可進一步提升檢測精度,很多實踐已證明AI算法可實現高達99%以上檢測精度,可以應用在絕大多數工業質檢場景中,人工智能已經進入場景化應用時代。
從AI算法到工業制造場景化應用還有很遠,算法開發、應用開發、業務部署是阻礙AI應用進入工業生產的三大鴻溝。
為此,華為昇騰計算秉承“硬件開放、軟件開源”的理念,打造了昇騰智能制造使能平臺,致力于推進制造行業轉型升級。
在硬件方面,華為提供從模組/板卡到服務器/集群的Atlas系列化硬件。Atlas 200 AI加速模塊具有極致性能、超低功耗的特點,可以在端側實現物體識別、圖像分類等;Atlas 300I推理卡提供超強AI推理性能,以超強算力加速應用,可廣泛應用于推理場景。
在軟件方面,為了幫助開發者跨越AI應用落地制造行業的三大鴻溝,華為提供了全棧軟件平臺與工具。特別是昇騰應用使能MindX,幫助廣大應用開發者快速開發AI應用,讓AI進入制造行業。據介紹,MindX中包含了“2+1+X”,其中“2”是深度學習使能MindX DL和智能邊緣使能MindX Edge,幫助開發者快速搭建深度學習和邊緣推理的基礎平臺;“1”是優選模型庫ModelZoo,為開發者提供了各個場景下經過調優的模型,開發者只需根據自身場景需要,按需下載即可;最后是面向行業應用的SDK,華為已經在昇騰社區發布了面向智能制造場景的mxManufacture SDK和mxVision SDK,聚焦于工業質檢場景,能夠以很少的代碼量、甚至于零代碼完成制造行業AI應用開發。
簡介
在這里使用工業質檢場景中的模擬數據集,采用MindSpore深度學習框架構建U-Net網絡,在華為云平臺的ModelArts上創建基于昇騰910處理器的訓練環境,啟動訓練并得到圖像分割的模型;之后在華為云平臺的ECS彈性云服務器上創建基于昇騰310處理器的推理環境,將該模型轉換成離線模型,使用MindXSDKmxVision執行推理任務。
應用場景效果圖:
業務流層圖:
基于華為云平臺的ModelArts完成訓練
先來介紹一下基本概念!認識一下!
華為云 ModelArts 平臺
ModelArts 是面向開發者的一站式 AI 平臺,為機器學習與深度學習提供海量數據預處理及交互式智能標注、大規模分布式訓練、自動化模型生成,及端-邊-云模型按需部署能力,幫助用戶快速創建和部署模型,管理全周期 AI 工作流。
MindSpore深度學習框架
昇思MindSpore是一個全場景深度學習框架,旨在實現易開發、高效執行、全場景覆蓋三大目標,提供支持異構加速的張量可微編程能力,支持云、服務器、邊和端多種硬件平臺。
Ascend 910
昇騰910是一款具有超高算力的AI處理器,其最大功耗為310W,華為自研的達芬奇架構大大提升了其能效比。八位整數精度(INT8)下的性能達到640TOPS,16位浮點數(FP16)下的性能達到320 TFLOPS。
作為一款高集成度的片上系統(SoC),除了基于達芬奇架構的AI核外,昇騰910還集成了多個CPU、DVPP和任務調度器(Task Scheduler),因而具有自我管理能力,可以充分發揮其高算力的優勢。
昇騰910集成了HCCS、PCIe 4.0和RoCE v2接口,為構建橫向擴展(Scale Out)和縱向擴展(Scale Up)系統提供了靈活高效的方法。HCCS是華為自研的高速互聯接口,片內RoCE可用于節點間直接互聯。最新的PCIe 4.0的吞吐量比上一代提升一倍。
數據集
數據集模擬工業質檢場景,在Atlas200DK上標出藍色區域,作為檢測目標(前景),分為原始數據集和預處理后的數據集。
原始數據集raw_data的目錄結構如下:
├── raw_data
│ ├── annotations # 標注文件夾
│ │ ├── image_info_annotations.json # 圖像名稱、圖像寬度、高度等信息
│ │ ├── instances_annotations.json # 目標檢測、分割任務的數據集標注文件
│ │ ├── panoptic_annotations # 空文件夾
│ │ ├── panoptic_annotations.json # 全景標注信息
│ │ └── stuff_annotations.json # 材料標注信息
│ ├── annotations.xml # 分割信息、目標邊界框信息、目標面積、對應圖像id以及類別id等
│ └── images
│ ├── SW1hZ2VfMjAyMTA3MjcxNTA0MDAxNDA.jpg # 圖片
│ ├── SW1hZ2VfMjAyMTA3MjcxNTA0MDk1MzM.jpg
│ ├── SW1hZ2VfMjAyMTA3MjcxNTA0MDY1NDU.jpg
│ ├── SW1hZ2VfMjAyMTA3MjcxNTA0Mjc0NzA.jpg
│ ├── …
預處理后的數據集data的目錄結構如下:
.└─data
└─SW1hZ2VfMjAyMTA3MjcxNTA0MDAxNDA
├─image.png # 圖片
└─mask.png # 標簽
└─SW1hZ2VfMjAyMTA3MjcxNTA0MDk1MzM
├─image.png
└─mask.png ...
U-Net網絡
U-Net網絡是由FCN網絡衍生而來,最初是為了解決生物圖像的分割問題,在2015年ISBI細胞跟蹤競賽中,U-Net獲得了許多最佳獎項。由于分割效果好,U-Net被廣泛應用于圖像分割領域,如衛星圖像分割、工業瑕疵檢測等。
U-Net網絡具有如下特點:
全卷積網絡
U-Net網絡使用了 “全卷積網絡” ,可以使用很少的訓練圖像就能產生更精確的分割。全卷積網絡的主要思想是用連續的層來補充通常的收縮網絡,其中池化算子被上采樣算子取代。因此,這些層增加了輸出的分辨率。為了定位,將收縮路徑的高分辨率特征與上采樣輸出相結合。然后,一個連續的卷積層可以學習基于這個信息組裝一個更精確的輸出。因為全卷機網絡和上采樣在FCN網絡中已出現,在此不過多講述。
數據增強
當只有很少的訓練樣本可用時,可以通過數據增強來訓練網絡的不變性和魯棒性。顯微圖像需要具備平移和旋轉不變性,并且對形變和灰度變化魯棒。因此將訓練樣本進行隨機彈性形變是訓練分割網絡的關鍵。
上采樣
這里介紹上采樣中的反卷積(TransposedConvolution),是指在深度學習計算中,將圖像尺寸由小分辨率到大分辨率的映射操作。注意,反卷積只能恢復尺寸,不能恢復數值。
壓縮路徑和擴張路徑的U型結構
U-Net網絡是“編碼器(Encoder)—解碼器(Decoder)”網絡,是包含壓縮路徑(contractingpath)和擴張路徑(expandingpath)的U型結構。
其中,藍/白色框表示 feature map;藍色箭頭表示 3x3 卷積,用于特征提取;灰色箭頭表示 skip-connection,用于特征融合;紅色箭頭表示池化 pooling,用于降低維度;綠色箭頭表示上采樣 upsample,用于恢復維度;青色箭頭表示 1x1 卷積,用于輸出結果。同時,U-Net網絡采用了跳級結構(skipconnection),目的是為了融合特征信息,使深層和淺層的信息融合起來。還有CopyandCrop,先通過Crop操作使得融合的特征圖大小一致,之后再做Copy操作將兩張特征圖拼接(concatenation)起來。(copy and crop):在UNet有四個跳級結構,目的是為了融合特征信息,使深層和淺層的信息融合起來。不僅圖片大小要一致(crop操作),而且特征的維度(channels)也要一樣(copy操作)。Copy是指拼接操作(concatenation),Crop是指將圖片裁剪,即圖中的Copy and Crop操作。
紙上得來終覺淺,來看看U-Net相關網絡代碼(MindSpore):
class UNet(nn.Cell):
"""
Simple UNet with skip connection """
def __init__(self, in_channel, n_class=2, feature_scale=2, use_deconv=True, use_bn=True):
super(UNet, self).__init__()
self.in_channel = in_channel
self.n_class = n_class
self.feature_scale = feature_scale
self.use_deconv = use_deconv
self.use_bn = use_bn
filters = [64, 128, 256, 512, 1024]
filters = [int(x / self.feature_scale) for x in filters]
# Down Sample
self.maxpool = nn.MaxPool2d(kernel_size=2, stride=2, pad_mode="same")
self.conv0 = UnetConv2d(self.in_channel, filters[0], self.use_bn)
self.conv1 = UnetConv2d(filters[0], filters[1], self.use_bn)
self.conv2 = UnetConv2d(filters[1], filters[2], self.use_bn)
self.conv3 = UnetConv2d(filters[2], filters[3], self.use_bn)
self.conv4 = UnetConv2d(filters[3], filters[4], self.use_bn)
# Up Sample
self.up_concat1 = UnetUp(filters[1], filters[0], self.use_deconv, 2)
self.up_concat2 = UnetUp(filters[2], filters[1], self.use_deconv, 2)
self.up_concat3 = UnetUp(filters[3], filters[2], self.use_deconv, 2)
self.up_concat4 = UnetUp(filters[4], filters[3], self.use_deconv, 2)
# Finale Convolution
self.final = nn.Conv2d(filters[0], n_class, 1)
def construct(self, inputs):
x0 = self.conv0(inputs) # channel = filters[0]
x1 = self.conv1(self.maxpool(x0)) # channel = filters[1]
x2 = self.conv2(self.maxpool(x1)) # channel = filters[2]
x3 = self.conv3(self.maxpool(x2)) # channel = filters[3]
x4 = self.conv4(self.maxpool(x3)) # channel = filters[4]
up4 = self.up_concat4(x4, x3)
up3 = self.up_concat3(up4, x2)
up2 = self.up_concat2(up3, x1)
up1 = self.up_concat1(up2, x0)
final = self.final(up1)
return final
那么趕緊來ModelArts實踐吧!
在ModelArts執行訓練
說明
這里以腳本方式運行,可以在Notebook環境的終端執行(可參照“終端運行示例”的命令行),也可在Notebook環境中新建MindSpore的內核環境執行(可參照“運行腳本”的命令行)。
注意:Notebook環境內上傳、創建和編輯的文件均在/home/ma-user/work目錄下。
1. 創建NoteBook環境
我們登錄ModelArts,找到新版NoteBook:
選擇如下環境:
2. 下載完整工程
在Notebook環境內新建終端,執行如下代碼,將項目代碼unet.zip下載至云端環境內,并解壓。注意以下在Treminal
中執行,注意要切換到work
目錄:
終端運行示例:
ls
cd work
wget https://alexed.obs.cn-north-4.myhuaweicloud.com/unet.zip
unzip unet.zip
運行腳本:
!wget https://alexed.obs.cn-north-4.myhuaweicloud.com/unet.zip
!unzip unet.zip
這里試試終端運行,先來下載工程
執行解壓縮:
運行完成截圖:
這里需要注意,如果解壓縮的時候報錯了,就將壓縮包鏈接復制到瀏覽器打開,會自動下載到電腦本地,之后解壓縮,再壓縮成.zip
文件,之后再上傳到NoteBook,之后再解壓就行了。切記,一定是先解壓,后壓縮,不要直接上傳,因為還是會報錯的。
我們可以得到工程完整目錄結構:
├──unet
├──README.md
├──data // 預處理后的數據集文件夾
├──raw_data // 原始數據集
├──out_model
│ ├──om_script.sh // air模型轉om腳本
│ ├──unet_hw960_bs1.air // 訓練后的air文件
│ ├──unet_hw960_bs1_noAIPP.om // om文件,用于推理
├──pred_visualization // 可視化圖片保存文件
├──src // 功能函數
│ ├──unet_medical // U-Net網絡
│ ├──unet_nested // U-Net++網絡
│ ├──config.py // 配置文件
│ ├──data_loader.py // 數據加載
│ ├──eval_callback.py // 訓練時評估回調
│ ├──loss.py // 損失函數
│ ├──utils.py // 工具類函數
├──draw_result_folder.py // 文件夾圖片可視化
├──draw_result_single.py // 單張圖片可視化
├──eval.py // 模型驗證
├──export.py // 模型導出,ckpt轉air/mindir/onnx
├──postprocess.py // 后處理
├──preprocess.py // 前處理
├──preprocess_dataset.py // 數據集預處理
├──train.py // 模型訓練
├──requirements.txt
3. 配置文件參數
文件參數腳本為src/config.py
,包括unet_medical,unet_nested,unet_nested_cell,unet_simple,unet_simple_coco,共5種配置,表示模型與數據集之間的組合。
這里使用unet_simple_coco,表示使用unet模型,配合coco格式數據集進行訓練,因此可根據實際開發情況修改cfg_unet_simple_coco內的參數。
4. 數據集預處理
數據集預處理是指將類coco數據集轉化成模型訓練需要數據格式。MindSpore數據集預處理需調用腳本src/ config.py
。預計數據集預處理所需時間約為10分鐘。這里既可以在終端運行,也可以在Notebook環境中新建MindSpore的內核環境執行。
終端運行示例:
python3 preprocess_dataset.py --data_url=./data/
–data_url:數據集預處理后的保存路徑。
運行腳本:
!python3 preprocess_dataset.py --data_url=./data/
運行截圖:
注意:預處理完的數據集會保存在/unet/data/文件夾下。
5. 模型訓練
MindSpore模型訓練需調用如下腳本:
preprocess_dataset.py:將類coco數據集轉化成模型訓練需要數據格式。
src/unet_xxx/:存放unet/unet++模型結構。
src/data_loader.py:存放數據加載功能函數。
src/eval_callback:存放cb函數,用于訓練過程中進行eval
src/utils.py:mindspore自定義cb函數,自定義metrics函數。
train.py
預計模型訓練所需時間約為20分鐘。
終端運行示例:
python train.py --data_url=./data/ --run_eval=True
–data_url:數據集輸入路徑。
–run_eval:True表示訓練過程中同時進行驗證。
運行腳本:
!python train.py --data_url=./data/ --run_eval=True
運行截圖:
最終運行結果:
經過5輪的訓練,圖像分割模型已趨近收斂,并已找到最優Dice系數(Dice coefficient),說明模型預測值和標簽的最高相似度達到大約0.9968。
注:Dice系數是一種度量集合相似度的函數,通常用于計算兩個樣本的相似度(取值范圍為[0,1])。
6. 推理驗證
MindSpore模型推理需調用如下腳本:
src/unet_xxx/:存放unet/unet++模型結構。
src/data_loader.py:存放數據預處理,數據加載功能函數。
src/utils.py:mindspore自定義cb函數,自定義metrics函數。
eval.py
終端運行示例:
python eval.py --data_url=./data/ --ckpt_path=./ckpt_0/best.ckpt
–data_url:數據集輸入路徑。
–ckpt_path:ckpt讀取路徑。
運行腳本:
!python eval.py --data_url=./data/ --ckpt_path=./ckpt_0/best.ckpt
運行截圖:
最終運行結果截圖:
經過交叉驗證,Dice系數為0.9978,IOU系數為0.9954,說明模型在驗證集表現優異。
注:IOU(Intersection over Union)是一個度量函數,用來描述兩個物體邊界框的重疊程度(取值范圍為[0,1]),重疊的區域越大,IOU值就越大。
7. 結果可視化
可以通過畫圖的方式將圖像的結果可視化,方便查看。可視化方法有兩種:
draw_result_single.py:單張圖片可視化,輸出單張圖片的裁剪畫圖結果crop_plot.png和模型預測的結果predict_plot.png。
draw_result_folder.py:文件夾圖片可視化,輸出文件夾內圖片的模型預測結果predict.png。
單張圖片可視化,終端運行示例:
python draw_result_single.py --data_url=./data/SW1hZ2VfMjAyMTA3MjcxNTE2MzYzNzk --save_url=./pred_visualization --ckpt_path=./ckpt_0/best.ckpt
–data_url:數據集輸入路徑(到單張圖像)。
–save_url:輸出圖像保存路徑。
–ckpt_path:ckpt讀取路徑。
運行腳本:
!python draw_result_single.py --data_url=./data/SW1hZ2VfMjAyMTA3MjcxNTE2MzYzNzk --save_url=./pred_visualization --ckpt_path=./ckpt_0/best.ckpt
最終運行得到結果:
這是直接將運行結果繪制到原圖上的結果,紅色部分是預測的結果,其實還有藍色的區域(標簽),但是幾乎看不到藍色區域了,因為幾乎全部被紅色的預測結果覆蓋了,可以預測準確度很高啊。
文件夾圖片可視化,終端運行示例:
python draw_result_folder.py --data_url=./data/ --save_url=./pred_visualization --ckpt_path=./ckpt_0/best.ckpt
–data_url:數據集輸入路徑(到圖像文件夾)。
–save_url:輸出圖像保存路徑。
–ckpt_path:ckpt讀取路徑。
運行腳本:
!python draw_result_folder.py --data_url=./data/ --save_url=./pred_visualization --ckpt_path=./ckpt_0/best.ckpt
運行截圖:
8. 模型保存
如果想在昇騰AI處理器上執行推理,可以通過網絡定義和CheckPoint生成AIR格式模型文件。
終端運行示例:
python export.py --ckpt_file="./ckpt_0/best.ckpt" --width=960 --height=960 --file_name="out_model/unet_hw960_bs1" --file_format="AIR"
ckpt_file:ckpt路徑。
width:模型輸入尺寸。
height:模型輸入尺寸。
file_name:輸出文件名。
file_format:輸出格式,必須為[“ONNX”, “AIR”, “MINDIR”]。
運行腳本:
!python export.py --ckpt_file="./ckpt_0/best.ckpt" --width=960 --height=960 --file_name="out_model/unet_hw960_bs1" --file_format="AIR"
輸出結果:
out_model/unet_hw960_bs1.air
最后將unet_hw960_bs1.air
模型下載至本地,供后續MindX SDK推理實驗使用。
貼心提示:結束后請及時停止Notebook訓練作業,避免資源浪費和額外花費!!!
基于華為云平臺的ECS完成部署
讓我們先來認識一下!
華為云 ECS 平臺
彈性云服務器(Elastic Cloud Server, ECS)是一種云上可隨時自助獲取、可彈性伸縮的計算服務,可幫助您打造安全、可靠、靈活、高效的應用環境。
Ascend 310
昇騰310是一款高效、靈活、可編程的AI處理器。基于典型配置,八位整數精度(INT8)下的性能達到22TOPS,16位浮點數(FP16)下的性能達到11 TFLOPS,而其功耗僅為8W。昇騰310芯片采用華為自研的達芬奇架構,集成了豐富的計算單元,在各個領域得到廣泛應用。隨著全AI業務流程的加速,昇騰310芯片能夠使智能系統的性能大幅提升,部署成本大幅降低。
昇騰310在功耗和計算能力等方面突破了傳統設計的約束。隨著能效比的大幅提升,昇騰310將人工智能從數據中心延伸到邊緣設備,為平安城市、自動駕駛、云服務和IT智能、智能制造、機器人等應用場景提供了全新的解決方案,使能智慧未來。
搭建環境
這里需要購買ECS服務-Ai1資源,并進行環境的配置和升級,我們主要介紹下其中的cmake
的升級部分。提醒下,以下操作基本全部以腳本方式運行,可以直接在彈性云服務器的終端執行,推薦使用MobaXterm連接ECS。
注意cmake
的升級過程耗時較長,請合理安排時間
1. 更新軟件
sudo apt update # 更新軟件列表
sudo apt upgrade # 更新軟件
sudo apt autoremove # 清除不必要的依賴
sudo apt autoclean # 清除緩存
sudo apt clean # 清除軟件包緩存
最終運行完成效果圖:
2. 更新cmake
首先,清除舊版camke
(3.10.2):
sudo apt autoremove cmake
運行完成效果圖:
接下來下載并解壓新版cmake
(3.20.1)
mkdir codes # 創建codes文件夾
cd codes # 進入codes文件夾
wget https://github.com/Kitware/CMake/archive/refs/tags/v3.20.1.tar.gz --no-check-certificate # 下載
tar -zxvf v3.20.1.tar.gz # 解壓
cd CMake-3.20.1
運行完成效果圖:
安裝cmake
./bootstrap
make
sudo make install
運行完成效果圖:
返回主目錄:
cd
ECS部署
1. 下載項目代碼
這里可以直接復制如下鏈接到瀏覽器打開,會自動下載到本地,之后將項目文件unet_sdk.zip上傳至華為云ECS彈性云服務器/root/目錄下,并解壓。
https://alexed.obs.cn-north-4.myhuaweicloud.com/unet_sdk.zip
或者像之前在NoteBook下載工程文件那樣,直接在ECS的終端通過wget
命令下載,直接下載到ECS:
wget https://alexed.obs.cn-north-4.myhuaweicloud.com/unet_sdk.zip
然后,將之前訓練完成的unet_hw960_bs1.air
模型上傳至服務器/root/unet_sdk/model/目錄下。
項目文件目錄為:
├── unet_sdk
├── README.md
├── data //數據集
│ ├── 1
│ │ ├──image.png //圖片
│ │ ├──mask.png //標簽│ ...
├── model
│ ├──air2om.sh // air模型轉om腳本
│ ├──xxx.air //air模型
│ ├──xxx.om //om模型
│ ├──aipp_unet_simple_opencv.cfg // aipp文件
├── pipeline
│ ├──unet_simple_opencv.pipeline // pipeline文件
├── main.py // 推理文件
├── run.sh // 執行文件
├── requirements.txt // 需要的三方庫
2. 模型轉換
這里要將unet_hw960_bs1.air
模型轉為昇騰AI處理器支持的.om格式離線模型,此處模型轉換需要用到ATC工具。
那么順便聊聊ATC工具,昇騰張量編譯器(Ascend Tensor Compiler,簡稱ATC)是昇騰CANN架構體系下的模型轉換工具,它可以將開源框架的網絡模型或Ascend IR定義的單算子描述文件(json格式)轉換為昇騰AI處理器支持的.om格式離線模型。模型轉換過程中可以實現算子調度的優化、權值數據重排、內存使用優化等,可以脫離設備完成模型的預處理。
部分參數展示如下,更多詳情請參考文檔。
這里我們要運行腳本:
cd /root/unet_sdk/model/ # 切換至模型存儲目錄
atc --framework=1 --model=unet_hw960_bs1.air --output=unet_hw960_bs1 --input_format=NCHW --soc_version=Ascend310 --log=error --insert_op_conf=aipp_unet_simple_opencv.cfg
framework:原始框架類型。
model:原始模型文件路徑與文件名。
output:轉換后的離線模型的路徑以及文件名。
input_format:輸入數據格式。
soc_version:模型轉換時指定芯片版本。
log:顯示日志的級別。
insert_op_conf:插入算子的配置文件路徑與文件名,這里使用AIPP預處理配置文件,用于圖像數據預處理。
如果運行結果顯示ATC run success
,表示模型轉換成功,得到unet_hw960_bs1.om模型。模型轉換成功之后,可以使用MindX SDK mxVision運行腳本,在Ascend 310上進行推理。
注意air模型轉om只支持靜態batch,這里batchsize=1。
3. MindX SDK mxVision 執行推理
MindX SDK執行推理的業務流程:
通過stream配置文件,Stream manager可識別需要構建的element以及element之間的連接關系,并啟動業務流程。Stream manager對外提供接口,用于向stream發送數據和獲取結果,幫助用戶實現業務對接。
plugin表示業務流程中的基礎模塊,通過element的串接構建成一個stream。buffer用于內部掛載解碼前后的視頻、圖像數據,是element之間傳遞的數據結構,同時也允許用戶掛載元數據(Metadata),用于存放結構化數據(如目標檢測結果)或過程數據(如縮放后的圖像)。
這里簡要介紹下MindX SDK基礎概念:
更多詳情可參考文檔。
MindX SDK業務流程編排:
Stream配置文件以json格式編寫,用戶必須指定業務流名稱、元件名稱和插件名稱,并根據需要,補充元件屬性和下游元件名稱信息。
以下為本次部署所用pipeline/unet_simple_opencv.pipeline
文件內容如下,可根據實際開發情況進行修改。
{
"unet_mindspore": {
"stream_config": {
"deviceId": "0"
},
"appsrc0": {
"props": {
"blocksize": "4096000"
},
"factory": "appsrc",
"next": "mxpi_imagedecoder0"
},
"mxpi_imagedecoder0": {
"props": {
"cvProcessor": "opencv",
"outputDataFormat": "BGR"
},
"factory": "mxpi_imagedecoder",
"next": "mxpi_imagecrop0"
},
"mxpi_imagecrop0": {
"props": {
"cvProcessor": "opencv",
"dataSource": "ExternalObjects"
},
"factory": "mxpi_imagecrop",
"next": "mxpi_imageresize0"
},
"mxpi_imageresize0": {
"props": {
"handleMethod": "opencv",
"resizeType": "Resizer_Stretch",
"resizeHeight": "960",
"resizeWidth": "960"
},
"factory": "mxpi_imageresize",
"next": "mxpi_tensorinfer0"
},
"mxpi_tensorinfer0": {
"props": {
"dataSource": "mxpi_imageresize0",
"modelPath": "model/unet_hw960_bs1_AIPP.om"
},
"factory": "mxpi_tensorinfer",
"next": "mxpi_dumpdata0"
},
"mxpi_dumpdata0": {
"props": {
"requiredMetaDataKeys": "mxpi_tensorinfer0"
},
"factory": "mxpi_dumpdata",
"next": "appsink0"
},
"appsink0": {
"props": {
"blocksize": "4096000"
},
"factory": "appsink"
}
}}
對于其的詳細介紹如下:
這里要針對性做些修改:
首先,修改modelPath
。打開pipeline/unet_simple_opencv.pipeline
文件,將mxpi_tensorinfer0
元件的屬性modelPath
(模型導入路徑)修改為之前模型轉換后保存的模型model/unet_hw960_bs1.om
。修改后結果為:
"modelPath": "model/unet_hw960_bs1.om"
接下來就可以運行腳本試試了。先激活mxVision環境變量:
. /root/mxVision/set_env.sh
之后,運行腳本:
cd /root/unet_sdk/ # 切換至推理腳本目錄
bash run.sh
運行結果:
注意:由于MindX SDK默認日志級別為debug,此日志級別下,dump_data插件會將所有內容打印至終端,影響日志查看。因此可以通過修改日志級別的方式,避免打印不必要的信息。具體修改方法如下:
修改日志:
vi $MX_SDK_HOME/config/logging.conf
按i
鍵修改 Line23行,日志級別可改為0或1或2。
# Log level: -1-debug, 0-info, 1-warn, 2-error, 3-fatal
global_level=0
單擊鍵盤的Esc
鍵,輸入:wq!
,保存并退出。
提醒:實驗結束后請及時關閉/刪除ECS彈性云服務器,避免資源浪費和額外花費。
結語
回顧整個過程,主要介紹如何使用MindSpore框架構建U-Net網絡模型,使用線上昇騰算力在工業質檢的模擬數據集上進行訓練,并將保存的模型編譯生成適配昇騰AI處理器的離線模型,部署在華為云ECS上,使用MindX SDK mxVision進行推理,從而實現圖像分割的任務。通過這次體驗,可以了解工業質檢的背景,掌握MindSpore的基礎使用,熟悉U-Net網絡和圖像分割的原理知識,掌握華為云ModelArts和ECS的環境搭建,熟悉昇騰910和昇騰310處理器的使用,掌握離線模型的轉換方法,以及熟悉MindX SDK mxVision的使用。
總的來說,還是很不錯的,能夠感受到華為基于軟硬件協同打造云端邊的全棧全場景AI解決方案的發展和成熟,已經比最初我剛剛接觸的時候不可同日而語,發展迅速,展示出了蓬勃的生命力和廣闊的發展前景,期待未來的更多驚喜。
轉載請在文章開頭和結尾顯眼處標注:作者、出處和鏈接。不按規范轉載侵權必究。
未經授權嚴禁轉載,授權事宜請聯系作者本人,侵權必究。
本文禁止轉載,侵權必究。
授權事宜請至數英微信公眾號(ID: digitaling) 后臺授權,侵權必究。
評論
評論
推薦評論
暫無評論哦,快來評論一下吧!
全部評論(0條)