当前位置: 首页 > web >正文

【双目深度估计】9种立体匹配算法整合包一键运行,支持相机标定、目标检测和tensorrt加速

项目简介

在这里插入图片描述
本项目是一个双目立体匹配算法集合库,可以用来做对比试验,也可以用来实地部署测试,本项目可以提供的内容包括立体匹配、目标检测、双目相机的标定。

在这里插入图片描述
在这里插入图片描述

其中立体匹配包含如下算法:

模型名称说明
sgbm经典立体匹配算法,基于opencv实现
psm2016年,精度较高,由于年份比较早,有很多改版,这里选用了比较稳定的pytorch版本
unimatch2023年,统一光流、立体匹配和深度估计的多任务Transformer模型(CVPR后续工作)
raftstereo2021年,基于RAFT光流框架的迭代优化立体匹配网络
crestereo2022年,级联循环网络,自适应群相关层处理非理想校正,Middlebury和ETH3D排名第一
sea-raft2022年,RAFT光流算法的改进版本,通过引入拉普拉斯混合损失和刚性运动预训练,这里只取其x方向光流作为视差
foundationstereo2025年,英伟达开源的零样本泛化立体匹配基础模型,百万级合成数据训练,CVPR满分论文
monster2025年,英特尔开源的双分支模型,融合单目深度与立体匹配,五榜第一
defomstereo2025年,KITTI/Middlebury/ETH3D零样本泛化SOTA

本项目提供了整合以上所有内容的整合包,统一格式调用推理(由于立体匹配的泛化性强,故不包含训练)

有需要的朋友可以观看 b 站同名账号的视频,有偿出

https://www.bilibili.com/video/BV1BoGczjEKh/

可以移步闲鱼下单或者私信(私信可能消息有延迟)

https://www.goofish.com/item?spm=a21ybx.personal.feeds.1.67436ac2VyCScK&id=950185606177&categoryId=50023914

使用流程

一、配置环境

1.1 Anaconda 和 Pytorch 安装

对于干净的电脑环境需要安装 Anaconda 和 VScode

PyTorch安装教程(GPU版,含Anaconda安装)https://blog.csdn.net/qq_45670495/article/details/140880852

pytorch 下载太慢可以参考

https://mirrors.aliyun.com/pytorch-wheels/

下载对应的 wheel 文件然后 pip install 即可

选择 2.5.0 版本的 torch

python版本要求 == 3.9

(以上版本可以变更,一般不会影响程序运行。唯一可能出现的问题是在linux下较高版本的torch导出的onnx可能会有问题,其余完全不影响)

1.2 基础必要的库

需要安装以下库(pip),
直接运行

pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

以上库是运行的必要库。如果后续有调优和加速需求可以参考 1.31.5 没有可以自动跳过

1.3 sgbm 的 wls 滤波

在使用 sgbm 模型时可能需要 wls 滤波,该方法基于 opencv-contrib-python 包,而安装 ultralytics 时会自动安装 opencv-python,因此安装完 ultralytics 后需要立即卸载 opencv-python,然后再安装 opencv-contrib-python ,否则会无法使用。

pip uninstall opencv-python opencv-python-headless
pip install opencv-contrib-python -i https://pypi.tuna.tsinghua.edu.cn/simple

如果需要 raft-stereo 在 ubuntu 下的 c++ cuda 加速(仅限linux系统)

如果遇到 opencv 窗口无法启动的情况,可以尝试 pip uninstall opencv-python-headless opencv-python 然后重新安装 opencv-python

1.4 Raft-stereo 的采样模块 c++ 加速(realtime模式)

仅限 linux 环境,需要 c++ 加速:

sudo apt update
sudo apt install build-essential

当前 anaconda 环境下当前目录下运行:

cd core/raft_stereo_core/sampler
python setup.py install

1.5 Foundation-stereo 加速

flash-attn 非必须安装,可以提供注意力机制加速(仅在foundation stereo中使用),如果需要安装 flash-attn 要 c++ 依赖

  • ubuntu
