End-to-End Learning of Represent

2019-12-04  本文已影响0人  Janeshurmin

作者: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时,论文中为式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:

(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:

Function:

分类识别

Model:

2. 知识点回顾

1. 点云

点云(point cloud)以点的形式记录,每一个点包含有三维坐标和强度信息。其中,强度信息的获取是激光扫描仪接受装置采集到的回波强度,此强度信息与目标的表面材质、粗糙度、入射角方向,以及仪器的发射能量,激光波长有关。

点云应用深度学习面临的挑战:非结构化数据, 不变性排列, 点云数据量上的变化(不同传感器上点云的数量变化很大)

点云应用深度学习研究缓慢的原因

点云数据方面的挑战

在点云上直接用深度学习的方法是将数据转换成体积表示,比如体素网格,然后就可以用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

因为在服务器上运行,所以需要创建环境

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

注意

开始训练

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. 代码和论文有出入的地方

# optimizer and lr scheduler
optimizer = torch.optim.Adam(model.parameters(), lr=1e-4)
lr_scheduler = torch.optim.lr_scheduler.ExponentialLR(optimizer, 0.5)
values = t * self.value_layer.forward(t-i_bin/(C-1))

参考文献

上一篇下一篇

猜你喜欢

热点阅读