作者: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
出处:IEEE International Conference on Computer Vision (ICCV), Seoul, 2019
引用:5
关键词:体素网格、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
译文:https://www.jianshu.com/p/a26a920053f5
目录如下:
- 算法
- 代码
- 知识点回顾
1. 算法
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
网友评论