深度估计:单目视觉实现车距测量和车速估计(含完整项目代码)
深度估计:单目视觉实现车距测量和车速估计(含完整项目代码)
目录
深度估计:单目视觉实现车距测量和速度估计(含完整项目代码)
1. 引言
2. 实现方案
(1) 基于已知物体尺寸的测距
(2) 基于相机几何与地面平面的测距
(3) 基于消失点与透视原理的测距
(4) 基于深度学习的测距
3. 项目安装
4. 深度估计
5. 车辆检测
6. 车距测量
7. 速度估计
(1) 交通监控场景:车辆速度估计(摄像头静止)
(2) 行车记录场景:车辆速度估计(摄像头运动)
8. Demo效果
(1) 交通监控场景:车距测量和速度估计效果
(2) 行车记录场景:车距测量和速度估计效果
9. 项目源码下载
1. 引言
在智能交通系统和自动驾驶领域,车距测量和速度估计是至关重要的核心技术,它不仅能应用于自动驾驶领域,实现前向碰撞预警、自适应巡航控制等功能,也能用于交通监控场景,如超速抓拍、交通流量分析等。传统方案通常依赖雷达、激光或GPS等昂贵传感器,而基于单目视觉的方案以其低成本、易部署的独特优势,正在成为研究和应用的热点。本文主要介绍单目视觉在车距测量和车辆速度估计方面的技术原理与实现方案,并提供两个场景的车距测量和车速估计方法,即交通监控场景和行车记录场景。
这是项目实现的车距测量和速度估计的效果:
2. 实现方案
单目视觉实现车距测量和速度估计,核心技术是如何实现单目视觉测距。
(1) 基于已知物体尺寸的测距
这是最直观的方法,其核心原理是:物体在图像中的大小与其到相机的实际距离成反比。
- 公式:
距离 (Z) = (焦距 (f) * 物体实际宽度 (W)) / 图像中的像素宽度 (w)
- 关键: 必须知道物体的真实尺寸 (W)。常用参照物主要有车牌、车辆宽度,人脸/人体
- 优点: 计算简单,速度快。
- 缺点: 严重依赖先验知识的准确性。如果车辆类型不同导致尺寸差异大(如一辆smart和一辆卡车),测距误差会很大。物体不在图像中心时,也会因透视原理引入误差。
(2) 基于相机几何与地面平面的测距
这类方法假设相机固定且路面是平坦的,利用透视变换和相机标定参数将图像像素点映射到世界坐标系。
- 核心原理: 逆透视映射(IPM)。通过相机标定得到的外参(主要是安装高度
H
和俯仰角θ
)和内参(焦距f
,主点等),可以建立图像坐标系与地面坐标系之间的映射关系。 - 公式(简化): 对于图像中车辆底部接触地面的点
(u, v)
,其纵向距离Z
可近似为:Z = (f * H) / (v - v0)
其中H
是相机高度,v0
是地平线在图像中的纵坐标。 - 优点: 一旦相机标定完成,计算非常高效,适用于ADAS系统(如Mobileye就采用了类似技术)。
- 缺点:强烈依赖准确的相机标定。如果相机姿态因颠簸(俯仰角变化)或温度变化而发生改变,测量精度会急剧下降。必须假设地面是平坦的。在坡道或颠簸路面效果很差。
(3) 基于消失点与透视原理的测距
平行线在图像中会相交于一个点,称为消失点(Vanishing Point)。消失点提供了强大的几何约束。
- 核心原理: 消失点的位置决定了相机的朝向(特别是俯仰角和偏航角)。利用检测到的车道线等平行线计算出消失点后,可以推断出图像的几何结构,从而估算距离。
- 检测图像中的平行线结构(如车道线、车辆边缘)。
- 找到消失点。
- 根据消失点和相机内参,可以估计出相机的姿态。
- 结合方法2的几何模型,计算物体距离。
- 优点: 可以动态估计相机姿态,对相机轻微的晃动有一定的鲁棒性。
-
缺点: 需要图像中有明显的平行线结构,在复杂城市环境或车道线不清晰时可能失效。
(4) 基于深度学习的测距
这是目前研究的热点,模型直接从图像数据中学习如何估计深度。
-
核心原理: 不显式地依赖几何模型或先验知识,而是使用大型数据集(包含图像和对应的真实深度信息,由激光雷达或双目相机获取)来训练一个深度神经网络(CNN,Transformer等)。
-
监督学习深度估计: 输入单张图像,输出是每个像素的深度图。需要大量“图像-真实深度”数据对进行训练。
-
自监督/单目深度估计: 这是更流行的范式。它利用视频序列的连续帧作为监督信号。通过一个网络预测深度图,另一个网络预测相机自身运动(ego-motion),然后通过视图合成技术重建另一帧图像,并与真实图像计算重投影损失来训练网络。不需要真实的深度标签。
-
优点:端到端,无需复杂的相机标定或手工特征。能学习到更高级的语义线索(如物体类别、场景布局)来推断深度,在某些情况下比传统几何方法更鲁棒。
-
缺点:需要大量数据训练,泛化能力是关键(在一个数据集上训练好的模型,换一个环境可能效果下降)。计算量相对较大,对硬件要求高。估计出的深度值是相对尺度,需要通过其他方法(如地面真实测量)来恢复绝对尺度。
本博文的单目视觉实现车距测量和速度估计,采用的是第4种实现技术,实现思路:
- 深度估计:采用深度学习单目深度估计模型,用于获得整幅图像的深度距离信息
- 车辆检测:基于目标检测模型(如SSD、YOLO等模型)实现车辆检测,主要是定位车辆的位置
- 车距测量:根据车辆位置和图像深度图,获得车辆目标的距离信息
- 速度估计:计算车辆前后距离变化以及运动时间(视频时间),估计车辆的平均速度。
3. 项目安装
项目依赖python包请参考requirements.txt,使用pip安装即可(推荐使用Python3.10):
torch == 2.0.1
torchvision == 0.15.2
opencv-python
numpy == 1.23.1
xformers == 0.0.21
Pillow
matplotlib
timm
tensorboardX
imgaug
iopath
imagecorruptions
ultralytics==8.0.180
pandas>=1.1.4
seaborn>=0.11.0
pyyaml>=5.3.1
easydict
pybaseutils
pycocotools
toolz
项目安装教程请参考(初学者入门,麻烦先看完下面教程,配置好开发环境):
- 项目开发使用教程和常见问题和解决方法
- 视频教程:1 手把手教你安装CUDA和cuDNN(1)
- 视频教程:2 手把手教你安装CUDA和cuDNN(2)
- 视频教程:3 如何用Anaconda创建pycharm环境
- 视频教程:4 如何在pycharm中使用Anaconda创建的python环境
4. 深度估计
目前基于深度学习的深度估计方法主要依赖于卷积神经网络(CNN)、Transformer以及更高效的Mamba等架构,通过不同的学习范式(如监督、自监督)从单目、双目或多视图图像中恢复场景深度信息。
目标比较热门的深度估计模型主要有:
- Depth Anything : 单目深度估计的天花板:Depth Anything:
- Distill Any Depth: 蒸馏任何深度,仅用少量无标签数据就能实现单目深度估计新SOTA
-
Video Depth Anything: Video Depth Anything来了!字节开源首款10分钟级长视频深度估计模型
当然,也可以采用传统的双目测距方法:双目三维重建系统(双目标定+立体校正+双目测距+点云显示)
5. 车辆检测
车辆检测的方法比较多,可以利用现有的目标检测模型(如SSD,YOLO系列)在车辆检测数据集上进行训练。实现方法可以参考:
深度学习目标检测:YOLOv5实现车辆检测(含车辆检测数据集+训练代码)
本项目提供车辆检测推理代码,目标检测支持:pedestrian行人、car轿车、bus公交车、truck货车、bike非机动车、trafficsign交通标志牌共6个类别。
6. 车距测量
深度估计获得整幅图像的深度距离信息,而车辆检测可以定位车辆在图像中位置,只需要计算车辆目标框内深度图的平均值,便作为当前车辆到摄像头的平均距离。为了减少误差,可以通过视频多帧平滑的方式,统计连续多帧的平均距离。
需要注意的是,由于我们需要计算每辆车的距离和速度,因此需要通过跟踪的方式在时序上对齐每个目标,避免目标错乱等问题。
本项目提供了单目深度估计模型,由于不同摄像头焦距不同,实际测量距离时需要根据相机内参进行调整,以获得比较好的测量精度。项目提供了多个视频文件以及相机内参文件,以供测试使用。实际使用中,摄像头内参(fx, fy, cx, cy)需要自己对摄像头进行标定,相机标定方法,可以参考这篇博文。
7. 速度估计
(1) 交通监控场景:车辆速度估计(摄像头静止)
在交通监控场景,摄像头处于静止状态,需要测量车辆运动速度,如高速路边交通监控摄像头一般安置在高杆处,这时摄像头处于静止不动的状态。根据物理知识,目标车辆单位时间的速度可以表示为:
其中,v是需要估计的目标速度,dt为目标t时刻与摄像头的距离,dt-1是目标t-1时刻与摄像头的距离
(2) 行车记录场景:车辆速度估计(摄像头运动)
在行车记录场景,摄像头处于运动状态,需要测量车辆运动速度,如车载摄像头,行车记录仪,这时摄像头是跟随视频车一起运动的。根据物理知识,目标车辆单位时间的速度可以表示为:
其中,v是需要估计的目标速度,v0是摄像头的运动速度(一般是视频车速度),dt为目标t时刻与摄像头的距离,dt-1是目标t-1时刻与摄像头的距离。
使用车载摄像头测量车辆的速度,相对比较麻烦。需要获得车载摄像头的运动速度v0(也是视频车速度),才能正确估计视野前方的车辆速度。视频车速度可以通过导航软件GPS进行计算;当然也可以通过纯视觉的方式估计视频车速,一种简单的方法是找到视野图像中静止的目标(如交通标志牌,红绿灯,甚至行人),利用这一先验信息,我们可以反向计算视频车速度,进而估计视野前方的车辆速度。这种纯视觉的方法虽然简单,但误差相对比较大,十分依赖于交通标志牌等静止的目标。
本博文项目代码实现是基于纯视觉的方法估计视频车的速度。
8. Demo效果
(1) 交通监控场景:车距测量和速度估计效果
说明: 每个车辆目标都标记目标框、距离(单位米)和速度(单位km/h)等信息,速度为负值表示目标车辆正在靠近视频车摄像头,速度为正值表示目标车辆正在远离视频车摄像头。同时绘制了车辆的轨迹信息和箭头运动方向,以便观察效果。
# python demo.py --video_file path/to/video.mp4 --intrinsic path/to/intrinsic.json --cam_type 0
python demo.py --video_file data/video0/video0_001.mp4 --intrinsic data/video0/video0_001.json --cam_type 0
交通监控场景:车辆测距和速度估计效果
(2) 行车记录场景:车距测量和速度估计效果
说明: 增加了视频车速度测量,注意:这是通过纯视觉的方法估计视频车的速度,依赖于交通标志牌等静止的目标。当交通标识牌等静止目标较多时,估计的速度比较精准;但当静止目标较少甚至没有时,则误差较大。实际工程产品中,建议使用导航软件GPS计算获得视频车的运动速度。
# python demo.py --video_file path/to/video.mp4 --intrinsic path/to/intrinsic.json --cam_type 1python demo.py --video_file data/video1/video1_001.mp4 --intrinsic data/video1/video1_001.json --cam_type 1
行车记录场景:车辆测距和速度估计效果
9. 项目源码下载
如需下载项目源码,请WX关注【AI吃大瓜】,回复【车距测量】即可下载
(1) 交通监控场景:车距测量和车速估计,版本内容包含
- demo运行方法:python demo.py --video_file data/video0/video0_001.mp4 --intrinsic data/video0/video0_001.json --cam_type 0
- 提供车辆检测:检测目标支持:pedestrian行人、car轿车、bus公交车、truck货车、bike非机动车、trafficsign交通标志牌共6个类别。
- 提供单目深度估计模型,可以获得深度图
- 提供交通监控场景的车距测量功能(不支持行车记录场景)
- 提供交通监控场景的车速估计功能(不支持行车记录场景)
- 提供测试视频和对应的相机内参文件
- 提供完整的项目代码和以及模型文件,配置好开发环境,即可运行。可用于二次开发。
(2) 行车记录场景:车距测量和车速估计,版本内容包含
- demo运行方法:python demo.py --video_file data/video1/video1_001.mp4 --intrinsic data/video1/video1_001.json --cam_type 1
- 提供车辆检测:检测目标支持:pedestrian行人、car轿车、bus公交车、truck货车、bike非机动车、trafficsign交通标志牌共6个类别。
- 提供单目深度估计模型,可以获得深度图
- 提供行车记录场景的车距测量功能(同时支持交通监控场景)
- 提供行车记录场景的车速估计功能(同时支持交通监控场景)。注意:这是通过纯视觉的方法估计视频车的速度,依赖于交通标志牌等静止的目标。当交通标识牌等静止目标较多时,估计的速度比较精准;但当静止目标较少甚至没有时,则误差较大。实际工程产品中,建议使用导航软件GPS计算获得视频车的运动速度。
- 提供测试视频和对应的相机内参文件
- 提供完整的项目代码和以及模型文件,配置好开发环境,即可运行。可用于二次开发。