bool TensorFlow::doTFLite(int imgHeight, int imgWidth) { Q_UNUSED(imgHeight); Q_UNUSED(imgWidth); try{ // Open model & assign error reporter model = AuxUtils::getDefaultModelFilename().trimmed().isEmpty() && AuxUtils::getDefaultLabelsFilename().trimmed().isEmpty() ? nullptr : FlatBufferModel::BuildFromFile(filename.toStdString().c_str(),&error_reporter); if(model == nullptr) { qDebug() << "TensorFlow model loading: ERROR"; return false; } // Link model & resolver InterpreterBuilder builder(*model.get(), resolver); // Check interpreter if(builder(&interpreter) != kTfLiteOk) { qDebug() << "Interpreter: ERROR"; return false; } // Apply accelaration (Neural Network Android) interpreter->UseNNAPI(accelaration); if(interpreter->AllocateTensors() != kTfLiteOk) { qDebug() << "Allocate tensors: ERROR"; return false; } // Set kind of network // WARNING: It is assumed the kind of network depending on the number of outputs kind_network = interpreter->outputs().size()>1 ? knOBJECT_DETECTION : knIMAGE_SEGMENTATION; if (verbose) { int i_size = interpreter->inputs().size(); int o_size = interpreter->outputs().size(); int t_size = interpreter->tensors_size(); qDebug() << "tensors size: " << t_size; qDebug() << "nodes size: " << interpreter->nodes_size(); qDebug() << "inputs: " << i_size; qDebug() << "outputs: " << o_size; for (int i = 0; i < i_size; i++) qDebug() << "input" << i << "name:" << interpreter->GetInputName(i) << ", type:" << interpreter->tensor(interpreter->inputs()[i])->type; for (int i = 0; i < o_size; i++) qDebug() << "output" << i << "name:" << interpreter->GetOutputName(i) << ", type:" << interpreter->tensor(interpreter->outputs()[i])->type; // for (int i = 0; i < t_size; i++) // { // if (interpreter->tensor(i)->name) // qDebug() << i << ":" << interpreter->tensor(i)->name << "," // << interpreter->tensor(i)->bytes << "," // << interpreter->tensor(i)->type << "," // << interpreter->tensor(i)->params.scale << "," // << interpreter->tensor(i)->params.zero_point; // } } // Get input dimension from the input tensor metadata // Assuming one input only int input = interpreter->inputs()[0]; TfLiteIntArray* dims = interpreter->tensor(input)->dims; // Save outputs outputs.clear(); for(unsigned int i=0;ioutputs().size();i++) outputs.push_back(interpreter->tensor(interpreter->outputs()[i])); wanted_height = dims->data[1]; wanted_width = dims->data[2]; wanted_channels = dims->data[3]; if (verbose) { qDebug() << "Wanted height:" << wanted_height; qDebug() << "Wanted width:" << wanted_width; qDebug() << "Wanted channels:" << wanted_channels; } if (numThreads > 1) interpreter->SetNumThreads(numThreads); // Read labels if (readLabels()) qDebug() << "There are" << labels.count() << "labels."; else qDebug() << "There are NO labels"; qDebug() << "Tensorflow initialization: OK"; return true; }catch(...) { qDebug() << "Exception loading model"; return false; } } debug output log: // ====== VPUENC: 4.5.7 build on Mar 11 2021 10:14:03. ====== // wrapper: 3.0.0 (VPUWRAPPER_ARM64_LINUX Build on Mar 11 2021 09:09:18) // vpulib: 1.1.1 // firmware: 1.1.1.43690 // ERROR: Interpreter::UseNNAPI is not supported. Use Interpreter::ModifyGraphWithDelegate instead. // tensors size: 185 // nodes size: 70 // inputs: 1 // outputs: 1 // input 0 name: sub_7 , type: 1 // output 0 name: ResizeBilinear_3 , type: 1 // Wanted height: 257 // Wanted width: 257 // Wanted channels: 3 // There are 0 labels. // Tensorflow initialization: OK // Elapsed time: 147 milliseconds // Elapsed time: 182 milliseconds // Elapsed time: 182 milliseconds // Elapsed time: 181 milliseconds // Elapsed time: 181 milliseconds // Elapsed time: 172 milliseconds