机器视觉-使用YoloV8的Python API

参考文档:

https://docs.ultralytics.com/modes/predict/#working-with-results
https://zhuanlan.zhihu.com/p/655162922
https://thinkinfi.com/motorcycle-helmet-detection-using-deep-learning/

示例说明

  1. 可提前将预训练的 yolov8n.pt文件下载到本脚本同一目录下,地址 https://github.com/ultralytics/assets/releases
  2. 关于 yolo runtime settings.yaml 对训练过程的干扰
    yolo settings.yaml文件路径为: C:\Users\MY_USER\AppData\Roaming\Ultralytics\settings.yaml, 该文件保存着上次训练时的runtime 设置, 其中有一个 datasets_dir 设置在特定条件下会导致train报错.
    干扰的条件是: data yaml文件中的path变量使用的相对路径.
    报错的信息为: images not found
    修复方式为: (1) data yaml的path使用绝对路径, (2)或者在训练之前修改yolo settings.yaml中的datasets_dir成我们真实存放图片dataset的父目录, 如果不更新settings.yaml将保留上次训练的图像路径,会导致报 images not found 错误 ; 如果 data yaml 中的path变量使用的绝对路径, 则不需更新yolo settings.yaml中的datasets_dir.
  3. 构建线程安全的predict, 可参考 ultralytics 官方文档 https://docs.ultralytics.com/modes/predict
  4. predict() 返回类型为 Results list , 官方文档写的是 Results, 这一点是错误的.

示例代码

from IPython import display
import ultralytics
from ultralytics import YOLO, settings
from os import path


def train():
    # ==========================
    # 如果 data yaml 中的path变量使用的相对路径, 需要更新yolo settings.yaml中的datasets_dir成我们真实存放图片dataset的父目录, 如果不更新settings.yaml将保留上次训练的图像路径,会导致报 images not found 错误
    # 如果 data yaml 中的path变量使用的绝对路径, 则不需更新yolo settings.yaml中的datasets_dir.
    # yolo settings.yaml文件路径为: C:\Users\MY_USER\AppData\Roaming\Ultralytics\settings.yaml
    # ==========================
    image_path = r'''C:\Users\dorothy\AppData\Roaming\Python\Python311\Scripts\datasets'''
    settings.update({"datasets_dir": image_path})

    # 设置训练data yaml文件
    dataset_yaml = r"C:\Users\dorothy\AppData\Roaming\Python\Python311\site-packages\ultralytics\cfg\datasets\coco8.yaml"

    # 可提前将预训练的olov8n.pt文件下载到本脚本同一目录下,地址 https://github.com/ultralytics/assets/releases
    model = YOLO("yolov8n.pt")

    # 在本脚本同一目录下, 会自动生成 runs 结果目录
    results = model.train(data=dataset_yaml, epochs=2, imgsz=640, device="cpu", batch=8)


def predict():
    model = YOLO(r"D:\my_workspace\source\yolo8\runs\detect\train9\weights\last.pt")
    image_file1 = r"D:\my_workspace\py_code\yolo8\Lib\site-packages\ultralytics\assets\bus.jpg"
    image_file2 = r"D:\my_workspace\py_code\yolo8\Lib\site-packages\ultralytics\assets\zidane.jpg"
    results_list = model.predict(source=[image_file1, image_file2], show=False, save=True, save_conf=True,
                                 save_txt=True)

    for results in results_list:
        boxes = results.boxes
        speed = results.speed
        names = results.names
        json = results.tojson()
        image_path = results.path
        print("====")
        print(image_path)
        print(names)
        print(json)


if __name__ == '__main__':
    display.clear_output()
    ultralytics.checks()
    # train()
    predict()
posted @ 2024-02-15 13:50  harrychinese  阅读(216)  评论(0编辑  收藏  举报