Входное изображение в tensorflow-облегченный C

#python #c #tensorflow #tensorflow-lite

#python #c #tensorflow #tensorflow-lite

Вопрос:

Я пытаюсь переместить модель Python Keras в Tensorflow Lite с помощью C для встроенной платформы. Я не знаю, как правильно передавать данные изображения интерпретатору.

У меня есть следующий рабочий код python:

 interpreter = tf.lite.Interpreter(model_path="model.tflite")
print(interpreter.get_input_details())
print(interpreter.get_output_details())
print(interpreter.get_tensor_details())
interpreter.allocate_tensors()

input_details = interpreter.get_input_details()
input_shape = input_details[0]['shape']
print("Input Shape ")
print(input_shape)

image_a = plt.imread('image/0_0_0_copy.jpeg')
image_a = cv2.resize(image_a,(224,224))
image_a = np.asarray(image_a)/255
image_a = np.reshape(image_a,(1,224,224,3))

input_data = np.array(image_a, dtype=np.float32)
interpreter.set_tensor(input_details[0]['index'], input_data)

interpreter.invoke()

output_data = interpreter.get_tensor(output_details[0]['index'])
print("Output Data ")
print(output_data)
  

Форма ввода для изображения (1, 224, 224, 3).
Мне нужен эквивалентный код C для того же. Как мне это перевести?

На данный момент у меня есть следующий код на C :

 int main(){

    std::unique_ptr<tflite::FlatBufferModel> model =
    tflite::FlatBufferModel::BuildFromFile('model.tflite');

    if(!model){
        printf("Failed to map modeln");
        exit(0);
    }

    tflite::ops::builtin::BuiltinOpResolver resolver;
    tflite::InterpreterBuilder builder(*model, resolver);
    std::unique_ptr<tflite::Interpreter> interpreter;

    if(!interpreter){
        printf("Failed to construct interpretern");
        exit(0);
    }

    tflite::PrintInterpreterState(interpreter.get());
    
    interpreter->AllocateTensors();
    interpreter->SetNumThreads(4);
    interpreter->SetAllowFp16PrecisionForFp32(true);

    if(interpreter->AllocateTensors() != kTfLiteOk){
        printf("Failed to allocate tensorsn")
    }
    LOG(INFO) << "tensors size: " << interpreter->tensors_size() << "n";
    LOG(INFO) << "nodes size: " << interpreter->nodes_size() << "n";
    LOG(INFO) << "inputs: " << interpreter->inputs().size() << "n";
    LOG(INFO) << "input(0) name: " << interpreter->GetInputName(0) << "n";

    float* input = interpreter->typed_input_tensor<float>(0);
    // Need help here

    interpreter->Invoke();

    float* output = interpreter->typed_output_tensor<float>(0);

    printf("output1 = %fn", output[0]);
    printf("output2 = %fn", output[1]);


    return 0;
}
  

Ответ №1:

Я решил проблему таким образом.

Создайте интерпретатор как обычно:

 // Load model
std::unique_ptr<tflite::FlatBufferModel> model = tflite::FlatBufferModel::BuildFromFile(filename);
TFLITE_MINIMAL_CHECK(model != nullptr);

// Build the interpreter
tflite::ops::builtin::BuiltinOpResolver resolver;
compute_engine::tflite::RegisterLCECustomOps(amp;resolver);
enter code here

InterpreterBuilder builder(*model, resolver);
std::unique_ptr<Interpreter> interpreter;
builder(amp;interpreter);
TFLITE_MINIMAL_CHECK(interpreter != nullptr);

TFLITE_MINIMAL_CHECK(interpreter->AllocateTensors() == kTfLiteOk);
  

Чтобы получить форму ввода:

 const std::vector<int>amp; t_inputs = interpreter->inputs();
TfLiteTensor* tensor = interpreter->tensor(t_inputs[0]);

// input size - for a cnn is four: (batch_size, h, w, channels)
input_size = tensor->dims->size;

batch_size = tensor->dims->data[0];
h = tensor->dims->data[1];
w = tensor->dims->data[2];
channels = tensor->dims->data[3];
  

Это сработало для меня. Я надеюсь, что это будет полезно и для вас.

Ссылка: https://www.tensorflow.org/lite/microcontrollers/get_started

Комментарии:

1. Привет, не могли бы вы, пожалуйста, помочь мне с тем, как преобразовать мое изображение с размерами 160x160x3 в 1x160x160x3, а затем установить для него входной тензор для выполнения вывода.

2. Привет @AparajitGarg. Если я хорошо помню, нет необходимости расширять изображение до тензора 4D. В tflite входной слой модели представляет собой одномерный буфер, который байт за байтом заполняется изображением. Пожалуйста, проверьте функцию ProcessInputWithFloatModel здесь: github.com/bferrarini/FloppyNet_TRO/blob/master/FloppyNet_TRO /.