Webサービスから投稿された画像をS3に格納することも増えてきていると思います。
格納した画像でそのまま画像分析を実施し、顔分析や不適切な画像かどうかの判定を行ってみましょう。
なお、この記事は先日noteに投稿した「結婚式でLINE Botと画像解析を使った余興をしました」の技術的な補足記事です。
Amazon Rekognition について
Amazon Rekognitionは、画像分析や動画分析をAPIで手軽に利用することができるAWSのサービスです。
物体認識(画像に何が写っているか)、顔の分析、安全でない画像かどうかの分析、動線検出やOCRなどを行うことができます。
仕組み
以下の図は、LINE Botまで含めた構成図になっていますが、この記事は右側の部分だけ紹介します。
S3 -> Lambda
格納後に自動で処理をする部分はAWSの仕組みに任せます。Lambda画像を格納するS3にトリガーを仕込みます。
Lambda で Rekogition を呼び出す
Rekognitionの呼び出しはPythonのサンプルが多いのですが、個人的に書き慣れているnode.jsのサンプルを紹介します。
S3に格納されているオブジェクトの場合、バケットとキーを指定するだけで実行可能です。また Attributes
を指定すると、感情データを含めたデータを取得可能です (SDKのリファレンスはこちら)。
ほぼリファレンスまんまですが、以下のようなコードで呼び出しが可能です(node8.10)。
const params = {
Image: {
S3Object: {
Bucket: bucket,
Name: key
}
},
Attributes: ["ALL"]
};
try {
// Detect face using rekognition
const data = await rekognition.detectFaces(params).promise();
// use data...
}
不適切な画像が含まれているかどうかの検出は、detectModerationLabelsを呼び出すと実行できます。
結果をWebhookにpostする部分まで含めたソースコード
DynamoDBへの保存とかであれば結果をそのまま格納すればよいのですが、上記記事のBotではWebhookに結果を通知する必要があったので、そこも含めた全体のコードを紹介します。
const aws = require('aws-sdk');
const rekognition = new aws.Rekognition();
const https = require('https');
exports.handler = async (event, context) => {
//console.log('Received event:', JSON.stringify(event, null, 2));
// Get the object from the event
const bucket = event.Records[0].s3.bucket.name;
const key = decodeURIComponent(event.Records[0].s3.object.key.replace(/\+/g, ' '));
const paths = key.split('/');
const rekognitionParams = {
Image: {
S3Object: {
Bucket: bucket,
Name: key
}
},
Attributes: ["ALL"]
};
try {
// Detect face using rekognition
const data = await rekognition.detectFaces(rekognitionParams).promise();
var json = JSON.stringify(data);
// Send result to webhook
var result = await new Promise((resolve, reject) => {
var options = {
hostname: 'example.com',
path: '/webhook/',
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
'Content-Length': Buffer.byteLength(json)
}
};
var req = https.request(options, function(res) {
res.setEncoding('utf8');
res.on('data', function (body) {
console.log(body);
resolve('Success');
});
}).on('error', function(e) {
reject(e);
});
req.write(json);
req.end();
});
console.log(result);
} catch (err) {
console.log(err);
const message = `Error detecting face ${key} from bucket ${bucket}.`;
throw new Error(message);
}
};
Amazon Rekognition は特にS3に格納した画像に対して呼び出すのが非常に簡単です。最近のアップデートで精度がさらに上がっているようですので、画像を使ったサービスを提供している方はぜひ利用してみてはいかがでしょうか。
この記事は ニフティグループ AdventCalendar の1日目の記事でした。
2日目は @motaHack さんです。お楽しみに!