0dd688f6f884366842bb8fb82caceaa11f440918
[platform/upstream/dldt.git] / inference-engine / src / inference_engine / ie_blob_common.cpp
1 // Copyright (C) 2018 Intel Corporation
2 //
3 // SPDX-License-Identifier: Apache-2.0
4 //
5
6 #include "ie_blob.h"
7 #include "blob_factory.hpp"
8
9 namespace InferenceEngine {
10
11 Blob::Ptr make_shared_blob(const Blob::Ptr &inputBlob, const ROI &roi) {
12     size_t blkDimsH = roi.sizeY;
13     size_t blkDimsW = roi.sizeX;
14     size_t blkDimsC = inputBlob->getTensorDesc().getDims()[1];
15     size_t blkOffset;
16     SizeVector blkOrder;
17     SizeVector blkDims;
18
19     if (roi.posX + roi.sizeX > inputBlob->getTensorDesc().getDims()[3] ||
20         roi.posY + roi.sizeY > inputBlob->getTensorDesc().getDims()[2]) {
21         THROW_IE_EXCEPTION << "passed ROI coordinates are inconsistent to input size";
22     }
23
24     Layout blobLayout = inputBlob->getTensorDesc().getLayout();
25     switch (blobLayout) {
26         case NCHW: {
27             blkOffset = inputBlob->getTensorDesc().getDims()[3] * roi.posY + roi.posX;
28             blkOrder = {0, 1, 2, 3};
29             blkDims = {1, blkDimsC, blkDimsH, blkDimsW};  // we use BlockingDesc for 1 cropped image only
30         }
31         break;
32         case NHWC: {
33             blkOffset = blkDimsC * (inputBlob->getTensorDesc().getDims()[3] * roi.posY + roi.posX);
34             blkOrder = {0, 2, 3, 1};
35             blkDims = {1, blkDimsH, blkDimsW, blkDimsC};  // we use BlockingDesc for 1 cropped image only
36         }
37         break;
38         default: {
39             THROW_IE_EXCEPTION << "ROI could not be cropped due to inconsistent input layout: " << blobLayout;
40         }
41     }
42
43     // the strides are the same because ROI blob uses the same memory buffer as original input blob.
44     SizeVector blkStrides(inputBlob->getTensorDesc().getBlockingDesc().getStrides());
45
46     SizeVector blkDimsOffsets = {0, 0, 0, 0};  // no offset per dims by default
47
48     BlockingDesc blkDesc(blkDims, blkOrder, blkOffset, blkDimsOffsets, blkStrides);
49     TensorDesc tDesc(inputBlob->getTensorDesc().getPrecision(), {1, blkDimsC, blkDimsH, blkDimsW}, blkDesc);
50     tDesc.setLayout(blobLayout);
51
52     return make_blob_with_precision(tDesc, inputBlob->buffer());
53 }
54
55 }  // namespace InferenceEngine