diff --git a/src/layer/arm/deconvolution_arm.cpp b/src/layer/arm/deconvolution_arm.cpp index 80b19a001..bdff0623a 100644 --- a/src/layer/arm/deconvolution_arm.cpp +++ b/src/layer/arm/deconvolution_arm.cpp @@ -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) diff --git a/src/layer/arm/deconvolutiondepthwise_arm.cpp b/src/layer/arm/deconvolutiondepthwise_arm.cpp index 2bae9f13f..8f8ba429d 100644 --- a/src/layer/arm/deconvolutiondepthwise_arm.cpp +++ b/src/layer/arm/deconvolutiondepthwise_arm.cpp @@ -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) diff --git a/src/layer/deconvolution.cpp b/src/layer/deconvolution.cpp index adf5db585..633dae12a 100644 --- a/src/layer/deconvolution.cpp +++ b/src/layer/deconvolution.cpp @@ -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; diff --git a/src/layer/deconvolutiondepthwise.cpp b/src/layer/deconvolutiondepthwise.cpp index 095881982..c38d69c50 100644 --- a/src/layer/deconvolutiondepthwise.cpp +++ b/src/layer/deconvolutiondepthwise.cpp @@ -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; diff --git a/src/layer/vulkan/deconvolution_vulkan.cpp b/src/layer/vulkan/deconvolution_vulkan.cpp index b341bf5cd..82187944a 100644 --- a/src/layer/vulkan/deconvolution_vulkan.cpp +++ b/src/layer/vulkan/deconvolution_vulkan.cpp @@ -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 crop_bottom_blobs(2); - crop_bottom_blobs[0] = top_blob_bordered; - crop_bottom_blobs[1] = reference_blob; - std::vector 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 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 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; diff --git a/src/layer/vulkan/deconvolutiondepthwise_vulkan.cpp b/src/layer/vulkan/deconvolutiondepthwise_vulkan.cpp index 852859b6a..494353838 100644 --- a/src/layer/vulkan/deconvolutiondepthwise_vulkan.cpp +++ b/src/layer/vulkan/deconvolutiondepthwise_vulkan.cpp @@ -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 crop_bottom_blobs(2); - crop_bottom_blobs[0] = top_blob_bordered; - crop_bottom_blobs[1] = reference_blob; - std::vector 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 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 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 crop_bottom_blobs(2); - crop_bottom_blobs[0] = top_blob_bordered; - crop_bottom_blobs[1] = reference_blob; - std::vector 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 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 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;