论文/Spatial Temporal Graph Convolutional Networks-笔记

论文/Spatial Temporal Graph Convolutional Networks-笔记

Title

Video to Events: Recycling Video Datasets for Event Cameras

Summary

Event cameras 有 high dynamic range (HDR)、high temporal resolution 和 no motion blur 等优点,在 event data 上的算法已经取得了很好的效果。但是这些应用需要大量数据,而公开的 event data 数据集很少,这篇论文提出一种方法,可以将传统相机采集的视频数据集转换为 event data 数据集。并且在 object recognition 和 semantic segmentation 两个任务上评价了这种方法。有如下两个优点:

  1. 即使在传统摄像图像模糊或曝光过度的场景下,在生成数据训练的模型也可以利用 Event cameras 的优点,在真实事件数据上具有很好的泛化能力。
  2. 在这些转换数据训练出来的模型,可以在真实数据上进行微调,改进分类和语义分割任务的效果。在这些生成的 event data 上训练的模型的效果始终比只在 event data 上训练的模型好,这表明了 event data 包含了全部视觉信息,并且可以用 end to end 的方法来处理这些数据。

SYSTEM OVERVIEW

  1. 改论文首先把 frame 转换为 event,包括两步:frame upsampling 和 event generation。然后再转换成类似于 tensor 的表示形式。
  2. frame upsampling:
    1. 使用的方法来源于 Super SloMo: High quality estimation of multiple intermediate frames for video interpolation。
    2. 虽然使用 ESIM 可以根据 frame 生成任意 temporal resolution 的 event,但是 frame 的采样率太低,因此需要使用上采样将 frame 的采样率提升。而 Super SloMo 方法在智能手机中广泛使用,因此使用这种方法。中间生成的 frame 数量既不能太多(增加计算量),也不能太少(导致亮度信号的混叠)。这里使用 bidirectional optical flow 来计算需要生成的 frame 的数量。
  3. event generation:
    1. 使用的方法来源于 ESIM: an open event camera simulator。
    2. 对于每个像素,通过在视频帧之间进行线性插值来生成时间上的连续强度信号,然后根据强度变化是否超过某个 threshold(C) 来生成 event。由于 C 在不同的传感器上是不一样的,因此在训练集上使用随机化的 C 作为 threshold,在测试集上使用均匀采样来确定 C \(\sim \mathcal{U}\left(C_{\min }, C_{\max }\right)\)。在这个论文中 \(C_{\min }=0.05\)\(C_{\max }=0.5\)
    3. 最后把一个时间窗口内的 event data 转换成 tensor-like representation:EST。这种表示方法把 positive 和 negative event 分为两个 grid,维度为 \(H \times W \times C\),其中 \(C\) 是 temporal bins 的数量,\(C = 15\)

Experiments

进行了两个实验:Object Recognition 和 semantic segmentation。都是基于生成的 event data 来进行模型训练。这些模型可以在真实的 event data 上有很好的泛化能力;在真实数据上进行微调后的效果超过现有的其他模型;可以应用到那些 frame 模糊或者曝光不足的场景。

  1. o=Object c=Classification:使用 N-Caltech101 和 Caltech101 数据集
    1. 首先将 Caltech101 的图片数据转换为视频数据(moving a virtual camera in front of a 2D projection of the sample),然后使用 ESIM 转换为 event data。名字为 sim-NCaltech101。
    2. 模型使用在 ImageNet 上预训练好的 ResNet-34,sim-NCaltech101 作为训练集,真实的 N-Caltech101 作为测试集,准确率为 75.1%。另一个对比实验的训练集和测试集均为 N-Caltech101,准确率为 86.3%。
    3. 由于数据集的样本不平衡,从网上下载了其他数据。准确率最高为 80.7%。
    4. 在 N-Caltech101真实数据集上进行微调之后,准确率为 90.6%,超过其他所有 event-based 的方法,但是没有超过 image-based 的94.7%。
    5. 最后研究了 Frame Upsampling 对模型的提升效果。对每个图片,先用 530 Hz 的采样率记录 300 毫秒的视频,然后降采样,再使用 ESIM 上采样。对比 3 种数据所训练模型的准确率。在 downsampling factor 为 80 时,downsampled 的准确率为 61.8%,经过 ESIM 上采样的模型准确率为 68.7%。
  2. Semantic Segmentation:使用 DDD17 数据集。数据转换过程和上面类似,event data 转换为 tensor 包括两种表示方式:EST 和 6-channel representation。模型使用 UNet。很多配置都是参考 SegNet 论文里的配置,包括 label 的生成方式, 6-channel representation、使用的模型、评价指标(Acc、MIoU)、Time-Of-Window(10、50、250)。
    1. 在生成的 event 数据上的模型的 MIou 为 48.2%,在真实 event 数据上的准确率为 54.8%。
    2. 但是把这个模型在真实 event 数据上经过微调,MIoU 为 56.01%,效果超过其他所有方法。
    3. 最后在 frame-based 上训练的模型在 motion blur 或者 overand under-exposure 的场景下效果不好,而 event-based 的模型依然可以获得好的划分效果。
  3. 这种方法也有限制。如果原始视频中有 blurry frames,那么生成的 frame 也是模糊的,从而生成的 event 带有噪声。对噪声的建模可以作为 future work。

