Использовать начальную модель обслуживания тензорного потока с использованием клиента C # (PREDICT API) - PullRequest
0 голосов
/ 14 февраля 2019

Я пытался реализовать клиентское приложение C # для взаимодействия с обслуживающим сервером Tensorflow в течение нескольких недель безуспешно.У меня есть клиент Python, который успешно работает, но я не могу скопировать его функциональность с C #.Клиент Python

import requests
#import json
from keras.preprocessing.image import img_to_array, array_to_img, load_img
from keras.preprocessing import image

flowers = 'c:/flower_photos/cars/car1.jpg'
image1 = img_to_array(image.load_img(flowers, target_size=(128,128))) / 255
payload = {
      "instances": [{"image":image1.tolist()},
]
}
print("sending request...")
r = requests.post('http://localhost:8501/v1/models/flowers/versions/1:predict', json=payload)
print(r.content)

Сервер отвечает правильно.Я использую Tensorflow версии 1.12.0 с соответствующим последним обслуживающим образом.Все они работают нормально.

Согласно документации REST API , структура API дана, но она мне совершенно не ясна.Мне нужно отправить изображение на сервер.Как я могу добавить полезную нагрузку изображения в запрос JSON в C #?Пройдя по многим сайтам, я обнаружил, что изображение должно быть в base64string.

Итак, я сделал преобразование изображения в base64

private string GetBase64ImageBytes(string ImagePath)
{
    using (Image image = Image.FromFile(ImagePath))
    {
        using (MemoryStream m = new MemoryStream())
        {
            image.Save(m, image.RawFormat);
            byte[] imageBytes = m.ToArray();

            // Convert byte[] to Base64 String
            string base64String = Convert.ToBase64String(imageBytes);
            return base64String;
        }
    }
}

Часть запроса выглядит следующим образом: (сервер отвечает метаданнымиправильно для запроса GET)

public string PostImageToServerAndClassify(string imageArray)
        {
            ///6047536/kak-otpravit-json-na-server-s-pomoschy-c
            string result = null;
            string ModelName = cmbProjectNames.Text.Replace(" ", "");
            string status_url = String.Format("http://localhost:{0}/v1/models/{1}/versions/{2}:predict", txtPort.Text, ModelName, txtVersion.Text);
            var httpWebRequest = (HttpWebRequest)WebRequest.Create(status_url);
            httpWebRequest.ContentType = "application/json";
            httpWebRequest.Method = "POST";

            try
            {
                using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
                {
                    //                    string json = "{"+ @"""instances""" + ": [{" + @"""image""" + @":" + imageArray + "}]}";
                 //   imageArray = @""" + imageArray + @""";
                    string json = "{ " + @"""instances""" + ": [{" + @"""image""" + @": { " + @"""b64"": """ + imageArray + @"""}}]}";

                    streamWriter.Write(json);
                    streamWriter.Flush();
                    streamWriter.Close();
                }
                var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
                using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
                {
                    result = streamReader.ReadToEnd();
                }
            }
            catch (Exception ex)
            {
                result = ex.Message;
            }
            return result;
        }

При запросе POST я получаю сообщение об ошибке «Удаленный сервер возвратил ошибку: (400) Bad Request.».Также сервер прекращает свою службу.В Почтальоне я получаю подробную информацию об ошибке как:

{ "error": "Failed to process element: 0 key: image of \'instances\' list. Error: Invalid argument: JSON Value: {\n    \"b64\": \"/9j/4AAQSkZJRgABAQEAAAAAAAD/4QBSRXhpZgAATU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAZKGAAcAAAAcAAAALAAAAABVTklDT0RFAABBAHAAcABsAGUATQBhAHIAaw ... .....(image string data)

Так что, похоже, я отправляю неверный формат данных.Может кто-нибудь сказать мне, что здесь не так?Любой пример преобразования изображения и POST-запроса высоко ценится.Я нигде не могу найти, что формат base64string является правильным форматом для изображения на сайте TF .Формат данных клиента Python отличается, поэтому на самом деле нужно знать, какой формат является правильным для любых справочных документов.Ближайшая ссылка, которую я нашел здесь с клиентом JAVA, но не работал с моим, может быть связана с разницей в версии TF.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...