Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions paddle/phi/kernels/cpu/generate_proposals_kernel.cc
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
#include "paddle/phi/kernels/generate_proposals_kernel.h"
#include "paddle/phi/backends/cpu/cpu_context.h"
#include "paddle/phi/core/kernel_registry.h"
#include "paddle/phi/kernels/full_kernel.h"
#include "paddle/phi/kernels/funcs/detection/nms_util.h"
#include "paddle/phi/kernels/funcs/gather.h"

Expand Down Expand Up @@ -314,6 +315,18 @@ void GenerateProposalsKernel(const Context& dev_ctx,

rpn_roi_probs->Resize(common::make_ddim({scores.numel(), 1}));
dev_ctx.template Alloc<T>(rpn_roi_probs);
if (scores.numel() == 0) {
rpn_rois->Resize(common::make_ddim({0, 4}));
if (rpn_rois_num != nullptr) {
rpn_rois_num->Resize(common::make_ddim({}));
phi::Full<int64_t, Context>(
dev_ctx,
phi::IntArray(common::vectorize(rpn_rois_num->dims())),
0,
rpn_rois_num);
}
return;
}

DenseTensor bbox_deltas_swap, scores_swap;
bbox_deltas_swap.Resize(common::make_ddim({num, h_bbox, w_bbox, c_bbox}));
Expand Down
24 changes: 19 additions & 5 deletions paddle/phi/kernels/gpu/generate_proposals_kernel.cu
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ namespace cub = hipcub;
#include "paddle/phi/backends/gpu/gpu_context.h"
#include "paddle/phi/backends/gpu/gpu_primitives.h"
#include "paddle/phi/core/kernel_registry.h"
#include "paddle/phi/kernels/full_kernel.h"
#include "paddle/phi/kernels/funcs/detection/bbox_util.h"
#include "paddle/phi/kernels/funcs/for_range.h"
#include "paddle/phi/kernels/funcs/gather.cu.h"
Expand Down Expand Up @@ -490,6 +491,24 @@ void GenerateProposalsKernel(const Context &dev_ctx,
int64_t h_bbox = bbox_dim[2];
int64_t w_bbox = bbox_dim[3];

rpn_rois->Resize(common::make_ddim({bbox_deltas.numel() / 4, 4}));
dev_ctx.template Alloc<T>(rpn_rois);
rpn_roi_probs->Resize(common::make_ddim({scores.numel(), 1}));
dev_ctx.template Alloc<T>(rpn_roi_probs);

if (scores.numel() == 0) {
rpn_rois->Resize(common::make_ddim({0, 4}));
if (rpn_rois_num != nullptr) {
rpn_rois_num->Resize(common::make_ddim({}));
phi::Full<int64_t, Context>(
dev_ctx,
phi::IntArray(common::vectorize(rpn_rois_num->dims())),
0,
rpn_rois_num);
}
return;
}

DenseTensor bbox_deltas_swap, scores_swap;
bbox_deltas_swap.Resize(common::make_ddim({num, h_bbox, w_bbox, c_bbox}));
dev_ctx.template Alloc<T>(&bbox_deltas_swap);
Expand All @@ -506,11 +525,6 @@ void GenerateProposalsKernel(const Context &dev_ctx,
tmp_anchors.Resize(common::make_ddim({tmp_anchors.numel() / 4, 4}));
tmp_variances.Resize(common::make_ddim({tmp_variances.numel() / 4, 4}));

rpn_rois->Resize(common::make_ddim({bbox_deltas.numel() / 4, 4}));
dev_ctx.template Alloc<T>(rpn_rois);
rpn_roi_probs->Resize(common::make_ddim({scores.numel(), 1}));
dev_ctx.template Alloc<T>(rpn_roi_probs);

T *rpn_rois_data = rpn_rois->data<T>();
T *rpn_roi_probs_data = rpn_roi_probs->data<T>();

Expand Down
28 changes: 21 additions & 7 deletions paddle/phi/kernels/xpu/generate_proposals_kernel.cc
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
#include "paddle/phi/backends/xpu/xpu_context.h"
#include "paddle/phi/common/float16.h"
#include "paddle/phi/core/kernel_registry.h"
#include "paddle/phi/kernels/full_kernel.h"
#include "paddle/phi/kernels/funcs/math_function_impl.h"

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

// output
rpn_rois->Resize(common::make_ddim({bbox_deltas.numel() / 4, 4}));
dev_ctx.template Alloc<T>(rpn_rois);

rpn_roi_probs->Resize(common::make_ddim({scores.numel(), 1}));
dev_ctx.template Alloc<T>(rpn_roi_probs);

if (scores.numel() == 0) {
rpn_rois->Resize(common::make_ddim({0, 4}));
if (rpn_rois_num != nullptr) {
rpn_rois_num->Resize(common::make_ddim({}));
phi::Full<int64_t, Context>(
dev_ctx,
phi::IntArray(common::vectorize(rpn_rois_num->dims())),
0,
rpn_rois_num);
}
return;
}

DenseTensor bbox_deltas_swap, scores_swap;
bbox_deltas_swap.Resize(common::make_ddim({num, h_bbox, w_bbox, c_bbox}));
dev_ctx.template Alloc<T>(&bbox_deltas_swap);
Expand Down Expand Up @@ -333,13 +354,6 @@ void GenerateProposalsKernel(const Context& dev_ctx,
tmp_anchors.Resize(common::make_ddim({tmp_anchors.numel() / 4, 4}));
tmp_variances.Resize(common::make_ddim({tmp_variances.numel() / 4, 4}));

// output
rpn_rois->Resize(common::make_ddim({bbox_deltas.numel() / 4, 4}));
dev_ctx.template Alloc<T>(rpn_rois);

rpn_roi_probs->Resize(common::make_ddim({scores.numel(), 1}));
dev_ctx.template Alloc<T>(rpn_roi_probs);

auto place = dev_ctx.GetPlace();
auto cpu_place = phi::CPUPlace();

Expand Down
89 changes: 89 additions & 0 deletions test/legacy_test/test_generate_proposals_v2_op.py
Original file line number Diff line number Diff line change
Expand Up @@ -560,6 +560,95 @@ def init_test_output(self):
# np.testing.assert_allclose(self.roi_probs_expected, np.array(roi_probs), rtol=1e-5)
# np.testing.assert_allclose(self.rois_num_expected, np.array(rois_num), rtol=1e-5)


class TestGenerateProposalsV2Op_ZeroSize(OpTest):
def set_data(self):
self.init_test_params()
self.init_test_input()
self.init_test_output()
self.inputs = {
'Scores': self.scores,
'BboxDeltas': self.bbox_deltas,
'ImShape': self.im_shape.astype(np.float32),
'Anchors': self.anchors,
'Variances': self.variances,
}

self.attrs = {
'pre_nms_topN': self.pre_nms_topN,
'post_nms_topN': self.post_nms_topN,
'nms_thresh': self.nms_thresh,
'min_size': self.min_size,
'eta': self.eta,
'pixel_offset': self.pixel_offset,
}

self.outputs = {
'RpnRois': self.rpn_rois[0],
'RpnRoiProbs': self.rpn_roi_probs[0],
}

def test_check_output(self):
self.check_output(check_pir=True, check_symbol_infer=False)

def setUp(self):
self.op_type = "generate_proposals_v2"
self.python_api = python_generate_proposals_v2
self.set_data()

def init_test_params(self):
self.pre_nms_topN = 12000 # train 12000, test 2000
self.post_nms_topN = 5000 # train 6000, test 1000
self.nms_thresh = 0.7
self.min_size = 3.0
self.eta = 1.0
self.pixel_offset = True

def init_test_input(self):
batch_size = 1
input_channels = 0
layer_h = 16
layer_w = 16
input_feat = np.random.random(
(batch_size, input_channels, layer_h, layer_w)
).astype('float32')
self.anchors, self.variances = anchor_generator_in_python(
input_feat=input_feat,
anchor_sizes=[16.0, 32.0],
aspect_ratios=[0.5, 1.0],
variances=[1.0, 1.0, 1.0, 1.0],
stride=[16.0, 16.0],
offset=0.5,
)
self.im_shape = np.array([[64, 64]]).astype('float32')
num_anchors = self.anchors.shape[2]
self.scores = np.random.random(
(batch_size, num_anchors, layer_h, layer_w)
).astype('float32')
self.bbox_deltas = np.random.random(
(batch_size, num_anchors * 4, layer_h, layer_w)
).astype('float32')

def init_test_output(self):
(
self.rpn_rois,
self.rpn_roi_probs,
self.rois_num,
) = generate_proposals_v2_in_python(
self.scores,
self.bbox_deltas,
self.im_shape,
self.anchors,
self.variances,
self.pre_nms_topN,
self.post_nms_topN,
self.nms_thresh,
self.min_size,
self.eta,
self.pixel_offset,
)


if __name__ == '__main__':
paddle.enable_static()
unittest.main()