2011年7月15日金曜日

face.comのAPIを使って、似た顔を判別させる方法

face.comのAPIを使うと顔を判断してくれるのですが、このときface.comのDBに似た顔があれば、それを判別して返してくれます。
具体的にどのようなことをすればいいのか日本語で説明しているサイトがなかったので、ちょっと紹介してみます。
なお書いているコードはRubyですが、基本的な流れは他の言語でも一緒です。

face.comの登録はこちらからしてください。
http://developers.face.com/signup/?g

登録したら「API Key」、「API Sercret」、「namespace」をメモっといてください。
都度使用します。
また途中「uid」が出てきますが、これは「任意のID@namespace」です。
任意のIDはどこかで定義することなく、いきなりAPIに飛ばして平気です。
またこの任意のID部分で、なんの写真か判断させますので、人物ごとにユニークなIDをふってください。

【流れ】
1:faces.detectもしくはfaces.recognizeでAPIを叩き、tags.addで使用するデータを取得。
2:1で取得した情報をもとにtags.addでタグ付け。
3:faces.trainで、2で設定したタグをface.comのDBに登録する。
4:faces.recognizeを使って写真を投げると、DBに似た顔の写真があればそのuidを返してくれます。

具体的なコードはこちらです。
登録用と似た写真を判断するようにメソッドを分けてます。

と、その前に
# sudo gem install face
でface.com用のライブラリをインストールしといてください。

require 'rubygems'
require 'face'

#APIkeyの設定
api_key = ''
api_secret = ''

#使用する画像の設定
@img_url = "http://a2.twimg.com/profile_images/1049472282/image_bigger.jpg"
@label = "篠田麻里子"

#shinoda@namespaceが帰ってきたら篠田麻里子だと判定するようDBなどに登録しておくといいんじゃない?
#uidで誰か判定させるので、人物ごとのユニークにしてください。
@uid = "shinoda@namespace"

@client = Face.get_client(:api_key => api_key , :api_secret => api_secret)

#画像の登録
def regist
 data = @client.faces_recognize(:urls => @img_url , :uids => @uid) #face.comのAPIになげる
 photos = data['photos']
 photos.each do |photo|
    photo['tags'].each do |tags|
     result = @client.tags_add(:tid => tags['tid'],
          :uid => @uid,
          :label => @label,
          :url => photo['url'],
          :x => tags['center']['x'],
          :y => tags['center']['y'],
          :width => tags['width'],
          :height => tags['height'],
          :tagger_id => tags['tagger_id']
) #帰ってきたデータをもとにタグを登録。
p result
@client.faces_train(:uids => @uid, :namespace => 'namespace') #タグ付けした情報をface.comのDBに登録。
  end
 end
end

#画像の判定時
def tag_show
 data = @client.faces_recognize(:urls => @img_url , :uids => 'all@namespace') #all@namespaceに対して投げると、namespaceに入っているデータ全部で認定してくれる。
 photos = data['photos']
 photos.each do |photo|
  photo['tags'].each do |tags|
   unless tags['uids'] == []
    puts "#{tags['uids'][0]['uid']}に#{tags['uids'][0]['confidence']}%似ています。"
   end
  end
 end
end


regist
#tag_show


all@namespaceに対してfaces.recognizeさせると、namespaceに登録してあるIDのうち、似ている画像があれば、すべて返してくれる。
投げた写真が、篠田麻里子と前田敦子に似ていた場合、shinoda@namespace,maeda@namespaceみたいな感じで返してくれます。

なお個別に似ているかどうか判断したい場合は個別のuidを指定してください。
(投げた画像が篠田麻里子にどの程度似ているか判定させたい場合、shinoda@namespace宛にfaces.recognizeさせる。
 このとき前田敦子にどれだけ似ていてもその判定はされない。)

似ているどはconfidenceの中に入ってます。

参考:http://journal.mycom.co.jp/column/tool/022/index.html

0 件のコメント:

コメントを投稿