OpenVINO教程(二):图片目标检测推理应用
YOLO模型物体检测
下面是一个简单的python程序,他的功能是使用yolo11n模型对coco_bike.jpg照片进行检测,并显示检测结果
代码步骤如下:
- coco_bike.jpg照片
- 加载yolo模型
- 使用模型进行detect推理
- 显示推理结果
下面是完整的代码
from pathlib import Pathimport urllib.request
import tkinter as tk
from PIL import Image, ImageTkfrom ultralytics import YOLO# ----------------------------- #
# 全局配置和路径定义
# ----------------------------- #MODEL_VARIANTS = ["yolo11n", "yolo11s", "yolo11m", "yolo11l", "yolo11x"]
MODEL_NAME = MODEL_VARIANTS[0] # 默认使用最轻量的 yolo11n 模型
PT_MODEL_PATH = f"{MODEL_NAME}.pt"
IR_MODEL_DIR = Path(f"{MODEL_NAME}_openvino_model")
IR_MODEL_PATH = IR_MODEL_DIR / f"{MODEL_NAME}.xml"
INT8_MODEL_PATH = Path(f"{MODEL_NAME}_openvino_int8_model/{MODEL_NAME}.xml")IMAGE_PATH = Path("./coco_bike.jpg")
OUT_DIR = Path("./")# ----------------------------- #
# 工具函数模块
# ----------------------------- #def download_file_if_needed(url: str, filename: str, dest_dir: Path) -> Path:"""下载文件(若文件已存在则跳过)"""dest_dir.mkdir(parents=True, exist_ok=True)file_path = dest_dir / filenameif not file_path.exists():print(f"Downloading: {filename}")urllib.request.urlretrieve(url, file_path)else:print(f"File already exists: {file_path}")return file_pathdef prepare_test_image():"""确保测试图片存在,如无则从官方地址下载"""if not IMAGE_PATH.exists():download_file_if_needed("https://storage.openvinotoolkit.org/repositories/openvino_notebooks/data/data/image/coco_bike.jpg",IMAGE_PATH.name, IMAGE_PATH.parent)def predict_and_show_image(det_model: YOLO):"""使用模型对图像进行目标检测,并通过 Tkinter GUI 显示检测结果"""results = det_model(IMAGE_PATH)result_img = Image.fromarray(results[0].plot()[:, :, ::-1])root = tk.Tk()root.title("YOLOv11 Detection Result")tk_img = ImageTk.PhotoImage(result_img)label = tk.Label(root, image=tk_img)label.pack()root.mainloop()# ----------------------------- #
# 主执行流程
# ----------------------------- #def main():# 1. 准备测试图像(如无则下载)prepare_test_image()# 2. 构造 Ultralytics YOLO 接口,用于推理/验证det_model = YOLO(PT_MODEL_PATH).to("cpu")# 3. 使用openvino模型进行推理并显示结果predict_and_show_image(det_model)if __name__ == "__main__":main()
下面是推理结果:
OpenVINO物体检测
基于上面程序我们修改,将yolo模型转换为openvino IR模型,然后使用IR模型进行物体检测.完整代码如下:
代码步骤如下:
- coco_bike.jpg照片
- 导出和加载OpenVINO IR模型
- 用 Ultralytics 的 YOLO 接口重新封装 之前导出的 OpenVINO 模型
- 使用模型进行detect推理
- 显示推理结果
下面是完整的代码
from pathlib import Pathimport urllib.request
import tkinter as tk
from PIL import Image, ImageTkfrom ultralytics import YOLO
import openvino as ov# ----------------------------- #
# 全局配置和路径定义
# ----------------------------- #MODEL_VARIANTS = ["yolo11n", "yolo11s", "yolo11m", "yolo11l", "yolo11x"]
MODEL_NAME = MODEL_VARIANTS[0] # 默认使用最轻量的 yolo11n 模型
PT_MODEL_PATH = f"{MODEL_NAME}.pt"
IR_MODEL_DIR = Path(f"{MODEL_NAME}_openvino_model")
IR_MODEL_PATH = IR_MODEL_DIR / f"{MODEL_NAME}.xml"
INT8_MODEL_PATH = Path(f"{MODEL_NAME}_openvino_int8_model/{MODEL_NAME}.xml")IMAGE_PATH = Path("./coco_bike.jpg")
OUT_DIR = Path("./")# ----------------------------- #
# 工具函数模块
# ----------------------------- #def download_file_if_needed(url: str, filename: str, dest_dir: Path) -> Path:"""下载文件(若文件已存在则跳过)"""dest_dir.mkdir(parents=True, exist_ok=True)file_path = dest_dir / filenameif not file_path.exists():print(f"Downloading: {filename}")urllib.request.urlretrieve(url, file_path)else:print(f"File already exists: {file_path}")return file_pathdef prepare_test_image():"""确保测试图片存在,如无则从官方地址下载"""if not IMAGE_PATH.exists():download_file_if_needed("https://storage.openvinotoolkit.org/repositories/openvino_notebooks/data/data/image/coco_bike.jpg",IMAGE_PATH.name, IMAGE_PATH.parent)def load_or_export_openvino_model() -> ov.CompiledModel:"""加载或导出 YOLOv11 OpenVINO IR 模型,并编译为 CPU 运行时模型"""model = YOLO(PT_MODEL_PATH).to("cpu")if not IR_MODEL_PATH.exists():model.export(format="openvino", dynamic=True, half=True)core = ov.Core()ir_model = core.read_model(IR_MODEL_PATH)return core.compile_model(ir_model, "CPU")def build_ultralytics_model() -> YOLO:"""创建 Ultralytics 的 YOLO 模型接口,用于调用预测器"""return YOLO(IR_MODEL_DIR, task="detect")def predict_and_show_image(det_model: YOLO, compiled_model: ov.CompiledModel):"""使用模型对图像进行目标检测,并通过 Tkinter GUI 显示检测结果"""if det_model.predictor is None:config = {"conf": 0.25, "batch": 1, "save": False, "mode": "predict"}args = {**det_model.overrides, **config}det_model.predictor = det_model._smart_load("predictor")(overrides=args, _callbacks=det_model.callbacks)det_model.predictor.setup_model(model=det_model.model)det_model.predictor.model.ov_compiled_model = compiled_modelresults = det_model(IMAGE_PATH)result_img = Image.fromarray(results[0].plot()[:, :, ::-1])root = tk.Tk()root.title("YOLOv11 (OpenVINO) Detection Result")tk_img = ImageTk.PhotoImage(result_img)label = tk.Label(root, image=tk_img)label.pack()root.mainloop()# ----------------------------- #
# 主执行流程
# ----------------------------- #def main():# 1. 准备测试图像(如无则下载)prepare_test_image()# 2. 加载或导出 OpenVINO IR 模型,并编译运行(用于量化或预测)compiled_fp_model = load_or_export_openvino_model()# 3. 构造 Ultralytics YOLO 接口,用于推理/验证det_model = build_ultralytics_model()# 4. 使用openvino模型进行推理并显示结果predict_and_show_image(det_model, compiled_fp_model)if __name__ == "__main__":main()
下面是推理结果: