| @@ -374,18 +374,18 @@ int Convolution_arm::forwardDilation(const Mat& bottom_blob, Mat& top_blob, conv | |||
| const int kernel_extent = dilation * (kernel_size - 1) + 1; | |||
| Mat bottom_blob_bordered = bottom_blob; | |||
| if (pad_w > 0 || pad_h > 0) | |||
| if (pad_left > 0 || pad_right > 0 || pad_top > 0 || pad_bottom > 0) | |||
| { | |||
| Option opt_b = opt; | |||
| opt_b.blob_allocator = opt.workspace_allocator; | |||
| copy_make_border(bottom_blob, bottom_blob_bordered, pad_h, pad_h, pad_w, pad_w, BORDER_CONSTANT, 0.f, opt_b); | |||
| copy_make_border(bottom_blob, bottom_blob_bordered, pad_top, pad_bottom, pad_left, pad_right, BORDER_CONSTANT, 0.f, opt_b); | |||
| if (bottom_blob_bordered.empty()) | |||
| return -100; | |||
| w = bottom_blob_bordered.w; | |||
| h = bottom_blob_bordered.h; | |||
| } | |||
| else if (pad_w == -233 && pad_h == -233) | |||
| else if (pad_left == -233 && pad_right == -233 && pad_top == -233 && pad_bottom == -233) | |||
| { | |||
| int wpad = kernel_extent + (w - 1) / stride * stride - w; | |||
| int hpad = kernel_extent + (h - 1) / stride * stride - h; | |||
| @@ -491,18 +491,18 @@ int Convolution_arm::forward(const Mat& bottom_blob, Mat& top_blob, const Option | |||
| const int kernel_extent_h = dilation_h * (kernel_h - 1) + 1; | |||
| Mat bottom_blob_bordered = bottom_blob; | |||
| if (pad_w > 0 || pad_h > 0) | |||
| if (pad_left > 0 || pad_right > 0 || pad_top > 0 || pad_bottom > 0) | |||
| { | |||
| Option opt_b = opt; | |||
| opt_b.blob_allocator = opt.workspace_allocator; | |||
| copy_make_border(bottom_blob, bottom_blob_bordered, pad_h, pad_h, pad_w, pad_w, BORDER_CONSTANT, 0.f, opt_b); | |||
| copy_make_border(bottom_blob, bottom_blob_bordered, pad_top, pad_bottom, pad_left, pad_right, BORDER_CONSTANT, 0.f, opt_b); | |||
| if (bottom_blob_bordered.empty()) | |||
| return -100; | |||
| w = bottom_blob_bordered.w; | |||
| h = bottom_blob_bordered.h; | |||
| } | |||
| else if (pad_w == -233 && pad_h == -233) | |||
| else if (pad_left == -233 && pad_right == -233 && pad_top == -233 && pad_bottom == -233) | |||
| { | |||
| int wpad = kernel_extent_w + (w - 1) / stride_w * stride_w - w; | |||
| int hpad = kernel_extent_h + (h - 1) / stride_h * stride_h - h; | |||
| @@ -973,18 +973,18 @@ int Convolution_arm::forward(const Mat& bottom_blob, Mat& top_blob, const Option | |||
| } | |||
| Mat bottom_blob_bordered = bottom_blob_unbordered; | |||
| if (pad_w > 0 || pad_h > 0) | |||
| if (pad_left > 0 || pad_right > 0 || pad_top > 0 || pad_bottom > 0) | |||
| { | |||
| Option opt_b = opt; | |||
| opt_b.blob_allocator = opt.workspace_allocator; | |||
| copy_make_border(bottom_blob_unbordered, bottom_blob_bordered, pad_h, pad_h, pad_w, pad_w, 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, 0.f, opt_b); | |||
| if (bottom_blob_bordered.empty()) | |||
| return -100; | |||
| w = bottom_blob_bordered.w; | |||
| h = bottom_blob_bordered.h; | |||
| } | |||
| else if (pad_w == -233 && pad_h == -233) | |||
| else if (pad_left == -233 && pad_right == -233 && pad_top == -233 && pad_bottom == -233) | |||
| { | |||
| int wpad = kernel_size + (w - 1) / stride * stride - w; | |||
| int hpad = kernel_size + (h - 1) / stride * stride - h; | |||
| @@ -435,18 +435,18 @@ int ConvolutionDepthWise_arm::forward(const Mat& bottom_blob, Mat& top_blob, con | |||
| } | |||
| Mat bottom_blob_bordered = bottom_blob_unbordered; | |||
| if (pad_w > 0 || pad_h > 0) | |||
| if (pad_left > 0 || pad_right > 0 || pad_top > 0 || pad_bottom > 0) | |||
| { | |||
| Option opt_b = opt; | |||
| opt_b.blob_allocator = opt.workspace_allocator; | |||
| copy_make_border(bottom_blob_unbordered, bottom_blob_bordered, pad_h, pad_h, pad_w, pad_w, 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, 0.f, opt_b); | |||
| if (bottom_blob_bordered.empty()) | |||
| return -100; | |||
| w = bottom_blob_bordered.w; | |||
| h = bottom_blob_bordered.h; | |||
| } | |||
| else if (pad_w == -233 && pad_h == -233) | |||
| else if (pad_left == -233 && pad_right == -233 && pad_top == -233 && pad_bottom == -233) | |||
| { | |||
| int wpad = kernel_extent_w + (w - 1) / stride_w * stride_w - w; | |||
| int hpad = kernel_extent_h + (h - 1) / stride_h * stride_h - h; | |||
| @@ -299,7 +299,7 @@ int Deconvolution_arm::forward(const Mat& bottom_blob, Mat& top_blob, const Opti | |||
| size_t out_elemsize = elemsize / elempack * out_elempack; | |||
| Mat top_blob_bordered; | |||
| if (pad_w > 0 || pad_h > 0) | |||
| if (pad_left > 0 || pad_right > 0 || pad_top > 0 || pad_bottom > 0) | |||
| { | |||
| top_blob_bordered.create(outw, outh, num_output / out_elempack, out_elemsize, out_elempack, opt.workspace_allocator); | |||
| if (top_blob_bordered.empty()) | |||
| @@ -629,9 +629,9 @@ int Deconvolution_arm::forward(const Mat& bottom_blob, Mat& top_blob, const Opti | |||
| } | |||
| } | |||
| if (pad_w > 0 || pad_h > 0) | |||
| if (pad_left > 0 || pad_right > 0 || pad_top > 0 || pad_bottom > 0) | |||
| { | |||
| copy_cut_border(top_blob_bordered, top_blob, pad_h, pad_h, pad_w, pad_w, opt); | |||
| copy_cut_border(top_blob_bordered, top_blob, pad_top, pad_bottom, pad_left, pad_right, opt); | |||
| if (top_blob.empty()) | |||
| return -100; | |||
| @@ -690,7 +690,7 @@ int Deconvolution_arm::forward(const Mat& bottom_blob, Mat& top_blob, const Opti | |||
| int outh = (h - 1) * stride + kernel_size; | |||
| Mat top_blob_bordered; | |||
| if (pad_w > 0 || pad_h > 0) | |||
| if (pad_left > 0 || pad_right > 0 || pad_top > 0 || pad_bottom > 0) | |||
| { | |||
| top_blob_bordered.create(outw, outh, num_output, elemsize, opt.workspace_allocator); | |||
| if (top_blob_bordered.empty()) | |||
| @@ -706,9 +706,9 @@ int Deconvolution_arm::forward(const Mat& bottom_blob, Mat& top_blob, const Opti | |||
| deconv(bottom_blob, top_blob_bordered, weight_data, bias_data, opt); | |||
| if (pad_w > 0 || pad_h > 0) | |||
| if (pad_left > 0 || pad_right > 0 || pad_top > 0 || pad_bottom > 0) | |||
| { | |||
| copy_cut_border(top_blob_bordered, top_blob, pad_h, pad_h, pad_w, pad_w, opt); | |||
| copy_cut_border(top_blob_bordered, top_blob, pad_top, pad_bottom, pad_left, pad_right, opt); | |||
| if (top_blob.empty()) | |||
| return -100; | |||
| @@ -397,7 +397,7 @@ int DeconvolutionDepthWise_arm::forward(const Mat& bottom_blob, Mat& top_blob, c | |||
| { | |||
| Mat top_blob_bordered; | |||
| if (pad_w > 0 || pad_h > 0) | |||
| if (pad_left > 0 || pad_right > 0 || pad_top > 0 || pad_bottom > 0) | |||
| { | |||
| top_blob_bordered.create(outw, outh, num_output / out_elempack, out_elemsize, out_elempack, opt.workspace_allocator); | |||
| if (top_blob_bordered.empty()) | |||
| @@ -507,9 +507,9 @@ int DeconvolutionDepthWise_arm::forward(const Mat& bottom_blob, Mat& top_blob, c | |||
| } | |||
| } | |||
| if (pad_w > 0 || pad_h > 0) | |||
| if (pad_left > 0 || pad_right > 0 || pad_top > 0 || pad_bottom > 0) | |||
| { | |||
| copy_cut_border(top_blob_bordered, top_blob, pad_h, pad_h, pad_w, pad_w, opt); | |||
| copy_cut_border(top_blob_bordered, top_blob, pad_top, pad_bottom, pad_left, pad_right, opt); | |||
| if (top_blob.empty()) | |||
| return -100; | |||
| @@ -888,9 +888,9 @@ int DeconvolutionDepthWise_arm::forward(const Mat& bottom_blob, Mat& top_blob, c | |||
| top_blob_bordered = top_blob_bordered_unpacked; | |||
| } | |||
| if (pad_w > 0 || pad_h > 0) | |||
| if (pad_left > 0 || pad_right > 0 || pad_top > 0 || pad_bottom > 0) | |||
| { | |||
| copy_cut_border(top_blob_bordered, top_blob, pad_h, pad_h, pad_w, pad_w, opt); | |||
| copy_cut_border(top_blob_bordered, top_blob, pad_top, pad_bottom, pad_left, pad_right, opt); | |||
| if (top_blob.empty()) | |||
| return -100; | |||
| @@ -908,7 +908,7 @@ int DeconvolutionDepthWise_arm::forward(const Mat& bottom_blob, Mat& top_blob, c | |||
| #endif // __ARM_NEON | |||
| Mat top_blob_bordered; | |||
| if (pad_w > 0 || pad_h > 0) | |||
| if (pad_left > 0 || pad_right > 0 || pad_top > 0 || pad_bottom > 0) | |||
| { | |||
| top_blob_bordered.create(outw, outh, num_output, elemsize, opt.workspace_allocator); | |||
| if (top_blob_bordered.empty()) | |||
| @@ -961,9 +961,9 @@ int DeconvolutionDepthWise_arm::forward(const Mat& bottom_blob, Mat& top_blob, c | |||
| } | |||
| } | |||
| if (pad_w > 0 || pad_h > 0) | |||
| if (pad_left > 0 || pad_right > 0 || pad_top > 0 || pad_bottom > 0) | |||
| { | |||
| copy_cut_border(top_blob_bordered, top_blob, pad_h, pad_h, pad_w, pad_w, opt); | |||
| copy_cut_border(top_blob_bordered, top_blob, pad_top, pad_bottom, pad_left, pad_right, opt); | |||
| if (top_blob.empty()) | |||
| return -100; | |||
| @@ -38,14 +38,16 @@ int Convolution::load_param(const ParamDict& pd) | |||
| dilation_h = pd.get(12, dilation_w); | |||
| stride_w = pd.get(3, 1); | |||
| stride_h = pd.get(13, stride_w); | |||
| pad_w = pd.get(4, 0); | |||
| pad_h = pd.get(14, pad_w); | |||
| pad_left = pd.get(4, 0); | |||
| pad_right = pd.get(15, pad_left); | |||
| pad_top = pd.get(14, pad_left); | |||
| pad_bottom = pd.get(16, pad_top); | |||
| bias_term = pd.get(5, 0); | |||
| weight_data_size = pd.get(6, 0); | |||
| int8_scale_term = pd.get(8, 0); | |||
| activation_type = pd.get(9, 0); | |||
| activation_params = pd.get(10, Mat()); | |||
| impl_type = pd.get(15, 0); | |||
| impl_type = pd.get(17, 0); | |||
| return 0; | |||
| } | |||
| @@ -329,18 +331,18 @@ int Convolution::forward(const Mat& bottom_blob, Mat& top_blob, const Option& op | |||
| } | |||
| Mat bottom_blob_bordered = bottom_blob_unbordered; | |||
| if (pad_w > 0 || pad_h > 0) | |||
| if (pad_left > 0 || pad_right > 0 || pad_top > 0 || pad_bottom > 0) | |||
| { | |||
| Option opt_b = opt; | |||
| opt_b.blob_allocator = opt.workspace_allocator; | |||
| copy_make_border(bottom_blob_unbordered, bottom_blob_bordered, pad_h, pad_h, pad_w, pad_w, 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, 0.f, opt_b); | |||
| if (bottom_blob_bordered.empty()) | |||
| return -100; | |||
| w = bottom_blob_bordered.w; | |||
| h = bottom_blob_bordered.h; | |||
| } | |||
| else if (pad_w == -233 && pad_h == -233) | |||
| else if (pad_left == -233 && pad_right == -233 && pad_top == -233 && pad_bottom == -233) | |||
| { | |||
| int wpad = kernel_extent_w + (w - 1) / stride_w * stride_w - w; | |||
| int hpad = kernel_extent_h + (h - 1) / stride_h * stride_h - h; | |||
| @@ -44,8 +44,10 @@ public: | |||
| int dilation_h; | |||
| int stride_w; | |||
| int stride_h; | |||
| int pad_w; | |||
| int pad_h; | |||
| int pad_left; | |||
| int pad_right; | |||
| int pad_top; | |||
| int pad_bottom; | |||
| int bias_term; | |||
| int weight_data_size; | |||
| @@ -37,8 +37,10 @@ int ConvolutionDepthWise::load_param(const ParamDict& pd) | |||
| dilation_h = pd.get(12, dilation_w); | |||
| stride_w = pd.get(3, 1); | |||
| stride_h = pd.get(13, stride_w); | |||
| pad_w = pd.get(4, 0); | |||
| pad_h = pd.get(14, pad_w); | |||
| pad_left = pd.get(4, 0); | |||
| pad_right = pd.get(15, pad_left); | |||
| pad_top = pd.get(14, pad_left); | |||
| pad_bottom = pd.get(16, pad_top); | |||
| bias_term = pd.get(5, 0); | |||
| weight_data_size = pd.get(6, 0); | |||
| group = pd.get(7, 1); | |||
| @@ -322,18 +324,18 @@ int ConvolutionDepthWise::forward(const Mat& bottom_blob, Mat& top_blob, const O | |||
| } | |||
| Mat bottom_blob_bordered = bottom_blob_unbordered; | |||
| if (pad_w > 0 || pad_h > 0) | |||
| if (pad_left > 0 || pad_right > 0 || pad_top > 0 || pad_bottom > 0) | |||
| { | |||
| Option opt_b = opt; | |||
| opt_b.blob_allocator = opt.workspace_allocator; | |||
| copy_make_border(bottom_blob_unbordered, bottom_blob_bordered, pad_h, pad_h, pad_w, pad_w, 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, 0.f, opt_b); | |||
| if (bottom_blob_bordered.empty()) | |||
| return -100; | |||
| w = bottom_blob_bordered.w; | |||
| h = bottom_blob_bordered.h; | |||
| } | |||
| else if (pad_w == -233 && pad_h == -233) | |||
| else if (pad_left == -233 && pad_right == -233 && pad_top == -233 && pad_bottom == -233) | |||
| { | |||
| int wpad = kernel_extent_w + (w - 1) / stride_w * stride_w - w; | |||
| int hpad = kernel_extent_h + (h - 1) / stride_h * stride_h - h; | |||
| @@ -44,8 +44,10 @@ public: | |||
| int dilation_h; | |||
| int stride_w; | |||
| int stride_h; | |||
| int pad_w; | |||
| int pad_h; | |||
| int pad_left; | |||
| int pad_right; | |||
| int pad_top; | |||
| int pad_bottom; | |||
| int bias_term; | |||
| int weight_data_size; | |||
| @@ -35,8 +35,10 @@ int Deconvolution::load_param(const ParamDict& pd) | |||
| dilation_h = pd.get(12, dilation_w); | |||
| stride_w = pd.get(3, 1); | |||
| stride_h = pd.get(13, stride_w); | |||
| pad_w = pd.get(4, 0); | |||
| pad_h = pd.get(14, pad_w); | |||
| pad_left = pd.get(4, 0); | |||
| pad_right = pd.get(15, pad_left); | |||
| pad_top = pd.get(14, pad_left); | |||
| pad_bottom = pd.get(16, pad_top); | |||
| bias_term = pd.get(5, 0); | |||
| weight_data_size = pd.get(6, 0); | |||
| activation_type = pd.get(9, 0); | |||
| @@ -80,7 +82,7 @@ int Deconvolution::forward(const Mat& bottom_blob, Mat& top_blob, const Option& | |||
| int outh = (h - 1) * stride_h + kernel_extent_h; | |||
| Mat top_blob_bordered; | |||
| if (pad_w > 0 || pad_h > 0) | |||
| if (pad_left > 0 || pad_right > 0 || pad_top > 0 || pad_bottom > 0) | |||
| { | |||
| top_blob_bordered.create(outw, outh, num_output, elemsize, opt.workspace_allocator); | |||
| if (top_blob_bordered.empty()) | |||
| @@ -198,9 +200,9 @@ int Deconvolution::forward(const Mat& bottom_blob, Mat& top_blob, const Option& | |||
| } | |||
| } | |||
| if (pad_w > 0 || pad_h > 0) | |||
| if (pad_left > 0 || pad_right > 0 || pad_top > 0 || pad_bottom > 0) | |||
| { | |||
| copy_cut_border(top_blob_bordered, top_blob, pad_h, pad_h, pad_w, pad_w, opt); | |||
| copy_cut_border(top_blob_bordered, top_blob, pad_top, pad_bottom, pad_left, pad_right, opt); | |||
| if (top_blob.empty()) | |||
| return -100; | |||
| @@ -39,8 +39,10 @@ public: | |||
| int dilation_h; | |||
| int stride_w; | |||
| int stride_h; | |||
| int pad_w; | |||
| int pad_h; | |||
| int pad_left; | |||
| int pad_right; | |||
| int pad_top; | |||
| int pad_bottom; | |||
| int bias_term; | |||
| int weight_data_size; | |||
| @@ -35,8 +35,10 @@ int DeconvolutionDepthWise::load_param(const ParamDict& pd) | |||
| dilation_h = pd.get(12, dilation_w); | |||
| stride_w = pd.get(3, 1); | |||
| stride_h = pd.get(13, stride_w); | |||
| pad_w = pd.get(4, 0); | |||
| pad_h = pd.get(14, pad_w); | |||
| pad_left = pd.get(4, 0); | |||
| pad_right = pd.get(15, pad_left); | |||
| pad_top = pd.get(14, pad_left); | |||
| pad_bottom = pd.get(16, pad_top); | |||
| bias_term = pd.get(5, 0); | |||
| weight_data_size = pd.get(6, 0); | |||
| group = pd.get(7, 1); | |||
| @@ -85,7 +87,7 @@ int DeconvolutionDepthWise::forward(const Mat& bottom_blob, Mat& top_blob, const | |||
| int outh = (h - 1) * stride_h + kernel_extent_h; | |||
| Mat top_blob_bordered; | |||
| if (pad_w > 0 || pad_h > 0) | |||
| if (pad_left > 0 || pad_right > 0 || pad_top > 0 || pad_bottom > 0) | |||
| { | |||
| top_blob_bordered.create(outw, outh, num_output, elemsize, opt.workspace_allocator); | |||
| if (top_blob_bordered.empty()) | |||
| @@ -294,9 +296,9 @@ int DeconvolutionDepthWise::forward(const Mat& bottom_blob, Mat& top_blob, const | |||
| } | |||
| } | |||
| if (pad_w > 0 || pad_h > 0) | |||
| if (pad_left > 0 || pad_right > 0 || pad_top > 0 || pad_bottom > 0) | |||
| { | |||
| copy_cut_border(top_blob_bordered, top_blob, pad_h, pad_h, pad_w, pad_w, opt); | |||
| copy_cut_border(top_blob_bordered, top_blob, pad_top, pad_bottom, pad_left, pad_right, opt); | |||
| if (top_blob.empty()) | |||
| return -100; | |||
| @@ -39,8 +39,10 @@ public: | |||
| int dilation_h; | |||
| int stride_w; | |||
| int stride_h; | |||
| int pad_w; | |||
| int pad_h; | |||
| int pad_left; | |||
| int pad_right; | |||
| int pad_top; | |||
| int pad_bottom; | |||
| int bias_term; | |||
| int weight_data_size; | |||
| @@ -55,10 +55,10 @@ int Convolution_vulkan::create_pipeline(const Option& opt) | |||
| padding->vkdev = vkdev; | |||
| ncnn::ParamDict pd; | |||
| pd.set(0, pad_h); | |||
| pd.set(1, pad_h); | |||
| pd.set(2, pad_w); | |||
| pd.set(3, pad_w); | |||
| pd.set(0, pad_top); | |||
| pd.set(1, pad_bottom); | |||
| pd.set(2, pad_left); | |||
| pd.set(3, pad_right); | |||
| pd.set(4, 0); | |||
| pd.set(5, 0.f); | |||
| @@ -862,7 +862,7 @@ int Convolution_vulkan::forward(const VkMat& bottom_blob, VkMat& top_blob, VkCom | |||
| const int kernel_extent_h = dilation_h * (kernel_h - 1) + 1; | |||
| VkMat bottom_blob_bordered = bottom_blob; | |||
| if (pad_w > 0 || pad_h > 0) | |||
| if (pad_left > 0 || pad_right > 0 || pad_top > 0 || pad_bottom > 0) | |||
| { | |||
| ncnn::Option opt_pad = opt; | |||
| opt_pad.blob_vkallocator = opt.workspace_vkallocator; | |||
| @@ -872,7 +872,7 @@ int Convolution_vulkan::forward(const VkMat& bottom_blob, VkMat& top_blob, VkCom | |||
| w = bottom_blob_bordered.w; | |||
| h = bottom_blob_bordered.h; | |||
| } | |||
| else if (pad_w == -233 && pad_h == -233) | |||
| else if (pad_left == -233 && pad_right == -233 && pad_top == -233 && pad_bottom == -233) | |||
| { | |||
| int wpad = kernel_extent_w + (w - 1) / stride_w * stride_w - w; | |||
| int hpad = kernel_extent_h + (h - 1) / stride_h * stride_h - h; | |||
| @@ -44,10 +44,10 @@ int ConvolutionDepthWise_vulkan::create_pipeline(const Option& opt) | |||
| padding->vkdev = vkdev; | |||
| ncnn::ParamDict pd; | |||
| pd.set(0, pad_h); | |||
| pd.set(1, pad_h); | |||
| pd.set(2, pad_w); | |||
| pd.set(3, pad_w); | |||
| pd.set(0, pad_top); | |||
| pd.set(1, pad_bottom); | |||
| pd.set(2, pad_left); | |||
| pd.set(3, pad_right); | |||
| pd.set(4, 0); | |||
| pd.set(5, 0.f); | |||
| @@ -467,7 +467,7 @@ int ConvolutionDepthWise_vulkan::forward(const VkMat& bottom_blob, VkMat& top_bl | |||
| const int kernel_extent_h = dilation_h * (kernel_h - 1) + 1; | |||
| VkMat bottom_blob_bordered = bottom_blob; | |||
| if (pad_w > 0 || pad_h > 0) | |||
| if (pad_left > 0 || pad_right > 0 || pad_top > 0 || pad_bottom > 0) | |||
| { | |||
| ncnn::Option opt_pad = opt; | |||
| opt_pad.blob_vkallocator = opt.workspace_vkallocator; | |||
| @@ -477,7 +477,7 @@ int ConvolutionDepthWise_vulkan::forward(const VkMat& bottom_blob, VkMat& top_bl | |||
| w = bottom_blob_bordered.w; | |||
| h = bottom_blob_bordered.h; | |||
| } | |||
| else if (pad_w == -233 && pad_h == -233) | |||
| else if (pad_left == -233 && pad_right == -233 && pad_top == -233 && pad_bottom == -233) | |||
| { | |||
| int wpad = kernel_extent_w + (w - 1) / stride_w * stride_w - w; | |||
| int hpad = kernel_extent_h + (h - 1) / stride_h * stride_h - h; | |||
| @@ -38,8 +38,8 @@ int Deconvolution_vulkan::create_pipeline(const Option& opt) | |||
| crop->vkdev = vkdev; | |||
| ncnn::ParamDict pd; | |||
| pd.set(0, pad_w); | |||
| pd.set(1, pad_h); | |||
| pd.set(0, pad_left); | |||
| pd.set(1, pad_top); | |||
| pd.set(2, 0); | |||
| crop->load_param(pd); | |||
| @@ -351,7 +351,7 @@ int Deconvolution_vulkan::forward(const VkMat& bottom_blob, VkMat& top_blob, VkC | |||
| } | |||
| VkMat top_blob_bordered; | |||
| if (pad_w > 0 || pad_h > 0) | |||
| if (pad_left > 0 || pad_right > 0 || pad_top > 0 || pad_bottom > 0) | |||
| { | |||
| top_blob_bordered.create(outw, outh, num_output / out_elempack, out_elemsize, out_elempack, opt.workspace_vkallocator, opt.staging_vkallocator); | |||
| if (top_blob_bordered.empty()) | |||
| @@ -420,12 +420,12 @@ int Deconvolution_vulkan::forward(const VkMat& bottom_blob, VkMat& top_blob, VkC | |||
| cmd.record_pipeline(pipeline, bindings, constants, top_blob_bordered); | |||
| if (pad_w > 0 || pad_h > 0) | |||
| if (pad_left > 0 || pad_right > 0 || pad_top > 0 || pad_bottom > 0) | |||
| { | |||
| VkMat reference_blob; | |||
| reference_blob.dims = 2; | |||
| reference_blob.w = top_blob_bordered.w - pad_w - pad_w; | |||
| reference_blob.h = top_blob_bordered.h - pad_h - pad_h; | |||
| reference_blob.w = top_blob_bordered.w - pad_left - pad_right; | |||
| reference_blob.h = top_blob_bordered.h - pad_top - pad_bottom; | |||
| std::vector<VkMat> crop_bottom_blobs(2); | |||
| crop_bottom_blobs[0] = top_blob_bordered; | |||
| @@ -44,8 +44,8 @@ int DeconvolutionDepthWise_vulkan::create_pipeline(const Option& opt) | |||
| crop->vkdev = vkdev; | |||
| ncnn::ParamDict pd; | |||
| pd.set(0, pad_w); | |||
| pd.set(1, pad_h); | |||
| pd.set(0, pad_left); | |||
| pd.set(1, pad_top); | |||
| pd.set(2, 0); | |||
| crop->load_param(pd); | |||
| @@ -495,7 +495,7 @@ int DeconvolutionDepthWise_vulkan::forward(const VkMat& bottom_blob, VkMat& top_ | |||
| } | |||
| VkMat top_blob_bordered; | |||
| if (pad_w > 0 || pad_h > 0) | |||
| if (pad_left > 0 || pad_right > 0 || pad_top > 0 || pad_bottom > 0) | |||
| { | |||
| top_blob_bordered.create(outw, outh, num_output / out_elempack, out_elemsize, out_elempack, opt.workspace_vkallocator, opt.staging_vkallocator); | |||
| if (top_blob_bordered.empty()) | |||
| @@ -534,12 +534,12 @@ int DeconvolutionDepthWise_vulkan::forward(const VkMat& bottom_blob, VkMat& top_ | |||
| // record | |||
| cmd.record_pipeline(pipeline, bindings, constants, top_blob_bordered); | |||
| if (pad_w > 0 || pad_h > 0) | |||
| if (pad_left > 0 || pad_right > 0 || pad_top > 0 || pad_bottom > 0) | |||
| { | |||
| VkMat reference_blob; | |||
| reference_blob.dims = 2; | |||
| reference_blob.w = top_blob_bordered.w - pad_w - pad_w; | |||
| reference_blob.h = top_blob_bordered.h - pad_h - pad_h; | |||
| reference_blob.w = top_blob_bordered.w - pad_left - pad_right; | |||
| reference_blob.h = top_blob_bordered.h - pad_top - pad_bottom; | |||
| std::vector<VkMat> crop_bottom_blobs(2); | |||
| crop_bottom_blobs[0] = top_blob_bordered; | |||
| @@ -646,12 +646,12 @@ int DeconvolutionDepthWise_vulkan::forward(const VkMat& bottom_blob, VkMat& top_ | |||
| top_blob_bordered = top_blob_unpacked; | |||
| } | |||
| if (pad_w > 0 || pad_h > 0) | |||
| if (pad_left > 0 || pad_right > 0 || pad_top > 0 || pad_bottom > 0) | |||
| { | |||
| VkMat reference_blob; | |||
| reference_blob.dims = 2; | |||
| reference_blob.w = top_blob_bordered.w - pad_w - pad_w; | |||
| reference_blob.h = top_blob_bordered.h - pad_h - pad_h; | |||
| reference_blob.w = top_blob_bordered.w - pad_left - pad_right; | |||
| reference_blob.h = top_blob_bordered.h - pad_top - pad_bottom; | |||
| std::vector<VkMat> crop_bottom_blobs(2); | |||
| crop_bottom_blobs[0] = top_blob_bordered; | |||
| @@ -147,18 +147,18 @@ int Convolution_x86::forwardDilation(const Mat& bottom_blob, Mat& top_blob, conv | |||
| const int kernel_extent = dilation * (kernel_size - 1) + 1; | |||
| Mat bottom_blob_bordered = bottom_blob; | |||
| if (pad_w > 0 || pad_h > 0) | |||
| if (pad_left > 0 || pad_right > 0 || pad_top > 0 || pad_bottom > 0) | |||
| { | |||
| Option opt_b = opt; | |||
| opt_b.blob_allocator = opt.workspace_allocator; | |||
| copy_make_border(bottom_blob, bottom_blob_bordered, pad_h, pad_h, pad_w, pad_w, BORDER_CONSTANT, 0.f, opt_b); | |||
| copy_make_border(bottom_blob, bottom_blob_bordered, pad_top, pad_bottom, pad_left, pad_right, BORDER_CONSTANT, 0.f, opt_b); | |||
| if (bottom_blob_bordered.empty()) | |||
| return -100; | |||
| w = bottom_blob_bordered.w; | |||
| h = bottom_blob_bordered.h; | |||
| } | |||
| else if (pad_w == -233 && pad_h == -233) | |||
| else if (pad_left == -233 && pad_right == -233 && pad_top == -233 && pad_bottom == -233) | |||
| { | |||
| int wpad = kernel_extent + (w - 1) / stride * stride - w; | |||
| int hpad = kernel_extent + (h - 1) / stride * stride - h; | |||
| @@ -476,18 +476,18 @@ int Convolution_x86::forward(const Mat& bottom_blob, Mat& top_blob, const Option | |||
| } | |||
| Mat bottom_blob_bordered = bottom_blob_unbordered; | |||
| if (pad_w > 0 || pad_h > 0) | |||
| if (pad_left > 0 || pad_right > 0 || pad_top > 0 || pad_bottom > 0) | |||
| { | |||
| Option opt_b = opt; | |||
| opt_b.blob_allocator = opt.workspace_allocator; | |||
| copy_make_border(bottom_blob_unbordered, bottom_blob_bordered, pad_h, pad_h, pad_w, pad_w, 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, 0.f, opt_b); | |||
| if (bottom_blob_bordered.empty()) | |||
| return -100; | |||
| w = bottom_blob_bordered.w; | |||
| h = bottom_blob_bordered.h; | |||
| } | |||
| else if (pad_w == -233 && pad_h == -233) | |||
| else if (pad_left == -233 && pad_right == -233 && pad_top == -233 && pad_bottom == -233) | |||
| { | |||
| int wpad = kernel_size + (w - 1) / stride * stride - w; | |||
| int hpad = kernel_size + (h - 1) / stride * stride - h; | |||
| @@ -232,18 +232,18 @@ int ConvolutionDepthWise_x86::forward(const Mat& bottom_blob, Mat& top_blob, con | |||
| } | |||
| Mat bottom_blob_bordered = bottom_blob_unbordered; | |||
| if (pad_w > 0 || pad_h > 0) | |||
| if (pad_left > 0 || pad_right > 0 || pad_top > 0 || pad_bottom > 0) | |||
| { | |||
| Option opt_b = opt; | |||
| opt_b.blob_allocator = opt.workspace_allocator; | |||
| copy_make_border(bottom_blob_unbordered, bottom_blob_bordered, pad_h, pad_h, pad_w, pad_w, 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, 0.f, opt_b); | |||
| if (bottom_blob_bordered.empty()) | |||
| return -100; | |||
| w = bottom_blob_bordered.w; | |||
| h = bottom_blob_bordered.h; | |||
| } | |||
| else if (pad_w == -233 && pad_h == -233) | |||
| else if (pad_left == -233 && pad_right == -233 && pad_top == -233 && pad_bottom == -233) | |||
| { | |||
| int wpad = kernel_extent_w + (w - 1) / stride_w * stride_w - w; | |||
| int hpad = kernel_extent_h + (h - 1) / stride_h * stride_h - h; | |||
| @@ -1808,14 +1808,16 @@ int NetOptimize::save(const char* parampath, const char* binpath) | |||
| { if (op->dilation_h != op->dilation_w) fprintf(pp, " 12=%d", op->dilation_h); } | |||
| fprintf_param_value(" 3=%d", stride_w) | |||
| { if (op->stride_h != op->stride_w) fprintf(pp, " 13=%d", op->stride_h); } | |||
| fprintf_param_value(" 4=%d", pad_w) | |||
| { if (op->pad_h != op->pad_w) fprintf(pp, " 14=%d", op->pad_h); } | |||
| fprintf_param_value(" 4=%d", pad_left) | |||
| { if (op->pad_top != op->pad_left) fprintf(pp, " 14=%d", op->pad_top); } | |||
| { if (op->pad_right != op->pad_left) fprintf(pp, " 15=%d", op->pad_right); } | |||
| { if (op->pad_bottom != op->pad_top) fprintf(pp, " 16=%d", op->pad_bottom); } | |||
| fprintf_param_value(" 5=%d", bias_term) | |||
| fprintf_param_value(" 6=%d", weight_data_size) | |||
| fprintf_param_value(" 8=%d", int8_scale_term) | |||
| fprintf_param_value(" 9=%d", activation_type) | |||
| { if (!op->activation_params.empty()) fprintf_param_float_array(10, op->activation_params, pp); } | |||
| fprintf_param_value(" 15=%d", impl_type) | |||
| fprintf_param_value(" 17=%d", impl_type) | |||
| fwrite_weight_tag_data(0, op->weight_data, bp); | |||
| fwrite_weight_data(op->bias_data, bp); | |||
| @@ -1832,8 +1834,10 @@ int NetOptimize::save(const char* parampath, const char* binpath) | |||
| { if (op->dilation_h != op->dilation_w) fprintf(pp, " 12=%d", op->dilation_h); } | |||
| fprintf_param_value(" 3=%d", stride_w) | |||
| { if (op->stride_h != op->stride_w) fprintf(pp, " 13=%d", op->stride_h); } | |||
| fprintf_param_value(" 4=%d", pad_w) | |||
| { if (op->pad_h != op->pad_w) fprintf(pp, " 14=%d", op->pad_h); } | |||
| fprintf_param_value(" 4=%d", pad_left) | |||
| { if (op->pad_top != op->pad_left) fprintf(pp, " 14=%d", op->pad_top); } | |||
| { if (op->pad_right != op->pad_left) fprintf(pp, " 15=%d", op->pad_right); } | |||
| { if (op->pad_bottom != op->pad_top) fprintf(pp, " 16=%d", op->pad_bottom); } | |||
| fprintf_param_value(" 5=%d", bias_term) | |||
| fprintf_param_value(" 6=%d", weight_data_size) | |||
| fprintf_param_value(" 7=%d", group) | |||
| @@ -1868,8 +1872,10 @@ int NetOptimize::save(const char* parampath, const char* binpath) | |||
| { if (op->dilation_h != op->dilation_w) fprintf(pp, " 12=%d", op->dilation_h); } | |||
| fprintf_param_value(" 3=%d", stride_w) | |||
| { if (op->stride_h != op->stride_w) fprintf(pp, " 13=%d", op->stride_h); } | |||
| fprintf_param_value(" 4=%d", pad_w) | |||
| { if (op->pad_h != op->pad_w) fprintf(pp, " 14=%d", op->pad_h); } | |||
| fprintf_param_value(" 4=%d", pad_left) | |||
| { if (op->pad_top != op->pad_left) fprintf(pp, " 14=%d", op->pad_top); } | |||
| { if (op->pad_right != op->pad_left) fprintf(pp, " 15=%d", op->pad_right); } | |||
| { if (op->pad_bottom != op->pad_top) fprintf(pp, " 16=%d", op->pad_bottom); } | |||
| fprintf_param_value(" 5=%d", bias_term) | |||
| fprintf_param_value(" 6=%d", weight_data_size) | |||
| fprintf_param_value(" 9=%d", activation_type) | |||
| @@ -1890,8 +1896,10 @@ int NetOptimize::save(const char* parampath, const char* binpath) | |||
| { if (op->dilation_h != op->dilation_w) fprintf(pp, " 12=%d", op->dilation_h); } | |||
| fprintf_param_value(" 3=%d", stride_w) | |||
| { if (op->stride_h != op->stride_w) fprintf(pp, " 13=%d", op->stride_h); } | |||
| fprintf_param_value(" 4=%d", pad_w) | |||
| { if (op->pad_h != op->pad_w) fprintf(pp, " 14=%d", op->pad_h); } | |||
| fprintf_param_value(" 4=%d", pad_left) | |||
| { if (op->pad_top != op->pad_left) fprintf(pp, " 14=%d", op->pad_top); } | |||
| { if (op->pad_right != op->pad_left) fprintf(pp, " 15=%d", op->pad_right); } | |||
| { if (op->pad_bottom != op->pad_top) fprintf(pp, " 16=%d", op->pad_bottom); } | |||
| fprintf_param_value(" 5=%d", bias_term) | |||
| fprintf_param_value(" 6=%d", weight_data_size) | |||
| fprintf_param_value(" 7=%d", group) | |||