diff --git a/src/layer/arm/convolution_arm.cpp b/src/layer/arm/convolution_arm.cpp index 5491eabf4..2f7dea212 100644 --- a/src/layer/arm/convolution_arm.cpp +++ b/src/layer/arm/convolution_arm.cpp @@ -388,7 +388,7 @@ int Convolution_arm::forwardDilation(const Mat& bottom_blob, Mat& top_blob, conv { Option opt_b = opt; opt_b.blob_allocator = opt.workspace_allocator; - copy_make_border(bottom_blob, bottom_blob_bordered, pad_top, pad_bottom, pad_left, pad_right, BORDER_CONSTANT, 0.f, opt_b); + copy_make_border(bottom_blob, bottom_blob_bordered, pad_top, pad_bottom, pad_left, pad_right, BORDER_CONSTANT, pad_value, opt_b); if (bottom_blob_bordered.empty()) return -100; @@ -403,7 +403,7 @@ int Convolution_arm::forwardDilation(const Mat& bottom_blob, Mat& top_blob, conv { Option opt_b = opt; opt_b.blob_allocator = opt.workspace_allocator; - copy_make_border(bottom_blob, bottom_blob_bordered, hpad / 2, hpad - hpad / 2, wpad / 2, wpad - wpad / 2, BORDER_CONSTANT, 0.f, opt_b); + copy_make_border(bottom_blob, bottom_blob_bordered, hpad / 2, hpad - hpad / 2, wpad / 2, wpad - wpad / 2, BORDER_CONSTANT, pad_value, opt_b); if (bottom_blob_bordered.empty()) return -100; } @@ -419,7 +419,7 @@ int Convolution_arm::forwardDilation(const Mat& bottom_blob, Mat& top_blob, conv { Option opt_b = opt; opt_b.blob_allocator = opt.workspace_allocator; - copy_make_border(bottom_blob, bottom_blob_bordered, hpad - hpad / 2, hpad / 2, wpad - wpad / 2, wpad / 2, BORDER_CONSTANT, 0.f, opt_b); + copy_make_border(bottom_blob, bottom_blob_bordered, hpad - hpad / 2, hpad / 2, wpad - wpad / 2, wpad / 2, BORDER_CONSTANT, pad_value, opt_b); if (bottom_blob_bordered.empty()) return -100; } @@ -521,7 +521,7 @@ int Convolution_arm::forward(const Mat& bottom_blob, Mat& top_blob, const Option { Option opt_b = opt; opt_b.blob_allocator = opt.workspace_allocator; - copy_make_border(bottom_blob, bottom_blob_bordered, pad_top, pad_bottom, pad_left, pad_right, BORDER_CONSTANT, 0.f, opt_b); + copy_make_border(bottom_blob, bottom_blob_bordered, pad_top, pad_bottom, pad_left, pad_right, BORDER_CONSTANT, pad_value, opt_b); } else if (pad_left == -233 && pad_right == -233 && pad_top == -233 && pad_bottom == -233) { @@ -531,7 +531,7 @@ int Convolution_arm::forward(const Mat& bottom_blob, Mat& top_blob, const Option { Option opt_b = opt; opt_b.blob_allocator = opt.workspace_allocator; - copy_make_border(bottom_blob, bottom_blob_bordered, hpad / 2, hpad - hpad / 2, wpad / 2, wpad - wpad / 2, BORDER_CONSTANT, 0.f, opt_b); + copy_make_border(bottom_blob, bottom_blob_bordered, hpad / 2, hpad - hpad / 2, wpad / 2, wpad - wpad / 2, BORDER_CONSTANT, pad_value, opt_b); } } else if (pad_left == -234 && pad_right == -234 && pad_top == -234 && pad_bottom == -234) @@ -542,7 +542,7 @@ int Convolution_arm::forward(const Mat& bottom_blob, Mat& top_blob, const Option { Option opt_b = opt; opt_b.blob_allocator = opt.workspace_allocator; - copy_make_border(bottom_blob, bottom_blob_bordered, hpad - hpad / 2, hpad / 2, wpad - wpad / 2, wpad / 2, BORDER_CONSTANT, 0.f, opt_b); + copy_make_border(bottom_blob, bottom_blob_bordered, hpad - hpad / 2, hpad / 2, wpad - wpad / 2, wpad / 2, BORDER_CONSTANT, pad_value, opt_b); } } if (bottom_blob_bordered.empty()) @@ -1027,7 +1027,7 @@ int Convolution_arm::forward(const Mat& bottom_blob, Mat& top_blob, const Option { Option opt_b = opt; opt_b.blob_allocator = opt.workspace_allocator; - copy_make_border(bottom_blob_unbordered, bottom_blob_bordered, pad_top, pad_bottom, pad_left, pad_right, BORDER_CONSTANT, 0.f, opt_b); + copy_make_border(bottom_blob_unbordered, bottom_blob_bordered, pad_top, pad_bottom, pad_left, pad_right, BORDER_CONSTANT, pad_value, opt_b); } else if (pad_left == -233 && pad_right == -233 && pad_top == -233 && pad_bottom == -233) { @@ -1037,7 +1037,7 @@ int Convolution_arm::forward(const Mat& bottom_blob, Mat& top_blob, const Option { Option opt_b = opt; opt_b.blob_allocator = opt.workspace_allocator; - copy_make_border(bottom_blob_unbordered, bottom_blob_bordered, hpad / 2, hpad - hpad / 2, wpad / 2, wpad - wpad / 2, BORDER_CONSTANT, 0.f, opt_b); + copy_make_border(bottom_blob_unbordered, bottom_blob_bordered, hpad / 2, hpad - hpad / 2, wpad / 2, wpad - wpad / 2, BORDER_CONSTANT, pad_value, opt_b); } } else if (pad_left == -234 && pad_right == -234 && pad_top == -234 && pad_bottom == -234) @@ -1048,7 +1048,7 @@ int Convolution_arm::forward(const Mat& bottom_blob, Mat& top_blob, const Option { Option opt_b = opt; opt_b.blob_allocator = opt.workspace_allocator; - copy_make_border(bottom_blob_unbordered, bottom_blob_bordered, hpad - hpad / 2, hpad / 2, wpad - wpad / 2, wpad / 2, BORDER_CONSTANT, 0.f, opt_b); + copy_make_border(bottom_blob_unbordered, bottom_blob_bordered, hpad - hpad / 2, hpad / 2, wpad - wpad / 2, wpad / 2, BORDER_CONSTANT, pad_value, opt_b); } } if (bottom_blob_bordered.empty()) diff --git a/src/layer/arm/convolutiondepthwise_arm.cpp b/src/layer/arm/convolutiondepthwise_arm.cpp index 22b1b0d02..5b42018bb 100644 --- a/src/layer/arm/convolutiondepthwise_arm.cpp +++ b/src/layer/arm/convolutiondepthwise_arm.cpp @@ -439,7 +439,7 @@ int ConvolutionDepthWise_arm::forward(const Mat& bottom_blob, Mat& top_blob, con { Option opt_b = opt; opt_b.blob_allocator = opt.workspace_allocator; - copy_make_border(bottom_blob_unbordered, bottom_blob_bordered, pad_top, pad_bottom, pad_left, pad_right, BORDER_CONSTANT, 0.f, opt_b); + copy_make_border(bottom_blob_unbordered, bottom_blob_bordered, pad_top, pad_bottom, pad_left, pad_right, BORDER_CONSTANT, pad_value, opt_b); } else if (pad_left == -233 && pad_right == -233 && pad_top == -233 && pad_bottom == -233) { @@ -449,7 +449,7 @@ int ConvolutionDepthWise_arm::forward(const Mat& bottom_blob, Mat& top_blob, con { Option opt_b = opt; opt_b.blob_allocator = opt.workspace_allocator; - copy_make_border(bottom_blob_unbordered, bottom_blob_bordered, hpad / 2, hpad - hpad / 2, wpad / 2, wpad - wpad / 2, BORDER_CONSTANT, 0.f, opt_b); + copy_make_border(bottom_blob_unbordered, bottom_blob_bordered, hpad / 2, hpad - hpad / 2, wpad / 2, wpad - wpad / 2, BORDER_CONSTANT, pad_value, opt_b); } } else if (pad_left == -234 && pad_right == -234 && pad_top == -234 && pad_bottom == -234) @@ -460,7 +460,7 @@ int ConvolutionDepthWise_arm::forward(const Mat& bottom_blob, Mat& top_blob, con { Option opt_b = opt; opt_b.blob_allocator = opt.workspace_allocator; - copy_make_border(bottom_blob_unbordered, bottom_blob_bordered, hpad - hpad / 2, hpad / 2, wpad - wpad / 2, wpad / 2, BORDER_CONSTANT, 0.f, opt_b); + copy_make_border(bottom_blob_unbordered, bottom_blob_bordered, hpad - hpad / 2, hpad / 2, wpad - wpad / 2, wpad / 2, BORDER_CONSTANT, pad_value, opt_b); } } if (bottom_blob_bordered.empty()) diff --git a/src/layer/convolution.cpp b/src/layer/convolution.cpp index e89ef48ff..16b4beb36 100644 --- a/src/layer/convolution.cpp +++ b/src/layer/convolution.cpp @@ -42,6 +42,7 @@ int Convolution::load_param(const ParamDict& pd) pad_right = pd.get(15, pad_left); pad_top = pd.get(14, pad_left); pad_bottom = pd.get(16, pad_top); + pad_value = pd.get(18, 0.f); bias_term = pd.get(5, 0); weight_data_size = pd.get(6, 0); int8_scale_term = pd.get(8, 0); @@ -335,7 +336,7 @@ int Convolution::forward(const Mat& bottom_blob, Mat& top_blob, const Option& op { Option opt_b = opt; opt_b.blob_allocator = opt.workspace_allocator; - copy_make_border(bottom_blob_unbordered, bottom_blob_bordered, pad_top, pad_bottom, pad_left, pad_right, BORDER_CONSTANT, 0.f, opt_b); + copy_make_border(bottom_blob_unbordered, bottom_blob_bordered, pad_top, pad_bottom, pad_left, pad_right, BORDER_CONSTANT, pad_value, opt_b); } else if (pad_left == -233 && pad_right == -233 && pad_top == -233 && pad_bottom == -233) { @@ -346,7 +347,7 @@ int Convolution::forward(const Mat& bottom_blob, Mat& top_blob, const Option& op { Option opt_b = opt; opt_b.blob_allocator = opt.workspace_allocator; - copy_make_border(bottom_blob_unbordered, bottom_blob_bordered, hpad / 2, hpad - hpad / 2, wpad / 2, wpad - wpad / 2, BORDER_CONSTANT, 0.f, opt_b); + copy_make_border(bottom_blob_unbordered, bottom_blob_bordered, hpad / 2, hpad - hpad / 2, wpad / 2, wpad - wpad / 2, BORDER_CONSTANT, pad_value, opt_b); } } else if (pad_left == -234 && pad_right == -234 && pad_top == -234 && pad_bottom == -234) @@ -358,7 +359,7 @@ int Convolution::forward(const Mat& bottom_blob, Mat& top_blob, const Option& op { Option opt_b = opt; opt_b.blob_allocator = opt.workspace_allocator; - copy_make_border(bottom_blob_unbordered, bottom_blob_bordered, hpad - hpad / 2, hpad / 2, wpad - wpad / 2, wpad / 2, BORDER_CONSTANT, 0.f, opt_b); + copy_make_border(bottom_blob_unbordered, bottom_blob_bordered, hpad - hpad / 2, hpad / 2, wpad - wpad / 2, wpad / 2, BORDER_CONSTANT, pad_value, opt_b); } } if (bottom_blob_bordered.empty()) diff --git a/src/layer/convolution.h b/src/layer/convolution.h index cbd00027b..0c55a4282 100644 --- a/src/layer/convolution.h +++ b/src/layer/convolution.h @@ -48,6 +48,7 @@ public: int pad_right; int pad_top; int pad_bottom; + float pad_value; int bias_term; int weight_data_size; diff --git a/src/layer/convolutiondepthwise.cpp b/src/layer/convolutiondepthwise.cpp index fd52059c5..d0f16c32b 100644 --- a/src/layer/convolutiondepthwise.cpp +++ b/src/layer/convolutiondepthwise.cpp @@ -41,6 +41,7 @@ int ConvolutionDepthWise::load_param(const ParamDict& pd) pad_right = pd.get(15, pad_left); pad_top = pd.get(14, pad_left); pad_bottom = pd.get(16, pad_top); + pad_value = pd.get(18, 0.f); bias_term = pd.get(5, 0); weight_data_size = pd.get(6, 0); group = pd.get(7, 1); @@ -328,7 +329,7 @@ int ConvolutionDepthWise::forward(const Mat& bottom_blob, Mat& top_blob, const O { Option opt_b = opt; opt_b.blob_allocator = opt.workspace_allocator; - copy_make_border(bottom_blob_unbordered, bottom_blob_bordered, pad_top, pad_bottom, pad_left, pad_right, BORDER_CONSTANT, 0.f, opt_b); + copy_make_border(bottom_blob_unbordered, bottom_blob_bordered, pad_top, pad_bottom, pad_left, pad_right, BORDER_CONSTANT, pad_value, opt_b); } else if (pad_left == -233 && pad_right == -233 && pad_top == -233 && pad_bottom == -233) { @@ -339,7 +340,7 @@ int ConvolutionDepthWise::forward(const Mat& bottom_blob, Mat& top_blob, const O { Option opt_b = opt; opt_b.blob_allocator = opt.workspace_allocator; - copy_make_border(bottom_blob_unbordered, bottom_blob_bordered, hpad / 2, hpad - hpad / 2, wpad / 2, wpad - wpad / 2, BORDER_CONSTANT, 0.f, opt_b); + copy_make_border(bottom_blob_unbordered, bottom_blob_bordered, hpad / 2, hpad - hpad / 2, wpad / 2, wpad - wpad / 2, BORDER_CONSTANT, pad_value, opt_b); } } else if (pad_left == -234 && pad_right == -234 && pad_top == -234 && pad_bottom == -234) @@ -351,7 +352,7 @@ int ConvolutionDepthWise::forward(const Mat& bottom_blob, Mat& top_blob, const O { Option opt_b = opt; opt_b.blob_allocator = opt.workspace_allocator; - copy_make_border(bottom_blob_unbordered, bottom_blob_bordered, hpad - hpad / 2, hpad / 2, wpad - wpad / 2, wpad / 2, BORDER_CONSTANT, 0.f, opt_b); + copy_make_border(bottom_blob_unbordered, bottom_blob_bordered, hpad - hpad / 2, hpad / 2, wpad - wpad / 2, wpad / 2, BORDER_CONSTANT, pad_value, opt_b); } } if (bottom_blob_bordered.empty()) diff --git a/src/layer/convolutiondepthwise.h b/src/layer/convolutiondepthwise.h index 733953261..9705188e2 100644 --- a/src/layer/convolutiondepthwise.h +++ b/src/layer/convolutiondepthwise.h @@ -48,6 +48,7 @@ public: int pad_right; int pad_top; int pad_bottom; + float pad_value; int bias_term; int weight_data_size; diff --git a/src/layer/vulkan/convolution_vulkan.cpp b/src/layer/vulkan/convolution_vulkan.cpp index d6bd65c9a..e5c25eafc 100644 --- a/src/layer/vulkan/convolution_vulkan.cpp +++ b/src/layer/vulkan/convolution_vulkan.cpp @@ -57,7 +57,7 @@ int Convolution_vulkan::create_pipeline(const Option& opt) pd.set(2, pad_left); pd.set(3, pad_right); pd.set(4, 0); - pd.set(5, 0.f); + pd.set(5, pad_value); padding->load_param(pd); diff --git a/src/layer/vulkan/convolutiondepthwise_vulkan.cpp b/src/layer/vulkan/convolutiondepthwise_vulkan.cpp index baa93ca63..055e386eb 100644 --- a/src/layer/vulkan/convolutiondepthwise_vulkan.cpp +++ b/src/layer/vulkan/convolutiondepthwise_vulkan.cpp @@ -49,7 +49,7 @@ int ConvolutionDepthWise_vulkan::create_pipeline(const Option& opt) pd.set(2, pad_left); pd.set(3, pad_right); pd.set(4, 0); - pd.set(5, 0.f); + pd.set(5, pad_value); padding->load_param(pd); diff --git a/src/layer/x86/convolution_x86.cpp b/src/layer/x86/convolution_x86.cpp index 35dae1acd..726fed3f3 100644 --- a/src/layer/x86/convolution_x86.cpp +++ b/src/layer/x86/convolution_x86.cpp @@ -151,7 +151,7 @@ int Convolution_x86::forwardDilation(const Mat& bottom_blob, Mat& top_blob, conv { Option opt_b = opt; opt_b.blob_allocator = opt.workspace_allocator; - copy_make_border(bottom_blob, bottom_blob_bordered, pad_top, pad_bottom, pad_left, pad_right, BORDER_CONSTANT, 0.f, opt_b); + copy_make_border(bottom_blob, bottom_blob_bordered, pad_top, pad_bottom, pad_left, pad_right, BORDER_CONSTANT, pad_value, opt_b); if (bottom_blob_bordered.empty()) return -100; @@ -166,7 +166,7 @@ int Convolution_x86::forwardDilation(const Mat& bottom_blob, Mat& top_blob, conv { Option opt_b = opt; opt_b.blob_allocator = opt.workspace_allocator; - copy_make_border(bottom_blob, bottom_blob_bordered, hpad / 2, hpad - hpad / 2, wpad / 2, wpad - wpad / 2, BORDER_CONSTANT, 0.f, opt_b); + copy_make_border(bottom_blob, bottom_blob_bordered, hpad / 2, hpad - hpad / 2, wpad / 2, wpad - wpad / 2, BORDER_CONSTANT, pad_value, opt_b); if (bottom_blob_bordered.empty()) return -100; } @@ -182,7 +182,7 @@ int Convolution_x86::forwardDilation(const Mat& bottom_blob, Mat& top_blob, conv { Option opt_b = opt; opt_b.blob_allocator = opt.workspace_allocator; - copy_make_border(bottom_blob, bottom_blob_bordered, hpad - hpad / 2, hpad / 2, wpad - wpad / 2, wpad / 2, BORDER_CONSTANT, 0.f, opt_b); + copy_make_border(bottom_blob, bottom_blob_bordered, hpad - hpad / 2, hpad / 2, wpad - wpad / 2, wpad / 2, BORDER_CONSTANT, pad_value, opt_b); if (bottom_blob_bordered.empty()) return -100; } @@ -496,7 +496,7 @@ int Convolution_x86::forward(const Mat& bottom_blob, Mat& top_blob, const Option { Option opt_b = opt; opt_b.blob_allocator = opt.workspace_allocator; - copy_make_border(bottom_blob_unbordered, bottom_blob_bordered, pad_top, pad_bottom, pad_left, pad_right, BORDER_CONSTANT, 0.f, opt_b); + copy_make_border(bottom_blob_unbordered, bottom_blob_bordered, pad_top, pad_bottom, pad_left, pad_right, BORDER_CONSTANT, pad_value, opt_b); if (bottom_blob_bordered.empty()) return -100; @@ -511,7 +511,7 @@ int Convolution_x86::forward(const Mat& bottom_blob, Mat& top_blob, const Option { Option opt_b = opt; opt_b.blob_allocator = opt.workspace_allocator; - copy_make_border(bottom_blob_unbordered, bottom_blob_bordered, hpad / 2, hpad - hpad / 2, wpad / 2, wpad - wpad / 2, BORDER_CONSTANT, 0.f, opt_b); + copy_make_border(bottom_blob_unbordered, bottom_blob_bordered, hpad / 2, hpad - hpad / 2, wpad / 2, wpad - wpad / 2, BORDER_CONSTANT, pad_value, opt_b); if (bottom_blob_bordered.empty()) return -100; } @@ -527,7 +527,7 @@ int Convolution_x86::forward(const Mat& bottom_blob, Mat& top_blob, const Option { Option opt_b = opt; opt_b.blob_allocator = opt.workspace_allocator; - copy_make_border(bottom_blob_unbordered, bottom_blob_bordered, hpad - hpad / 2, hpad / 2, wpad - wpad / 2, wpad / 2, BORDER_CONSTANT, 0.f, opt_b); + copy_make_border(bottom_blob_unbordered, bottom_blob_bordered, hpad - hpad / 2, hpad / 2, wpad - wpad / 2, wpad / 2, BORDER_CONSTANT, pad_value, opt_b); if (bottom_blob_bordered.empty()) return -100; } diff --git a/src/layer/x86/convolutiondepthwise_x86.cpp b/src/layer/x86/convolutiondepthwise_x86.cpp index 139f008f2..85a74bb40 100644 --- a/src/layer/x86/convolutiondepthwise_x86.cpp +++ b/src/layer/x86/convolutiondepthwise_x86.cpp @@ -236,7 +236,7 @@ int ConvolutionDepthWise_x86::forward(const Mat& bottom_blob, Mat& top_blob, con { Option opt_b = opt; opt_b.blob_allocator = opt.workspace_allocator; - copy_make_border(bottom_blob_unbordered, bottom_blob_bordered, pad_top, pad_bottom, pad_left, pad_right, BORDER_CONSTANT, 0.f, opt_b); + copy_make_border(bottom_blob_unbordered, bottom_blob_bordered, pad_top, pad_bottom, pad_left, pad_right, BORDER_CONSTANT, pad_value, opt_b); if (bottom_blob_bordered.empty()) return -100; @@ -251,7 +251,7 @@ int ConvolutionDepthWise_x86::forward(const Mat& bottom_blob, Mat& top_blob, con { Option opt_b = opt; opt_b.blob_allocator = opt.workspace_allocator; - copy_make_border(bottom_blob_unbordered, bottom_blob_bordered, hpad / 2, hpad - hpad / 2, wpad / 2, wpad - wpad / 2, BORDER_CONSTANT, 0.f, opt_b); + copy_make_border(bottom_blob_unbordered, bottom_blob_bordered, hpad / 2, hpad - hpad / 2, wpad / 2, wpad - wpad / 2, BORDER_CONSTANT, pad_value, opt_b); if (bottom_blob_bordered.empty()) return -100; } @@ -267,7 +267,7 @@ int ConvolutionDepthWise_x86::forward(const Mat& bottom_blob, Mat& top_blob, con { Option opt_b = opt; opt_b.blob_allocator = opt.workspace_allocator; - copy_make_border(bottom_blob_unbordered, bottom_blob_bordered, hpad - hpad / 2, hpad / 2, wpad - wpad / 2, wpad / 2, BORDER_CONSTANT, 0.f, opt_b); + copy_make_border(bottom_blob_unbordered, bottom_blob_bordered, hpad - hpad / 2, hpad / 2, wpad - wpad / 2, wpad / 2, BORDER_CONSTANT, pad_value, opt_b); if (bottom_blob_bordered.empty()) return -100; }