Xで画像を見ていると、AIで生成と表示されることがあります。

地味に気になってました。

画像の見た目からAI生成だと判断しているのでしょうか。

それとも、画像ファイルの中にある情報を読んでいるのでしょうか。

同じAI生成画像をリサイズ、JPEG変換、スクリーンショットにして、Xへ投稿したときの表示を比べてみます。

なお、Xがラベルを付ける詳しい仕組みは公開されていません。今回の結果だけで内部の判定方法を特定することはできません。自分の環境でどこまで変化するのかを確かめます。

XのAIで生成ラベルとは?

Xのメディアリテラシーに関する案内には、加工またはAIで生成された画像や動画にラベルを表示する取り組みが書かれています。英語の案内ではMade with AIという表記ですが、日本語環境ではAIで生成と表示されます。

ただし、画像のどこを見て表示を決めるのかまでは書かれていません。

そこで最初に、画像ファイルには何が入っているのか調べました。

普段見ている画像ファイルには、画面に表示される色の情報だけでなく、撮影日時や撮影機材、利用したソフトウェアなどが入っている場合があります。このような画像に付随する情報を、メタデータと呼びます。

メタデータは有名ですが、もう一つがC2PAです。これは、画像がどのように作られ、編集されたのかを記録し、途中で書き換えられていないか確認できるようにする仕組みです。

ただし、C2PAが見つからないから人間が作った画像、という意味ではありません。OpenAIのContent provenance checkの説明にも、情報が検出されない理由として、メタデータの削除や非対応の生成方法などがあり、AI生成ではない証明にはならないと書かれています。

今回は、画像ごとにメタデータとC2PAを確認し、その結果とXの表示を並べます。

今回試す4枚

AIで生成した1枚の画像から、次の4枚を用意します。

画像やること
元画像生成サービスからダウンロードしたまま使う
リサイズ長辺を1024pxへ縮小する
JPEG変換PNGからJPEGへ保存し直す
スクリーンショットmacOSの画面に表示して撮影する

画像の内容は同じです。変えるのは、普段でも行いそうな保存方法だけにしました。

この比較で見たいのは、次の2点です。

  • 加工後のファイルに、どの情報が残っているか
  • Xへ投稿したとき、AIで生成の表示が変わるか

ラベルを消す方法を探すことが目的ではありません。画像を扱う過程で、来歴を示す情報がどう変わるのかを確認します。

検証用のファイルを用意する

作業用のディレクトリは次のようにしました。

x-ai-image-label/
├── input/
│   └── original.png
├── output/
├── results/
├── make_variants.sh
├── inspect_images.sh
└── RESULTS.md

画像の変換には、macOSに最初から入っているsipsを使います。

画像内の付加情報を読むためにExifTool、C2PAを確認するためにc2patoolを入れました。

brew install exiftool c2patool

インストール後、バージョンを確認します。

exiftool -ver
c2patool -V

AI生成画像を保存する

今回は、次の指示で画像を1枚生成しました。

埼玉県民と千葉県民が仲良くしている写真

ありそうでなさそうなキワどいところを攻めました。

たぶんここは千葉

生成された画像を、そのままダウンロードします。ここでスクリーンショットを撮ると比較の基準にならないため、最初は生成サービスから保存されたファイルを使いました。

ファイル名をoriginal.pngにして、input/へ置きます。

input/original.png

リサイズとJPEG変換を行う

比較用の画像を作ります。

bash make_variants.sh input/original.png

スクリプトでは、元画像のコピー、長辺1024pxのPNG、JPEGへ変換した画像を作ります。

3枚の画像をoutput/へ作成しました。
04-screenshot.pngはREADME.mdの手順で作成してください。

最後の1枚は、元画像をプレビューで開き、画像全体が入るようにmacOSでスクリーンショットを撮りました。画像部分だけを切り出し、output/04-screenshot.pngとして保存します。

output/
├── 01-original.png
├── 02-resized.png
├── 03-converted.jpg
└── 04-screenshot.png

画像ファイルの中を確認する

Xへ投稿する前に、4枚の画像にどの情報が入っているか確認します。

bash inspect_images.sh

ExifToolの結果はmetadata.jsonc2patoolの結果はc2pa.jsonへ保存しました。C2PAが見つからない場合の表示も、c2pa-error.txtへ残します。

[{
  "SourceFile": "output/01-original.png",
  "ExifTool:ExifToolVersion": 13.55,
  "System:FileName": "01-original.png",
  "System:Directory": "output",
  "System:FileSize": "2.2 MB",
  "System:FileModifyDate": "2026:09:15 23:06:25+09:00",
  "System:FileAccessDate": "2026:09:15 23:08:38+09:00",
  "System:FileInodeChangeDate": "2026:09:15 23:06:25+09:00",
  "System:FilePermissions": "-rw-r--r--",
  "File:FileType": "PNG",
  "File:FileTypeExtension": "png",
  "File:MIMEType": "image/png",
  "File:ExifByteOrder": "Big-endian (Motorola, MM)",
  "PNG:ImageWidth": 1536,
  "PNG:ImageHeight": 1024,
  "PNG:BitDepth": 8,
  "PNG:ColorType": "RGB",
  "PNG:Compression": "Deflate/Inflate",
  "PNG:Filter": "Adaptive",
  "PNG:Interlace": "Noninterlaced",
  "PNG:SRGBRendering": "Perceptual",
  "IFD0:Orientation": "Horizontal (normal)",
  "ExifIFD:ColorSpace": "sRGB",
  "ExifIFD:ExifImageWidth": 1536,
  "ExifIFD:ExifImageHeight": 1024,
  "XMP-x:XMPToolkit": "XMP Core 6.0.0",
  "XMP-tiff:Orientation": "Horizontal (normal)",
  "Composite:ImageSize": "1536x1024",
  "Composite:Megapixels": 1.6
}]

