僕たちAIエンジニアや、それを目指すみんなにとって「顔認証」といえば、とてもHOTな話題だよね。例えば最近中国で使われている技術はちょっとヤバくて、中国の国内でも人権大丈夫なの?なんて話もあるくらいなんだ。
なので今回は、チュートリアルでPythonと中国の代表的な顔認証「FacePlusplus」のWebAPIを用いながら、簡単なアプリの作り方について解説していこう。
最初はFacePlusPlusの顔認証のAPIを軽く説明するから、最後まで記事を読んでくれたら、自分で簡単に顔認証アプリが作れるようになるんじゃないかな。
もちろん、FacePlusPlus以外にも同様のサービスを提供している会社がいくつかあるから、興味があったら別のサービスを試してみるのも良いかもしれない。
では早速FacePlusPlusについて話を進めていくよ。
FacePlusPLusとは
FacePlusPlusは、中国のスタートアップ企業のMegviiが開発した顔認証のサービスです。
ですからそれでSenseTime(こっちも中国の企業)とその分野のリーダーとなっているのです。
ここまで聞くと、どこまですごい技術を持っているか気になっている人も多いんじゃないかな。ということでこれからFacePlusPLusを軽く検証していこう。
初期設定
前提に必要な知識
- Pythonの基礎
以上です。
開発環境として、PyCharmはおすすめ。
サービスに登録
当然、最初はFacePlusPlusのサービスに登録しなければなりません。下記のURLから登録しましょう。APIを試すだけでしたら無料です。
残念ながら、中国語と英語しかないみたいだね。
中国語も英語もどちらも苦手な方はGoogleの翻訳などを使ってください。
APIキーの取得
登録した後、FacePlusPlusのコンソルでAPIの管理画面へ移動します。そこでAPIキーを取得します。
Pythonの必要なライブラリ
Pythonで開発するときに、仮想環境を使うのがオススメ。
(ご参照まで:https://docs.python.org/ja/3/library/venv.html)
そしてプロジェクトのフォルダを用意して、その下でvenvを作ります。
$ python -m venv venv # 下記のコマンドはパイソンの仮想環境を有効にする $ source venv/bin/activate
今回のプロジェクトにて、二つの第三者のpythonモジュールを使っています:
- requests: ウェブリクエストに便利なモジュール。データスクレイピングにもよく使います。スクレイピングの裏技は今後別の記事で紹介しようと思う。
- opencv2: 画像処理にパワーフルなモジュール
(venv)$ pip install requests (venv)$ pip install opencv-python
ここまで正常にインストールができたら、次にコードを書き始めましょう。
テストプログラムとその結果
はじめに
FacePlusPlusのテストをするに辺り、とっても簡単なプログラムを作りました。
このプログラムで顔認証のAPI(detect API)を試すために、まずはFacePlusPlusの参照ページを確認。そこにはQuickStartのソースコードがあったので使ってみましたが、このソースコードはメンテされていないため、最近のPythonには全く合わず、またコード自体は汚かったので、ゼロから作ることにしました。
次にAPIのドキュメンテーションを確認。すると解析できる顔の特徴がかなり多かったのです。顔の位置をはじめ表情、顔の向き、笑顔、美まで想定してくれてるAI(人工知能)となっていました。
私はちょっとナルシストなので、自分の美をどうAI(人工知能)に測定されているかとっても気になります。
参照までに下記のURLを確認してください。
プログラム
それでは自分の美をAI(人工知能)に測定してもらいます。
このプログラムの流れは簡単です。
ソースコードは下記の通り。
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)
テストの結果
取り敢えず、私のラップトップで写真を撮ってみて、美を測定してもらいました。
まぁ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からのレスポンスとなります。
次は携帯のビューティーフィルターで撮ってみて、このAI(人工知能)を騙せるかを確認してみましょう。
ちょっと怖い顔になったけど、66点になりました。
AI(人工知能)ってどんな基準で美を測ってるかな。
次の実験では友達はかっこよく撮ってくれた写真を試しました。
その結果は個人的に75点まで上がりそうなんですが、AI(人工知能)はどう判断するかな。
ジャジャン
67点。。。微妙だね。
比較するためにいくつかの僕が美しいと思ってる男性で試してみます。
ブラッド・ピット:51点だけなんだね。。。
このAIによると僕は断定的にブラッドの上になっている。ならばいいんちゃうかなw
ザック・エフロン: 91!!!驚きました。
やっぱり、若い方がいいかも。ちょっと失礼なAI(人工知能)な気がしてきたw
日本の人気俳優をみてみましょう。
加藤工:76点。なるほど。
まぁちょっと美容の測定で遊びすぎた。女性は全く確認していない。
さて、今回は簡単な顔認証APIを使ったプログラムを作りながら、FacePlusPlusの顔認証 APIの検証結果を楽しく報告したんだけど、顔認証アプリは思った以上に滑らかに作れる事が解ったよね。
もし気になることがあったらコメント欄に遠慮なく投稿してください。プライベートはヨガとボルダリング、デートですごく忙しいけど、時間があったら、しっかり返事するよ。
さて、まとめよう。今日の私の記事を読みながら下記を身につけたら嬉しいです。
- 第三者のサービスのAPIを叩く方法
- Opencvの基礎的な機能
- requestsの基礎的な機能
では自ら挑戦してみてくださいませ。
Et à bientôt pour de nouvelles aventures!(一緒にまた次の冒険に出ましょう)
コメントをどうぞ