S3 + Lambda + OpenCVで顔検出&モザイク

こんにちは!
開発部の武内です。
エコモットアドベントカレンダーの10日目を担当します。

弊社では ミルモットジオスコープ をはじめとした、
画像・動画を扱うソリューションを展開しています。

今年、経済産業省・総務省・IoT推進コンソーシアムにより
カメラ画像利活用ガイドブックver1.0 が策定され、
それに追従するように札幌市などの自治体でも
防犯カメラに関するガイドライン が策定されるなど、
カメラで撮影された個人情報に対する意識・気運が高まっています。

そういった流れに対して、
エンジニアとしてはやはり技術で解決したい!ということで、
今回はAWSを利用して、画像内の個人情報の一つであるを検出しモザイクをかける仕組みを作ってみました。

構成

Serverlessかつシンプルな構成にしました。

moza_diaglam

  • Amazon S3 (モザイク処理前/処理後の画像を保存する)
  • AWS Lambda + Python 2.7 + OpenCV 3.2 (モザイク処理を行う)

実装

OpenCVのビルド

まずはOpenCVをPythonで使用するためにソースコードからビルドを行います。
これにはCMakeや関連ライブラリを揃える必要があり少し面倒なところなのですが、
Python OpenCV module for AWS Lambda というビルドスクリプトを見つけたのでこちらを使用します。

ビルド環境としてEC2インスタンスを作成します。
今回は以下を作成しました。

  • Amazon Linux (ami-da9e2cbc)
  • t2.nano

作成したインスタンスにSSHしビルドを行います。

t2.nanoだと30分ほどでビルドが完了しました。

モザイク処理コード

ビルドが完了するとlambda-packageディレクトリが作成されているので、
その中にモザイク処理コードを配置してLambda用にデプロイパッケージ化(zip)します。

また、顔検出には カスケード型分類器 を使用するので、
正面顔検出用の学習データをダウンロードします。

モザイク処理コードは以下のように実装しました。

デプロイパッケージ化します。

画像保存用S3バケットの作成

face-mozaicというバケットを作成し、
配下にinput-dataとoutput-dataというフォルダを作成しました。

moza_s3_bucket

input-dataに画像をアップロードするとoutput-dataにモザイク処理された画像が作成されるようにします。

モザイク処理Lambda関数の作成

face-mozaicという関数を作成します。

ランタイムはPython 2.7を選択し、
ロールはS3へのアクセス権限があるものを設定します。

moza_lambda_01

関数が作成されたらトリガーとしてS3を追加します。

moza_lambda_02

トリガー設定で対象のバケットとしてface-mozaicを、プレフィックスとしてinput-dataを設定します。
一応サフィックスにjpgを指定し、jpgファイルにしかトリガーが反応しないようにしました。

moza_lambda_03

先ほど作成したデプロイパッケージをアップロードします。

moza_lambda_04

動作確認

では動かしてみます。

テストデータとして Pexels の写真を使用しました。
(Creative Commons Zero (CC0) license)

input-dataに画像をアップロードします。

moza_s3_input

少し待つとモザイク処理された画像がoutput-dataに作成されます。

moza_s3_output

結果を見てみましょう。

man_before

↓↓↓

man_after

顔にモザイクがかかりました!

複数人の場合でも同様にモザイクがかかります。

group_before

↓↓↓

group_after

横顔や動物の場合

正面顔検出用の学習データを使っていますので、
このままでは人間の横顔や動物の顔は検出できません。

それらにも学習データが公開されているので試してみましょう。

横顔には haarcascade_profileface.xml を使用します。

profile_before

↓↓↓

profile_after

横顔が検出できました。

猫の正面顔用の学習データも試してみました。
haarcascade_frontalcatface.xml を使用します。

cat_before

↓↓↓

cat_after

こちらはあまり精度が高くなかったので、
パラメータ調整などが必要かもしれませんね。

おわりに

いかがでしたでしょうか?

個人情報の切り分けや破棄は、人力では骨の折れる作業です。
画像認識も進歩していますので、どんどんシステム化していきたいですね。

皆さまの快適な開発生活の一助になれば幸いです。

Pocket