masato-ka's diary

日々思ったこととか、やったことの備忘録。

detectFace APIのPythonサンプル

FaceBookに買収されたFACE.comが開発者向けAPIを停止するとのことなので、他の類似サービスがないか探してみました。そうすると、日本の会社がhttp://detectface.com/:detectFace();という類似サービスを公開しているようです。こちらはアプリケーションキーの登録などは必要なく、POSTやGETで画像データを送るだけで利用できます。
今回はPythonでローカルに置いている画像をPOSTするクラスを作ってみました。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
'''
Created on 2012/07/15

@author: masato-ka
'''
import os
import urllib2
import urllib

class detectFaceProxy(object):
    
    def __init__(self,mode=0,force=0):
        self.detect_face_url='http://detectface.com/api/detect?m={m}&f={f}'.format(m=mode,f=force)
        self.data=''
        
    def fetch_feature(self,image_file_path):
        """
        detectFaceAPIに画像を投げ込み、特徴点XMLを返す。
        :param String image_file_path: 顔画像のファイルパス
        :rtype:String
        :return: 結果xml
        """
        
        path,type=os.path.splitext(image_file_path)
        content_type=type[1:]
        if content_type=="jpg":
            content_type="jpeg"
            
        data = self._read_image_binary(image_file_path)
        request = urllib2.Request(self.detect_face_url)
        
        request.add_header('Content-Type','image/{t}'.format(t=content_type))
        request.add_data(data)
        opener = urllib2.build_opener()
        self.data = opener.open(request).read()
        return self.data

    def _read_image_binary(self,file_path):
        return open(file_path,"r").read()

detectFaceProxyクラスのインスタンスからfetch_featureメソッドを実行してください。fetch_featureメソッドには画像ファイルのパスを渡します。返値として結果xmlがかえってきます。また、detectFaceProxy.dataにも同じものが格納されます。結果のxmlxml.dom.minidomなんかで適当にパースすると扱いやすくなります。
単純に顔と目の位置、特徴点の位置と信頼度を返すだけですので、FACE.comのように性別の判定などは行っていないようです。

特徴点をJubatusなんかに食わせられるだろうか。