VOYAGE GROUP エンジニアブログ

voyagegroup_techのブログ
VOYAGE GROUPエンジニアブログです。

PHP

Apple信者ならFlash使わずPHP拡張face_detectで顔認証するよね !

こんにちは、VOYAGE GROUPのエンジニア、ガイアです。今は、ECナビのスマホサイトの開発運用をしています。

僕はECナビのスマホサイトを8ヶ月利用して5万ポイント貯めました。

貯めたポイントをWebマネーに変えて、音楽でも買おうと思います。まあ、ステマはこのぐらいにして本題に入ります。(5万ポイントは本当です、信じてください)

現在、Webで配信されるコンテンツはテキストに始まり、画像、音声、映像ときて、今はインタラクションのあるコンテンツもごく当たり前に配信されてます。javascript、HTML5、Unityなど色々と技術はありますが、やはりWebとの親和性や、普及度などなど・・・結局、色々物議を醸し出していますが、Flashで作られたコンテンツが多いのが現状です。ただ、Apple信者としてはiPhoneやiPadに対応したコンテンツにしたいところ、Flashを使ったコンテンツは少しばかり抵抗があります。Apple曰く「アプリでやればいいじゃない」というツンデレっぷりです。

そんな事を考えている時、Webで顔認識をやりたいという願いが降り落ちて来ました。最善はFlashだろうと思ったのですが、このご時世iPhoneは外せない。という訳で他の方法を模索するに至りました。顔認識についてはOpenCVというオープンソースのコンピュータビジョン用のライブラリを利用するのが一番楽だと信じているので、それをWebのインターフェイスから利用しようと妄想を走らせ、Google先生にお伺いを立ててみると、PHPからOpenCVを使う方法があるみたいです。Sounds great!
PHPのExtensionにface_detectという拡張機能があり、それを使います。

さあ、前置きはこのぐらいにして実際の作業に入りましょう。
詳しくはXarg.orgに情報があります。

環境設定 
Scientific Liunux 5を利用しています。OSはなんでもいいでしょう。

インストールするもの
  • httpd
  • php5.3
  • php-devel
  • php-gd
  • OpenCV2.3
  • php face_detect extension 

php-gdあたりまでは楽に揃えられると思います。パッケージ管理ツールで揃えてしまいましょう。php-gdをインストールしたら、phpinfo のページを作って GD が有効になっていることを確認します。

gd


画像表示
次に、PHPで画像を表示させてみましょう。phpanualからPHPの画像表示のコードを拝借します。
imagecreatefromjpeg :新しい画像をファイルあるいは URL から作成する


lena

OpenCVのインストール
画像は表示されましたか?では、次にOpenCVをインストールします。OpenCVは2.3が推奨です。
OpenCVはリポジトリに無いことが多いので、ここを参考にさせて頂きました。
mk-mode BLOG * Scientific Linux - OpenCV をソースからインストール
ソースからOpenCVをインストールするときにcmakeを利用するのですが、リポジトリからcmakeをインストールすると2.6系が入り、このページの通りに進めていくとエラーが出てしまいます。ソースパッケージからcmakeの2.8系をインストールすれば解決します。その他、gc++が必要だったりしますが、エラーが出たら、適宜インストールして下さい。


facedetect extension
OpenCVをインストールしたら、facedetect extensionをインストールします。
Xarg.orgにインストール方法が書いてあります。


 Install OpenCV (OpenCV 2.3.1)
 Download facedetect source package
 Unpack facedetect source package
 Go to facedetect folder and type "phpize && ./configure && make && make install"
 Make sure you have extension=facedetect.so in your php.ini


コマンドだとこんな感じです。簡単ですね。(権限で怒られたら、適宜権限を追加するなり、コマンドを一つづつ実行するなりして下さい。)
  • git clone https://github.com/infusion/PHP-Facedetect.git
  • cd PHP-Facedetect
  • phpize && ./configure && make && make install
インストールが終わったらphp.iniに extension=facedetect.so を追記して、facedetectを有効化します。その後 phpinfo のページでfacedetectが有効化されていることを確認します。これで準備は万端です。
facedetect

因みに、facedetect extensionをインストールすると2つの関数が使えるようになります。
  • face_count('party.jpeg', 'cascade.xml') 顔の数を返す
  • face_detect('party.jpeg', 'cascade.xml') 顔の場所の配列を返す
第一引数は、画像ファイル、第2引数はOpenCVでオブジェクト検出に利用される分類器です。この分類器に関してはOpenCVに学習済みのサンプルがあります。OpenCVインストール時に解凍したディレクトリ OpenCV-2.3.0/data/haarcascades/ 以下にあるxmlがそのデータです。

ついに顔認識!!
さあ、環境設定も終わり、あとはコードを書くだけです、先ほどの画像表示のコードを変更します。
lena_face

よく見る出力結果になりましたね。PHPで顔認識をすることができました。みなさんも、PHPで顔認識を楽しんで下さい。

face_detect_murata


・・・

「いやいやいや、ちょっとまって、なんだよ、PHPで顔認識って、その処理、全部サーバでやる気かよ、そこはFlashだろjk」
っておみさんに言われそうな仕様です。
 
今回VirtualBoxを使っていたのですが、実行速度も・・・
これでは、ユーザの同時アクセスに耐えれそうにありません・・・
PHPで顔認識ってニーズあるんですかね。実現可能性が低いんでは・・・
そもそもOpenCVの顔認識って色々オプションあったよね、そんなのも設定できないんじゃ・・・


「まだだ、まだ終わらんよ」

こうなったら更にニッチなところへと足を踏み入れていく次第です。

