NICP学习:(117条消息) 激光slam理论与实践 - 第四章 前端配准(ICP)_ppipp1109的博客-CSDN博客
(117条消息) 激光SLAM:ICP升级版本NICP(Normal ICP)原理+法向量即曲率计算代码_月照银海似蛟龙的博客-CSDN博客
1.nicp pytorch版编译: GitHub - wuhaozhe/pytorch-nicp: GPU Accelerated Non-rigid ICP for surface registration
2.按照说明,先安装pyotorch3d: pytorch3d/INSTALL.md at main · facebookresearch/pytorch3d · GitHub ,执行以下语句:
conda create -n pytorch3d python=3.9
conda activate pytorch3d
conda install -c pytorch pytorch=1.9.1 torchvision cudatoolkit=10.2
conda install -c fvcore -c iopath -c conda-forge fvcore iopath
conda install -c bottler nvidiacub
conda install pytorch3d -c pytorch3d
3.安装依赖项:pip install -r requirements.txt
其中:sklearn>=0.24.2 应改成:scikit-learn>=0.24.2
环境要求open3d最低的版本为0.14.1,于是open3d==0.14.1
4.运行python demo_nicp.py
(1)报错:libc10_cuda.so: cannot open shared object file: No such file or directory
ImportError: libc10_cuda.so After installing using Intall.MD guide · Issue #1152 · facebookresearch/pytorch3d · GitHub,这个回答用的pytorch==1.10.0,删除环境安装conda install -c pytorch pytorch=1.10.0 torchvision cudatoolkit=11.1,还是报错
(2)报错找不到pytorch3d 模型,根据pip install --no-index --no-cache-dir pytorch3d -f https://dl.fbaipublicfiles.com/pytorch3d/packaging/wheels/py38_cu113_pyt1110/download.html 安装pytorch3d,配置环境为:python=3.8,conda install -c pytorch pytorch=1.11.0 torchvision cudatoolkit=11.3,还是报错:libc10_cuda.so: cannot open shared object file
(3)ImportError: libc10_cuda.so: cannot open shared object file: No such file or directory · Issue #1060 · facebookresearch/pytorch3d · GitHub的回答,pytoch不应该是conda-forge,应该这样:
pytorch 1.6.0 py3.8_cuda10.2.89_cudnn7.6.5_0 pytorch
而我是:
pytorch 1.11.0 cpu_py38h39c826d_1 conda-forge
于是下载touch源码安装:下载
torch-1.11.0+cu113-cp38-cp38-linux_x86_64.whl和torchvision-0.12.0+cu113-cp38-cp38-linux_x86_64.whl
(4)安装后报错:libstdc++.so.6: version `GLIBCXX_3.4.26' not found
这种情况说明libstdc++.so.6连接的版本不够高。
a:查看libstdc++.so.6 运行库,注意大小写:strings /usr/lib64/libstdc++.so.6 |grep GLIBC 没有找到GLIBCXX_3.4.26
b: 直接:wget http://www.vuln.cn/wp-content/uploads/2019/08/libstdc.so_.6.0.26.zip
然后解压:unzip libstdc.so_.6.0.26.zip
c: 先备份libstdc++.so.6 :copy libstdc++.so.6 libstdc++.so.6.copy
d: 然后删除:rm libstdc++.so.6
e: 然后建立软连接: ln -s libstdc++.so.6.0.26 libstdc++.so.6
f: 再次查看:strings /usr/lib64/libstdc++.so.6 |grep GLIBC
包含了GLIBCXX_3.4.26即可解决
(5) 报错:No module named 'face_alignment',直接pip install face_alignment
5.成功:
Mesh2mesh:将一个mesh转换成需要的模型(标准模型)默认是bfm模型,需要*.obj,*.mtl以及uv贴图:扫描模型:216090个点,431544个面,通过nicp可转换成bfm模型:35709个点和70789个面
Mesh2pcl:将一个点云转换成bfm模型,需要点云上68个点的index信息
Demo_4d,通过一段视频流包含深度和彩色的图,生成bfm模型:
Denselandmark的3d点生成的bfm模型:
Denselandmark生成的flam模型:
修改生成自己的模型:demo_nicp.py
device = torch.device('cuda:0')
pcls = io3d.load_ply_as_pointcloud('./test_data/base1.ply', device = device)
norm_pcls, norm_param = normalize_pcl(pcls)
pcl_lm_file = open('./test_data/base1_lmk.txt')
lm_list = []
for line in pcl_lm_file:
line = int(line.strip())
lm_list.append(line)
target_lm_index = torch.from_numpy(np.array(lm_list)).to(device)
lm_mask = (target_lm_index >= 0)
target_lm_index = target_lm_index.unsqueeze(0)
target_lm_index_m = target_lm_index[:, lm_mask]
#bfm_meshes, bfm_lm_index = load_bfm_model(torch.device('cuda:0'))
flame_meshes = io3d.load_obj_as_mesh('./test_data/base_flame.obj', device = device)
flame_meshes, flame_norm_param = normalize_mesh(flame_meshes)
dummy_render = render.create_dummy_render([1, 0, 0], device = device)
target_lm_index_flame, lm_mask_flame = get_mesh_landmark(flame_meshes, dummy_render)
#lm_mask_flame = torch.all(lm_mask, dim = 0)
flame_lm_index_m = target_lm_index_flame[:, lm_mask]
print(target_lm_index_m)
print(flame_meshes[flame_lm_index_m])
coarse_config = json.load(open('config/coarse_grain.json'))
registered_mesh = non_rigid_icp_mesh2pcl(flame_meshes, norm_pcls, flame_lm_index_m, target_lm_index_m, coarse_config)
io3d.save_meshes_as_objs(['test_data/final2.obj'], registered_mesh, save_textures = True)