文章作者:
本系列文章將在AI 愛克斯開發板上使用 OpenVINO開發套件依次部署并測評 YOLOv8 的分類模型、目標檢測模型、實例分割模型和人體姿態估計模型。
接下來,本文將介紹在AI 愛克斯開發板上搭建 OpenVINO 推理程序的開發環境、導出并優化 YOLOv8 分類模型、完成 YOLOv8 分類模型的推理程序,最后給出實測性能。
請先下載本文的代碼倉:
git clone https://gitee.com/ppov-nuc/yolov8_openvino.git
1YOLOv8 簡介
YOLOv8 是 Ultralytics 公司基于 YOLO 框架,發布的一款面向物體檢測與跟蹤、實例分割、圖像分類和姿態估計任務的 SOTA 模型工具套件。
只需要幾行 Python 代碼,或者一行命令,即可完成在自己的數據集上從頭訓練 (Training a model from scratch) 或者微調(Fine-tune) YOLOv8 模型。

用 Python 代碼訓練 YOLOv8 模型

用命令行訓練 YOLOv8 模型
導出訓練好的 YOLOv8 模型,并用 OpenVINO 部署在英特爾硬件平臺上,也非常方便,下面依次介紹。
2準備 YOLOv8 的
OpenVINO 推理程序開發環境
請基于本文范例代碼倉提供的 requirements.txt 文件,通過一行命令完成開發環境安裝。
# 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
向右滑動查看完整代碼
一行命令完成開發環境安裝。
pip install -r requirements.txt
3導出 YOLOv8 OpenVINOIR 模型
YOLOv8 的分類模型有5種,在 ImageNet 數據集上的精度如下表所示。

首先使用命令:
yolo classify export model=yolov8n-cls.pt format=onnx imgsz=224
完成 yolov8n-cls.onnx 模型導出,如下圖所示。

然后使用命令:
mo -m yolov8n-cls.onnx --compress_to_fp16,
優化并導出 FP16 精度的 OpenVINO IR 格式模型,如下圖所示。

4用 benchmark_app 測試 YOLOv8 分類模型的推理計算性能
benchmark_app 是 OpenVINO 工具套件自帶的 AI 模型推理計算性能測試工具,可以指定在不同的計算設備上,在同步或異步模式下,測試出不帶前后處理的純AI 模型推理計算性能。
使用命令:benchmark_app -m yolov8n-cls.xml -d GPU ,獲得 yolov8n-cls.xml 模型在 AI 愛克斯開發板的集成顯卡上的異步推理計算性能,如下圖所示。

5使用 OpenVINO Python API 編寫 YOLOv8 分類模型推理程序
基于 OpenVINO Python API 的 YOLOv8 分類模型范例程序 yolov8_cls_ov_sync_infer.py 的核心源代碼,如下所示:
# 實例化Core對象
core = Core()
# 載入并編譯模型
net = core.compile_model(f'{MODEL_NAME}-cls.xml', device_name="GPU")
# 獲得模型輸入輸出節點
input_node = net.inputs[0] # yolov8n-cls只有一個輸入節點
N, C, H, W = input_node.shape # 獲得輸入張量的形狀
output_node = net.outputs[0] # yolov8n-cls只有一個輸出節點
ir = net.create_infer_request()
##########################################
# ---根據模型定義預處理和后處理函數-------
##########################################
# 定義預處理函數
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
# 定義后處理函數
def postprocess(outs):
score = np.max(outs)
id = np.argmax(outs)
return score, id, imagenet_labels[id]
##########################################
# ----- AI同步推理計算 ------------
##########################################
# 采集圖像
image = cv2.imread("bus.jpg")
# 數據預處理
blob = preprocess(image)
# 執行推理計算并獲得結果
outs = ir.infer(blob)[output_node]
# 對推理結果進行后處理
score, id, label = postprocess(outs)
# 顯示處理結果
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()
向右滑動查看完整代碼
運行結果如下圖所示:

6
使用 OpenVINO 預處理 API 提升推理計算性能
參考《將數據預處理嵌入 AI 模型的常見技巧》,使用 OpenVINO 預處理 API ,將數據預處理嵌入 YOLOv8 分類模型,可以進一步提高推理設備(例如,英特爾集成顯卡/獨立顯卡)的利用率,進而提高包含前后處理的端到端的AI 推理計算性能。
使用 OpenVINO預處理 API 將預處理嵌入模型的范例程序 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')
向右滑動查看完整代碼
運行結果,如下圖所示:

基于內嵌預處理模型的推理程序
yolov8_cls_ppp_sync_infer.py 的核心代碼,如下所示
##########################################
# ----- AI同步推理計算 ------------
##########################################
# 采集圖像
image = cv2.imread("bus.jpg")
blob = np.expand_dims(image,0)
# 執行推理計算并獲得結果
outs = ir.infer(blob)[output_node]
# 對推理結果進行后處理
score, id, label = postprocess(outs)
##########################################
# ----- 統計帶前后預處理的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)
向右滑動查看完整代碼
運行結果,如下所示:

結論
AI 愛克斯開發板借助N5105處理器的集成顯卡(24個執行單元)和 OpenVINO ,可以在 YOLOv8 的分類模型上獲得相當不錯的性能。
通過異步處理和AsyncInferQueue ,還能進一步提升計算設備的利用率,提高 AI 推理程序的吞吐量。下一篇將繼續介紹在《在 AI 愛克斯開發板上用 OpenVINO 加速 YOLOv8 目標檢測模型》。
-
英特爾
+關注
關注
61文章
10301瀏覽量
180411 -
AI
+關注
關注
91文章
39755瀏覽量
301347 -
開發板
+關注
關注
26文章
6289瀏覽量
118039 -
模型
+關注
關注
1文章
3751瀏覽量
52097 -
python
+關注
關注
57文章
4876瀏覽量
90022
原文標題:在AI愛克斯開發板上用OpenVINO?加速YOLOv8分類模型 | 開發者實戰
文章出處:【微信號:英特爾物聯網,微信公眾號:英特爾物聯網】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
單板挑戰4路YOLOv8!米爾瑞芯微RK3576開發板性能實測
【愛芯派 Pro 開發板試用體驗】yolov8模型轉換
?在AI愛克斯開發板上用OpenVINO加速YOLOv8-seg實例分割模型
教你如何用兩行代碼搞定YOLOv8各種模型推理
用OpenVINO? C++ API編寫YOLOv8-Seg實例分割模型推理程序
三種主流模型部署框架YOLOv8推理演示
基于哪吒開發板部署YOLOv8模型
RV1126 yolov8訓練部署教程
使用ROCm?優化并部署YOLOv8模型
在AI愛克斯開發板上用OpenVINO?加速YOLOv8分類模型
評論