Active Neural SLAM 复现记录
- 创建虚拟环境
- 安装habitat-sim
- 安装habitat-api
- 安装Pytorch
- 配置项目
- 准备数据
- 先搞Gibson场景数据
- 再搞pointnav任务数据
- 创建软链接
- 测试
- 训练
创建虚拟环境
conda create -n AVSLAM python==3.10
conda activate AVSLAM
安装habitat-sim
git clone https://github.com/facebookresearch/habitat-sim.git
cd habitat-sim
git checkout 9575dcd45fe6f55d2a44043833af08972a7895a9 # 切换到历史分支
pip3 install -r requirements.txt
python setup.py install --headless
安装habitat-api
git clone https://github.com/facebookresearch/habitat-api.git
cd habitat-api
git checkout b5f2b00a25627ecb52b43b13ea96b05998d9a121
pip3 install empy==3.3.4 rospkg pyyaml catkin_pkg
pip3 install -e .
安装Pytorch
我想直接一步到位,用目前的12.1CUDA的Pytorch2.4.1,于是:
pip3 install torch torchvision torchaudio
配置项目
git clone --recurse-submodules https://github.com/devendrachaplot/Neural-SLAM
cd Neural-SLAM
pip3 install -r requirements.txt
此时报错:
感觉应该是scikit的版本问题,我全不指定版本,进行安装。完成了。
准备数据
我看他实例的data文件夹格式给的是gibson数据集和pointnav任务,所以我先只下载这两个数据。
先搞Gibson场景数据
这个过程挺繁琐的:
-
先通过这个项目的readme跳转链接到habitat-lab项目:
-
找到habitat-lab项目的Datasets一节,跳转链接到数据集表格:
-
在表格中找到Gibson,点击跳转到habitat-lab项目关于Gibson场景数据集的下载说明:
-
在下载说明中发现,要下载Gibson数据集要去Gibson项目。另外还有一个在Gibson基础上标注了语义信息的数据集叫3DSceneGraph。暂时先不管这个3DSceneGraph,点击Gibson链接跳转到Gibson项目:
-
在Gibson项目中,找到Database一节。这里讲到,完整的Gibson数据集有572个空间,1440个楼层的场景,非常大。但还有一个只有39个场景的子集。推荐先下载这个子集,后面有需要哪个场景,再单独下载这个场景。所有Gibson场景可以由一个网页在线查看。此外,如果想用Gibson的仿真器跑其他数据集,例如Standford2D3DS或者Matterport 3D也是可以的。我们先只下载那个子集,点击第一个下载链接,跳转到Gibson数据集的下载指示页面:6. 在下载指示页面,我们可以看到要下载Gibson数据集要提交表格签署承诺。要下载Stanford 2D-3D-Semantics数据集或者Matterport3D数据集,要走另外的流程。我们不要这俩数据集,点开for Habitat-sim的表格看下:
-
发现可以提供A,B,C三种选项。A是Gibson这篇2018年CVPR论文中的数据,并给出了小杯、中杯、大杯、超大杯的配置;B是Gibson改进版iGibson,这个2021年IROS论文的数据,他相较Gibson的改进是交互性;C是用于Habitat-sim挑战的,我们要的就是这个。文档最后要签名一个PDF文件,填好电子表单的信息,然后提交。
-
然后立马就有下载链接了。对于Habitat有两种选择。一种是可用于Habitat-sim全部的训练和验证集,压缩包有11G;一个是Habitat Challenge所用的4多个子集(具体哪几个,在Habitat ICCV 2019的论文里有说)。点击下载即可:
本项目论文中说,只用了Gibson的最小集合,所以那个11G的不下也没问题。我是磁盘目前还有1个T,先下载再说,万一以后要用。
最后把下载下来的压缩包提取出来,然后按照格式整理就好:
还可以检验以下MD5,看看下载过程中有没有出错。参照Gibson的MD5校验:
md5sum ./gibson_habitat.zip
35f274a781eba9ed1b77feba50d040da ./gibson_habitat.zip
发现没问题~
再搞pointnav任务数据
还是从Neural SLAM的Setup跳转到Habitat-lab的Datasets,再跳转到Habitat-lab的数据集表格。发现Gibson场景有3个任务数据:
看本项目实例文件结构,好像只要V1的。
都很小,我就全点击下载了吧:
创建软链接
把外接磁盘的数据集软链接到项目中:
ln -s /media/lcy-magic/Dataset/Habitat_DataSet/ /home/lcy-magic/Habitat_TEST/2019_PointGoal/Neural-SLAM/data
检验依赖:
File "/home/lcy-magic/anaconda3/envs/AVSLAM/lib/python3.10/site-packages/seaborn/cm.py", line 1055, in <module>mpl_cm.register_cmap(_name, _cmap)
AttributeError: module 'matplotlib.cm' has no attribute 'register_cmap'
报错:
AttributeError: module 'matplotlib.cm' has no attribute 'register_cmap'
根据Kimi的说法,Matplot3.9.0之后,register_cmap变成了colormaps。可以选择改代码,也可以回退版本。但由于是seaborn这个包调用的。当时装matplotlib是直接pip,而seaborn则指定了0.9.0版本。所以改代码麻烦。还是改版本吧。先试试给seaborn升版本:
pip3 install --upgrade seaborn
我现在的版本是0.13.2。
再运行依赖测试脚本,新的报错:
然后发现issue中有人遇到了和我一样的问题还没有解决参考issue。只能自己一个一个找了。
发现第一个错误是以下代码用了np.float,而先在的numpy已经没有float了,应该换为float64。
File "/home/lcy-magic/anaconda3/envs/AVSLAM/lib/python3.10/site-packages/habitat_sim-0.1.2-py3.10-linux-x86_64.egg/habitat_sim/utils.py", line 93, in quat_from_angle_axisaxis = axis.astype(np.float)
于是在整个habitat sim项目中查找np.float,都改成np.float64:
然后重新在habitat-sim项目根目录下,把habitat-sim安装进虚拟空间:
python setup.py install --headless
也可以用编辑模式安装,这样再改动就不需要重新安装了:
python setup.py develop --headless
又有新错误:
File "/home/lcy-magic/Habitat_TEST/2019_PointGoal/Neural-SLAM/env/habitat/utils/supervision.py", line 37, in _get_xy_bounding_boxmin_ = np.floor(np.min(zx, axis=0) - padding).astype(np.int)File "/home/lcy-magic/anaconda3/envs/AVSLAM/lib/python3.10/site-packages/numpy/__init__.py", line 324, in __getattr__raise AttributeError(__former_attrs__[attr])
AttributeError: module 'numpy' has no attribute 'int'.
看来又是np版本的问题。现在的np没有Int了,同样我们都替换为int64:
又有新报错:
File "/home/lcy-magic/Habitat_TEST/2019_PointGoal/Neural-SLAM/utils/optimization.py", line 50, in get_optimizerexpected_args = inspect.getargspec(optim_fn.__init__)[0]File "/home/lcy-magic/anaconda3/envs/AVSLAM/lib/python3.10/inspect.py", line 1245, in getargspecraise ValueError("Function has keyword-only parameters or annotations"
ValueError: Function has keyword-only parameters or annotations, use inspect.signature() API which can support them
Exception ignored in: <function VectorEnv.__del__ at 0x7fd74b1e8f70>
这又是一个版本问题,现在我的python3.10已经没有inspect.getargspec了,取而代之的是inspect.signature,而且返回的parameters还是一个有序字典,不再是列表。所以应该这样改:
# expected_args = inspect.getargspec(optim_fn.__init__)[0]expected_args = list(inspect.signature(optim_fn.__init__).parameters)
此时,可以正常运行指标验证了:
测试
下载预训练权重:
mkdir pretrained_models
wget --no-check-certificate 'https://drive.google.com/uc?export=download&id=1UK2hT0GWzoTaVR5lAI6i8o27tqEmYeyY' -O pretrained_models/model_best.global
测试:
python main.py --split val --eval 1 --train_global 0 --train_local 0 --train_slam 0 \
--load_global pretrained_models/model_best.global \
--load_local pretrained_models/model_best.local \
--load_slam pretrained_models/model_best.slam
糟糕:
AssertionError: Insufficient GPU memory
看下代码:
for i in range(num_gpus):gpu_memory = min(gpu_memory,torch.cuda.get_device_properties(i).total_memory \/1024/1024/1024)if i==0:assert torch.cuda.get_device_properties(i).total_memory \/1024/1024/1024 > 10.0, "Insufficient GPU memory"
竟然要10G显存!!!哭了
我暂时注释掉显存检测的部分,直接指定场景数:
for i in range(num_gpus):gpu_memory = min(gpu_memory,torch.cuda.get_device_properties(i).total_memory \/1024/1024/1024)if i==0:pass# assert torch.cuda.get_device_properties(i).total_memory \# /1024/1024/1024 > 10.0, "Insufficient GPU memory"num_processes_per_gpu = int(gpu_memory/1.4)# num_processes_on_first_gpu = int((gpu_memory - 10.0)/1.4)num_processes_on_first_gpu = 4
这个时候我的显存占用差不多到头了:
但光跑着,看不出什么名堂,我想可视化。发现可以添加-v 1实现,但并没有作用。原因是,matplotlib用的是非交互后端Agg,而我们需要交互后端Tagg:
if sys.platform == 'darwin':matplotlib.use("tkagg")
else:matplotlib.use('Agg')
这个sys.platform是怎么决定的呐?Kimi告诉我:
- 对于 Windows 系统,sys.platform 通常是 ‘win32’。
- 对于 macOS 系统,sys.platform 通常是
‘darwin’。
对于 Linux 系统,sys.platform 通常是 ‘linux’。
对于其他 Unix
系统,sys.platform 可能是 ‘posix’ 或其他特定的值。
这个项目作者用的macOS,所以这么写的。因此我们直接指定就好:
# if sys.platform == 'darwin':
# matplotlib.use("tkagg")
# else:
# matplotlib.use('Agg')
matplotlib.use('TkAgg')
这个项目其他地方的,也记得改过来。
这时候能显示了,但是总警告缺少字体,很烦人:
搜了下,这个字体付费,虽然可以免费下载,但感觉麻烦,换成无衬线字体族的Arial、Helvetica、Verdana、DejaVu Sans中一个。我尝试了下,只有DejaVu Sans可以:
# fontname='Helvetica',
fontname='DejaVu Sans',
注意,这时候最好把场景数num_processes_on_first_gpu设为1,这样看到的可视化界面不是一直乱跳的。
最后效果大概这样:
训练
把num_processes_on_first_gpu设成4后,我直接:
python main.py
看到明天早上组会前能跑多少吧:
早上来发现训练停止了,还报了已杀死。以为又是哪里报错把某个线程干掉了。组会就报告说失败了。结果下午睡一觉回来发现前面好像没有报错,估计是程序的自动结束。我看了下训练权重保存的地方,果然已经有了。于是加载自己训练的权重,可以跑起来: