Я пытаюсь обработать изображение в 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