扫码加入

  • 正文
  • 相关推荐
申请入驻 产业图谱

基于YOLOv8和DeepSORT实现目标检测与跟踪

03/16 16:18
512
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

简介

物体检测和跟踪是现代计算机视觉应用中的关键组件,用于从自动驾驶汽车监控系统等各个领域。在本篇博文中,我们将深入探讨如何使用 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 执行此操作:

# 使用 conda conda 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 DeepSort  definit_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 isnotNoneelse0        label = 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)

相关推荐