sudo apt update
sudo apt install build-essential
pip install flash-attn
  • windows

参考
https://blog.csdn.net/qintaiwu/article/details/121645787?spm=1001.2014.3001.5506

如果遇到安装好以后不能使用的情况可以适当降低版本。

注意 foundation stereo 暂时不支持 cpu 版本的 torch

xformers 也可以提供加速,可以按照自己的版本安装 xformers ,这里我的 cuda 版本是12.1 就按照如下命令安装,其余的可以替换 cu121 至你的版本即可(如果报错根据提供的可选版本号选择不超过你的cuda版本的安装即可)

如果被强制更新了 pytorch 可以在 xformers github官网 下载对应版本的包。

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -U xformers --index-url https://download.pytorch.org/whl/cu121

1.6 onnx+tensorrt 加速推理(目前仅在linux实验成功)

安装 onnxruntime-gpu

pip install onnxruntime-gpu -i https://pypi.tuna.tsinghua.edu.cn/simple

如果希望使用 onnxruntime 在 TensorrtExecutionProvider 模式下加速推理需要安装 tensorrt 可以参考:

Ubuntu TensorRT安装 https://blog.csdn.net/ytusdc/article/details/140143354

windows TensorRT安装 https://blog.csdn.net/qq_43406895/article/details/128635174

tensorrt 下载页面

https://developer.nvidia.com/tensorrt

安装满足版本要求的 tensorrt
检查 onnxruntime 是否支持 tensorrt:

import tensorrt as trt
print(trt.__version__)import onnxruntime as ort# 检查可用的提供程序
providers = ort.get_available_providers()
print("可用的执行提供程序:", providers)# 检查是否包含TensorRT
if 'TensorrtExecutionProvider' in providers:print("TensorRT执行提供程序可用。")
else:print("TensorRT执行提供程序不可用。请检查安装。")

如果输出 TensorRT执行提供程序可用 则证明安装成功

以下表格是基于640*480图像的帧率测试,其中 sgbm 为 opencv 库函数,测试设备为Legion-Y9000P-IRX8 + NVIDIA 4060 ubuntu20.04,切换到windows帧率也可能会波动

模型名称帧率(pytorch/cv2)帧率(onnx+tenorrt)显存(pytorch)显存(onnx+tenorrt)
sgbm~30
psm2.910.82.74G2.05G
unimatch4.50.91G
raftstereo12.1310.33G0.26G
crestereo2.9100.5G0.36G
sea-raft8.9253.3G0.37G
foundationstereo0.72.14.6G3.58G
monster0.154.53.42G1.53G
defom4.09.01.18G0.98G

二、标定(如果需要三维重建,必须,如果仅需要视差图可以跳过)

2.1 获得标定数据

如果你自己有标定参数,跳到 2.3

本例需要一个双目摄像头并能获取图像,打开 ./utils/get_calib_data.py
选择合适的摄像头参数,括号填入数字选择摄像头

camera = cv2.VideoCapture(0)

设置图像分辨率:

cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1280*2)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 720)

注意如果是一体式双目摄像头图像宽要设置为单张图像宽的2倍。

如果相机无法用 usb 连接,则在对应位置修改为图像接口即可( np.ndarray 类型, frame1,frame2),下面同理

while True:ret, frame = camera.read()# 这里的左右两个摄像头的图像是连在一起的,所以进行一下分割# 裁剪坐标为[y0:y1, x0:x1]splity = frame.shape[1] // 2frame1 = frame[:, :splity]frame2 = frame[:, splity:]

准备好标定板,并得到棋盘格的内角点个数,以 8×68\times68×6 为例,对应的是 9×79\times79×7 的网格,修改

chessid = (8, 6)

修改左右相机视角标定数据保存路径

left_save_root = './calibration/left'
right_save_root = './calibration/right'

