Как прочитать результаты 4-мерного массива в C # из вывода тензорной модели с обнаружением объекта изображения - PullRequest
0 голосов
/ 07 февраля 2019

Я пытаюсь обработать изображение в C # с помощью предварительно обученной модели тензорного потока, экспортированной из Azure Custom Vision с использованием обнаружения объектов.Как мне разобрать результаты графа, которые возвращаются в виде 4-х мерного массива.Я хочу получить тег,% прогноза и ограничивающий прямоугольник.

Я работаю с tenorflow уже несколько недель, так что это все довольно ново для меня.Мой код работал с аналогичной моделью, экспортированной из Azure Custom Vision, но с использованием классификации изображений и результатов было намного легче читать.Теперь, переключаясь на более надежную модель, я не уверен, как читать результаты.Я был в состоянии проанализировать результаты в 4-мерном массиве, но не могу понять это после этого.Мне удалось проверить узел вывода модели с помощью тензорной доски, и это DT_FLOAT.

Я использую библиотеку TensowflowSharp в версии 1.12.0

Вот пример, которому я несколько следовал, но я думаю, что модель, использованная в этом примере, была обучена не так, как в Azure.Что дает разные результаты для чтения из графика.Я получаю неопределенный при попытке выполнить те же операции извлечения в примере по ссылке ниже.Это также подтверждается использованием graph.getEnumeration () как для моей модели, так и для модели из примера. C # Пример обнаружения объекта Tensorflow

Объявления модели и метки (тега):

private static readonly byte[] model = File.ReadAllBytes(Path.Combine("./Assets/model.pb"));
private static readonly string[] labels = File.ReadAllLines(Path.Combine("./Assets/labels.txt"));

Входной параметр для изображения:

[Blob("{data.url}", FileAccess.Read)] Stream input,

Обработка:

using (var graph = new TFGraph()) {                          
     graph.Import(new TFBuffer(model));


     using (var session = new TFSession(graph)) {                                
          var tensor = TensorFlowHelper.CreateTensorFromImageFile(input);
          var runner = session.GetRunner();
          runner.AddInput(graph["Placeholder"][0], tensor)
                .Fetch(graph["model_outputs"][0]);
          var output = runner.Run();
          var result = output[0];
          var probabilities = ((float[][][][])result.GetValue(jagged: true))[0];
          Console.WriteLine(probabilities);
      }
}

TensorFlowHelper.CreateTensorFromImageFile:

var tensor = TFTensor.CreateString(contents);
TFOutput input, output;
// Construct a graph to normalize the image
using (var graph = ConstructGraphToNormalizeImage(out input, out output, destinationDataType)) {
// Execute that graph to normalize this one image
    using (var session = new TFSession(graph)) {
        var normalized = session.Run(
               inputs: new[] { input },
               inputValues: new[] { tensor },                                            
               outputs: new[] { output });
        return normalized[0];
    }
 }

ConstructGraphToNormalizeImage:

const int W = 224;
const int H = 224;
const float Mean = 117;
const float Scale = 1;

var graph = new TFGraph();
input = graph.Placeholder(TFDataType.String);
output = graph.Cast(graph.Div(
            x: graph.Sub(
              x: graph.ResizeBilinear(
                images: graph.ExpandDims(
                      input: graph.Cast(
                          graph.DecodeJpeg(contents: input, channels: 3), DstT: TFDataType.Float),
                      dim: graph.Const(0, "make_batch")),
                size: graph.Const(new int[] { W, H }, "size")),
              y: graph.Const(Mean, "mean")),
            y: graph.Const(Scale, "scale")), destinationDataType);

return graph;

Я ожидаю, что смогу проанализировать результаты, аналогичные конечной точке API прогнозирования Azure.Аналогично результатам, найденным в их документации. Документация по API пользовательского видения Microsoft Visual Vision

...