环境感知算法——3.PSMNet基于Kitti数据集训练

news2024/11/26 14:30:19

1. 前言

PSMNet的核心思想是通过金字塔结构来捕捉不同尺度的特征信息,从而提高视差估计的精度。其亮点在于:(1)使用了金字塔形的卷积神经(SPP module)网络来提取不同尺度的特征信息;(2)使用了cost volume来捕捉不同视角之间的匹配信息;(3)引入了多分辨率的3D CNN,用于处理cost volume以进行深度估计。

2.环境配置

PSMNet源工程的GitHub链接如下:
https://github.com/JiaRenChang/PSMNeticon-default.png?t=N4P3https://github.com/JiaRenChang/PSMNet下载上述工程,获得PSMNet-master工程文件夹。

作者也给出了在Kitti数据集上训练获得的.tar模型:
https://drive.google.com/file/d/1pHWjmhKMG4ffCrpcsp_MTXMJXhgl3kF9/viewicon-default.png?t=N4P3https://drive.google.com/file/d/1pHWjmhKMG4ffCrpcsp_MTXMJXhgl3kF9/view

上述预训练模型名称为pretrained_model_KITTI2015.tar,文件大小21MB。

笔者的训练环境Ubuntu20.04+Pytorch1.6,硬件为RTX2080Ti(22G显存)。

GPU驱动配置请参考:《环境感知算法——1.简介与GPU驱动、CUDA和cudnn配置》icon-default.png?t=N4P3https://blog.csdn.net/wenquantongxin/article/details/130858818

1)创建PSMNet虚拟环境

conda create -n PSMNet python=3.7
conda activate PSMNet
conda install pytorch==1.6.0 torchvision==0.7.0 -c pytorch
conda install scikit-image
pip install opencv-python

2)准备数据集

数据集需要整理为两个文件夹data_scene_flow、data_scene_flow_calib。以使⽤KITTI stereo 2015数据集为例, 从官⽹下载Stereo 2015数据集中的stereo 2015/flow 2015/scene flow 2015 data set (2 GB)和calibration files (1 MB)。

The KITTI Vision Benchmark Suiteicon-default.png?t=N4P3https://www.cvlibs.net/datasets/kitti/eval_scene_flow.php?benchmark=stereo或通过以下云盘链接下载:

https://pan.baidu.com/s/1p3oyglhMvVv0rTE-x-C9ig?pwd=yao1icon-default.png?t=N4P3https://pan.baidu.com/s/1p3oyglhMvVv0rTE-x-C9ig?pwd=yao1

3)可视化预训练模型在KITTI testing集上的结果

为了避免出现以下错误:

TypeError: unsupported operand type(s) for //: 'str' and 'int'

需要将models/stackhourglass.py的第55行改为

self.maxdisp = int(maxdisp)

使用以下代码对于预训练模型在Kitti 2015数据集上进行测试评估。

cd .../PSMNet-master
    python submission.py --maxdisp 192 \
    --model stackhourglass \
    --KITTI 2015 \
    --datapath .../data_scene_flow/testing/ \
    --loadmodel .../pretrained_model/pretrained_model_KITTI2015.tar

请根据实际修改其中的testing数据集的路径和预训练数据集的路径。运行上述代码,会在PSMNet-master文件夹内生成(大量)识别后的伪彩色深度图。

3. 训练PSMNet

首先需要依次修改以下代码:

a)为了避免出现以下TabError错误:

TabError: inconsistent use of tabs and spaces in indentation

需要调整finetune.py对应第158行及以下的缩进:

def main():
    max_acc=0
    max_epo=0
    start_full_time = time.time()

    for epoch in range(1, args.epochs+1):
        total_train_loss = 0
        total_test_loss = 0
        adjust_learning_rate(optimizer,epoch)
           
               ## training ##
        for batch_idx, (imgL_crop, imgR_crop, disp_crop_L) in enumerate(TrainImgLoader):
            start_time = time.time() 

            loss = train(imgL_crop,imgR_crop, disp_crop_L)
            print('Iter %d training loss = %.3f , time = %.2f' %(batch_idx, loss, time.time() - start_time))
            total_train_loss += loss
        print('epoch %d total training loss = %.3f' %(epoch, total_train_loss/len(TrainImgLoader)))
	   
               ## Test ##

        for batch_idx, (imgL, imgR, disp_L) in enumerate(TestImgLoader):
            test_loss = test(imgL,imgR, disp_L)
            print('Iter %d 3-px error in val = %.3f' %(batch_idx, test_loss*100))
            total_test_loss += test_loss


        print('epoch %d total 3-px error in val = %.3f' %(epoch, total_test_loss/len(TestImgLoader)*100))
        if total_test_loss/len(TestImgLoader)*100 > max_acc:
            max_acc = total_test_loss/len(TestImgLoader)*100
        max_epo = epoch
        print('MAX epoch %d total test error = %.3f' %(max_epo, max_acc))

	   #SAVE
        savefilename = args.savemodel+'finetune_'+str(epoch)+'.tar'
        torch.save({
		    'epoch': epoch,
		    'state_dict': model.state_dict(),
		    'train_loss': total_train_loss/len(TrainImgLoader),
		    'test_loss': total_test_loss/len(TestImgLoader)*100,
		}, savefilename)
	
        print('full finetune time = %.2f HR' %((time.time() - start_full_time)/3600))
    print(max_epo)
    print(max_acc)

