夜風のMixedReality

xRと出会って変わった人生と出会った技術を書き残すためのGeekなHoloRangerの居場所

Unityで顔認識を行う 結果をもとに活用する

本日は先日使用したユーザーローカルの顔認識AIの結果を活用します。

前回はAPIキーを基に顔写真の画像をアップロードし、結果を受け取りDebug.Logで表示させるということを行いました。

redhologerbera.hatenablog.com

今回はLogではなく、活用できる形でプロジェクト内で使用できるようにします。

〇準備

 前回の記事のスクリプトを組み、ユーザーローカルの顔認識AIの結果をDebug.Log表示している状態から始めます。

redhologerbera.hatenablog.com

Jsonデータの読み込み

 ユーザーローカルの顔認識AIの結果は次のようなJson形式で返されます

{"id":"a03d762c476b3d69ae34d7c08037fe55",
"status":200,
"error_type":"",
"result":[{
"accuracy":0.81,
"age":"20-29",
"emotion":"surprise",
"emotions":
{
"angry":0,
"joy":0,
"sadness":0,"
surprise":1
},
"gender":"female",
"location":{
"x1":0,
"x2":457,
"y1":34,
"y2":511,
"width":457,
"height":477
},
"precise_age":21
}]}

この結果を取得してテキスト表示や色などで表すことが今回の目的です。

Jsonデータの取り出し

 UnityでJsonを扱うためにはデータを格納するクラスを作成する必要があります。

[System.Serializable]
public class FaceAPIEntity
{
    public string id;
    public Result[] result;
}

[System.Serializable]
public class Result
{
    public string age;
    public float precise_age;
    public string gender;   
}

上記の例では顔認証AIから返されるJsonのうちid年齢ジェンダー、推定年齢を受け取り格納するようにしています。

これをテキストで表示しします。

前回作成した FacialRecognitionのデータを受け取る関数に一文加えます。

    IEnumerator PostData(string myjson)
    {
        byte[] postData = System.Text.Encoding.UTF8.GetBytes(myjson);
        var request = new UnityWebRequest("https://face-ai.userlocal.jp/api/detect", "POST");
        request.uploadHandler = (UploadHandler)new UploadHandlerRaw(postData);
        request.downloadHandler = (DownloadHandler)new DownloadHandlerBuffer();

        request.SetRequestHeader("Content-Type", "application/json");

        yield return request.Send();

        FaceAPIEntity faceAPIEntity = JsonUtility.FromJson<FaceAPIEntity>(request.downloadHandler.text);//追加
        string jsonText = request.downloadHandler.text;//追加
        
        
        Debug.Log(request.downloadHandler.text);
        Debug.Log(faceAPIEntity.result[0].age);

        ageText.text = faceAPIEntity.result[0].gender.ToString();//追加
    }

追加した分は以下です

    FaceAPIEntity faceAPIEntity = JsonUtility.FromJson<FaceAPIEntity>(request.downloadHandler.text);
        string jsonText = request.downloadHandler.text;
        ageText.text = faceAPIEntity.result[0].age.ToString();

rewuest.douwnloadHandler.textはが返されるJsonです。 それをJsonUtility.FromJsonによってFaceAPIEntityに格納しています。

faceAPIEntitiyのresultの中のageをString型としてTextMeshProのageText.textに代入して表示します。

〇Unity実装

①[Hierarchy]に結果を表示させるための[TextMeshPro]を追加します。

 f:id:Holomoto-Sumire:20201008082255j:plain

FacialRecognitionコンポーネントがアタッチされているオブジェクトのageTextに作成したTextをアタッチします。

 f:id:Holomoto-Sumire:20201008090247j:plain

③Unityを実行して前回同様筆者の顔写真をアップロードします。

 f:id:Holomoto-Sumire:20201002103529j:plain

 実行するとテキストに年齢が表示されます。

 f:id:Holomoto-Sumire:20201008090526j:plain   以上でユーザーローカルの顔認識AIを使用して画像をアップロードして帰ってきたJsonデータから任意のデータを取り出し表示することができました。

スクリプト

using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Text;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.Networking;
using TMPro;

public class FacialRecognition : MonoBehaviour
{
    [SerializeField]
    GameObject image;
    [System.Serializable]
    public class MyJson
    {
        public string image_base64;
        public string api_key;
    }
    [SerializeField]
    TextMeshPro ageText;

    void Start()
    {
        var texture = ReadTexture(Application.persistentDataPath + "\\Test.jpg");
        Debug.Log(texture);
        string enc = System.Convert.ToBase64String(texture.EncodeToJPG());

        MyJson myObject = new MyJson();
        myObject.api_key = "";
        myObject.image_base64 = enc;
        string myjson = JsonUtility.ToJson(myObject);

        StartCoroutine("PostData",myjson);

    }
   

    IEnumerator PostData(string myjson)
    {
        byte[] postData = System.Text.Encoding.UTF8.GetBytes(myjson);
        var request = new UnityWebRequest("https://face-ai.userlocal.jp/api/detect", "POST");
        request.uploadHandler = (UploadHandler)new UploadHandlerRaw(postData);
        request.downloadHandler = (DownloadHandler)new DownloadHandlerBuffer();

        request.SetRequestHeader("Content-Type", "application/json");

        yield return request.Send();
        //   Debug.Log(request.error);

        FaceAPIEntity faceAPIEntity = JsonUtility.FromJson<FaceAPIEntity>(request.downloadHandler.text);
        string jsonText = request.downloadHandler.text;
               
        Debug.Log(request.downloadHandler.text);
        ageText.text = faceAPIEntity.result[0].gender.ToString();
    }
    Texture2D ReadTexture(string path)
    {
        byte[] readBinary = ReadFile(path);
        Texture2D texture = new Texture2D(1, 1);
        texture.LoadImage(readBinary);

        return texture;
    }

    byte[] ReadFile(string path)
    {
        FileStream fileStream = new FileStream(path, FileMode.Open, FileAccess.Read);
        BinaryReader bin = new BinaryReader(fileStream);
        byte[] values = bin.ReadBytes((int)bin.BaseStream.Length);
        bin.Close();

        return values;
    }
}
[System.Serializable]
public class FaceAPIEntity
{
    public string id;
    public string age;
    public Result[] result;
}

[System.Serializable]
public class Result
{
    public string age;
    public float precise_age;
    public string gender;
  
}