NSFW検出API vs LLM Vision: 私が試してわかった落とし穴

最終更新日: 2026-07-21 10:47:11

すべてのNSFW検出APIは、明白なポルノを検出できます。差が出るのは誤検知で、水着やアート、医療写真を誤って露骨なコンテンツとして判定してしまうことがあります。これこそが、選択の決め手になるべきです。そこで私は、専用検出器と3つのLLM visionモデルを、同じ境界事例の画像で比較しました。安価な検出器は、26msで大理石の彫像をヌードだとフラグ付けしましたが、より強力なLLMは文脈を読み取り、問題なしと判定しました。多くのチームが採用すべき構成は、すべてのアップロードに対してまず安価な検出器を使い、あいまいなケースだけをLLMに回して再確認する方法です。これにより、実ユーザーを怒らせる誤警報を減らしつつ、おおむね1,000件あたり1ドルのコスト感を維持できます。

NSFW検出APIが実際に返すもの

ツールを比較する前に、何が返ってくるのかを理解しておきましょう。画像を(URL または直接アップロードで)送信すると、0.0 から 1.0 の確率スコアに加えて、カテゴリごとのラベルが返されます。通常は nudity、suggestive、violence で、一部のサービスでは hentai、gore、drugs、または weapons も追加されます。しきい値は自分で決めます。それを上回るスコアはブロックされ、中間の範囲は人間による確認待ちになり、残りは通過します。

その0~1のスコアがすべてです。しきい値を低くしすぎると、誤検知が大量に発生してモデレーターが埋もれてしまいます。高くしすぎると、安全でないコンテンツがユーザーに届いてしまいます。多くのサービスは静止画像をスコアリングしますが、動画(設定した間隔でフレームをサンプリングすることで)やテキストを扱えるものは少数です。この用語を念頭に置いてください。以下の選択肢の違いはそこにあります。

各オプションと、それぞれが得意なこと

市場は4つのグループに分かれ、それぞれ異なる問題を解決しています。

専用のモデレーション API

SightengineHive ModerationAWS RekognitionGoogle Cloud Vision、およびAzure AI Content Safetyの目的特化型分類器。これらは高速(1秒未満〜約1秒)で、画像1枚あたりのコストが低く、上位プランではカテゴリの粒度の細かさに加えて動画サポートも提供します。Hiveは50以上のクラスを公表しており、Sightengineは100ms未満の応答をうたっています。

Sightengine pricing page showing Starter and Pro content-moderation plans

無料の組み込みオプション: OpenAI Moderation

OpenAIのModerationエンドポイントomni-moderation-latest)は無料で利用でき、20 MBまでのテキストと画像の両方を受け付けます。専用の性的/未成年フラグを含む13のカテゴリを返し、それぞれにbooleanと0–1の信頼度スコアが付いています。無料なので、まずベンチマークする際の最速の選択肢です:

curl https://api.openai.com/v1/moderations \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model":"omni-moderation-latest",
       "input":[{"type":"image_url","image_url":{"url":"https://example.com/upload.jpg"}}]}'

セルフホスト型のオープンソース

NudeNetFalconsai/nsfw_image_detection モデルはいずれも Python でローカルに実行でき、呼び出しごとの料金はかからず、画像データがあなたのインフラ外に出ることもありません。NudeNet は試すだけなら 2 行で済みます:

from nudenet import NudeDetector
NudeDetector().detect("upload.jpg")
# -> [{'class': 'FEMALE_BREAST_EXPOSED', 'score': 0.91, 'box': [...]}, ...]

オープンソースの safe-content-ai プロジェクトは、Falconsai を Docker FastAPI サービスとしてラップし、1回のコマンドでデプロイできます。トレードオフは対象範囲(これらは裸体や単純な二値判定に焦点を当てています)と運用です。つまり、稼働時間、GPU、アップデートは自分で管理する必要があります。

リレーを介したマルチモーダル LLM ビジョン

Visionモデル(GPT、Claude、GLM、doubao)は、プレーンなプロンプトから画像を分類できます。これは柔軟な選択肢です。プロンプトを編集するだけでポリシーを変更でき、各判定について書面による理由を得られ、その場でカスタムカテゴリを考案できます。トークンごとに料金がかかり、数秒待つことになります。専用ツールと比較してベンチマークされることがほとんどない選択肢なので、そこで私はテストに重点を置きました。

料金と各プランの最適な用途

2026年7月時点で、各ベンダーの自社の料金ページと照合済み:

プロバイダー価格無料枠最適な用途
OpenAI Moderation無料呼び出しごとの料金なしコストゼロのベースライン、またはすでにOpenAIを利用しているチーム
AWS Rekognition$1 / 1,000 images1,000/mo (trial)大規模利用で最安; AWSスタック; 画像 + 動画
Google Cloud Vision$1.50 / 1,000 ($0.60 at volume)1,000/moGCPスタック
Sightengine$29/mo = 10k ops, then $0.002/opTrial最小レイテンシ; 動画とライブ配信
Hive Moderation~$1–5 / 1,000最も広いカテゴリセット (50+ classes)
Azure AI Content Safety~$1.50 / 1,0005,000/mo深刻度スコアリング; Azureスタック
NudeNet / Falconsai無料 (self-host)プライバシー; 呼び出しごとのコストなし
LLM vision (via relay)~$0.0003–0.03 / imageコンテキストに応じたレビュー層

誤検知をテストしました: 専用検出器 vs LLM vision

ベンダーは精度の数値を公表します。JigsawStack は98%以上を謳っており、「95%+」というのもよくある表現です。しかし、生の精度だけでは、サポートチケットの原因になる失敗、つまり安全なコンテンツに対する誤検知は見えません。そこで私は、すべて職場で問題ない3枚の画像からなるテストセットを作成し、同じ画像を専用のオープンソース検出器(NudeNet)と3つのマルチモーダル視覚モデルに通しました。比較用のオフィス写真、控えめなワンピース水着を着た女性、そして古典的な裸体の大理石像です。2つの「トラップ」は、率直なヌード検出器が過剰にフラグを付けがちな、まさにその画像でした。

First-hand NSFW moderation test set: office control, modest swimwear, and a classical nude statue

LLMモデルには、1つのプロンプトを使用しました: *"You are an image content-moderation classifier. Return strict JSON: verdict (safe/flag/block), nsfw_score 0–1, categories {nudity, suggestive, violence}, reason. Use block only for explicit sexual content; flag means needs human review."* NudeNet は身体部位ごとのボックスと信頼度スコアを返すので、最も高い露出部位のスコアをヌードスコアとして採用しました。結果は次のとおりです:

モデルオフィス(対照)水着古典彫像
NudeNet (dedicated, self-host)safe · 0.00 · 26mssafe · 0.00 · 18msflag · 0.70 · 26ms
claude-opus-4-6safe · 0.01safe · 0.12safe · 0.08
glm-5no image access*safe · 0.15flag · 0.75
doubao-seed-2.0-prosafe · 0.00safe · 0.15safe · 0.10

<sub>*オフィス写真については、glm-5 は「safe」を返しましたが、その理由では画像を読み取れないことを認めていたため、そのセルは有効な結果ではなく、失敗した呼び出しとして扱います。本番環境では、そのサイレントな fail-open が危険なケースです。</sub>

NSFW score by model for three safe images: NudeNet and glm-5 over-flag the statue, claude and doubao pass it

分かれ目は「専用か LLM か」ではありません。コンテキスト理解です。こちらが、その像に対してそれぞれが返した内容、つまり彼らを分けた画像です:

NudeNet:  BELLY_EXPOSED 0.70, FEMALE_GENITALIA_COVERED 0.41, ARMPITS_EXPOSED 0.36  -> フラグ
glm-5:    {"verdict":"flag","nsfw_score":0.75,"categories":{"nudity":1},"reason":"芸術的なヌード表現には人間による確認が必要です。"}
claude:   {"verdict":"safe","nsfw_score":0.08,"categories":{"nudity":0.3},"reason":"美術館にある古典的なヴィーナス像です。ファインアートであり、性的ではありません。"}

NudeNet は高速(18–26ms)で、self-host も無料ですが、意味ではなく身体部位を検出するため、彫像に対して 0.70 でフラグを立てました。glm-5 も同様に 0.75 でした。claude-opus-4-6 はそれでも nudity: 0.3 を設定しました — ヌードを認識していたのです — が、文脈に基づいて判断を覆しました。これはピクセルレベルの検出器にはない能力です。注意すべき失敗は glm-5 のものです。画像を読めないと認めながら、オフィスの写真に対して "safe" を返しました。これは静かに fail-open しており、本番環境では決して見逃せません。

率直な注意点を3つ。LLMのレイテンシは画像1枚あたり4~14秒で、NudeNetの約20msと比べるとかなり遅かった。各画像はおおよそ730~1,900の入力トークンを消費し、最先端モデルではRekognitionに支払う約$0.001の10~30倍ほどに相当するため、ホットパスから外すべきだ。さらに、LLMの出力は標準化されていない。散文をスコアに変換して解析する必要があり、モデルによって品質の振れ幅も大きい。これは3枚の画像を使った小規模な非公式テストであり、ベンチマークではない。だが、文脈理解とコスト、速度、一貫性の間にある本当のトレードオフを示すには十分だ。

専用API、それともLLMビジョンか? ビルドかバイかの判断

専用ツールが勝るとき

大量処理、画像1枚あたりの厳しい予算、1秒未満のレイテンシ、動画、またはコンプライアンス認証(SOC 2、署名済みのGDPR DPA)。数百万件のアップロードをモデレートする場合、100msで1,000件あたり$1はコストと速度の面で非常に優れており、LLMのビジョンはその領域では同じ土俵ではありません。

