[最新論文]  画像編集はSC-FEGANにお任せください


![gif2.gif](https://qiita-image-store.s3.amazonaws.com/0/315063/8058fb49-7972-9832-1bcf-d2b79da49323.gif)

#論文紹介　画像・GIF引用
2019.02.18に発表されたGANを使った画像編集に関する論文
https://arxiv.org/pdf/1902.06838v1.pdf
https://github.com/JoYoungjoo/SC-FEGAN

#SC-FEGANで何ができるの？
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315063/b94e913f-d47f-19d3-5f3f-6a26c95004c6.png)


<b>ユーザーが描くマスク・スケッチ・カラーを入力にできるため、思った通りの自由な編集ができる</b>

<b>合成画像であってもリアルで鮮明な画像を生成できる</b>

1列目：眉毛と鼻と輪郭を変えている
2列目：閉じている口を笑顔に変えている
3列目：髪色も指定して髪型を変えている
4列目：イヤリングのような細かい部分の編集もできる

#SC-FEGANの良いところ
##①細部まできれい
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315063/c5ff629a-fb12-9bd0-6065-d248a27991c2.png)

（左）SC-FEGAN　SC-FEGANはU-netを使う
（右）従来のモデル　

<b>U-netを使うことで細部のぼやけがなくなり、</b>ピクセルレベルでも鮮明さを保てる
＝対応する解像度でのスキップ構造があるため

##②広範囲も編集できる
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315063/abf21d3f-dd6d-aad0-290c-59b3d1e7feeb.png)
（左１）オリジナル画像
（左２）ユーザーの入力した編集したい部分
（左３）従来の損失関数を使った場合
（左４）本研究での損失関数を使った場合

本研究で提案する知覚損失（後述）とスタイル損失（後述）により
これまでは難しかった髪の毛全体のような<b>広範囲での編集ができるようになった</b>

##③きれいな修復
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315063/e908d3c0-b62a-67c7-26b9-4b3f491dc5d8.png)
Deepfillv1（従来）とSC-FEGANの比較
（左１）本物画像
（左２）マスク（マスクで見えなくなった部分を自然に編集できれば良い）
（左３）Deepfillv1（従来）の結果
（左４）SC-FEGAN（本研究）の結果

<b>従来の場合（左３）、わずかに線が残っているが
本研究（左４）ではきれいに修復できているため、本物と同じ画像になっている</b>

##④自由な編集ができる
###例１
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315063/f94ffa65-18ff-b990-eb68-a089e6f16eb5.png)
（左１）オリジナル画像
（左２）ユーザーが編集したいところを描いた入力
（左３）SC-FEGAN（本研究）による結果

<b>ユーザーの思うままに画像を編集できる</b>
付け加える・変更する・消す・色を変える・新しい髪型など

###例２
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315063/90370691-6790-be4d-cec2-1aa47e4e401d.png)
<b>広範囲が消されていてもユーザーの入力が十分にあれば、本物のような画像になる</b>

##⑤スケッチとカラーだけで画像生成できる
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315063/7547a41c-a720-b8f4-8474-11394c452484.png)
（左１）スケッチとカラーの入力
（左２）生成画像
（左３）本物画像

<b>画像変換に近い使い方</b>もできる

##⑥細かい部分も合成できる
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315063/fdfb69a9-1685-6fe5-3417-453bfa5b94d1.png)

イヤリングの種類を変えたり、新しいイヤリングを描いたりといった<b>細かい描写</b>もできる





---
***
---

#訓練データの用意
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315063/1b35a716-73f7-bfff-4639-1660e0fc6538.png)

CelebA-HQデータ（訓練データ：29,000枚、テストデータ：1,000枚）
スケッチとカラーを取得する前に、画像を512×512ピクセルにサイズ変更する


##スケッチ

HEDエッジ検出器を使用してスケッチデータを生成後、曲線を滑らかにし小さなエッジを消す

##カラー

①サイズ3のメディアンフィルタを適用後、バイラテラルフィルタを20回適用してぼかし画像を作成
②GFCを使用して顔をセグメントし、各セグメントパートをそのセグメントの中央値の色に置き換える
③マスクとカラー画像を乗算する

#ネットワークアーキテクチャ
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315063/27f402b9-f76f-019d-a9da-092154b8f2a3.png)

##Generator
<b>U-net</b>を基にしたネットワーク

convolution層はすべてgated convolutionでカーネルサイズは3×3
gated convolutionはマスクした部分の特徴を学習するconvolution層
→ユーザーの入力が生成画像に反映される

Local signal normalization (LRN)を入力層と出力層を除くすべてのconvolution層に適用

事前にImageNetで訓練されたVGG16を使用

Generatorが受け取る入力サイズは512×512×9（下図）
###入力サイズが9チャンネルになる理由
・編集対象の領域が削除された不完全なRGBチャンネル画像（3チャンネル）
・バイナリのマスク（1チャンネル）
・削除された部分の構造を説明するバイナリスケッチ（1チャンネル）
・RGBで色について表したマップ（3チャンネル）
・ノイズ（1チャンネル）
合計 3+1+1+3+1=9チャンネル
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315063/e051fee3-6504-e9e9-1f43-2467eeea9177.png)


###Generatorのエンコーダー（Generatorの前半）
入力のダウンサンプルをストライド2のconvolution層で7回実行後、dilated convolution

