Files
SpotMicroESP32-Leika/esp32/lib/ESP32-sveltekit/NeuralNetwork.cpp
T
Rune Harlyk ef4e476b89 📦 Moves NN
2024-08-18 17:06:05 +02:00

67 lines
2.3 KiB
C++

#include "NeuralNetwork.h"
#include "tensorflow/lite/micro/all_ops_resolver.h"
#include "tensorflow/lite/micro/micro_error_reporter.h"
#include "tensorflow/lite/micro/micro_interpreter.h"
#include "tensorflow/lite/schema/schema_generated.h"
#include "tensorflow/lite/version.h"
NeuralNetwork::NeuralNetwork(const void *model_data, const int kArenaSize) : _kArenaSize(kArenaSize) {
error_reporter = new tflite::MicroErrorReporter();
model = tflite::GetModel(model_data);
if (model->version() != TFLITE_SCHEMA_VERSION) {
TF_LITE_REPORT_ERROR(error_reporter, "Model provided is schema version %d not equal to supported version %d.",
model->version(), TFLITE_SCHEMA_VERSION);
return;
}
// This pulls in the operators implementations we need
resolver = new tflite::MicroMutableOpResolver<10>();
resolver->AddFullyConnected();
resolver->AddMul();
resolver->AddAdd();
resolver->AddLogistic();
resolver->AddReshape();
resolver->AddQuantize();
resolver->AddDequantize();
tensor_arena = (uint8_t *)malloc(_kArenaSize);
if (!tensor_arena) {
TF_LITE_REPORT_ERROR(error_reporter, "Could not allocate arena");
return;
}
// Build an interpreter to run the model with.
interpreter = new tflite::MicroInterpreter(model, *resolver, tensor_arena, _kArenaSize, error_reporter);
// Allocate memory from the tensor_arena for the model's tensors.
TfLiteStatus allocate_status = interpreter->AllocateTensors();
if (allocate_status != kTfLiteOk) {
TF_LITE_REPORT_ERROR(error_reporter, "AllocateTensors() failed");
return;
}
size_t used_bytes = interpreter->arena_used_bytes();
TF_LITE_REPORT_ERROR(error_reporter, "Used bytes %d\n", used_bytes);
// Obtain pointers to the model's input and output tensors.
input = interpreter->input(0);
output = interpreter->output(0);
}
void NeuralNetwork::setInput(float value) { input->data.f[0] = value; }
float NeuralNetwork::predict(float value) {
setInput(value);
return predict();
}
float NeuralNetwork::predict() {
TfLiteStatus invoke_status = interpreter->Invoke();
if (invoke_status != kTfLiteOk) {
TF_LITE_REPORT_ERROR(error_reporter, "Invoke failed!");
return -1;
}
return output->data.f[0];
}