CGを使って機械学習のデータを作ってみよう～Synthesized Data Augment その② 学習編

#1. 前回のおさらい
　__機械学習__を進める上で、必要不可欠なの**学習データ**をCGの技術を使って効率よく構築する方法を研究していこう。前回は、学習データの水増しの技術Data AugumenntにCGの合成技術を使ってみた。基本となる画像学習データから、目的の部分(今回は人のセグメンテーション）をマスクとして抜き出し、背景をインペイントして、新たに別の背景と合成する手法を説明しました。こうすることで、背景と人物の様々な組み合わせの学習データを増やすことができるのである。
　今回は、増やした学習データを使ってどれくらいの効果が出ているかを実際にUnetで学習してみて検証してみよう。

<img width="100" alt="0001.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261290/472b9920-5a88-b306-b828-6d47edb667fb.jpeg"> <img width="100" alt="0001.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261290/33e0dfb3-97b2-8664-8cca-1c6eccb5293b.png"> <img width="100" alt="0001_clenBG_.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261290/5fde914c-401b-f258-20a2-25aa8d75bab4.jpeg"> ＋  <img width="100" alt="0002.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261290/e1907a34-f79e-1b5e-5ca3-8899d7c8caea.jpeg"> <img width="100" alt="0002.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261290/88cf2d0b-3789-3444-86dc-254c35ff749d.png"> <img width="100" alt="0002_clenBG_.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261290/1844a0d9-debd-1804-f652-cf8aec409638.jpeg">
　＝　<img width="200" alt="0001_0002_clenBG_.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261290/935b3b95-65d9-06e9-4394-cb27a71b19dc.jpeg"> <img width="200" alt="0002_0001_clenBG_.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261290/02b8142f-40b6-1c85-bc6d-e811dbf1155c.jpeg">
<人物と背景を分離して、それぞれを入れ替えて新しい画像を構築する。>

#2. 概要
　機械学習を成功させるには、数多くの学習データが必要になるが、もちろん手作業で構築するには限界があるので、それをCGの手法を使って、簡単に効率化が可能かどうかを検証していきたい。
　前回のSynthesized Data Augmentで学習データを拡張したデータを使って、実際に学習して検証してみる。
　検証内容は、元の学習データと同数の新たに再合成して作られた学習データとの性能の違いをチェックし、次にSynthesized Data Augmentの真骨頂である更なる学習データの拡張によって、学習結果がどのように変化してみるかを検証したい。


#3. U-netの実装
　__U-net__は機械学習のモデルの中でもポピュラーで、実装も比較的楽で結果も良いので、今回のような実験的な検証には向いているといえる。
![u-net-architecture.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261290/f7830888-5a6e-c5f3-b3bf-7ddad852309f.png)

　U-netの詳しい解説は省略しますが、U-netは対になった画像（人物の映った画像とそのマスク画像）の学習データを入力して、画像データから人物のマスク画像を学習することができます。今回の検証では、学習が成功すれば、新しい画像を入力すると、人物が映っているところだけをマスクを生成することができる。


 今回U-netは簡単なKerasの実装を使いました。

インプットのイメージサイズは256x256ピクセルです。
まずは元のデータも合成データも同じ1000枚で100エポック学習してみた。


#4. U-netの学習結果の検証

__Default Dataset__
Precision_average:  0.946
Recall_average:  0.955
Fscore_average: 0.948
IoU_average:  0.905

__Sythesized Dataset__
Precision_average:  0.969
Recall_average:  0.912
Fscore_average: 0.939
IoU_average:  0.886

__Default Dataset & Sythesized Dataset__
Precision_average:  0.976
Recall_average:  0.949
Fscore_average: 0.962
IoU_average:  0.927

 Default(Defaultのデータセット)、Sythesized(合成した)データセット、MIX(二つをミックスしたデータセット)で検証してみたところ、Precisionは、SythesizedとMIXがDefaultよりも精度が高いことがわかる。かわりにRecallは、Defaultの精度が良かった。総合的にFscoreやIoUを見る限り、MIXが一番良いのがわかる。
推論画像を確認してみる。
__Default Dataset__
![default.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261290/2e577986-ac50-5afc-1180-9b6db2d2762d.png)

__Sythesized Dataset__
![synth.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261290/dbbc511a-c9b5-2989-e054-bc579cb16fa6.png)

__Default Dataset & Sythesized Dataset__
![mix.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261290/196e4577-a36c-f66a-7830-14f009f9bda5.png)

画像で比べてみても、若干だがDefaultよりもMIXの方が画像の中のノイズが少なくなっているのがわかると思う。また、Defaultのエッジ付近のピクセルがMIXの方が滑らかになっているように思える。

今回は、同じデータセットであっても、マスクで切り取って合成することで、精度を向上できる可能性があることがわかった。
こちらの論文でも同じようなことが言われています。
https://arxiv.org/abs/2012.07177