Persistence

技術メモなど

DollFaceDetectorというサービスを作りました。

概要

このサービスは、顔認識&機械学習を使ってドール画像からそのドールの顔の型番を判定するサービスです。学習すればするほど精度が上がる(想定)なので、興味がある方はぜひ使ってみてください。

f:id:bisque3311:20150609011143j:plain

http://doll-face-detector.herokuapp.com/

開発背景

アイディア自体はかなり前からあったものですが、当時はまだ使えるAPIがなく、専門知識もないので自前で作るなんて途方も無いので、アイディア自体を寝かせておきました。最近になってまたAPIを捜してみたらかなりたくさんあって、これならできそうということで開発をはじめました。

あと、技術的に色々と使ってみたいものがあってその練習課題という意味もありました。構成としてはMEANスタック+Heroku(ホスティングのみ)+AWS(S3, dynamodb, lambda)あたりを使っています。次回以降の記事で、色々と得た知識を書いていこうと思います。

顔認識APIについて調べました

Doll Face Detectorを開発するにあたり、顔認識&機械学習APIについて調べたことを書いていきます。

APIの選定条件

まず最低限必要な機能として、「静止画から顔を検出する」「登録した顔のデータから近いものを検索する」の2点が必要です。さらに、個人的なサービスなのでお金は掛けたくないので、 無料枠がどれだけあるかも重要なポイントです。あとは、「顔認識の精度」「機能の充実度」なども評価のポイントに成ります。

候補となったAPI

いくつか試したAPIを紹介します。

日本国内のサービス: PUX

pds.polestars.jp

まず日本国内のサービスで探すと、これくらしか見つかりませんでした。無料枠は月5000リクエスト、登録顔数10なので、本当に評価版として使える範囲の数になっています。提供されているAPIの機能自体も最低限という感じです。

項目 評価
無料枠の多さ
機能の充実度
顔認識の精度 ?(詳しく検証していない)

Microsoft機械学習サービス: Project Oxford

Microsoft Project Oxford Home

最近ベータ版が開始されたサービスで、一時話題になったHow Old do I Look?もこのプロジェクトの内の1つであるFaceAPIsのデモサイトです。現在ベータ版なので無料版しかないのですが、無料版は15アクセス/分という制限があります。まあそこまでアクセスはいかないだろうと思って、これを使うつもりで開発を始めたのですが、いざ作り始めると1回の処理で数回リクエストする必要があり、リクエストを減らすために自前のデータベースでAPI側のデータをキャッシュしたりしてるうちに、今度はAPIそのものが不安定になってきて(デモサイトでも同じ症状が出てました)、ベータ版の時点では実用に耐えないなということでやめました。

一応、APIアクセスについてはモジュール化して作っていたので、npmに公開しています。

www.npmjs.com

項目 評価
無料枠の多さ
機能の充実度
顔認識の精度

全部無料のサービス: Face++

www.faceplusplus.com

中国のサービスで全部無料・制限なし(相当なアクセス数になってくると要相談とありますが)って、ちょっと信頼できるのか心配だったんですが、背に腹は変えられぬってことでこれを使いました。

登録すると最初はDeveloperモードとなり顔登録数が100までという制限がありましたが、サービスURLを公開した後でProductionモードにアップグレードするリクエストを送ると、2〜3日でなんの通知もなくProductionモードに変更されていました。

また機能的にもかなり充実していて、データはすべてFace++側で管理することができます。データそのものはAPIで取得できるので、定期的に全件取得しておけば万が一サービスがなくなっても他のサービスに移行することはできるかなと思っています。

モジュールも準備できしだいアップ予定。

項目 評価
無料枠の多さ
機能の充実度
顔認識の精度

その他

他にもたくさんの同種のサービスがありました。APIを探すのにとても役に立つのがMashapeというサイトです。

www.mashape.com

ここに顔認識系の有名どころのサービスがまとめられています。

Popular Face Detection/Recognition APIs from Mashape

これらひと通りデモを試してみましたが、認識できる精度についてはほぼすべて同じでした。唯一ちょっと違ったのがMicrosoftのサービスです。ただ、どちらが優れているというわけではなく、どちらも認識できる画像/できない画像がありました。ちなみにこれはドール画像の話で、人間の顔認識に関してはどちらもかなりの精度で認識されます。

ブラウザから直接S3にファイルをアップロードする方法

ブラウザからS3にファイルをアップロードする場合、S3のアクセスキーやシークレットキーを隠ぺいするためにブラウザ→サーバ→S3というようにサーバを経由してアップロードする事を考えますが、サーバを経由せずに直接S3にアップロードする方法がありました。

元の情報はこのページです。

devcenter.heroku.com

概要

何が行われているかというと、

  • ブラウザがサーバに対してS3のシグネチャ付きのURLを要求します。
  • サーバはS3に対してSDKシグネチャ付きのURLを要求します。
  • サーバはブラウザにS3から返されたシグネチャ付きのURLを返します。
  • ブラウザはアップロードしたいファイルを受け取ったURLにPUTします。

シグネチャ付きのURLにはアクセスキーが含まれますがシークレットキーは含まれないので、一応安全ではあります(ただあまり見せたくはないですが)。またこの方法をを取ることで、通信は2往復になりますがブラウザからサーバへファイルを送る必要がないので通信量・通信時間は少なくなります。

注意点

1つは情報元のページにもありますが、S3の『CORSの設定』で送信元Origin(ドメイン)からのPUTを許可しておくということです。この設定がない場合、403エラーで"No 'Access-Control-Allow-Origin' header is present on the requested resource."が返されます。

もう1つは、情報元のページに無いのですが、aws-sdkのconfig設定にregionとsignatureVersionの設定が必要でした。この設定がない場合は、403エラーで"SignatureDoesNotMatch"が返されます。一応PRを送ってGitHubのソースにはmergeされています。(と書いた後にもう一度再現させてみようと思ってsignatureVersionの設定を削除してリクエストしたらエラーにならずにできました。謎です。)

問題点

1つはやはり上にも書きましたが、アクセスキーが見えてしまうということです。アクセスキーとシークレットキーがセットでないと何もできないですが、重要なシステムではオススメできません。

もう一つは、ファイルに何か加工(例えば画像をリサイズするなど)したい場合、S3にアップロードした後で行うことになります。システムによってはアップロード後に非同期で加工でも問題ないかもしれませんが、DollFaceDetectorの場合はアップロード後すぐにAPIにファイルのURLを渡すので、先にリサイズなどの加工をする必要がありました。