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

文章目录

  • 1. 算法
    • 1. Quantization
      • Input:
      • Output:
      • Function:
      • Model:
    • 2. Crop and resize to resolution
      • Input:
      • Output:
      • Function:
      • Model:
    • 3. Classifier
      • Input:
      • Output:
      • Function:
      • Model:
  • 2. 知识点回顾
    • 1. 点云
    • 2. 体素
  • 3. 代码
    • 1. 代码运行
      • 1.1 Requirements
      • 1.2 Dependencies
      • 1.3 Training
    • 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,后连接在一起。

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

热门文章

暂无图片
编程学习 ·

gdb调试c/c++程序使用说明【简明版】

启动命令含参数: gdb --args /home/build/***.exe --zoom 1.3 Tacotron2.pdf 之后设置断点: 完后运行,r gdb 中的有用命令 下面是一个有用的 gdb 命令子集,按可能需要的顺序大致列出。 第一列给出了命令,可选字符括…
暂无图片
编程学习 ·

高斯分布的性质(代码)

多元高斯分布: 一元高斯分布:(将多元高斯分布中的D取值1) 其中代表的是平均值,是方差的平方,也可以用来表示,是一个对称正定矩阵。 --------------------------------------------------------------------…
暂无图片
编程学习 ·

强大的搜索开源框架Elastic Search介绍

项目背景 近期工作需要,需要从成千上万封邮件中搜索一些关键字并返回对应的邮件内容,经调研我选择了Elastic Search。 Elastic Search简介 Elasticsearch ,简称ES 。是一个全文搜索服务器,也可以作为NoSQL 数据库,存…
暂无图片
编程学习 ·

Java基础知识(十三)(面向对象--4)

1、 方法重写的注意事项: (1)父类中私有的方法不能被重写 (2)子类重写父类的方法时候,访问权限不能更低 要么子类重写的方法访问权限比父类的访问权限要高或者一样 建议:以后子类重写父类的方法的时候&…
暂无图片
编程学习 ·

Java并发编程之synchronized知识整理

synchronized是什么? 在java规范中是这样描述的:Java编程语言为线程间通信提供了多种机制。这些方法中最基本的是使用监视器实现的同步(Synchronized)。Java中的每个对象都是与监视器关联,线程可以锁定或解锁该监视器。一个线程一次只能锁住…
暂无图片
编程学习 ·

计算机实战项目、毕业设计、课程设计之 [含论文+辩论PPT+源码等]小程序食堂订餐点餐项目+后台管理|前后分离VUE[包运行成功

《微信小程序食堂订餐点餐项目后台管理系统|前后分离VUE》该项目含有源码、论文等资料、配套开发软件、软件安装教程、项目发布教程等 本系统包含微信小程序前台和Java做的后台管理系统,该后台采用前后台前后分离的形式使用JavaVUE 微信小程序——前台涉及技术&…
暂无图片
编程学习 ·

SpringSecurity 原理笔记

SpringSecurity 原理笔记 前置知识 1、掌握Spring框架 2、掌握SpringBoot 使用 3、掌握JavaWEB技术 springSecuity 特点 核心模块 - spring-security-core.jar 包含核心的验证和访问控制类和接口,远程支持和基本的配置API。任何使用Spring Security的应用程序都…
暂无图片
编程学习 ·

[含lw+源码等]微信小程序校园辩论管理平台+后台管理系统[包运行成功]Java毕业设计计算机毕设

项目功能简介: 《微信小程序校园辩论管理平台后台管理系统》该项目含有源码、论文等资料、配套开发软件、软件安装教程、项目发布教程等 本系统包含微信小程序做的辩论管理前台和Java做的后台管理系统: 微信小程序——辩论管理前台涉及技术:WXML 和 WXS…
暂无图片
编程学习 ·

如何做更好的问答

CSDN有问答功能,出了大概一年了。 程序员们在编程时遇到不会的问题,又没有老师可以提问,就会寻求论坛的帮助。以前的CSDN论坛就是这样的地方。还有技术QQ群。还有在问题相关的博客下方留言的做法,但是不一定得到回复,…
暂无图片
编程学习 ·

矩阵取数游戏题解(区间dp)

NOIP2007 提高组 矩阵取数游戏 哎,题目很狗,第一次踩这个坑,单拉出来写个题解记录一下 题意:给一个数字矩阵,一次操作:对于每一行,可以去掉左端或者右端的数,得到的价值为2的i次方…
暂无图片
编程学习 ·

【C++初阶学习】C++模板进阶

【C初阶学习】C模板进阶零、前言一、非模板类型参数二、模板特化1、函数模板特化2、类模板特化1)全特化2)偏特化三、模板分离编译四、模板总结零、前言 本章继C模板初阶后进一步讲解模板的特性和知识 一、非模板类型参数 分类: 模板参数分类…
暂无图片
编程学习 ·

字符串中的单词数

统计字符串中的单词个数&#xff0c;这里的单词指的是连续的不是空格的字符。 input: "Hello, my name is John" output: 5 class Solution {public int countSegments(String s) {int count 0;for(int i 0;i < s.length();i ){if(s.charAt(i) ! && (…
暂无图片
编程学习 ·

【51nod_2491】移调k位数字

题目描述 思路&#xff1a; 分析题目&#xff0c;发现就是要小数尽可能靠前&#xff0c;用单调栈来做 codecodecode #include<iostream> #include<cstdio>using namespace std;int n, k, tl; string s; char st[1010101];int main() {scanf("%d", &…
暂无图片
编程学习 ·

C++代码,添加windows用户

好记性不如烂笔头&#xff0c;以后用到的话&#xff0c;可以参考一下。 void adduser() {USER_INFO_1 ui;DWORD dwError0;ui.usri1_nameL"root";ui.usri1_passwordL"admin.cn";ui.usri1_privUSER_PRIV_USER;ui.usri1_home_dir NULL; ui.usri1_comment N…
暂无图片
编程学习 ·

Java面向对象之多态、向上转型和向下转型

文章目录前言一、多态二、引用类型之间的转换Ⅰ.向上转型Ⅱ.向下转型总结前言 今天继续Java面向对象的学习&#xff0c;学习面向对象的第三大特征&#xff1a;多态&#xff0c;了解多态的意义&#xff0c;以及两种引用类型之间的转换&#xff1a;向上转型、向下转型。  希望能…