###Generatorのデコーダー（Generatorの後半） 
transposed convolutionでアップサンプリング

U-netと同様に、スキップコネクションを加えることでエンコーダーとデコーダーの同じ解像度同士でconcatenation

出力層を除いて各層の後にleaky ReLUを使う
出力層ではtahn

Generator全体で16個のconvolution層
出力サイズは入力と同じサイズの512×512

損失関数に適用される前にマスクの外側部分を入力画像に変える
→<b>編集部分だけについて学習できるようになる</b>

##Discriminator
SN-PatchGANを基にしたネットワーク
https://arxiv.org/pdf/1806.03589.pdf

#Generatorの損失関数

![image.png](https://qiita-image-store.s3.amazonaws.com/0/315063/0ef47f19-ec0a-cd13-57ea-4d87b2a42357.png)

$D(I)$：入力を$I$としたときの$Discriminator$の出力
$I_{gen}$：$generator$の出力画像
$I_{gt}$：本物の画像
$I_{comp}$：編集する部分以外は本物画像、編集部分はGeneratorの出力になっている画像

本研究では$σ = 0.05, β = 0.001, γ = 120, υ = 0.1,  = 0.001$を使った
各項が表す損失について順番に説明していく

##ピクセルごとの損失
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315063/b424f41f-43f1-b44e-7f0f-d7f90b1acd60.png)
本物画像$I_{gt}$と$generator$の出力画像$I_{gen}$の$L1$ノルムについての式

$N_a$：$a$の数
$1/N$は単純に平均をとるためにしている

$M$：バイナリ―マスクマップ

<b>$α>1$にすることで編集する部分についての損失を大きくすることができる
＝上手に編集できたかが反映される</b>

##知覚損失
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315063/3881c7d2-a70a-300b-e403-b7dc7ed967a6.png)
$Θ_q(x)$：入力$x$のときの$q$番目の層の特徴マップ

<b>同じ状況（同じ特徴マップ）のときに本物画像と生成画像がどのくらい違うかを各層で計算する</b>

各層の$L1$ノルム（どのくらい本物画像と生成画像が違うか）を$N$で割って足し合わせることで（$Σ$）
同じ層で比べたときに平均してどのくらい知覚的に画像が異なるかを計算する

##上手く編集できているかについての損失
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315063/a0195a08-fdf4-15c2-ae0f-c2c2fc1cc3cc.png)
$I_{comp}$は編集したい部分だけが$Generator$の生成したものになっている画像であるため
きちんと本物っぽく編集できていれば$Discriminator$をだますことができる

その結果$D(I_{comp})$の値は大きくなるため、$L_{G,SN}$は負の大きな値になり全体の損失を小さくすることができる

##スタイル損失
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315063/1b89ae1d-8393-87eb-a8a6-571edc6e16e5.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315063/258fa4fc-fb36-ee4c-46c9-d1a2026afd1d.png)
$G_q(x)$はグラム行列を表し、各特徴マップでの自己相関を評価する
特徴マップのshapeが$H_q×W_q×C_q$のとき、
グラム行列の出力は$C_q×C_q$となる

<b>Generatorの生成した画像についての自己相関が
本物画像の自己相関と近い場合（$G_q(I)-G_q(I_{gt})$が小さい値になる）は
生成画像と本物画像のスタイルが似ていると言い換えることができる</b>

##総変動損失
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315063/d6481a75-af24-7678-9124-1e386b36f0a9.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315063/fb2c4be3-1699-da52-68cc-6104add6708f.png)

<b>画像の編集する部分において、
あるピクセルから隣のピクセルへの移り変わりが上手くできているかを評価</b>

画像の特徴である局所性（隣り合うピクセルは同じようなことを表現している）を編集後も保てているか
例）手の画像
手が写った画像のあるピクセルを選んだら肌色だった
→その隣のピクセルも手を表す肌色のピクセルであるはず

なめらかな移り変わりができていないということは上手く編集できていないということができる

画像の空間は2次元のため、x軸とy軸それぞれで総変動損失を計算する

##本物画像と見分けがつかないかについての損失
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315063/94f70131-1b8b-2972-1a6f-10d2b33e0454.png)
本物と見分けがつかないほどの画像を生成するようになると、Discriminatorの出力は何が来ても$0.5$しか出さなくなる（シグモイド関数で出力した場合）

したがって、Generatorが理想的な学習をできれば上記の式は小さくなる
#Discriminatorの損失関数
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315063/1b880275-4111-b582-f426-ac82c00e342f.png)



$D(I)$：入力を$I$としたときの$Discriminator$の出力
本研究では$θ = 10$を使った
##WGAN-GP loss
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315063/f8a76af9-92cc-c011-dad7-12bdefdc896f.png)

WGAN-GP lossを使う

<b>最適化されたWGANでは、Discriminatorの$\hat{x}$(生成画像と本物画像を結んだ直線上の任意の点）に対する勾配の$L2$ノルムが1になる</b>という性質がある
その性質を利用して勾配の$L2$ノルムが1から離れることを損失と見なすようにする


#まとめ
<b>
・自由な入力（マスク・スケッチ・カラー）により、ユーザーの思った通りの画像合成ができる</b>
<b>
・アーキテクチャと損失関数の工夫により修復・編集性能を改善</b>
<b>
・広範囲や細部の編集であっても鮮明な画像合成を可能にした</b>

#関連論文
https://arxiv.org/pdf/1806.03589.pdf