FaMirror Project

報告的なこと、技術的なこと

無料API「face++」で顔から双子を判別

概要

以前の記事でも顔認証等の機能を持つ無料API「face++」を取り上げました。
famirror.hateblo.jp

「face++」には、顔を認識するだけではなく、顔を判別する機能もあります。

今回は、双子姉妹のフリー素材アイドル、「MIKA☆RIKA」のお二人を区別してみようと思います。
mika-rika-free.jp

API解説

face++は中国のWebサービスで、顔認証だけでなく、顔の判別や検索など、様々な機能を持つ無料APIです。
www.faceplusplus.com

「face++」の基本的な使い方に関しては以前の記事をご覧ください。
famirror.hateblo.jp

今回はface++の様々な機能を駆使して、顔の判別を行います。

目標

こちらがMIKAさんです。
f:id:famirror:20151215180112j:plain

こちらがRIKAさんです。
f:id:famirror:20151215180252j:plain

申し訳ないのですが、私にはほとんど見分けがついていません。

お二人の顔を「face++」に学習させ、学習させてない写真を与えた時に正確に名前を当てれるかどうか確かめます。

顔を解析

まずは、顔を解析するところから始まります。

これは前回使った、顔認識の機能「/detection/detect」を使用します。
/detection/detect | API Docs | Face++

https://apicn.faceplusplus.com/detection/detect」に以下のパラメータをつけてGETもしくはPOST送信することでJSON形式の結果を取得することができます。

名前 説明
api_key 取得した「API Key」
api_secret 取得した「API Secret」
url 画像URL

よって以下のような形のURLをGET送信することになります。

https://apicn.faceplusplus.com/detection/detect?api_key=<API KEY>&api_secret=<API Secret>&url=<画像URL>

<API KEY>と<API Secret>はご自身のものに書き換えてください。

先ほど載せたMIKAさんの写真で試してみます。

{
    "face": [
        {
            "attribute": {
                "age": {
                    "range": 7, 
                    "value": 21
                }, 
                "gender": {
                    "confidence": 99.9638, 
                    "value": "Female"
                }, 
                "race": {
                    "confidence": 99.51050000000001, 
                    "value": "Asian"
                }, 
                "smiling": {
                    "value": 50.7635
                }
            }, 
            "face_id": "55b2b67fd170e5494648664412654d77", 
            "position": {
                "center": {
                    "x": 57.526882, 
                    "y": 36.612903
                }, 
                "eye_left": {
                    "x": 52.453978, 
                    "y": 33.193871
                }, 
                "eye_right": {
                    "x": 59.675269, 
                    "y": 29.797
                }, 
                "height": 23.548387, 
                "mouth_left": {
                    "x": 54.663656, 
                    "y": 46.683226
                }, 
                "mouth_right": {
                    "x": 61.668172, 
                    "y": 43.652903
                }, 
                "nose": {
                    "x": 54.638925, 
                    "y": 38.996774
                }, 
                "width": 15.698925
            }, 
            "tag": ""
        }
    ], 
    "img_height": 310, 
    "img_id": "1f9d2e3b9b13b2eca5b0aa723f25c9e1", 
    "img_width": 465, 
    "session_id": "1524016fc7954114b67d414d1e77ec22", 
    "url": "http://mika-rika-free.jp/wp-content/uploads/business_43_mika.jpg"
}

ここで、必ず「face_id」をメモしておきます。

同様に、複数枚の写真で解析を行い、「face_id」を取得します。

今回はそれぞれ10枚、合計20枚の解析を行いました。

人を作成

顔の解析ができたら、それを一人の人として紐付けを行います。

face++の「/person/create」という機能になります。
/person/create | API Docs | Face++

https://apicn.faceplusplus.com/person/create」に以下のパラメータをつけてGETもしくはPOST送信することで人を作成し、その人に対して顔の情報を追加することができます。

名前 説明
api_key 取得した「API Key」
api_secret 取得した「API Secret」
person_name 人の名前
face_id 登録する顔のid
コンマ区切りで指定

よってMIKAさんを登録する場合、以下のような形のURLをGET送信することになります。

https://apicn.faceplusplus.com/person/create?api_key=<API KEY>&api_secret=<API Secret>&person_name=MIKA&face_id=55b2b67fd170e5494648664412654d77,1f71...

face_idは先ほどの顔解析でメモしておいたものになります。

成功すると以下のようなJSONが帰ってきます。

{
    "added_face": 10, 
    "added_group": 0, 
    "person_id": "e0681cccb671163f814c57be1ce53f47", 
    "person_name": "MIKA", 
    "tag": ""
}

10枚の顔がMIKAさんとして登録されました。

ここで取得したperson_idをメモしておいてください。

また、顔情報を追加した後には、学習をしなければなりません。

face++の「/train/verify」機能を使います。
/train/verify | API Docs | Face++

https://apicn.faceplusplus.com/train/verify」に以下のパラメータをつけてGETもしくはPOST送信してください。

