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