运行 getdata.py 当相机检测到角点后会弹出绘制角点的新窗口,保存按 S ,不保存按 C,得到大约十几张标定数据后按 Esc 结束运行。注意采集的棋盘格尽量分布在视角各个区域,减小误差。

2.2 得到标定结果

打开 ./utils/calibration.py ,修改最后的函数参数

if __name__ == '__main__':'''left_folder:        左视角存储路径right_folder:       右视角存储路径pattern_width:      标定板正方形边长/mmpattern_size:       网格数config_yaml_root:   标注结果保存地址'''calibrate(left_folder = "./calibration/left", right_folder = "./calibration/right", pattern_size = (11, 8),pattern_width = 25, config_yaml_root = './model_data/camera_config.yaml')

运行即可得到标定结果文件 ./model_data/camera_config.yaml

2.3 修改添加自己的标定参数

如果你自己有一套标定参数,那么可以新建一个 yaml 文件按照其内部格式修改:

R:                      # 旋转矩阵
...
T:                      # 平移矩阵
...
camera_matrix_left:     # 左相机内参
...
camera_matrix_right:    # 右相机内参
...
dist_coeff_left:        # 左相机畸变(k1,k2,p1,p2,k3)
...
dist_coeff_right:       # 右相机畸变
...
imgsize:                # 图像尺寸
...

后续三位重建需要上面的标定参数。

三、项目运行

3.1 显示视差图

运行 test_disparity.py 或者 可以测试单独两张图像生成视差图。
设置 model_name 有以下模型可供选择:

'sgbm', 'psm', 'raft', 'cre', 'sea-raft', 'unimatch', 'foundation', 'monster', 'defom'

如果在使用例如 foundationstereo 或者 monster 这样参数量大的模型遇到显存不足的问题,可以调节

res = model.update(frame1, frame2, rate=1, remap=True)

中 rate 参数,0~1 表示对图像的缩放比例,越小越省显存但是会降低精度。

update 函数输出是一个字典,包含所有可能需要的结果,有些结果在参数设置不完全的情况下会为 None

