Skip to content

Commit 32e3f18

Browse files
authored
[0-size Tensor No.358] Add 0-size Tensor support for paddle.vision.ops.generate_proposals [fluid_ops] (#74261)
* Fix * ci
1 parent 746eeff commit 32e3f18

File tree

4 files changed

+142
-12
lines changed

4 files changed

+142
-12
lines changed

paddle/phi/kernels/cpu/generate_proposals_kernel.cc

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#include "paddle/phi/kernels/generate_proposals_kernel.h"
1616
#include "paddle/phi/backends/cpu/cpu_context.h"
1717
#include "paddle/phi/core/kernel_registry.h"
18+
#include "paddle/phi/kernels/full_kernel.h"
1819
#include "paddle/phi/kernels/funcs/detection/nms_util.h"
1920
#include "paddle/phi/kernels/funcs/gather.h"
2021

@@ -314,6 +315,18 @@ void GenerateProposalsKernel(const Context& dev_ctx,
314315

315316
rpn_roi_probs->Resize(common::make_ddim({scores.numel(), 1}));
316317
dev_ctx.template Alloc<T>(rpn_roi_probs);
318+
if (scores.numel() == 0) {
319+
rpn_rois->Resize(common::make_ddim({0, 4}));
320+
if (rpn_rois_num != nullptr) {
321+
rpn_rois_num->Resize(common::make_ddim({}));
322+
phi::Full<int64_t, Context>(
323+
dev_ctx,
324+
phi::IntArray(common::vectorize(rpn_rois_num->dims())),
325+
0,
326+
rpn_rois_num);
327+
}
328+
return;
329+
}
317330

318331
DenseTensor bbox_deltas_swap, scores_swap;
319332
bbox_deltas_swap.Resize(common::make_ddim({num, h_bbox, w_bbox, c_bbox}));

paddle/phi/kernels/gpu/generate_proposals_kernel.cu

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ namespace cub = hipcub;
2727
#include "paddle/phi/backends/gpu/gpu_context.h"
2828
#include "paddle/phi/backends/gpu/gpu_primitives.h"
2929
#include "paddle/phi/core/kernel_registry.h"
30+
#include "paddle/phi/kernels/full_kernel.h"
3031
#include "paddle/phi/kernels/funcs/detection/bbox_util.h"
3132
#include "paddle/phi/kernels/funcs/for_range.h"
3233
#include "paddle/phi/kernels/funcs/gather.cu.h"
@@ -490,6 +491,24 @@ void GenerateProposalsKernel(const Context &dev_ctx,
490491
int64_t h_bbox = bbox_dim[2];
491492
int64_t w_bbox = bbox_dim[3];
492493

494+
rpn_rois->Resize(common::make_ddim({bbox_deltas.numel() / 4, 4}));
495+
dev_ctx.template Alloc<T>(rpn_rois);
496+
rpn_roi_probs->Resize(common::make_ddim({scores.numel(), 1}));
497+
dev_ctx.template Alloc<T>(rpn_roi_probs);
498+
499+
if (scores.numel() == 0) {
500+
rpn_rois->Resize(common::make_ddim({0, 4}));
501+
if (rpn_rois_num != nullptr) {
502+
rpn_rois_num->Resize(common::make_ddim({}));
503+
phi::Full<int64_t, Context>(
504+
dev_ctx,
505+
phi::IntArray(common::vectorize(rpn_rois_num->dims())),
506+
0,
507+
rpn_rois_num);
508+
}
509+
return;
510+
}
511+
493512
DenseTensor bbox_deltas_swap, scores_swap;
494513
bbox_deltas_swap.Resize(common::make_ddim({num, h_bbox, w_bbox, c_bbox}));
495514
dev_ctx.template Alloc<T>(&bbox_deltas_swap);
@@ -506,11 +525,6 @@ void GenerateProposalsKernel(const Context &dev_ctx,
506525
tmp_anchors.Resize(common::make_ddim({tmp_anchors.numel() / 4, 4}));
507526
tmp_variances.Resize(common::make_ddim({tmp_variances.numel() / 4, 4}));
508527

509-
rpn_rois->Resize(common::make_ddim({bbox_deltas.numel() / 4, 4}));
510-
dev_ctx.template Alloc<T>(rpn_rois);
511-
rpn_roi_probs->Resize(common::make_ddim({scores.numel(), 1}));
512-
dev_ctx.template Alloc<T>(rpn_roi_probs);
513-
514528
T *rpn_rois_data = rpn_rois->data<T>();
515529
T *rpn_roi_probs_data = rpn_roi_probs->data<T>();
516530

paddle/phi/kernels/xpu/generate_proposals_kernel.cc

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#include "paddle/phi/backends/xpu/xpu_context.h"
1919
#include "paddle/phi/common/float16.h"
2020
#include "paddle/phi/core/kernel_registry.h"
21+
#include "paddle/phi/kernels/full_kernel.h"
2122
#include "paddle/phi/kernels/funcs/math_function_impl.h"
2223

2324
#include "paddle/phi/common/memory_utils.h"
@@ -306,6 +307,26 @@ void GenerateProposalsKernel(const Context& dev_ctx,
306307
int h_bbox = bbox_dim[2];
307308
int w_bbox = bbox_dim[3];
308309

310+
// output
311+
rpn_rois->Resize(common::make_ddim({bbox_deltas.numel() / 4, 4}));
312+
dev_ctx.template Alloc<T>(rpn_rois);
313+
314+
rpn_roi_probs->Resize(common::make_ddim({scores.numel(), 1}));
315+
dev_ctx.template Alloc<T>(rpn_roi_probs);
316+
317+
if (scores.numel() == 0) {
318+
rpn_rois->Resize(common::make_ddim({0, 4}));
319+
if (rpn_rois_num != nullptr) {
320+
rpn_rois_num->Resize(common::make_ddim({}));
321+
phi::Full<int64_t, Context>(
322+
dev_ctx,
323+
phi::IntArray(common::vectorize(rpn_rois_num->dims())),
324+
0,
325+
rpn_rois_num);
326+
}
327+
return;
328+
}
329+
309330
DenseTensor bbox_deltas_swap, scores_swap;
310331
bbox_deltas_swap.Resize(common::make_ddim({num, h_bbox, w_bbox, c_bbox}));
311332
dev_ctx.template Alloc<T>(&bbox_deltas_swap);
@@ -333,13 +354,6 @@ void GenerateProposalsKernel(const Context& dev_ctx,
333354
tmp_anchors.Resize(common::make_ddim({tmp_anchors.numel() / 4, 4}));
334355
tmp_variances.Resize(common::make_ddim({tmp_variances.numel() / 4, 4}));
335356

336-
// output
337-
rpn_rois->Resize(common::make_ddim({bbox_deltas.numel() / 4, 4}));
338-
dev_ctx.template Alloc<T>(rpn_rois);
339-
340-
rpn_roi_probs->Resize(common::make_ddim({scores.numel(), 1}));
341-
dev_ctx.template Alloc<T>(rpn_roi_probs);
342-
343357
auto place = dev_ctx.GetPlace();
344358
auto cpu_place = phi::CPUPlace();
345359

test/legacy_test/test_generate_proposals_v2_op.py

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -560,6 +560,95 @@ def init_test_output(self):
560560
# np.testing.assert_allclose(self.roi_probs_expected, np.array(roi_probs), rtol=1e-5)
561561
# np.testing.assert_allclose(self.rois_num_expected, np.array(rois_num), rtol=1e-5)
562562

563+
564+
class TestGenerateProposalsV2Op_ZeroSize(OpTest):
565+
def set_data(self):
566+
self.init_test_params()
567+
self.init_test_input()
568+
self.init_test_output()
569+
self.inputs = {
570+
'Scores': self.scores,
571+
'BboxDeltas': self.bbox_deltas,
572+
'ImShape': self.im_shape.astype(np.float32),
573+
'Anchors': self.anchors,
574+
'Variances': self.variances,
575+
}
576+
577+
self.attrs = {
578+
'pre_nms_topN': self.pre_nms_topN,
579+
'post_nms_topN': self.post_nms_topN,
580+
'nms_thresh': self.nms_thresh,
581+
'min_size': self.min_size,
582+
'eta': self.eta,
583+
'pixel_offset': self.pixel_offset,
584+
}
585+
586+
self.outputs = {
587+
'RpnRois': self.rpn_rois[0],
588+
'RpnRoiProbs': self.rpn_roi_probs[0],
589+
}
590+
591+
def test_check_output(self):
592+
self.check_output(check_pir=True, check_symbol_infer=False)
593+
594+
def setUp(self):
595+
self.op_type = "generate_proposals_v2"
596+
self.python_api = python_generate_proposals_v2
597+
self.set_data()
598+
599+
def init_test_params(self):
600+
self.pre_nms_topN = 12000 # train 12000, test 2000
601+
self.post_nms_topN = 5000 # train 6000, test 1000
602+
self.nms_thresh = 0.7
603+
self.min_size = 3.0
604+
self.eta = 1.0
605+
self.pixel_offset = True
606+
607+
def init_test_input(self):
608+
batch_size = 1
609+
input_channels = 0
610+
layer_h = 16
611+
layer_w = 16
612+
input_feat = np.random.random(
613+
(batch_size, input_channels, layer_h, layer_w)
614+
).astype('float32')
615+
self.anchors, self.variances = anchor_generator_in_python(
616+
input_feat=input_feat,
617+
anchor_sizes=[16.0, 32.0],
618+
aspect_ratios=[0.5, 1.0],
619+
variances=[1.0, 1.0, 1.0, 1.0],
620+
stride=[16.0, 16.0],
621+
offset=0.5,
622+
)
623+
self.im_shape = np.array([[64, 64]]).astype('float32')
624+
num_anchors = self.anchors.shape[2]
625+
self.scores = np.random.random(
626+
(batch_size, num_anchors, layer_h, layer_w)
627+
).astype('float32')
628+
self.bbox_deltas = np.random.random(
629+
(batch_size, num_anchors * 4, layer_h, layer_w)
630+
).astype('float32')
631+
632+
def init_test_output(self):
633+
(
634+
self.rpn_rois,
635+
self.rpn_roi_probs,
636+
self.rois_num,
637+
) = generate_proposals_v2_in_python(
638+
self.scores,
639+
self.bbox_deltas,
640+
self.im_shape,
641+
self.anchors,
642+
self.variances,
643+
self.pre_nms_topN,
644+
self.post_nms_topN,
645+
self.nms_thresh,
646+
self.min_size,
647+
self.eta,
648+
self.pixel_offset,
649+
)
650+
651+
563652
if __name__ == '__main__':
564653
paddle.enable_static()
565654
unittest.main()

0 commit comments

Comments
 (0)