概念
项目需求, 通过视频抓拍获取车辆信息,抓取车牌。
YOLOv8 主要负责"找到"车牌的位置(目标检测),而"读取"上面的文字(A12345)通常需要结合 OCR(光学字符识别)技术。
我们将整个流程分为四个阶段:数据准备、模型训练、模型导出、以及实际推理(结合OCR)。
第一阶段:数据准备 (从视频到数据集)
YOLOv8 不能直接"训练视频",它需要经过标注的图片。
-
视频抽帧 你需要编写一个简单的 Python 脚本,将你的原始视频按一定间隔(例如每 10 帧)保存为图片。
Python
iniimport 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 -
数据标注 (Labeling) 这是最耗时但最重要的一步。你需要使用工具框出图片中的"车牌"。
- 工具推荐: LabelImg 或 Roboflow(网页版,更方便)。
- 标签名称: 设为
license_plate。 - 格式: 导出时选择 YOLO格式 (会生成对应的 .txt 文件)。
- 整理文件结构 YOLOv8 要求严格的文件目录结构:
scss
datasets/
└── license_plate_data/
├── images/
│ ├── train/ (存放训练图片)
│ └── val/ (存放验证图片)
└── labels/
├── train/ (存放对应的.txt标注文件)
└── val/ (存放对应的.txt标注文件)
第二阶段:训练 YOLOv8 模型
环境准备好后(安装了 ultralytics 库),就可以开始训练了。
-
安装环境:
pip install ultralytics
2.开始训练 (Python 代码): 创建一个 train.py 文件并运行:
ini
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' # 训练任务名称
)
第三阶段:获取与导出训练好的文件
训练完成后,模型文件会自动保存在以下路径: plate_project/train_run1/weights/best.pt
这就是你要的核心资产。 只要有这个 .pt 文件,你就可以在任何安装了 YOLOv8 的电脑上检测车牌位置。
第四阶段:后续项目使用 (检测 + 识别)
在后续项目中,你不仅要框出车牌,还要读取号码。这时候通常是 YOLOv8 (定位) + PaddleOCR (读取) 的组合。
下面是一个完整的推理代码示例,展示如何在后续项目中使用你训练好的 best.pt:
ini
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()