可以按这条流程做:标注数据 → 训练 YOLO26 → 验证效果 → 视频检测 → 加计数器。YOLO26 已支持检测、分割、姿态、分类等任务,Ultralytics 官方也提供了视频计数方案。(Ultralytics Docs)

1. 数据集格式

目录这样放:

dataset/
├─ images/
│  ├─ train/
│  ├─ val/
├─ labels/
│  ├─ train/
│  ├─ val/
└─ data.yaml

data.yaml 示例:

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

names:
  0: person
  1: car

每张图片对应一个同名 .txt 标注文件:

类别 x中心 y中心 宽 高

坐标都是归一化后的 0~1 数值。

2. 安装环境

pip install ultralytics opencv-python

测试是否可用:

from ultralytics import YOLO

model = YOLO("yolo26n.pt")
results = model("test.jpg")

官方示例也是通过 YOLO("yolo26n.pt") 加载预训练模型。(Ultralytics Docs)

3. 训练自己的数据集

from ultralytics import YOLO

model = YOLO("yolo26n.pt")

model.train(
    data="dataset/data.yaml",
    epochs=100,
    imgsz=640,
    batch=16,
    device=0
)

训练完成后,权重一般在:

runs/detect/train/weights/best.pt

4. 用训练好的模型检测视频

from ultralytics import YOLO

model = YOLO("runs/detect/train/weights/best.pt")

model.predict(
    source="input.mp4",
    save=True,
    conf=0.4
)

5. 视频中加入计数器

如果你要“过线计数”,可以这样写:

import cv2
from ultralytics import solutions

video_path = "input.mp4"
output_path = "output_count.mp4"
model_path = "runs/detect/train/weights/best.pt"

cap = cv2.VideoCapture(video_path)
w = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
h = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
fps = int(cap.get(cv2.CAP_PROP_FPS))

writer = cv2.VideoWriter(
    output_path,
    cv2.VideoWriter_fourcc(*"mp4v"),
    fps,
    (w, h)
)

# 一条计数线,坐标根据你的视频画面调整
line_points = [(100, 400), (1000, 400)]

counter = solutions.ObjectCounter(
    show=True,
    region=line_points,
    model=model_path
)

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

    results = counter(frame)
    writer.write(results.plot_im)

cap.release()
writer.release()
cv2.destroyAllWindows()

Ultralytics 官方说明里,region 可以是两点构成的线,也可以是三点以上的多边形区域;视频计数本质是检测 + 跟踪 + 判断目标是否穿过计数区域。(Ultralytics Docs)

6. 只统计某一类

比如只统计第 0 类:

counter = solutions.ObjectCounter(
    show=True,
    region=line_points,
    model=model_path,
    classes=[0]
)

官方示例中 classes=[0, 2] 就是只统计指定类别。(Ultralytics Docs)

最关键要改的就是这几个地方:

model_path = "runs/detect/train/weights/best.pt"
video_path = "input.mp4"
line_points = [(100, 400), (1000, 400)]
classes=[0]

计`

计数线坐标要根据你视频画面实际位

调整。

更多推荐