Conclusion

  1. 提出了一个框架,将现有视频数据集转换为event data 数据集,这些数据可以更好地为新的研究提供便利。
  2. 在这些生成的数据集上训练的模型也能够利用 event camera 的特点,可以很好地泛化到真实数据,即使在标准图像模糊或曝光过度的情况下也是如此。
  3. 通过对目标识别和语义分割两个相关视觉任务的实验,表明基于生成的 event 数据训练的模型,可以在真实数据上进行微调,精度超过现有的其他方法。

Notes

  • 在 event 数据集中,classification 的数据集有:(N)-MNIST 和 N-Caltech101。action recognition 的数据集有 DVS-Gesture dataset。human pose dataset 有 DAVIS Human Pose Dataset。driving dataset 有 DDD17 和 MVSEC。
  • Synthetic Events 的方法有 Pix2NVS(computes per-pixel luminance from conventional video frames),但是 timestamp 不准确。后来出现了插值法先把原来低帧率的 frame 转变为高帧率,然后再转换成 event。
PyTorch/[PyTorch 学习笔记] 8.4 手动实现 RNN
PyTorch/[PyTorch 学习笔记] 8.3 GAN(生成对抗网络)简介

PyTorch/[PyTorch 学习笔记] 8.3 GAN(生成对抗网络)简介

本章代码:

这篇文章主要介绍了生成对抗网络(Generative Adversarial Network),简称 GAN。

GAN 可以看作是一种可以生成特定分布数据的模型。

下面的代码是使用 Generator 来生成人脸图像,Generator 已经训练好保存在 pkl 文件中,只需要加载参数即可。由于模型是在多 GPU 的机器上训练的,因此加载参数后需要使用remove_module()函数来修改state_dict中的key

阅读更多
PyTorch/[PyTorch 学习笔记] 8.2 目标检测简介

PyTorch/[PyTorch 学习笔记] 8.2 目标检测简介

本章代码:

这篇文章主要介绍了目标检测。

目标检测是判断目标在图像中的位置,有两个要素:

  • 分类:分类向量\(P_{0}, P_{1}, P_{2}...\),shape 为\([N, c+1]\)
  • 回归:回归边界框\([x_{1}, x_{2}, y_{1}, y_{2}]\),shape 为\([n, 4]\)

下面代码是加载预训练好的FasterRCNN_ResNet50_fpn,这个模型在是 COCO 模型上进行训练的,有 91 种类别。这里图片不再是BCHW的形状,而是一个list,每个元素是图片。输出也是一个 list,每个元素是一个 dict,每个 dict 包含三个元素:boxes、scores、labels,每个元素都是 list,因为一张图片中可能包含多个目标。接着是绘制框的代码,scores的的某个元素小于某个阈值,则不绘制这个框。

