DeepPose論文メモ

関連研究

  • 人体をlocalなパーツが連結したものと見る手法
    • Figure Drawing
    • Pictorial Structures
    • Mixtures of Parts

  • 人体をパーツに分けずholisticに推定する手法
    • DeepPoseはこちら

手法

f:id:yusuke_ujitoko:20170717195026p:plain

  • モデルの構造はAlexNetを流用
    • 入力:画像(220x220)
    • 出力:各関節ごとの位置(2次元)

  • loss
    • 関節ごとの予測位置と真の位置のL2距離の和

  • 上記ネットワークを直列につなぎ多段stage化する。後ろのstageになるほど精密に関節位置を推定していく。(異なるstageのネットワークは異なるパラメータを持つ)
    • 一番目のstageでは、入力画像のうちで全関節の位置を特定する
    • 中間のstageでは各関節ごとに処理が分かれる
      • 各関節ごとに画像cropし高精細化する
      • 一つ前のstageで推定した関節位置と真の関節位置の差分を予測する。

f:id:yusuke_ujitoko:20170717204302p:plain

f:id:yusuke_ujitoko:20170717204310p:plain

  • 制限
    • stageの最初の方で真の位置との乖離が大きいと、予測がうまく行かなそう
    • 1つの画像に対して、関節位置候補が1つのみ

参考

以下の資料は素晴らしいです.
これを読めば論文読む必要はないです.
DeepPose: Human Pose Estimation via Deep Neural Networks

【cs231n】深度画像をもとにCNNで姿勢推定する手法メモ

cs231nの授業レポートを読んだ。 http://cs231n.stanford.edu/reports/2016/pdfs/426_Report.pdf

  • Li 2014のモデルをほぼそのまま使っている

f:id:yusuke_ujitoko:20170717140512p:plain

  • 上記との違う点は
    • 入力が3チャンネルではなく、1チャンネルであること
    • conv2の後の正規化をしないこと
    • 出力は各関節位置

  • 誤差関数の設計
    • 出力の各関節位置のL2距離だけを誤差関数とすると,
      人間の階層的情報を活かしきれてない.
    • 本研究では以下の3つの和を使う
      3つの最適な重みを実験で調べている
      • {L_{d}}:四肢の位置のL2距離
      • {L_{s}}:四肢の長さのL2距離
      • {L_{r}}:関節角度のコサイン類似度

深層学習の認識タスクにおいて、データ量を増やすと精度がどの程度向上するか

データを増やすとどうなるか

(a)モデルサイズや(b)計算力は向上しているが、(c)データセットサイズの変化は小さい。

f:id:yusuke_ujitoko:20170715003003p:plain:w400

データセットが大きくなれば、はたして精度は向上するだろうか。 訓練データ数を10倍にしたら、精度は倍くらいになる? 訓練データ数を100倍や1000倍にしたらどうなる?

Googleは巨大なデータセットを自動で集め、 300Mの画像からなるデータセットとしてJFT-300Mを構築した。 ラベルは自動でつけており、計375Mのラベルがある。(1画像につき複数のラベルがつく)。

実験

以下のタスクに対してデータセットを変化させて精度の変化を調べた。

  • image classification
  • object detection
  • semantic segmentation
  • human pose estimation

実験の結果、タスクによらず,精度はデータセットのlog-scaleに比例することがわかった。

f:id:yusuke_ujitoko:20170715003851p:plain

ただし、実験の中ではハイパーパラメータは最適値にしていない。

redditの反応

実験では50KのGPUを2ヶ月使ったと書いてある。 そしてそれでも101層のResNetが収束しなかった様子。 またハイパーパラメータも最適値を求めていない。 Googleの連中でもその調子なら、せいぜいTitan 5,6個しか使えない一般人はどうすればよいのか。

DRAGANでいらすとや画像を生成してみる

“How to train your DRAGAN"というタイトルの論文で、 変なタイトルだなぁ..と思っていたが、 このタイトルの元ネタとして、アメリカの3DCGアニメがあるのを知った。
(日本名はヒックとドラゴンというらしい。この名前も初耳)

www.youtube.com

このDRAGANを使って以下のようないらすとや画像を生成したというのが本記事の主旨。
この生成画像は非常に綺麗。

f:id:yusuke_ujitoko:20170602003311p:plain

この記事自体はお蔵入り予定だったが,
本日リリースされたchainerのGANライブラリの中に,
決して有名でないDRAGANが入っていて驚き,
この記事を公開する意味もなくはないか,と気持ちを改め,
これを機に成仏させることにした.

この論文の概要

  • GANでは目的関数がnon-convexなので局所的なナッシュ均衡点に到達してしまい失敗する →non-convexぽくないようにすればよい。
  • DRAGANを提案
    • 訓練データの周りの領域においてのみ,勾配に制約をかけることで上記の問題を緩和
    • 実験により有効性を実証

以下で論文の内容をサクッと紹介する。
前回あまりにもそのまま書き下してしまったので省略気味に。

提案手法(ざっくり)

  • 最近ではリプシッツ性の制約を加えたGANが提案されている
    • LS-GAN(weight decayにより制約をかける)
    • WGAN(weight clippingにより制約をかける)
    • WGAN-gp(gradient penaltyにより制約をかける)

でもこの制約は厳しすぎて,Generatorの表現力を抑えてしまう.
そこで、Dの目的関数にペナルティ項として, {\lambda \mathbb{E} \mathbb{E} (|| \nabla_{x} D_{\theta}(x + \delta) -1 ||_{2} -1)^{2} }を加える。

