mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
avfilter/dnn: get the data type of network output from dnn execution result
so, we can make a filter more general to accept different network models, by adding a data type convertion after getting data from network. After we add dt field into struct DNNData, it becomes the same as DNNInputData, so merge them with one struct: DNNData. Signed-off-by: Guo, Yejun <yejun.guo@intel.com> Signed-off-by: Pedro Arthur <bygrandao@gmail.com>
This commit is contained in:
parent
dff39ea9f0
commit
e1b45b8596
@ -28,7 +28,7 @@
|
|||||||
#include "dnn_backend_native_layer_conv2d.h"
|
#include "dnn_backend_native_layer_conv2d.h"
|
||||||
#include "dnn_backend_native_layers.h"
|
#include "dnn_backend_native_layers.h"
|
||||||
|
|
||||||
static DNNReturnType set_input_output_native(void *model, DNNInputData *input, const char *input_name, const char **output_names, uint32_t nb_output)
|
static DNNReturnType set_input_output_native(void *model, DNNData *input, const char *input_name, const char **output_names, uint32_t nb_output)
|
||||||
{
|
{
|
||||||
ConvolutionalNetwork *network = (ConvolutionalNetwork *)model;
|
ConvolutionalNetwork *network = (ConvolutionalNetwork *)model;
|
||||||
DnnOperand *oprd = NULL;
|
DnnOperand *oprd = NULL;
|
||||||
@ -263,6 +263,7 @@ DNNReturnType ff_dnn_execute_model_native(const DNNModel *model, DNNData *output
|
|||||||
outputs[i].height = oprd->dims[1];
|
outputs[i].height = oprd->dims[1];
|
||||||
outputs[i].width = oprd->dims[2];
|
outputs[i].width = oprd->dims[2];
|
||||||
outputs[i].channels = oprd->dims[3];
|
outputs[i].channels = oprd->dims[3];
|
||||||
|
outputs[i].dt = oprd->data_type;
|
||||||
}
|
}
|
||||||
|
|
||||||
return DNN_SUCCESS;
|
return DNN_SUCCESS;
|
||||||
|
@ -106,6 +106,7 @@ int dnn_execute_layer_conv2d(DnnOperand *operands, const int32_t *input_operand_
|
|||||||
output_operand->dims[1] = height - pad_size * 2;
|
output_operand->dims[1] = height - pad_size * 2;
|
||||||
output_operand->dims[2] = width - pad_size * 2;
|
output_operand->dims[2] = width - pad_size * 2;
|
||||||
output_operand->dims[3] = conv_params->output_num;
|
output_operand->dims[3] = conv_params->output_num;
|
||||||
|
output_operand->data_type = operands[input_operand_index].data_type;
|
||||||
output_operand->length = calculate_operand_data_length(output_operand);
|
output_operand->length = calculate_operand_data_length(output_operand);
|
||||||
output_operand->data = av_realloc(output_operand->data, output_operand->length);
|
output_operand->data = av_realloc(output_operand->data, output_operand->length);
|
||||||
if (!output_operand->data)
|
if (!output_operand->data)
|
||||||
|
@ -69,6 +69,7 @@ int dnn_execute_layer_depth2space(DnnOperand *operands, const int32_t *input_ope
|
|||||||
output_operand->dims[1] = height * block_size;
|
output_operand->dims[1] = height * block_size;
|
||||||
output_operand->dims[2] = width * block_size;
|
output_operand->dims[2] = width * block_size;
|
||||||
output_operand->dims[3] = new_channels;
|
output_operand->dims[3] = new_channels;
|
||||||
|
output_operand->data_type = operands[input_operand_index].data_type;
|
||||||
output_operand->length = calculate_operand_data_length(output_operand);
|
output_operand->length = calculate_operand_data_length(output_operand);
|
||||||
output_operand->data = av_realloc(output_operand->data, output_operand->length);
|
output_operand->data = av_realloc(output_operand->data, output_operand->length);
|
||||||
if (!output_operand->data)
|
if (!output_operand->data)
|
||||||
|
@ -105,6 +105,7 @@ int dnn_execute_layer_pad(DnnOperand *operands, const int32_t *input_operand_ind
|
|||||||
output_operand->dims[1] = new_height;
|
output_operand->dims[1] = new_height;
|
||||||
output_operand->dims[2] = new_width;
|
output_operand->dims[2] = new_width;
|
||||||
output_operand->dims[3] = new_channel;
|
output_operand->dims[3] = new_channel;
|
||||||
|
output_operand->data_type = operands[input_operand_index].data_type;
|
||||||
output_operand->length = calculate_operand_data_length(output_operand);
|
output_operand->length = calculate_operand_data_length(output_operand);
|
||||||
output_operand->data = av_realloc(output_operand->data, output_operand->length);
|
output_operand->data = av_realloc(output_operand->data, output_operand->length);
|
||||||
if (!output_operand->data)
|
if (!output_operand->data)
|
||||||
|
@ -83,7 +83,7 @@ static TF_Buffer *read_graph(const char *model_filename)
|
|||||||
return graph_buf;
|
return graph_buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
static TF_Tensor *allocate_input_tensor(const DNNInputData *input)
|
static TF_Tensor *allocate_input_tensor(const DNNData *input)
|
||||||
{
|
{
|
||||||
TF_DataType dt;
|
TF_DataType dt;
|
||||||
size_t size;
|
size_t size;
|
||||||
@ -105,7 +105,7 @@ static TF_Tensor *allocate_input_tensor(const DNNInputData *input)
|
|||||||
input_dims[1] * input_dims[2] * input_dims[3] * size);
|
input_dims[1] * input_dims[2] * input_dims[3] * size);
|
||||||
}
|
}
|
||||||
|
|
||||||
static DNNReturnType set_input_output_tf(void *model, DNNInputData *input, const char *input_name, const char **output_names, uint32_t nb_output)
|
static DNNReturnType set_input_output_tf(void *model, DNNData *input, const char *input_name, const char **output_names, uint32_t nb_output)
|
||||||
{
|
{
|
||||||
TFModel *tf_model = (TFModel *)model;
|
TFModel *tf_model = (TFModel *)model;
|
||||||
TF_SessionOptions *sess_opts;
|
TF_SessionOptions *sess_opts;
|
||||||
@ -603,6 +603,7 @@ DNNReturnType ff_dnn_execute_model_tf(const DNNModel *model, DNNData *outputs, u
|
|||||||
outputs[i].width = TF_Dim(tf_model->output_tensors[i], 2);
|
outputs[i].width = TF_Dim(tf_model->output_tensors[i], 2);
|
||||||
outputs[i].channels = TF_Dim(tf_model->output_tensors[i], 3);
|
outputs[i].channels = TF_Dim(tf_model->output_tensors[i], 3);
|
||||||
outputs[i].data = TF_TensorData(tf_model->output_tensors[i]);
|
outputs[i].data = TF_TensorData(tf_model->output_tensors[i]);
|
||||||
|
outputs[i].dt = TF_TensorType(tf_model->output_tensors[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
return DNN_SUCCESS;
|
return DNN_SUCCESS;
|
||||||
|
@ -34,15 +34,10 @@ typedef enum {DNN_NATIVE, DNN_TF} DNNBackendType;
|
|||||||
|
|
||||||
typedef enum {DNN_FLOAT = 1, DNN_UINT8 = 4} DNNDataType;
|
typedef enum {DNN_FLOAT = 1, DNN_UINT8 = 4} DNNDataType;
|
||||||
|
|
||||||
typedef struct DNNInputData{
|
typedef struct DNNData{
|
||||||
void *data;
|
void *data;
|
||||||
DNNDataType dt;
|
DNNDataType dt;
|
||||||
int width, height, channels;
|
int width, height, channels;
|
||||||
} DNNInputData;
|
|
||||||
|
|
||||||
typedef struct DNNData{
|
|
||||||
float *data;
|
|
||||||
int width, height, channels;
|
|
||||||
} DNNData;
|
} DNNData;
|
||||||
|
|
||||||
typedef struct DNNModel{
|
typedef struct DNNModel{
|
||||||
@ -50,7 +45,7 @@ typedef struct DNNModel{
|
|||||||
void *model;
|
void *model;
|
||||||
// Sets model input and output.
|
// Sets model input and output.
|
||||||
// Should be called at least once before model execution.
|
// Should be called at least once before model execution.
|
||||||
DNNReturnType (*set_input_output)(void *model, DNNInputData *input, const char *input_name, const char **output_names, uint32_t nb_output);
|
DNNReturnType (*set_input_output)(void *model, DNNData *input, const char *input_name, const char **output_names, uint32_t nb_output);
|
||||||
} DNNModel;
|
} DNNModel;
|
||||||
|
|
||||||
// Stores pointers to functions for loading, executing, freeing DNN models for one of the backends.
|
// Stores pointers to functions for loading, executing, freeing DNN models for one of the backends.
|
||||||
|
@ -39,7 +39,7 @@ typedef struct DRContext {
|
|||||||
DNNBackendType backend_type;
|
DNNBackendType backend_type;
|
||||||
DNNModule *dnn_module;
|
DNNModule *dnn_module;
|
||||||
DNNModel *model;
|
DNNModel *model;
|
||||||
DNNInputData input;
|
DNNData input;
|
||||||
DNNData output;
|
DNNData output;
|
||||||
} DRContext;
|
} DRContext;
|
||||||
|
|
||||||
@ -137,7 +137,7 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *in)
|
|||||||
int t = i * out->width * 3 + j;
|
int t = i * out->width * 3 + j;
|
||||||
|
|
||||||
int t_in = (i + pad_size) * in->width * 3 + j + pad_size * 3;
|
int t_in = (i + pad_size) * in->width * 3 + j + pad_size * 3;
|
||||||
out->data[0][k] = CLIP((int)((((float *)dr_context->input.data)[t_in] - dr_context->output.data[t]) * 255), 0, 255);
|
out->data[0][k] = CLIP((int)((((float *)dr_context->input.data)[t_in] - ((float *)dr_context->output.data)[t]) * 255), 0, 255);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -41,7 +41,7 @@ typedef struct SRContext {
|
|||||||
DNNBackendType backend_type;
|
DNNBackendType backend_type;
|
||||||
DNNModule *dnn_module;
|
DNNModule *dnn_module;
|
||||||
DNNModel *model;
|
DNNModel *model;
|
||||||
DNNInputData input;
|
DNNData input;
|
||||||
DNNData output;
|
DNNData output;
|
||||||
int scale_factor;
|
int scale_factor;
|
||||||
struct SwsContext *sws_contexts[3];
|
struct SwsContext *sws_contexts[3];
|
||||||
|
Loading…
Reference in New Issue
Block a user