Browse Source

deconvolution apply output adj first, then crop the padding

tags/20191113
nihuini 6 years ago
parent
commit
b7085ceec0
6 changed files with 197 additions and 252 deletions
  1. +38
    -46
      src/layer/arm/deconvolution_arm.cpp
  2. +56
    -63
      src/layer/arm/deconvolutiondepthwise_arm.cpp
  3. +19
    -23
      src/layer/deconvolution.cpp
  4. +19
    -23
      src/layer/deconvolutiondepthwise.cpp
  5. +22
    -34
      src/layer/vulkan/deconvolution_vulkan.cpp
  6. +43
    -63
      src/layer/vulkan/deconvolutiondepthwise_vulkan.cpp

+ 38
- 46
src/layer/arm/deconvolution_arm.cpp View File

@@ -299,12 +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 (output_w == outw && output_h == outh && output_pad_right == 0 && output_pad_bottom == 0)
{
top_blob_bordered = top_blob;
top_blob_bordered.create(outw, outh, num_output / out_elempack, out_elemsize, out_elempack, opt.blob_allocator);
}
else if (pad_left > 0 || pad_right > 0 || pad_top > 0 || pad_bottom > 0 || output_pad_right > 0 || output_pad_bottom > 0 || (output_w > 0 && output_h > 0))
if (pad_left > 0 || pad_right > 0 || pad_top > 0 || pad_bottom > 0 || output_pad_right > 0 || output_pad_bottom > 0 || (output_w > 0 && output_h > 0))
{
top_blob_bordered.create(outw, outh, num_output / out_elempack, out_elemsize, out_elempack, opt.workspace_allocator);
}
@@ -632,27 +627,19 @@ int Deconvolution_arm::forward(const Mat& bottom_blob, Mat& top_blob, const Opti
}
}

