9/2017 読んだもの

28. Learning from Simulated and Unsupervised Image through Adversarial Training

  • シミュレータで画像を生成した時についてくるアノテーション情報と,refineした画像が食い違わないようにする工夫が面白い.
  • 現実的な画像に近づけられたかをどう定量的に評価するか?→実際にモデルの学習に利用して精度が出るか確認・・・なるほど

 

29. Visual Worlds as Proxy for Multi-Object Tracking Analysis , 2016

  • virtual KITTIの公開
  • CGを用いてDNNを訓練しても精度が出ないと言われている中で,作成したCGのデータセットでMOTのパフォーマンスが向上したという報告が気になる.
  • real to virtual worldでもモデルの学習で精度が出たので,CGをより現実に近づけれたかどうかの判断で,モデルの学習の精度を見るのは不十分か?

 

30. Creativity: Generating Diverse Questions using Variational Autoencoders , CVPR2017

  • 'diverse question'の重要性について力説していたのが印象的.
  • コンピュータの「創造性」は,例えば未来予測やこの研究のように1枚の画像から複数の質問を挙げることとしていたのが興味深い.

 

31. Style Transfer for Anime Sketches with Enhanced Residual U-net and Auxiliary Classifier GAN, 2017

  • PaintsChainerでは色のヒントを手動でつけるが,この論文は参考イラストでの色の選び方を自動で真似して着色してくれる.
  • U-netの勾配消失を防ぐためにGuide Decoderを2つも追加する工夫が面白い.

 

32. StyleBank: An Explicit Representation for Neural Image Style Transfer, 2017

  • StyleBankという,auto-encoderによってスタイルをfeature embeddingにしたものを利用する.従来のneural style transferでは,新たなスタイルで変換できるようにするために,再度,ネットワークを訓練する必要があった.提案手法では,CDを取り替えると別の音楽を聞けるように,StelyBankを取り替えるだけで,別のスタイルで変換を行えるようになるという.面白い.

 

33. Texture Networks: Feed-forward Synthesis of Texture and Stylized Images, 2016

  • texture synthesis でも style transfer でも生成結果を見ると,Gatysらの結果に劣っているように感じるが,feed-forwardで生成できるという点が当時では大進歩だった.

 

34. Let there be Color!: Joint End-to-end Learning of Global and Local Image Priors for Automatic Image Colorization with Simultaneous Classification,  SIGGRAPH2016

  • シーン分類のクロスエントロピー損失を用いて,適切に大域的な特徴量が取れるようにネットを訓練し,シーンにあった着色を行えるようにした工夫がある.シーン分類のラベル付けをより細かくしたらどうなるのか.

 

35. Fast Image Processing with Fully-Convolutional Networks, 2017

  • dilated conv. とMSEの単純なネットワーク構造で複数の画像処理の効果を近似することができるというのが面白い.
  • 高速に処理を施せるので,今後フレーム間で整合性を保てれば,リアルタイムで映像の処理が行え,ライブ配信などでの表現の幅が広がりそう.

 

36. A Learned Representation for Artisitc Style, 2017

  • 32.StyleBankと同じ問題設定.一つのstyle transfer ネットワークが一つのstyleにしか変換できないという問題.スマホアプリなどに搭載するには,メモリの観点から,一つのネットワークで複数種類のスタイル変換が行えるべきである.
  • この論文の約2ヶ月後に32.StyleBankが発表されている.違いとしてはStyleBankはコンテンツとスタイルを明示的に分けようとしている点.変換の質はStyleBankの方が良さそう.
  • スタイルを二つのベクトルで表現できるように落とし込めているのがすごい.スタイル変換だけでなく,そのほかの画像処理などもこのように,異なるパラメータと,共通のパラメータの畳み込み層で表現して使い分けることができるようにならないだろうか.

~8/2017 読んだもの

1. Generative Adversarial Nets

2. unsupervised representation learning with deep convolutional generative adversarial networks (pdf)

3. Image-to-Image Translation with Conditional Adversarial Networks (pdf)

4. InfoGAN

5. Pose Guided Person Image Generation

6. Coarse-to-Fine Volumetric Prediction for Single-Image 3D Human Pose

7. 3D Human Pose Estimation = 2D Pose Estimation + Matching

8. Dynamic FAUST: Registering Human Bodies in Mostion

