輕讀論文(三):Social GAN: Socially Acceptable Trajectories with Generative Adversarial Networks

Original article was published by LUFOR129 on Deep Learning on Medium


輕讀論文(三):Social GAN: Socially Acceptable Trajectories with Generative Adversarial Networks

一開始以為Social GAN是指Social Network的GAN。後來發現其實Social 是指行人行走軌跡是否有符合社交禮儀的Social,不過其實這篇論文相當厲害是2018年的IEEE/CVF。其實我並沒有完全了解這一篇論文,不過還是把一些心得感想寫下來。

我只是菜雞,不能保證寫下的東西完全正確,最好還是親自閱讀最為準確

論文連結:

Social GAN: https://arxiv.org/pdf/1803.10892.pdf

一、 Introduction

行人軌跡預測可以在許多方面都有應用,如: 自駕車、掃地機器人。但是在一個擁擠的場景內,要預測所有人行走軌跡會有以下三個挑戰:

  1. Interpersonal : 人在行走的路徑規劃,其實有很多會是依照周圍人的反應,所以你必須要考慮不只是自己,而要考慮到整個畫面的行人
  2. Social Acceptable: 有些路徑是符合物理規律,但是你不會去走的,比如你不會無緣無故撞別人肩膀,行走要符合社交禮儀。
  3. MultiModel: 給定一個過去走過的道路,要預測未來可能並符合社會規範的道路,路肯定不只有一條,有很多種可能性都可以接受的。

在過去做路徑規劃,第一個直覺的會想到是RNN,但這會有兩個挑戰:

  1. Modal 只能觀察到一個人過去路徑,無法讓modal感知周圍所有人的行走與反應
  2. 因為是每個人單獨與自己gound truth算L2 norm (預測與ground truth距離)來做loss,所以會傾向於預測對所有人都可以接受的預測路徑(average behavior),而非針對不同人有不同行走規劃。Social GAN 想要預測針對不同人有不同道路規劃。

Social GAN主要貢獻有兩個:

  1. 提出新的 variety loss來鼓勵GAN探索
  2. 提出新的Pooling mechanism來幫助一個行人感知周遭所有人的行走規劃

那實際上整體呈現方式會如下,根據過去行走過程與和周遭人的反應來決定未來該行走路徑 :

https://github.com/agrimgupta92/sgan

二、Social GAN

I、 DataSet

先來看Dataset:

由右至左依序是時間、人編號、x軸、y軸。那麼input 就是所有人的道路X ,每個人的X i (i 為person)由座標x,y自時間點t0 到 時間點t observed 組成。要預測的是每個人時間點t observed +1到時間點t pred。 詳細見下圖:

II、 model

Social GAN的Generator部分是由一個Seq2Seq組成輸入進去所有人過去走過的道路,未來要預測出所有人未來走過的道路。並且把預測道路與真實人會走過的道路丟給Discriminator來判斷是否為REAL/FAKE。objective function就是基本的GAN:

Social GAN objective function

Social GAN 主要改動是在Generator的部分,接下來我們就來慢慢拆解Generator吧!

III、 ENCODER

encoder

我們會先把每一個人座標(x,y) embedding成一個固定長度,也就是原本input維度是:

(人數量, 時間長度,2) -> (人數量,時間長度,embedding長度) ,經過embedding稱作e並輸入進去LSTM,output並取出每個人最後的短期hidden 包含了過去走過道路的資訊。

h : (人數量,hidden dim,layer數) 稱作He

接著有了每一個人的短期hidden後,為了取得人與人之間的關係,我們會將所有hidden輸入進去Pooling Module來取得每一個人與他人之間的關係Pi (i 為Person,第幾個人與其他所有人的關係),Pooling的機制比較複雜一些,我們後面再講。總之有了He (過去資訊 Encoder final hidden)、Pi (其他人資訊),我們最後再加入z (隨機性),將這三個融合後當作是decoder的initial hidden state。

decoder

decoder initial hidden state公式如下,得到Hd

IV、 Decoder

有了Decoder initial hidden state與我們最後觀察到的座標點 (x obs,y obs)。我們可以輸入進去decoder進行預測了。預測過程如同其他Seq2Seq一樣,時間點一的output會是時間點2的input。但是Social在每個時間點的hidden state做了一些改變,接下來一一說明:

  1. 隨機性問題。我們GAN會加入的z只在一開始加入,後面隨著output時間拉長,受到ground truth影響,z的影響力會越來越小。但是Social GAN會需要鼓勵道路行走的隨機性越高越好,所以我們會需要在每次的hidden加入隨機性。
  2. 他人資訊。我們在每一次的時間點就是所有人又更向前走了一步,那麼他們之間的相對關係也會隨之改變,所以我們在每次的hidden加入Pi。

因此會得到如下的公式:

PM 那邊應該是寫錯了是t-1才對

如果你看過SeqGAN,看到Seq2Seq在GAN上的應用第一個就會想到有關sampling無法傳遞backpropagation而導致無法訓練Generator的問題。在這裡他們是用一個gamma (MLP)來將輸出的hidden轉成一個座標位置,以此來避免sample的問題。

V、Pooling Module 與 model

看到這裡你應該大致了解Pooling Module是觀察其他人與自己的關係對吧。那實際是如何操作的呢?

我們會將現在位置與他人的現在位置經過embedding後與hidden state concat 起來丟入MLP並取max (我沒看懂為什麼要max,如果知道歡迎留言回復),來獲得Pi。這樣講一定很亂,接下來是我看程式碼後統整出來的圖,先說一句,不保證100%正確,程式碼還蠻難懂的:

首先回到encoder,將每個人的座標位置embedding後(e^t_i)丟入LSTM得到final hidden (h^t_{ei})。接著將剛剛input進去encoder的座標位置取所有人最後一步座標 (x last, y last)。有了(x last, y last)就能夠算出每個人的相對位置了,將相對位置embedding後與final hidden concat丟入MLP與max之後就能得到Pi (每個人與他人座標資訊)。將Pi 、hidden、z concat起來後丟入一個MLP轉成Decoder hidden大小的state (這部分我忘記畫上去)。得到了decoder hidden state 包含了每個人之前走過路徑(hi)、與其他人之間關係(Pi)、隨機性(z),我們稱作hd (hidden state of decoder)。

接著將hd_i與每個人最後觀察到的座標(x last, y last )經過embeddinㄕ後,兩個輸入進decoder LSTM得到了每個人時間1的hidden state (h¹_di),將這每個人hidden丟入MLP後得到規劃出每個人下一步要走的座標(hat x¹_i,hat y¹_i )。

接著將每個人下一步要走的座標(hat x¹_i,hat y¹_i )當作新一輪的輸入,同時把剛剛獲得每個人的hidden與每個人下一步的座標丟入Pooling module得出新一個包含之前走過的路、與他人相對關係與隨機性的新hidden (hd)。並以此往復得出所有人的路徑規劃。

整個Generator就是這樣來獲得一個充滿隨機性與他人資訊的路徑。

VI、 Discriminator 與LOSS

接著來看看discriminator,其實也沒什麼好講的,就是用LSTM遍歷所有路徑後看是REAL/FAKE。

在Generator Loss方面,為了鼓勵Generator探索,所以我們會先規劃出k可能性的道路,再與gound truth做L2 norm,並只用最小的loss來backpropagation,如下:

VII、 實驗

實驗結果就是在各方面都贏過之前的model。