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>tags/n4.3
| @@ -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]; | ||||