if (output_w == outw && output_h == outh && output_pad_right == 0 && output_pad_bottom == 0)
{
top_blob = top_blob_bordered;
}
else if (pad_left > 0 || pad_right > 0 || pad_top > 0 || pad_bottom > 0)
if (pad_left > 0 || pad_right > 0 || pad_top > 0 || pad_bottom > 0)
{
Mat top_blob_bordered_adj = top_blob_bordered;
if (output_pad_right > 0 || output_pad_bottom > 0)
{
Mat top_blob_unbordered;
Option opt_ub = opt;
opt_ub.blob_allocator = opt.workspace_allocator;
copy_cut_border(top_blob_bordered, top_blob_unbordered, pad_top, pad_bottom, pad_left, pad_right, opt_ub);
if (top_blob_unbordered.empty())
Option opt_b = opt;
opt_b.blob_allocator = opt.workspace_allocator;
copy_make_border(top_blob_bordered, top_blob_bordered_adj, 0, output_pad_bottom, 0, output_pad_right, BORDER_CONSTANT, 0.f, opt_b);
if (top_blob_bordered_adj.empty())
return -100;

copy_make_border(top_blob_unbordered, top_blob, 0, output_pad_bottom, 0, output_pad_right, BORDER_CONSTANT, 0.f, opt);
}
else
{
copy_cut_border(top_blob_bordered, top_blob, pad_top, pad_bottom, pad_left, pad_right, opt);
}

copy_cut_border(top_blob_bordered_adj, top_blob, pad_top, pad_bottom, pad_left, pad_right, opt);
if (top_blob.empty())
return -100;

@@ -692,7 +679,16 @@ int Deconvolution_arm::forward(const Mat& bottom_blob, Mat& top_blob, const Opti
}
else
{
top_blob = top_blob_bordered;
if (output_pad_right > 0 || output_pad_bottom > 0)
{
copy_make_border(top_blob_bordered, top_blob, 0, output_pad_bottom, 0, output_pad_right, BORDER_CONSTANT, 0.f, opt);
if (top_blob.empty())
return -100;
}
else
{
top_blob = top_blob_bordered;
}
}

return 0;
@@ -742,12 +738,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 (output_w == outw && output_h == outh && output_pad_right == 0 && output_pad_bottom == 0)
{
top_blob_bordered = top_blob;
top_blob_bordered.create(outw, outh, num_output, elemsize, opt.blob_allocator);
}
else if (pad_left > 0 || pad_right > 0 || pad_top > 0 || pad_bottom > 0 || output_pad_right > 0 || output_pad_bottom > 0 || (output_w > 0 && output_h > 0))
if (pad_left > 0 || pad_right > 0 || pad_top > 0 || pad_bottom > 0 || output_pad_right > 0 || output_pad_bottom > 0 || (output_w > 0 && output_h > 0))
{
top_blob_bordered.create(outw, outh, num_output, elemsize, opt.workspace_allocator);
}
@@ -761,27 +752,19 @@ 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 (output_w == outw && output_h == outh && output_pad_right == 0 && output_pad_bottom == 0)
{
top_blob = top_blob_bordered;
}
else if (pad_left > 0 || pad_right > 0 || pad_top > 0 || pad_bottom > 0)
if (pad_left > 0 || pad_right > 0 || pad_top > 0 || pad_bottom > 0)
{
Mat top_blob_bordered_adj = top_blob_bordered;
if (output_pad_right > 0 || output_pad_bottom > 0)
{
Mat top_blob_unbordered;
Option opt_ub = opt;
opt_ub.blob_allocator = opt.workspace_allocator;
copy_cut_border(top_blob_bordered, top_blob_unbordered, pad_top, pad_bottom, pad_left, pad_right, opt_ub);
if (top_blob_unbordered.empty())
Option opt_b = opt;
opt_b.blob_allocator = opt.workspace_allocator;
copy_make_border(top_blob_bordered, top_blob_bordered_adj, 0, output_pad_bottom, 0, output_pad_right, BORDER_CONSTANT, 0.f, opt_b);
if (top_blob_bordered_adj.empty())
return -100;

copy_make_border(top_blob_unbordered, top_blob, 0, output_pad_bottom, 0, output_pad_right, BORDER_CONSTANT, 0.f, opt);
}
else
{
copy_cut_border(top_blob_bordered, top_blob, pad_top, pad_bottom, pad_left, pad_right, opt);
}

copy_cut_border(top_blob_bordered_adj, top_blob, pad_top, pad_bottom, pad_left, pad_right, opt);
if (top_blob.empty())
return -100;

@@ -821,7 +804,16 @@ int Deconvolution_arm::forward(const Mat& bottom_blob, Mat& top_blob, const Opti
}
else
{
top_blob = top_blob_bordered;
if (output_pad_right > 0 || output_pad_bottom > 0)
{
copy_make_border(top_blob_bordered, top_blob, 0, output_pad_bottom, 0, output_pad_right, BORDER_CONSTANT, 0.f, opt);
if (top_blob.empty())
return -100;
}
else
{
top_blob = top_blob_bordered;
}
}

if (activation)


+ 56
- 63
src/layer/arm/deconvolutiondepthwise_arm.cpp View File

@@ -397,12 +397,7 @@ int DeconvolutionDepthWise_arm::forward(const Mat& bottom_blob, Mat& top_blob, c
{

Mat top_blob_bordered;
if (output_w == outw && output_h == outh && output_pad_right == 0 && output_pad_bottom == 0)
{
top_blob_bordered = top_blob;
top_blob_bordered.create(outw, outh, num_output / out_elempack, out_elemsize, out_elempack, opt.blob_allocator);
}
else if (pad_left > 0 || pad_right > 0 || pad_top > 0 || pad_bottom > 0 || output_pad_right > 0 || output_pad_bottom > 0 || (output_w > 0 && output_h > 0))
if (pad_left > 0 || pad_right > 0 || pad_top > 0 || pad_bottom > 0 || output_pad_right > 0 || output_pad_bottom > 0 || (output_w > 0 && output_h > 0))
{
top_blob_bordered.create(outw, outh, num_output / out_elempack, out_elemsize, out_elempack, opt.workspace_allocator);
}
@@ -510,27 +505,19 @@ int DeconvolutionDepthWise_arm::forward(const Mat& bottom_blob, Mat& top_blob, c
}
}

if (output_w == outw && output_h == outh && output_pad_right == 0 && output_pad_bottom == 0)
{
top_blob = top_blob_bordered;
}
else if (pad_left > 0 || pad_right > 0 || pad_top > 0 || pad_bottom > 0)
if (pad_left > 0 || pad_right > 0 || pad_top > 0 || pad_bottom > 0)
{
Mat top_blob_bordered_adj = top_blob_bordered;
if (output_pad_right > 0 || output_pad_bottom > 0)
{
Mat top_blob_unbordered;
Option opt_ub = opt;
opt_ub.blob_allocator = opt.workspace_allocator;
copy_cut_border(top_blob_bordered, top_blob_unbordered, pad_top, pad_bottom, pad_left, pad_right, opt_ub);
if (top_blob_unbordered.empty())
Option opt_b = opt;
opt_b.blob_allocator = opt.workspace_allocator;
copy_make_border(top_blob_bordered, top_blob_bordered_adj, 0, output_pad_bottom, 0, output_pad_right, BORDER_CONSTANT, 0.f, opt_b);
if (top_blob_bordered_adj.empty())
return -100;

copy_make_border(top_blob_unbordered, top_blob, 0, output_pad_bottom, 0, output_pad_right, BORDER_CONSTANT, 0.f, opt);
}
else
{
copy_cut_border(top_blob_bordered, top_blob, pad_top, pad_bottom, pad_left, pad_right, opt);
}

copy_cut_border(top_blob_bordered_adj, top_blob, pad_top, pad_bottom, pad_left, pad_right, opt);
if (top_blob.empty())
return -100;

@@ -570,7 +557,16 @@ int DeconvolutionDepthWise_arm::forward(const Mat& bottom_blob, Mat& top_blob, c
}
else
{
top_blob = top_blob_bordered;
if (output_pad_right > 0 || output_pad_bottom > 0)
{
copy_make_border(top_blob_bordered, top_blob, 0, output_pad_bottom, 0, output_pad_right, BORDER_CONSTANT, 0.f, opt);
if (top_blob.empty())
return -100;
}
else
{
top_blob = top_blob_bordered;
}
}

return 0;
@@ -940,27 +936,19 @@ int DeconvolutionDepthWise_arm::forward(const Mat& bottom_blob, Mat& top_blob, c
top_blob_bordered = top_blob_bordered_unpacked;
}

if (output_w == outw && output_h == outh && output_pad_right == 0 && output_pad_bottom == 0)
{
top_blob = top_blob_bordered;
}
else if (pad_left > 0 || pad_right > 0 || pad_top > 0 || pad_bottom > 0)
if (pad_left > 0 || pad_right > 0 || pad_top > 0 || pad_bottom > 0)
{
Mat top_blob_bordered_adj = top_blob_bordered;
if (output_pad_right > 0 || output_pad_bottom > 0)
{
Mat top_blob_unbordered;
Option opt_ub = opt;
opt_ub.blob_allocator = opt.workspace_allocator;
copy_cut_border(top_blob_bordered, top_blob_unbordered, pad_top, pad_bottom, pad_left, pad_right, opt_ub);
if (top_blob_unbordered.empty())
Option opt_b = opt;
opt_b.blob_allocator = opt.workspace_allocator;
copy_make_border(top_blob_bordered, top_blob_bordered_adj, 0, output_pad_bottom, 0, output_pad_right, BORDER_CONSTANT, 0.f, opt_b);
if (top_blob_bordered_adj.empty())
return -100;

copy_make_border(top_blob_unbordered, top_blob, 0, output_pad_bottom, 0, output_pad_right, BORDER_CONSTANT, 0.f, opt);
}
else
{
copy_cut_border(top_blob_bordered, top_blob, pad_top, pad_bottom, pad_left, pad_right, opt);
}

copy_cut_border(top_blob_bordered_adj, top_blob, pad_top, pad_bottom, pad_left, pad_right, opt);
if (top_blob.empty())
return -100;

@@ -1000,7 +988,16 @@ int DeconvolutionDepthWise_arm::forward(const Mat& bottom_blob, Mat& top_blob, c
}
else
{
top_blob = top_blob_bordered;
if (output_pad_right > 0 || output_pad_bottom > 0)
{
copy_make_border(top_blob_bordered, top_blob, 0, output_pad_bottom, 0, output_pad_right, BORDER_CONSTANT, 0.f, opt);
if (top_blob.empty())
return -100;
}
else
{
top_blob = top_blob_bordered;
}
}

return 0;
@@ -1009,12 +1006,7 @@ int DeconvolutionDepthWise_arm::forward(const Mat& bottom_blob, Mat& top_blob, c
#endif // __ARM_NEON

Mat top_blob_bordered;
if (output_w == outw && output_h == outh && output_pad_right == 0 && output_pad_bottom == 0)
{
top_blob_bordered = top_blob;
top_blob_bordered.create(outw, outh, num_output, elemsize, opt.blob_allocator);
}
else if (pad_left > 0 || pad_right > 0 || pad_top > 0 || pad_bottom > 0 || output_pad_right > 0 || output_pad_bottom > 0 || (output_w > 0 && output_h > 0))
if (pad_left > 0 || pad_right > 0 || pad_top > 0 || pad_bottom > 0 || output_pad_right > 0 || output_pad_bottom > 0 || (output_w > 0 && output_h > 0))
{
top_blob_bordered.create(outw, outh, num_output, elemsize, opt.workspace_allocator);
}
@@ -1065,27 +1057,19 @@ int DeconvolutionDepthWise_arm::forward(const Mat& bottom_blob, Mat& top_blob, c
}
}

if (output_w == outw && output_h == outh && output_pad_right == 0 && output_pad_bottom == 0)
{
top_blob = top_blob_bordered;
}
else if (pad_left > 0 || pad_right > 0 || pad_top > 0 || pad_bottom > 0)
if (pad_left > 0 || pad_right > 0 || pad_top > 0 || pad_bottom > 0)
{
Mat top_blob_bordered_adj = top_blob_bordered;
if (output_pad_right > 0 || output_pad_bottom > 0)
{
Mat top_blob_unbordered;
Option opt_ub = opt;
opt_ub.blob_allocator = opt.workspace_allocator;
copy_cut_border(top_blob_bordered, top_blob_unbordered, pad_top, pad_bottom, pad_left, pad_right, opt_ub);
if (top_blob_unbordered.empty())
Option opt_b = opt;
opt_b.blob_allocator = opt.workspace_allocator;
copy_make_border(top_blob_bordered, top_blob_bordered_adj, 0, output_pad_bottom, 0, output_pad_right, BORDER_CONSTANT, 0.f, opt_b);
if (top_blob_bordered_adj.empty())
return -100;

copy_make_border(top_blob_unbordered, top_blob, 0, output_pad_bottom, 0, output_pad_right, BORDER_CONSTANT, 0.f, opt);
}
else
{
copy_cut_border(top_blob_bordered, top_blob, pad_top, pad_bottom, pad_left, pad_right, opt);
}

copy_cut_border(top_blob_bordered_adj, top_blob, pad_top, pad_bottom, pad_left, pad_right, opt);
if (top_blob.empty())
return -100;

@@ -1125,7 +1109,16 @@ int DeconvolutionDepthWise_arm::forward(const Mat& bottom_blob, Mat& top_blob, c
}
else
{
top_blob = top_blob_bordered;
if (output_pad_right > 0 || output_pad_bottom > 0)
{
copy_make_border(top_blob_bordered, top_blob, 0, output_pad_bottom, 0, output_pad_right, BORDER_CONSTANT, 0.f, opt);
if (top_blob.empty())
return -100;
}
else
{
top_blob = top_blob_bordered;
}
}

if (activation)


+ 19
- 23
src/layer/deconvolution.cpp View File

@@ -86,12 +86,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 (output_w == outw && output_h == outh && output_pad_right == 0 && output_pad_bottom == 0)
{
top_blob_bordered = top_blob;
top_blob_bordered.create(outw, outh, num_output, elemsize, opt.blob_allocator);
}
else if (pad_left > 0 || pad_right > 0 || pad_top > 0 || pad_bottom > 0 || output_pad_right > 0 || output_pad_bottom > 0 || (output_w > 0 && output_h > 0))
if (pad_left > 0 || pad_right > 0 || pad_top > 0 || pad_bottom > 0 || output_pad_right > 0 || output_pad_bottom > 0 || (output_w > 0 && output_h > 0))
{
top_blob_bordered.create(outw, outh, num_output, elemsize, opt.workspace_allocator);
}
@@ -207,27 +202,19 @@ int Deconvolution::forward(const Mat& bottom_blob, Mat& top_blob, const Option&
}
}

if (output_w == outw && output_h == outh && output_pad_right == 0 && output_pad_bottom == 0)
{
top_blob = top_blob_bordered;
}
else if (pad_left > 0 || pad_right > 0 || pad_top > 0 || pad_bottom > 0)
if (pad_left > 0 || pad_right > 0 || pad_top > 0 || pad_bottom > 0)
{
Mat top_blob_bordered_adj = top_blob_bordered;
if (output_pad_right > 0 || output_pad_bottom > 0)
{
Mat top_blob_unbordered;
Option opt_ub = opt;
opt_ub.blob_allocator = opt.workspace_allocator;
copy_cut_border(top_blob_bordered, top_blob_unbordered, pad_top, pad_bottom, pad_left, pad_right, opt_ub);
if (top_blob_unbordered.empty())
Option opt_b = opt;
opt_b.blob_allocator = opt.workspace_allocator;
copy_make_border(top_blob_bordered, top_blob_bordered_adj, 0, output_pad_bottom, 0, output_pad_right, BORDER_CONSTANT, 0.f, opt_b);
if (top_blob_bordered_adj.empty())
return -100;

copy_make_border(top_blob_unbordered, top_blob, 0, output_pad_bottom, 0, output_pad_right, BORDER_CONSTANT, 0.f, opt);
}
else
{
copy_cut_border(top_blob_bordered, top_blob, pad_top, pad_bottom, pad_left, pad_right, opt);
}

copy_cut_border(top_blob_bordered_adj, top_blob, pad_top, pad_bottom, pad_left, pad_right, opt);
if (top_blob.empty())
return -100;

@@ -267,7 +254,16 @@ int Deconvolution::forward(const Mat& bottom_blob, Mat& top_blob, const Option&
}
else
{
top_blob = top_blob_bordered;
if (output_pad_right > 0 || output_pad_bottom > 0)
{
copy_make_border(top_blob_bordered, top_blob, 0, output_pad_bottom, 0, output_pad_right, BORDER_CONSTANT, 0.f, opt);
if (top_blob.empty())
return -100;
}
else
{
top_blob = top_blob_bordered;
}
}

return 0;


+ 19
- 23
src/layer/deconvolutiondepthwise.cpp View File

@@ -91,12 +91,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 (output_w == outw && output_h == outh && output_pad_right == 0 && output_pad_bottom == 0)
{
top_blob_bordered = top_blob;
top_blob_bordered.create(outw, outh, num_output, elemsize, opt.blob_allocator);
}
else if (pad_left > 0 || pad_right > 0 || pad_top > 0 || pad_bottom > 0 || output_pad_right > 0 || output_pad_bottom > 0 || (output_w > 0 && output_h > 0))
if (pad_left > 0 || pad_right > 0 || pad_top > 0 || pad_bottom > 0 || output_pad_right > 0 || output_pad_bottom > 0 || (output_w > 0 && output_h > 0))
{
top_blob_bordered.create(outw, outh, num_output, elemsize, opt.workspace_allocator);
}
@@ -303,27 +298,19 @@ int DeconvolutionDepthWise::forward(const Mat& bottom_blob, Mat& top_blob, const
}
}

if (output_w == outw && output_h == outh && output_pad_right == 0 && output_pad_bottom == 0)
{
top_blob = top_blob_bordered;
}
else if (pad_left > 0 || pad_right > 0 || pad_top > 0 || pad_bottom > 0)
if (pad_left > 0 || pad_right > 0 || pad_top > 0 || pad_bottom > 0)
{
Mat top_blob_bordered_adj = top_blob_bordered;
if (output_pad_right > 0 || output_pad_bottom > 0)
{
Mat top_blob_unbordered;
Option opt_ub = opt;
opt_ub.blob_allocator = opt.workspace_allocator;
copy_cut_border(top_blob_bordered, top_blob_unbordered, pad_top, pad_bottom, pad_left, pad_right, opt_ub);
if (top_blob_unbordered.empty())
Option opt_b = opt;
opt_b.blob_allocator = opt.workspace_allocator;
copy_make_border(top_blob_bordered, top_blob_bordered_adj, 0, output_pad_bottom, 0, output_pad_right, BORDER_CONSTANT, 0.f, opt_b);
if (top_blob_bordered_adj.empty())
return -100;

copy_make_border(top_blob_unbordered, top_blob, 0, output_pad_bottom, 0, output_pad_right, BORDER_CONSTANT, 0.f, opt);
}
else
{
copy_cut_border(top_blob_bordered, top_blob, pad_top, pad_bottom, pad_left, pad_right, opt);
}

copy_cut_border(top_blob_bordered_adj, top_blob, pad_top, pad_bottom, pad_left, pad_right, opt);
if (top_blob.empty())
return -100;

@@ -363,7 +350,16 @@ int DeconvolutionDepthWise::forward(const Mat& bottom_blob, Mat& top_blob, const
}
else
{
top_blob = top_blob_bordered;
if (output_pad_right > 0 || output_pad_bottom > 0)
{
copy_make_border(top_blob_bordered, top_blob, 0, output_pad_bottom, 0, output_pad_right, BORDER_CONSTANT, 0.f, opt);
if (top_blob.empty())
return -100;
}
else
{
top_blob = top_blob_bordered;
}
}

return 0;


+ 22
- 34
src/layer/vulkan/deconvolution_vulkan.cpp View File

@@ -399,11 +399,7 @@ int Deconvolution_vulkan::forward(const VkMat& bottom_blob, VkMat& top_blob, VkC
}

VkMat top_blob_bordered;
if (output_w == outw && output_h == outh && output_pad_right == 0 && output_pad_bottom == 0)
{
top_blob_bordered.create(outw, outh, num_output / out_elempack, out_elemsize, out_elempack, opt.blob_vkallocator, opt.staging_vkallocator);
}
else if (pad_left > 0 || pad_right > 0 || pad_top > 0 || pad_bottom > 0 || output_pad_right > 0 || output_pad_bottom > 0 || (output_w > 0 && output_h > 0))
if (pad_left > 0 || pad_right > 0 || pad_top > 0 || pad_bottom > 0 || output_pad_right > 0 || output_pad_bottom > 0 || (output_w > 0 && output_h > 0))
{
top_blob_bordered.create(outw, outh, num_output / out_elempack, out_elemsize, out_elempack, opt.workspace_vkallocator, opt.staging_vkallocator);
}
@@ -470,43 +466,26 @@ int Deconvolution_vulkan::forward(const VkMat& bottom_blob, VkMat& top_blob, VkC

cmd.record_pipeline(pipeline, bindings, constants, top_blob_bordered);

if (output_w == outw && output_h == outh && output_pad_right == 0 && output_pad_bottom == 0)
{
top_blob = top_blob_bordered;
}
else if (pad_left > 0 || pad_right > 0 || pad_top > 0 || pad_bottom > 0)
if (pad_left > 0 || pad_right > 0 || pad_top > 0 || pad_bottom > 0)
{
VkMat top_blob_bordered_adj = top_blob_bordered;
if (output_pad_right > 0 || output_pad_bottom > 0)
{
VkMat top_blob_unbordered;
{
ncnn::Option opt_ub = opt;
opt_ub.blob_vkallocator = opt.workspace_vkallocator;

VkMat reference_blob;
reference_blob.dims = 2;
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;
crop_bottom_blobs[1] = reference_blob;
std::vector<VkMat> crop_top_blobs(1);
crop->forward(crop_bottom_blobs, crop_top_blobs, cmd, opt_ub);
top_blob_unbordered = crop_top_blobs[0];
}

output_pad->forward(top_blob_unbordered, top_blob, cmd, opt);
ncnn::Option opt_pad = opt;
opt_pad.blob_vkallocator = opt.workspace_vkallocator;
output_pad->forward(top_blob_bordered, top_blob_bordered_adj, cmd, opt_pad);
if (top_blob_bordered_adj.empty())
return -100;
}
else

{
VkMat reference_blob;
reference_blob.dims = 2;
reference_blob.w = top_blob_bordered.w - pad_left - pad_right;
reference_blob.h = top_blob_bordered.h - pad_top - pad_bottom;
reference_blob.w = top_blob_bordered_adj.w - pad_left - pad_right;
reference_blob.h = top_blob_bordered_adj.h - pad_top - pad_bottom;

std::vector<VkMat> crop_bottom_blobs(2);
crop_bottom_blobs[0] = top_blob_bordered;
crop_bottom_blobs[0] = top_blob_bordered_adj;
crop_bottom_blobs[1] = reference_blob;
std::vector<VkMat> crop_top_blobs(1);
crop->forward(crop_bottom_blobs, crop_top_blobs, cmd, opt);
@@ -573,7 +552,16 @@ int Deconvolution_vulkan::forward(const VkMat& bottom_blob, VkMat& top_blob, VkC
}
else
{
top_blob = top_blob_bordered;
if (output_pad_right > 0 || output_pad_bottom > 0)
{
output_pad->forward(top_blob_bordered, top_blob, cmd, opt);
if (top_blob.empty())
return -100;
}
else
{
top_blob = top_blob_bordered;
}
}

return 0;


+ 43
- 63
src/layer/vulkan/deconvolutiondepthwise_vulkan.cpp View File

@@ -542,11 +542,7 @@ int DeconvolutionDepthWise_vulkan::forward(const VkMat& bottom_blob, VkMat& top_
}

VkMat top_blob_bordered;
if (output_w == outw && output_h == outh && output_pad_right == 0 && output_pad_bottom == 0)
{
top_blob_bordered.create(outw, outh, num_output / out_elempack, out_elemsize, out_elempack, opt.blob_vkallocator, opt.staging_vkallocator);
}
else if (pad_left > 0 || pad_right > 0 || pad_top > 0 || pad_bottom > 0 || output_pad_right > 0 || output_pad_bottom > 0 || (output_w > 0 && output_h > 0))
if (pad_left > 0 || pad_right > 0 || pad_top > 0 || pad_bottom > 0 || output_pad_right > 0 || output_pad_bottom > 0 || (output_w > 0 && output_h > 0))
{
top_blob_bordered.create(outw, outh, num_output / out_elempack, out_elemsize, out_elempack, opt.workspace_vkallocator, opt.staging_vkallocator);
}
@@ -583,43 +579,26 @@ int DeconvolutionDepthWise_vulkan::forward(const VkMat& bottom_blob, VkMat& top_
// record
cmd.record_pipeline(pipeline, bindings, constants, top_blob_bordered);

if (output_w == outw && output_h == outh && output_pad_right == 0 && output_pad_bottom == 0)
{
top_blob = top_blob_bordered;
}
else if (pad_left > 0 || pad_right > 0 || pad_top > 0 || pad_bottom > 0)
if (pad_left > 0 || pad_right > 0 || pad_top > 0 || pad_bottom > 0)
{
VkMat top_blob_bordered_adj = top_blob_bordered;
if (output_pad_right > 0 || output_pad_bottom > 0)
{
VkMat top_blob_unbordered;
{
ncnn::Option opt_ub = opt;
opt_ub.blob_vkallocator = opt.workspace_vkallocator;

VkMat reference_blob;
reference_blob.dims = 2;
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;
crop_bottom_blobs[1] = reference_blob;
std::vector<VkMat> crop_top_blobs(1);
crop->forward(crop_bottom_blobs, crop_top_blobs, cmd, opt_ub);
top_blob_unbordered = crop_top_blobs[0];
}

output_pad->forward(top_blob_unbordered, top_blob, cmd, opt);
ncnn::Option opt_pad = opt;
opt_pad.blob_vkallocator = opt.workspace_vkallocator;
output_pad->forward(top_blob_bordered, top_blob_bordered_adj, cmd, opt_pad);
if (top_blob_bordered_adj.empty())
return -100;
}
else

{
VkMat reference_blob;
reference_blob.dims = 2;
reference_blob.w = top_blob_bordered.w - pad_left - pad_right;
reference_blob.h = top_blob_bordered.h - pad_top - pad_bottom;
reference_blob.w = top_blob_bordered_adj.w - pad_left - pad_right;
reference_blob.h = top_blob_bordered_adj.h - pad_top - pad_bottom;

std::vector<VkMat> crop_bottom_blobs(2);
crop_bottom_blobs[0] = top_blob_bordered;
crop_bottom_blobs[0] = top_blob_bordered_adj;
crop_bottom_blobs[1] = reference_blob;
std::vector<VkMat> crop_top_blobs(1);
crop->forward(crop_bottom_blobs, crop_top_blobs, cmd, opt);
@@ -686,7 +665,16 @@ int DeconvolutionDepthWise_vulkan::forward(const VkMat& bottom_blob, VkMat& top_
}
else
{
top_blob = top_blob_bordered;
if (output_pad_right > 0 || output_pad_bottom > 0)
{
output_pad->forward(top_blob_bordered, top_blob, cmd, opt);
if (top_blob.empty())
return -100;
}
else
{
top_blob = top_blob_bordered;
}
}

return 0;
@@ -779,43 +767,26 @@ int DeconvolutionDepthWise_vulkan::forward(const VkMat& bottom_blob, VkMat& top_
top_blob_bordered = top_blob_unpacked;
}

if (output_w == outw && output_h == outh && output_pad_right == 0 && output_pad_bottom == 0)
{
top_blob = top_blob_bordered;
}
else if (pad_left > 0 || pad_right > 0 || pad_top > 0 || pad_bottom > 0)
if (pad_left > 0 || pad_right > 0 || pad_top > 0 || pad_bottom > 0)
{
VkMat top_blob_bordered_adj = top_blob_bordered;
if (output_pad_right > 0 || output_pad_bottom > 0)
{
VkMat top_blob_unbordered;
{
ncnn::Option opt_ub = opt;
opt_ub.blob_vkallocator = opt.workspace_vkallocator;

VkMat reference_blob;
reference_blob.dims = 2;
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;
crop_bottom_blobs[1] = reference_blob;
std::vector<VkMat> crop_top_blobs(1);
crop->forward(crop_bottom_blobs, crop_top_blobs, cmd, opt_ub);
top_blob_unbordered = crop_top_blobs[0];
}

output_pad->forward(top_blob_unbordered, top_blob, cmd, opt);
ncnn::Option opt_pad = opt;
opt_pad.blob_vkallocator = opt.workspace_vkallocator;
output_pad->forward(top_blob_bordered, top_blob_bordered_adj, cmd, opt_pad);
if (top_blob_bordered_adj.empty())
return -100;
}
else

{
VkMat reference_blob;
reference_blob.dims = 2;
reference_blob.w = top_blob_bordered.w - pad_left - pad_right;
reference_blob.h = top_blob_bordered.h - pad_top - pad_bottom;
reference_blob.w = top_blob_bordered_adj.w - pad_left - pad_right;
reference_blob.h = top_blob_bordered_adj.h - pad_top - pad_bottom;

std::vector<VkMat> crop_bottom_blobs(2);
crop_bottom_blobs[0] = top_blob_bordered;
crop_bottom_blobs[0] = top_blob_bordered_adj;
crop_bottom_blobs[1] = reference_blob;
std::vector<VkMat> crop_top_blobs(1);
crop->forward(crop_bottom_blobs, crop_top_blobs, cmd, opt);
@@ -882,7 +853,16 @@ int DeconvolutionDepthWise_vulkan::forward(const VkMat& bottom_blob, VkMat& top_
}
else
{
top_blob = top_blob_bordered;
if (output_pad_right > 0 || output_pad_bottom > 0)
{
output_pad->forward(top_blob_bordered, top_blob, cmd, opt);
if (top_blob.empty())
return -100;
}
else
{
top_blob = top_blob_bordered;
}
}

return 0;


Loading…
Cancel
Save