PointNet复现

PointNet复现

  • 1. 预备工作
  • 2. 分类
    • 2.1 训练
    • 2.2 测试(论文中的结果是:86.2/89.2)
    • 2.3 数据可视化
    • 2.4 运行时出现的问题
  • 3. 分割
  • 4. 代码解读
    • 4.1 pointnet-master/train.py
    • 4.2 pointnet-master/models
    • 4.3 pointnet-master/utils
    • 4.4 pointnet-master/provider.py
    • 4.5 pointnet-master/sem_seg

PointNet论文地址
参考:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

1. 预备工作

# 下面两行用来安装h5py
sudo apt-get install libhdf5-dev
sudo pip install h5py
source ~/tf101py27/bin/activate #激活进入虚拟环境

# 或者使用如下conda方式下载
conda activate py35
conda install libhdf5-dev
conda install h5py

# 下面四行用来找到Tensorflow包括路径和库路径。
python
import tensorflow as tf
print(tf.sysconfig.get_include())
print(tf.sysconfig.get_lib())

2. 分类

分类问题就是判断三维模型属于哪一类,如汽车、桌子、书等

2.1 训练

  • 下载modelnet40_ply_hdf5_2048放置到pointnet-master/data文件夹下(provider.py 中设置了DATA_DIR 为数据存放的位置)
  • 执行train.py
cd /d D:\pointnet-master
python train.py
  • 部分结果
**** EPOCH 040 ****
----0-----
mean loss: 0.381787
accuracy: 0.871582
----1-----
mean loss: 0.424925
accuracy: 0.863770
----2-----
mean loss: 0.402844
accuracy: 0.870098
----3-----
mean loss: 0.413148
accuracy: 0.862793
----4-----
mean loss: 0.416143
accuracy: 0.864258
----0-----
----1-----
eval mean loss: 0.481892
eval accuracy: 0.857143
eval avg class acc: 0.816937
Model saved in file: log\model.ckpt
**** EPOCH 041 ****
----0-----
mean loss: 0.373103
accuracy: 0.870605
----1-----
mean loss: 0.395896
accuracy: 0.874023
----2-----
mean loss: 0.388297
accuracy: 0.872070
----3-----
mean loss: 0.392432
accuracy: 0.863281
----4-----
mean loss: 0.383110
accuracy: 0.866422
----0-----
----1-----
eval mean loss: 0.497169
eval accuracy: 0.849838
eval avg class acc: 0.804113
**** EPOCH 042 ****
----0-----
mean loss: 0.357790
accuracy: 0.873535
----1-----
  • 一些帮助
cd /d D:\pointnet-master  
python train.py -h   # 查看培训脚本的帮助
tensorboard --logdir log   # 使用TensorBoard查看网络架构并监控培训进度。

2.2 测试(论文中的结果是:86.2/89.2)

cd /d D:\pointnet-master
python evaluate.py --visu  #在上述培训之后,我们可以评估模型并输出错误情况的一些可视化,错误分类的点云将dump默认保存到文件夹中。我们通过将点云渲染为三视图来可视化点云

2.3 数据可视化

PointNet复现_第1张图片
PointNet复现_第2张图片
PointNet复现_第3张图片
PointNet复现_第4张图片
PointNet复现_第5张图片
PointNet复现_第6张图片
PointNet复现_第7张图片

2.4 运行时出现的问题

  • ‘No module named ‘matplotlib’’
解决:
conda activate py35
conda install matplotlib
  • ‘No module named ‘PIL’’
解决:
conda activate py35
conda install Pillow
  • ‘No module named ‘scipy’’
解决:
conda activate py35
conda install scipy

3. 分割

分割问题就是判断每一个采样点属于物体的那一部分或属于哪一个物体,例如一个人的四肢和躯干,或者路上的人还是车

  • 部分分割 part segmentation
cd /d D:\pointnet-master\part_seg
sh download_data.sh  # 下载得到解压后的两个文件夹,在point-master/part_seg文件夹下,也可以进入point-master/part_seg/download_data.sh中的地址直接下载
python train.py
python test.py
  • 场景语义分割 semantic segmentation
