文章作者:
英特爾物聯(lián)網(wǎng)行業(yè)創(chuàng)新大使 楊雪鋒
本系列文章將在AI 愛(ài)克斯開(kāi)發(fā)板上使用 OpenVINO開(kāi)發(fā)套件依次部署并測(cè)評(píng) YOLOv8 的分類模型、目標(biāo)檢測(cè)模型、實(shí)例分割模型和人體姿態(tài)估計(jì)模型。
接下來(lái),本文將介紹在AI 愛(ài)克斯開(kāi)發(fā)板上搭建 OpenVINO 推理程序的開(kāi)發(fā)環(huán)境、導(dǎo)出并優(yōu)化 YOLOv8 分類模型、完成 YOLOv8 分類模型的推理程序,最后給出實(shí)測(cè)性能。
請(qǐng)先下載本文的代碼倉(cāng):
git clone https://gitee.com/ppov-nuc/yolov8_openvino.git
1YOLOv8 簡(jiǎn)介
YOLOv8 是 Ultralytics 公司基于 YOLO 框架,發(fā)布的一款面向物體檢測(cè)與跟蹤、實(shí)例分割、圖像分類和姿態(tài)估計(jì)任務(wù)的 SOTA 模型工具套件。
只需要幾行 Python 代碼,或者一行命令,即可完成在自己的數(shù)據(jù)集上從頭訓(xùn)練 (Training a model from scratch) 或者微調(diào)(Fine-tune) YOLOv8 模型。
用 Python 代碼訓(xùn)練 YOLOv8 模型
用命令行訓(xùn)練 YOLOv8 模型
導(dǎo)出訓(xùn)練好的 YOLOv8 模型,并用 OpenVINO 部署在英特爾硬件平臺(tái)上,也非常方便,下面依次介紹。
2準(zhǔn)備 YOLOv8 的
OpenVINO 推理程序開(kāi)發(fā)環(huán)境
請(qǐng)基于本文范例代碼倉(cāng)提供的 requirements.txt 文件,通過(guò)一行命令完成開(kāi)發(fā)環(huán)境安裝。
# Usage: pip install -r requirements.txt ultralytics # Base ---------------------------------------- matplotlib>=3.2.2 numpy>=1.21.6 opencv-python>=4.6.0 Pillow>=7.1.2 PyYAML>=5.3.1 requests>=2.23.0 scipy>=1.4.1 torch==1.13.1 torchvision==0.14.1 tqdm>=4.64.0 # Plotting ------------------------------------ pandas>=1.1.4 seaborn>=0.11.0 # Export -------------------------------------- onnx>=1.12.0 # ONNX export onnxruntime openvino-dev==2023.0.0.dev20230407 # modify the openvino-dev version to the latest one # Extras -------------------------------------- psutil # system utilization thop>=0.1.1 # FLOPs computation
向右滑動(dòng)查看完整代碼
一行命令完成開(kāi)發(fā)環(huán)境安裝。
pip install -r requirements.txt
3導(dǎo)出 YOLOv8 OpenVINOIR 模型
YOLOv8 的分類模型有5種,在 ImageNet 數(shù)據(jù)集上的精度如下表所示。
首先使用命令:
yolo classify export model=yolov8n-cls.pt format=onnx imgsz=224
完成 yolov8n-cls.onnx 模型導(dǎo)出,如下圖所示。
然后使用命令:
mo -m yolov8n-cls.onnx --compress_to_fp16,
優(yōu)化并導(dǎo)出 FP16 精度的 OpenVINO IR 格式模型,如下圖所示。
4用 benchmark_app 測(cè)試 YOLOv8 分類模型的推理計(jì)算性能
benchmark_app 是 OpenVINO 工具套件自帶的 AI 模型推理計(jì)算性能測(cè)試工具,可以指定在不同的計(jì)算設(shè)備上,在同步或異步模式下,測(cè)試出不帶前后處理的純AI 模型推理計(jì)算性能。
使用命令:benchmark_app -m yolov8n-cls.xml -d GPU ,獲得 yolov8n-cls.xml 模型在 AI 愛(ài)克斯開(kāi)發(fā)板的集成顯卡上的異步推理計(jì)算性能,如下圖所示。
5使用 OpenVINO Python API 編寫 YOLOv8 分類模型推理程序
基于 OpenVINO Python API 的 YOLOv8 分類模型范例程序 yolov8_cls_ov_sync_infer.py 的核心源代碼,如下所示:
# 實(shí)例化Core對(duì)象 core = Core() # 載入并編譯模型 net = core.compile_model(f'{MODEL_NAME}-cls.xml', device_name="GPU") # 獲得模型輸入輸出節(jié)點(diǎn) input_node = net.inputs[0] # yolov8n-cls只有一個(gè)輸入節(jié)點(diǎn) N, C, H, W = input_node.shape # 獲得輸入張量的形狀 output_node = net.outputs[0] # yolov8n-cls只有一個(gè)輸出節(jié)點(diǎn) ir = net.create_infer_request() ########################################## # ---根據(jù)模型定義預(yù)處理和后處理函數(shù)------- ########################################## # 定義預(yù)處理函數(shù) def preprocess(image, new_shape=(W,H)): # Preprocess image data from OpenCV image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) # BGR->RGB resized = cv2.resize(image, new_shape) # Resize Image norm = (resized - IMAGENET_MEAN) / IMAGENET_STD # Normalization blob = np.transpose(norm, (2, 0, 1)) # HWC->CHW blob = np.expand_dims(blob, 0) # CHW->NCHW return blob # 定義后處理函數(shù) def postprocess(outs): score = np.max(outs) id = np.argmax(outs) return score, id, imagenet_labels[id] ########################################## # ----- AI同步推理計(jì)算 ------------ ########################################## # 采集圖像 image = cv2.imread("bus.jpg") # 數(shù)據(jù)預(yù)處理 blob = preprocess(image) # 執(zhí)行推理計(jì)算并獲得結(jié)果 outs = ir.infer(blob)[output_node] # 對(duì)推理結(jié)果進(jìn)行后處理 score, id, label = postprocess(outs) # 顯示處理結(jié)果 msg = f"YOLOv5s-cls Result:{label}, Score:{score:4.2f}, FPS:{FPS:4.2f}" cv2.putText(image, msg, (10, 50), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (100, 100, 200), 2) cv2.imshow("YOLOv5s-cls OpenVINO Sync Infer Demo",image) cv2.waitKey() cv2.destroyAllWindows()
向右滑動(dòng)查看完整代碼
運(yùn)行結(jié)果如下圖所示:
6
使用 OpenVINO 預(yù)處理 API 提升推理計(jì)算性能
參考《將數(shù)據(jù)預(yù)處理嵌入 AI 模型的常見(jiàn)技巧》,使用 OpenVINO 預(yù)處理 API ,將數(shù)據(jù)預(yù)處理嵌入 YOLOv8 分類模型,可以進(jìn)一步提高推理設(shè)備(例如,英特爾集成顯卡/獨(dú)立顯卡)的利用率,進(jìn)而提高包含前后處理的端到端的AI 推理計(jì)算性能。
使用 OpenVINO預(yù)處理 API 將預(yù)處理嵌入模型的范例程序 export_yolov8_cls_ppp.py 的核心代碼,如下所示:
# ======== Step 0: read original model ========= core = Core() model = core.read_model(f"{MODEL_NAME}-cls.xml") # Step 1: Add Preprocessing steps to a model == ppp = PrePostProcessor(model) # Declare User’s Data Format ppp.input().tensor() .set_element_type(Type.u8) .set_spatial_dynamic_shape() .set_layout(Layout('NHWC')) .set_color_format(ColorFormat.BGR) # Declaring Model Layout ppp.input().model().set_layout(Layout('NCHW')) # Explicit preprocessing steps. Layout conversion will be done automatically as last step ppp.input().preprocess() .convert_element_type() .convert_color(ColorFormat.RGB) .resize(ResizeAlgorithm.RESIZE_LINEAR) .mean([123.675, 116.28, 103.53]) .scale([58.624, 57.12, 57.375]) # Integrate preprocessing Steps into a Model print(f'Dump preprocessor: {ppp}') model_with_ppp = ppp.build() # ======== Step 2: Save the model with preprocessor================ serialize(model_with_ppp, f'{MODEL_NAME}-cls_ppp.xml', f'{MODEL_NAME}-cls_ppp.bin')
向右滑動(dòng)查看完整代碼
運(yùn)行結(jié)果,如下圖所示:
基于內(nèi)嵌預(yù)處理模型的推理程序
yolov8_cls_ppp_sync_infer.py 的核心代碼,如下所示
########################################## # ----- AI同步推理計(jì)算 ------------ ########################################## # 采集圖像 image = cv2.imread("bus.jpg") blob = np.expand_dims(image,0) # 執(zhí)行推理計(jì)算并獲得結(jié)果 outs = ir.infer(blob)[output_node] # 對(duì)推理結(jié)果進(jìn)行后處理 score, id, label = postprocess(outs) ########################################## # ----- 統(tǒng)計(jì)帶前后預(yù)處理的AI推理性能------ ########################################## start = time.time() N = 1000 for i in range(N): blob = np.expand_dims(image,0) outs = ir.infer(blob)[output_node] score, id, label = postprocess(outs) FPS = N / (time.time() - start)
向右滑動(dòng)查看完整代碼
運(yùn)行結(jié)果,如下所示:
結(jié)論
AI 愛(ài)克斯開(kāi)發(fā)板借助N5105處理器的集成顯卡(24個(gè)執(zhí)行單元)和 OpenVINO ,可以在 YOLOv8 的分類模型上獲得相當(dāng)不錯(cuò)的性能。
通過(guò)異步處理和AsyncInferQueue ,還能進(jìn)一步提升計(jì)算設(shè)備的利用率,提高 AI 推理程序的吞吐量。下一篇將繼續(xù)介紹在《在 AI 愛(ài)克斯開(kāi)發(fā)板上用 OpenVINO 加速 YOLOv8 目標(biāo)檢測(cè)模型》。
-
英特爾
+關(guān)注
關(guān)注
61文章
10169瀏覽量
173978 -
AI
+關(guān)注
關(guān)注
87文章
34294瀏覽量
275485 -
開(kāi)發(fā)板
+關(guān)注
關(guān)注
25文章
5538瀏覽量
102482 -
模型
+關(guān)注
關(guān)注
1文章
3488瀏覽量
50021 -
python
+關(guān)注
關(guān)注
56文章
4825瀏覽量
86226
原文標(biāo)題:在AI愛(ài)克斯開(kāi)發(fā)板上用OpenVINO?加速YOLOv8分類模型 | 開(kāi)發(fā)者實(shí)戰(zhàn)
文章出處:【微信號(hào):英特爾物聯(lián)網(wǎng),微信公眾號(hào):英特爾物聯(lián)網(wǎng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
【愛(ài)芯派 Pro 開(kāi)發(fā)板試用體驗(yàn)】yolov8模型轉(zhuǎn)換
YOLOv8自定義數(shù)據(jù)集訓(xùn)練到模型部署推理簡(jiǎn)析
?在AI愛(ài)克斯開(kāi)發(fā)板上用OpenVINO加速YOLOv8-seg實(shí)例分割模型

教你如何用兩行代碼搞定YOLOv8各種模型推理

用OpenVINO? C++ API編寫YOLOv8-Seg實(shí)例分割模型推理程序

三種主流模型部署框架YOLOv8推理演示
用自己的數(shù)據(jù)集訓(xùn)練YOLOv8實(shí)例分割模型

基于YOLOv8的自定義醫(yī)學(xué)圖像分割

基于哪吒開(kāi)發(fā)板部署YOLOv8模型

RV1126 yolov8訓(xùn)練部署教程

評(píng)論