pointconv
有两个github repository, 分别是pointconv
和pointconv_pytorch
, 两者的区别不仅仅在于框架不同, 前者是基于scannet v2数据集的点云分割, 后者是基于modelnet40_resampled数据集的点云分类
本篇所有内容均针对前者pointconv
,即在scanent
数据集上做点云分割
继上一篇的pointnet++
后, 还是需要研究pointconv
(躲不掉呀), 没办法只能想办法去运行了.
整个过程中最大的问题在于, 用到的scannet
数据集太过于庞大(1.3TB), 我分别尝试过:
耗时两个多星期, 整来整去没整出什么结果.
直到我在pointconv
作者的github里找到这么一个评论:
翻译过来就是说"整个项目只需要用到scannet中所有的_vh_clean_2.notes.py(这里他写错了,应该是_vh_clean_2.labels.py)和_vh_clean_2.ply文件就行了,一共大概20G,scannet中其他文件不需要下载"
???感觉自己发现了什么宝藏, 顺着这个思路, 成功运行了pointconv
项目代码
这里我推荐各位先将项目文件下载到自己电脑本地, 数据集直接在服务器上下载, 修改完之后再通过scp
命令将项目文件上传到服务器, 因为本地修改起来会比较方便, 像我这种纯靠终端ssh去控制服务器的…那么多文件一个一个vim
来修改也太折磨人了
这里首先需要git
环境, 进入桌面后运行git clone https://github.com/DylanWusee/pointconv.git
下载完了之后桌面会多出来pointconv
这么个文件夹. 里面的文件我就不一一展示了, 实在太多, 所有的文件夹如下:
pointconv
├── data
├── imgs
├── models
├── scannet
│ └── visualize
├── tf_ops
│ ├── 3d_interpolation
│ ├── grouping
│ │ └── test
│ └── sampling
└── utils
由于版权原因, 这里我不能直接给出数据集下载的链接或者脚本
请各位前往这个链接, 按照README.md
里面的步骤, 复制ScanNet Terms of Use.pdf
里面的内容到word, 填好之后再转到ScanNet Terms of Use.pdf
中, 已附件的形式发送给[email protected], 一周内作者会给你发送一个下载数据集的.py
脚本和运行教程
拿到脚本后, 在服务器上创建scannet
目录, 在python3
环境下依次运行以下命令来下载上述的两种文件
python3 download-scannet.py -o scannet/ --type _vh_clean_2.labels.ply
python3 download-scannet.py -o scannet/ --type _vh_clean_2.ply
如果你这里和我一样是通过远程手段连接的服务器, 我建议你使用screen
命令, 不然等连接会话断开后, 服务器上这个下载的进程会被杀死, screen
可以避免这种情况, 具体怎么使用我就不赘述了, 各位参考其他的博客.
如果下载成功的话, scannet
文件夹下应该是这样的(这里只展示到depth=1, 不然文件夹实在太多)
scannet
├── scannetv2-labels.combined.tsv
├── scans
├── scans_test
└── tasks
进入pointconv/scannet
文件夹, 按照README.md
里面的步骤, 修改scannetv2_seg_dataset_rgb21c_pointid.py
中第82行的路径即可, 改为服务器上刚创建的scannet
目录
进入pointconv
文件夹所在的根目录, 我这里是Desktop/
, 然后通过scp -r pointconv/ ${__USER__}@${__IP__}:${__PATH__}
命令上传到你的服务器.其中:
${__USER__}
是用户名${__IP__}
是你服务器的公网IP${__PATH__}
是你要存放的路径下面的编译,预处理和训练都是在服务器上完成的.
这里请参照我上一篇pointnet++的博客, 对pointconv/tf_ops
文件夹下的所有文件夹里的.sh
文件进行编译
进入pointconv/scannet
目录, 在python2
环境下执行screen python scannetv2_seg_dataset_rgb21c_pointid.py
, 之所以使用screen
命令是由于整个过程非常耗时, 避免由于连接会话断开导致整个进程被杀死的情况.
预训练结束后, pointconv/scannet
下会多出来三个文件: scannet_train_rgb21c_pointid.pickle
, scannet_val_rgb21c_pointid.pickle
, 和scannet_test_rgb21c_pointid.pickle
, 前两个是用于训练的, 第三个是用于测试的.
预处理结束后,pointconv/scannet
文件夹下应该是这样的
scannet
├── eulerangles.py
├── eulerangles.pyc
├── pc_util.py
├── pc_util.pyc
├── README.md
├── scannet_dataset_rgb.py
├── scannet_dataset_rgb.pyc
├── scannet_dataset_sw_rgb.py
├── scannet_test_rgb21c_pointid.pickle
├── scannet_train_rgb21c_pointid.pickle
├── scannetv2_seg_dataset_rgb21c_pointid.py
├── scannetv2_test.txt
├── scannetv2_train.txt
├── scannetv2_val.txt
├── scannet_val_rgb21c_pointid.pickle
├── util.py
├── util.pyc
└── visualize
进入pointconv
目录, 在python2
,tensorflow1.X
环境下, 运行
CUDA_VISIBLE_DEVICES=0 screen python train_scannet_IoU.py --model pointconv_weight_density_n16 --log_dir pointconv_scannet_ --batch_size 4
注:
screen
命令运行结果和日志会保存在pointconv/${\__TIME__}
下, ${\__TIME__}
是你运行时的时间, 如下:
pointconv_scannet_2021_02_11_21_37_50/
├── best_model_epoch_000.ckpt.data-00000-of-00001
├── best_model_epoch_000.ckpt.index
├── best_model_epoch_000.ckpt.meta
├── checkpoint
├── log_train.txt
├── model.ckpt.data-00000-of-00001
├── model.ckpt.index
├── model.ckpt.meta
├── PointConv.py
├── pointconv_util.py
├── pointconv_weight_density_n16.py
├── test
├── train
├── train_scannet_IoU.py
└── whole_scene