GCN2-SLAM遇到的问题
编译pytorch问题
本人按照github上的过程进行编译pytorch(C++)的时候,一直遇到问题,一开始以为是clone代码不完整的问题,后来仔细查找报错信息,发现是pytorch源码中的一个函数跟cuda的函数名冲突了导致(本人环境cuda10.1 按照github下载的pytorch1.0.1 进行的setup.py完全编译)。
数据集问题
我在下载了一两个TUM数据集后,运行GCN下的run.sh发现怎么也启动不了。
最后发现解压后里面包含一个depth.txt和一个rgb.txt两个用来保存filename的文件,代码是通过filename从文件夹里读取的图像,depth.txt与rgb.txt文件内容如下(只放了一小部分):
# color images
# file: 'rgbd_dataset_freiburg3_long_office_household.bag'
# timestamp filename
1341847980.722988 rgb/1341847980.722988.png
1341847980.754743 rgb/1341847980.754743.png
1341847980.786856 rgb/1341847980.786856.png
1341847980.822978 rgb/1341847980.822978.png
1341847980.854676 rgb/1341847980.854676.png
1341847980.890728 rgb/1341847980.890728.png
1341847980.922978 rgb/1341847980.922978.png
# depth maps
# file: 'rgbd_dataset_freiburg3_long_office_household.bag'
# timestamp filename
1341847980.723020 depth/1341847980.723020.png
1341847980.754755 depth/1341847980.754755.png
1341847980.786879 depth/1341847980.786879.png
1341847980.822989 depth/1341847980.822989.png
1341847980.854690 depth/1341847980.854690.png
1341847980.890737 depth/1341847980.890737.png
1341847980.922989 depth/1341847980.922989.png
但是在GCN的run.sh启动文件里,启动参数传入的是association.txt,经过翻看了一下ORB的一些传入参数,发现这里传入的association.txt应该是上面rgb.txt与depth.txt合并的结果,即如下形式:
1341847980.722988 rgb/1341847980.722988.png 1341847980.723020 depth/1341847980.723020.png
1341847980.754743 rgb/1341847980.754743.png 1341847980.754755 depth/1341847980.754755.png
1341847980.786856 rgb/1341847980.786856.png 1341847980.786879 depth/1341847980.786879.png
1341847980.822978 rgb/1341847980.822978.png 1341847980.822989 depth/1341847980.822989.png
1341847980.854676 rgb/1341847980.854676.png 1341847980.854690 depth/1341847980.854690.png
1341847980.890728 rgb/1341847980.890728.png 1341847980.890737 depth/1341847980.890737.png
1341847980.922978 rgb/1341847980.922978.png 1341847980.922989 depth/1341847980.922989.png
1341847980.954645 rgb/1341847980.954645.png 1341847980.954676 depth/1341847980.954676.png
1341847980.990699 rgb/1341847980.990699.png 1341847980.990724 depth/1341847980.990724.png
1341847981.022715 rgb/1341847981.022715.png 1341847981.022728 depth/1341847981.022728.png
数据格式整理
方案一:改代码
由于我们需要的rgb.txt与depth.txt同时传入进去,所以需要在run.sh最后再加一个传入参数,这样的话对应着代码的读取图像部分的代码也需要修改。并且还需要提前将两个txt文件内的filename按时间戳对应起来(原本两个txt内的filename数量不一样,即两个文件夹图片数量不一样)。考虑到这个方法比较麻烦,所以采用了下面的方法:
方案二:按时间戳拼接rgb.txt与depth.txt
提醒一点,代码里按照filename读取文件的时候,没有考虑到这txt前三行的注释,所以也会又问题。故必须将传入的txt文件的前面三行的注释删掉,也就是rgb.txt与depth.txt按时间戳拼接后的.txt文件不要加前面的注释。按时间戳拼接代码如下:
将代码生成的association.txt复制到对应数据集文件夹下,直接执行run.sh就可以了。
def split_line(f_rgbd):
rgbd_split = f_rgbd.read().split()
index_to_delete = []
for i in range(len(rgbd_split)):
if i%2:
index_to_delete.append(i)
count = 0
for index in index_to_delete:
index = index - count
rgbd_split.pop(index)
count += 1
return rgbd_split
def near_time_stamp(rgb_time_stamp, depth_time_stamp):
"""
假设len(rgb_time_stamp) > len(depth_time_stamp)
只需在rgb_time_stamp中取出len(depth_time_stamp)个元素即可
"""
near_rgb_stamp = []
for index in depth_time_stamp:
min_value = 1000000000
min_jndex = ''
depth_float = float(index)
for jndex in rgb_time_stamp:
rgb_float = float(jndex)
if abs(depth_float - rgb_float) < min_value:
min_value = abs(depth_float - rgb_float)
min_jndex = jndex
near_rgb_stamp.append(min_jndex)
return near_rgb_stamp
if __name__ == '__main__':
f_rgb = open("rgb.txt","r")
f_depth = open("depth.txt","r")
f_association = open('association.txt','w',encoding='utf-8')
data_depth = f_depth.readlines()
f_depth.seek(0,0)
# 切分出时间戳
rgb_time_stamp = split_line(f_rgb)
depth_time_stamp = split_line(f_depth)
# 寻找最近时间戳
rgb_time_stamp = near_time_stamp(rgb_time_stamp, depth_time_stamp)
# 将rgb_time_stamp与depth_time_stamp对应行拼接起来
for i in range(len(rgb_time_stamp)):
str_association = rgb_time_stamp[i] + " " \
+ "rgb/" + rgb_time_stamp[i] + ".png" + " " \
+ data_depth[i]
f_association.write(str_association)
f_rgb.close()
f_depth.close()
f_association.close()