res = {'disparity' : None,     # 视差 H*W'threeD' : None,        # 点云 H*W*3'disp_gray' : None,     # 归一化黑白深度图 H*W'disp_map' : None,      # 归一化彩色深度图 H*W'image1' : None,        # 畸变校正左视角图 H*W*3'image2' : None,        # 畸变校正右视角图 H*W*3'image1_org' : None,    # 左视角原始图 H*W*3'image2_org' : None,    # 右视角原始图 H*W*3}

可以在模型初始化中设置参数,具体可以看单独的模型文件参数

例如设置 raft stereo 的运行参数:

model = Model(model_name='raft', params={'mode':'realtime', 'valid_iters':7, 'corr_implementation':'reg_cuda'},camera_config='model_data/camera_config_dechuang_640x480.yaml',)

camera_config 参数指的是相机内参,如果包含会进行畸变矫正和三维重建,否则只能输出视差图。

指定 sgbm 的参数文件:

model = Model(model_name='sgbm', yaml_path='model_data/sgbm.yaml')

这里可以调节 SGBM 模型的各种参数

本项目提供了6种转换好的 onnx 模型,除了 unimatch 和 sgbm 均可以转换
如果有参数调整要重新输出 onnx 可以执行
utils/make_onnx.py

该脚本默认导出

在其中选定模型的名称即可,输出路径使用默认路径。
完成上述步骤后,可以在 model 初始化时指定使用onnx模式推理,例如

model = Model(model_name='foundation', camera_config='model_data/camera_config_dechuang_640x480.yaml',onnx=True,trt_flag=True,)

如果使用 tensorrt 第一次构建引擎需要较长时间,要耐心等待,速度能看到显著提升。

如果遇到内存不足的情况,可以尝试增加交换空间来实现 (建议这一步提前运行!)

Linux:

sudo fallocate -l 64G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

恢复之前的交换空间

sudo swapoff /swapfile
sudo rm /swapfile

windows:

输入栏输入 环境变量 ,双击打开 编辑系统环境变量,选择 高级 ,打开 性能 中的 设置 ,选择高级 ,点击 虚拟内存更改,选择磁盘和自定义大小,全部确定即可

参考
https://blog.csdn.net/weixin_74261199/article/details/141068435

3.2 深度目标测距+显示点云

如果有标定参数可以运行 test_file.py 显示三维点云。
标定参数在如下位置设置:

camera_config = CameraConfig('model_data/camera_config.yaml')

注意上述默认的参数并不通用!!!如果是你自己的相机需要单独修改!!!

设置 YOLO_DETETCT = True 表示是否进行 yolo 目标检测

if YOLO_DETETCT:from ultralytics import YOLOfrom utils.mask_process import draw_image, get_decodesyolo = YOLO('./model_data/yolov8-seg-face.pt')

修改 './model_data/yolov8-seg-face.pt' 为你的模型的路径

获得检测信息

在代码中间

if YOLO_DETETCT:results = yolo.predict(imgL, conf=0.4)[0]decodes = get_decodes(results, yolo.names, model)imgL_board  = draw_image(imgL, decodes, mode='whxyz') 

其中 get_decodes 函数还有一个输入参数 center=True,表示是否使用标注框中心点的世界坐标作为输出结果,如果设置为 False 则表示使用滤波模型(见 3.5

decodes 表示一个列表,包含若干个字典,其中每个字典的格式如下,供取用:

dict1 = {# 标注框信息'x1': x1,'y1': y1,'x2': x2,'y2': y2,# 掩码矩阵(如果使用yolo-seg)'mask': mask_mat, 'class_name':class_name,# 世界坐标xyz'x':x,'y':y,'z':z,'mask_flag':mask_flag,# 宽高'width':width,'height':height,# 颜色'color':colors[class_id]}

mode 表示显示内容,此处为 ‘whxyz’ 表示显示宽高+世界坐标xyz

Space 显示点云,按 Esc 退出

3.3 相机实时检测

运行 test_cam.py 可以看到实时显示结果
关于摄像头参数设定参考 2.1

3.4 测试双目视频

运行 test_video.py,可以修改自己的视频路径,本例提供一个测试视频和与其对应的相机内参检测,保存结果为左视角图像和深度图的拼接结果。

http://www.xdnf.cn/news/15140.html

相关文章:

  • 力扣61.旋转链表
  • 【WEB】Polar靶场 Day7 详细笔记
  • 北京-4年功能测试2年空窗-报培训班学测开-第四十六天
  • 高效集成-C#全能打印报表设计器诞生记
  • C++—拷贝构造函数
  • 深度学习模型表征提取全解析
  • SpringBoot mybatis
  • LeetCode经典题解:1、两数之和(Two Sum)
  • [2025CVPR]Mr. DETR:检测Transformer的多路由指导训练解析
  • SpringGateway网关增加https证书验证
  • Redis-哨兵选取主节点流程
  • 第4章:实战项目一 打造你的第一个AI知识库问答机器人 (RAG)
  • 数据库技术体系及场景选型方案
  • 【机器学习】BeamSearch算法
  • 10.9 大模型训练数据优化实战:3步让准确率从68%飙升至79%
  • 3、Unity免费插件整合
  • git入门之安装tortoisegit
  • UNet改进(19):基于残差注意力模块Residual Attention的高效分割网络设计
  • 三码合一:OneCode注解驱动的新时代编码范式
  • 【算法训练营Day10】栈与队列part2
  • TCP协议格式与连接释放
  • Python 机器学习核心入门与实战进阶 Day 7 - 复盘 + 综合实战挑战
  • java idea 本地debug linux服务
  • C++STL-String
  • 题解:P13017 [GESP202506 七级] 线图
  • spring-data-jpa + Alibaba Druid多数据源案例
  • Flutter基础(前端教程⑧-数据模型)
  • NHibernate案例
  • thinkphp使用redis抢单实例
  • 提取出Wallpaper Engine壁纸的mpkg类静态壁纸