🌱
えっちなサイトを作る(19)
引き続きえっちなゲームがプレイできちゃうサイトを作ろうと頑張ります。
今回はU-Net(Dilated Conv + sc-SE + pixel Shuffle)を実装し、
実際に2次元画像(表情)のモザイクの回復を試みました。
出力結果が出るのは非常に楽しい😎
モザイク除去から学ぶ最先端のディープラーニング本をやる(6)
3章 U-Netによるモザイク除去
- Image to image translation
- I2Iとも表記する
- 入力画像を条件として、画像を出力すること
- I2Iが解決する問題
- ノイズ軽減
- 超解像
- 条件なし画像生成
- モダリティーの変換
- 機械学習でよく書かれている処理の模式図について
- テンソルの状態と変換方法を表現してるっぽい
- 読める…読めるぞ!
- U-NetのSkip-Connectionの働き
- 画像を使いまわしているとみなすことができる
- Res-NetのResidualBlockの長い版
- ロス収束が早い
- 消費メモリが多い(結合オペレーションにCiooncatenate使うから)
- 深い層の学習が進まないかも
- CNNの特徴
- 位置普遍性と畳込みカーネルより、局所的な特徴量に着目しがち
- 背景が強いハードサンプルではロスが生じやすい
- 全体の特徴を見るという考え
- 高周波の情報を保ちつつ、広範囲を参照することで実現する
- Squeeze and Excitation, Dilated Conv
- Squeeze and Excitation(SE Blockモジュール)
- 全体の特徴を見るように組まれたCNNのモジュール
- チャンネル方向の情報を圧縮する
- sc-SE Block
- SE Blockの派生
- チャンネル方向・空間方向の両方の情報を圧縮
- Dilated Conv
- カーネルの参照範囲を拡大させるアイデア
- Kaggle API
- ユーザー登録してClab上でデータセットを利用する
演習3
- TF2.5.0
- TPUで実行
- Kaggle APIと連携
- 前処理
- データセットを訓練データに変換
- Anime Face Dataset
- 63565枚!
- 64x64x3ch numpy配列 uint8に変換
- 規定サイズ以下は無視
- モザイクデータ作成
- モザイク処理(NN法1/4->GaussianBlur(1.5)->NN法x4)
- 訓練データとテストデータ分割
- データセット形式に変換(float32,スケール0-1,バッチサイズ256)
- TF2.5.0だとbatch methodにdrop_remainder=Trueオプションがいるかも
- https://github.com/koshian2/MosaicDeeplearningBook/issues/4
- データセットを訓練データに変換
- モデルの実装
- se-SEモジュールの実装
- Pixcel Shuffleの実装(アップサンプリング用)
- 通常の畳込み層
- U-Netの実装
- 35層!
- エンコーダー層:13
- 中間層 : 6
- デコーダー層:16
- 損失関数 : L1 loss
- 評価関数 : psnr
- モデルの訓練
- TPUで分散処理
- 実行時間37分!
- val_psnr = 19.88990020751953
- 20dBいかなかった…
- テストデータの出力
- オリジナル - モザイク化 - 回復した画像の並び
-
考察
- 普通にイイ感じ!
- 眼帯キャラの回復できてるのがすごい
- 左右の目の形状が全然違くなってしまっている場合がある
- こまかなディテールの回復はやはり難しい。服の襟とか。
- 元々、2次元画像の見栄え的に鼻の表現を弱くしているせいか、回復画像では完全に鼻が消える場合が多い
-
自習
- DeepCreamPyとの性能比較
- 訓練したモデルを使って、いらすとやのアワビにモザイクをかけたものを回復
- 全然駄目だった…
- 訓練データと入力データの傾向がぜんぜん違うせいだと思う
その他
参考書の演習問題で引っかかる点を、参考書のGitHub issuesで解決してくれてる人がいて非常に助かった…。
これが輪読パワー!
終わりに
目に見える成果物があるとやる気が回復します。
次回は参考書の4章を進めます。
Discussion