deconvolution apply output adj first, then crop the padding

This commit is contained in:
nihuini
2019-09-14 14:58:59 +08:00
parent 8dbafe7764
commit b7085ceec0
6 changed files with 197 additions and 252 deletions
+38 -46
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
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
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
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
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;
@@ -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;