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