YOLO模型物体检测
下面是一个简单的python程序,他的功能是使用yolo11n模型对coco_bike.jpg照片进行检测,并显示检测结果
代码步骤如下:
- coco_bike.jpg照片
- 加载yolo模型
- 使用模型进行detect推理
- 显示推理结果
下面是完整的代码
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()
下面是推理结果:
OpenVINO物体检测
基于上面程序我们修改,将yolo模型转换为openvino IR模型,然后使用IR模型进行物体检测.完整代码如下:
代码步骤如下:
- coco_bike.jpg照片
- 导出和加载OpenVINO IR模型
- 用 Ultralytics 的 YOLO 接口重新封装 之前导出的 OpenVINO 模型
- 使用模型进行detect推理
- 显示推理结果
下面是完整的代码
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()
下面是推理结果: