diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index f0cc89e54..d39d9e521 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -130,6 +130,7 @@ ncnn_add_layer(UnaryOp) ncnn_add_layer(ConvolutionDepthWise) ncnn_add_layer(Padding) ncnn_add_layer(Squeeze) +ncnn_add_layer(ExpandDims) add_library(ncnn STATIC ${ncnn_SRCS}) diff --git a/src/layer/expanddims.cpp b/src/layer/expanddims.cpp new file mode 100644 index 000000000..2b23c3825 --- /dev/null +++ b/src/layer/expanddims.cpp @@ -0,0 +1,110 @@ +// Tencent is pleased to support the open source community by making ncnn available. +// +// Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved. +// +// Licensed under the BSD 3-Clause License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// https://opensource.org/licenses/BSD-3-Clause +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#include "expanddims.h" + +namespace ncnn { + +DEFINE_LAYER_CREATOR(ExpandDims) + +ExpandDims::ExpandDims() +{ + one_blob_only = true; + support_inplace = false; +} + +#if NCNN_STDIO +#if NCNN_STRING +int ExpandDims::load_param(FILE* paramfp) +{ + int nscan = fscanf(paramfp, "%d %d %d", &expand_w, &expand_h, &expand_c); + if (nscan != 3) + { + fprintf(stderr, "ExpandDims load_param failed %d\n", nscan); + return -1; + } + + return 0; +} +#endif // NCNN_STRING +int ExpandDims::load_param_bin(FILE* paramfp) +{ + fread(&expand_w, sizeof(int), 1, paramfp); + + fread(&expand_h, sizeof(int), 1, paramfp); + + fread(&expand_c, sizeof(int), 1, paramfp); + + return 0; +} +#endif // NCNN_STDIO + +int ExpandDims::load_param(const unsigned char*& mem) +{ + expand_w = *(int*)(mem); + mem += 4; + + expand_h = *(int*)(mem); + mem += 4; + + expand_c = *(int*)(mem); + mem += 4; + + return 0; +} + +int ExpandDims::forward(const Mat& bottom_blob, Mat& top_blob) const +{ + int w = bottom_blob.w; + int h = bottom_blob.h; + int dims = bottom_blob.dims; + + top_blob = bottom_blob; + + if (dims == 1) + { + if (expand_w) + { + if (expand_h) + top_blob = bottom_blob.reshape(1, 1, w); + else if (expand_c) + top_blob = bottom_blob.reshape(1, w, 1); + else + top_blob = bottom_blob.reshape(1, w); + } + else if (expand_h) + { + if (expand_c) + top_blob = bottom_blob.reshape(w, 1, 1); + else + top_blob = bottom_blob.reshape(w, 1); + } + } + else if (dims == 2) + { + if (expand_w) + top_blob = bottom_blob.reshape(1, w, h); + else if (expand_h) + top_blob = bottom_blob.reshape(w, 1, h); + else if (expand_c) + top_blob = bottom_blob.reshape(w, h, 1); + } + + if (top_blob.empty()) + return -100; + + return 0; +} + +} // namespace ncnn diff --git a/src/layer/expanddims.h b/src/layer/expanddims.h new file mode 100644 index 000000000..3c76ec77d --- /dev/null +++ b/src/layer/expanddims.h @@ -0,0 +1,45 @@ +// Tencent is pleased to support the open source community by making ncnn available. +// +// Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved. +// +// Licensed under the BSD 3-Clause License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// https://opensource.org/licenses/BSD-3-Clause +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef LAYER_EXPANDDIMS_H +#define LAYER_EXPANDDIMS_H + +#include "layer.h" + +namespace ncnn { + +class ExpandDims : public Layer +{ +public: + ExpandDims(); + +#if NCNN_STDIO +#if NCNN_STRING + virtual int load_param(FILE* paramfp); +#endif // NCNN_STRING + virtual int load_param_bin(FILE* paramfp); +#endif // NCNN_STDIO + virtual int load_param(const unsigned char*& mem); + + virtual int forward(const Mat& bottom_blob, Mat& top_blob) const; + +public: + int expand_w; + int expand_h; + int expand_c; +}; + +} // namespace ncnn + +#endif // LAYER_EXPANDDIMS_H diff --git a/src/layer/squeeze.cpp b/src/layer/squeeze.cpp index 8c93505a3..b5521fd7d 100644 --- a/src/layer/squeeze.cpp +++ b/src/layer/squeeze.cpp @@ -71,6 +71,8 @@ int Squeeze::forward(const Mat& bottom_blob, Mat& top_blob) const int channels = bottom_blob.c; int dims = bottom_blob.dims; + top_blob = bottom_blob; + if (squeeze_c && dims == 3 && channels == 1) { if (squeeze_h && h == 1) @@ -92,8 +94,6 @@ int Squeeze::forward(const Mat& bottom_blob, Mat& top_blob) const else top_blob = bottom_blob.reshape(h, channels); } - else - top_blob = bottom_blob; if (top_blob.empty()) return -100;