9. Visual Attribute Transfer through Deep Image Analogy

10. DeepSketch2Face: A Deep Learning Based Sketching System for 3D Face and Caricature Modeling

11. Example-Based Synthesis of Stylized Facial Animations

12. Context Encoders: Feature Learning by Inpainting

13. High-Resolution Image Inpainting using Multi-Scale Neural Patch Synthesis

14. Globally and Locally Consistent Image Completion

15. WarpNet: Weakly Supervised Matching for Single-view Reconstruction

16. Universal Correspondence Network

17. Artistic style transfer for video

18. Conditional Generative Adversarial Nets

19. Pixel Deconvolution Networks

20. StreetStyle: Exploring world-wide clothing styles from millions of photos

21. Deep Photo Style Transfer

22. Transformation-Grounded Image Generation Network for Novel 3D View Synthesis

23. A Point Set Generation Network for 3D Object Reconstruction from a Single Image

24. A Hierarchical Approach for Generating Descriptive Image Paragraphs

25. Age Progression/Regression by Conditional Adversarial Autoencoder

26. Photo-Realistic Single Image Super-Resolution Using a Generative Adversarial Network

27. Controlling Perceptual Factors in Neural Style Transfer

Globally and Locally Consistent Image Completionを試す

SIGGRAPH 2017で発表された「Globally and Locally Consistent Image Completion」を簡略し実験した記録です.(ディープネットワークによるシーンの大域的かつ局所的な整合性を考慮した画像補完)

 

論文へのリンク:

http://hi.cs.waseda.ac.jp/~iizuka/projects/completion/data/completion_sig2017.pdf

プロジェクトページへのリンク:

飯塚里志 — ディープネットワークによる画像補完(SIGGRAPH 2017)

 

 

感動.すごい.

 

 

 

気になるアイデア

Dilated Convolution を使うことで

・受容野を広げ,画像中の広範囲の情報を利用,

・ダウンサイズをできるだけ避けて,解像度をキープ.

 

また,2つの識別器(Discriminator)の利用し,

・画像全体がリアルか

・補完付近がリアルか

をみることで,より補完が上手くいく.

 

 

 

早く自分でも試して見たいと思い,ソースコードの公開を待ち望むも中々その日は来ず.

簡単にでも自分でコードを書くことに.

 

論文と同じPlace2を利用しましたが,その一部のジャンルに絞ることや,後処理を施していないなど,結構論文とは異なる状況で実験しています.

 

 

結果

 

f:id:akmtn:20170908173808p:plain

 

学習途中の画像を載せました.

補完領域は,あるサイズの矩形です.画像の4分の1くらいを占めています.

 

 

補完領域の形を複雑にすると,補完している場所がよりばれにくくなりそうです.

 

 

Completion NetworkのMSEによるPretrainingが終わった段階では,下のようにぼやけた感じでした.

f:id:akmtn:20170908181727p:plain

このあとGANによる手続きで,より自然な画像を生成するように更新していきます. 

 

 

論文中でも, heavily structured objectsの補完は困難であると書いてあるように

人や飛行機などを復元するなどは難しいようですね.

f:id:akmtn:20170908180014p:plain

 

→得意なジャンル,不得意なジャンルがある.

 

 

いくつか試して,Adversarial Loss + L2 Loss を組み合わせるのが効果的という実感も.

Adversarial Loss だけで飛行機画像の生成を行うとグチャグチャに.

 

f:id:akmtn:20170908180130p:plain f:id:akmtn:20170908180433p:plain

そもそも飛行機画像の生成自体難しいとは思いますが.

 

ハイパーパラメータの調整もしていないですし,論文のように2ヶ月間学習していませんので,全然再現できていないので, 

論文筆者によるソースコードが待ち遠しいです.

 

 

Pose Guided Person Image Generation

5/25 arXivに投稿された,Pose Guided Person Image Generation という論文を読みました.

[1705.09368] Pose Guided Person Image Generation

 

 

Pose Guided Person Generation Network

 服や人の情報を残して,任意のポーズを取った,人の画像を生成したい.

 

{PG^2} Network は,2つのステージで構成される.

 一つ目のステージ

  同一人物のポーズを変えた,ぼんやりとした画像を生成

 2つ目のステージ

  ぼんやりとした画像を高精度にするためのconditional GAN

 

