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