mirror of
https://github.com/Tencent/ncnn.git
synced 2026-10-29 04:17:40 +08:00
deconvolution apply output adj first, then crop the padding
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user