Создание TF_Tensor типа TF_STRING в API Tensorflow C - PullRequest
0 голосов
/ 18 марта 2020

Я пытаюсь преобразовать изображение в TF_Tensor типа TF_STRING, используя C API . Шаг кодирования проходит просто отлично, но когда я передаю его на модель , он возвращает сообщение об ошибке, в котором указано invalid string encoding or truncated src buffer

Вот некоторый (грубый) код, который я использовал для построения закодированная строка из изображения:


// ------------------------ CREATE IMAGE TENSOR ---------------------------------------- //
// **char* image**                   - points to the buffer containing the image read from file in "rb" mode
// **const unsigned int imageSize**  - is the length of the buffer above

std::vector<int64_t> inputDims = { static_cast<int64_t>(TF_DataTypeSize(TF_UINT64)) + static_cast<int64_t>(imageSize) };
size_t encodedSize = TF_StringEncodedSize(imageSize);
size_t totalSize = TF_DataTypeSize(TF_UINT64) + encodedSize;
char* encodedInput = new char[totalSize];
for (size_t i = 0; i < TF_DataTypeSize(TF_UINT64); i++)
  encodedInput[i] = 0;

TF_StringEncode((const char*)image.data, imageSize, encodedInput + 8, encodedSize, status);
if (TF_GetCode(status) != TF_OK) {
  std::cerr << "Failed to encode image\n"; // The code enters this block and TF_Message(status) returns nothing to the output stream
  std::cerr << TF_Message(status) << std::endl;
  return false;
}

TF_Tensor* input = TF_NewTensor(TF_STRING, inputDims.data(), inputDims.size(), encodedInput, totalSize, NULL, 0);


// --------------------------------- Run SESSION -------------------------------------- // 
/* ----------------------------------------------
Forked from - https://github.com/danishshres/ssd_c_api/ConsoleApplication5.cpp
Original Author - danishshresh
------------------------------------------------ */ 
    // Setup inputs and outputs
    std::vector<TF_Output>  input_tensors, output_tensors;
    std::vector<TF_Tensor*> input_values, output_values;

    input_tensors.push_back({ TF_GraphOperationByName(graph, "encoded_image_string_tensor"), 0 });
    input_values.push_back(input);

    output_tensors.push_back({ TF_GraphOperationByName(graph, "detection_classes"),0 });
    output_values.push_back(nullptr);

    output_tensors.push_back({ TF_GraphOperationByName(graph, "detection_scores"),0 });
    output_values.push_back(nullptr);

    output_tensors.push_back({ TF_GraphOperationByName(graph, "detection_boxes"),0 });
    output_values.push_back(nullptr);


    // Run the session
    TF_SessionRun(sess, nullptr,
        &input_tensors[0], &input_values[0], input_values.size(),
        &output_tensors[0], &output_values[0], 3, //3 is the number of outputs count..
        nullptr, 0, nullptr, status
    );

    // Check if the run was successful
    if (TF_GetCode(status) != TF_OK){
        std::cout << "ERROR: SessionRun: " << TF_Message(status) << "\n";
        return false;
    }


Как правильно создать TF_Tensor типа TF_STRING для изображения? Входной узел: 'encoded_image_string_tensor: 0' Значение по умолчанию: [""]

...