かつて JavaScript ユーザーがアップロードした不適切な画像を検出する という記事を書いたのですが、ここでは NSFW JS というJavaScriptライブラリを使ってエロ画像かどうかを判断しています。しかし不適切な画像はエロ画像だけではありません。

不適切な画像は性的な画像だけではない

性的なもの以外にも暴力/残酷な描写、自傷教唆やヘイトなどの違法性があるものも不適切な画像です。これらをアップロードされた画像のなかにこのようなものがないか簡易チェックできるものを今回は作ります。

使用するのは OpenAI です。ここからAPIキーを取得します。あとAPIを利用するときは料金がかかります。デフォルトの額は10$ですが、任意の額に変更できます。使用するモデルは omni-moderation というモデルで料金はかからないようですが、最初に入金しておかないとエラーが出て使うことができません。とりあえず最小の5ドルだけ入れておきました。

Billing overview OpenAI API

Create new secret keyからAPIキーを作成します。

urlをポストしたら判定結果を返す

この部分はPHPで作りたいのですが、PHPでOpenAI APIを操作するためのライブラリを取得できるように composer をインストールします。composer はここからダウンロード できます。

composer をインストールしたらコマンドプロンプトまたはターミナルに以下を入力し、openai-php/client と guzzlehttp/guzzle をインストールします。

そのあと以下のようなコードを書きます。JSONでPOSTされたurl(画像ファイルのdataurlでも可)を取り出してその画像を判定し、その結果をJSONで返そうとしています。もし画像のurl以外のものが投げられた場合は’error’の文字列を返します。

api.php

これで以下のようなJSONが返されます。

判定対象の選択と結果を表示するページをつくる

次に判定対象の選択と結果を表示するページをつくります。

index.htmlには判定対象になる画像のurlを入力するinputとファイルを選択するinputを配置します。[チェック]ボタンを押下すると先述のapi.phpにurlがPOSTされます。

index.html

style.css

グローバル変数を示します。

index.js

ページが読み込まれたときの処理を示します。ファイルが選択されたらdataurlを取得してその画像を表示し、[チェック]ボタンが押下されたら結果を取得して画像と判定結果を表示させます。

選択されているファイルのdataurlを取得する処理を示します。

選択状態を解除する処理を示します。

api.phpにurlをPOSTして結果をうけとる処理を示します。

受け取った結果をページに表示する処理を示します。

各要素が英語だとわかりにくいので日本語に置き換えています。各要素の該当度が0~1.0の値で返されるのでパーセンテージに変換して四捨五入した値も同時に表示させています。該当しない要素(25%以下)は目立たない灰色、怪しい(50%以下)はオレンジ色、不可(50%超)は赤で表示させています。

また返されたJSON全体も表示させています。