DeepLiDAR复现
- 一、下载
- 二、配置环境依赖
- 三、数据集准备
- 四、预处理
- 1.表面法线[surface-normal](https://github.com/valgur/surface-normal)
- 2.运行设置
-
- 3.路径设置
- 4.生成data_depth_normals
- 5.有关具体思路
- 五、训练
一、下载
1.DeepLiDAR_cyshih704
git clone https://github.com/cyshih704/DeepLiDAR
二、配置环境依赖
sudo sh cuda_10.2.89_440.33.01_linux.run
nvcc -V
conda create -n dl python=3.6
conda activate dl
三、数据集准备
1.kitti深度补全
2.使用以下脚本从原始数据集中提取相应的 RGB 图像
./download/rgb_train_downloader.sh
./download/rgb_val_downloader.sh
整体代码、数据和结果目录结构如下
data_depth_annotated:地面实况数据(密集深度)
data_depth_velodyne:稀疏数据(激光雷达)
data_rgb:RGB 图像
data_depth_annotated:用于训练表面法线, data_depth_annotated 使用 生成
.
├── KITTI_data
| ├── data_depth_annotated
| | ├── train
| | | ├── 2011_09_26_drive_0001_sync
| | | ├── proj_depth
| | | ├── groundtruch
| | | ├── image02
| | | ├── image03ubuntu18.04中安装opencv3.2
| | ├── val
| | | ├── (the same as train)
| ├── data_depth_velodyne
| | ├── train
| | | ├── 2011_09_26_drive_0001_sync
| | | ├── proj_depth
| | | ├── velodyne_raw
| | | ├── image_02
| | | ├── image_03
| | ├── val
| | | ├── (the same as train)
| ├── data_rgb
| | ├── train
| | | ├── 2011_09_26_drive_0001_sync
| | | ├── image_02
| | | ├── image_03
| | ├── val
| | | ├── (the same as train)
| ├── data_depth_normals
| | ├── (the same as data_depth_annotated)
| └── depth_selection
| | ├── test_depth_completion_anonymous
| | ├── test_depth_prediction_anonymous
| | ├── val_selection_cropped
3.基于 CARLA 的合成数据集
4.预训练模型
全都下载下来
四、预处理
预处理的目的是得到法线输出:获取深度图像(例如 KITTI 深度完成数据集 ) 作为输入并将估计的法线作为 RGB 图像输出。 深度值的比例无关紧要。
1.表面法线surface-normal
构建并安装库。 需要 CMake 3.11+、OpenCV 3+ 和 Eigen3。 支持 Python 2 和 3。
参考:
CMake 3.11+ 版本升级CMake3.18.3
OpenCV 3+(这里我用的3.4也ok的)
ubuntu18.04中安装opencv3.2
Eigen3.3.4
sudo apt-get install libeigen3-dev
2.运行设置
对于 CUDA 支持,可能需要使用适当的值设置以下环境变量:
conda activate dl
export CUDACXX=/usr/local/cuda-10.2/bin/nvcc
安装 surface_normal
python setup.py install
或者执行
cmake ..
make -j8
或直接执行
pip install -v git+https://github.com/valgur/surface-normal.git
(1)报错1
原因:一开始以为是eigen的问题,其实不是,是在编译pcl gpu版本时,遇到找不到 math_functions.hpp报错。将 math_functions.hpp
的42行改为cuda_runtime.h
(2)报错2
原因:eigen和cuda兼容问题
解决:都给它注释掉
cd /usr/local/cuda-10.2/include/crt
sudo gedit common_functions.h
将第74行对应内容直接注释
解决:
cd /usr/include/eigen3/Eigen/src/Core/arch/CUDA
sudo gedit Half.h
将596行直接注释
(3)报错3
原因:对’xx’引用不明确
说明程序中出现了两个相同变量,但代码中只出现了一个,c++中内置的库函数与xx重名了
pybind11里面的类型或者函数有一样的名字导致的冲突,
然后就是去掉using namespace,后面加作用域,比如py::,cv::等。
解决:
cd /home/flycar/DeepLiDAR/surface-normal/src
将 python.cpp 中 namespace py = pybind11;注释掉
再次编译make -j8
(4)报错4
原因:编译器发出的错误,是在链接动态链接库surface_normal.cpython-36m-x86_64-linux-gnu.so时,R_X86_64_PC32和某个symbol发生冲突
解决:
在编译时加上-fPIC参数,重新编译
打开/home/flycar/DeepLiDAR/surface-normal下的CMakeLists.txt文件
在里面添加语句
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -fpic")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fpic")
再次make -j8,成功
3.路径设置
在/home/flycar/DeepLiDAR/env.py中注释掉原来的添加你的数据集存储路径
#可以找到你放置的数据集位置
KITTI_DATASET_PATH='/media/flycar/Lab/kitti_depth/'
#训练保存路径
SAVED_MODEL_PATH='/home/nj/DeepLiDAR/runs/'
4.生成data_depth_normals
(1)附(此点可略过):之前运行以下命令后,出现过如下情况,分析原因是未安装apex库(用于多线程)但好像apex好像暂时也没用到
pip install -v git+https://github.com/valgur/surface-normal.git
未安装apex库(用于多线程)
安装 Apex CUDA 和 C++ 扩展
还支持通过Python 构建
conda activate dl
git clone https://github.com/NVIDIA/apex
cd apex
pip install -v --disable-pip-version-check --no-cache-dir --global-option="--cpp_ext" --global-option="--cuda_ext" ./
pip install -v --disable-pip-version-check --no-cache-dir ./
(2)运行以下脚本生成 data_depth_normals
python3 generate_normals.py
缺tqdm就pip
pip install tqdm
刚开始一直显示out of memory内存不足啥的,打算修改每次送入的张数改小,还未修改又试了一次,自己开始跑了,莫名其妙
92606张图,很快就能生成
5.有关具体思路
输入:16bit 单通道深度图像。 输出:RGB 图像(表面法线)。
一般程序:
设置窗口大小=15
对于 src 中的每个有效深度点:
搜索windowsize附近区域,收集窗口内所有有效深度点
使用最小二乘法估计平面和曲面法线。
得到平面的法线作为这个深度点的法线
五、训练
1.在.bashrc文件中添加第三方python路径,以便可以找到训练所需的dataloader
export PYTHONPATH=/home/flycar/DeepLiDAR/
2.执行
python3 main.py -b <BATCH_SIZE> -e <EPOCH> -m <SAVED_MODEL_NAME> -l <MODEL_PATH> -n <NUM_DATA> -cpu
-b <BATCH_SIZE>
batch size used for training and validation
-e <EPOCH>
the number of epoch for training and validation
-m <SAVED_MODEL_NAME>
the model name (be saved in SAVED_MODEL_PATH)
-l <MODEL_PATH>
specified the model path if you want to load previous model
-n <NUM_DATA>
the number of data used for training. (set -1 if you want to use all the training data (85898))
-cpu
if you want to use CPU to train
训练模型分为三个不同的阶段。
(N) 训练表面法线
(D) 颜色通路和正常通路的训练深度
(A) 训练整个网络(修复表面法线网络)
我们用 3 种不同的设置测试模型
(模型我放在dataloader中)
(A) N 阶段训练 15 个 epoch,D 阶段训练 15 个 epoch,然后 A 阶段训练 15 个 epoch( 下载A )
(B) 训练A 12 epochs(由于提前停止耐心10,deepLidar.normal(随机)没有更新参数)( 下载B )
© 训练 A 10 个 epochs(deepLidar.normal 的更新参数)( 下载C )
我用的训练命令
python3 main.py -b 48 -e 1000 -m model1 -n 20000
报错参考下面修改
3.修改
找到/DeepLiDAR/dataloader/dataloader.py,
修改:
(1)训练batch_size和num_workers
(2)intrinsics = INTRINSICS[date]报错,断点调试可以看到它对rgb图像路径读取到第几位的意思,这里将6改为7需要取到10
例如:文件名为:2011_09_26_drive_0001_sync
执行print后输出:2011_09_26
(3)修改这里的path,红色部分,改为你的存储路径
这里其实就是要训练用到的三个输入:深度图(原本下载的kitti),rgb(3.2提取的),生成的表面法线的RGB图(4.4生成的)
(4)报错Keyerros:‘val’
添加一行split='train'
(5)训练模型选择
同上述5.2匹配即可
4.训练表面法线(N)
dataloader 代码中写了列出所有张数的代码,故显示的总是85898张,但实际你给num_workers赋值多少就会训多少。
epoch设置为15就可以
5.颜色通路和正常通路的训练深度(D)
6.训练整个网络(修复表面法线网络)(A)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)