简介
物体检测和跟踪是现代计算机视觉应用中的关键组件,用于从自动驾驶汽车到监控系统等各个领域。在本篇博文中,我们将深入探讨如何使用 YOLOv8(You Only Look Once 第 8 版)和 DeepSORT(使用深度关联度量的简单在线实时跟踪)实现物体检测、跟踪和速度估计。
YOLOv8是 YOLO 系列的最新版本之一,以其在图像和视频中检测物体的效率和准确性而闻名。DeepSORT是一种先进的跟踪算法,它通过添加基于深度学习的特征提取器来增强 SORT(简单在线和实时跟踪),以提高物体跟踪准确性,尤其是在具有挑战性的场景中。
项目设置
在深入研究代码之前,让我们先设置一下项目环境。
克隆存储库
首先,克隆包含必要代码的 GitHub 存储库:
git clone https://github.com/Gayathri-Selvaganapathi/vehicle_tracking_counting.gitcd vehicle_tracking_counting
该存储库包含用于对象检测、跟踪和速度估计的脚本,以及预先训练的模型和样本数据。
设置开发环境
创建一个干净的 Python 环境以避免依赖项冲突至关重要。您可以使用 virtualenv 或 conda 执行此操作:
# 使用 condaconda create -n env_tracking python= 3.8
通过运行以下命令安装所需的依赖项:
pip install -r requirements.txt
实施步骤
下载所需文件
该项目需要一些 GitHub 存储库中未包含的附加文件,例如 DeepSORT 模型文件和用于测试的示例视频。
从提供的 Google Drive 链接下载 DeepSORT 文件。
解压下载的文件并将其放在项目 README 中列出的适当目录中。
例如,DeepSORT 文件应放在yolov8-deepsort/deep_sort目录中,示例视频应放在 中yolov8-deepsort/data。
使用 YOLOv8 运行对象检测
一切设置完成后,您现在可以运行对象检测和跟踪脚本。操作方法如下:
python detect.py --source data/sample_video.mp4 --yolo-model yolov8 --deep-sort deep_sort_pytorch --output runs/detect
该命令处理sample_video.mp4文件,使用 YOLOv8 模型检测对象,使用 DeepSORT 跟踪它们,并将输出视频保存在runs/detect目录中。
代码说明
让我们分解代码的主要部分来了解它是如何工作的。
主脚本概述
主要脚本detect.py负责协调整个检测和跟踪过程。以下是该脚本功能的高级视图:
加载YOLOv8模型:该模型用于检测每帧中的对象。
初始化 DeepSORT 跟踪器:此跟踪器为对象分配唯一的 ID 并跨帧跟踪它们。
逐帧处理视频:对于每一帧,脚本检测对象、跟踪它们,然后在它们周围绘制边界框和标签。
输出处理后的视频:最终视频将保存所有检测和跟踪的物体以及它们的速度(如果适用)。
按键功能详解
以下是脚本中的一些关键函数:
初始化追踪器
from deep_sort.deep_sort import DeepSortdefinit_tracker():return DeepSort("deep_sort/model.ckpt", use_cuda=True)
此函数初始化 DeepSORT 跟踪器,它将用于跨帧跟踪检测到的对象。
使用 YOLOv8 进行物体检测
defdetect_objects(frame, model):results = model(frame)return results.xyxy[0] # Returns bounding boxes and class labels
此函数在视频的每一帧上运行 YOLOv8 来检测对象。该函数返回边界框以及类标签。
绘制边界框
defdraw_boxes(frame, bbox, identities, names):for i, box in enumerate(bbox):x1, y1, x2, y2 = [int(i) for i in box]id = int(identities[i]) if identities isnotNoneelse0label = f'{names[i]}{id}'color = compute_color_for_labels(id)cv2.rectangle(frame, (x1, y1), (x2, y2), color, 2)cv2.putText(frame, label, (x1, y1-10), cv2.FONT_HERSHEY_SIMPLEX, 0.75, color, 2)return frame
该函数获取被跟踪对象的边界框和身份,将其绘制在框架上,并用对象的名称和 ID 对其进行注释。
速度估算
defestimate_speed(coord1, coord2, fps):d_pixels = np.linalg.norm(np.array(coord2) - np.array(coord1))d_meters = d_pixels / PIXELS_PER_METERspeed = d_meters * fps * 3.6 # Convert m/s to km/hreturnspeed
该函数通过计算被跟踪物体在帧之间行进的距离并将其转换为公里/小时来估算其速度。
结果和输出
运行脚本后,您应该会看到一段输出视频,其中检测、跟踪了对象并标记了它们的 ID。如果启用,视频还会显示移动物体的估计速度。
解释输出视频
在输出视频中:
边界框:每个检测到的物体周围都会绘制一个边界框。
对象 ID 和标签:边界框上的标签将显示对象的类别和跟踪器分配的唯一 ID。
速度估计:如果启用速度估计,则会显示每个移动物体的速度。
速度估算和车辆计数 该脚本还包含计数车辆和估算车辆速度的功能。当车辆越过预定义线时,它会增加车辆数量并使用欧几里德距离公式估算速度。
# Counting vehicles crossing a lineifis_crossing_line(bbox, line_position):vehicle_count+= 1# Estimating speedspeed = estimate_speed(previous_coord, current_coord, fps)
512