空飛ぶロボットのつくりかた

ロボットをつくるために必要な技術をまとめます。ロボットの未来についても考えたりします。

Sim2Real論文まとめ(1) - SimGAN

f:id:robonchu:20190225163721p:plain

やりたいこと

センサノイズをシミュレータで再現したい。

そのために有用そうなSimGANを理解する。

論文について

arxiv.org

  • CVPR2017でBest Award

  • 珍しいAppleの論文

評価 

☆☆☆☆☆(5/5)

めちゃくちゃコスパ良いアプローチ。素晴らしい。

内容まとめ

Abstract

  • 教師あり学習の難点として、たくさんのラベル付きデータが必要になる。

  • シミュレータでデータを作ることが期待されているが、シミュレータと実世界の乖離が問題で上手く行かないことが多い。

  • 本論文はその溝を埋める手法を提案する。

  • 方法としてはラベル付きのシミュレーションのデータとラベルなしの実データを用いて、Genertive Adversarial Networks(GANs)によりシミュレーションデータを実データに近づける(S+U Learning with SimGAN)

  • 以下の三点がキーポイント。

    1. a "self-regularization" term

    2. a local adversarial loss

    3. updating the discriminator using history of refined images

    これらによってリアリスティックな画像を生成することができる。

Introduction

  • シミュレータをリアルに近づけるアプローチも盛んだが、良いレンダリングアルゴリズムのものを使ったとして、実世界を完全に再現できているわけでなく、これを用いて学習した場合、過学習することもある。

  • この論文の目標はラベリングなしの実データとシミュレータを用いてリアルな画像を生成すること。

  • そのために、refinerというネットワークを考案した。下図参照。

f:id:robonchu:20190225163721p:plain

  • これはシミュレータが作った生成画像をrefineする。

  • 実データに近づけるため、refinerはadversarial lossを用いて訓練する。

  • これはGANsに似たアプローチをとっていて、実データとの区別がつかないように更新するdiscriminative networkを用いている。

  • ここで、生成データのアノテーション情報を保つため、生成データとrefineされたデータの差にペナルティを与えるようなself-regularization lossをadversarial lossに追加している

  • そして、ピクセルレベルでのfully CNNを用いることで、大域的な構造を保つ

  • GANsのアプローチは対立する2つのネットワークを訓練するため、不安定になりがち。これに対して、discriminatorの受容野を画像全体ではなく複数の局所的な領域に制限する

  • さらに安定に訓練を行うため、過去のrefineされた画像を用いてdiscriminatorの更新を行う

Contributions

  1. ラベルなしの実データを用いて合成データをrefineする(S+U learning)

  2. adversarial lossとself-regularization lossを用いてrefiner networkを訓練する

  3. refiner networkを安定して訓練するためのGANsに対するいくつかの大事な修正を行う

  4. 定性的な実験結果とSOTAな結果を示す

S+U Learning with SimGAN

  • ゴールはアノテーション情報を保持しつつ生成画像をリアルに近づけるrefinerを訓練すること。

  • 以下の2つの損失関数によって、関数パラメータθを学習によって最適化する。

f:id:robonchu:20190225170151p:plain

  • 第一項は実データに近づける作用、第二項はアノテーション情報を保つ作用がある。

  • 詳細はこれから説明。

Adversarial Loss with Self-Regularization
  • GANsに似ている提案手法は同様に2つのネットワークのminmax gameであり、refiner networkとdiscriminator nerworkを交互に更新する。
Discriminator
  • discriminator networkは以下の損失関数を最小化することによってΦを更新する。

f:id:robonchu:20190225170433p:plain

  • この式は交差エントロピー誤差で~xiが生成データ、yiが実データである。

  • Dはrefineされた画像である確率を出力する層を最終層に持つConvNetとして実装。つまり、refineであれば1、実データであれば0が理想。

  • 確率的勾配降下法によって更新する。

Refiner

f:id:robonchu:20190225170151p:plain

  • (1)式のlrealは訓練済みのdiscriminatorを用いて以下のようにかける。

f:id:robonchu:20190225171437p:plain

  • このロス関数が小さくできれば、discriminatorをより騙すようなrefinerに近づく。

  • さらに、生成されたリアルな画像はシミュレータで付与されたアノテーション情報も保ってほしい

  • これを実現するため、生成データとrefineされたデータのピクセルレベルでの違いを小さくするようself-regularization lossを用いる。

  • そうすると、(1)の式は以下にような表現になる。こおkでψは恒等関数。||はL1ノルム。

f:id:robonchu:20190225172350p:plain

  • ここでRはピクセルレベルでrefineするためプーリングなどがないfully convolutinal neural netで実装。
更新則
  • 以下の通りでR(θ)を更新する間はΦを固定、D(Φ)を更新する間はθを固定。

  • 交互に繰り返してLr(θ)とLd(Φ)を最小化する。

f:id:robonchu:20190225172824p:plain

Local Adversarial Loss
  • refinerがとても強いdiscriminatorを訓練した時、refinerが過度に特徴を強調する方向へ働くことがある。

  • ここで、局所的な状態もrefinerはリアルに近づけるべきで、同様にdiscriminatorも局所的な情報で判断できるべき。

  • 上記を踏まえ下図のように discriminatorのネットワーク出力をw x hの確率マップにし、refinerのadversarial loss関数を局所パッチのcross entropy lossesで表す

f:id:robonchu:20190225174432p:plain

Updating Discriminator using a History of Refined Images
  • discriminatorが最新のrefined imagesにのみ正しく区別できる傾向に陥ることがある。

  • これは本来すべてのrefined imagesを正しく区別したいため良くない。

  • なので、discriminatorの更新時に過去のrefined imagesも使用することで、安定性を向上させる

  • 下図のようにmini-batchの半分を最新の画像、もう半分をバッファにためていた画像を用いる。

f:id:robonchu:20190225180256p:plain

以上がSimGANのロジックの部分。

Experiments

  • ここからは画像ベースでSimGANを使った向上例をペタペタ貼り付けます。かなり汎用性がありあそう。

  • 視線方向はたもちつつ、リアルな画像へrefine↓

f:id:robonchu:20190225180926p:plain

  • より詳細↓

f:id:robonchu:20190225181104p:plain

  • 手の姿勢推定のためのDepth画像への適応例↓

f:id:robonchu:20190225181213p:plain

  • 過去の画像を使ってdiscriminatorを更新したことの効果↓

f:id:robonchu:20190225181434p:plain

  • Local adversarial loss の効果↓

f:id:robonchu:20190225181617p:plain

所感

実機でデータセットを作るのはホント大変なので、生成データとアノテーションなしの実データでSimlationとRealのGapを埋めれるのは素晴らしい。

特にセンサのノイズは個体によって異なるし、表現しにくいので、このアプローチはほんとに興味深い。