顔にエフェクトをかけてプライバシーを守るWebサービスの作り方
2007年03月09日 プログラミングTIPS
最近、OpenCVを使った顔認識が流行っているようです。
顔認識ができるということは、アレができるわけです。
「顔にモザイク!」
Web上で写真を公開するときは、プライバシーを守る必要があるため、顔は隠しておいた方が良い場合があります。
そんな時に、「顔にエフェクトをかけるWebサービス」があれば便利です。
例えば、こんな風に…
(spiritlooseのはてなダイアリーさんの写真を使わせてもらいました)
というわけで、今回は「顔にエフェクトをかけてプライバシーを守るWebサービスの作り方」をまとめてみます。
顔認識ができるということは、アレができるわけです。
「顔にモザイク!」
Web上で写真を公開するときは、プライバシーを守る必要があるため、顔は隠しておいた方が良い場合があります。
そんな時に、「顔にエフェクトをかけるWebサービス」があれば便利です。
例えば、こんな風に…
(spiritlooseのはてなダイアリーさんの写真を使わせてもらいました)
というわけで、今回は「顔にエフェクトをかけてプライバシーを守るWebサービスの作り方」をまとめてみます。
- 1.OpenCVインストール
- 2.Image::ObjectDetectインストール
- 3.OpenCV、Image::ObjectDetectのインストールにつまいたとき
- 4.Imagerを使いこなす
- 5.顔を塗りつぶすサンプルプログラム
- 6.顔に特定の画像を貼り付けるサンプルプログラム
- 7.最後に
- 2.Image::ObjectDetectインストール
1.OpenCVインストール
顔認識をするには、Intelのオープンソース画像処理用ライブラリ「OpenCV」を使うと簡単です。まずはサーバーにOpenCVをインストールします。
OpenCVに行き、最新バージョンをダウンロードします。
サーバーで解凍した後、解凍したディレクトリに移動し、インストールします。
./configureこの後、少しだけ設定をしておかないと、次のライブラリがインストールできなくなってしまいます。
make
make install
/etc/profileに以下の設定を追加します。
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:/usr/lib/pkgconfig/etc/ld.so.conf に以下の設定を追加します。
/usr/local/lib忘れずにコマンドを打っておきます。
ldconfig
参考リンク
2.Image::ObjectDetectインストール
次に、Webサーバーで動くプログラム言語からOpenCVを扱えるようにします。「spiritlooseのはてなダイアリー - OpenCVを使って画像の物体認識をするPerlモジュール作った」で公開されているImage::ObjectDetectを利用すると、Perlで簡単にOpenCVが扱えるようになります。
Ruby版は、dara日記 - OpenCVで物体認識を行うRuby拡張ライブラリのソースにあります。
Image::ObjectDetectをPerlのCPANでインストールするには、
perl -MCPAN -e shellとすればOKのはずですが、Imagerなどのライブラリも必要になるため、必要に応じてImagerなどもインストールしておきます。
cpan> install Image::ObjectDetect
3.OpenCV、Image::ObjectDetectのインストールにつまいたとき
上記方法でインストールにつまづいて、libcxcore.soエラーなどが出たときは、下記サイトが参考になります。うまくパスが設定できていないと、Image::ObjectDetectがインストールできなくてつまづきます。
4.Imagerを使いこなす
Image::ObjectDetectが無事インストールできたら、次は顔部分へのエフェクト処理に移ります。Imagerには、様々な処理機能があります。
下記サイトを参考にしながら、使うエフェクトを決めます。
5.顔を塗りつぶすサンプルプログラム
例えば、顔全体を黒く塗りつぶしたいのであれば、spiritlooseのはてなダイアリー - OpenCVを使って画像の物体認識をするPerlモジュール作ったを参考に、以下のようなプログラムにします。(サンプルとして、ここでは以下のソースを文字コードEUC-JPとして作成しました。環境に応じて変えてください。)実行結果は、このようになります。#!/usr/bin/perl use strict; use warnings; use Imager; use Image::ObjectDetect; my $file = 'picture.jpg'; my $image = Imager->new->read(file => $file); my $cascade = '/usr/local/share/opencv/haarcascades/haarcascade_frontalface_alt2.xml'; my $detector = Image::ObjectDetect->new($cascade); my @faces = $detector->detect($file); for my $face (@faces) { $image->box( xmin => $face->{x}, ymin => $face->{y}, xmax => $face->{x} + $face->{width}, ymax => $face->{y} + $face->{height}, color => 'black', filled => 1, ); } $image->write(file => 'output.jpg'); print "Content-type: text/html\n\n"; print "<html lang=\"ja\">\n"; print "<head>\n"; print "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=EUC-JP\">\n"; print "<TITLE>顔を黒く塗りつぶしてみるテスト</TITLE>\n"; print "</HEAD>\n"; print "<BODY>\n"; print "<p>変換した画像が下に表示されます。</p>\n"; print "<br>\n"; print "<img src=\"output.jpg\">\n"; print "</BODY>\n"; print "</HTML>\n";
簡単に解説しておくと、
$face->{x} が抽出した顔のX座標になっています。
$face->{y} が抽出した顔のY座標
$face->{width} が抽出した顔の幅
$face->{height} が抽出した顔の長さ
この情報を元にImagerを使って、顔にエフェクトをかけています。
6.顔に特定の画像を貼り付けるサンプルプログラム
また、アキバBlogのように、顔に特定の画像を貼り付けたい場合は、上記ソースの「for my $face (@faces) { ...}」部分を以下のように変えます。実行結果は、このようになります。for my $face (@faces) { my $file2 = 'picture2.jpg'; my $image2 = Imager->new->read(file => $file2); my $image2 = $image2->scale(xpixels => $face->{width}, ypixels => $face->{height}); $image->paste(left => $face->{x}, top => $face->{y}, src => $image2); }
7.最後に
「顔にモザイクをかけるWebサービス」は、上記ソースを改良すれば作れるようになるはずです。画像URLをパラメータとして動作させたり、ファイルをアップロードしてもらいその場で処理しても大丈夫です。
すでにOpenCVを使ったWebサービスというのはいくつも作られていて、
などで、すでに活用されています。
今回は顔の塗りつぶしと画像置換の例を作りましたが、顔にモザイクをかけたり、その他のエフェクトをかけたりというのも、OpenCVとImagerを使えば簡単に実現できます。
Imagerだけでも、「それ、Imager で」のような楽しいサービスが作れていますから、応用すればいろいろ楽しいWebサービスが作れそうです。