1 // Copyright (C) 2018-2019 Intel Corporation
2 // SPDX-License-Identifier: Apache-2.0
6 #include "blob_factory.hpp"
8 namespace InferenceEngine {
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];
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";
23 Layout blobLayout = inputBlob->getTensorDesc().getLayout();
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
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
38 THROW_IE_EXCEPTION << "ROI could not be cropped due to inconsistent input layout: " << blobLayout;
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());
45 SizeVector blkDimsOffsets = {0, 0, 0, 0}; // no offset per dims by default
47 BlockingDesc blkDesc(blkDims, blkOrder, blkOffset, blkDimsOffsets, blkStrides);
48 TensorDesc tDesc(inputBlob->getTensorDesc().getPrecision(), {1, blkDimsC, blkDimsH, blkDimsW}, blkDesc);
49 tDesc.setLayout(blobLayout);
51 return make_blob_with_precision(tDesc, inputBlob->buffer());
54 } // namespace InferenceEngine