YOLOv8环境搭好了,然后呢?5个实用脚本带你玩转目标检测(从预测到训练)

刚完成YOLOv8环境配置的开发者常会遇到这样的困境:跑通官方demo后,面对自己的实际需求却无从下手。本文将提供五个即用型Python脚本,覆盖从基础应用到自定义训练的全流程,帮你快速跨越"环境验证"到"实战落地"的鸿沟。

1. 批量图片检测:自动化处理图像文件夹

许多教程只演示单张图片预测,而实际项目往往需要处理成百上千的图片。以下脚本可批量处理指定目录中的所有图像:

from ultralytics import YOLO
import os

model = YOLO('yolov8n.pt')  # 加载官方预训练模型
input_dir = 'your_images_folder'
output_dir = 'detection_results'

os.makedirs(output_dir, exist_ok=True)

for filename in os.listdir(input_dir):
    if filename.lower().endswith(('.png', '.jpg', '.jpeg')):
        img_path = os.path.join(input_dir, filename)
        results = model.predict(source=img_path, save=True, project=output_dir)

关键参数说明:

  • save=True 自动保存检测结果图像
  • project 指定输出目录
  • 支持常见图片格式(PNG/JPG/JPEG)

提示:添加conf=0.5参数可调整检测置信度阈值,平衡准确率与召回率

2. 实时摄像头检测:动态目标追踪方案

让YOLOv8处理摄像头实时流只需稍作修改。这个脚本会打开默认摄像头并显示检测结果:

import cv2
from ultralytics import YOLO

model = YOLO('yolov8n.pt')
cap = cv2.VideoCapture(0)  # 0表示默认摄像头

while cap.isOpened():
    ret, frame = cap.read()
    if not ret:
        break
        
    results = model.track(frame, persist=True)  # 使用track而非predict获得持续ID
    annotated_frame = results[0].plot()
    
    cv2.imshow('YOLOv8 Real-Time', annotated_frame)
    if cv2.waitKey(1) == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

功能增强建议:

  • 添加classes=[0, 2]参数可只检测特定类别(0代表人,2代表车)
  • persist=True 启用跨帧目标ID保持
  • 使用model.track()而非predict()获得连续帧间的追踪效果

3. 视频文件处理:高效视频分析技巧

处理视频文件与摄像头流类似,但需要注意性能优化。这段代码展示了如何平衡处理速度与质量:

from ultralytics import YOLO
import cv2

model = YOLO('yolov8n.pt')
video_path = 'input_video.mp4'
output_path = 'output_video.avi'

cap = cv2.VideoCapture(video_path)
fps = int(cap.get(cv2.CAP_PROP_FPS))
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))

fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter(output_path, fourcc, fps, (width, height))

while cap.isOpened():
    ret, frame = cap.read()
    if not ret:
        break
    
    results = model.predict(frame, half=True)  # 使用半精度提升速度
    annotated_frame = results[0].plot()
    out.write(annotated_frame)

cap.release()
out.release()

性能优化参数对比:

参数作用速度提升精度影响
half=True半精度推理30-50%轻微下降
imgsz=640固定输入尺寸20%依赖原始分辨率
device='cuda'启用GPU加速3-5倍无影响

4. 结构化输出:将检测结果保存为JSON/TXT

实际项目中常需要结构化数据而非图像。以下脚本将检测结果导出为机器可读格式:

from ultralytics import YOLO
import json

model = YOLO('yolov8n.pt')
results = model.predict('input_image.jpg', save=False)

# 转换为JSON格式
detections = []
for result in results:
    for box in result.boxes:
        detections.append({
            'class': result.names[box.cls[0].item()],
            'confidence': box.conf[0].item(),
            'bbox': box.xywhn[0].tolist()  # 归一化坐标(x_center,y_center,width,height)
        })

with open('detections.json', 'w') as f:
    json.dump(detections, f, indent=2)

# 同时保存为YOLO格式的TXT
with open('detections.txt', 'w') as f:
    for det in detections:
        line = f"{list(result.names.keys())[list(result.names.values()).index(det['class'])]} " \
               f"{' '.join(map(str, det['bbox']))}\n"
        f.write(line)

输出格式选择指南:

  • JSON:适合Web应用或进一步数据分析
  • TXT(YOLO格式):便于与其他计算机视觉工具链集成
  • CSV:适合表格类数据处理(可通过pandas轻松转换)

5. 自定义训练:从数据准备到模型微调

当预训练模型不满足需求时,自定义训练成为必选项。完整流程包括:

5.1 数据准备规范

YOLOv8要求特定目录结构:

dataset/
├── images/
│   ├── train/
│   └── val/
└── labels/
    ├── train/
    └── val/

标注文件要求:

  • 每个图像对应一个同名的.txt文件
  • 每行格式:class_id x_center y_center width height(归一化数值)
  • 可使用LabelImg等工具生成

5.2 配置文件示例

创建data.yaml定义数据集:

path: ./dataset
train: images/train
val: images/val

names:
  0: person
  1: car
  2: traffic_light

5.3 启动训练脚本

from ultralytics import YOLO

model = YOLO('yolov8n.pt')  # 加载基础模型进行微调

results = model.train(
    data='data.yaml',
    epochs=100,
    imgsz=640,
    batch=16,
    device='cuda'  # 使用GPU加速
)

关键训练参数解析:

参数典型值作用
epochs50-300训练轮次
patience50早停机制阈值
lr00.01初始学习率
weight_decay0.0005权重衰减系数

训练完成后,最佳模型会自动保存在runs/detect/train/weights/best.pt

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