blob: 3d950a28eaa06dee861789ac1bccf99ba5a3a9ea [file] [log] [blame]
#include "pluginInference.h"
// Std libraries
#include <cstring>
#include <numeric>
#include "pluglog.h"
const char sep = separator();
const std::string TAG = "FORESEG";
namespace jami
{
PluginInference::PluginInference(TFModel model) : TensorflowInference(model)
{
#ifndef TFLITE
//Initialize TENSORFLOW_CC lib
static const char* kFakeName = "fake program name";
int argc = 1;
char* fake_name_copy = strdup(kFakeName);
char** argv = &fake_name_copy;
tensorflow::port::InitMain(kFakeName, &argc, &argv);
if (argc > 1) {
Plog::log(Plog::LogPriority::INFO, "TENSORFLOW INIT", "Unknown argument " );
}
free(fake_name_copy);
#endif //TFLITE
}
PluginInference::~PluginInference(){}
#ifdef TFLITE
std::pair<uint8_t *, std::vector<int>> PluginInference::getInput()
{
// Plog::log(Plog::LogPriority::INFO, TAG, "inside getInput()");
// We assume that we have only one input
// Get the input index
int input = interpreter->inputs()[0];
uint8_t *inputDataPointer = interpreter->typed_tensor<uint8_t>(input);
// Get the input dimensions vector
std::vector<int> dims = getTensorDimensions(input);
return std::make_pair(inputDataPointer, dims);
}
// // Types returned by tensorflow
// int type = interpreter->tensor(outputIndex)->type
// typedef enum {
// kTfLiteNoType = 0,
// kTfLiteFloat32 = 1, float
// kTfLiteInt32 = 2, int // int32_t
// kTfLiteUInt8 = 3, uint8_t
// kTfLiteInt64 = 4, int64_t
// kTfLiteString = 5,
// kTfLiteBool = 6,
// kTfLiteInt16 = 7, int16_t
// kTfLiteComplex64 = 8,
// kTfLiteInt8 = 9, int8_t
// kTfLiteFloat16 = 10, float16_t
// } TfLiteType;
std::vector<float>
PluginInference::masksPredictions() const
{
// Plog::log(Plog::LogPriority::INFO, TAG, "inside masksPredictions()");
int outputIndex = interpreter->outputs()[0];
std::vector<int> dims = getTensorDimensions(outputIndex);
int totalDimensions = 1;
for (size_t i = 0; i < dims.size(); i++)
{
totalDimensions *= dims[i];
}
std::vector<float> out;
int type = interpreter->tensor(outputIndex)->type;
switch(type)
{
case 2:
{
int* outputDataPointer = interpreter->typed_tensor<int>(outputIndex);
std::vector<int> output(outputDataPointer, outputDataPointer + totalDimensions); //when mod model
out=std::vector<float>(output.begin(), output.end());
break;
}
case 4:
{
int64_t* outputDataPointer = interpreter->typed_tensor<int64_t>(outputIndex);
std::vector<int64_t> output(outputDataPointer, outputDataPointer + totalDimensions); //when orig model
out=std::vector<float>(output.begin(), output.end());
break;
}
}
return out;
}
void PluginInference::setExpectedImageDimensions()
{
// Plog::log(Plog::LogPriority::INFO, TAG, "inside setExpectedImageDimensions()");
// We assume that we have only one input
// Get the input index
int input = interpreter->inputs()[0];
// Get the input dimensions vector
std::vector<int> dims = getTensorDimensions(input);
// Relevant data starts from index 1, dims.at(0) = 1
imageWidth = dims.at(1);
imageHeight = dims.at(2);
imageNbChannels = dims.at(3);
}
#else //TFLITE
// Given an image file name, read in the data, try to decode it as an image,
// resize it to the requested size, and then scale the values as desired.
void PluginInference::ReadTensorFromMat(const cv::Mat& image)
{
// std::ostringstream oss;
// oss << image.rows;
// Plog::log(Plog::LogPriority::INFO, "ReadTensorFromMat", oss.str());
tensorflow::StringPiece tmp_data = imageTensor.tensor_data();
// oss << image.rows;
// Plog::log(Plog::LogPriority::INFO, "ReadTensorFromMat", oss.str());
memcpy(const_cast<char*>(tmp_data.data()), (image.data), image.rows * image.cols * sizeof(uint8_t));
}
std::vector<float>
PluginInference::masksPredictions() const
{
std::ostringstream oss;
std::vector<int> dims;
int flatSize = 1;
int num_dimensions = outputs[0].shape().dims();
// oss << num_dimensions;
for(int ii_dim=0; ii_dim<num_dimensions; ii_dim++) {
// oss << " " << outputs[0].shape().dim_size(ii_dim);
dims.push_back(outputs[0].shape().dim_size(ii_dim));
flatSize *= outputs[0].shape().dim_size(ii_dim);
}
// oss << " " << flatSize;
// Plog::log(Plog::LogPriority::INFO, "masksPredictions", oss.str());
std::vector<float> out;
int type = outputs[0].dtype();
// oss << " " << type;
// Plog::log(Plog::LogPriority::INFO, "masksPredictions", oss.str());
switch(type)
{
case tensorflow::DataType::DT_INT32:
{
for (int offset = 0; offset < flatSize; offset++)
{
// Get vaule through .flat()
out.push_back(static_cast<float> (outputs[0].flat<tensorflow::int32>()(offset)));
}
break;
}
case tensorflow::DataType::DT_INT64:
{
for (int offset = 0; offset < flatSize; offset++)
{
// Get vaule through .flat()
// if (outputs[0].flat<tensorflow::int64>()(offset) == 15 or outputs[0].flat<tensorflow::int64>()(offset) == 1)
// {
// oss << " " << outputs[0].flat<tensorflow::int64>()(offset);
// Plog::log(Plog::LogPriority::INFO, "masksPredictions", oss.str());
// }
out.push_back(static_cast<float> (outputs[0].flat<tensorflow::int64>()(offset)));
}
break;
}
default:
{
for (int offset = 0; offset < flatSize; offset++)
{
// Get vaule through .flat()
out.push_back(0);
}
break;
}
}
return out;
}
void PluginInference::setExpectedImageDimensions()
{
if (tfModel.dims[1] != 0)
{
imageWidth = tfModel.dims[1];
}
if (tfModel.dims[2] != 0)
{
imageHeight = tfModel.dims[2];
}
if (tfModel.dims[3] != 0)
{
imageNbChannels = tfModel.dims[3];
}
}
#endif
int PluginInference::getImageWidth() const
{
// Plog::log(Plog::LogPriority::INFO, TAG, "inside getImageWidth()");
return imageWidth;
}
int PluginInference::getImageHeight() const
{
// Plog::log(Plog::LogPriority::INFO, TAG, "inside getImageHeight()");
return imageHeight;
}
int PluginInference::getImageNbChannels() const
{
// Plog::log(Plog::LogPriority::INFO, TAG, "inside getImageNbChannels()");
return imageNbChannels;
}
} // namespace jami