オタフ☆クラブ

中国の顔認証API「FacePlusPlus」を検証!その驚きの結果とは!

画像認識のイメージ

僕たちAIエンジニアや、それを目指すみんなにとって「顔認証」といえば、とてもHOTな話題だよね。例えば最近中国で使われている技術はちょっとヤバくて、中国の国内でも人権大丈夫なの?なんて話もあるくらいなんだ。

シリル
シリル
そんな顔認証の技術、それ自体はエンジニアならきっと興味津々なんじゃないかな。

なので今回は、チュートリアルでPythonと中国の代表的な顔認証「FacePlusplus」のWebAPIを用いながら、簡単なアプリの作り方について解説していこう。

最初はFacePlusPlusの顔認証のAPIを軽く説明するから、最後まで記事を読んでくれたら、自分で簡単に顔認証アプリが作れるようになるんじゃないかな。

もちろん、FacePlusPlus以外にも同様のサービスを提供している会社がいくつかあるから、興味があったら別のサービスを試してみるのも良いかもしれない。

では早速FacePlusPlusについて話を進めていくよ。

FacePlusPLusとは

FacePlusPlusサイトイメージ

FacePlusPlusは、中国のスタートアップ企業のMegviiが開発した顔認証のサービスです。

Megviiは2011年に創立されたスタートアップ企業で、ユニコーン企業(企業価値10億ドルの非上場企業のこと)になっており、中国政府または行政機関がこの技術を使って、庶民の監視を行なっているため、大量のデータも持っているし、安定収入もあります。

ですからそれでSenseTime(こっちも中国の企業)とその分野のリーダーとなっているのです。

ここまで聞くと、どこまですごい技術を持っているか気になっている人も多いんじゃないかな。ということでこれからFacePlusPLusを軽く検証していこう。

初期設定

前提に必要な知識

  • Pythonの基礎

以上です。

もしPythonをインストールしてないなら、python3.7をインストールしてください。
シリル
シリル

開発環境として、PyCharmはおすすめ。

サービスに登録

当然、最初はFacePlusPlusのサービスに登録しなければなりません。下記のURLから登録しましょう。APIを試すだけでしたら無料です。

シリル
シリル

残念ながら、中国語と英語しかないみたいだね。

中国語も英語もどちらも苦手な方はGoogleの翻訳などを使ってください。

 

APIキーの取得

登録した後、FacePlusPlusのコンソルでAPIの管理画面へ移動します。そこでAPIキーを取得します。

Pythonの必要なライブラリ

Pythonで開発するときに、仮想環境を使うのがオススメ。

