// Copyright 2019 The MediaPipe Authors. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef MEDIAPIPE_CALCULATORS_TENSOR_INFERENCE_CALCULATOR_H_ #define MEDIAPIPE_CALCULATORS_TENSOR_INFERENCE_CALCULATOR_H_ #include <algorithm> #include <functional> #include <memory> #include <string> #include <utility> #include <vector> #include "absl/status/status.h" #include "absl/status/statusor.h" #include "mediapipe/calculators/tensor/inference_calculator.pb.h" #include "mediapipe/calculators/tensor/inference_io_mapper.h" #include "mediapipe/calculators/tensor/tensor_span.h" #include "mediapipe/framework/api2/node.h" #include "mediapipe/framework/api2/packet.h" #include "mediapipe/framework/api2/port.h" #include "mediapipe/framework/calculator_framework.h" #include "mediapipe/framework/formats/tensor.h" #include "mediapipe/framework/port/status_macros.h" #include "mediapipe/util/tflite/tflite_model_loader.h" #include "tensorflow/lite/core/api/op_resolver.h" #include "tensorflow/lite/kernels/register.h" namespace mediapipe { namespace api2 { // Runs inference on the provided input Tensors and TFLite model. // // Creates an interpreter with given model and calls invoke(). // Optionally run inference on CPU/GPU. // // This calculator can be used with TensorConverterCalculator to get the // appropriate inputs. // // When the input tensors are on CPU, gpu inference is optional and can be // specified in the calculator options. // When the input tensors are on GPU, inference is GPU and output can be CPU or // GPU. // // Input: // TENSORS - Vector of Tensors // // Output: // TENSORS - Vector of Tensors // // Input side packet: // CUSTOM_OP_RESOLVER (optional) // DEPRECATED: prefer to use the "OP_RESOLVER" input side packet instead. // Use a custom op resolver, instead of the builtin one. // OP_RESOLVER (optional) // Use to provide tflite op resolver (tflite::OpResolver) // MODEL (optional) // Use to specify TfLite model. // (std::unique_ptr<tflite::FlatBufferModel, // std::function<void(tflite::FlatBufferModel*)>>) // DELEGATE (optional) // Use to specify special values per a particular delegate. // (InferenceCalculatorOptions::Delegate) // IO_CONFIG (optional) // Use to specify input/output remapping. // (InferenceCalculatorOptions::InputOutputConfig) // // NOTE: InferenceCalculator, being a subgraph which is replaced by concrete // implementations/calculators during the graph expansion, cannot access // side packets, and DELEGATE side packet rarely (only if concrete // implementations/calculators allow that) can be used to switch between // delegates. // // Example use: // node { // calculator: "InferenceCalculator" // input_stream: "TENSORS:tensor_image" // output_stream: "TENSORS:tensors" // options: { // [mediapipe.InferenceCalculatorOptions.ext] { // model_path: "modelname.tflite" // } // } // } // // or // // node { // calculator: "InferenceCalculator" // input_stream: "TENSORS:tensor_image" // input_side_packet: "MODEL:model" // output_stream: "TENSORS:tensors" // options: { // [mediapipe.InferenceCalculatorOptions.ext] { // model_path: "modelname.tflite" // delegate { gpu {} } // } // } // } // // IMPORTANT Notes: // Tensors are assumed to be ordered correctly (sequentially added to model). // Input tensors are assumed to be of the correct size and already normalized. class InferenceCalculator : public NodeIntf { … }; struct InferenceCalculatorSelector : public InferenceCalculator { … }; struct InferenceCalculatorGl : public InferenceCalculator { … }; struct InferenceCalculatorGlAdvanced : public InferenceCalculator { … }; struct InferenceCalculatorMetal : public InferenceCalculator { … }; struct InferenceCalculatorCpu : public InferenceCalculator { … }; struct InferenceCalculatorXnnpack : public InferenceCalculator { … }; // For Process overriding, we subclass Impl rather than Intf // Subclasses must implement InferenceCalculatorNodeImpl's `Process` method. template <class Intf, class Impl = void> class InferenceCalculatorNodeImpl : public NodeImpl<Intf, Impl> { … }; } // namespace api2 } // namespace mediapipe #endif // MEDIAPIPE_CALCULATORS_TENSOR_INFERENCE_CALCULATOR_H_