LLM のビジョンがそのコストに見合うとき

誤判が大きな問題となるコンテキスト依存のカテゴリ(アート、教育、医療、授乳)に加え、異議申し立ての際に人間が読める理由が必要な場合、新しい独自のカテゴリが必要な場合、または他の特徴のためにすでに vision model を実行している場合に適しています。これは大量処理のフィルターではなく、賢くて高コストなレビュアーです。

ほとんどのチームが使うべき階層型の設定

すべてのアップロードに対して、低コストの検出器(または NudeNet のようなセルフホストモデル)を実行します。あくまで説明用の出発点として、信頼する前に較正してください。約 0.85 を超えたら自動ブロック、約 0.3 を下回ったら通過、そして中間帯は、人間が見る前に文脈を推論する LLM-vision 呼び出しに振り分けます。その後、あなた自身のトラフィックのラベル付きサンプルに対して、これらのしきい値を調整します。また、分類失敗は安全ではなく危険として扱ってください。レスポンスが画像を読んだことを確認しない、または有効な JSON として解析できない場合は、通過させるのではなく再試行するか人手レビューに送ってください。ちょうど上の glm-5 の fail-open と同じです。アップロードの大半では dedicated-API の料金を支払い、実際に紛争を引き起こすあいまいなケース、つまり低コストの検出器が美術館の像を過剰にフラグしたような、アートとヌードの境界事例のためにだけ LLM コストを確保します。

そのLLMレイヤーは、1つ以上のvisionモデルへのアクセスを必要とします。AIReiterのようなrelayは、単一のOpenAI-compatible endpointを通じてGPT、Claude、GLMのvisionに到達するため、review層は個別のSDKやアカウントなしにモデルを切り替えられます。これが、上記の4-wayテストを実行した方法です。

自分で決して構築してはいけないものは1つあります:CSAM

一点だけ厳しく。上記のどれも児童性的虐待素材には適用されません。独自のCSAM検出器を学習・実行・「テスト」しないでください。また、疑わしいCSAMを、あたかも通常の成人向けコンテンツであるかのように一般的なNSFW検出APIへ振り分けないでください。確立された手順は、既知のデータベース(MicrosoftのPhotoDNAおよびNCMECとIWFのハッシュリスト)とのハッシュ照合と、NCMECへの通報です。正確な通報義務は管轄区域や提供者としての役割によって異なるため、これは法務・法執行の საკითხとして、調整する分類器ではなく、専用のシステムを持つべきものとして扱ってください。

よくある質問

無料のNSFW検出APIはありますか?

はい。OpenAIのModeration endpoint(omni-moderation-latest)は無料で、画像も受け付けます。AWS Rekognition と Google Cloud Vision には、それぞれ月あたり約1,000枚の無料画像枠が含まれています。無制限で無料利用するなら、NudeNet のようなオープンソースモデルを自前でホストできます。私のテストでは、画像1枚あたり約20msで動作しました。

画像と動画に最適なNSFW検出APIはどれですか?

動画については、Sightengine と Hive はどちらもフレームをサンプリングしており、それを前提に構築されています。また、AWS Rekognition も動画モデレーションを提供しています。予算を抑えた画像用途では、1,000 件あたり $1 の AWS Rekognition が一般的なデフォルトです。コスト、カテゴリの深さ、または誤検知率のどれを重視するかで選んでください。唯一の勝者はありません。

有料 API なしで Python で NSFW 検出を実行できますか?

はい。NudeNet と Falconsai/nsfw_image_detection モデルはどちらも Python 上でローカルに実行できます(pip install nudenet)。また、オープンソースの safe-content-ai プロジェクトは後者を Docker FastAPI サービスとしてパッケージ化しています。1回ごとの利用料金の代わりに、モデルのホスティングと保守を自分で行うことになります。

NSFW検出APIの精度はどのくらいですか?

ベンダーは、明示的コンテンツに対して自社のベンチマークで95〜98%を謳っています。実際に問題となるのは、境界的に安全なコンテンツ(アート、水着、医療画像)に対する誤検知率であり、上のテストが示したように、高速な専用検出器とより弱いモデルの両方が美術館の彫像を過剰にフラグ付けした一方で、文脈を理解するLLM visionはそれを通過させました。

コンテンツモデレーションに GPT-4o や Claude Vision を使用できますか?

はい。文脈依存のケースでは、誤検知をよりうまく避けられます。私のテストでは、Claude visionはヌードの彫像を美術品として通しましたが、ピクセルレベルの検出器はそれをフラグしました。代償は速度(ミリ秒ではなく秒単位)と価格(画像1枚あたり専用APIの約10〜30倍)なので、最前線の大量フィルターではなく、レビュー層として使うのがよいです。

関連資料