アプリケーションのスケルトンを説明します。merge_face.py、box_upload.pyアプリケーションについて、部位ごとに掲載していきます。各API等の仕様については、リンクしていきますので、そちらをご参照ください。
Develop編②
face_detect.py
import requests
# パラメータは、イメージファイルとapi_key,api_secret key
def face_detect(image,api_key,api_secret):
# requestのURL
url = "https://api-us.faceplusplus.com/facepp/v3/detect"
# requestのパラメータ:api_key、api_secret key、イメージファイル、
# オプションの返却値を指定。このスケルトンでは性別と美しさを指定
payload = {'api_key': api_key, 'api_secret': api_secret,
'image_base64': image, 'return_attributes': 'gender,beauty'}
try:
r = requests.post(url, data=payload)
# レスポンスは、JSON形式。
# 顔認証は、facesパラメータにリスト形式で格納される。順番はランダム
# ディクショナリ形式に読み替える
r = r.json()
# 必要な項目をディクショナリ形式の単一なリストにする
face_list = []
for face in r["faces"]:
faces = {}
if "attributes" in face:
faces["gender"] = face["attributes"]["gender"]["value"]
faces["beauty"] = face["attributes"]["beauty"]["male_score"]
# 並び替え用に画像上の顔のX座標の位置を代入
faces["x_axis"] = face["face_rectangle"]["left"]
face_list.append(faces)
# 左から順に並び変える
face_list = sorted(face_list, key=lambda x:x["x_axis"])
msg = ""
# 左から順に並び変えたリストより出力したいメッセージを編集する
for i, f in enumerate(face_list, 1):
msg += "{}人目の情報\n".format(i)
msg += "性別: {}\n".format(f["gender"])
msg += "ツヤツヤ偏差値: {}\n\n".format(int(f["beauty"]))
msg = msg.rstrip()
if not msg:
msg = "画像から顔データを検出できませんでした。"
return msg
except:
return "サーバーの接続に失敗したか画像を正しく認識できませんでした。"
Face++
Megvii Tech III
[Python] GET・POSTリクエストによるWebデータの取得(Requestsモジュール)
face_detect_azure.py
face_detect_azure.py ※詳細説明はリンク先をご確認ください。
import http.client, urllib.request, urllib.parse, urllib.error
import json
def face_detect_azure(body,api_key,api_secret):
# APIに送るメディアのタイプ application/octet-stream' (Local ファイル転送の場合)
# APIキーを指定する
headers = {
'Content-Type': 'application/octet-stream',
'Ocp-Apim-Subscription-Key': api_key,
}
# 取得したい情報について、パラメータを指定する
# 入力した顔画像に付与されるID、顔の位置(x,y,width,height)、
# オプションの返却値、このスケルトンでは性別と美しさを指定
params = urllib.parse.urlencode({
'returnFaceId': 'true',
'aceRectangle':'true',
'returnFaceAttributes': 'gender,smile'
})
# requestのURL,body部にイメージファイルを指定する
# "/face/v1.0/detect?%s" の部分が接続先APIの機能を指定
try:
conn = http.client.HTTPSConnection(api_secret)
conn.request("POST", "/face/v1.0/detect?%s" % params, body, headers)
response = conn.getresponse()
# 顔認証は、リスト形式で格納される。順番はたぶん左から
# ディクショナリ形式に読み替える
rs = json.loads(response.read())
# ディクショナリ形式のリスト。メッセージと顔の位置を編集して再度リストにする。
face_list = []
for i, r in enumerate(rs, 1):
rsface = {}
msg = ""
msg += "{}人目の情報\n".format(i)
msg += "\n性別:"
msg += r['faceAttributes']['gender']
msg += "\nスマイル偏差値:"
msg += str(int(r['faceAttributes']['smile']*100))
rsface['msg'] = msg.rstrip()
rsface['faceRectangle']=str(r['faceRectangle']['top'])+','+str(r['faceRectangle']['left'])+','+str(r['faceRectangle']['width'])+','+str(r['faceRectangle']['height'])
face_list.append(rsface)
if len(face_list) == 0:
rsface = {}
rsface['msg'] = "画像から顔データを検出できませんでした。"
face_list.append(rsface)
return face_list
conn.close()
except Exception:
print(rs['error']['message'])
print("サーバーの接続に失敗したか画像を正しく認識できませんでした。")
Cognitive Services: Face APIの顔検出をPythonで試してみた|Cognitive Services, Face API | | ナレコムAzureレシピ
that is it