From 51c105a62d931b6c27c8cad5b9aba3fd1de43668 Mon Sep 17 00:00:00 2001 From: "Guo, Yejun" Date: Mon, 8 Feb 2021 09:22:23 +0800 Subject: dnn_backend_openvino.c: fix mismatch between ffmpeg(NHWC) and openvino(NCHW) Signed-off-by: Guo, Yejun --- libavfilter/dnn/dnn_backend_openvino.c | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) (limited to 'libavfilter/dnn') diff --git a/libavfilter/dnn/dnn_backend_openvino.c b/libavfilter/dnn/dnn_backend_openvino.c index beca256390..48f5ba50be 100644 --- a/libavfilter/dnn/dnn_backend_openvino.c +++ b/libavfilter/dnn/dnn_backend_openvino.c @@ -250,7 +250,7 @@ static void infer_completion_callback(void *args) } } -static DNNReturnType init_model_ov(OVModel *ov_model) +static DNNReturnType init_model_ov(OVModel *ov_model, const char *input_name, const char *output_name) { OVContext *ctx = &ov_model->ctx; IEStatusCode status; @@ -276,6 +276,19 @@ static DNNReturnType init_model_ov(OVModel *ov_model) goto err; } + // The order of dims in the openvino is fixed and it is always NCHW for 4-D data. + // while we pass NHWC data from FFmpeg to openvino + status = ie_network_set_input_layout(ov_model->network, input_name, NHWC); + if (status != OK) { + av_log(ctx, AV_LOG_ERROR, "Failed to set layout as NHWC for input %s\n", input_name); + goto err; + } + status = ie_network_set_output_layout(ov_model->network, output_name, NHWC); + if (status != OK) { + av_log(ctx, AV_LOG_ERROR, "Failed to set layout as NHWC for output %s\n", output_name); + goto err; + } + status = ie_core_load_network(ov_model->core, ov_model->network, ctx->options.device_type, &config, &ov_model->exe_network); if (status != OK) { av_log(ctx, AV_LOG_ERROR, "Failed to load OpenVINO model network\n"); @@ -482,7 +495,7 @@ static DNNReturnType get_output_ov(void *model, const char *input_name, int inpu } if (!ov_model->exe_network) { - if (init_model_ov(ov_model) != DNN_SUCCESS) { + if (init_model_ov(ov_model, input_name, output_name) != DNN_SUCCESS) { av_log(ctx, AV_LOG_ERROR, "Failed init OpenVINO exectuable network or inference request\n"); return DNN_ERROR; } @@ -598,7 +611,7 @@ DNNReturnType ff_dnn_execute_model_ov(const DNNModel *model, const char *input_n } if (!ov_model->exe_network) { - if (init_model_ov(ov_model) != DNN_SUCCESS) { + if (init_model_ov(ov_model, input_name, output_names[0]) != DNN_SUCCESS) { av_log(ctx, AV_LOG_ERROR, "Failed init OpenVINO exectuable network or inference request\n"); return DNN_ERROR; } @@ -645,7 +658,7 @@ DNNReturnType ff_dnn_execute_model_async_ov(const DNNModel *model, const char *i } if (!ov_model->exe_network) { - if (init_model_ov(ov_model) != DNN_SUCCESS) { + if (init_model_ov(ov_model, input_name, output_names[0]) != DNN_SUCCESS) { av_log(ctx, AV_LOG_ERROR, "Failed init OpenVINO exectuable network or inference request\n"); return DNN_ERROR; } -- cgit v1.2.3