From: Dmitry Mozolev/AI Tools Lab /SRR/Engineer/삼성전자 Date: Fri, 13 Jul 2018 13:32:17 +0000 (+0300) Subject: Prepare data for Caffe layer to Model IR converter (#597) X-Git-Tag: nncc_backup~2430 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=f9190bd12fdcf1c75063f67d6b05f411fb482970;p=platform%2Fcore%2Fml%2Fnnfw.git 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 --- 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