(ご参照まで:https://docs.python.org/ja/3/library/venv.html

そしてプロジェクトのフォルダを用意して、その下でvenvを作ります。

venvは、python3.7では下記のコマンドラインだけでいけます。
$ python -m venv venv
# 下記のコマンドはパイソンの仮想環境を有効にする
$ source venv/bin/activate

今回のプロジェクトにて、二つの第三者のpythonモジュールを使っています:

  • requests: ウェブリクエストに便利なモジュール。データスクレイピングにもよく使います。スクレイピングの裏技は今後別の記事で紹介しようと思う。
  • opencv2: 画像処理にパワーフルなモジュール
そこでrequestsとcv2をインストールしてください。
(venv)$ pip install requests
(venv)$ pip install opencv-python

ここまで正常にインストールができたら、次にコードを書き始めましょう。

テストプログラムとその結果

はじめに

FacePlusPlusのテストをするに辺り、とっても簡単なプログラムを作りました。

このプログラムで顔認証のAPI(detect API)を試すために、まずはFacePlusPlusの参照ページを確認。そこにはQuickStartのソースコードがあったので使ってみましたが、このソースコードはメンテされていないため、最近のPythonには全く合わず、またコード自体は汚かったので、ゼロから作ることにしました。

次にAPIのドキュメンテーションを確認。すると解析できる顔の特徴がかなり多かったのです。顔の位置をはじめ表情、顔の向き、笑顔、美まで想定してくれてるAI(人工知能)となっていました。

シリル
シリル

私はちょっとナルシストなので、自分の美をどうAI(人工知能)に測定されているかとっても気になります。

参照までに下記のURLを確認してください。

プログラム

それでは自分の美をAI(人工知能)に測定してもらいます。

このプログラムの流れは簡単です。

画像のパスを指定して、FaceplusplusのREST APIに投げて、リクエストの結果を読み取ります。そして、CV2を用い画像に情報を追加して終了です。

ソースコードは下記の通り。

import requests
import base64
import cv2
import pprint


key = "yourkey"
secret = "yoursecret"


def test_detect_api(file_path):
    """
    detectのAPIにリクエストを送って、様々な画像の特徴を取得。
    :param file_path: 画像へのパス
    :return:
    """
    with open(file_path, 'rb') as f:
        b64_image = base64.b64encode(f.read())

    r_att = 'age,gender,headpose,smiling,facequality,blur,eyestatus,emotion,ethnicity,beauty,mouthstatus,eyegaze,skinstatus'

    data = {
        "api_key": key,
        "api_secret": secret,
        "image_base64": b64_image,
        'return_attributes': r_att
    }
    # 顔認証の特徴検出API
    http_url = 'https://api-us.faceplusplus.com/facepp/v3/detect'
    resp = requests.post(http_url, data=data)

    result = resp.json()

    img = cv2.imread(file_path)

    for face in result.get("faces"):
        face_rectangle = face.get("face_rectangle")
        top = face_rectangle.get("top")
        left = face_rectangle.get("left")
        right = face_rectangle.get("width") + left
        bottom = top + face_rectangle.get("height")
        # 資格を顔の方に描く
        cv2.rectangle(img,
                      (left, top),
                      (right, bottom),
                      255,
                      3)
        attributes = face.get("attributes")
        beauty = attributes.get("beauty")
        font = cv2.FONT_HERSHEY_SIMPLEX
        face_top = (left, top-25)
        font_scale = 1
        font_color = (255, 0, 0)
        line_type = 2
        # 美のスコアを画像に書く
        cv2.putText(img,
                    f"female: {beauty.get('female_score')}, male: {beauty.get('male_score')}",
                    face_top,
                    font,
                    font_scale,
                    font_color,
                    line_type)
        pp = pprint.PrettyPrinter()
        pp.pprint(face)
    file_ext = file_path.split(".")[-1]
    file_path_no_ext = "".join(file_path.split(".")[:-1])

    cv2.imwrite(f"{file_path_no_ext}_result.{file_ext}", img)


if __name__ == "__main__":
    import argparse
    parser = argparse.ArgumentParser()
    parser.add_argument("-p", "--file_path", default="data/cyril4.jpg")
    args = parser.parse_args()
    test_detect_api(args.file_path)

テストの結果

取り敢えず、私のラップトップで写真を撮ってみて、美を測定してもらいました。

美を測定するシリルのイメージ

この測定結果を確認したら100点満点で60ちょっとしか超えてない。
シリル
シリル

まぁAI(人工知能)に私はごく普通ってことだよね。ちょっとプライド的に嬉しくないかな。

{'attributes': {'age': {'value': 40},
                'beauty': {'female_score': 64.801, 'male_score': 61.731},
                'blur': {'blurness': {'threshold': 50.0, 'value': 0.343},
                         'gaussianblur': {'threshold': 50.0, 'value': 0.343},
                         'motionblur': {'threshold': 50.0, 'value': 0.343}},
                'emotion': {'anger': 0.869,
                            'disgust': 0.089,
                            'fear': 0.089,
                            'happiness': 0.329,
                            'neutral': 56.302,
                            'sadness': 18.029,
                            'surprise': 24.292},
                'ethnicity': {'value': 'WHITE'},
                'eyegaze': {'left_eye_gaze': {'position_x_coordinate': 0.456,
                                              'position_y_coordinate': 0.463,
                                              'vector_x_component': -0.065,
                                              'vector_y_component': 0.012,
                                              'vector_z_component': 0.998},
                            'right_eye_gaze': {'position_x_coordinate': 0.511,
                                               'position_y_coordinate': 0.492,
                                               'vector_x_component': -0.023,
                                               'vector_y_component': 0.183,
                                               'vector_z_component': 0.983}},
                'eyestatus': {'left_eye_status': {'dark_glasses': 0.043,
                                                  'no_glass_eye_close': 0.0,
                                                  'no_glass_eye_open': 99.952,
                                                  'normal_glass_eye_close': 0.0,
                                                  'normal_glass_eye_open': 0.004,
                                                  'occlusion': 0.001},
                              'right_eye_status': {'dark_glasses': 0.0,
                                                   'no_glass_eye_close': 0.0,
                                                   'no_glass_eye_open': 100.0,
                                                   'normal_glass_eye_close': 0.0,
                                                   'normal_glass_eye_open': 0.0,
                                                   'occlusion': 0.0}},
                'facequality': {'threshold': 70.1, 'value': 91.257},
                'gender': {'value': 'Male'},
                'glass': {'value': 'None'},
                'headpose': {'pitch_angle': 5.9728327,
                             'roll_angle': 2.0408728,
                             'yaw_angle': -3.5404959},
                'mouthstatus': {'close': 57.957,
                                'open': 0.005,
                                'other_occlusion': 32.788,
                                'surgical_mask_or_respirator': 9.249},
                'skinstatus': {'acne': 1.521,
                               'dark_circle': 13.452,
                               'health': 10.345,
                               'stain': 0.812},
                'smile': {'threshold': 50.0, 'value': 2.079}},
 'face_rectangle': {'height': 244, 'left': 447, 'top': 243, 'width': 244},
 'face_token': '5059e15ce3e4af789a8dce9abb16908b'}

上記はAPIからのレスポンスとなります。

例えば年齢をみると40歳と書いてあります。私の実年齢は39歳。悲しいぐらい中々合っていますね。メガネも、性別も、人種も上手く撮れています。他の顔の特徴も上手く撮れている感じです。

次は携帯のビューティーフィルターで撮ってみて、このAI(人工知能)を騙せるかを確認してみましょう。

美を測定するシリルその2のイメージ

ちょっと怖い顔になったけど、66点になりました。

シリル
シリル

AI(人工知能)ってどんな基準で美を測ってるかな。

次の実験では友達はかっこよく撮ってくれた写真を試しました。

シリル
シリル

その結果は個人的に75点まで上がりそうなんですが、AI(人工知能)はどう判断するかな。

ジャジャン

美を測定するシリルその3のイメージ

67点。。。微妙だね。

比較するためにいくつかの僕が美しいと思ってる男性で試してみます。

ブラット・ピットシルエットイメージ
ブラッド・ピット:51点だけなんだね。。。

シリル
シリル

このAIによると僕は断定的にブラッドの上になっている。ならばいいんちゃうかなw

ザック・エフロンシルエットイメージ

ザック・エフロン: 91!!!驚きました。

シリル
シリル

やっぱり、若い方がいいかも。ちょっと失礼なAI(人工知能)な気がしてきたw

日本の人気俳優をみてみましょう。

斎藤工シルエットイメージ

加藤工:76点。なるほど。

シリル
シリル

まぁちょっと美容の測定で遊びすぎた。女性は全く確認していない。

 

画像認識のイメージ

さて、今回は簡単な顔認証APIを使ったプログラムを作りながら、FacePlusPlusの顔認証 APIの検証結果を楽しく報告したんだけど、顔認証アプリは思った以上に滑らかに作れる事が解ったよね。

シリル
シリル

もし気になることがあったらコメント欄に遠慮なく投稿してください。プライベートはヨガとボルダリング、デートですごく忙しいけど、時間があったら、しっかり返事するよ。

さて、まとめよう。今日の私の記事を読みながら下記を身につけたら嬉しいです。

  • 第三者のサービスのAPIを叩く方法
  • Opencvの基礎的な機能
  • requestsの基礎的な機能

では自ら挑戦してみてくださいませ。

シリル
シリル

Et à bientôt pour de nouvelles aventures!(一緒にまた次の冒険に出ましょう)

燃やせ探究心!突き詰めろ美しきソースコード!オタフ☆クラブ

コメントをどうぞ

トップへ戻る
タイトルとURLをコピーしました