引言
在人工神经网络和计算机视觉领域,目标识别和跟踪是非常重要的技术,它们可以应用于无数的项目中,其中许多可能不是很明显,比如使用这些算法来测量距离或对象的速度。
测量汽车速度基本步骤如下:
- 视频采集:使用摄像头或其他图像采集设备获取高速公路上汽车行驶的视频图像。
- 目标检测:运用计算机视觉算法,如YOLOv8,对视频中的汽车进行目标检测,确定汽车的位置和边界框。
- 跟踪算法:采用跟踪算法对检测到的汽车进行跟踪,在连续的帧中保持对同一辆汽车的识别。
- 距离测量:通过已知的参照物或标志物,如道路标线、标志牌等,测量汽车在图像中移动的距离。
- 时间计算:记录汽车在两个位置之间移动的时间间隔,可以通过帧间时间差来计算。
- 速度计算:根据测量得到的距离和时间,使用速度公式(速度 = 距离 ÷ 时间)计算汽车的速度。
YOLOv8
为了方便管理,还是在conda里面安装:
conda create -n yolov8 python=3.8
activate ylolv8
conda install pytorch==2.0.0 torchvision==0.15.0 torchaudio==2.0.0 pytorch-cuda=11.7 -c pytorch -c nvidia
pip install ultralytics
代码
from ultralytics import YOLO
from ultralytics.solutions import speed_estimation
import cv2
model = YOLO("yolov8s.pt")
names = model.model.names
cap = cv2.VideoCapture("/pathFreeway_night.mp4")
assert cap.isOpened(), "Error reading video file"
w, h, fps = (int(cap.get(x)) for x in (cv2.CAP_PROP_FRAME_WIDTH, cv2.CAP_PROP_FRAME_HEIGHT, cv2.CAP_PROP_FPS))
video_writer = cv2.VideoWriter("/path/speed_estimation.avi",
cv2.VideoWriter_fourcc(*'mp4v'),
fps,
(w, h))
line_pts = [(0, 400), (1280, 400)]
speed_obj = speed_estimation.SpeedEstimator()
speed_obj.set_args(reg_pts=line_pts,
names=names,
view_img=True)
while cap.isOpened():
cap.release()
video_writer.release()
cv2.destroyAllWindows()
代码解释
视频源
视频显示一个静止的相机,即一个不在其轴上移动并且总是显示街道或道路的相同部分的相机,这很重要,以避免准确性错误。另一个重要的点是选择一个能够处理视频的库,提供逐帧的图像供 YOLO 模型进行推理,这是下一步,这里要涉及 Opencv 库。
识别汽车
为了识别对象,使用了预训练的 YOLO 算法,该算法可以从 ultralytics 库中获得。这个算法允许实时识别感兴趣的对象,并且具有很好的准确性。
model = YOLO("yolov8s.pt")
在这种情况下,‘小型’模型(字母 s)证明是绰绰有余的。
应用跟踪
仍然在 YOLO 模型中,包含了一个跟踪算法,该算法旨在通过连续的帧持续监控和跟踪特定对象的移动。它的实现很简单,如下所示:
tracks = model.track(im0, persist=True, show=False)
在这里我们将一个函数直接整合到对象识别模型中。
定义区域
项目的一个重要步骤是定义对象必须穿过的区域,以便可以测量通过这个点的时间,从这个参考点我们可以计算速度。
为此,我们定义了坐标(x 和 y 点),这个区域应该开始和结束,如下:
line_pts = [(0, 400), (1280, 400)] # 绘制一条线,从屏幕的一侧穿过到另一侧
这个区域作为参数传递给负责计算速度的函数:
speed_obj.set_args(reg_pts=line_pts, names=names, view_img=True)
如何计算速度?
该函数通过存储随时间跟踪的位置来处理帧,因此通过比较定义区域内当前位置与先前位置的关系来计算每个检测到的对象的速度,允许通过它在该区域内移动所需的时间来估算对象的速度,遵循物理学中一个非常知名的术语:
v = Δ t Δ s v= \frac{Δt}{Δs} v=ΔsΔt
其中,v 是速度,Δs 是位移(距离),Δt 是时间间隔。