b)为了避免出现以下ModuleNotFoundError错误:

ModuleNotFoundError: No module named 'preprocess'

需要更改dataloader/KITTILoader.py第9行代码为

from . import preprocess

c)为了避免出现以下RuntimeError错误:

RuntimeError: CUDA out of memory. 

需要修改finetune.py中的batch_size大小,视GPU显存而定(Tips:训练batch_size取2时,GPU所需显存约为7GB)。

#对于Line59修改
batch_size= 2, shuffle= True, num_workers= 8, drop_last=False)
#对于Line63修改
batch_size= 2, shuffle= False, num_workers= 4, drop_last=False)

d)为了避免出现以下IndexError错误:

IndexError: invalid index of a 0-dim tensor. Use `tensor.item()` in Python or `tensor.item<T>()` in C++ to convert a 0-dim tensor to a number

需要修改finetune.py 第114行:

return loss.item()

e)为了避免在训练中(一般发生在epoch 1结束后)出现如下错误:

IndexError: index xxx is out of bounds for dimension 1 with size 1

修改finetune.py 第131行:

disp_true[index[0][:], index[1][:], index[2][:]] = np.abs(true_disp[index[0][:], index[1][:], index[2][:]]-pred_disp[index[0][:], 0, index[1][:], index[2][:]])

f)训练之前应预先在PSMNet-master文件夹下新建trained文件夹,否则会出现如下错误:

[Errno 2] No such file or directory: './trained/finetune_1.tar'

完成上述代码修改,可使用以下代码finetune网络:

cd .../PSMNet-master
python finetune.py --maxdisp 192 \
    --model stackhourglass \
    --datatype 2015 \
    --datapath .../data_scene_flow/training/ \
    --epochs 300 \
    --loadmodel .../pretrained_model/pretrained_model_KITTI2015.tar \
    --savemodel ./trained

4. 对于训练获得的PSMNet神经网络进行评估 

使用以下代码进行评估:

cd .../PSMNet-master
python submission.py --maxdisp 192 \
    --model stackhourglass \
    --KITTI 2015 \
    --datapath .../data_scene_flow/testing/ \
    --loadmodel .../PSMNet-master/trained/finetune_300.tar

请对应修改datapath目录。代码所示的finetune_300.tar为训练300epochs后保存的神经网络。评估同样会在PSMNet-master文件夹内生成大量伪彩色深度图。

可以通过以下代码进行(美观化)上色:

# coding=utf-8
import cv2
import numpy as np

# 读取视差图
disparity_map = cv2.imread('000107_10.png', cv2.IMREAD_UNCHANGED)

# 将视差图转换为深度图
depth_map = np.zeros(disparity_map.shape, dtype=np.float32)
invalid_mask = disparity_map == 0
valid_mask = np.logical_not(invalid_mask)
depth_map[valid_mask] = 1.0 / (disparity_map[valid_mask].astype(np.float32) / 255.0)

# 将深度图转换为彩色深度图
depth_map_normalized = cv2.normalize(depth_map, None, 0, 1, cv2.NORM_MINMAX)
depth_map_colored = cv2.applyColorMap(np.uint8(depth_map_normalized * 255), cv2.COLORMAP_JET)

# 显示彩色深度图
cv2.imshow('Colored Depth Map', depth_map_colored)
cv2.waitKey(0)

可以获得更直观的效果。

部分识别结果如下:

a)testing的第156号图片,街景两侧多个车辆均有效识别,体积、位置、形状正确。

 

b)testing的第174号图片,行人有效识别但左侧的建筑边界由于纹理特征不明显,没有合理地估计出深度。 

 

