一、配置环境
要求的环境( requirement.yml文件)
此时虚拟环境的文件没有被成功创建;
查询可能的原因:
因为用命令(conda env create -f requirement.yml )进行创建环境时,所用的配置文件里是带有配置信息的。环境配置文件是在别的机器上导出的,文件里的软件包是按照导出文件的机器配置的,因此导出的时候,把这些包的详细信息也导了出来,即第二个等号后面跟着的信息,当我们按照这个文件创建环境时,conda就会根据我们机器的配置信息,按照配置文件里包的详细信息,去找这个包,那当然找不到,结果发现“查无此包”,因此也就会报上面的错误。
解决:
原先的requirement.yml
还是失败了,会出现包冲突的情况
尝试自己建立环境:
Ubuntu18.04 CUDA11.3 pytorch1.8.0 torchversion0.9.0 python3.6
终端输入如下指令:
conda create DF-VO
conda activate DF-VO
出现错误:
解决方法:
-----------解决不了,所以直接用以前配置好的用来跑yolov5的环境。直接运行。遇到报什么错改哪里(基本就是再额外添加一些包就可以了)
二、部署程序
1、下载KITTI (kitti_odometry_color)数据集
65G的图片下了整整两天…这里直接放上百度网盘的链接,有需要的可以直接在这个博客里下载
2、添加缺少的库
后面遇到报错,依次说找不到“easydict”“cupy”“colour-demosaicing”,这些都是程序需要用到的库,用pip install easydict指令安装上就行。
解决问题过程中的干货收获:
(1)在这过程中学习到了如何看报错提示,就是提示会给出从出问题的第一个文件需要找的文件一直到出问题的文件,在最后出问题的文件的对应行找到错误即可
(2)其中from libs.geometry.camera_modules import SE3的意思是从libs文件夹下的geometry文件夹下的camera_modules.py文件中导入 SE3类
3、转换图片格式
直接在工程的文件夹下创建了一个.py程序,将KITTI中的png文件转化为jpg文件
ps:在代码的循环前可以加一行代码:
output_folder = r"/home/user/VO-code/DF-VO/dataset/kitti_odom/odom_data_jpg/08/image_2/"
os.makedirs(output_folder, exist_ok=True)
确保如果指定保存路径没有相应文件夹的话先创建文件夹。
4、尝试run
官方给了两种运行的指令,这里使用第二个,因为第一个运行的路径找不到,没有那个文件
在VScode终端里输入下面的指令:
python apis/run.py \
-d options/examples/default_configuration.yml \
-c options/examples/kitti_stereo_train_icra.yml \
--no_confirm
其实官方给的两种运行方式一个是训练单目相机的,一个是训练双目的,“-d”表示添加配置文件
训练其他数据集的运行代码在DF-VO/scripts/experiment.sh文件中都可看到
5、解决run之后报的错误
报错1:
cv2.error: OpenCV(4.5.5) : -1: error: (-5:Bad argument) in
function ‘KeyPoint’ Overload resolution failed KeyPoint() missing
required argument ‘size’ (pos 3)
参考文章,原来是opencv的版本不兼容导致的代码里原来写的是:_size
识别不出来,改成size
之后就好了。
报错2:在输出进度条的时候显示:
No enough good keypoints, constant motion will be used!
且预测的位姿图明显和真实轨迹不一样
这一问题在作者github的讨论(已关闭的问题里)中有提到,解决方法是:
pytorch版本问题导致某些语句不兼容
在文件 "DF-VO/libs/deep_models/flow/lite_flow_net/lite_flow_net.py "中:
找到并修改为下面的语句:
“return torch.nn.functional.grid_sample(input=tensorInput, grid=(Backward_tensorGrid[str(tensorFlow.size())] + tensorFlow).permute(0, 2, 3, 1), mode=‘bilinear’, padding_mode=‘zeros’,align_corners = True)”
6、查看算法运行效率(处理每帧图片所需要的时间)、算法所占GPU的内存
(1)查看算法运行效率(处理每帧图片所需要的时间)
这个作者在输出的时候有输出,下面的Group[single]就是指每一步所花费的平均时间,[DF-VO]就是指处理每帧图片从提取图片到计算位姿的全部流程所需要的时间(0.242s)
自己还尝试加了一个每处理一帧显示处理时间的代码(中文注释的部分就是自己加的)
total_time = 0.0 #自己加的代码
for img_id in tqdm(range(start_frame, len(self.dataset), self.cfg.frame_step)):
# 记录当前时间
start_time = time()
self.timers.start('DF-VO')
self.tracking_mode = "Ess. Mat."
""" Data reading """
# Initialize ids and timestamps
self.cur_data['id'] = img_id
self.cur_data['timestamp'] = self.dataset.get_timestamp(img_id)
# Read image data and (optional) precomputed depth data
self.timers.start('data_loading')
self.load_raw_data()
self.timers.end('data_loading')
# Deep model inferences
self.timers.start('deep_inference')
self.deep_model_inference()
self.timers.end('deep_inference')
""" Visual odometry """
self.timers.start('tracking')
self.tracking()
self.timers.end('tracking')
""" Online Finetuning """
if self.tracking_stage >= 1 and self.cfg.online_finetune.enable:
self.deep_models.finetune(self.ref_data['img'], self.cur_data['img'],
self.ref_data['pose'].pose,
self.dataset.cam_intrinsics.mat,
self.dataset.cam_intrinsics.inv_mat)
""" Visualization """
if self.cfg.visualization.enable:
self.timers.start('visualization')
self.drawer.main(self)
self.timers.end('visualization')
""" Update reference and current data """
self.ref_data, self.cur_data = self.update_data(
self.ref_data,
self.cur_data,
)
self.tracking_stage += 1
# 计算处理时间
end_time = time()
frame_time = end_time - start_time
# 累计每帧图片读取的时间
total_time += frame_time
# 打印每帧读取时间
print(f"Frame {img_id}: {frame_time:.4f} seconds")
self.timers.end('DF-VO')
# 打印总处理时间
print(f"Total dealing time: {total_time:.4f} seconds")
print("=> Finish!")
(2)算法所占GPU的内存
在run程序时,重新打开一个终端输入下面指令
watch -n 0.1 nvidia-smi
最后几行所显示的就是当前打开的每个程序在GPU中所占的内存
目前就只做到了这里,后续如果继续做的话就继续再更新吧。