mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-01-08 13:22:53 +02:00
lavf/dnn: dump OpenVINO model input/output names to OVMdel struct.
Dump all input/output names to OVModel struct. In case other funcs use them for reporting errors or locating issues. Signed-off-by: Ting Fu <ting.fu@intel.com>
This commit is contained in:
parent
1cb7fd317c
commit
23953b9eb7
@ -58,6 +58,8 @@ typedef struct OVModel{
|
|||||||
SafeQueue *request_queue; // holds OVRequestItem
|
SafeQueue *request_queue; // holds OVRequestItem
|
||||||
Queue *task_queue; // holds TaskItem
|
Queue *task_queue; // holds TaskItem
|
||||||
Queue *lltask_queue; // holds LastLevelTaskItem
|
Queue *lltask_queue; // holds LastLevelTaskItem
|
||||||
|
const char *all_input_names;
|
||||||
|
const char *all_output_names;
|
||||||
} OVModel;
|
} OVModel;
|
||||||
|
|
||||||
// one request for one call to openvino
|
// one request for one call to openvino
|
||||||
@ -211,19 +213,9 @@ static void infer_completion_callback(void *args)
|
|||||||
|
|
||||||
status = ie_infer_request_get_blob(request->infer_request, task->output_names[0], &output_blob);
|
status = ie_infer_request_get_blob(request->infer_request, task->output_names[0], &output_blob);
|
||||||
if (status != OK) {
|
if (status != OK) {
|
||||||
//incorrect output name
|
|
||||||
char *model_output_name = NULL;
|
|
||||||
char *all_output_names = NULL;
|
|
||||||
size_t model_output_count = 0;
|
|
||||||
av_log(ctx, AV_LOG_ERROR, "Failed to get model output data\n");
|
|
||||||
status = ie_network_get_outputs_number(ov_model->network, &model_output_count);
|
|
||||||
for (size_t i = 0; i < model_output_count; i++) {
|
|
||||||
status = ie_network_get_output_name(ov_model->network, i, &model_output_name);
|
|
||||||
APPEND_STRING(all_output_names, model_output_name)
|
|
||||||
}
|
|
||||||
av_log(ctx, AV_LOG_ERROR,
|
av_log(ctx, AV_LOG_ERROR,
|
||||||
"output \"%s\" may not correct, all output(s) are: \"%s\"\n",
|
"output \"%s\" may not correct, all output(s) are: \"%s\"\n",
|
||||||
task->output_names[0], all_output_names);
|
task->output_names[0], ov_model->all_output_names);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -336,13 +328,23 @@ static int init_model_ov(OVModel *ov_model, const char *input_name, const char *
|
|||||||
// while we pass NHWC data from FFmpeg to openvino
|
// while we pass NHWC data from FFmpeg to openvino
|
||||||
status = ie_network_set_input_layout(ov_model->network, input_name, NHWC);
|
status = ie_network_set_input_layout(ov_model->network, input_name, NHWC);
|
||||||
if (status != OK) {
|
if (status != OK) {
|
||||||
av_log(ctx, AV_LOG_ERROR, "Failed to set layout as NHWC for input %s\n", input_name);
|
if (status == NOT_FOUND) {
|
||||||
|
av_log(ctx, AV_LOG_ERROR, "Could not find \"%s\" in model, failed to set input layout as NHWC, "\
|
||||||
|
"all input(s) are: \"%s\"\n", input_name, ov_model->all_input_names);
|
||||||
|
} else{
|
||||||
|
av_log(ctx, AV_LOG_ERROR, "Failed to set layout as NHWC for input %s\n", input_name);
|
||||||
|
}
|
||||||
ret = DNN_GENERIC_ERROR;
|
ret = DNN_GENERIC_ERROR;
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
status = ie_network_set_output_layout(ov_model->network, output_name, NHWC);
|
status = ie_network_set_output_layout(ov_model->network, output_name, NHWC);
|
||||||
if (status != OK) {
|
if (status != OK) {
|
||||||
av_log(ctx, AV_LOG_ERROR, "Failed to set layout as NHWC for output %s\n", output_name);
|
if (status == NOT_FOUND) {
|
||||||
|
av_log(ctx, AV_LOG_ERROR, "Could not find \"%s\" in model, failed to set output layout as NHWC, "\
|
||||||
|
"all output(s) are: \"%s\"\n", input_name, ov_model->all_output_names);
|
||||||
|
} else{
|
||||||
|
av_log(ctx, AV_LOG_ERROR, "Failed to set layout as NHWC for output %s\n", output_name);
|
||||||
|
}
|
||||||
ret = DNN_GENERIC_ERROR;
|
ret = DNN_GENERIC_ERROR;
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
@ -505,7 +507,6 @@ static int get_input_ov(void *model, DNNData *input, const char *input_name)
|
|||||||
OVModel *ov_model = model;
|
OVModel *ov_model = model;
|
||||||
OVContext *ctx = &ov_model->ctx;
|
OVContext *ctx = &ov_model->ctx;
|
||||||
char *model_input_name = NULL;
|
char *model_input_name = NULL;
|
||||||
char *all_input_names = NULL;
|
|
||||||
IEStatusCode status;
|
IEStatusCode status;
|
||||||
size_t model_input_count = 0;
|
size_t model_input_count = 0;
|
||||||
dimensions_t dims;
|
dimensions_t dims;
|
||||||
@ -538,15 +539,12 @@ static int get_input_ov(void *model, DNNData *input, const char *input_name)
|
|||||||
input->width = input_resizable ? -1 : dims.dims[3];
|
input->width = input_resizable ? -1 : dims.dims[3];
|
||||||
input->dt = precision_to_datatype(precision);
|
input->dt = precision_to_datatype(precision);
|
||||||
return 0;
|
return 0;
|
||||||
} else {
|
|
||||||
//incorrect input name
|
|
||||||
APPEND_STRING(all_input_names, model_input_name)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ie_network_name_free(&model_input_name);
|
ie_network_name_free(&model_input_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
av_log(ctx, AV_LOG_ERROR, "Could not find \"%s\" in model, all input(s) are: \"%s\"\n", input_name, all_input_names);
|
av_log(ctx, AV_LOG_ERROR, "Could not find \"%s\" in model, all input(s) are: \"%s\"\n", input_name, ov_model->all_input_names);
|
||||||
return AVERROR(EINVAL);
|
return AVERROR(EINVAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -729,6 +727,8 @@ DNNModel *ff_dnn_load_model_ov(const char *model_filename, DNNFunctionType func_
|
|||||||
OVModel *ov_model = NULL;
|
OVModel *ov_model = NULL;
|
||||||
OVContext *ctx = NULL;
|
OVContext *ctx = NULL;
|
||||||
IEStatusCode status;
|
IEStatusCode status;
|
||||||
|
size_t node_count = 0;
|
||||||
|
char *node_name = NULL;
|
||||||
|
|
||||||
model = av_mallocz(sizeof(DNNModel));
|
model = av_mallocz(sizeof(DNNModel));
|
||||||
if (!model){
|
if (!model){
|
||||||
@ -744,6 +744,8 @@ DNNModel *ff_dnn_load_model_ov(const char *model_filename, DNNFunctionType func_
|
|||||||
ov_model->model = model;
|
ov_model->model = model;
|
||||||
ov_model->ctx.class = &dnn_openvino_class;
|
ov_model->ctx.class = &dnn_openvino_class;
|
||||||
ctx = &ov_model->ctx;
|
ctx = &ov_model->ctx;
|
||||||
|
ov_model->all_input_names = NULL;
|
||||||
|
ov_model->all_output_names = NULL;
|
||||||
|
|
||||||
//parse options
|
//parse options
|
||||||
av_opt_set_defaults(ctx);
|
av_opt_set_defaults(ctx);
|
||||||
@ -767,6 +769,34 @@ DNNModel *ff_dnn_load_model_ov(const char *model_filename, DNNFunctionType func_
|
|||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//get all the input and output names
|
||||||
|
status = ie_network_get_inputs_number(ov_model->network, &node_count);
|
||||||
|
if (status != OK) {
|
||||||
|
av_log(ctx, AV_LOG_ERROR, "Failed to get input count\n");
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
for (size_t i = 0; i < node_count; i++) {
|
||||||
|
status = ie_network_get_input_name(ov_model->network, i, &node_name);
|
||||||
|
if (status != OK) {
|
||||||
|
av_log(ctx, AV_LOG_ERROR, "Failed to get No.%d input's name\n", (int)i);
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
APPEND_STRING(ov_model->all_input_names, node_name)
|
||||||
|
}
|
||||||
|
status = ie_network_get_outputs_number(ov_model->network, &node_count);
|
||||||
|
if (status != OK) {
|
||||||
|
av_log(ctx, AV_LOG_ERROR, "Failed to get output count\n");
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
for (size_t i = 0; i < node_count; i++) {
|
||||||
|
status = ie_network_get_output_name(ov_model->network, i, &node_name);
|
||||||
|
if (status != OK) {
|
||||||
|
av_log(ctx, AV_LOG_ERROR, "Failed to get No.%d output's name\n", (int)i);
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
APPEND_STRING(ov_model->all_output_names, node_name)
|
||||||
|
}
|
||||||
|
|
||||||
model->get_input = &get_input_ov;
|
model->get_input = &get_input_ov;
|
||||||
model->get_output = &get_output_ov;
|
model->get_output = &get_output_ov;
|
||||||
model->options = options;
|
model->options = options;
|
||||||
|
Loading…
Reference in New Issue
Block a user