教師なし学習で生成画像を制御できそうなinfoGANを試す

教師なし学習で生成画像を制御できそうなinfoGANを試してみる。
生成してみた画像がこちら

f:id:yusuke_ujitoko:20170830204845p:plain

背景

  • GANの学習ではG(Generator)とD(Discriminator)がせめぎ合いながら、ナッシュ均衡を目指す。
    結果として、
    • DはGによる生成画像と真の画像を区別するよう最適化される。
    • GはDを騙すように最適化される。

  • Gはノイズ{z}をもとに画像を生成
    この潜在変数群{z}は画像生成の種のようなもので、
    画像生成に使われる全情報を含んでいる。
  • GANが収束したとき、{z}の各変数は生成画像の特徴に対応しているはず
    • 光源の強さや線の太さなどの意味が分かりやすい特徴に対応していてほしい
    • 実際にはそうなっておらず、人間には紐解けない

  • CGANやAC-GANなどのConditional GAN
    • ラベルをノイズ{z}と合わせてGへ入力し、ラベルに対応した画像とセットで学習させる
    • 生成画像の条件をラベルで指定可能なGを構築できる。
    • しかし、画像とラベルを対応付ける手間が発生する。
  • こういった教師あり学習ではなく、教師なし学習で生成画像の特徴をコントロールできるGを構築できると面白い。
    そしてそれを試みるのがinfoGAN。

infoGAN

infoGANの構造は以下のように構築する。

f:id:yusuke_ujitoko:20170830203155p:plain:w200
  • Gに入力するノイズ{z}を、意味を獲得させる要素としてのlatent variables {c}とそれ以外の要素noise{z}に分ける。
    例えばMNISTの場合には、次のように分けると上手く行く(と書いてある)
    • noise {z} (通常のGANの場合よりも要素数を小さくする)
    • latent variables {c}
      • (0〜9)の離散値を表現するcategorical variables
      • 線の太さ、傾きなど連続値を表現するcontinuous variables

  • 通常のGANの要領で学習させると、上で述べたlatent variablesを無視して、 noiseとして生成画像を作るようになってしまう。それを避けるために、Gの生成画像とlatent variables {c}相互情報量最大を目指すようNNの構造と誤差関数を設計する。

  • 実装は割と単純
  • Dの出力として以下を用意
    • 通常の画像が本物か偽物かを示す値
    • latent variablesに対応した値
  • Gに入力したlatent variablesとの誤差を計算

生成画像を確認

infoGANはパラメータチューニングが大変。
(0〜9)を区別して生成するのすらできなかった。

縦軸:categorical variables, 横軸: continuous variables 1

f:id:yusuke_ujitoko:20170830204815p:plain

一応右にいくほど文字が太くなっていっているので、
continuous variables 1が文字の太さを示すよう学習できている…?っぽい

縦軸:categorical variables, 横軸: continuous variables 2

f:id:yusuke_ujitoko:20170830204845p:plain

continuous variables 2が文字の傾きを示すよう学習できている…?っぽい

その他

このinfoGANの発表の後,
semi-supervisedなinfoGANも提案されている.

https://arxiv.org/abs/1707.04487

GANによる医療画像の異常検知

f:id:yusuke_ujitoko:20170809215230p:plain

まず下準備として,正常な画像を訓練データとして使い,GANを学習させる. 学習後のGANの{G(z)} はlatent space representations {z} から正常な画像 {x} への写像を学習している.

そしてテスト画像 {x}に対する異常さを評価するために, {x = G(z)}とみて,{x} から {z}を探す. でも{G(z)} の逆写像は簡単にはできない.

そこで{G(z)} から {z}を探すために, {z_{1}}をランダムにサンプリングして,{G(z_{1})} を生成し,{x}との誤差が小さくなるよう {z}を学習させる. このときはもちろんGやDのパラメータは固定. 学習させて収束した後の誤差をテスト画像{x}の異常さの度合いとして評価する。

その他

誕生日のパラドックスを使ってGANの多様性を評価する研究とアイデアが似ている。

また、この論文では前半部のGの学習はできていて、Gが正常画像の分布を生成できる前提のもとで、後半の異常検知の話が進んでいるが、 そもそも論文で使っているDCGANだとあまり訓練データの多様な分布を生成できないのではと感じた。

この論文は会社の方に教えていただいたもの.
今のところ仕事として機械学習には関わったことがないが, 趣味として勉強している様子が遠回りで会社の方に伝わったようで最終的に繋がりが持てたのは嬉しい. と、ブログっぽいことを書いてみる。

