本日は先日使用したユーザーローカルの顔認識AIの結果を活用します。
前回はAPIキーを基に顔写真の画像をアップロードし、結果を受け取りDebug.Logで表示させるということを行いました。
今回はLogではなく、活用できる形でプロジェクト内で使用できるようにします。
〇準備
前回の記事のスクリプトを組み、ユーザーローカルの顔認識AIの結果をDebug.Log表示している状態から始めます。
〇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]を追加します。
②FacialRecognitionコンポーネントがアタッチされているオブジェクトのageTextに作成したTextをアタッチします。
③Unityを実行して前回同様筆者の顔写真をアップロードします。
実行するとテキストに年齢が表示されます。
以上でユーザーローカルの顔認識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; }