文章目录
作者:Daniel Gehrig1, Antonio Loquercio1, Konstantinos G. Derpanis2, Davide Scaramuzza1
机构:Loquercio1, Konstantinos G. Derpanis2, Davide Scaramuzza1 1 Robotics and Perception GroupDepts. Informatics and Neuroinformatics University of Zurich and ETH Zurich 2 Ryerson University and Samsung AI Centre Toronto
关键词:体素网格、voxel grid、event spike tensor、resnet、识别
原文:https://arxiv.org/pdf/1904.08245.pdf
代码:https://github.com/uzh-rpg/rpg_event_representation_learning
视频:https://youtu.be/bQtSx59GXRY
1. 算法
论文翻译 End-to-End Learning of Representations for Asynchronous Event-Based Data
1. Quantization
Input:
event,[4*N, 5],其中5表示,x,y,t,p,b,N表示1个事件流npy的数据维度,例如(416180, 5)
其中这里的b表示batch size,表示0, 1,2, 3,训练数据是分别从4个类文件夹中取1个npy文件,将npy文件的第5维分别设置为0-3,后连接在一起。
Output:
vox, [4, 18, 180, 240], 其中18 = 2*C
C表示the number of temporal bins,用于离散化时间维度,论文里用B表示
Function:
- 计算event spike tensor
- 绘制体素网格,并将event spike tensor映射到体素网格内
在计算event spike tensor时,论文中为式6所示,其中kernal用MLP替代。
代码中,event spike tensor = t * MLP[t-i_bin/(C-1)],其中,C = 9, i_bin属于[0,9)
这样做的优势比较明显:
将时间戳作为度量方式,保留了event polarity 和 event count;
为了增强事件对称性,这里将MLP的输入限制为坐标的差值;
根据表征内容的不同,f可以是event count、time stamps、event polarities等。
Model:
- MLP + Activation
(1) Linear(1,30) + leakyrelu
(2) Linear(30,30) + leakyrelu
(3) Linear(30, 1)
2. Crop and resize to resolution
Input:
vox 和 crop_dimension [224, 224]
Output:
vox_cropped, [4, 18, 224, 224]
Function:
上采样
Model:
torch.nn.functional.interpolate
3. Classifier
Input:
vox_cropped
Output:
- pred_result [4,101]
- representation (体素网格)
Function:
分类识别
Model:
- ResNet-34,将第一个conv和最后一层fc分别改为(18,64)和(512,101),其中18表示2*C,101表示类。
- 交叉熵损失函数
2. 知识点回顾
1. 点云
点云(point cloud)以点的形式记录,每一个点包含有三维坐标和强度信息。其中,强度信息的获取是激光扫描仪接受装置采集到的回波强度,此强度信息与目标的表面材质、粗糙度、入射角方向,以及仪器的发射能量,激光波长有关。
点云应用深度学习面临的挑战:非结构化数据, 不变性排列, 点云数据量上的变化(不同传感器上点云的数量变化很大)
点云应用深度学习研究缓慢的原因:
- 无序性
- 稀疏性,在KITTI数据集中,如果把原始的激光雷达点云投影到对应的彩色图像上,大概只有3%的像素才有对应的雷达点。这种极强的稀疏性让基于点云的高层语义感知变得尤其困难。
- 信息量有限,点云的数据结构就是一些三维空间的点坐标构成的点集,本质是对三维世界几何形状的低分辨率重采样,因此只能提供片面的几何信息。
点云数据方面的挑战:
- 缺少数据: 扫描的模型通常被遮挡,部分数据丢失
- 噪音: 所有传感器都是嘈杂的。有几种类型的噪声,包括点云扰动和异常值。这意味着一个点有一定的概率位于它被采样的地方(扰动)附近的某一半径范围内,或者它可能出现在空间的任意位置(异常值)
- 旋转: 一辆车向左转,同一辆车向右转,会有不同的点云代表同一辆车
在点云上直接用深度学习的方法是将数据转换成体积表示,比如体素网格,然后就可以用3D滤波器来训练CNN,但是体积数据会变得非常大,3D CNN处理会非常慢,所以需要妥协到较低的分辨率,就会带来量化误差的代价。
2. 体素
体素或立体像素(voxel),是体积像素(volume pixel)的简称。概念上类似二维空间的最小单位——像素,像素用在二维电脑图像的视频数据上。体积像素一如其名,是数据于三维空间分区上的最小单位,应用于三维成像、科学数据与医学视频等领域。
体素分块:这是点云操作里最常见的处理,对于输入点云,使用相同尺寸的立方体对其进行划分,我们使用一个深度、高度和宽度分别为 (D,H,W)的大立方体表示输入点云,每个体素的深高宽为(vd,vh,vw),则整个数据的三维体素化的结果在各个坐标上生成的体素格(voxel grid)的个数为:(D/vd, H/vh, W/vw)。
点云分组:将点云按照上一步分出来的体素格进行分组
随机采样:很显然,按照这种方法分组出来的单元会存在有些体素格点很多,有些格子点很少的情况,64线的激光雷达一次扫描包含差不多10万个点,全部处理需要的计算力和内存都很高,而且高密度的点势必会给神经网络的计算结果带来偏差。所以,该方法在这里插入了一层随机采样,对于每一个体素格,随机采样固定数目的点T。
相当于下downsample(下采样),如下图所示
3. 代码
1. 代码运行
1.1 Requirements
- Python 3.7
- virtualenv
- cuda 10
因为在服务器上运行,所以需要创建环境
conda create --name aaa3.7 python=3.7
source activate aaa3.7
conda install cudatoolkit=10.0
pip install virtualenv
1.2 Dependencies
前面已经进入环境了,所以,这里直接安装依赖
pip install -r requirements.txt
1.3 Training
N-Caltech101数据集下载(5.5G):
wget http://rpg.ifi.uzh.ch/datasets/gehrig_et_al_iccv19/N-Caltech101.zip
unzip N-Caltech101.zip
注意:
- 这里不是N-Caltech101的原始文件,而是.npy文件,所以一定要从官网提供的数据网址进入
- 如果无法下载or经常中断,VPN了解一下
开始训练
python main.py --validation_dataset N-Caltech101/validation/ --training_dataset N-Caltech101/training/ --log_dir log/temp --device cuda:0
GPU的速度那是咻咻咻~~~
可视化
# 在terminal中输入
activate tensorflow
tensorboard --logdir=log/temp/
---
#然后在浏览器框中输入
http://localhost:****/
如果是服务器,将localhost改为服务器地址。
训练结果
测试集结果
2. 代码和论文有出入的地方
-
代码的B表示的是batch size,训练数据是分别任取4个类的1个npy文件,将npy数据的最后一维分别按照类别整体标为0,1,2,3,后将4个npy文件连接到一起,因此训练时输入event数据维度为(4*N, 5)
-
代码中的C=9表示的是论文中的B,即,the number of temporal bins,用于离散化时间维度
-
学习率为1e-4,每个epoch学习率都变为初始学习率的0.5倍。
论文:an initial learning rate of 1e-5, which we reduce by a factor of two every 10000 iterations
# optimizer and lr scheduler
optimizer = torch.optim.Adam(model.parameters(), lr=1e-4)
lr_scheduler = torch.optim.lr_scheduler.ExponentialLR(optimizer, 0.5)
- 计算event spike tensor这里,MLP替代论文式6中的kernal,同时,输入用t-i_bin/(C-1)
values = t * self.value_layer.forward(t-i_bin/(C-1))
参考文献
- 3D重建的进阶了解—深度图,网格,体素,点云是什么:https://www.cnblogs.com/lainey/p/8547056.html
- 无人驾驶汽车系统入门(二十八)——基于VoxelNet的激光雷达点云车辆检测及ROS实现:https://blog.csdn.net/AdamShan/article/details/84837211
- PCL入门使用VOXEL稀疏点云:https://blog.csdn.net/u011021773/article/details/78941001