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; } auto delegate = tflite::interpreter::tflitedelegateptr(1 ? tflite::nnapidelegate() : nullptr, [](tflitedelegate*) {}); if (delegate == nullptr) { qdebug() << "nn-api disabled"; } else { if (interpreter->modifygraphwithdelegate(delegate.get()) != ktfliteok){ qdebug() <<"failed to apply nn-api delegate"; } else { qdebug() << "nn-api applied sucessfully"; } } 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 // INFO: Created TensorFlow Lite delegate for NNAPI. // WARNING: Operator RESIZE_BILINEAR (v1) refused by NNAPI delegate: Operator refused due performance reasons. // WARNING: Operator RESIZE_BILINEAR (v1) refused by NNAPI delegate: Operator refused due performance reasons. // WARNING: Operator RESIZE_BILINEAR (v1) refused by NNAPI delegate: Operator refused due performance reasons. // NN-API applied sucessfully // tensors size: 185 // nodes size: 72 // 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 // ERROR: NN API returned error ANEURALNETWORKS_BAD_DATA at line 3615 while running computation. // ERROR: Node number 70 (TfLiteNnapiDelegate) failed to invoke. // Failed to invoke interpreter