シミュレータで生成した画像に現実感を付与する(SimGAN)

概要

学習のための画像がない場合や不足している場合,シミュレータ等を使い人工的に画像を生成することがある. しかしシミュレータで生成した画像(以下シミュレータ画像と呼称)は,現実の画像に現実感の観点で及ばない. そのためシミュレータ画像に過学習してしまうと,実際の画像に対して効果を発揮しないことがある.

だからと言ってシミュレータ画像の質をチマチマ向上させるのは大変. そこでラベルなしの現実画像を訓練画像として使い,GANの枠組みでシミュレータ画像を洗練させる. その際,シミュレータ画像に付随するannotationの情報は保持するように, 大きな改変にはペナルティをかける(self-regularization loss)など工夫を施す.

f:id:yusuke_ujitoko:20170808235033p:plain:w400

SimGAN

SimGANの目的は現実の画像 {y_{i}} を使って, シミュレータ画像を{x} を洗練させて現実感を付与する変換 {R_{\theta}(x)} を学習させること.

adversarial loss with self-regularization

その際の要件として,シミュレータ生成した際のannotation情報は保持させるというものがある.

例えば,視線推定のための画像データを拡張する場合には, シミュレータで画像生成する際に視線方向のannotationは与えておくが, そのannotationした情報は{R_{\theta}(x)} で変換した後も保持していないと,教師データとして視線推定に使えない.

そこで通常のGANのLossに加えて, self-regularization lossを加えることを提案. self-regularization lossは,ピクセルごとの変換前後のL1距離とする.

local adversarial loss

SimGANのdiscriminatorの学習の際, ある画像特徴量を過度に評価してしまうようになると,ゴミを生成することとなる.

画像を局所領域に分割したときの各領域ごとdiscriminatorに区別させた. 各局所領域においてもSimGANで変換した画像に現実感が付与されている状態では,現実の画像の局所領域と区別がつかないはず.

f:id:yusuke_ujitoko:20170809000248p:plain:w400

いくつかの特徴量による評価が組み合わさるので,ある1つの特徴量への依存が小さくなる.(ここは自信がない)

検証

視線推定タスク

視線推定の学習に使うデータセットは質が低い. そこでSimGANでannotation付きデータを大量生成して学習させたところ, sota達成

f:id:yusuke_ujitoko:20170809000354p:plain

データセットに対するuser studyも行った. 50個の現実のデータと50個のSimGANによる生成データをrandomに提示してどちらが本物か答えさせたら正答率は51.7%だった.

距離画像による手姿勢推定タスク

通常,現実の距離画像にはノイズが入っている. そのノイズがシミュレータ画像にはないので,変換してノイズを再現.

f:id:yusuke_ujitoko:20170809000649p:plain

Voxel heatmapで三次元姿勢推定

3次元関節推定問題に対して、

  • volumetric heatmapを回帰させる
  • 反復的なネットワークで段階的に精度を上げる

f:id:yusuke_ujitoko:20170806013741p:plain:w500

