Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
PaddlePaddle
PaddleDetection
提交
0a97d24b
P
PaddleDetection
项目概览
PaddlePaddle
/
PaddleDetection
大约 1 年 前同步成功
通知
695
Star
11112
Fork
2696
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
184
列表
看板
标记
里程碑
合并请求
40
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
P
PaddleDetection
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
184
Issue
184
列表
看板
标记
里程碑
合并请求
40
合并请求
40
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
0a97d24b
编写于
8月 30, 2018
作者:
X
Xingyuan Bu
提交者:
qingqing01
8月 30, 2018
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Faster RCNN Generate Proposal Labels (#12616)
* Add generate_proposal_labels for Faster-RCNN.
上级
cfa6bbb7
变更
8
展开全部
显示空白变更内容
内联
并排
Showing
8 changed file
with
949 addition
and
4 deletion
+949
-4
paddle/fluid/API.spec
paddle/fluid/API.spec
+1
-0
paddle/fluid/operators/detection/CMakeLists.txt
paddle/fluid/operators/detection/CMakeLists.txt
+1
-0
paddle/fluid/operators/detection/generate_proposal_labels_op.cc
.../fluid/operators/detection/generate_proposal_labels_op.cc
+515
-0
paddle/fluid/operators/detection/rpn_target_assign_op.cc
paddle/fluid/operators/detection/rpn_target_assign_op.cc
+2
-2
paddle/fluid/operators/gather_op.cc
paddle/fluid/operators/gather_op.cc
+5
-2
python/paddle/fluid/layers/detection.py
python/paddle/fluid/layers/detection.py
+59
-0
python/paddle/fluid/tests/test_detection.py
python/paddle/fluid/tests/test_detection.py
+49
-0
python/paddle/fluid/tests/unittests/test_generate_proposal_labels.py
...le/fluid/tests/unittests/test_generate_proposal_labels.py
+317
-0
未找到文件。
paddle/fluid/API.spec
浏览文件 @
0a97d24b
...
@@ -303,6 +303,7 @@ paddle.fluid.layers.ssd_loss ArgSpec(args=['location', 'confidence', 'gt_box', '
...
@@ -303,6 +303,7 @@ paddle.fluid.layers.ssd_loss ArgSpec(args=['location', 'confidence', 'gt_box', '
paddle.fluid.layers.detection_map ArgSpec(args=['detect_res', 'label', 'class_num', 'background_label', 'overlap_threshold', 'evaluate_difficult', 'has_state', 'input_states', 'out_states', 'ap_version'], varargs=None, keywords=None, defaults=(0, 0.3, True, None, None, None, 'integral'))
paddle.fluid.layers.detection_map ArgSpec(args=['detect_res', 'label', 'class_num', 'background_label', 'overlap_threshold', 'evaluate_difficult', 'has_state', 'input_states', 'out_states', 'ap_version'], varargs=None, keywords=None, defaults=(0, 0.3, True, None, None, None, 'integral'))
paddle.fluid.layers.rpn_target_assign ArgSpec(args=['loc', 'scores', 'anchor_box', 'gt_box', 'rpn_batch_size_per_im', 'fg_fraction', 'rpn_positive_overlap', 'rpn_negative_overlap'], varargs=None, keywords=None, defaults=(256, 0.25, 0.7, 0.3))
paddle.fluid.layers.rpn_target_assign ArgSpec(args=['loc', 'scores', 'anchor_box', 'gt_box', 'rpn_batch_size_per_im', 'fg_fraction', 'rpn_positive_overlap', 'rpn_negative_overlap'], varargs=None, keywords=None, defaults=(256, 0.25, 0.7, 0.3))
paddle.fluid.layers.anchor_generator ArgSpec(args=['input', 'anchor_sizes', 'aspect_ratios', 'variance', 'stride', 'offset', 'name'], varargs=None, keywords=None, defaults=(None, None, [0.1, 0.1, 0.2, 0.2], None, 0.5, None))
paddle.fluid.layers.anchor_generator ArgSpec(args=['input', 'anchor_sizes', 'aspect_ratios', 'variance', 'stride', 'offset', 'name'], varargs=None, keywords=None, defaults=(None, None, [0.1, 0.1, 0.2, 0.2], None, 0.5, None))
paddle.fluid.layers.generate_proposal_labels ArgSpec(args=['rpn_rois', 'gt_classes', 'gt_boxes', 'im_scales', 'batch_size_per_im', 'fg_fraction', 'fg_thresh', 'bg_thresh_hi', 'bg_thresh_lo', 'bbox_reg_weights', 'class_nums'], varargs=None, keywords=None, defaults=(256, 0.25, 0.25, 0.5, 0.0, [0.1, 0.1, 0.2, 0.2], None))
paddle.fluid.layers.generate_proposals ArgSpec(args=['scores', 'bbox_deltas', 'im_info', 'anchors', 'variances', 'pre_nms_top_n', 'post_nms_top_n', 'nms_thresh', 'min_size', 'eta', 'name'], varargs=None, keywords=None, defaults=(6000, 1000, 0.5, 0.1, 1.0, None))
paddle.fluid.layers.generate_proposals ArgSpec(args=['scores', 'bbox_deltas', 'im_info', 'anchors', 'variances', 'pre_nms_top_n', 'post_nms_top_n', 'nms_thresh', 'min_size', 'eta', 'name'], varargs=None, keywords=None, defaults=(6000, 1000, 0.5, 0.1, 1.0, None))
paddle.fluid.layers.iou_similarity ArgSpec(args=[], varargs='args', keywords='kwargs', defaults=None)
paddle.fluid.layers.iou_similarity ArgSpec(args=[], varargs='args', keywords='kwargs', defaults=None)
paddle.fluid.layers.box_coder ArgSpec(args=[], varargs='args', keywords='kwargs', defaults=None)
paddle.fluid.layers.box_coder ArgSpec(args=[], varargs='args', keywords='kwargs', defaults=None)
...
...
paddle/fluid/operators/detection/CMakeLists.txt
浏览文件 @
0a97d24b
...
@@ -29,6 +29,7 @@ target_assign_op.cu)
...
@@ -29,6 +29,7 @@ target_assign_op.cu)
detection_library
(
polygon_box_transform_op SRCS polygon_box_transform_op.cc
detection_library
(
polygon_box_transform_op SRCS polygon_box_transform_op.cc
polygon_box_transform_op.cu
)
polygon_box_transform_op.cu
)
detection_library
(
rpn_target_assign_op SRCS rpn_target_assign_op.cc
)
detection_library
(
rpn_target_assign_op SRCS rpn_target_assign_op.cc
)
detection_library
(
generate_proposal_labels_op SRCS generate_proposal_labels_op.cc
)
detection_library
(
generate_proposals_op SRCS generate_proposals_op.cc
)
detection_library
(
generate_proposals_op SRCS generate_proposals_op.cc
)
#Export local libraries to parent
#Export local libraries to parent
set
(
DETECTION_LIBRARY
${
LOCAL_DETECTION_LIBS
}
PARENT_SCOPE
)
set
(
DETECTION_LIBRARY
${
LOCAL_DETECTION_LIBS
}
PARENT_SCOPE
)
paddle/fluid/operators/detection/generate_proposal_labels_op.cc
0 → 100644
浏览文件 @
0a97d24b
此差异已折叠。
点击以展开。
paddle/fluid/operators/detection/rpn_target_assign_op.cc
浏览文件 @
0a97d24b
...
@@ -86,7 +86,7 @@ class RpnTargetAssignKernel : public framework::OpKernel<T> {
...
@@ -86,7 +86,7 @@ class RpnTargetAssignKernel : public framework::OpKernel<T> {
std
::
minstd_rand
engine
,
std
::
minstd_rand
engine
,
std
::
vector
<
int
>*
inds
)
const
{
std
::
vector
<
int
>*
inds
)
const
{
std
::
uniform_real_distribution
<
float
>
uniform
(
0
,
1
);
std
::
uniform_real_distribution
<
float
>
uniform
(
0
,
1
);
const
int64_t
size
=
static_cast
<
int64_t
>
(
inds
->
size
());
const
int64_t
size
=
static_cast
<
int64_t
>
(
inds
->
size
()
-
offset
);
if
(
size
>
num
)
{
if
(
size
>
num
)
{
for
(
int64_t
i
=
num
;
i
<
size
;
++
i
)
{
for
(
int64_t
i
=
num
;
i
<
size
;
++
i
)
{
int
rng_ind
=
std
::
floor
(
uniform
(
engine
)
*
i
);
int
rng_ind
=
std
::
floor
(
uniform
(
engine
)
*
i
);
...
@@ -126,7 +126,7 @@ class RpnTargetAssignKernel : public framework::OpKernel<T> {
...
@@ -126,7 +126,7 @@ class RpnTargetAssignKernel : public framework::OpKernel<T> {
neg_threshold
,
target_label_data
,
fg_inds
,
bg_inds
);
neg_threshold
,
target_label_data
,
fg_inds
,
bg_inds
);
// Reservoir Sampling
// Reservoir Sampling
ReservoirSampling
(
fg_num
,
fg_offset
,
engine
,
fg_inds
);
ReservoirSampling
(
fg_num
,
fg_offset
,
engine
,
fg_inds
);
int
bg_num
=
rpn_batch_size
-
fg_inds
->
size
(
);
int
bg_num
=
rpn_batch_size
-
(
fg_inds
->
size
()
-
fg_offset
);
ReservoirSampling
(
bg_num
,
bg_offset
,
engine
,
bg_inds
);
ReservoirSampling
(
bg_num
,
bg_offset
,
engine
,
bg_inds
);
}
}
...
...
paddle/fluid/operators/gather_op.cc
浏览文件 @
0a97d24b
...
@@ -101,5 +101,8 @@ namespace ops = paddle::operators;
...
@@ -101,5 +101,8 @@ namespace ops = paddle::operators;
REGISTER_OPERATOR
(
gather
,
ops
::
GatherOp
,
ops
::
GatherOpMaker
,
REGISTER_OPERATOR
(
gather
,
ops
::
GatherOp
,
ops
::
GatherOpMaker
,
paddle
::
framework
::
DefaultGradOpDescMaker
<
true
>
);
paddle
::
framework
::
DefaultGradOpDescMaker
<
true
>
);
REGISTER_OPERATOR
(
gather_grad
,
ops
::
GatherGradOp
);
REGISTER_OPERATOR
(
gather_grad
,
ops
::
GatherGradOp
);
REGISTER_OP_CPU_KERNEL
(
gather
,
ops
::
GatherOpKernel
<
float
>
);
REGISTER_OP_CPU_KERNEL
(
gather
,
ops
::
GatherOpKernel
<
float
>
,
REGISTER_OP_CPU_KERNEL
(
gather_grad
,
ops
::
GatherGradientOpKernel
<
float
>
);
ops
::
GatherOpKernel
<
int
>
,
ops
::
GatherOpKernel
<
double
>
);
REGISTER_OP_CPU_KERNEL
(
gather_grad
,
ops
::
GatherGradientOpKernel
<
float
>
,
ops
::
GatherGradientOpKernel
<
int
>
,
ops
::
GatherGradientOpKernel
<
double
>
);
python/paddle/fluid/layers/detection.py
浏览文件 @
0a97d24b
...
@@ -39,6 +39,7 @@ __all__ = [
...
@@ -39,6 +39,7 @@ __all__ = [
'detection_map'
,
'detection_map'
,
'rpn_target_assign'
,
'rpn_target_assign'
,
'anchor_generator'
,
'anchor_generator'
,
'generate_proposal_labels'
,
'generate_proposals'
,
'generate_proposals'
,
]
]
...
@@ -1256,6 +1257,64 @@ def anchor_generator(input,
...
@@ -1256,6 +1257,64 @@ def anchor_generator(input,
return
anchor
,
var
return
anchor
,
var
def
generate_proposal_labels
(
rpn_rois
,
gt_classes
,
gt_boxes
,
im_scales
,
batch_size_per_im
=
256
,
fg_fraction
=
0.25
,
fg_thresh
=
0.25
,
bg_thresh_hi
=
0.5
,
bg_thresh_lo
=
0.0
,
bbox_reg_weights
=
[
0.1
,
0.1
,
0.2
,
0.2
],
class_nums
=
None
):
"""
** Generate proposal labels Faster-RCNN **
TODO(buxingyuan): Add Document
"""
helper
=
LayerHelper
(
'generate_proposal_labels'
,
**
locals
())
rois
=
helper
.
create_tmp_variable
(
dtype
=
rpn_rois
.
dtype
)
labels_int32
=
helper
.
create_tmp_variable
(
dtype
=
gt_classes
.
dtype
)
bbox_targets
=
helper
.
create_tmp_variable
(
dtype
=
rpn_rois
.
dtype
)
bbox_inside_weights
=
helper
.
create_tmp_variable
(
dtype
=
rpn_rois
.
dtype
)
bbox_outside_weights
=
helper
.
create_tmp_variable
(
dtype
=
rpn_rois
.
dtype
)
helper
.
append_op
(
type
=
"generate_proposal_labels"
,
inputs
=
{
'RpnRois'
:
rpn_rois
,
'GtClasses'
:
gt_classes
,
'GtBoxes'
:
gt_boxes
,
'ImScales'
:
im_scales
},
outputs
=
{
'Rois'
:
rois
,
'LabelsInt32'
:
labels_int32
,
'BboxTargets'
:
bbox_targets
,
'BboxInsideWeights'
:
bbox_inside_weights
,
'BboxOutsideWeights'
:
bbox_outside_weights
},
attrs
=
{
'batch_size_per_im'
:
batch_size_per_im
,
'fg_fraction'
:
fg_fraction
,
'fg_thresh'
:
fg_thresh
,
'bg_thresh_hi'
:
bg_thresh_hi
,
'bg_thresh_lo'
:
bg_thresh_lo
,
'bbox_reg_weights'
:
bbox_reg_weights
,
'class_nums'
:
class_nums
})
rois
.
stop_gradient
=
True
labels_int32
.
stop_gradient
=
True
bbox_targets
.
stop_gradient
=
True
bbox_inside_weights
.
stop_gradient
=
True
bbox_outside_weights
.
stop_gradient
=
True
return
rois
,
labels_int32
,
bbox_targets
,
bbox_inside_weights
,
bbox_outside_weights
def
generate_proposals
(
scores
,
def
generate_proposals
(
scores
,
bbox_deltas
,
bbox_deltas
,
im_info
,
im_info
,
...
...
python/paddle/fluid/tests/test_detection.py
浏览文件 @
0a97d24b
...
@@ -146,6 +146,55 @@ class TestAnchorGenerator(unittest.TestCase):
...
@@ -146,6 +146,55 @@ class TestAnchorGenerator(unittest.TestCase):
assert
anchor
.
shape
[
3
]
==
4
assert
anchor
.
shape
[
3
]
==
4
class
TestGenerateProposalLabels
(
unittest
.
TestCase
):
def
test_generate_proposal_labels
(
self
):
rpn_rois
=
layers
.
data
(
name
=
'rpn_rois'
,
shape
=
[
4
,
4
],
dtype
=
'float32'
,
lod_level
=
1
,
append_batch_size
=
False
)
gt_classes
=
layers
.
data
(
name
=
'gt_classes'
,
shape
=
[
6
],
dtype
=
'int32'
,
lod_level
=
1
,
append_batch_size
=
False
)
gt_boxes
=
layers
.
data
(
name
=
'gt_boxes'
,
shape
=
[
6
,
4
],
dtype
=
'float32'
,
lod_level
=
1
,
append_batch_size
=
False
)
im_scales
=
layers
.
data
(
name
=
'im_scales'
,
shape
=
[
1
],
dtype
=
'float32'
,
lod_level
=
1
,
append_batch_size
=
False
)
class_nums
=
5
rois
,
labels_int32
,
bbox_targets
,
bbox_inside_weights
,
bbox_outside_weights
=
fluid
.
layers
.
generate_proposal_labels
(
rpn_rois
=
rpn_rois
,
gt_classes
=
gt_classes
,
gt_boxes
=
gt_boxes
,
im_scales
=
im_scales
,
batch_size_per_im
=
2
,
fg_fraction
=
0.5
,
fg_thresh
=
0.5
,
bg_thresh_hi
=
0.5
,
bg_thresh_lo
=
0.0
,
bbox_reg_weights
=
[
0.1
,
0.1
,
0.2
,
0.2
],
class_nums
=
class_nums
)
assert
rois
.
shape
[
1
]
==
4
assert
rois
.
shape
[
0
]
==
labels_int32
.
shape
[
0
]
assert
rois
.
shape
[
0
]
==
bbox_targets
.
shape
[
0
]
assert
rois
.
shape
[
0
]
==
bbox_inside_weights
.
shape
[
0
]
assert
rois
.
shape
[
0
]
==
bbox_outside_weights
.
shape
[
0
]
assert
bbox_targets
.
shape
[
1
]
==
4
*
class_nums
assert
bbox_inside_weights
.
shape
[
1
]
==
4
*
class_nums
assert
bbox_outside_weights
.
shape
[
1
]
==
4
*
class_nums
class
TestMultiBoxHead
(
unittest
.
TestCase
):
class
TestMultiBoxHead
(
unittest
.
TestCase
):
def
test_multi_box_head
(
self
):
def
test_multi_box_head
(
self
):
data_shape
=
[
3
,
224
,
224
]
data_shape
=
[
3
,
224
,
224
]
...
...
python/paddle/fluid/tests/unittests/test_generate_proposal_labels.py
0 → 100644
浏览文件 @
0a97d24b
# Copyright (c) 2018 PaddlePaddle Authors. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://w_idxw.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import
unittest
import
numpy
as
np
import
sys
import
math
import
paddle.fluid
as
fluid
from
op_test
import
OpTest
def
generate_proposal_labels_in_python
(
rpn_rois
,
gt_classes
,
gt_boxes
,
im_scales
,
batch_size_per_im
,
fg_fraction
,
fg_thresh
,
bg_thresh_hi
,
bg_thresh_lo
,
bbox_reg_weights
,
class_nums
):
rois
=
[]
labels_int32
=
[]
bbox_targets
=
[]
bbox_inside_weights
=
[]
bbox_outside_weights
=
[]
lod
=
[]
assert
len
(
rpn_rois
)
==
len
(
im_scales
),
'batch size of rpn_rois and ground_truth is not matched'
for
im_i
in
range
(
len
(
im_scales
)):
frcn_blobs
=
_sample_rois
(
rpn_rois
[
im_i
],
gt_classes
[
im_i
],
gt_boxes
[
im_i
],
im_scales
[
im_i
],
batch_size_per_im
,
fg_fraction
,
fg_thresh
,
bg_thresh_hi
,
bg_thresh_lo
,
bbox_reg_weights
,
class_nums
)
lod
.
append
(
frcn_blobs
[
'rois'
].
shape
[
0
])
rois
.
append
(
frcn_blobs
[
'rois'
])
labels_int32
.
append
(
frcn_blobs
[
'labels_int32'
])
bbox_targets
.
append
(
frcn_blobs
[
'bbox_targets'
])
bbox_inside_weights
.
append
(
frcn_blobs
[
'bbox_inside_weights'
])
bbox_outside_weights
.
append
(
frcn_blobs
[
'bbox_outside_weights'
])
return
rois
,
labels_int32
,
bbox_targets
,
bbox_inside_weights
,
bbox_outside_weights
,
lod
def
_sample_rois
(
rpn_rois
,
gt_classes
,
gt_boxes
,
im_scale
,
batch_size_per_im
,
fg_fraction
,
fg_thresh
,
bg_thresh_hi
,
bg_thresh_lo
,
bbox_reg_weights
,
class_nums
):
rois_per_image
=
int
(
batch_size_per_im
)
fg_rois_per_im
=
int
(
np
.
round
(
fg_fraction
*
rois_per_image
))
# Roidb
inv_im_scale
=
1.
/
im_scale
rpn_rois
=
rpn_rois
*
inv_im_scale
boxes
=
np
.
vstack
([
gt_boxes
,
rpn_rois
])
gt_overlaps
=
np
.
zeros
((
boxes
.
shape
[
0
],
class_nums
))
box_to_gt_ind_map
=
np
.
zeros
((
boxes
.
shape
[
0
]),
dtype
=
np
.
int32
)
if
len
(
gt_boxes
)
>
0
:
proposal_to_gt_overlaps
=
_bbox_overlaps
(
boxes
,
gt_boxes
)
overlaps_argmax
=
proposal_to_gt_overlaps
.
argmax
(
axis
=
1
)
overlaps_max
=
proposal_to_gt_overlaps
.
max
(
axis
=
1
)
# Boxes which with non-zero overlap with gt boxes
overlapped_boxes_ind
=
np
.
where
(
overlaps_max
>
0
)[
0
]
overlapped_boxes_gt_classes
=
gt_classes
[
overlaps_argmax
[
overlapped_boxes_ind
]]
gt_overlaps
[
overlapped_boxes_ind
,
overlapped_boxes_gt_classes
]
=
overlaps_max
[
overlapped_boxes_ind
]
box_to_gt_ind_map
[
overlapped_boxes_ind
]
=
overlaps_argmax
[
overlapped_boxes_ind
]
max_overlaps
=
gt_overlaps
.
max
(
axis
=
1
)
max_classes
=
gt_overlaps
.
argmax
(
axis
=
1
)
# Foreground
fg_inds
=
np
.
where
(
max_overlaps
>=
fg_thresh
)[
0
]
fg_rois_per_this_image
=
np
.
minimum
(
fg_rois_per_im
,
fg_inds
.
shape
[
0
])
# Sample foreground if there are too many
if
fg_inds
.
shape
[
0
]
>
fg_rois_per_this_image
:
fg_inds
=
np
.
random
.
choice
(
fg_inds
,
size
=
fg_rois_per_this_image
,
replace
=
False
)
# Background
bg_inds
=
np
.
where
((
max_overlaps
<
bg_thresh_hi
)
&
(
max_overlaps
>=
bg_thresh_lo
))[
0
]
bg_rois_per_this_image
=
rois_per_image
-
fg_rois_per_this_image
bg_rois_per_this_image
=
np
.
minimum
(
bg_rois_per_this_image
,
bg_inds
.
shape
[
0
])
# Sample background if there are too many
if
bg_inds
.
shape
[
0
]
>
bg_rois_per_this_image
:
bg_inds
=
np
.
random
.
choice
(
bg_inds
,
size
=
bg_rois_per_this_image
,
replace
=
False
)
keep_inds
=
np
.
append
(
fg_inds
,
bg_inds
)
sampled_labels
=
max_classes
[
keep_inds
]
sampled_labels
[
fg_rois_per_this_image
:]
=
0
sampled_boxes
=
boxes
[
keep_inds
]
sampled_gts
=
gt_boxes
[
box_to_gt_ind_map
[
keep_inds
]]
sampled_gts
[
fg_rois_per_this_image
:,
:]
=
gt_boxes
[
0
]
bbox_label_targets
=
_compute_targets
(
sampled_boxes
,
sampled_gts
,
sampled_labels
,
bbox_reg_weights
)
bbox_targets
,
bbox_inside_weights
=
_expand_bbox_targets
(
bbox_label_targets
,
class_nums
)
bbox_outside_weights
=
np
.
array
(
bbox_inside_weights
>
0
,
dtype
=
bbox_inside_weights
.
dtype
)
# Scale rois
sampled_rois
=
sampled_boxes
*
im_scale
# Faster RCNN blobs
frcn_blobs
=
dict
(
rois
=
sampled_rois
,
labels_int32
=
sampled_labels
,
bbox_targets
=
bbox_targets
,
bbox_inside_weights
=
bbox_inside_weights
,
bbox_outside_weights
=
bbox_outside_weights
)
return
frcn_blobs
def
_bbox_overlaps
(
roi_boxes
,
gt_boxes
):
w1
=
np
.
maximum
(
roi_boxes
[:,
2
]
-
roi_boxes
[:,
0
]
+
1
,
0
)
h1
=
np
.
maximum
(
roi_boxes
[:,
3
]
-
roi_boxes
[:,
1
]
+
1
,
0
)
w2
=
np
.
maximum
(
gt_boxes
[:,
2
]
-
gt_boxes
[:,
0
]
+
1
,
0
)
h2
=
np
.
maximum
(
gt_boxes
[:,
3
]
-
gt_boxes
[:,
1
]
+
1
,
0
)
area1
=
w1
*
h1
area2
=
w2
*
h2
overlaps
=
np
.
zeros
((
roi_boxes
.
shape
[
0
],
gt_boxes
.
shape
[
0
]))
for
ind1
in
range
(
roi_boxes
.
shape
[
0
]):
for
ind2
in
range
(
gt_boxes
.
shape
[
0
]):
inter_x1
=
np
.
maximum
(
roi_boxes
[
ind1
,
0
],
gt_boxes
[
ind2
,
0
])
inter_y1
=
np
.
maximum
(
roi_boxes
[
ind1
,
1
],
gt_boxes
[
ind2
,
1
])
inter_x2
=
np
.
minimum
(
roi_boxes
[
ind1
,
2
],
gt_boxes
[
ind2
,
2
])
inter_y2
=
np
.
minimum
(
roi_boxes
[
ind1
,
3
],
gt_boxes
[
ind2
,
3
])
inter_w
=
np
.
maximum
(
inter_x2
-
inter_x1
+
1
,
0
)
inter_h
=
np
.
maximum
(
inter_y2
-
inter_y1
+
1
,
0
)
inter_area
=
inter_w
*
inter_h
iou
=
inter_area
/
(
area1
[
ind1
]
+
area2
[
ind2
]
-
inter_area
)
overlaps
[
ind1
,
ind2
]
=
iou
return
overlaps
def
_compute_targets
(
roi_boxes
,
gt_boxes
,
labels
,
bbox_reg_weights
):
assert
roi_boxes
.
shape
[
0
]
==
gt_boxes
.
shape
[
0
]
assert
roi_boxes
.
shape
[
1
]
==
4
assert
gt_boxes
.
shape
[
1
]
==
4
targets
=
np
.
zeros
(
roi_boxes
.
shape
)
bbox_reg_weights
=
np
.
asarray
(
bbox_reg_weights
)
targets
=
_box_to_delta
(
ex_boxes
=
roi_boxes
,
gt_boxes
=
gt_boxes
,
weights
=
bbox_reg_weights
)
return
np
.
hstack
([
labels
[:,
np
.
newaxis
],
targets
]).
astype
(
np
.
float32
,
copy
=
False
)
def
_box_to_delta
(
ex_boxes
,
gt_boxes
,
weights
):
ex_w
=
ex_boxes
[:,
2
]
-
ex_boxes
[:,
0
]
+
1
ex_h
=
ex_boxes
[:,
3
]
-
ex_boxes
[:,
1
]
+
1
ex_ctr_x
=
ex_boxes
[:,
0
]
+
0.5
*
ex_w
ex_ctr_y
=
ex_boxes
[:,
1
]
+
0.5
*
ex_h
gt_w
=
gt_boxes
[:,
2
]
-
gt_boxes
[:,
0
]
+
1
gt_h
=
gt_boxes
[:,
3
]
-
gt_boxes
[:,
1
]
+
1
gt_ctr_x
=
gt_boxes
[:,
0
]
+
0.5
*
gt_w
gt_ctr_y
=
gt_boxes
[:,
1
]
+
0.5
*
gt_h
dx
=
(
gt_ctr_x
-
ex_ctr_x
)
/
ex_w
/
weights
[
0
]
dy
=
(
gt_ctr_y
-
ex_ctr_y
)
/
ex_h
/
weights
[
1
]
dw
=
(
np
.
log
(
gt_w
/
ex_w
))
/
ex_w
/
weights
[
2
]
dh
=
(
np
.
log
(
gt_h
/
ex_h
))
/
ex_h
/
weights
[
3
]
targets
=
np
.
vstack
([
dx
,
dy
,
dw
,
dh
]).
transpose
()
return
targets
def
_expand_bbox_targets
(
bbox_targets_input
,
class_nums
):
class_labels
=
bbox_targets_input
[:,
0
]
fg_inds
=
np
.
where
(
class_labels
>
0
)[
0
]
bbox_targets
=
np
.
zeros
((
class_labels
.
shape
[
0
],
4
*
class_nums
))
bbox_inside_weights
=
np
.
zeros
(
bbox_targets
.
shape
)
for
ind
in
fg_inds
:
class_label
=
int
(
class_labels
[
ind
])
start_ind
=
class_label
*
4
end_ind
=
class_label
*
4
+
4
bbox_targets
[
ind
,
start_ind
:
end_ind
]
=
bbox_targets_input
[
ind
,
1
:]
bbox_inside_weights
[
ind
,
start_ind
:
end_ind
]
=
(
1.0
,
1.0
,
1.0
,
1.0
)
return
bbox_targets
,
bbox_inside_weights
class
TestGenerateProposalLabelsOp
(
OpTest
):
def
set_data
(
self
):
self
.
init_test_params
()
self
.
init_test_input
()
self
.
init_test_output
()
self
.
inputs
=
{
'RpnRois'
:
(
self
.
rpn_rois
[
0
],
self
.
rpn_rois_lod
),
'GtClasses'
:
(
self
.
gt_classes
[
0
],
self
.
gts_lod
),
'GtBoxes'
:
(
self
.
gt_boxes
[
0
],
self
.
gts_lod
),
'ImScales'
:
self
.
im_scales
[
0
]
}
self
.
attrs
=
{
'batch_size_per_im'
:
self
.
batch_size_per_im
,
'fg_fraction'
:
self
.
fg_fraction
,
'fg_thresh'
:
self
.
fg_thresh
,
'bg_thresh_hi'
:
self
.
bg_thresh_hi
,
'bg_thresh_lo'
:
self
.
bg_thresh_lo
,
'bbox_reg_weights'
:
self
.
bbox_reg_weights
,
'class_nums'
:
self
.
class_nums
}
self
.
outputs
=
{
'Rois'
:
(
self
.
rois
[
0
],
[
self
.
lod
]),
'LabelsInt32'
:
(
self
.
labels_int32
[
0
],
[
self
.
lod
]),
'BboxTargets'
:
(
self
.
bbox_targets
[
0
],
[
self
.
lod
]),
'BboxInsideWeights'
:
(
self
.
bbox_inside_weights
[
0
],
[
self
.
lod
]),
'BboxOutsideWeights'
:
(
self
.
bbox_outside_weights
[
0
],
[
self
.
lod
]),
}
def
test_check_output
(
self
):
self
.
check_output
()
def
setUp
(
self
):
self
.
op_type
=
'generate_proposal_labels'
self
.
set_data
()
def
init_test_params
(
self
):
self
.
batch_size_per_im
=
10
self
.
fg_fraction
=
1.0
self
.
fg_thresh
=
0.5
self
.
bg_thresh_hi
=
0.5
self
.
bg_thresh_lo
=
0.0
self
.
bbox_reg_weights
=
[
0.1
,
0.1
,
0.2
,
0.2
]
self
.
class_nums
=
81
def
init_test_input
(
self
):
np
.
random
.
seed
(
0
)
image_nums
=
1
gt_nums
=
6
# Keep same with batch_size_per_im for unittest
proposal_nums
=
self
.
batch_size_per_im
-
gt_nums
images_shape
=
[]
self
.
im_scales
=
[]
for
i
in
range
(
image_nums
):
images_shape
.
append
(
np
.
random
.
randint
(
200
,
size
=
2
))
self
.
im_scales
.
append
(
np
.
ones
((
1
)).
astype
(
np
.
float32
))
self
.
rpn_rois
,
self
.
rpn_rois_lod
=
_generate_proposals
(
images_shape
,
proposal_nums
)
ground_truth
,
self
.
gts_lod
=
_generate_groundtruth
(
images_shape
,
self
.
class_nums
,
gt_nums
)
self
.
gt_classes
=
[
gt
[
'gt_classes'
]
for
gt
in
ground_truth
]
self
.
gt_boxes
=
[
gt
[
'boxes'
]
for
gt
in
ground_truth
]
def
init_test_output
(
self
):
self
.
rois
,
self
.
labels_int32
,
self
.
bbox_targets
,
\
self
.
bbox_inside_weights
,
self
.
bbox_outside_weights
,
\
self
.
lod
=
generate_proposal_labels_in_python
(
self
.
rpn_rois
,
self
.
gt_classes
,
self
.
gt_boxes
,
self
.
im_scales
,
self
.
batch_size_per_im
,
self
.
fg_fraction
,
self
.
fg_thresh
,
self
.
bg_thresh_hi
,
self
.
bg_thresh_lo
,
self
.
bbox_reg_weights
,
self
.
class_nums
)
def
_generate_proposals
(
images_shape
,
proposal_nums
):
rpn_rois
=
[]
rpn_rois_lod
=
[]
num_proposals
=
0
for
i
,
image_shape
in
enumerate
(
images_shape
):
proposals
=
_generate_boxes
(
image_shape
,
proposal_nums
)
rpn_rois
.
append
(
proposals
)
num_proposals
+=
len
(
proposals
)
rpn_rois_lod
.
append
(
num_proposals
)
return
rpn_rois
,
[
rpn_rois_lod
]
def
_generate_groundtruth
(
images_shape
,
class_nums
,
gt_nums
):
ground_truth
=
[]
gts_lod
=
[]
num_gts
=
0
for
i
,
image_shape
in
enumerate
(
images_shape
):
# Avoid background
gt_classes
=
np
.
random
.
randint
(
low
=
1
,
high
=
class_nums
,
size
=
gt_nums
).
astype
(
np
.
int32
)
gt_boxes
=
_generate_boxes
(
image_shape
,
gt_nums
)
ground_truth
.
append
(
dict
(
gt_classes
=
gt_classes
,
boxes
=
gt_boxes
))
num_gts
+=
len
(
gt_classes
)
gts_lod
.
append
(
num_gts
)
return
ground_truth
,
[
gts_lod
]
def
_generate_boxes
(
image_size
,
box_nums
):
width
=
image_size
[
0
]
height
=
image_size
[
1
]
xywh
=
np
.
random
.
rand
(
box_nums
,
4
)
xy1
=
xywh
[:,
[
0
,
1
]]
*
image_size
wh
=
xywh
[:,
[
2
,
3
]]
*
(
image_size
-
xy1
)
xy2
=
xy1
+
wh
boxes
=
np
.
hstack
([
xy1
,
xy2
])
boxes
[:,
[
0
,
2
]]
=
np
.
minimum
(
width
-
1.
,
np
.
maximum
(
0.
,
boxes
[:,
[
0
,
2
]]))
boxes
[:,
[
1
,
3
]]
=
np
.
minimum
(
height
-
1.
,
np
.
maximum
(
0.
,
boxes
[:,
[
1
,
3
]]))
return
boxes
.
astype
(
np
.
float32
)
if
__name__
==
'__main__'
:
unittest
.
main
()
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录