大家好,欢迎来到IT知识分享网。
一、Download PVO
官方下载地址:
https://github.com/zju3dv/pvohttps://github.com/zju3dv/pvo
linux中,使用git下载最方便:
git clone https://github.com/zju3dv/PVO.git
但是有时候git下载很慢,可以考虑IDM下载器下载(IDM虽然速度慢点,但是比较稳定,不像X雷需要加钱提速,或者有时候经常断线,RENMINGBI的玩家)。
Internet Download Manager: The fastest download acceleratorInternet Download Manager (IDM) is a tool to increase download speeds by up to 5 times, resume or schedule downloads and download streaming videoshttps://www.internetdownloadmanager.com/
二、Configure PVO
首先参照github中的”prepare.md”进行配置。
prepare.md:https://github.com/zju3dv/PVO/blob/main/prepare.mdhttps://github.com/zju3dv/PVO/blob/main/prepare.md
prepare.md主要配置PVO运行的conda环境、编译VO_Module和VPS_Module、安装panopticapi和生成中间变量等。
1、checkpoint
(1)下载视频分割预训练模型(panFPN.pth)
百度网盘 请输入提取码百度网盘为您提供文件的网络备份、同步和分享服务。空间大、速度快、安全稳固,支持教育网加速,支持手机端。注册使用百度网盘即可享受免费存储空间https://pan.baidu.com/s/1ncSi_EihY479SkCEFLHYzw?pwd=zsjq
(2)下载VO_Module预训练模型(vkitti2_dy_train_semiv4_080000.pth)
百度网盘 请输入提取码百度网盘为您提供文件的网络备份、同步和分享服务。空间大、速度快、安全稳固,支持教育网加速,支持手机端。注册使用百度网盘即可享受免费存储空间https://pan.baidu.com/s/10_tIdaDPf5DjgmU9O6iVYg?pwd=nei5
下载之后放在checkpoint目录
2、droidenv env
(1)配置conda环境
# 使用.yml文件配置conda环境 conda env create -f VO_Module/environment.yml # 安装evo, evo主要用于slam的性能评测 pip install evo --upgrade --no-binary evo # 安装gdown, gdown是Google下载器 pip install gdown
(2)编译VO_Module
首先进入VO_Module和VPS_Module目录,进行编译安装这两个模块,执行:
# 激活conda环境 conda activate droidenv # 开始安装VO_Module python setup.py install
可能会出现:
/home/ljh/VSLAM/PVO/VO_Module/thirdparty/eigen/Eigen/SparseCore:11:10: fatal error: Core: 没有那个文件或目录 11 | #include "Core" | ^~~~~~ compilation terminated.
说明没有安装Eigen。
首先下载eigen-3.3.7并安装,安装完成之后,将安装目录下的Core目录拷贝至/home/xxx/VSLAM/PVO/VO_Module/thirdparty/eigen/Eigen/src/。
然后将所有的报错都在最前面加上”Eigen/”,类似于:
#include “Eigen/Core”。
安装eigen-3.3.7,请参考:
CVPR2023-PVO(Panoptic Visual Odometry)项目安装详解
(3)设置VPS_Module环境
以下几个步骤都是在PVO项目根目录下执行:
# 激活conda环境 conda activate droidenv # 安装配置cuda conda install pytorch==1.9.0 torchvision cudatoolkit=11.1 -c pytorch -c nvidia # 安装配置VPS_Module python -m pip install -e VPS_Module # 安装配置panopticapi pip install git+https://github.com/cocodataset/panopticapi.git
在执行”pip install git+https://github.com/cocodataset/panopticapi.git“的时候,可能因为网络速度的原因,经常失败,可以先离线下载再安装。
离线安装方法:
下载panopticapi-master.zip之后,解压。进入panopticapi-master文件夹,执行:
python setup.py install
即可。
(4)数据集下载
a. 下载数据集
新建文件夹:datasets/Virtual_KITTI2
在您初次运行”sh tools/datasets/generate_vkitti_datasets.sh”的时候,绝对会出现一大堆的” XXX file not found“。
需要下载的数据集有:
(1) vkitti_2.0.3_rgb.tar (rgb数据,必须)
(2) vkitti_2.0.3_classSegmentation.tar (类分割,必须)
(3) vkitti_2.0.3_instanceSegmentation.tar (实例分割,必须)
(4) vkitti_2.0.3_textgt.tar.gz (相机各种参数,必须)
(5) vkitti_2.0.3_depth.tar (深度值,必须)
(6) vkitti_2.0.3_forwardFlow.tar (前向流,必须)
(7) vkitti_2.0.3_backwardFlow.tar (后向流,必须)
(8) vkitti_2.0.3_forwardSceneFlow.tar (前向场景流,必须)
(9) vkitti_2.0.3_backwardSceneFlow.tar (后向场景流)
首先将必须要的数据集解压到Virtual_KITTI2目录,如下。
b.生成用于训练和评估的数据
# 激活conda conda activate droidenv # 产生vkitti数据集 sh tools/datasets/generate_vkitti_datasets.sh # 产生动态掩码 python tools/datasets/generate_dynamic_masks.py
sh tools/datasets/generate_vkitti_datasets.sh脚本执行结果如下:
没有出错,表明执行成功。
接着运行”python tools/datasets/generate_dynamic_masks.py“,可能会出现下面的错误:
通过分析,发现原因是项目中,作者有一个地方没有做修改,还是用的是Neural-iMAP中的包。
PVO/tools/datasets/generate_dynamic_masks.py中第8行:
原文:sys.path.append(‘Neural-iMAP/droid_slam’)
修改为:sys.path.append(‘VO_Module/droid_slam’)
运行”python tools/datasets/generate_dynamic_masks.py” ,可能会出现2个错误:
针对错误1:
原因是自己的服务器配置太laji了,num_workers需要设置小点。
修改文件PVO/tools/datasets/generate_dynamic_masks.py中第24行:
原文:train_loader = DataLoader(db, batch_size=1, num_workers=2)
修改之后:train_loader = DataLoader(db, batch_size=1, num_workers=0)
修改之后变成:
针对错误2:
原因可能是项目中,作者将路径配置不正确。
修改方法:
vim /home/ljh/VSLAM/PVO/VO_Module/droid_slam/data_readers/vkitti2.py
大约在88行左右,将该判断修改为如下:
if self.flow_label: fo_flows = sorted( glob.glob(osp.join(scene, VKitti2.split[self.split_mode], 'frames/forwardFlow/Camera_0/*.png'))) ba_flows = sorted( glob.glob(osp.join(scene, VKitti2.split[self.split_mode], 'frames/backwardFlow/Camera_0/*.png'))) # 作者原来的写法 ''' scene:datasets/Virtual_KITTI2/Scene01 VKitti2.split[self.split_mode]:clone/15-deg-left 也就是说,作者在查找分割结果的时候,在路径:datasets/Virtual_KITTI2/Scene01/clone/panoptic_gt_id/*.png中查找, 而分割结果保存在:datasets/Virtual_KITTI2/ALL_clone/panoptic_gt_id/*.png中。 ''' #segments = sorted(glob.glob(osp.join(scene, VKitti2.split[self.split_mode], '/panoptic_gt_id/*.png'))) # *huarzail:开始修改 # huarzail:修改之后的写法。 path = "datasets/Virtual_KITTI2/ALL_" + VKitti2.split[self.split_mode] + '/panoptic_gt_id/*.png' segments = sorted(glob.glob(path)) # *huarzail:结束修改 scene_info[scene] = {'images': images, 'depths': depths, 'fo_flows': fo_flows, 'ba_flows': ba_flows, 'poses': poses, 'intrinsics': intrinsics, 'segments' : segments} else: masks = sorted( glob.glob(osp.join(scene, VKitti2.split[self.split_mode], 'frames/dynamicMask/Camera_0/*.npy'))) # 按理说,下面这句话也需要改,但是作者没有提供panFPN_segm分割的结果,可以暂时不用管。 segments = sorted( glob.glob(osp.join(scene, VKitti2.split[self.split_mode], 'panFPN_segm/*.png'))) scene_info[scene] = {'images': images, 'depths': depths, 'dymasks': masks, 'poses': poses, 'intrinsics': intrinsics, 'graph': graph, 'segments': segments, }
三、Test on vkitti 15-deg-left datasets
首先参照github中的”prepare.md”进行配置(参照上述步骤2)。
1、generate inital panoptic segmentation.
产生初始化全景分割,用于VPS初始化。
这里是使用PanopticFPN[1]算法,进行所有的图片进行分割,初始化VPS。
sh tools/initial_segmentation.sh
tools/initial_segmentation.sh 内容如下:
# generate initial segmentation CUDA_VISIBLE_DEVICES=0 python3 -W ignore VPS_Module/tools/train_net.py \ --config-file VPS_Module/configs/COCO-PanopticSegmentation/panoptic_fpn_R_50_3x_vkitti_init_clone.yaml --num-gpu 1 \ --eval-only MODEL.WEIGHTS checkpoints/panFPN.pth \ OUTPUT_DIR shared_data/panoptic_segm_init_clone/ CUDA_VISIBLE_DEVICES=0 python3 -W ignore VPS_Module/tools/train_net.py \ --config-file VPS_Module/configs/COCO-PanopticSegmentation/panoptic_fpn_R_50_3x_vkitti_init_test.yaml --num-gpu 1 \ --eval-only MODEL.WEIGHTS checkpoints/panFPN.pth \ OUTPUT_DIR shared_data/panoptic_segm_init_15-deg-left/ # split initial segmentation into datasets/ python tools/split_init_segm.py
源码分析:
命令:
的作用是将clone子场景和15-deg-left子场景,将分割的结果进行数据拷贝。
''' 针对clone子场景 将PanopticFPN算法初步分割的结果复制到datasets中 shared_data/panoptic_segm_init_clone/inference/pan_seg复制到datasets/Virtual_KITTI2/Scene01/clone/panFPN_segm '''''' 针对15-deg-left子场景 将PanopticFPN算法初步分割的结果复制到datasets中 shared_data/panoptic_segm_init_15-deg-left/inference/pan_seg复制到datasets/Virtual_KITTI2/Scene01/15-deg-left/panFPN_segm '''
运行结果为:
2、vps->vo,vo Module generate pose, flow and depth.
vps增强vo,产生pose, flow and depth。
sh tools/test_vo_scene.sh
可能会出现如下错误:
错误1:
vim VSLAM/PVO/VO_Module/droid_slam/droid_net.py
295行原文:lay = torch.as_tensor(np.range(1, num+1).repeat(ht*wd).reshape(num,ht,wd)).unsqueeze(0)
295行改为:
lay = torch.as_tensor(np.arange(1, num+1).repeat(ht*wd).reshape(num,ht,wd)).unsqueeze(0)
这个地方的修改非常关键,很多错误都是由这个错误引起的。
错误2:
/home/ljh/anaconda3/envs/droidenv/lib/python3.9/site-packages/torch/functional.py:445: UserWarning: torch.meshgrid: in an upcoming release, it will be required to pass the indexing argument. (Triggered internally at /opt/conda/conda-bld/pytorch_61/work/aten/src/ATen/native/TensorShape.cpp:2157.)
return _VF.meshgrid(tensors, kwargs) # type: ignore[attr-defined]
解决方法:
vim /home/ljh/anaconda3/envs/droidenv/lib/python3.9/site-packages/torch/functional.py
445行原文:return _VF.meshgrid(tensors, kwargs) # type: ignore[attr-defined]
445行改为:return _VF.meshgrid(tensors, kwargs, indexing=’ij’) # type: ignore[attr-defined]
错误3:
Traceback (most recent call last):
File “/home/ljh/VSLAM/PVO/VO_Module/evaluation_scripts/test_vo2.py”, line 93, in <module>
for i_batch, item in enumerate(train_loader):
File “/home/ljh/anaconda3/envs/droidenv/lib/python3.9/site-packages/torch/utils/data/dataloader.py”, line 521, in __next__
data = self._next_data()
File “/home/ljh/anaconda3/envs/droidenv/lib/python3.9/site-packages/torch/utils/data/dataloader.py”, line 1203, in _next_data
return self._process_data(data)
File “/home/ljh/anaconda3/envs/droidenv/lib/python3.9/site-packages/torch/utils/data/dataloader.py”, line 1229, in _process_data
data.reraise()
File “/home/ljh/anaconda3/envs/droidenv/lib/python3.9/site-packages/torch/_utils.py”, line 434, in reraise
raise exception
IndexError: Caught IndexError in DataLoader worker process 0.
解决方法:
vim /home/ljh/VSLAM/PVO/VO_Module/evaluation_scripts/test_vo2.py
93行原文:train_loader = DataLoader(db, batch_size=1, num_workers=2)
93行修改为:train_loader = DataLoader(db, batch_size=1, num_workers=0) # huarzail
错误4:
原因:
pytorch中的torch.Tensor数据类型和lietorch中的at::Tensor数据类型不匹配。(正常情况下是可以自动隐式转换,但是到了PVO里面,就出错了)
解决方法:
使用tensor.data_ptr()函数,显示转换数据类型。
进入/home/ljh/VSLAM/PVO/VO_Module,重新编译:VO_Module
python setup.py install
错误5:
/home/ljh/VSLAM/PVO/VO_Module/droid_slam/geom/ba.py:75: UserWarning: __floordiv__ is deprecated, and its behavior will change in a future version of pytorch. It currently rounds toward 0 (like the ‘trunc’ function NOT ‘floor’). This results in incorrect rounding for negative values. To keep the current behavior, use torch.div(a, b, rounding_mode=’trunc’), or for actual floor division, use torch.div(a, b, rounding_mode=’floor’).
jj = jj // rig – fixedp
原因:警告提示的是在使用__floordiv__
操作符进行整除运算时的变更情况。在未来的 PyTorch 版本中,__floordiv__
的行为将发生改变。
解决方法:
vim /home/ljh/VSLAM/PVO/VO_Module/droid_slam/geom/ba.py
大约74行左右,修改为:
ii = torch.div(ii, rig, rounding_mode='floor') - fixedp jj = torch.div(jj, rig, rounding_mode='floor') - fixedp
3、vo->vps, vps Module use flow and depth from vo Module and generate final video panoptic segmentation results and vpq.
vo增强vps,vps模块利用从vo模块中产生的flow和depth,来产生最后的视频全景分割结果。
sh tools/test_vps.sh
可能出现的错误:
问题1:
解决方法:
这个地方明显是作者在发布项目的时候,没有修改他的路径。
vim VSLAM/PVO/VPS_Module/detectron2/data/datasets/others.py
107行原文:flow_dir = “/mnt/nas_8/group/lanxinyue/droid_slam_output/full_flow”
107行修改为:flow_dir = “shared_data/full_flow”
问题2:
vim /home/ljh/VSLAM/PVO/VPS_Module/detectron2/modeling/meta_arch/panoptic_fpn.py
194行原文:images = [v[“image”].to(self.device) for k,v in seq.items()]
194行修改为:images = [v[“image”].to(self.device) for k,v in seq.items() if v[“image”] is not None]
附录
以Virtual_KITTI2/Scene01/clone为例,查看三种数据集(rgb、instanceSegmentation和classSegmentation)的样式。
(1) rgb
Virtual_KITTI2/Scene01/clone/frames/rgb/Camera_0/rgb_00000.jpg
(2) instanceSegmentation
Virtual_KITTI2/Scene01/clone/frames/instanceSegmentation/Camera_0/instancegt_00000.png
(3) classSegmentation
Virtual_KITTI2/Scene01/clone/frames/classSegmentation/Camera_0/classgt_00000.png
(4) PanopticFPN
使用PanopticFPN[1]算法初步分割结果。可以看出,分割的还是比较粗糙。
PVO/shared_data/panoptic_segm_init_clone/inference/pan_seg/0001_00000.png
(5) depth
extrinsic.txt:
——————————————————————————————————————————-
——————————————————————————————————————————-
参数解释:
frame:视频帧ID (starts from 0)
cameraID: 相机ID (between 0 and 5)
ri,j: 相机旋转矩阵R的系数,ti是相机平移向量T的系数。
r1,1 r1,2 r1,3 t1
Extrinsic = r2,1 r2,2 r2,3 t2
r3,1 r3,2 r3,3 t3
0 0 0 1
intrinsic.txt:
——————————————————————-
——————————————————————-
参数解释:
frame: 视频帧ID (starts from 0)
cameraID: 相机ID (between 0 and 5)
K[0,0]: coefficient of the 1st line, 1st column
K[1,1]: coefficient of the 2nd line, 2nd column
K[0,2]: coefficient of the 1nd line, 3rd column
K[1,2]: coefficient of the 2nd line, 3rd column
K[0,0] 0 K[0,2]
Intrinsic = 0 K[1,1] K[1,0]
0 0 1
pose.txt:
———————————————————————————————————————
frame cameraID trackID alpha
0 0 0 -1.
width height length
1.85 1.50992 4.
world_space_X world_space_Y world_space_Z
6. -111 -5.044228
rotation_world_space_y rotation_world_space_x rotation_world_space_z
0. 0 0
camera_space_X camera_space_Y camera_space_Z
2. 1.4341 6.
参数解释:
参数 | 解释 | 备注 |
frame | 视频帧ID | starts from 0 |
cameraID | 相机ID | 0 (left) or 1 (right) |
trackID | 轨迹ID | 每个实例ID唯一 |
alpha | 物体的KITTI类观测角度范围 | [-pi..pi] |
width, height, length |
3D物体的维度 | 单位是:meters |
world_space_X, world_space_Y, world_space_Z | 3D物体在世界坐标系下的位置 | 分别表示世界坐标系下的x、y、z坐标,单位为米(3D边界框底面的中心点) |
rotation_world_space_y, rotation_world_space_x, rotation_world_space_z | 在世界坐标系中的yaw, pitch, roll | 范围在 [-pi..pi],KITTI约定中,当ry等于0时,表示物体与x轴对齐且朝向右侧。 |
camera_space_X, camera_space_Y, camera_space_Z | 3D物体在相机坐标系下的位置 | 分别表示相机坐标系下的x、y、z坐标,单位为米(3D边界框底面的中心点) |
rotation_camera_space_y, rotation_camera_space_x, rotation_camera_space_z | 相机坐标系下的yaw, pitch, roll | 范围在 [-pi..pi],KITTI约定中,当ry等于0时,表示物体与x轴对齐且朝向右侧。 |
colors.txt
实例分割图像的颜色表示(不同的颜色表示不同的物体)
————————————-
————————————-
参考文献:
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/126486.html