Intel® Distribution of OpenVINO™ Toolkit
Community assistance about the Intel® Distribution of OpenVINO™ toolkit, OpenCV, and all aspects of computer vision-related on Intel® platforms.
6392 Discussions

SizeVector doesnot match the Layout in TensorDesc constructor from C++ Samples in 2020.1 release OpenVINO

Li__Rachel
Beginner
793 Views

Can anyone help me understanding TensorDesc constructor?

I installed openvino 2020.1 and I found out the below in C++ sample code in /opt/intel/openvino_2020.1.023/inference_engine/samples/cpp/common/samples/ocv_common.hpp. SizeVector in TensorDesc is initialized in the order of NCHW, but the layer out is NHWC. 

static UNUSED InferenceEngine::Blob::Ptr wrapMat2Blob(const cv::Mat &mat) {
    size_t channels = mat.channels();
    size_t height = mat.size().height;
    size_t width = mat.size().width;

    size_t strideH = mat.step.buf[0];
    size_t strideW = mat.step.buf[1];

    bool is_dense =
            strideW == channels &&
            strideH == channels * width;

    if (!is_dense) THROW_IE_EXCEPTION
                << "Doesn't support conversion from not dense cv::Mat";

    InferenceEngine::TensorDesc tDesc(InferenceEngine::Precision::U8,
                                      {1, channels, height, width},
                                      InferenceEngine::Layout::NHWC);

    return InferenceEngine::make_shared_blob<uint8_t>(tDesc, mat.data);
}

If I grep "NHWC", it looks like this mismatch exists in several places.

ubuntu@ubuntu:/opt/intel/openvino/inference_engine/include$ grep -nr . -e "NHWC"
./gpu/gpu_context_api_ocl.hpp:184:    TensorDesc ydesc(Precision::U8, { 1, 1, height, width }, Layout::NHWC);
./gpu/gpu_context_api_ocl.hpp:192:    TensorDesc uvdesc(Precision::U8, { 1, 2, height / 2, width / 2 }, Layout::NHWC);
./gpu/gpu_context_api_va.hpp:98:    TensorDesc ydesc(Precision::U8, { 1, 1, height, width }, Layout::NHWC);
./gpu/gpu_context_api_va.hpp:106:    TensorDesc uvdesc(Precision::U8, { 1, 2, height / 2, width / 2 }, Layout::NHWC);
./gpu/gpu_context_api_dx.hpp:129:    TensorDesc desc(Precision::U8, { 1, 1, height, width }, Layout::NHWC);
./gpu/gpu_context_api_dx.hpp:138:    TensorDesc uvdesc(Precision::U8, { 1, 2, height / 2, width / 2 }, Layout::NHWC);
./vpu/vpu_plugin_config.hpp:97: *   VPU_CONFIG_VALUE(NHWC) executable network forced to use NHWC input/output layouts
 

However, in the OpenVINO document https://docs.openvinotoolkit.org/latest/_docs_optimization_guide_dldt_optimization_guide.html, VectorSize matches the layout in TensorDesc construct.

InferenceEngine::SizeVector dims_src = {
    1       /* batch, N*/,
    (size_t) frame_in->Info.Height  /* Height */,
    (size_t) frame_in->Info.Width    /* Width */,
    3 /*Channels,*/,
    };
TensorDesc desc(InferenceEngine::Precision::U8, dims_src, InferenceEngine::NHWC);
/* wrapping the surface data, as RGB is interleaved, need to pass only ptr to the R, notice that this wouldn’t work with planar formats as these are 3 separate planes/pointers*/
InferenceEngine::TBlob<uint8_t>::Ptr p = InferenceEngine::make_shared_blob<uint8_t>( desc, (uint8_t*) frame_in->Data.R);
inferRequest.SetBlob(“input”, p);
inferRequest.Infer();
//Make sure to unlock the surface upon inference completion, to return the ownership back to the Intel MSS
pAlloc->Unlock(pAlloc->pthis, frame_in->Data.MemId, &frame_in->Data);

 

 

 

 

 

0 Kudos
2 Replies
adammpolak
New Contributor I
621 Views

This is a great question, shame it was never answered. I am stuck on the issue of dense matrix as well.

0 Kudos
adammpolak
New Contributor I
621 Views
0 Kudos
Reply