はじめに
第3回目の本稿は、「docomo Developer support」で公開予定となっている、PUX社の技術を用いた顔・オブジェクト認識APIを使って、顔がモザイクになって写るモザイクカメラアプリを作ってみます。「docomo Developer support」では、このAPIのように、NTTドコモ以外が開発したAPIも公開されており、今後もさまざまなAPIが増える予定になっています(本稿は、2015年1月29日時点の最新情報に基づいております)。
対象読者
JavaとEclipseを用いたAndroidアプリの開発で、基本的な知識がある方を対象とします。
顔・オブジェクト認識API
顔・オブジェクト認識とは、写真や動画などの画像から、特定の人物やもの(オブジェクト)を認識する技術です。最初に、どのような機能があるかを紹介しておきます。
提供されるAPIの概要
提供されるAPIは、次の4つです。
(1)顔検出
写真などの画像から、人間の顔を見つけることができます。一度のアクセスで、最大20人までの顔を認識することができます。また、顔の情報として、目や鼻などのパーツの位置や性別、年齢までも判定できます。
(2)顔認証
画像の中から、事前に登録した顔画像と似た顔を見つけられます。結果の情報には「どの程度似ているか」というレベルの数値が含まれています。
(3)オブジェクト認識
任意の画像を登録し、登録したものを別の画像から探し出すことができます。ブレていたり傾いていたり、大きさの違うものでも認識可能です。
(4)手書き文字認識
画面上にペンなどで書いた文字を、独自のパターン認識技術で、文字として特定できます。画像データのような事前に書かれた文字の認識ではなく、リアルタイムに入力される筆跡の認識が可能です。
ブラウザでAPIを試してみよう
これらのAPIは、Web APIとして提供されますので、まずはブラウザを使って、具体的にどのような機能なのかを見ていきましょう。
顔検出(faceDetection)
検出元の画像は、インターネット上のURLを指定するか、画像データをアップロードします。画像データをアップロードする場合は、HTMLフォームを使ってファイル送信するか、または画像データを、バイナリのままかBase64文字列に変換して、POSTメソッドで送信します。ここでは、フリー素材アイドルの画像(フリー素材アイドルの顔画像)を使って検出してみます。
ブラウザで、以下のURLを開いてみましょう。なお、APIKEYのパラメータには、「docomo Developer support」で取得したキーを設定してください。
https://api.apigw.smt.docomo.ne.jp/puxImageRecognition/v1/faceDetection?APIKEY=XXXXX&imageURL=http://takae.sakura.ne.jp/wings/image1.jpg
APIのベースのURLは、https://api.apigw.smt.docomo.ne.jp/puxImageRecognition/v1/で、その後に、機能名(ここではfaceDetection)を付加します。
パラメータは、APIKEY以外では、顔画像のURL(imageURL)を指定するだけで認識可能です。レスポンスは、デフォルトではXML文字列ですが、オプションのresponseパラメータにjsonを指定すれば、JSON文字列になります。
レスポンスデータは、顔検出結果情報(faceRecognition)をルートとして、顔情報(detectionFaceInfo)、顔座標(faceCoordinates)、顔部品座標(facePartsCoordinates)、各判定結果(~Judge)です。
各判定は、デフォルトで、瞬き、年齢、性別、顔の向き、笑顔度の結果が含まれます。オプションでは、動物顔、どや顔、困り顔なども判定可能です。
そのほか、詳細については、サイトの仕様書を参照してください。
顔認証(faceRecognition)
今度は、特定の顔で認証してみましょう。まず、顔の画像を登録します。
顔の登録は、faceRecognitionの後に、modeパラメータとして、registerを指定します。
https://api.apigw.smt.docomo.ne.jp/puxImageRecognition/v1/faceRecognition?APIKEY=XXXXXX&mode=register&imageURL=http://takae.sakura.ne.jp/wings/image1.jpg
登録されると、レスポンスのregistrationFaceInfoタグに、付与された画像のIDが格納されます。
<registrationFaceInfo> <meta/> <faceId>1</faceId> <imagePath>http://eval.st1.polestars.jp/webapi/public/41016555a056124b20d013758cea2b04/20150109153901834_PC.jpg </imagePath> </registrationFaceInfo>
登録できましたので、別の画像で認証してみましょう。
認証は、modeパラメータに、verifyを指定します。
https://api.apigw.smt.docomo.ne.jp/puxImageRecognition/v1/faceRecognition?APIKEY=XXXXXX&mode=verify&imageURL=http://takae.sakura.ne.jp/wings/image2.jpg
認証結果は、verificationFaceInfoタグに格納されます。認証に用いた画像のID(faceId)と、どのくらい似ているかの認識スコア(score、100以下)の情報が含まれています。
<verificationFaceInfo> <faceCoordinates> </faceCoordinates> <candidate> <score>91</score> <faceId>1</faceId> <meta/> </candidate> </verificationFaceInfo>
オブジェクト認識(objectRecognition)
オブジェクト認識APIは、顔認証APIと同様の使い方です。ただし、レスポンスデータには、顔認証と異なり、認識オブジェクト情報(recognitionObjectInfo)として、オブジェクトの座標、角度、認識スコアが含まれています。
手書き文字認識(rakuhira)
手書き文字認識では、一文字の認識が可能です。APIの呼び出しは、筆跡の座標データが必要となり、データ量が多くなりますので、POSTメソッドのみに対応しています。
パラメータには、文字入力の枠サイズ(frameSizeWidth、frameSizeHeight)、その枠内の筆跡座標情報(coordinatePointArray)などを指定します。認識可能な文字は、漢字、カタカナ、ひらがな、記号、アルファベットになります。
レスポンスデータは、認識結果(handwritingRecognition)として、文字コード(recognitionResult)のリストが含まれます。
例えば、「高」の文字を認識させた場合は、次のように、高、萵、窩、富、貢、蒿という文字コードのリストとなりました。
"frameSizeWidth":256 "frameSizeHeight":256 "coordinatePointArray":{(96,22),(97,22),(98,23),(98,24),(99,24),...}
<handwritingRecognition> <recognitionResultList> <recognitionResult>0x9ad8</recognitionResult> <recognitionResult>0x8435</recognitionResult> <recognitionResult>0x7aa9</recognitionResult> <recognitionResult>0x5bcc</recognitionResult> <recognitionResult>0x8ca2</recognitionResult> <recognitionResult>0x84bf</recognitionResult> </recognitionResultList> </handwritingRecognition>