名前 説明
api_key 取得した「API Key」
api_secret 取得した「API Secret」
person_name 人の名前

よってMIKAさんの場合、以下のような形のURLをGET送信することになります。

https://apicn.faceplusplus.com/train/verify?api_key=<API KEY>&api_secret=<API Secret>&person_name=MIKA

以下のようなjsonが帰って来れば成功です。

{
    "session_id": "ae43f311bd6c4bacbb1c852a63873127"
}

RIKAさんについても同じことをして、二人のユーザーを登録します。

人をグループに追加

次に、二人を一つのグループに追加します。

face++の「/group/create」という機能になります。
/group/create | API Docs | Face++

https://apicn.faceplusplus.com/group/create」に以下のパラメータをつけてGETもしくはPOST送信することでグループを作成し、そこに人を追加することができます。

名前 説明
api_key 取得した「API Key」
api_secret 取得した「API Secret」
group_name グループ名
person_id グループに追加する人の「person_id」
コンマ区切りで指定


以下のような形のURLをGET送信して、二人を一つのグループ「MIKARIKA」に追加します。

https://apicn.faceplusplus.com/group/create?api_key=<API KEY>&api_secret=<API Secret>&group_name=MIKARIKA&person_id=e0681cccb671163f814c57be1ce53f47,83db9a2b81bd15df869ff7586995c579

以下のようなJSONが返って来れば成功です。

{
    "added_person": 2, 
    "group_id": "7ac06883ad59f105304a8de0ce1ebdb6", 
    "group_name": "MIKARIKA", 
    "tag": ""
}

また、人に顔情報を追加した時と同様、グループに人を追加した場合は学習をさせなければなりません。

face++の「/train/identify」機能を使用します。
http://www.faceplusplus.com/train_identify/

https://apicn.faceplusplus.com/train/identify」に以下のパラメータをつけてGETもしくはPOST送信してください。

名前 説明
api_key 取得した「API Key」
api_secret 取得した「API Secret」
group_name グループの名前

よって、以下のような形のURLをGET送信することになります。

https://apicn.faceplusplus.com/train/identify?api_key=<API KEY>&api_secret=<API Secret>&group_name=MIKARIKA

以下のうようなjsonが帰って来れば成功です。

{
    "session_id": "dea63fb74d9545a1b0296f4688e65534"
}

判別機能を試してみる

学習が終わったので、いよいよ次は結果を見ていきましょう。

画像に写っている人物がグループの中に誰に一番似ているかを調べられる「/recognition/identify」の機能を使います。
/recognition/identify | API Docs | Face++

https://apicn.faceplusplus.com/recognition/identify」に以下のパラメータをつけてGETもしくはPOST送信することでJSON形式の結果を取得することができます。

名前 説明
api_key 取得した「API Key」
api_secret 取得した「API Secret」
group_name グループの名前
url 画像URL

よって以下のような形のURLをGET送信することになります。

https://apicn.faceplusplus.com/recognition/identify?api_key=<API KEY>&api_secret=<API Secret>$group_name=MIKARIKA&url=<画像URL>

さて、こちらはMIKAさんです。
f:id:famirror:20151215192407j:plain

この画像をface++に送って判断してもらうと、次のようなJSONが返ってきました。

{
    "face": [
        {
            "candidate": [
                {
                    "confidence": 58.998478, 
                    "person_id": "e0681cccb671163f814c57be1ce53f47", 
                    "person_name": "MIKA", 
                    "tag": ""
                }, 
                {
                    "confidence": 33.019928, 
                    "person_id": "83db9a2b81bd15df869ff7586995c579", 
                    "person_name": "RIKA", 
                    "tag": ""
                }
            ], 
            "face_id": "09c8f51ec496616a4ad82ed13943e35a", 
            "position": {
                "center": {
                    "x": 55.376344, 
                    "y": 50.16129
                }, 
                "eye_left": {
                    "x": 51.607957, 
                    "y": 45.817097
                }, 
                "eye_right": {
                    "x": 58.139355, 
                    "y": 44.037742
                }, 
                "height": 22.903226, 
                "mouth_left": {
                    "x": 53.811828, 
                    "y": 56.477419
                }, 
                "mouth_right": {
                    "x": 59.827312, 
                    "y": 56.034516
                }, 
                "nose": {
                    "x": 53.965806, 
                    "y": 51.647419
                }, 
                "width": 15.268817
            }
        }
    ], 
    "session_id": "0ffb3220b43547e6b69cc2bb5d674f9f"
}

MIKAさん可能性が約60%、RIKAさんの可能性が約33%とい事で、無事にMIKAさんだと判断してくれました。

他にも数枚テストしてみましたが、一度も間違えずに答えてくれています。

双子でもちゃんと区別されています。

学習させる画像数を増やせばもっと精度は高くなると思いますので、よかったらチャレンジしてみてください。