c)testing的第132号图片,右下角镜头边缘由于镜头畸变、近景左右相机拍摄部分不全等原因,出现了预测小范围失真的情况,但整体来讲预测精度较好。

 d)testing的第186号图片。

 

5. 总结

PSMNet的训练过程需要大量的时间和计算资源,网络结构比较复杂,且需要在多个尺度上进行处理;模型对于纹理较少的区域或者低对比度的区域的深度估计结果不够准确,容易出现误匹配现象。
可以考虑进一步优化网络结构,减少网络参数和计算量,提高训练和推理效率;引入更多的先验知识,在训练时可以通过数据增强的方式加入不同光照条件下的图像数据,从而提高模型对光照变化的适应性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/595833.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【UR机械臂ros通讯前的示教器网络配置】

1. 前言 欢迎大家阅读2345VOR的博客【D435i深度相机YOLO V5结合实现目标检测】&#x1f973;&#x1f973;&#x1f973;2345VOR鹏鹏主页&#xff1a; 已获得CSDN《嵌入式领域优质创作者》称号&#x1f47b;&#x1f47b;&#x1f47b;&#xff0c;座右铭&#xff1a;脚踏实地&…

《新程序员005:开源深度指南新金融背后的科技力量》

各位CSDN的uu们你们好呀&#xff0c;今天&#xff0c;小雅兰来写书评啦&#xff0c;尽管再忙&#xff0c;也不能不读书&#xff0c;下面&#xff0c;就让小雅兰来带你们走进《新程序员005&#xff1a;开源深度指南&新金融背后的科技力量》这本书的世界吧&#xff01;&#…

安科瑞医用隔离电源系统在浙江某医院项目中的应用

【摘要】介绍该三级乙等综合医院采用安科瑞医用隔离电源系统&#xff0c;使用分体配电柜安装方式&#xff0c;从而实现将TN系统转化为IT系统&#xff0c;以及系统绝缘情况监测。 【关键词】医用隔离电源系统&#xff1b;IT系统&#xff1b;绝缘情况监测&#xff1b;三级乙等综合…

华为OD机试真题 Java 实现【最差产品奖】【2023Q1 200分】

一、题目描述 A公司准备对他下面的N个产品评选最差奖,评选的方式是首先对每个产品进行评分,然后根据评分区间计算相邻几个产品中最差的产品。评选的标准是依次找到从当前产品开始前M个产品中最差的产品,请给出最差产品的评分序列。 二、输入描述 第一行,数字M,表示评分…

chatgpt赋能python:用Python编写软件能够带来哪些SEO优势?

用 Python 编写软件能够带来哪些 SEO 优势&#xff1f; Python 是一种高级编程语言&#xff0c;它的简洁性和易学性让 Python 成为现今最受欢迎的编程语言之一&#xff0c;适用于各种类型的编程任务&#xff0c;并且可以轻松地生成各种种类的软件。在构建网站和应用程序时&…

黑马Redis视频教程实战篇(四)

目录 一、秒杀优化 1.1、秒杀优化-异步秒杀思路 1.2、秒杀优化-Redis完成秒杀资格判断 1.3、秒杀优化-基于阻塞队列实现秒杀优化 二、Redis消息队列 2.1、认识消息队列 2.2、基于List实现消息队列 2.3、基于PubSub的消息队列 2.4、基于Stream的消息队列 2.5、基于Str…

【C++初阶】C++STL详解(一)—— string类

​ ​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;C初阶 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 文章目录 CSTL详解&#xff08;一…

6.3 SpringBoot日志进阶实战 Logback配置详解

文章目录 前言一、Logback入门级配置二、动态指定属性三、动态指定日志级别四、指定配置文件五、滚动记录RollingFIleAppender六、异步记录AsyncAppender总结最后 前言 在上一篇文章中&#xff0c;我和你介绍了SpringBoot快速入门Slf4j Logback实战&#xff0c;遗留的问题是如…

数据中心末端配电的数字化方案及设备选型

普通PDU和智能PDU有什么区别&#xff1f; 机架安装配电盘或机架配电单元 (PDU) 是一种配备许多插座的设备&#xff0c;可将电力分配给位于数据中心机架或机柜内的服务器、存储设备和网络设备。领先的分析公司 IHS 将它们分为两大类&#xff1a; 1) 基本 PDU 提供可靠的配电。 2…

【2023 · CANN训练营第一季】TIK C++算子开发入门 第一章——TIK C++算子开发入门