阅读更多
PyTorch/[PyTorch 学习笔记] 8.1 图像分类简述与 ResNet 源码分析
PyTorch/[PyTorch 学习笔记] 7.3 使用 GPU 训练模型

PyTorch/[PyTorch 学习笔记] 7.3 使用 GPU 训练模型

本章代码:

这篇文章主要介绍了 GPU 的使用。

在数据运算时,两个数据进行运算,那么它们必须同时存放在同一个设备,要么同时是 CPU,要么同时是 GPU。而且数据和模型都要在同一个设备上。数据和模型可以使用to()方法从一个设备转移到另一个设备。而数据的to()方法还可以转换数据类型。

  • 从 CPU 到 GPU

    1
    2
    3
    device = torch.device("cuda")
    tensor = tensor.to(device)
    module.to(device)
阅读更多
PyTorch/[PyTorch 学习笔记] 7.2 模型 Finetune

PyTorch/[PyTorch 学习笔记] 7.2 模型 Finetune

本章代码:https://github.com/zhangxiann/PyTorch_Practice/blob/master/lesson7/finetune_resnet18.py

这篇文章主要介绍了模型的 Finetune。

迁移学习:把在 source domain 任务上的学习到的模型应用到 target domain 的任务。

Finetune 就是一种迁移学习的方法。比如做人脸识别,可以把 ImageNet 看作 source domain,人脸数据集看作 target domain。通常来说 source domain 要比 target domain 大得多。可以利用 ImageNet 训练好的网络应用到人脸识别中。

对于一个模型,通常可以分为前面的 feature extractor (卷积层)和后面的 classifier,在 Finetune 时,通常不改变 feature extractor 的权值,也就是冻结卷积层;并且改变最后一个全连接层的输出来适应目标任务,训练后面 classifier 的权值,这就是 Finetune。

阅读更多
PyTorch/[PyTorch 学习笔记] 7.1 模型保存与加载

PyTorch/[PyTorch 学习笔记] 7.1 模型保存与加载

本章代码:

这篇文章主要介绍了序列化与反序列化,以及 PyTorch 中的模型保存于加载的两种方式,模型的断点续训练。

序列化与反序列化

模型在内存中是以对象的逻辑结构保存的,但是在硬盘中是以二进制流的方式保存的。

  • 序列化是指将内存中的数据以二进制序列的方式保存到硬盘中。PyTorch 的模型保存就是序列化。

  • 反序列化是指将硬盘中的二进制序列加载到内存中,得到模型的对象。PyTorch 的模型加载就是反序列化。

阅读更多
PyTorch/[PyTorch 学习笔记] 6.2 Normalization

PyTorch/[PyTorch 学习笔记] 6.2 Normalization

本章代码:

这篇文章主要介绍了 Batch Normalization 的概念,以及 PyTorch 中的 1d/2d/3d Batch Normalization 实现。

Batch Normalization

称为批标准化。批是指一批数据,通常为 mini-batch;标准化是处理后的数据服从\(N(0,1)\)的正态分布。

批标准化的优点有如下:

  • 可以使用更大的学习率,加速模型收敛
  • 可以不用精心设计权值初始化
  • 可以不用 dropout 或者较小的 dropout
  • 可以不用 L2 或者较小的 weight decay
  • 可以不用 LRN (local response normalization)
阅读更多
PyTorch/[PyTorch 学习笔记] 6.1 weight decay 和 dropout

PyTorch/[PyTorch 学习笔记] 6.1 weight decay 和 dropout

本章代码:

这篇文章主要介绍了正则化与偏差-方差分解,以及 PyTorch 中的 L2 正则项--weight decay

Regularization

Regularization 中文是正则化,可以理解为一种减少方差的策略。

在机器学习中,误差可以分解为:偏差,方差与噪声之和。即误差=偏差+方差+噪声

偏差度量了学习算法的期望预测与真实结果的偏离程度,即刻画了学习算法本身的拟合能力。

方差度量了同样大小的训练集的变动所导致的学习性能的变化,即刻画了数据扰动所造成的影响。

噪声则表达了在当前任务上学习任何算法所能达到的期望泛化误差的下界。

阅读更多