結果から、AI生成に関係しそうな項目だけを抜き出します。

画像C2PA生成・編集ソフトに関する情報
元画像なし(No claim foundXMP Core 6.0.0
リサイズなし(No claim foundXMP Core 6.0.0。画像は1024×682だが、XMPには元の1536×1024も残っていた
JPEG変換なし(No claim found基本的なEXIF、JFIF、色空間。XMP Toolkitの情報は見つからなかった
スクリーンショットなし(No claim foundUserComment: Screenshot、Apple製ディスプレイのICCプロファイル

4枚をXへ投稿する

4枚は、1枚ずつ別の投稿へ添付しました。複数枚をまとめると画像の扱いが変わる可能性があるためです。

投稿文は同じにし、画像だけを差し替えます。

AI生成画像の表示を確認するためのテスト投稿です。

投稿後、自分の画面でAIで生成の表示があるか確認します。

4枚とも AIで生成 が出ません。

結果

実行結果を並べると、次のようになりました。

画像C2PAXの「AIで生成」表示
元画像なし表示なし
リサイズなし表示なし
JPEG変換なし表示なし
スクリーンショットなし表示なし

くやしかったので、別の画像でも試してみた

今度は海あり埼玉です。

c2patoolからも結果が返ってきました。

{
  "claim_generator_info": [
    {
      "name": "OpenAI Media Service API"
    }
  ],
  "assertions": [
    {
      "label": "c2pa.actions.v2",
      "data": {
        "actions": [
          {
            "action": "c2pa.created",
            "softwareAgent": {
              "name": "gpt-image",
              "version": "2.0"
            },
            "digitalSourceType": "http://cv.iptc.org/newscodes/digitalsourcetype/trainedAlgorithmicMedia"
          }
        ]
      }
    }
  ]
}

Macのプレビューでjpgに変換したバージョンにはラベルがつきません。

先ほどの画像にはなかった、作成元に関する情報です。

claim_generator_infoにはOpenAI Media Service API、画像を作ったソフトウェアにはgpt-image 2.0と入っています。trainedAlgorithmicMediaは、学習済みの仕組みによって作られたメディア、という意味のようです。

結果全体ではvalidation_stateValidになっていましたが、署名を信頼できるものとして登録できていないという警告も出ています。今回は署名元の信頼性までは判断せず、C2PAの情報が画像内に存在するかを比較します。

この元画像をXへ投稿すると、今度はAIで生成と表示されました。

続いて、同じ画像をリサイズ、JPEG変換、スクリーンショットにして確認します。

画像C2PAXの「AIで生成」表示
元画像あり表示あり
リサイズなし(No claim found表示なし
JPEG変換なし(No claim found表示なし
スクリーンショットなし(No claim found表示なし

リサイズ、JPEG変換、スクリーンショットの3枚からは、C2PAが見つかりませんでした。

元画像ではC2PAが見つかり、XにもAIで生成と表示されました。

この検証だけではわからないこと

仮にC2PAが残った画像だけにラベルが表示されても、XがC2PAだけで判定しているとは言い切れません。別の情報や画像そのものも見ている可能性があります。

反対に、どの画像にも表示されなかった場合も、XがAI生成画像を見分けられなかったとまでは言えません。Xの案内では表示対象の拡大が説明されていますが、地域、アカウント、アプリなどの条件が同じとは限らないためです。

今回書けるのは、同じ画像を4通りで保存し、自分の環境から投稿したところ、どの表示になったかまでです。

やってみた感想

不思議に思っていたAIで生成ラベルですが、Xが画像の見た目で判断しているものと思っていました。調べてみると、画像ファイルにはメタデータ以外の情報が入ることがあり、その一つとしてC2PAがあることを知りました。

最近ではAIがつくったものか、人間がつくったものかを見分けることが難しいです。フェイクを見抜ける眼力を身に着けたいものですね。

神奈……?

参考

ここまで読んでいただき、ありがとうございます。もしこの記事の技術や考え方に少しでも興味を持っていただけたら、ネクストのエンジニアと気軽に話してみませんか。

  • 選考ではありません
  • 履歴書不要
  • 技術の話が中心
  • 所要時間30分程度
  • オンラインOK

エンジニアと話してみる

関連リンク

AI・クラウド・データ分析のご相談はネクスト株式会社までお問い合わせください。