1.TIK C介绍 TIK C是一种使用C/C作为前端语言的算子开发工具&#xff0c;通过四层接口抽象、并行编程范式、孪生调试等技术&#xff0c;极大提高算子开发效率&#xff0c;助力AI开发者低成本完成算子开发和模型调优部署 使用TIK C开发自定义算子的优势&#xff1a; (1)C/C原语…

如何编写代码审查文档

一、前言 代码审查(Code Review)是开发流程中非常重要的一个环节&#xff0c;可以帮助发现并改正代码中的错误&#xff0c;提高代码质量&#xff0c;也是共享知识、熟悉代码的好机会。 最近功能开发完毕需要做代码审查&#xff0c;发现国内很多公司不强制要求编写代码审查文档…

【Linux内网穿透】】Linux本地搭建GitLab服务器 - 内网穿透远程访问

文章目录 前言1. 下载Gitlab2. 安装Gitlab3. 启动Gitlab4. 安装cpolar内网穿透5. 创建隧道配置访问地址6. 固定GitLab访问地址6.1 保留二级子域名6.2 配置二级子域名 7. 测试访问二级子域名 转载自cpolar极点云文章&#xff1a;Linux搭建GitLab私有仓库&#xff0c;并内网穿透实…

chatgpt赋能python:Python的就业前景——解析云计算与Python的结合

Python的就业前景——解析云计算与Python的结合 Python是一种高级编程语言&#xff0c;具有高度的可读性和简洁性&#xff0c;并已成为Web和大数据的主流语言之一。Python广泛应用于数据科学&#xff0c;机器学习&#xff0c;Web开发&#xff0c;游戏开发和金融等领域&#xf…

Linux_epoll

Linux_epoll 思考:高效的餐厅服务如何实现?Epoll - Reactor 设计模式Epoll 与 Reactor 设计模式的关系Reactor优点Epoll - IO多路复用的用法web_server示例代码水平触发和边缘触发思考:高效的餐厅服务如何实现? 一个顾客来就餐,一个服务员在顾客点菜期间全程陪同服务! 一个…

并发编程总结

synchronized synchronized有如下3种使用方式 普通同步方法&#xff0c;锁是当前实例对象 静态同步方法&#xff0c;锁是当前类的class对象 同步方法块&#xff0c;锁是括号里面的对象 当一个线程访问同步代码块时&#xff0c;需要获得锁才能执行&#xff0c;当退出或者抛…

chatgpt赋能python:Python修改BIOS:一篇专业的SEO文章

Python修改BIOS&#xff1a;一篇专业的SEO文章 介绍 BIOS&#xff08;Basic Input/Output System&#xff09;是计算机中的核心程序&#xff0c;它负责启动电脑并管理硬件。一旦发现硬件问题&#xff0c;BIOS会通知用户或操作系统。它还可以设置系统的参数&#xff0c;例如时…

Node.js安装教程(npm搭建) - Window

择心】向大家介绍安装Node.js ( npm搭建 ) 一、安装流程 进入Node.js 去下载一个安装包。 双击下载好的应用程序,弹出安装界面并点击Next&#xff0c; 接受协议&#xff0c;点击Next&#xff0c; 更改默认安装路径&#xff0c;点击Next&#xff0c; 会默认添加到Path环境…

【每周一书】--(认知觉醒)思考:如何用清爽的情绪面对内卷的当下?

【每周一书】--&#xff08;认知觉醒&#xff09;思考&#xff1a;如何用清爽的情绪面对内卷的当下&#xff1f; 认知觉醒&#xff1a;开启自我改变的原动力焦虑&#xff1a;焦虑的根源完成焦虑定位焦虑选择焦虑环境焦虑难度焦虑 如何拥有清爽的情绪&#xff0c;释放焦虑情绪 认…

记录使用Pytorch分布式训练(torch.distributed)踩过的坑

引言 最近由于想加速神经网络模型训练&#xff0c;便开始着手学习pytorch的分布式训练&#xff08;DDP&#xff09;&#xff0c;结果踩了很多坑&#xff0c;在这里记录一下&#xff0c;便于以后查看&#xff0c;也同时分享给大家。 教程 我是通过下面几篇博客学习pytorch分布…

JVM类加载器及其详解

1.JVM加载过程分析 1.1加载流程图 1.2双亲委派机制 引导类加载器&#xff1a;负责加载支撑JVM运行的位于JRE的lib目录下的核心类库&#xff0c;比如rt.jar、charsets.jar等扩展类加载器&#xff1a;负责加载支撑JVM运行的位于JRE的lib目录下的ext扩展目录中的JAR类包应用程序…