AWSのML系のサービスにAmazon Rekognitionというのがあり、画像の認識に使えるAPIが用意されています。
ユーザーからアップロードされた画像をサイト上に表示する場合などに、まあ何というかいろいろとアウトな感じの画像をアップロードされるとよろしくないですね。そこでこのRekognitionを使うと、inappropriateな要素にタグ付けをしてくれます。
実装例
Node/TypeScriptでの実装例です。画像をBufferで受け取って、アウトっぽい画像ならfalse
を返します。以下のドキュメントの内容を基にしています。
import * as AWS from 'aws-sdk';
AWS.config.update({
region: 'ap-northeast-1'
});
export class RekognitionModerator {
public async moderate(image: Buffer): Promise<boolean> {
const rekognition = new AWS.Rekognition({apiVersion: '2016-06-27'});
const params: AWS.Rekognition.DetectModerationLabelsRequest = {
Image: {
Bytes: image,
},
MinConfidence: 99.5
};
const res: AWS.Rekognition.DetectModerationLabelsResponse = await rekognition.detectModerationLabels(params).promise();
if (res.ModerationLabels && res.ModerationLabels.length > 0) {
return false;
}
return true;
}
}
ユーザーがアップロードしてきた画像をこのクラスでチェックすれば、いかがわしい画像をブロックできます。登録はさせないけどサーバーのどこかに保存しておく、みたいな邪悪なことをやるのはやめましょう。
いくらなんでもここにテスト用画像貼ると怒られるので貼りませんが、画像いくつか集めてきて試してみると
健全なしずかす絵
{ ModerationLabels: [], ModerationModelVersion: '4.0' }
不健全なしずかす絵
{
ModerationLabels: [
{
Confidence: 99.9688949584961,
Name: 'Explicit Nudity',
ParentName: ''
},
{
Confidence: 99.9688949584961,
Name: 'Illustrated Explicit Nudity',
ParentName: 'Explicit Nudity'
}
],
ModerationModelVersion: '4.0'
}
7ct Kindle版11ページ
{ ModerationLabels: [], ModerationModelVersion: '4.0' }
Rekognitionからはこんな感じのレスポンスが返ってきます。Confidence
は結果の信頼度、どのくらいの精度でアウトなのかを示す数値です。高いほど結果が信頼できるということになります。
サンプルコードではMinConfidence: 99.5
という指定をしていました。この場合RekognitionはConfidence
が99.5以上の結果しか返さない、という動きになります。ちなみにデフォルト値は50なので相当緩く設定しています。
いろいろ試してみた感じ、特に二次元にはわりと厳しいようで、別にR指定が付くような画像でなくても露出度高めの衣装とかだと98とか99とかそんな値が返ってくることが時々あります。二次元の画像を主に扱う場合は99.5あたりを機械検出の閾値にして、後は人間がモデレーションする(適宜巡回する、通報を受け付ける)のが現実的なところかな、というのが個人的な感覚です。