画像生成 AI で生成した画像は CNN で判別できる？

## はじめに

[RetailAI Adventurers Advent Calendar 2023](https://qiita.com/advent-calendar/2023/rai-adventurers) の 8 日目の記事です。
昨日は [@zushi_ryota](https://qiita.com/zushi_ryota) さんの『[Mockito-Kotlin を使ってテストコードを書いてみる](https://qiita.com/zushi_ryota/items/7393fb2a17ea357131ee)』でした。

昨年末の ChatGPT の登場により、今年は『生成 AI』が流行語大賞のトップテンに入るほど世間一般に AI が浸透し、AI エンジニアでなくても LLM を使ったサービスを開発するなど一気に普及していきました。

更にタイムリーなことに本記事の投稿前日の 2023 年 12 月 7 日には、
- [**Google (DeepMind) が ChatGPT を凌駕すると言われている次世代マルチモーダル AI モデル「Gemini」を発表**](https://japan.googleblog.com/2023/12/gemini.html)
- [**Apple が Apple Silicon 向けに最適化された ML フレームワーク「mlx」を OSS として公開し、llama やStable Diffusion も実装可能**](https://github.com/ml-explore/mlx)

という大きなニュースが今年の年末にもありました。

その生成 AI ブームですが、本記事では昨年から急速に普及してきた画像生成 AI に関しては色々遊んでみたいと思います。画像生成 AI サービスとして有名どころでは、[DALL](https://openai.com/dall-e-3)や[Stable Diffusion](https://github.com/Stability-AI/stablediffusion)、[Midjourney](https://www.midjourney.com/)などがありますが、いずれも拡散モデルをベースとしたモデルです。。私は [pix2pix](https://arxiv.org/abs/1611.07004) や [CycleGAN](https://arxiv.org/abs/1703.10593) 等の GAN（敵対的生成ネットワーク）を活用した開発も過去に取り組んでおりましたが、その急速な進歩に驚くばかりです。

## 拡散モデルについてざっくり説明

まずは画像生成 AI の急速な発展に貢献している拡散モデル(Diffusion model)についてざっくり説明します。このモデルを一言で説明すると、**ノイズからそのノイズを除去していくことでデータを生成するモデル**です。

拡散モデルは、対象分布データ $x_0$ にノイズ（ガウシアンノイズ）を徐々に加えていき、完全なランダムノイズ$x_T$ に変換する拡散過程と、この拡散過程を逆向きにたどる逆拡散過程の 2 つのコンポーネントがベースになっています。
拡散モデルは、様々な強さのノイズを加えた完全なノイズから徐々にノイズを除去する Denoising によってデータを生成します。このように拡散モデルはデータをノイズへ崩壊することで、その生成方法を学習するというユニークなアプローチをとっています。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/866338/4984177b-da5c-95ab-1152-d2decad59918.png" alt="image-20231204211907113.png" style="zoom:67%;" />

_図引用：[Denoising Diffusion Probabilistic Models](https://arxiv.org/pdf/2006.11239.pdf)_

実際の画像生成 AI サービスでは自然言語によるプロンプトなどの生成したい画像条件を指定することができますが、これは拡散モデルと他のアプローチを組み合わせることで実現しています。
例えば OpenAI が開発したの[DALL･E2](https://openai.com/dall-e-2)では、テキスト埋め込みと CLIP テキスト埋め込みから CLIP 画像埋め込みを推定する事前分布 (prior)と、テキスト埋め込みと CLIP 画像埋め込みを条件づけした拡散モデルにより画像を生成する Decoder を構成することで、テキストから画像を生成することが可能となります。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/866338/c58920ab-a064-22f5-6910-ed36614adb9a.png" alt="image-20231204222959992.png" style="zoom:67%;" />

_図引用：[Hierarchical Text-Conditional Image Generation with CLIP Latents](https://cdn.openai.com/papers/dall-e-2.pdf)_

## 画像生成 AI のビジネス応用 : 広告業界

画像生成 AI のビジネス応用は広がっており、日本でも広告業界のビジュアルコンテンツ制作において活用事例が増えてきているように感じます。生成 AI は短時間で高品質、かつ創造性の高いコンテンツを大量に生成できるため、従来の広告制作プロセスの効率化に貢献していると思われます。

ここでは幾つかの企業の活用事例について紹介します。

### オタ恋

マッチングアプリの「[オタ恋](https://ota-koi.jp/)」では、2023 年 5 月から画像生成 AI を活用した広告を展開しています。ユニークでインパクトのある広告を次々打ち出して SNS でバズっただけでなく、認知度が高まったことで「[男性は 1.5 ～ 2 倍程度、女性は 3 ～ 7 倍程度、入会者が増加した](https://www.itmedia.co.jp/news/articles/2310/05/news179.html)」と広告効果もあったようです。画像の特徴から Stable Diffusion を用いて制作されていると推測されます。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">はじめてのマッチングアプリは、オタ恋。 <a href="https://t.co/GnEMWH0iRK">pic.twitter.com/GnEMWH0iRK</a></p>&mdash; オタ恋【公式】 (@otakoi_jp) <a href="https://twitter.com/otakoi_jp/status/1721691877391626515?ref_src=twsrc%5Etfw">November 7, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

画像生成 AI の『短時間で、かつ創造性の高いコンテンツを大量に生成できる』という特性を日本で最もうまく活用している企業かもしれません。

### 伊藤園

伊藤園は 2023 年 9 月に AI を活用して生成された「AI タレント」を日本で初めてテレビ CM に登場させて話題となりました。AI 生成は AI Model 社が開発したツールを活用したとのことです。AI タレントならタレントの不祥事なども気にせず、企業側も安心して採用できるという側面もあるかもしれません。

<iframe width="560" height="315" src="https://www.youtube.com/embed/DEoG1NCdmdY?si=Lmh7nuYdxqnSh_u5" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>

https://www.ai-model.jp/

### パルコ

パルコも[生成 AI を活用したファッション広告を制作・公開](https://parco.jp/happy-holidays/)しています。クリエイターに AI デジタルクリエイターを起用し、グラフィック以外のナレーションや音楽も全て生成 AI を活用して制作されているとのことです。創造性の高いコンテンツを次々に生成できる画像生成 AI は、こういったファッション分野との相性は良さそうです。

<iframe width="560" height="315" src="https://www.youtube.com/embed/a6pBBlTYwHk?si=oF3ptj883J50qOq_" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>

## 生成 AI の課題 : リアルとフェイクの境界が曖昧に

このように生成 AI が急速に精度向上、普及が進むことで、画像や動画、音声、文章など様々なコンテンツでリアルとフェイクの境界が曖昧になってきています。

昨年から今年にかけて生成 AI で作成したと思われるフェイク画像・動画が物議を醸しています。最近では[イスラエル軍とイスラム組織ハマスの軍事衝突をめぐって様々なフェイク画像がネット上に拡散され](https://www3.nhk.or.jp/news/html/20231107/k10014250371000.html)、日本でも[ニュース番組出演に似せた岸田首相のフェイク動画](https://www3.nhk.or.jp/news/html/20231104/k10014247171000.html)が問題となりました。
[来年のアメリカ大統領選挙でも、こういった生成 AI を活用したネガティブキャンペーンが展開されることが予想](https://faportal.deloitte.jp/institute/report/articles/000834.html)され、実際に今年 3 月にはトランプ前大統領が警察に取り押さえてれているフェイク画像がネット上で拡散されています。

<img src="https://cdn.arstechnica.net/wp-content/uploads/2023/03/fake-trump-800x800.jpeg" alt="AI-generated photo faking Donald Trump's possible arrest, created by Eliot Higgins using Midjourney v5." width=70%>

_図引用：[AI-faked images of Donald Trump’s imagined arrest swirl on Twitter](https://arstechnica.com/tech-policy/2023/03/fake-AI-generated-images-imagining-donald-trumps-arrest-circulate-on-twitter/)_

従来こういった画像や動画を生成するためには GAN などのモデルを開発するための高度な専門知識やマシンリソースが必要とされ、誰でも簡単に扱えるようなものではありませんでした。一方で近年の生成 AI は専門知識を持たない一般のユーザーでもプロンプトさえ入力すれば簡単にフェイク情報を生成できるようになってしまいました。

こういった課題があるなかで、AI が生成した画像・文章であるかを判定するツールやサービスが登場してきています。代表的なサービスとして、Optic 社の「[AI or Not](https://www.aiornot.com/)」や、Hive Moderation 社の「[AI-GENERATED CONTENT DETECTION](https://hivemoderation.com/ai-generated-content-detection)」がありますが、これらを活用することで、生成 AI かどうかの確率を算出してくれます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/866338/130e5fa1-a830-beff-8f63-58904e089f46.png" alt="image.png" style="zoom:67%;" />

_図: [AI-GENERATED CONTENT DETECTION](https://hivemoderation.com/ai-generated-content-detection)による判別結果_

また AI が生成したコンテンツに電子透かしを埋め込む技術の開発も進んでいます。今年 10 月に策定された高度な AI システムを開発する組織向けの国際指針である「[広島 AI プロセス](https://www.mofa.go.jp/mofaj/files/100573469.pdf)」でも、電子透かしの導入を推奨することを盛り込んでおり、実際に[DeepMind は電子透かしのツール](https://deepmind.google/technologies/synthid/)を Google Cloud の画像生成 AI モデルである Imagen に組み込んでいます。

## CNN による AI 画像識別モデル

ようやくここから掲題のテーマです。

とはいえ現状の画像生成 AI により生成された画像は、どこか不自然で独特のクセみたいなものがあり、違和感があります。特に実写の人の画像はその傾向が顕著な気がします。Kindle で大量出版されている AI 美女写真集を見れば、そのクセが見えてくるはずです。

- 顔の特徴が似通っている
- 顔のパーツが整いすぎている
- 肌がマットな質感
- 細かい形状が再現できていない（特に手指）
- やたら背景をボカしたがる
- シーンが不自然

以上の特徴であれば、**CNN ベースのモデルでも、リアルな人の画像と AI が生成した人の画像の判別くらい簡単にできるんじゃない？** という疑問がわきましたので実験してみましょう。

今回は巷に溢れている「 **画像生成 AI で生成された AI 美女** 」を題材に、それが AI で生成された画像なのか、本当に実写のリアル画像なのか CNN を分類タスクとして判別してみます。

## データセット

モデル開発のためには対象データの画像が必要です。今回は分類モデルで「リアル美女」と「AI 美女」を判別する CNN モデルを作成するため、「リアル美女画像データセット」と「AI 美女画像データセット」を用意しましょう。今回は実験ということで数は少ないですが、両データセットをそれぞれ 450 枚（合計 900 枚）作成し、このデータを訓練・検証・評価データセットに分割し、モデル学習・評価します。

### リアルデータセット

~~私の好みに偏らないように~~ 以下のサイトの日本の芸能人美人ランキングの上位 200 名を「リアル美女」として今回のデータセット収集の対象としました。このランキングの妥当性はよくわかりませんが、上位には人気のタレントがランクインしている感じです。

https://ranking.net/rankings/most-beautiful-japanese-female-geinojin#js-result

画像データは[icrawler](https://icrawler.readthedocs.io/en/latest/) という Python ライブラリを活用してクローリングで取得しました。検索キーワードと出力ディレクトリ、画像数、その他検索条件を指定するだけで、簡単に画像データを収集することができます。

```python
from icrawler.builtin import GoogleImageCrawler

# 検索キーワードリスト
keywords = ["浜辺美波", "広瀬すず", "今田美桜", "新垣結衣", ...]

# 検索条件
filter = dict(
    type="photo",
    color="color",
    size=">4mp",
)

# クローリングでデータ取得
for idx, keyword in enumerate(keywords, start=1):
    crawler = GoogleImageCrawler(
        storage={"root_dir": f"../dataset/real_img/{idx:03d}_{keyword}"}
    )
    crawler.crawl(keyword=keyword, max_num=10, filters=filter)
```

取得データの中には同一画像や、複数名が撮影された画像、全く関係のない画像等が含まれているため、手作業でそれらを取り除きました。

リアルデータセットには同一人物の画像が 2〜3 枚含まれます。汎化性を評価するため、データセット分割時は同一人物の画像が訓練・評価データセットにそれぞれ分割されないように分配しています。

### AI データセット

AI 美女画像はもちろん画像生成 AI で作成します。本記事では[Midjourney](https://legacy.midjourney.com/home/) を使って生成しました。Stable Diffusion だと顔立ちの特徴が似たりよったりな印象があったため、より多様な特徴が生成できると期待して Midjourney を採用しました。

画像生成の際のプロンプトには、`Japanese beautiful woman`や`Japanese cute girl`などリアルデータに近くなるように指示を与えています。また構図やシーン、年代、髪型、表情、画像アスペクト比等の画像生成条件はできる限り偏らないように生成したつもりです。またシーンはリアルデータセットで収集した画像を参考にしています。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/866338/210e89fa-317a-8d99-8f8f-4ff1665556c9.png" alt="image.png" style="zoom:67%;" />

_図．生成した画像の一例_

最初の 2 時間くらいは様々な高品質の AI 画像が作成されるため、楽しく作業できていましたが、それ以降は辛くなり、ただただデータセット数を稼ぐための作業となってしまいました。。。もっとプロンプトを追求できれば、更に高品質で多様な AI 美女が作成できたかもしれません。プロンプト職人への道は遠い。。

## モデル学習

とりあえずシンプルな CNN モデルとして ResNet50 によるファインチューニングで、AI 美女画像の分類モデルを学習していきます。今回は Pytorch & torchvision で実装しています。モデルや学習方法に関して特段工夫はせず、どの程度の性能になるか確認してみましょう。

- モデル : [`ResNet50`](https://pytorch.org/vision/main/models/generated/torchvision.models.resnet50.html)
- 事前学習済みモデル : あり（`IMAGENET1K_V2`）
- バッチサイズ：64
- データ拡張：[`RandomRotation`](https://pytorch.org/vision/stable/generated/torchvision.transforms.RandomRotation.html#torchvision.transforms.RandomRotation)、[`RandomHorizontalFlip`](https://pytorch.org/vision/stable/generated/torchvision.transforms.RandomHorizontalFlip.html#torchvision.transforms.RandomHorizontalFlip)、[`RandomAutocontrast`](https://pytorch.org/vision/stable/generated/torchvision.transforms.RandomAutocontrast.html#torchvision.transforms.RandomAutocontrast)、[`RandomAffine`](https://pytorch.org/vision/stable/generated/torchvision.transforms.RandomAffine.html#torchvision.transforms.RandomAffine)
- Optimizer：SGD Momentum
- Early Stopping：あり
- レイヤー固定：最初の 5 エポックは最終層の重みのみを更新し、それ以降はすべてのレイヤーの重みを更新

https://gist.github.com/atsukish/fa7959d2673f2055579bebd58f4d74dd

やや loss は不安定な感じでしたが、収束していました。検証データで loss が最小となった 22 エポック目のモデルで評価をしていきます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/866338/57fef2dc-9080-df6c-10d1-6b39467b5f84.png" alt="image-20231205194334523.png" style="zoom:50%;" />

_図．学習曲線_

## 評価結果

評価データセット 200 枚（AI: 100 枚 / リアル: 100 枚）による**accuracy は 95.5%(191/200)とそれなりの精度で分類できていました**。

以下は分類モデルが AI 画像をリアルと誤分類した事例です。上手くリアルに騙せたというと AI としては成功だと思いますが、これといった共通した特徴は見られないですね。

| ![sample_19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/866338/07e82bf5-8acb-097e-2d30-e6386e03ba94.png) | ![sample_22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/866338/5f6d4290-92bf-c0e0-db00-bd86ec257299.png) |
| ------------------------------------------------------------ | ------------------------------------------------------------ |
| ![sample_83.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/866338/b14bb008-f1e2-b819-c054-037cae7843ce.png) | ![sample_93.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/866338/a1ab4568-7807-da5a-365b-45ea47373a73.png) |
| ![sample_55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/866338/9e6f9215-d48b-9b27-abb9-12862a88fefd.png) |                                                              |

_図：AI 画像をリアル画像と誤分類した事例_

一方でリアル画像を AI 画像と誤分類した事例です。誤分類した 4 枚のうち 2 枚は同一人物（事例 ② & ③）でしたので、今回生成した AI 画像と顔の特徴が似ていたのかもしれません。

- [事例 ①](https://www.tfm.co.jp/cms/media/609/20200408-2aae282f-8c78-4eea-bc43-5d1830ae047a.jpg)
- [事例 ②](https://www.rbbtoday.com/imgs/ogp_f/324601.jpg)
- [事例 ③](http://enonkun.com/wp/wp-content/uploads/35e6f62eeee2cbfc17e41783ca29be72.jpg)
- [事例 ④](https://actresspress.com/wp-content/uploads/2015/09/df115ce001b8e7d95d6315d532e1a180.jpg)

## 判断根拠の可視化

最後にモデルが画像のどこの部分に着目して予測を行ったかを可視化してみます。CNN ベースの画像認識モデルの最終層から出力された特徴量マップから、各クラスごとに画像のどこに注目しているかをヒートマップで可視化することができます。今回は代表的な手法である Grad-CAM を使って可視化してみます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/866338/c61b86b1-3fdf-f8b9-810a-baef84c76b87.png" alt="image-20231205231850481.png" style="zoom:67%;" />

_図引用：[Grad-CAM: Visual Explanations from Deep Networks via Gradient-based Localization](https://arxiv.org/pdf/1610.02391.pdf)_

Grad-CAM は[pytorch-grad-cam](https://github.com/jacobgil/pytorch-grad-cam)というフレームワークを活用しました。

以下に AI 画像に対するヒートマップの例をいくつか示します。多少ばらつきはありますが、顔付近を重要な特徴として AI 画像と判定しているようです。仮説の通り AI が生成する顔は似たような特徴があるのかもしれません。

|                           Original                           |                           Grad-Cam                           |
| :----------------------------------------------------------: | :----------------------------------------------------------: |
| ![sample_13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/866338/3e3e5f91-a423-a15e-ed24-f2c1d94b474c.png) | ![sample_13_gladcam.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/866338/ad8386b1-0da6-8927-8999-7f9d576b5527.png) |
| ![sample_60.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/866338/7abc309c-f3c1-3662-4bf9-82e0c4830557.png) | ![sample_60_gladcam.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/866338/174458a8-38d7-b01f-da64-24d2b7cc54ee.png) |
| <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/866338/20dc07f8-d6aa-c273-73e5-cb876cb003eb.png" alt="sample_10.png" width=50% /> | <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/866338/d9fb0175-0789-243f-5c43-25a2b1d55c6e.png" alt="sample_10_gladcam.png" width=50% /> |
| ![sample_64.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/866338/5eb43f4b-5db8-64ae-eb3d-ccccdbd1b4e7.png) | ![sample_64_gladcam.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/866338/0e174a38-8cca-53b0-e935-9e4eea8133d7.png) |
| ![sample_65.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/866338/37b59a5c-de13-5295-83cb-500dbb31cc3b.png) | ![sample_65_gladcam.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/866338/a8fce092-a0ed-fc77-e2b3-1ed2aec1bf3b.png) |

## まとめ

本記事では画像生成 AI のビジネス応用事例や課題に触れ、限られた条件かつ、僅かなデータバリエーションでしたが、AI 画像とリアル画像が判別可能か実験を行いました。

今後は画像に限らず生成 AI で生成された画像・音声・文章などのデータは更に高精度化が進み、更に人が制作したコンテンツとの境界はほぼなくなってしまうかもしれません。AI を co-pilot として活用していけば、今よりさらに高度なコンテンツやサービスを生み出せることが間違いないはずです。課題をしっかり理解した上で、活用していきましょう！

明日は、[@syuri_n](https://qiita.com/syuri_n) さんの記事です。お楽しみに！

## 参考文献

- [拡散モデル データ生成技術の数理](https://www.amazon.co.jp/-/en/gp/product/B0BWRXFBQ2/ref=dbs_a_def_rwt_bibl_vppi_i1)
- [Diffusion による Text2Image の系譜と生成画像が動き出すまで](https://speakerdeck.com/nhamanasu/diffusionniyorutext2imagenoxi-pu-tosheng-cheng-hua-xiang-gadong-kichu-sumade)