『CNNで生成された画像は驚くほど簡単に発見できる...今のところ』の再現実装の論文を読む

[2021年のディープラーニング論文を1人で読むAdvent Calendar](https://qiita.com/advent-calendar/2021/solo-dl-papers)8日目の記事です。今回の論文は少し変わっていって**論文の再現実装の論文**です。ディープラーニングは論文の数こそ多いですが、「俺ら（Ours）が強いんだ（精度太字強調）」が大半で、他の論文を再実装して検証するということには、なかなかフォーカスされませんでした。そういったことは行われていたことは確かですが、良くてもブログ記事レベルで、再実装して論文にするというのは初めて見ました。

[ML Reproducibility Challenge 2020](https://paperswithcode.com/rc2020)というのがあり、今回紹介するのはこちらのチャレンジの論文です。このチャレンジの趣旨は、信頼性と再現性のある科学結果の公開と共有を促進するもので、元の論文の主な主張を支持しない「否定的な結果」のほうが価値あるよという、昔から科学で重視されている公正さや批判的思考に重きをおいたものです。

再現実装しているのはCVPR2020の『[CNN-generated images are surprisingly easy to spot... for now](https://arxiv.org/abs/1912.11035)』という論文で、「CNNで合成された画像（GANやDeepFake）はモデルのアーキテクチャを含めて高精度で当てられますよ」という趣旨の内容です。一般的な意味でのDeepFakeに関連した内容です。これの再現実装をしているのがこの論文で、**大まかに主張はあっていたが、大きく実験結果が異なっていた場所がある**とのことでした。それでは読んでいきましょう。著者はルール大学ボーフムの方です。

* タイトル：**[RE] CNN-generated images are surprisingly easy to spot...
for now**
* URL：https://arxiv.org/abs/2104.02984
* 出典：Joel Frank, Thorsten Holz; arXiv:2104.02984 [cs.CV]
* コード：https://github.com/Joool/ReproducabilityCNNEasyToSpot

## 問題のスコープ
### 元論文について
CVPR2020のREがついていない方を「元論文」と呼ぶことにします。元論文の主張は以下の通りです。

* 元論文では、ProGANを使い20の異なるインスタンスから画像を生成してデータセットを作り、ResNet50を訓練した。多様なデータセットを用いて、慎重に選択したData Augmentationにより、**CNNで作成された画像に対する普遍的な検出器を作れるかどうかを実証**することを目的としている。
* ガウスぼかしやJPEG圧縮といった画像フィルタを積極利用することで、同時期に発表された**StyleGAN2にまで一般化した画像分類**を作成できた。

### 本論文のスコープ
REがついている方を「本論文」と呼ぶことにします。本論文の目的は、

* 元論文で提唱されたData Augmentationが（通常）汎化性能を改善するか
* 多様なデータセットが、汎化性能の向上に役立つか

を検証することを目的としています。本論文も元論文もディープフェイクによる社会問題が念頭にあります。

## 本論文での実験について
### データセット
元論文では**GANで作った画像（偽）と本物の画像を混ぜてデータセット**としていました。具体的には、元論文では、LSUNの20のクラスに対し、クラスごとに異なるProGANのモデルを訓練し、クラスごとに1.8万の偽画像と1.8万の本物画像を作成していました。全体の画像数は(1.8万＋1.8万)×20=72万枚です。

これに加えて、本論文での追加実験において、StyleGAN2の訓練済みモデルからも、偽1.8万＋本物1.8万のデータセットをLSUNの猫と馬のクラスで作り使用しています（猫と馬のクラスは元論文でも使っていますが、偽画像の生成ネットワークが異なります）。テストデータは元論文の著者から提供されたもののみを使っています。

### Data Augmentation
この論文では元論文にならい次の4種類のData Augmentationを使います。

* **ガウシアンぼかし（Blur）**：クロップの前に50％の確率で発生。ぼかしのカーネルσを{0, 3}の一様分布で決める
* **JPEG圧縮（JPEG）**：50％の確率。OpenCVとPILのライブラリでJPEG圧縮し、圧縮の品質は{30, 100}の一様分布で決める
* **ぼかし＋JPEG（Blur & JPEG(0.5)）**：50％の確率。発生時はぼかしとJPEGを同時にかける。
* **ぼかし＋JPEG（Blur & JPEG(0.1)）**：上と同じだが確率は10％に一度落とします

前処理としてResNet50の前処理をし、224×224のRandom CropとHorizontal Flipをします。上の4種のData Augmentationはクロップと反転の前に行います。JPEGの規格では品質は30～95の範囲では規定していないが、元論文の著者は30～100で行っていたそうです。ここは再実装時に30～95にクリップしています[^1]。

[^1]: こういうことまでいちいち書いているのが面白い

### 訓練詳細
ここは大事な点ではないので軽く触れるだけですが、学習率の減衰のさせかたが面白いです。Adamで初期学習率を1e-4としているのですが、Val精度が5エポック改善しなければ学習率を1/10しています。ここはただのReduceLROnPlateauなのですが、**学習率が1e-7に達したら訓練を打ち切っています**。ReduceLROnPlateauを早期打ち切りとして使うというのは初めてみました。Plateauは自分は使ったことないのですが、こういう使い方はやってみたいですね。

### 計算リソース
再実装の論文ではPCのスペックを細かく書いています。Ubuntu 18.04, with 64GB RAM, a AMD Ryzen 7 3700X 8-Core Processor, GeForce **RTX 2080Tiが2枚**です。ResNet50の訓練には20クラスの全体のデータで42時間必要でした。多くの実験はもう少し少ないクラス（2～8クラス）で行っており、6時間で訓練が完了するそうです[^2]。実験全体では**590時間GPU**を動かす必要があると推定されています。こういうGPU時間を細かく書いてくれるのが嬉しいですね。

[^2]: 3.6×(2～8）で7万～26万枚のデータセットだが、意外と早い。ResNet50は訓練済みモデルをfine-tuningしています。

## 結論
### 主張1：Data AugmentationがCNNで生成された画像を見分ける汎化性能を改善するか
→**答え：Yes（元論文と同じ）**

![08_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232088/e637f372-8384-15e1-7285-561d91eba048.png)

数値はAverage Precision。全般的にData Augmentationをかけると数値がよくなっているので、元論文の主張は正しいです。

ただ、**再実装時に大きく乖離した部分があり**、Blurが顕著でSAN（超解像のモデル）では30も値がずれていました。この理由は、元論文が**SciPyによりぼかし処理を独自に実装していたのに対し、本論文ではPyTorchの組み込み関数を使用していた**からとのことです。結論的にはPyTorchによるぼかしを使うのが望ましいと本論文では述べています。

また、Blur+JPEGでも差が生まれています。本論文では、50％で「Blur+JPEG」をかけ、50％ではなにもしない処理でした。一方で元論文では、50％でぼかしをかけ、これとは別に50％でJPEGをかけていました。

この条件で検証したのが「Corrected」の部分です。結果はまちまちで、DeepFakeでは元論文に近づきましたが、SANやSITDでは元論文との差が拡大してしまいました。ここで出た仮説は、これらの変動がData Augmentationによる確率的なブレによるものであり、複数回実験して統計的に見る必要があるとのことでした。しかし、1回の実験でGPUを42時間もかかるため、ここで実験を終わりにしたとのことです[^3]。

[^3]: 特にGAFA系が「電力消費？ナニソレオイシイノ」でGPUやTPUのパワーでゴリゴリ殴る論文を出している中で、こういう計算リソースの都合でやめますという、一般人目線かつSDGsな視点で語ってくるのはほっこりします。

終わりにしたとは書いていますが、Appendix見るとBlur+JPEGを3回実行したときの結果が書かれていました[^4]。

[^4]: やらないといいつつAppendixではちゃんとやってくれる。「あれ、この人ツンデレ？」なんて思ってました

![08_06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232088/9a2b006d-68ad-1e73-76e2-4fd1ab150309.png)

SANは他のモデルよりブレが大きい（SDが±3）のは確かですが、30ものズレを説明できるほどではないですね。あくまで一例ですが学習の設定で局所解に引っかかったなど、もっと別の要因があるのではないかと自分は見ています。

### 主張2：多様なデータセットが汎化性能の向上に役立つか
→**答え：基本的にYes（元論文と大筋で同じ）**

![08_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232088/ade86b4f-c670-f021-73b4-09fe72371d99.png)

**データセットのクラス数に連動してAverage Precisionが増えている**から。

ところが、主張1と同様SITD，SAN，DeepFakeで大きなズレが発生しています。本論文ではこの理由はこれらの実験がランダム性に敏感だからと仮説立てています。

元論文では16～20クラスあれば、訓練データが一般的に実用なレベルで十分な多様性を持つ（よって性能改善が漸減している）と述べています。しかし、本論文ではこの漸減のポイントが存在することに完全には同意していません。理由はDeepFakeとSITDが16クラス→20クラスで数値が相当良くなっているからです。

この改善が実はData Augmentationにあるのではないかと仮説を立てました。これを調べるために、**対照実験として訓練データのすべてのData Augmentationをオフにしたサブセットを使って再度訓練**してみました。元論文ではData Augmentationありのサブセットのみで評価している点には注意が必要です。

![08_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232088/6e6d80b8-2870-10f8-c31d-e21b892112ff.png)

Data Augmentationなしで、もしDeepFakeとSITDでクラスを増やしても改善しなかったらこの仮説は正しいですが、この仮説に反して性能は改善していました。よって、**DeepFakeとSITDのブレはData Augmentationの確率的な挙動にあるのではないか**と仮説立てています。

面白いのが、クラス数の増加による汎化性能の向上が、**多くのモデルでData Augmentationありの場合のみ**見られるということです。ここについて突っ込んで議論してもいいと思うのですが、図のキャプションで触れているのみでした。

## 再実装での新しい結果
ここからが本論文による新規要素です。より深く議論するために、StyleGAN2からも偽の画像を作ります。LSUNの猫と馬のクラスを使っています。ProGANからのデータも猫と馬のみにしています。

### 疑問1：結果はGeneratorの構造に依存するか

![08_04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232088/05e2bf14-6f5e-4358-3a70-ef3a3f75944d.png)

ProGANで生成したデータで訓練した例と、StyleGAN2で生成したデータで訓練した例の比較です。各例では、Augmentationなし＋Augmentationあり4種の計5種でResNet50を訓練しています。ここから3点の結論が導けます。

1点目は、**Data AugmentationはProGANのデータで訓練したときに、StyleGANを見分ける汎化性能を高める**こと。ただし、逆はそうではないです。StyleGANで訓練したときのProGAN識別はすでに高い性能を出しているため、Data Augmentationをかけることでかえって性能が落ちます。

2点目は、**Data Augmentationはデータセットに依存**すること。ProGANで生成したデータではぼかしは概して性能を落としているのに対し、StyleGAN2で生成したデータではぼかしが有意に効いているケースが多く、いくつかのモデルでは最も良い結果になっています。**Data Augmentationはデータセットに対して注意深く選ぶ必要**があります。

3点目は、**ProGANで生成したデータのほうが汎化性能が高い**。これはProGANとStyleGAN2の登場タイミングが関係しています。ProGANは2018年のもので、StyleGAN2は2020年のものです。識別対象のネットワークは比較的古いものが多いため、古いProGANのほうがこれらの識別には向いているのではないかとのことです[^5]。

[^5]: この中ではSANは割と新しいほうなのに、SANの性能はStyleGAN2よりも、ProGANのほうが良いのは謎です。StyleGANはAdaINが大事な役割しているから、他のモデルとは相性悪いのかもしれない

### 疑問2：分類器を変えたときにData Augmentationの効果は転移するか
分類器は今までResNet50だけでしたが、これをVGG11、DCT-ResNetでも訓練しました。VGG11はResNet同様ImageNetで訓練済み、DCT-ResNet[^6]は画像をDCT（Discrete Cosine Transfrom-II）してスペクトル化してからResNet50に入れています。DCT-ResNetだけ新規訓練です。

[^6]: JPEGの圧縮をData Augmentationとして入れてるので、DCTを分類器に入れたらどうかみたいな着想だと思います。

![08_05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232088/f395cfb5-0e7a-69b2-73da-de7e81b6470a.png)

**結果はまちまち**です。VGG11ではGauGAN、CRN、IMLEではNo AugよりBlurのほうが悪化していますが、これはJPEGを使うと良くなります。StarGAN、SITD、SAN、DeepFakeではJPEGを使うと悪化しています。これはBlur+JPEGでも解決できませんでした。DCT-ResNetは総じて悪化しています。

mAPの最大化という点でもまちまちで、**Blur+JPEGが妥協点としては一番良いが、全てにおいて万能に機能する「銀の弾丸」なData Augmentationは存在しない**ということを結論づけています。ただ、提案されたData Augmentationは他の分類器でも応用できるとのことでした。

## 本論文に著者によるコメント
簡単だった点

* 元論文が詳細に書かれており、テストデータの入手手順や訓練手順を図表で明確にまとめている。Appendixには更に詳細にかかれている。
* コードの一部しか使えなかったが、見た範囲では質が良かった。ときにはコメントを増やしたほうが良い部分もあった
* READMEが非常に詳細で、データのダウンロード、訓練方法が明確にかかれている。直感的に使えた

難しかった点

* Data Augmentationの「JPEG+Blurの50%」という略記が多用されており、JPEGとBlurを同時に50％かけるものだと理解してしまった。論文中にはしっかり書いてあったが、略記を見て元論文とは少し違う実装をしてしまった。

本論文の結論

* 元論文は再現可能で、大まかな傾向は変わっていない。ただ元論文の手法に限界があることがわかった。
* データセットのジェネレーターの選択は非常に重要で、データセットごとのData Augmentationの選択をしなければいけない。Data AugmentationをしないとProGANの場合は性能が落ちるし、StyleGAN2の場合はAugmentationに関係なく著しく性能が低い。
* 将来的には**実務家が訓練データを常に更新する必要が出る可能性があり、実務家の方はどのData Augmentationが現在の状況に役立つか慎重に検討することをおすすめ**する。

## 自分によるまとめと感想
これはDeepFakeの識別について、再実装論文からかなり突っ込んだ内容となっています。元論文を読んだことはなかったのですが、**DeepFakeの識別ではData Augmentationがかなり重要である**ということを知らされました。そのData Augmentationが画像分類のようなものではなく、JPEGの品質を変えたり、ガウスぼかしを入れたり、特有のAugmentationをしているのが興味深いです。

この手の再実装論文を読んだのは初めてですが、最初からディスカッションで始まっているのでどんどん深堀りしていって面白いですね。普通の「手法提案しました」な論文だと、「この手法はいかにすごいか」を終始アピールしていて、良い意味で批判的なディスカッションが弱いことが多いのです。もちろんそういったディスカッションは他の論文に引き継がれるのですが、他の論文では先行研究の一例として取り上げて、最終的に「俺の手法ドヤァ」になっているので、結局特定の論文に対するディスカッションは深まりづらい傾向はあります。この論文は本当に科学らしい内容なので、この手の再実装論文が増えるとより面白くなるのかなと思っています。ただ、ML Reproducibility Challengeは参加者が非常に少ないとのことなので、今後継続していくかは少し心配ですね。

この論文で面白かったのが「GPU時間がかかりすぎるのでここでやめる」や「コードのこういう表記がハマった」など、ある意味**エンジニアに近い視点で書いている**点ですね。実際論文を実装しているときに感じることってまさにこういうことなので、論文を書く側がこの視点で論じてくれているのは良かったです。

あと個人的に「ん？」と思ったのが、謝辞で「Germany’s Excellence StrategyのもとでDFG, German Research Foundationより支援を受けました」とありました。論文の再実装で研究費がもらえるドイツの研究環境、羨ましいですね。

## 告知
このアドベントカレンダーが本になりました！
**https://koshian2.booth.pm/items/3595424**
Amazonでも扱いあります詳しくは👉　https://shikoan.com