これにより,訓練データ近くのデータに限り、勾配がほぼ1に近づく. 勾配を1に近づけることにより、Dの目的関数を線形に近づけて、鞍点を減らすことを目的にしている。 ホントかどうかわからないが、実験によればmode collpseが減ったのでうまく行く方法である、という主張が書いてある。

提案アルゴリズムの実装

この論文では理論の説明の前に、DRAGAN実装の説明が来ていた。
DRAGANのアルゴリズムは以下のようなもの。
f:id:yusuke_ujitoko:20170530000517p:plain

Vanilla GANとの大きな違いはDiscriminatorの更新方法である。
Dの目的関数に注目すると,目的関数にはペナルティ項が加わっている。
この項の効果は,
訓練データの周りの局所領域のみ の勾配をなるべく1に近づけるというもの.

その他のポイントとしては以下のようなものがある.

  • ノイズ入り訓練データのミニバッチを作る際には、C=0.5とした以下の式を使う. f:id:yusuke_ujitoko:20170530002648p:plain:h20
  • OptimizerにはAdamを用いる。
    また、{\lambda}は10とする。
  • BatchNormalizationを使っていない。
    BatchNormalizationを施すとミニバッチ内のサンプル同士を関連付けてしまうことになり、
    局所的な制約をつけるという方針に影響を与えてしまう。これを避けたい。

DRAGANによる画像生成

MNIST画像

まずはMNIST画像を試した。 G:2層MLP、D:2層MLPという構成のもと行った。

f:id:yusuke_ujitoko:20170602000649p:plain f:id:yusuke_ujitoko:20170602000724g:plain f:id:yusuke_ujitoko:20170602000859p:plain

いらすとや画像生成(MLPベース;上と同じ構造)

f:id:yusuke_ujitoko:20170602001350p:plain

f:id:yusuke_ujitoko:20170602001433p:plain

いらすとや画像生成(DCGANベース)

f:id:yusuke_ujitoko:20170602003311p:plain f:id:yusuke_ujitoko:20170602003343g:plain f:id:yusuke_ujitoko:20170602003643p:plain

誕生日のパラドックスを応用してGANによる生成データの分布の多様性を評価する

GANによって生成されたデータの分布の多様性を評価する論文。
この論文では誕生日のパラドックスを使った少しトリッキーな分析をしている。

実際のGANの生成するデータの分布は、
GANに与える訓練データの分布より多様性に欠けるものであるという結論で終わっている。

誕生日のパラドックス

誕生日のパラドックスとは「何人集まれば,その中に誕生日が同一の2人がいる確率が50%を超えるか」という問題の結果が直観に反しているというパラドックス. 100%を超えるのは366人以上集まった場合だが, 50%を超えるのに必要なのはたった23人である.

試しに22人の場合に全員の誕生日が異なる確率を計算してみる.
その確率は以下のようになる. {} $$ \begin{align} p &= 1 \cdot (1 - \frac{1}{365}) \cdot (1 - \frac{2}{365}) \cdot (1 - \frac{3}{365}) \cdots (1 - \frac{22}{365}) \end{align} $$

この式を変形していく。
{x}が小さいときに{e^{x}}テイラー展開ができて {} $$ e^{x} \approx 1 + x $$ となるので例えば、以下の項は {} $$ 1 - \frac{1}{365} \approx e^{-1/365} $$ となる.これを使うと上の{p}は, {} $$ \begin{align} p &\approx 1 \cdot e^{-1/365} \cdot e^{-2/365} \cdots e^{-22/365} \\ &\approx e^{-1-2-3 \cdots -22/365} \\ &\approx e^{-(1+2+\cdots+22)/265} \\ &\approx e^{-(23 \cdot 22)/(2 \cdot 365)} \\ &= 0.499998 \end{align} $$ となる.
さてこの問題を一般化してみる.
人のある属性がT種類あるとき,n人集まったときにその属性が被る確率が50%を超えるnを求める問題を考えると, {} $$ p \approx e^{-(n^{2}/2 \cdot T)} $$ となる.これを{p = 0.5}に対して解くと, {} $$ n \approx 1.177 \sqrt{T} $$ となる.
よって、ある属性がT種類あるときに,だいたい{\sqrt{T}}人集めればその属性が被ることがわかる.

GANによる生成データの被り具合を調べる

この誕生日のパラドックスを利用して,GANによる生成データの分布の多様性を調べる.
その手順は以下のようなものになる.

  1. {s}個の生成データをサンプリングする
  2. サンプルの中から類似したペアを機械的アルゴリズムで検出
  3. 2で検出したペアに関して,目視で複製であるかチェックする
  4. 1に戻る

{s}個のサンプルをチェックしてその中で複製のようなペアが見つかった場合,
誕生日のパラドックスから生成データの全個数は{s^{2}}であるといえる.

GANの生成データの分布は連続であり、誕生日のパラドックスのように離散でない。
よって完全に同一のサンプルだけでなく,目視で非常に似ているサンプルを"複製"とみなす.

CelebAデータセットに対する結果

DCGANを使う条件において, CelebA(顔データセット)では400サンプルに50%の確率で複製が含まれていることがわかった。 したがって,誕生日のパラドックスを援用すると400*400=16000がこのGANが生成する画像の種類と言える. これはCelebAのデータセット数(200K個)からするとかなり小さい.
つまり訓練データ全体を生成データがカバーしているとは言い難い.

なお,生成分布の多様性はDiscriminatorのフィルタチャネル数に依存することも論文中で示されている.

f:id:yusuke_ujitoko:20170707002335p:plain:w500

論文では他にもCIFAR-10やLSUN(ベッドルーム画像データセット)に対しても評価が行われている. VAEに対してはぼやけていて画像間の複製が判断できなかったため未実施.

個人的にはWGAN-gpに対して同様の実験を行うとどうなるかが気になる.