Я пытаюсь выполнить Классификацию изображений с помощью следующего процесса в Unity3D:
- Создайте модель CNN, используя python 3.7.6, Tensorflow 2.0.0 (но используя приведенную ниже команду для получить совместимость с прежними версиями)
import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()
Сохранение модели с помощью команды tenorflow.save (model) в формате .pb Изменение расширения .pb вручную на .bytes Создание проекта Unity3D в 2018.11ff * Импорт плагина TensorflowSharp в проект Импорт модели в проекте Написан следующий скрипт в Unity3D
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
using TensorFlow;
using System.Drawing;
using System.Linq;
public class InitialScript : MonoBehaviour
{
[Header("Constants")]
private const int INPUT_SIZE = 70;
private const int IMAGE_MEAN = 117;
private const float IMAGE_STD = 1;
private const string INPUT_TENSOR = "input";
private const string OUTPUT_TENSOR = "output";
[Header("Inspector Stuff")]
public TextAsset model;
private TFGraph graph;
private TFSession session;
private string [] labels;
TextAsset graphModel;
string imageFileName = "Images/84";
Texture2D image;
int[] quantized;
// Start is called before the first frame update
void Start()
{
//startScript();
// newStartScript();
instantiateValues();
}
void instantiateValues() {
#if UNITY_ANDROID
TensorFlowSharp.Android.NativeBinding.Init();
#endif
//load graph
graph = new TFGraph ();
//graph.Import (model.bytes);
graph.Import(File.ReadAllBytes(Application.dataPath + "/Resources/retrained_graph.bytes"));
session = new TFSession (graph);
ProcessImage();
}
void ProcessImage(){
//pass in input tensor
Texture2D image = duplicateTexture(Resources.Load("Images/84") as Texture2D);
Debug.Log (image.width);
Debug.Log (image.height);
var matrix = new float[1, image.height, image.width, 1];
for (var iy = 0; iy < image.height; iy++)
{
for (int ix = 0, index = iy * image.width; ix < image.width; ix++, index++)
{
UnityEngine.Color pixel = image.GetPixel(ix, iy);
matrix[0, iy, ix, 0] = pixel.b / 255.0f;
}
}
TensorFlow.TFTensor tensor = matrix;
// var tensor = TransformInput (camFeed.GetImage (), INPUT_SIZE, INPUT_SIZE);
var runner = session.GetRunner();
runner.AddInput (graph [INPUT_TENSOR] [0], tensor).Fetch (graph [OUTPUT_TENSOR] [0]);
var output = runner.Run();
//put results into one dimensional array
float[] probs = ((float [] [])output[0].GetValue (jagged: true)) [0];
//get max value of probabilities and find its associated label index
float maxValue = probs.Max ();
int maxIndex = probs.ToList ().IndexOf (maxValue);
//print label with highest probability
string label = labels [maxIndex];
print (label);
}
}
On line
graph.Import(File.ReadAllBytes(Application.dataPath + "/Resources/retrained_graph.bytes"));
Я получаю сообщение об ошибке выполнения, следующее:
TFException: NodeDef упоминает attr 'Truncate', который не указан в Op y: DstT; атр = SrcT: тип; атр = DSTT: тип>; NodeDef: Cast = CastDstT = DT_FLOAT, SrcT = DT_UINT8, Truncate = false. (Проверьте, соответствует ли ваш двоичный файл, интерпретирующий GraphDef, вашему двоичному файлу, генерирующему GraphDef.). TensorFlow.TFStatus.CheckMaybeRaise (TensorFlow.TFStatus incomingStatus, System.Boolean последний) (при <6ed6db22f8874deba74ffe3e566039be>: 0) TensorFlow.TFGraph.Import (TensorFlow.TFBuffer graphDef, опции TensorFlow.TFImportGraphDefOptions, TensorFlow.TFStatus статус) (при <6ed6db22f8874deba74ffe3e566039be> : 0) TensorFlow.TFGraph. префикс, состояние TensorFlow.TFStatus) (в <6ed6db22f8874deba74ffe3e566039be>: 0) InitialScript.instantiateValues () (в Assets / Scripts / InitialScript.cs: 44) InitialScript.Start () (в Assets / Scripts / InitialScript.cs: 34)
Я правда не знаю, что не так? Если кто-то может помочь в этом отношении?