・ネットワークの構造

 ステージ1:

  Generator1:encoder-decoder U-netに似ている.

  encoderやdecoderの各層はResidual Block になっている.

  encoderとdecoderの間には全結合層がある.

 

 ステージ2:

  GAN

  Generator2:encoder-decoder U-netに似た構造.

        encoderやdecoderの各層はResidual Block になっている.

        encoderとdecoderの間には全結合層がない

  Discriminator: DCGANのDisciminator

 

 

・Loss関数

 

 ステージ1:poseMaskLoss ( L1損失関数+poseMask )

  poseMaskによって,ターゲットにしているポーズの位置の損失を強調する.

 

 ステージ2:

  Generator2の損失関数は,

    Discriminatorが real 画像だと判定したかどうか

    → ラベル1とDの出力値の binary cross-entropy

    さらに,poseMaskLossも加える.

  Discriminatorは,

    real 画像が入力された時には,1

    fake 画像が入力された時には,0が出力されているかどうかで

     binary cross-entropy 

 

 

・データセット

 Market-1501 http://www.liangzheng.org/Project/project_reid.html 

  re-identification のデータセット

DeepFashion http://mmlab.ie.cuhk.edu.hk/projects/DeepFashion.html 

 服などのデータセット

 

 poseMaskLossは背景変化の影響の低減のため,人物の体に注目するようにするための工夫.

 したがって,DeepFashionのように白背景の場合は大きな効果は得られないようだ.

 

 

・データの前処理

 pose-estimationをして,18点の,関節や頭の位置を示した18 x 1chの白黒画像を作る

 論文中には state of the art な手法で推定したとあり,

GitHub - ZheC/Realtime_Multi-Person_Pose_Estimation: Code repo for realtime multi-person pose estimation in CVPR'17 (Oral)

を使っている.しかし今はもうOpenPoseが state of the art ?

 

 

・実装

 U-net like なネットワーク構造で,https://arxiv.org/pdf/1612.05360 で提案されているU-net 風のものを使っているようだ.

 U-net との違いは,skip-connectionをconcatではなく,要素ごとの和にしている点.

 

 論文中には,ダウンサンプリングやアップサンプリングの手段が載っていなかったので,自分の実装では,

 Conv2d stride=2 でダウンサンプリング.

 ConvTranspose2d stride=2 でアップサンプリング.

 

 また,encoder側のResidual Blockのどの位置からskip connectionを作り,どのいちでdecoder側に足しこむのかに関しては明らかになっていない.

 

 論文中のNetwork architectureの図にはいくつか間違いが含まれているので,その部分のアップデートと共により詳しい構造について述べられるのを期待したい.

 

 

・結果 

(学習中)

 

・コード (ここ)

 DeepFashion用.

 データの前処理として,Pose-estimationが必要.

 変数 dataloader にバッチごとの画像をだすイテレーターを設定しないと動かない.

 

 

infoGANを実装した(い)

infoGANの論文を読み,MNIST用の実装をPyTorchで行った記録です.

論文は2016年6月に出ているので1年ほど前のもの.

[1606.03657] InfoGAN: Interpretable Representation Learning by Information Maximizing Generative Adversarial Nets

 

タイトルを日本語訳すると,「情報量を最大化する敵対的生成ネットワークによる解釈可能な表現の学習」でしょうか.

 

infoGANの特徴

・GAN

・明快な表現を獲得する

・教師なし学習

相互情報量の最大化(隠れ符号と生成画像間の)

・DCGANの一部を変えるだけで作れ,訓練も簡単

 

相互情報量は,2つの確率変数のうち1つがわかった時に,もう1つの確率変数に関してどれほど推測できるかを示すので,2つが独立な時には相互情報量は0になります.

今回のinfoGANでは,その相互情報量を最大化するので,隠れ符号と生成画像の相互依存性を高めるように学習させようということになります.

 

実装に関して

・ネットワーク

 DCGANをベースにして,論文のAppendix通りにQネットワークを付け足す.

 隠れ符号cを出力するQnetとDnetは畳み込み層全てを共有する.

 

 出力層に関して,論文中に記載されていなかったように思うので,雑に設定してしまった.

  Dの出力層は,ノード2つ,ソフトマックス関数

  Qの出力層は,ノード12つ,

    うちカテゴリカル符号は10次元分,

    うちコンティニュアス符号は2次元分.

  Gの入力には,62次元のzと,12次元のcを単純につなぎ合わせた74次元のノイズ.

 

