OpenVINO教程(二):图片目标检测推理应用

YOLO模型物体检测

下面是一个简单的python程序,他的功能是使用yolo11n模型对coco_bike.jpg照片进行检测,并显示检测结果
代码步骤如下:

  1. coco_bike.jpg照片
  2. 加载yolo模型
  3. 使用模型进行detect推理
  4. 显示推理结果

下面是完整的代码

from pathlib import Path

import urllib.request
import tkinter as tk
from PIL import Image, ImageTk

from 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 / filename
    if not file_path.exists():
        print(f"Downloading: {filename}")
        urllib.request.urlretrieve(url, file_path)
    else:
        print(f"File already exists: {file_path}")
    return file_path

def 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()

下面是推理结果:
yolo11 detect

OpenVINO物体检测

基于上面程序我们修改,将yolo模型转换为openvino IR模型,然后使用IR模型进行物体检测.完整代码如下:
代码步骤如下:

  1. coco_bike.jpg照片
  2. 导出和加载OpenVINO IR模型
  3. 用 Ultralytics 的 YOLO 接口重新封装 之前导出的 OpenVINO 模型
  4. 使用模型进行detect推理
  5. 显示推理结果

下面是完整的代码

from pathlib import Path

import urllib.request
import tkinter as tk
from PIL import Image, ImageTk

from 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 / filename
    if not file_path.exists():
        print(f"Downloading: {filename}")
        urllib.request.urlretrieve(url, file_path)
    else:
        print(f"File already exists: {file_path}")
    return file_path

def 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_model
    results = 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()

下面是推理结果:
yolo11 openvino detect

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值