Browse Source

asymmetric padding parameter for convolution and deconvolution family

tags/20190908
nihuini 6 years ago
parent
commit
9a6ee37eef
19 changed files with 124 additions and 100 deletions
  1. +9
    -9
      src/layer/arm/convolution_arm.cpp
  2. +3
    -3
      src/layer/arm/convolutiondepthwise_arm.cpp
  3. +6
    -6
      src/layer/arm/deconvolution_arm.cpp
  4. +8
    -8
      src/layer/arm/deconvolutiondepthwise_arm.cpp
  5. +8
    -6
      src/layer/convolution.cpp
  6. +4
    -2
      src/layer/convolution.h
  7. +7
    -5
      src/layer/convolutiondepthwise.cpp
  8. +4
    -2
      src/layer/convolutiondepthwise.h
  9. +7
    -5
      src/layer/deconvolution.cpp
  10. +4
    -2
      src/layer/deconvolution.h
  11. +7
    -5
      src/layer/deconvolutiondepthwise.cpp
  12. +4
    -2
      src/layer/deconvolutiondepthwise.h
  13. +6
    -6
      src/layer/vulkan/convolution_vulkan.cpp
  14. +6
    -6
      src/layer/vulkan/convolutiondepthwise_vulkan.cpp
  15. +6
    -6
      src/layer/vulkan/deconvolution_vulkan.cpp
  16. +9
    -9
      src/layer/vulkan/deconvolutiondepthwise_vulkan.cpp
  17. +6
    -6
      src/layer/x86/convolution_x86.cpp
  18. +3
    -3
      src/layer/x86/convolutiondepthwise_x86.cpp
  19. +17
    -9
      tools/ncnnoptimize.cpp

+ 9
- 9
src/layer/arm/convolution_arm.cpp View File

@@ -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;


+ 3
- 3
src/layer/arm/convolutiondepthwise_arm.cpp View File

@@ -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;


+ 6
- 6
src/layer/arm/deconvolution_arm.cpp View File

@@ -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;



+ 8
- 8
src/layer/arm/deconvolutiondepthwise_arm.cpp View File

@@ -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;



+ 8
- 6
src/layer/convolution.cpp View File

@@ -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;


+ 4
- 2
src/layer/convolution.h View File

@@ -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;


+ 7
- 5
src/layer/convolutiondepthwise.cpp View File

@@ -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;


+ 4
- 2
src/layer/convolutiondepthwise.h View File

@@ -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;


+ 7
- 5
src/layer/deconvolution.cpp View File

@@ -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;



+ 4
- 2
src/layer/deconvolution.h View File

@@ -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;


+ 7
- 5
src/layer/deconvolutiondepthwise.cpp View File

@@ -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;



+ 4
- 2
src/layer/deconvolutiondepthwise.h View File

@@ -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;


+ 6
- 6
src/layer/vulkan/convolution_vulkan.cpp View File

@@ -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;


+ 6
- 6
src/layer/vulkan/convolutiondepthwise_vulkan.cpp View File

@@ -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;


+ 6
- 6
src/layer/vulkan/deconvolution_vulkan.cpp View File

@@ -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;


+ 9
- 9
src/layer/vulkan/deconvolutiondepthwise_vulkan.cpp View File

@@ -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;


+ 6
- 6
src/layer/x86/convolution_x86.cpp View File

@@ -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;


+ 3
- 3
src/layer/x86/convolutiondepthwise_x86.cpp View File

@@ -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;


+ 17
- 9
tools/ncnnoptimize.cpp View File

@@ -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)


Loading…
Cancel
Save