From f9190bd12fdcf1c75063f67d6b05f411fb482970 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Dmitry=20Mozolev/AI=20Tools=20Lab=20/SRR/Engineer/=EC=82=BC?= =?utf8?q?=EC=84=B1=EC=A0=84=EC=9E=90?= Date: Fri, 13 Jul 2018 16:32:17 +0300 Subject: [PATCH] Prepare data for Caffe layer to Model IR converter (#597) Implemented functions preparing inputs and parameters for creating Model IR operations. Signed-off-by: Dmitry Mozolev --- .../frontend/caffe/src/caffe_model_visitor.cpp | 65 ++++++++++++++++++++-- 1 file changed, 59 insertions(+), 6 deletions(-) diff --git a/contrib/nnc/libs/frontend/caffe/src/caffe_model_visitor.cpp b/contrib/nnc/libs/frontend/caffe/src/caffe_model_visitor.cpp index 2b4c6a0..c5e1198 100644 --- a/contrib/nnc/libs/frontend/caffe/src/caffe_model_visitor.cpp +++ b/contrib/nnc/libs/frontend/caffe/src/caffe_model_visitor.cpp @@ -100,20 +100,73 @@ void ModelVisitor::processInputLayer(const LayerParameter& lp) std::shared_ptr ModelVisitor::createTensor(const BlobProto &bp) { - (void)bp; - throw std::runtime_error("Not yet implemented"); + IrTensor::DTYPE type = IrTensor::DTYPE::FLOAT; + size_t elementSize; + + if (bp.data_size() != 0) + { + assert(bp.double_data_size() == 0); + elementSize = sizeof(float); + } + else if (bp.double_data_size() != 0) + { + elementSize = sizeof(double); + } + else + { + throw PluginException("No data in Caffe BlobProto, investigate"); + } + + // Create untyped tensor. Note, tensor contents will be *copied* here. + std::shared_ptr tensorBufferCopy(new char[bp.data().size() * elementSize], + [](char *d) { delete[] d; }); + + std::copy(bp.data().begin(), bp.data().end(), tensorBufferCopy.get()); + + Shape tensorShape = common::ShapeHelper::createShape( + bp.shape().dim(), static_cast(bp.shape().dim_size())); + + auto tensor = std::make_shared(tensorShape, tensorBufferCopy, type, elementSize); + + return tensor; } std::vector ModelVisitor::createOpInputs(const LayerParameter &lp) { - (void)lp; - throw std::runtime_error("Not yet implemented"); + std::vector inputs; + + for (const auto &inputBlobName : lp.bottom()) + { + inputs.push_back(opsForBlobsTheyOutput[inputBlobName]); + } + + return inputs; } +/** + * @brief Prepares Caffe layer parameters for Model IR operation creator. + * @todo Check if we need to transpose FC weights for Model IR FC op semantics. + */ std::vector> ModelVisitor::createOpParams(const LayerParameter &lp) { - (void)lp; - throw std::runtime_error("Not yet implemented"); + std::vector> params; + + for (const auto &blob : lp.blobs()) + { + + std::shared_ptr tensor = createTensor(blob); + + if (lp.has_convolution_param() && blob.shape().dim_size() == 4) + { + params.emplace_back(common::transposeTensor<2, 3, 1, 0>(tensor)); + } + else + { + params.push_back(tensor); + } + } + + return params; } } // namespace caffe -- 2.7.4