End-to-End Learning of Representations for Asynchronous Event-Based Data (2)

文章目录


作者: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,后连接在一起。

End-to-End Learning of Representations for Asynchronous Event-Based Data (2)

End-to-End Learning of Representations for Asynchronous Event-Based Data (2)

Output:

vox, [4, 18, 180, 240], 其中18 = 2*C

C表示the number of temporal bins,用于离散化时间维度,论文里用B表示

End-to-End Learning of Representations for Asynchronous Event-Based Data (2)

Function:

  • 计算event spike tensor
  • 绘制体素网格,并将event spike tensor映射到体素网格内

在计算event spike tensor时,论文中为式6所示,其中kernal用MLP替代。
End-to-End Learning of Representations for Asynchronous Event-Based Data (2)

代码中,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 (体素网格)

End-to-End Learning of Representations for Asynchronous Event-Based Data (2)

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(下采样),如下图所示

End-to-End Learning of Representations for Asynchronous Event-Based Data (2)

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

End-to-End Learning of Representations for Asynchronous Event-Based Data (2)

GPU的速度那是咻咻咻~~~

可视化

# 在terminal中输入
activate tensorflow
tensorboard --logdir=log/temp/
---
#然后在浏览器框中输入
http://localhost:****/

如果是服务器,将localhost改为服务器地址。

训练结果

End-to-End Learning of Representations for Asynchronous Event-Based Data (2)

End-to-End Learning of Representations for Asynchronous Event-Based Data (2)

End-to-End Learning of Representations for Asynchronous Event-Based Data (2)

End-to-End Learning of Representations for Asynchronous Event-Based Data (2)

测试集结果
End-to-End Learning of Representations for Asynchronous Event-Based Data (2)

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))

参考文献

上一篇:python中保存列表和字典


下一篇:Python numpy.load()用法及代码示例