・損失関数

 Dの損失関数は,2つのノードをからソフトマックスをへてクロスエントロピーを計算.realの時には1を出力,fakeの時には0を出力できているか.

(F.CrossEntropyLoss でlogSoftMaxが行われるから2回もソフトマックス計算している??)

 

 Gの損失関数は,Gを経由した生成画像がDでrealつまり1と出力されるかでクロスエントロピー

 

 Qの損失関数は,カテゴリカル符号は10次元のone-hotで評価.ターゲットにしている数字を示すラベルが出てきているかでクロスエントロピー誤差.

コンティニュアス符号は,論文中にこのような記述.

For continuous latent codes, we parameterize the approximate posterior through a diagonal Gaussian distribution,

出力された符号は,対角ガウス分布に従うようにパラメタライズするようです.

正直よくわからなかったので,

GitHub - hvy/chainer-infogan: Chainer implementation of InfoGAN

こちらの方のchainerによる実装を参考にさせてもらったところ,gaussian_nllというロス関数を使っていたので,真似してやり過ごしました.

 

・backward

 どこで .detach() するかは重要ですが,DCGANと同じでいいはずで,Dをバックワードする時にGに行かないようにする.GはDごとバックワード.そして,出力されたcはGもDも通って来ていてそのままバックワードすることにしました.

 

 

結果

・カテゴリカル符号(10次元)をone-hotで入力した時の出力

入力[1,0,0,0,0,0,0,0,0,0], [0,1,0,0,0,0,0,0,0,0],,,,

 

f:id:akmtn:20170529203241p:plain

順番は揃っていませんが,数字を各カテゴリに分けることができています.

 

コンティニュアス符号(1次元が2つ)

各行ごとにカテゴリ(数字の種類)を固定して,一つのcontinuous cを変化.

f:id:akmtn:20170529203245p:plain

数字の傾きが変化していることから,一つのcはローテーションという表現を獲得していることがわかります.

 

もう一つのcontinuous cを変化.

f:id:akmtn:20170529203249p:plain

1がはっきりしていますが,太いものから細いものへと変化しています.cが太さという表現を獲得しています.

 

 

 

 

ここまで200epochほどで学習が少ないかもしれませんが,DCGANなどでは解釈が難しかったzですが,infoGANによって1つの符号が明快な表現を意味するようになったことを確認できました.

 

改善すべき点は多いですがコードはここにあります.

自己符号化器,AutoEncoderの実装

機械学習プロフェッショナルシリーズの「深層学習」のChapter5を参考に,PyTorchでAutoEncoderの実装を行いました.

 

パラメータとしては,

 入出力層が28x28次元,

 中間層が100次元,

 (28x28 -> 100 -> 28x28)

 中間層の活性化関数はReLU,

 出力層の活性化関数は恒等写像

 重みはガウス分布(σ=0.01)で初期化,

 SGD(重み減衰λ=0.1,モメンタムµ=0.5

 Loss関数は二乗誤差

にしました.

 SGDよりもAdamの方がLossが落ちたのでAdamに変更しました.

 

結果としては,

f:id:akmtn:20170518183029p:plain

このようになり,数字は認識できます.画像全体として(背景が?)白くなっているのは,重み0が濃淡256階層の中央に来るように調整することで治るのかもしれません.

中間層のユニットを100個よりも大きくすると,よりLossも下がり,よりくっきりとした画像が得られました.中間層のユニットの数が特徴の表現力を表していることを実感できます.

 

コードはここにあります.

シンプルなGANの実装

GANの論文を読んだついでにMNIST用に実装しました.

ネットワークには,Convolutionを使わず,多層ニューラルネットです.層の数,活性化関数やバッチ正規化などの設定はてきとうです.なのでGANもどきです.

f:id:akmtn:20170514191216p:plainがんもどき

 

pytorchで実装したかったので,本家のDCGANのコードを参考にしながら書きました.

github.com

また,こちらの方の実装も参考にしました.(keras)

yusuke-ujitoko.hatenablog.com

 

結果として,以下のような出力を得ました.

f:id:akmtn:20170514190525p:plain

それなりに数字には見えますが,1が多い一方,2が少ないという偏りがありました.

 

一応,コードはここにあります.