用yolov8 训练,最后形成训练好的文件。 并且能在后续项目使用

123 阅读4分钟

概念

项目需求, 通过视频抓拍获取车辆信息,抓取车牌。

YOLOv8 主要负责“找到”车牌的位置(目标检测),而“读取”上面的文字(A12345)通常需要结合 OCR(光学字符识别)技术。

我们将整个流程分为四个阶段:数据准备、模型训练、模型导出、以及实际推理(结合OCR)。

第一阶段:数据准备 (从视频到数据集)

YOLOv8 不能直接“训练视频”,它需要经过标注的图片

  1. 视频抽帧 你需要编写一个简单的 Python 脚本,将你的原始视频按一定间隔(例如每 10 帧)保存为图片。

    Python

    import cv2
    import os
    
    vidcap = cv2.VideoCapture('你的视频.mp4')
    success, image = vidcap.read()
    count = 0
    save_path = "./images/train/" # 确保文件夹存在
    
    while success:
        if count % 10 == 0: # 每10帧保存一张,避免数据重复度过高
            cv2.imwrite(f"{save_path}frame_{count}.jpg", image)
        success, image = vidcap.read()
        count += 1
    
  2. 数据标注 (Labeling) 这是最耗时但最重要的一步。你需要使用工具框出图片中的“车牌”。

  • 工具推荐: LabelImg 或 Roboflow(网页版,更方便)。
  • 标签名称: 设为 license_plate
  • 格式: 导出时选择 YOLO格式 (会生成对应的 .txt 文件)。
  1. 整理文件结构 YOLOv8 要求严格的文件目录结构:
datasets/
└── license_plate_data/
    ├── images/
    │   ├── train/  (存放训练图片)
    │   └── val/    (存放验证图片)
    └── labels/
        ├── train/  (存放对应的.txt标注文件)
        └── val/    (存放对应的.txt标注文件)

第二阶段:训练 YOLOv8 模型

环境准备好后(安装了 ultralytics 库),就可以开始训练了。

  1. 安装环境:
pip install ultralytics

2.开始训练 (Python 代码): 创建一个 train.py 文件并运行:

from ultralytics import YOLO

# 1. 加载预训练模型 (推荐 yolov8n 或 yolov8s,速度快)
model = YOLO('yolov8n.pt') 

# 2. 开始训练
results = model.train(
    data='license_plate.yaml', # 指向刚才创建的配置文件
    epochs=100,                # 训练轮数,建议100起
    imgsz=640,                 # 图片大小
    batch=16,                  # 根据显存调整
    project='plate_project',   # 项目名称
    name='train_run1'          # 训练任务名称
)
 
if __name__ == '__main__':
    model = YOLO('yolov8-neu-det')   # 指定YOLO模型对象,并加载指定配置文件中的模型配置
    #model.load('yolov8s.pt')      #加载预训练的权重文件'yolov8s.pt',加速训练并提升模型性能
    model.train(data='ultralytics/cfg/datasets/NEU-DET.yaml',   # 指定训练数据集的配置文件路径,这个.yaml文件包含了数据集的路径和类别信息
                cache=False,  # 是否缓存数据集以加快后续训练速度,False表示不缓存
                imgsz=640,    # 指定训练时使用的图像尺寸,640表示将输入图像调整为640x640像素
                epochs=200,   # 设置训练的总轮数为200轮
                batch=16,      # 设置每个训练批次的大小为16,即每次更新模型时使用16张图片
                close_mosaic=10,  # 设置在训练结束前多少轮关闭 Mosaic 数据增强,10 表示在训练的最后 10 轮中关闭 Mosaic
                workers=8,       # 设置用于数据加载的线程数为8,更多线程可以加快数据加载速度
                patience=50,     # 在训练时,如果经过50轮性能没有提升,则停止训练(早停机制)
                device='0',      # 指定使用的设备,'0'表示使用第一块GPU进行训练
                optimizer='SGD', #设置优化器为SGD(随机梯度下降),用于模型参数更新
                )

第三阶段:获取与导出训练好的文件

训练完成后,模型文件会自动保存在以下路径: plate_project/train_run1/weights/best.pt

这就是你要的核心资产。 只要有这个 .pt 文件,你就可以在任何安装了 YOLOv8 的电脑上检测车牌位置。

第四阶段:后续项目使用 (检测 + 识别)

在后续项目中,你不仅要框出车牌,还要读取号码。这时候通常是 YOLOv8 (定位) + PaddleOCR (读取) 的组合。

下面是一个完整的推理代码示例,展示如何在后续项目中使用你训练好的 best.pt

from ultralytics import YOLO
import cv2
# 你需要安装 paddleocr: pip install paddleocr paddlepaddle
from paddleocr import PaddleOCR 

# 1. 加载你自己训练的模型
model = YOLO('path/to/your/best.pt')

# 2. 初始化 OCR (专门用于识别中文和数字)
ocr = PaddleOCR(use_angle_cls=True, lang='ch') 

# 3. 打开视频进行处理
cap = cv2.VideoCapture('new_video.mp4')

while cap.isOpened():
    ret, frame = cap.read()
    if not ret: break

    # A. 使用 YOLO 检测车牌位置
    results = model(frame)
    
    for result in results:
        boxes = result.boxes
        for box in boxes:
            # 获取坐标
            x1, y1, x2, y2 = map(int, box.xyxy[0])
            
            # B. 裁剪出车牌区域 (ROI)
            plate_img = frame[y1:y2, x1:x2]
            
            # C. 使用 OCR 识别文字
            # 注意:需处理裁剪区域为空的情况
            if plate_img.size > 0:
                ocr_result = ocr.ocr(plate_img, cls=True)
                if ocr_result and ocr_result[0]:
                    text = ocr_result[0][0][1][0] # 获取识别到的车牌号
                    print(f"检测到车牌: {text}")

                    # 在画面上画框并写字 (可选)
                    cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 255, 0), 2)
                    cv2.putText(frame, text, (x1, y1 - 10), 
                                cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 255, 0), 2)

    cv2.imshow('Plate Detection', frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()