cd /d D:\pointnet-master\sem_seg
sh download_data.sh  # 下载得到indoor3d_sem_seg_hdf5_data.zip文件,在point-master/sem_seg文件夹下,也可以进入point-master/sem_seg/download_data.sh中的地址直接下载
  • 数据集制作步骤
    • 1.准备原始点云训练数据,是带标记的那种(txt格式)
    • 2.collect_indoor3d_data用这个把原始的点云数据转换成npy格式
    • 3.gen_indoor3d_h5用这个把npy转换成h5格式
    • 4.train 进行训练,得到在log6文件夹下关于训练模型和日志
    • 5.执行batch_inference加载训练模型和测试区域进行测试得到分类的点云数据结果
    • 6.eval_iou_accuracy用这个加载得到分类的点云数据结果进行精度评估

4. 代码解读

4.1 pointnet-master/train.py

  • parser & FLAGS
    定义所需的各种参数和默认值,打包放在FLAGS里,可以在命令行进行交互
  • tf.train.exponential_decay()
    对learning_rate和bn_momentum进行衰减。
  • train()
    设置loss、model等节点,和超参数、place holder一起放在ops里。并不真正run,控制每个epoch的训练。
  • train_one_epoch()
    把训练数据分成len(TRAIN_FILES)份。每份数据中,按照batch_size取一个batch进行训练。一个batch的数据进行数据增强,包括rotate和jitter,是由provider.py实现的。
    根据ops里ph相关的参数构造feed_dict,并从中取出构造的训练、预测、loss等节点,作为sess.run()的参数进行训练。
  • eval_one_epoch()
    与train的部分相同,也是把测试文件份成几分,每一份把每个batch喂进去,计算总的准确率,作为训练中每个epoch的测试。

4.2 pointnet-master/models

存放了训练所用的三种网络结构,cls、seg、T-NET

  • pointnet_cls.py
    • 这个文件实现了网络的分类结构。输出为B*40,是每个样本对于每个类别的概率。
    • get_model():定义网络结构
      • 网络输入:[B,N,3,1]
      • 特征提取:这部分使用的都是2d-conv。首先用[1,3]的卷积核将电云的宽卷成1,使用64个卷积核,得到输出维度[B,N,1,64]。再接一个[1,1]的卷积核,再次提取特征
      • STN:这个部分看做子网络,单独使用model/transform_net.py实现。实现过程中,先用几次[1,1]的卷积将特征升维,得到[B,N,1,1024]。然后在N维度上使用max pooling,reshape得到[B,1024]。在经过FC进行特征降维,得到[B,256]。再生成一个[256,64*64]的T-NET,相乘后得到[B,4096],reshape成[B,64,64]。T-NET和原输入tensor做张量乘法,expand第二维,得到STN的输出[B,N,1,64]
      • 特征整合:又是一系列的[1,1]卷积,将特征升维到[B,N,1,1024]
      • 对称操作:在N维度上使用max pooling,再reshape掉为1的维度,得到[B,1024]
      • 预测结果:接续几个FC和drop out,降维到40,得到结果[B,40]
    • get_loss():定义loss
      • classify_loss:分类的交叉熵损失
      • mat_diff_loss:这个用于强迫T-NET把自己学的很正交
      • reg_weight:正则项

4.3 pointnet-master/utils

这个文件夹提供了一些工具函数

  • tf_util.py
    • pointnet-master/models中提到的卷积等网络结构,在这里实现
    • 网络输入为BN3。B是batch_size,N是一个样本中点的个数,3是点云维度(三维坐标)。这里把一个样本看做了N*3的矩阵,类似二维图片,之后在其上进行卷积等操作
    • 其实网络提取的特征不是3这个维度,这个维度在网络开始就被卷成了1,特征维度是输入expand出的新维度。论文中所提及的MLP,在这里也是用卷积实现的
    • data_prep_util.py
      实现数据的读取,单个文件路径存在.txt文件中,从中读取文件名,join父路径,读到数据,做成数据集。如果您想准备自己的数据,可以通过该辅助函数来保存和加载HDF5文件。
    • pc_util.py
      提供了一些三维数据处理的函数,包括点云和volume的转换,点云可视化,点云的读写

4.4 pointnet-master/provider.py

实现了数据读取,数据处理,数据增强的函数

  • shuffle
  • rotate:构造一个旋转矩阵,乘到点云上
  • jitter:构造一个抖动,用clip限制一下,加到原数据上

4.5 pointnet-master/sem_seg

  • collect_indoor3d_data.py:准备numpy文件
  • gen_indoor3d_h5.py:在语义分割部分中准备h5文件

你可能感兴趣的:(语义分割)