test2.cpp
//inference a trained model with a new opencv image by tflite
// Language: cpp
void inference_with_opencv(std::string model_path, std::string image_path){
//load model
tflite::FlatBufferModel model = tflite::FlatBufferModel::BuildFromFile(model_path.c_str());
tflite::ops::builtin::BuiltinOpResolver resolver;
tflite::InterpreterBuilder builder(model, resolver);
std::unique_ptr<tflite::Interpreter> interpreter;
builder(&interpreter);
interpreter->AllocateTensors();
//load image
cv::Mat img = cv::imread(image_path);
cv::resize(img, img, cv::Size(224, 224));
cv::cvtColor(img, img, cv::COLOR_BGR2RGB);
//set input
Tensor* input_tensor = interpreter->tensor(interpreter->inputs()[0]);
int input_height = input_tensor->dims->data[1];
int input_width = input_tensor->dims->data[2];
int input_channels = input_tensor->dims->data[3];
int input_size = input_height * input_width * input_channels;
float* input_data = input_tensor->data.f;
for (int i = 0; i < input_size; ++i) {
input_data[i] = 0.0;
}
//set input image
int input_image_offset = 0;
for (int i = 0; i < input_height; ++i) {
for (int j = 0; j < input_width; ++j) {
for (int k = 0; k < input_channels; ++k) {
int index = i * input_width * input_channels + j * input_channels + k;
input_data[index] = img.data[input_image_offset++];
}
}
}
//run inference
interpreter->Invoke();
//get output
Tensor* output_tensor = interpreter->tensor(interpreter->outputs()[0]);
int output_size = output_tensor->bytes / sizeof(float);
float* output_data = output_tensor->data.f;
//print output
for (int i = 0; i < output_size; ++i) {
printf("%f\n", output_data[i]);
}
//compute softmax
float* softmax = new float[output_size];
for (int i = 0; i < output_size; ++i) {
softmax[i] = exp(output_data[i]) / (exp(output_data[i]) + 1);
}
//print softmax
for (int i = 0; i < output_size; ++i) {
printf("%f\n", softmax[i]);
}
//get top k
int top_k = 5;
std::vector<std::pair<float, int>> vec;
for (int i = 0; i < output_size; ++i) {
vec.push_back(std::make_pair(softmax[i], i));
}
std::sort(vec.begin(), vec.end(), [](const std::pair<float, int>& a, const std::pair<float, int>& b) {
return a.first > b.first;
});
for (int i = 0; i < top_k; ++i) {
printf("%d: %f\n", vec[i].second, vec[i].first);
}
delete[] softmax;
}