次回
「サンプルコードでDeveloper!? OpenCVで学ぶ!自作 PHP Extension」




第2回 CakePHP2.0 勉強会@Tokyo で会場を提供させていただきました

こんにちは!株式会社adingoのエンジニアで前田(@brtriver)といいます。


写真(2)

2011年10月06日に、第2回 CakePHP2.0 勉強会@Tokyo が開催され、VOYAGE GROUPで勉強会/懇親会会場を提供させていただきました。
また、当日は VOYAGE BB ポイントが溜まるWiMAXこと VOYAGE WiMAX を用意し回線を提供しつつ、Ustreamで勉強会の様子を配信しましたが、最終的に100人以上の視聴者になりました。

キャンセル待ちが出るほど盛況なことからも分かるように、CakePHPは代表的なPHPフレームワークの1つで国内でも多くの利用実績がある点や、もうすぐ正式版がリリースされるCakePHP2の勉強会ということもあり、今回の勉強会もかなり注目度は高かったと思います。

スタッフの皆様、ご参加いただいた皆様ありがとうございました!

全てではありませんが、資料をアップされていた方のリンク先は以下にまとめました(漏れがありましたらご指摘ください)

懇親会の様子はUstreamで配信していませんでしたが、懇親会はAjitoにて開催し、懇親会LTも大盛り上がりでした。

写真(3)


懇親会で個人的に印象的な内容だったのはCandyCaneでした。
CandyCaneはPHP版Redmineであり、CakePHPで開発されています。
最近になり、CakePHPのコアデベロッパーが開発に参加するなど世界的にブレークの兆しがあります。
特徴は、とにかく導入の敷居がRedmineと比べても低い!インストールを動画で紹介していましたがなんと2分掛かっていません。
おそらくCakePHPのキラーアプリになるのではないでしょうか?


最後に、VOYAGE GROUPでは、このように勉強会の会場を無償で提供させていただいています。
もし勉強会を企画していて会場探しにお困りの場合は、私(@brtriver)やVOYAGE GROUPの誰かにご相談いただければと思います。

RATSでPHPの利用すべきでない関数をチェック

こんにちは, 株式会社ECナビ システム本部 ECナビラボグループの春山(@haruyama)と申します.

私は, 主にセキュリティと検索をテーマに仕事をしています. 今回はセキュリティについてです.

先日, 他の言語については十分経験があるがPHPについてはあまり経験のない社員から,

「PHP (5.2) で使ってはいけない関数の一覧ってどこかにありませんか」と聞かれました.

PHPのセキュリティについては, PHP: セキュリティ - ManualPHP と Web アプリケーションのセキュリティについてのメモなどに資料があります.

また, PHP: PHP 5.3.x で推奨されない機能 - Manual に「推奨されない関数」という項目があります.

PHPのsplit() が推奨されないのは, split() がereg() などの POSIX 正規表現関数に属していて,

そして POSIX 正規表現関数 がバイナリセーフでなく速度も低速であるからです.

この知識はPHPの経験の浅い人が知ることは難しいでしょう.

そこでPHPのコードを静的に解析して問題のある関数の利用を抽出しようと考えました.

PHPの静的解析についてはあまり耳にしませんが, いくつかのツールがあります.

私は前職で, PHPLintという静的解析ツールに手を入れて, 問題のある関数への警告を出していました.

しかし, PHPLintは作者の独自のModula-2風の言語で書かれており, 改造しての利用は手軽ではありません.

そこで, RATS - Rough Auditing Tool for Securityを利用することにしました.

RATSは, c, c++, perl, php, python, rubyに対応した静的解析ツールです.

データベースファイル(xml)を自分で定義することで拡張することができます.

RATSはソースとWin32のバイナリが配布されています.

またDebianやUbuntuにはパッケージもあります.

ソースからのインストールは「./configure; make; make install」で可能です.

Win32のバイナリには, The Expat XML Parserのdllファイルをパスの通った場所に置く必要があります.

RATSのデフォルトのデータベースファイルには, PHPのsplit() についてのルールはありません.

データベースファイル(rats-php-split.xml)を次のように作成します (ファイルの文字エンコーディングやシェルのロケールがUTF-8の場合, 問題なく日本語文字が出力されました).

<VulnDB lang="php">
<Vulnerability>
<Name>split</Name>

<Info>
<Severity>High</Severity>
<Description>
split()はバイナリセーフではありません.
また, preg_split()よりも低速です.
preg_split()かexplode()を使用しましょう.
</Description>
</Info>

</Vulnerability>

</VulnDB>

次のsplit() を利用しているファイル(split_test.php)にRATSを適用すると, データベースファイルで指定した警告が出ます.

<?php
list($user, $pass, $uid, $gid, $extra) =
split(":", $passwd_line, 5);

% .../rats --db rats-php-split.xml split_test.php   
Entries in php database: 1
Analyzing split_test.php
split_test.php:3: High: split
split()はバイナリセーフではありません.
また, preg_split()よりも低速です.
preg_split()かexplode()を使用しましょう.

Total lines analyzed: 6
Total time 0.000074 seconds
81081 lines per second

警告を行なう関数の追加は, Vulnerability要素の追加で行なえます. rats-php-deprecated.xmlが私が作成したPHP: PHP 5.3.x で推奨されない機能 - Manualで挙げられている関数に対するデータベースファイルです.

ECナビでも, PHPを新たに始める人のコードや古いコードのチェックに利用していこうと考えています.

以上, RATSでPHPの利用すべきでない関数をチェックでした.

記事検索
QRコード
QRコード