関連研究

  • CNNによる三次元姿勢推定でよく行われるアプローチは、
    三次元関節座標(x,y,z)を直接回帰問題として解くこと(Li et al.Tekin et al.
    • 難しい問題となる
    • Tompson et al.の論文Pfisterの論文にこのアプローチの欠点が記述されているようなので読みたい
    • 伝統的な2段階で三次元姿勢推定する手法にも劣る
      • こちらの手法ではCNNは2次元関節位置推定にのみ使われ、3次元姿勢は事後処理で別途推定される。

手法

Volumetric representation

volumetric representationを使う。 三次元空間を{w \times h \times d}のvoxelに分割し、 関節が各voxelに存在する確率を推定させる。 教師データは三次元正規分布で作り、教師データとのL2距離を誤差関数とする。

volumetric representationの利点は、各関節の座標を直接回帰させる問題を、voxel ごと関節が存在する信頼度の推定問題とできること。 こちらの方がネットワークとしては勾配情報を伝搬しやすく学習しやすい。 二次元姿勢推定でも全く同じ話があった。

ネットワークの構造としては、hourglass型を使う。

f:id:yusuke_ujitoko:20170806013802p:plain

Coarse-to-fine prediction

多段のstageを利用して反復的に精度を上げていく。 二次元姿勢推定で有効性が確認されている手法だが、 三次元の場合、例えば{64 \times 64 \times 64}のvoxelを16個の関節分推定する必要があるとすると、400万voxel分推定することになる。 次元の呪いを避けるため、coarse-to-fine predictionの枠組みを使う。 最初の方のstageではvoxelのz次元(距離方向)に対する解像度を低くし、 後ろの方のstageでは解像度を徐々に上げていく。

評価

従来の座標を回帰させる方法(Coordinate Regression)と比べて、voxelの確率を回帰させる提案手法の有効性が明らかとなった。

f:id:yusuke_ujitoko:20170806015201p:plain:w400

他の代表的手法と比べてもSOTAであった。

人体構造の制約を GANでimplicitに教示して姿勢推定するメモ

関連研究

  • 姿勢推定ではDCNN(Deep Convolutional Neural Nets)でheatmapを回帰する手法が一般的
    • しかし、以下の場合では現実ではあり得ない姿勢を出力してしまうことがある
      • 部位のocclusionが大きいとき(以下の画像参照)
      • 背景と部位の類似度が高いとき
    • これを避けるには人体の関節構造についての事前情報が必要。
    • でも人体の幾何的制約をDCNNに入れ込むのは難しい

f:id:yusuke_ujitoko:20170730090950p:plain

Adversarial PoseNet

姿勢推定した結果が「人体として尤もらしいか」をimplicitに学習させるために、GANの枠組みを利用。 通常GANではGeneratorとDiscriminatorが1組ずつだが,この研究ではDiscriminatorが2つある.

  • Generator
    • G: pose generator
      • pose keypointのheatmap(pose heatmap)の生成
      • occlusion heatmapの生成
  • Discriminator
    • P: pose discriminator
      • pose heatmapとocclusion heatmapから姿勢として尤もらしいかを判別する
    • C: confidence discriminator
      • 推定が正しいときにはpose heatmapの値が高い傾向にあることを考慮し,
        Gのpose heatmapの値が大きくなるようにすることが目的

GはG自身で学習可能だが、それだけだと結果は良くない。 PやCの誤差も使ってGを更新する。

PやCは真のheatmapとGの生成したheatmapを区別するように学習する. ただしそれだけではなく,例えばCはGがlow-confidentなheatmapを出力したら"fake"だと分類しやすいようになっている. GはCを欺くよう学習するので,high-confidentなheatmapを出力するようになる.

f:id:yusuke_ujitoko:20170730091150p:plain

以下でG,P,Cをそれぞれ確認する。

G: Multi-Task Generative Network

Gは画像{x}をもとに, pose heatmap {y}とocclusion heatmap {z}を推定する.

Convolutional pose machinesによると,受容野を大きくすることが部位推定に重要であるという. このGでも大きな受容野を利用。

また,顔や手を特定するような局所的な特徴と,体全体を理解するのに必要な全体情報の両方が必要. 各スケールでこれらの情報を捉えるため,encorder-decorderスタイルのアーキテクチャにおいてskip connectionを使用。 stacked hourglassと同様に,各ステージで教師データを与える.

f:id:yusuke_ujitoko:20170730092830p:plain

P: Pose Discriminator

PやCは真のheatmapとGの生成したheatmapを区別するように学習する.
ただそれだけでなく,PはGに対して,人体の関節構造に関する事前情報を与える役割を持つ.

Pの誤差関数は以下で表される.
f:id:yusuke_ujitoko:20170730135244p:plain:w500
この中に{p_{fake}}という項がある。
Gによって生成されたpose heatmapによって関節部位を推定し, その推定した関節位置と真の位置のl2誤差の大きさにより{p_{fake}}は決まる.

f:id:yusuke_ujitoko:20170730134012p:plain:w200

  • その他
    • 誤差関数の設計は従来のGANと同じ.
    • 従来のGANと異なり,encoder-decoderスタイル.

f:id:yusuke_ujitoko:20170730134201p:plain

C: Confidence Discriminator

Cも真のheatmapとGの生成したheatmapを区別するように学習するが, それだけでなくCは,high-confidence predictionをlow-confidence predictionから区別する.

Cの誤差関数は以下で表される. f:id:yusuke_ujitoko:20170730135637p:plain:w500

{c_{fake}}は,Gの生成したheatmapと真のheatmapの類似度で計算される.
f:id:yusuke_ujitoko:20170730133458p:plain:w250
例えばGがlow-confidenceなheatmapを出力したら,{c_{fake}} が 0に近くなる.
GはCを欺くよう学習するので,結果的にGはhigh-confidenceなheatmapを出力するようになる.

学習アルゴリズム

f:id:yusuke_ujitoko:20170730134246p:plain:w500