阅读文章前麻烦您点下右上角的“关注”,方便及时看到每天的最新内容,在此十分感谢您的支持。
文|AI明
编辑|AI明
对移动物体进行跟踪和计数是计算机视觉 (CV) 中最常见的应用之一。在开始之前,我们需要制定好整个项目的架构。
其中有几个关键步骤要做——检测跟踪、计数和注释。我们将使用最先进的工具——YOLOv8、ByteTrack和Supervision来完成。
使用 YOLOv8 进行物体检测
我们的需要从检测开始,有数十个用于对象检测或图像分割的库,这里,我们使用 YOLOv8。它的原生 pip 包支持使用起来更加方便。
安装YOLOv8:
pip install ultralytics
YOLOv8 提供了一个 SDK,只需几行 Python 代码便可进行训练或预测。加载 YOLOv8 模型并推断对单帧图像进行推理:
from ultralytics import YOLO
# 导入模型
model = YOLO(MODEL_PATH)
model.fuse()
# 推理
detections = model(frame)
使用 ByteTrack 进行对象跟踪
为了计算有多少个独立的对象越过一条线,我们需要一个跟踪器。与检测器一样,有很多可以选择——SORT、DeepSort、FairMOT等。
我们选择ByteTrack,直接pip安装:
pip install bytetracker
使用supervision进行计数
首先,使用 pip 安装该软件包。supervision仍处于测试阶段,因此为了避免出现问题,建议使用特定版本。
pip install supervision==0.1.0
supervision库的使用:首先,从源视频中读取帧并将处理后的帧写入输出文件:
from supervision.video.dataclasses import VideoInfo
from supervision.video.sink import VideoSink
from supervision.video.source import get_video_frames_generator
video_info = VideoInfo.from_video_path(SOURCE_VIDEO_PATH)
generator = get_video_frames_generator(SOURCE_VIDEO_PATH)
with VideoSink(TARGET_VIDEO_PATH, video_info) as sink:
for frame in tqdm(generator, total=video_info.total_frames):
frame = ...
sink.write_frame(frame)
最后,我们使用LineCounter来计算有多少个独立的对象跨越了虚拟线:
from supervision.tools.line_counter import LineCounter
from supervision.geometry.dataclasses import Point
LINE_START = Point(50, 1500)
LINE_END = Point(3790, 1500)
line_counter = LineCounter(start=LINE_START, end=LINE_END)
for frame in frames:
detections = ...
line_counter.update(detections=detections)