為什么需要OpenVINO?
OpenVINO(Open Visual Inference and Neural network Optimization)是英特爾推出的一種深度學(xué)習(xí)推理工具包,旨在優(yōu)化和加速深度學(xué)習(xí)模型的推理過程。將模型轉(zhuǎn)換為OpenVINO格式的主要優(yōu)勢(shì)有:
性能優(yōu)化:OpenVINO能夠針對(duì)英特爾硬件進(jìn)行優(yōu)化,包括 CPU、GPU、VPU 和 FPGA 等,從而實(shí)現(xiàn)對(duì)深度學(xué)習(xí)模型的加速推理,提高推理性能和效率。
跨平臺(tái)部署:OpenVINO支持跨多種硬件平臺(tái)進(jìn)行部署,包括邊緣設(shè)備和云服務(wù)器,能夠在不同的設(shè)備上實(shí)現(xiàn)高效的推理。
模型保護(hù):OpenVINO可以將模型轉(zhuǎn)換為 IR(Intermediate Representation)格式,這樣可以保護(hù)模型的知識(shí)產(chǎn)權(quán),避免模型被輕易篡改或復(fù)制。
部署簡化:OpenVINO提供了簡單易用的部署工具和庫,使得在實(shí)際應(yīng)用中部署深度學(xué)習(xí)模型變得更加便捷。
使用自定義訓(xùn)練模型進(jìn)行圖像檢測(cè)
from ultralytics import YOLO
from pathlib import Path
from IPython.display import Image
from PIL import Image
IMAGE_PATH = Path("data\coco_bike.jpg")
# There are three lines of code below, all are correct.
# You can use one of them
# Use Raw String Literal:
# det_model = YOLO(r"models\best.pt")
# Use Forward Slashes
# det_model = YOLO("models/best.pt")
# Use Double Backslashes:
det_model = YOLO("models\\best.pt")
label_map = det_model.model.names
res = det_model(IMAGE_PATH)
Image.fromarray(res.plot()[:, :, ::-1])
當(dāng)我們?cè)诮K端中運(yùn)行上述代碼時(shí),它會(huì)對(duì)圖像執(zhí)行檢測(cè),如下所示:
上述代碼的解釋
此代碼是一個(gè) Python 腳本,它使用“ultralytics”庫中的 YOLO(You Only Look Once)對(duì)象檢測(cè)模型來檢測(cè)圖像中的對(duì)象。讓我們分解一下代碼的每個(gè)部分的作用:
導(dǎo)入庫:
該ultralytics庫提供了用于處理各種計(jì)算機(jī)視覺任務(wù)的工具,包括使用 YOLO 進(jìn)行對(duì)象檢測(cè)。
該pathlib庫用于處理文件和目錄路徑。
該IPython.display庫用于在 Jupyter 筆記本中顯示圖像。
該P(yáng)IL庫(Python Imaging Library)用于圖像處理。
2.定義圖像路徑:
該IMAGE_PATH變量設(shè)置為位于名為“data”的目錄中名為“coco_bike.jpg”的圖像文件的路徑。
3.加載YOLO模型:
使用 ultralytics 庫中的類加載 YOLO 模型YOLO。模型文件“best.pt”作為參數(shù)提供。
4. 獲取標(biāo)簽圖:
該label_map變量被分配了 YOLO 模型能夠檢測(cè)的類名列表。這些類名是從 YOLO 模型中加載的。
5.檢測(cè)物體:
YOLO 模型 ( det_model) 用于檢測(cè)指定圖像中的物體 ( IMAGE_PATH)。
檢測(cè)結(jié)果存儲(chǔ)在res變量中。
6.顯示結(jié)果:
Image.fromarray()使用庫中的函數(shù)顯示檢測(cè)結(jié)果PIL。該plot()方法用于創(chuàng)建檢測(cè)到的對(duì)象的圖像表示,并使用切片([:, :, ::-1])反轉(zhuǎn)顏色通道以將圖像從 BGR 轉(zhuǎn)換為 RGB 格式。
分割
from ultralytics import YOLO
from pathlib import Path
from IPython.display import Image
from PIL import Image
SEG_MODEL_NAME = "yolov8n-seg"
IMAGE_PATH = Path("data\coco_bike.jpg")
seg_model = YOLO("models\yolov8n-seg.pt")
res = seg_model(IMAGE_PATH)
Image.fromarray(res.plot()[:, :, ::-1])
輸出:
上述代碼的解釋
讓我們以簡單的方式一步一步地解釋一下這段代碼:
導(dǎo)入庫:
該代碼使用該ultralytics庫來處理計(jì)算機(jī)視覺模型。
該pathlib庫用于處理文件路徑。
該IPython.display庫用于在筆記本中顯示圖像。
該P(yáng)IL庫用于與圖像相關(guān)的任務(wù)。
2.設(shè)置模型名稱和圖像路徑:
該SEG_MODEL_NAME變量設(shè)置為“yolov8n-seg”分割模型的名稱。該模型旨在理解圖像的結(jié)構(gòu)并將其分割成不同的部分。
該IMAGE_PATH變量設(shè)置為位于“data”目錄中名為“coco_bike.jpg”的圖像文件的路徑。
3.加載分割模型:
YOLO使用ultralytics 庫中的類加載 YOLO 分割模型。
模型文件“yolov8n-seg.pt”作為參數(shù)提供。此文件包含分割模型的預(yù)訓(xùn)練權(quán)重和配置。
4.執(zhí)行分割:
seg_model使用分割模型( )對(duì)指定的圖像( IMAGE_PATH)進(jìn)行分割。
分割的結(jié)果存儲(chǔ)在res變量中。
5.顯示分割圖像:
代碼將分割結(jié)果轉(zhuǎn)換為可以顯示的圖像格式。
該plot()方法用于創(chuàng)建分割區(qū)域的圖像表示。
圖像的顏色通道被反轉(zhuǎn)([:, :, ::-1])以使其適合以 RGB 格式顯示。
6.顯示圖像:
Image.fromarray()該庫中的函數(shù)用于PIL在 IPython 筆記本中顯示分割圖像。
導(dǎo)出物體檢測(cè)模型
# object detection model
from ultralytics import YOLO
import os
# Use Forward Slashes
det_model = YOLO("models/best.pt")
det_model_path = "models/best_openvino_model/best.xml"
if not os.path.exists(det_model_path):
det_model.export(format="openvino", dynamic=True, half=False)
輸出:
上述代碼的解釋:
導(dǎo)入庫:
代碼YOLO從ultralytics庫中導(dǎo)入類以與對(duì)象檢測(cè)模型協(xié)同工作。
該os模塊被導(dǎo)入是為了與操作系統(tǒng)協(xié)同工作。
2.加載對(duì)象檢測(cè)模型:
YOLO使用庫中的類加載對(duì)象檢測(cè)模型ultralytics。
模型文件“best.pt”作為參數(shù)提供。該模型用于檢測(cè)圖像中的對(duì)象。
3.定義 OpenVINO 的導(dǎo)出路徑:
該變量det_model_path設(shè)置為對(duì)象檢測(cè)模型的 OpenVINO 模型文件“best.xml”的路徑。
4.導(dǎo)出為 OpenVINO 格式:
代碼檢查 OpenVINO 模型文件是否不存在指定路徑。
如果文件不存在,則使用該export方法將對(duì)象檢測(cè)模型導(dǎo)出為 OpenVINO 格式:
format="openvino"指定導(dǎo)出格式應(yīng)為OpenVINO。
dynamic=True表示導(dǎo)出的模型應(yīng)該支持動(dòng)態(tài)輸入形狀。
half=False指定導(dǎo)出的模型不應(yīng)使用半精度浮點(diǎn)數(shù)。
導(dǎo)出分割模型
# Export segmentation model
from ultralytics import YOLO
import os
# Use Forward Slashes
seg_model = YOLO("models/yolov8n-seg.pt")
seg_model_path = "models/yolov8n-seg_openvino_model/yolov8n-seg.xml"
if not os.path.exists(seg_model_path):
seg_model.export(format="openvino", dynamic=True, half=False)
輸出:
上述代碼的解釋:
導(dǎo)入庫:
代碼YOLO從ultralytics庫中導(dǎo)入類以與分割模型協(xié)同工作。
該os模塊被導(dǎo)入用于與操作系統(tǒng)交互。
2.加載分割模型:
YOLO使用庫中的類來加載分割模型ultralytics。
模型文件“yolov8n-seg.pt”作為參數(shù)提供。該模型專為圖像分割而設(shè)計(jì)。
3.定義 OpenVINO 的導(dǎo)出路徑:
該變量seg_model_path設(shè)置為OpenVINO模型文件“yolov8n-seg.xml”的保存路徑。
4.導(dǎo)出為 OpenVINO 格式:
代碼檢查 OpenVINO 模型文件是否不存在指定路徑。
如果該文件不存在,則使用該export方法將分割模型導(dǎo)出為 OpenVINO 格式:
format="openvino"指定導(dǎo)出格式應(yīng)為OpenVINO。
dynamic=True表示導(dǎo)出的模型應(yīng)該支持動(dòng)態(tài)輸入形狀。
half=False指定導(dǎo)出的模型不應(yīng)使用半精度浮點(diǎn)數(shù)。