《博主简介》
小伙伴们好,我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。
✌更多学习资源,可关注公-仲-hao:【阿旭算法与机器学习】,共同学习交流~
👍感谢小伙伴们点赞、关注!
《------往期经典推荐------》
二、机器学习实战专栏【链接】,已更新31期,欢迎关注,持续更新中~~
三、深度学习【Pytorch】专栏【链接】
四、【Stable Diffusion绘画系列】专栏【链接】
五、YOLOv8改进专栏【链接】,持续更新中~~
六、YOLO性能对比专栏【链接】,持续更新中~
《------正文------》
引言
在人工智能神经网络和计算机视觉的世界里,识别并跟踪物体是一项至关重要的技术
。本文主要介绍一个深度学习项目
,该项目利用YOLOv10算法来检测车辆并且测量马路上汽车的速度。通过这个项目,您可以更深入地理解这些算法是如何融入我们的日常解决方案中的。
实现效果
实现步骤
下载yolov10源码
下载地址:https://github.com/THU-MIG/yolov10
安装运行环境
conda create -n yolov10 python=3.9
conda activate yolov10
pip install -r requirements.txt
pip install -e .
下载v10n模型
下载官方提供的与训练模型,这里我们直接使用yolov10n.pt
。
代码测试
运行完整代码:
from ultralytics import YOLOv10
from ultralytics.solutions import speed_estimation
import cv2
# 加载YOLOv10模型
model = YOLOv10("yolov10n.pt")
# 获取模型中的对象名称
names = model.model.names
# 打开视频文件
cap = cv2.VideoCapture("9.mp4")
# 获取视频的宽度、高度和帧率
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("out.avi",
cv2.VideoWriter_fourcc(*'mp4v'),
fps,
(w, h))
# 设置测速线段的两个端点
line_pts = [(0, 180), (640, 180)]
# 初始化速度估计器
speed_obj = speed_estimation.SpeedEstimator()
# 设置速度估计器的参数,包括测速线段、对象名称和是否显示图像
speed_obj.set_args(reg_pts=line_pts,
names=names,
view_img=True)
# 循环读取视频帧
while cap.isOpened():
# 读取一帧
success, im0 = cap.read()
# 如果读取失败,则退出循环
if not success:
break
tracks = model.track(im0, persist=True, show=False)
im0 = speed_obj.estimate_speed(im0, tracks)
video_writer.write(im0)
# 释放视频读取器和写入器
cap.release()
video_writer.release()
# 销毁所有OpenCV窗口
cv2.destroyAllWindows()
代码详细解读
下面是对上述代码的详细解释说明:
导入必要的库:
from ultralytics import YOLOv10 from ultralytics.solutions import speed_estimation import cv2
这段代码导入了
ultralytics
库中的YOLOv10模型和速度估计模块,以及OpenCV库,用于视频处理。加载YOLOv10模型:
model = YOLOv10("yolov10n.pt") names = model.model.names
这里加载了预训练的YOLOv10模型,用于
识别车辆
。读取视频文件:
cap = cv2.VideoCapture("9.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))
这段代码读取名为"9.mp4"的视频文件,并获取视频的宽度、高度和帧率。
创建视频写入器:
video_writer = cv2.VideoWriter("out.avi", cv2.VideoWriter_fourcc(*'mp4v'), fps, (w, h))
这里创建了一个视频写入器,用于将处理后的视频帧写入新的视频文件。
设置速度估计参数:
line_pts = [(0, 180), (640, 180)] speed_obj = speed_estimation.SpeedEstimator() speed_obj.set_args(reg_pts=line_pts, names=names, view_img=True)
这段代码设置了用于速度估计的参考线(
line_pts
),并初始化了速度估计器,同时设置了相关参数。
速度计算的基本原理:
SpeedEstimator函数通过存储随时间推移的跟踪位置来处理帧
,因此通过比较当前位置与定义区域内的先前位置来计算每个检测到的物体的速度,从而可以通过物体在该区域内移动所需的时间来估算物体的速度,这遵循了物理学中一个非常著名的术语:
v = Δs/Δt
其中,v为速度,Δs为位移(距离),Δt为时间间隔。视频帧处理循环:
while cap.isOpened(): success, im0 = cap.read() if not success: print("Video frame is empty or video processing has been successfully completed.") break tracks = model.track(im0, persist=True, show=False) im0 = speed_obj.estimate_speed(im0, tracks) video_writer.write(im0)
在这个循环中,代码逐帧读取视频,使用
YOLOv10模型进行对象跟踪
,然后使用速度估计器估计对象的移动速度
,并将结果写入新的视频文件。释放资源:
cap.release() video_writer.release() cv2.destroyAllWindows()
最后,释放视频读取器和写入器的资源,并关闭所有OpenCV创建的窗口。
总结
这段代码的主要功能是使用YOLOv10模型对视频中的对象进行跟踪,并估计它们通过特定线段的速度。但是该方法受硬件检测速度等影响,计算出的速度不是特别准确。如果需要准确的计算车速,最好结合实际场景给出距离参考对象,这样计算出的速度才会更加准确。
好了,这篇文章就介绍到这里,感谢点赞关注,更多精彩内容持续更新中~