Social GAN:利用GAN来帮助预测行人运动轨迹

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/XGL1569348/article/details/82933950

这次要阐述的工作是来自于CVPR2018中李飞飞组关于预测行人运动轨迹的工作,通过结合GAN和Sequence Prediction来帮助提高预测效果。由于受限于笔者阅读面窄,对这方面的早期工作不甚了解,就全盘接受本文对早期工作介绍的观点了。

背景

预测行人轨迹的任务主要的问题有三个

  1. 人与人之间的相互影响
    某特定行人轨迹是受其他行人的位置而影响的,在早期工作中,每个行人都得走一次LSTM,计算开销大,而且不能进行真正的全局考虑所有行人因素,capacity不够大。

  2. 社交上的可接受程度
    行人轨迹预测需要考虑人的社交属性。举个例子,有一对情侣拉着手往前走,理论上来说可以从下面钻过去,但是这显然是不符合人对于私密性的要求。 量化这个指标可能需要一些不够优雅的繁琐处理。

  3. 多情况
    行人的轨迹预测显然不止只有一种解,早期的工作大多基于优化欧氏距离之类的方法,只能给出一个“平均”好的路径选择。

本次工作将GAN的对抗思想引入行人运动轨迹预测的任务中。第一,引入variety loss来帮助GAN展开 D i s t r i b u t i o n G Distribution_{G} 在空间的分布,来覆盖所有存在可能足够好的解的样本空间。第二,在G和D的中间层引入池化模块(Pooling Module) 来帮助学习到一个全局的池化结果,这个结果携带了场景中所有人的feature,从而实现整体只需要走一次LSTM,降低计算开销的结果。第三,基于GAN的生成效果,可以给出多个解。

整体方法

先简单定义一下符号,我们定义输入为 X X ,预测输出为 Y ^ \hat Y ,真正的结果为 Y Y X , Y X,Y 皆为一个list的时序坐标。表达形式为 X = X 1 , X 2 , X 3 , . . . , X n X =X_{1}, X_{2}, X_{3}, ..., X_{n} Y ^ = Y ^ 1 , Y ^ 2 , Y ^ 3 , . . . , Y ^ n \hat Y=\hat Y_{1}, \hat Y_{2}, \hat Y_{3}, ..., \hat Y_{n} X i = ( x i t , y i t ) [ t = 1 , . . . , t o b s ] X_{i} = (x^{t}_{i}, y^{t}_{i}) [t = 1,... , t_{obs}] Y i = ( x i t , y i t ) [ t = t o b s + 1 , . . . , t p r e d ] Y_{i} = (x^{t}_{i}, y^{t}_{i}) [t = t_{obs}+1,... ,t_{pred} ]
图1
上图为整体生成器和判别器的架构,注意虽然LSTM在图中分开了,但是在同一个位置的LSTM是share weights的,也等于是相同的LSTM。

在Encoder的部分中,每个人的位置用多层全连接embedding作为LSTM的输入,得到一个定长向量 e i t e^{t}_{i} ,t是sequence,i是人,此处有 e i t = ϕ ( x i t , y i t ; W e e ) e^{t}_{i} = \phi (x^{t}_{i},y^{t}_{i};W_{ee}) h e i t = L S T M ( h e i t 1 , e i t ; W e n c o d e r ) h^{t}_{ei}=LSTM(h^{t-1}_{ei},e^{t}_{i};W_{encoder})

ϕ \phi 就是embedding function with ReLU, W e e W_{ee} 是这里的weight, W e n c o d e r W_{encoder} 就是encoder的weight,在全场景中share weight。e可以多步地feed进去。

为了解决人与人的互动关系,我们引入Pooling Module。在最后一步输入结束之后,我们使用一个池化块( P i P_{i} 的具体算法后面给出),来获得一个对应每一个人的 P i P_{i} 的pooled tensor。

在Decode的过程中,我们先注意对它的初始化,不同于传统GAN的纯噪音input,我们有 c i t = γ ( P i , h e i t ; W c ) c^{t}_{i}=\gamma (P_{i},h^{t}_{ei};W_{c}) h d i t = [ c i t , z ] h^{t}_{di} = [c^{t}_{i},z] γ \gamma 为多层全连接带ReLU, W c W_{c} 是embedding的weight, z z 为concatenate 上去的噪音。

初始化后的decode 预测过程中,有 e i t = ϕ ( x i t 1 , y i t 1 ; W e d ) e^{t}_{i} = \phi (x^{t-1}_{i},y^{t-1}_{i};W_{ed}) P i = P M ( h d 1 t 1 , h d 2 t 1 , . . . , h d n t 1 ) P_{i} = PM(h^{t-1}_{d1},h^{t-1}_{d2},...,h^{t-1}_{dn}) h d i t = L S T M ( γ ( P i , h d 1 t 1 ) , e i t ; W d e c o d e r ) h^{t}_{di} = LSTM(\gamma (P_{i},h^{t-1}_{d1}),e^{t}_{i};W_{decoder}) ( x ^ i t , y ^ i t ) = γ ( h d i t ) (\hat x^{t}_{i},\hat y^{t}_{i}) = \gamma (h^{t}_{di}) ϕ \phi 为embedding function with ReLU, W e d W_{ed} 为embedding weight, W d e c o d e r W_{decoder} 为decoder的weights, γ \gamma 为全连接层。

注意这里的PM操作是可以在不同步的时候调整的。

在Discriminator就是一个encoder,主要就是区分 [ X i , Y i ] [X_{i},Y_{i}] , [ X ^ i , Y ^ i ] [\hat X_{i},\hat Y_{i}] ,socially acceptable 的问题就放在这里让判别器自己学习。

在Loss上,在对抗 loss的基础上加一个L2 loss,来衡量预测结果和真实结果的距离。

Pool Module

池化块引入的目的是为了帮助统一考虑所有人。这里有两问题,一个是数量可变,一个是人与人交互的信息比较稀疏,但又不能不考虑,所以提出了以下的解决方法
在这里插入图片描述

这里提出的Pool操作和CVPR 2016 同为李飞飞组的基于grid的social pool方法不同。如上图,而是直接通过坐标算出红人对于绿人和蓝人的相对坐标,然后独立地过MLP,然后过Elementwise Pool(原文用Max Pool),就能得到红人对应的池化后张量 P i P_{i}

鼓励多样性

文章里给出了一个Variety Loss来鼓励生成的多样性,训练的时候,一次生成k个结果,同样每个结果都计算L2距离,取最小的作为Loss值。 L v a r i e t y = m i n Y i Y ^ i k 2 L_{variety}=min||Y_{i}-\hat Y^{k}_{i}||_{2}

代码

github/agrimgupta92/sgan ,基于PyTorch。(有pretrained model)

个人觉得本文有意思的地方是其引入的池化块,在文章背后有给出一系列的直观解释,有兴趣的话可以详细看看,然后也combine了不少其他领域的流行方法,最终能够比较高效地解决早期工作遗留的各种问题。

论文地址

Social GAN: Socially Acceptable Trajectories with Generative Adversarial Networks

猜你喜欢

转载自blog.csdn.net/XGL1569348/article/details/82933950
今日推荐