Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
S
seminar-breakout
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Shashank Suhas
seminar-breakout
Commits
70b70736
Commit
70b70736
authored
Jul 01, 2018
by
Yuxin Wu
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[MaskCNN] move fpn-rpn and fpn-proposals to models
parent
8d2febb7
Changes
3
Show whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
90 additions
and
37 deletions
+90
-37
examples/FasterRCNN/config.py
examples/FasterRCNN/config.py
+1
-0
examples/FasterRCNN/model.py
examples/FasterRCNN/model.py
+72
-0
examples/FasterRCNN/train.py
examples/FasterRCNN/train.py
+17
-37
No files found.
examples/FasterRCNN/config.py
View file @
70b70736
...
@@ -107,6 +107,7 @@ _C.RPN.BATCH_PER_IM = 256 # total (across FPN levels) number of anchors that ar
...
@@ -107,6 +107,7 @@ _C.RPN.BATCH_PER_IM = 256 # total (across FPN levels) number of anchors that ar
_C
.
RPN
.
MIN_SIZE
=
0
_C
.
RPN
.
MIN_SIZE
=
0
_C
.
RPN
.
PROPOSAL_NMS_THRESH
=
0.7
_C
.
RPN
.
PROPOSAL_NMS_THRESH
=
0.7
_C
.
RPN
.
CROWD_OVERLAP_THRES
=
0.7
# boxes overlapping crowd will be ignored.
_C
.
RPN
.
CROWD_OVERLAP_THRES
=
0.7
# boxes overlapping crowd will be ignored.
_C
.
RPN
.
HEAD_DIM
=
1024
# used in C4 only
# RPN proposal selection -------------------------------
# RPN proposal selection -------------------------------
# for C4
# for C4
...
...
examples/FasterRCNN/model.py
View file @
70b70736
...
@@ -569,3 +569,75 @@ def multilevel_roi_align(features, rcnn_boxes, resolution):
...
@@ -569,3 +569,75 @@ def multilevel_roi_align(features, rcnn_boxes, resolution):
level_id_invert_perm
=
tf
.
invert_permutation
(
level_id_perm
)
level_id_invert_perm
=
tf
.
invert_permutation
(
level_id_perm
)
all_rois
=
tf
.
gather
(
all_rois
,
level_id_invert_perm
)
all_rois
=
tf
.
gather
(
all_rois
,
level_id_invert_perm
)
return
all_rois
return
all_rois
def
multilevel_rpn_losses
(
multilevel_anchors
,
multilevel_label_logits
,
multilevel_box_logits
):
"""
Args:
multilevel_anchors: #lvl RPNAnchors
multilevel_label_logits: #lvl tensors of shape HxWxA
multilevel_box_logits: #lvl tensors of shape HxWxAx4
Returns:
label_loss, box_loss
"""
num_lvl
=
len
(
cfg
.
FPN
.
ANCHOR_STRIDES
)
assert
len
(
multilevel_anchors
)
==
num_lvl
assert
len
(
multilevel_label_logits
)
==
num_lvl
assert
len
(
multilevel_box_logits
)
==
num_lvl
losses
=
[]
for
lvl
in
range
(
num_lvl
):
with
tf
.
name_scope
(
'RPNLoss_Lvl{}'
.
format
(
lvl
+
2
)):
anchors
=
multilevel_anchors
[
lvl
]
label_loss
,
box_loss
=
rpn_losses
(
anchors
.
gt_labels
,
anchors
.
encoded_gt_boxes
(),
multilevel_label_logits
[
lvl
],
multilevel_box_logits
[
lvl
])
losses
.
extend
([
label_loss
,
box_loss
])
with
tf
.
name_scope
(
'rpn_losses'
):
total_label_loss
=
tf
.
add_n
(
losses
[::
2
],
name
=
'label_loss'
)
total_box_loss
=
tf
.
add_n
(
losses
[
1
::
2
],
name
=
'box_loss'
)
add_moving_summary
(
total_label_loss
,
total_box_loss
)
return
total_label_loss
,
total_box_loss
def
generate_fpn_proposals
(
multilevel_anchors
,
multilevel_label_logits
,
multilevel_box_logits
,
image_shape2d
,
pre_nms_topk
,
post_nms_topk
):
"""
Args:
multilevel_anchors: #lvl RPNAnchors
multilevel_label_logits: #lvl tensors of shape HxWxA
multilevel_box_logits: #lvl tensors of shape HxWxAx4
Returns:
boxes: kx4 float
scores: k logits
"""
num_lvl
=
len
(
cfg
.
FPN
.
ANCHOR_STRIDES
)
assert
len
(
multilevel_anchors
)
==
num_lvl
assert
len
(
multilevel_label_logits
)
==
num_lvl
assert
len
(
multilevel_box_logits
)
==
num_lvl
all_boxes
=
[]
all_scores
=
[]
for
lvl
in
range
(
num_lvl
):
with
tf
.
name_scope
(
'FPNProposal_Lvl{}'
.
format
(
lvl
+
2
)):
anchors
=
multilevel_anchors
[
lvl
]
pred_boxes_decoded
=
anchors
.
decode_logits
(
multilevel_box_logits
[
lvl
])
proposal_boxes
,
proposal_scores
=
generate_rpn_proposals
(
tf
.
reshape
(
pred_boxes_decoded
,
[
-
1
,
4
]),
tf
.
reshape
(
multilevel_label_logits
[
lvl
],
[
-
1
]),
image_shape2d
,
pre_nms_topk
)
all_boxes
.
append
(
proposal_boxes
)
all_scores
.
append
(
proposal_scores
)
proposal_boxes
=
tf
.
concat
(
all_boxes
,
axis
=
0
)
# nx4
proposal_scores
=
tf
.
concat
(
all_scores
,
axis
=
0
)
# n
proposal_topk
=
tf
.
minimum
(
tf
.
size
(
proposal_scores
),
post_nms_topk
)
proposal_scores
,
topk_indices
=
tf
.
nn
.
top_k
(
proposal_scores
,
k
=
proposal_topk
,
sorted
=
False
)
proposal_boxes
=
tf
.
gather
(
proposal_boxes
,
topk_indices
)
return
proposal_boxes
,
proposal_scores
examples/FasterRCNN/train.py
View file @
70b70736
...
@@ -35,7 +35,7 @@ from model import (
...
@@ -35,7 +35,7 @@ from model import (
generate_rpn_proposals
,
sample_fast_rcnn_targets
,
generate_rpn_proposals
,
sample_fast_rcnn_targets
,
fastrcnn_outputs
,
fastrcnn_losses
,
fastrcnn_predictions
,
fastrcnn_outputs
,
fastrcnn_losses
,
fastrcnn_predictions
,
maskrcnn_upXconv_head
,
maskrcnn_loss
,
maskrcnn_upXconv_head
,
maskrcnn_loss
,
fpn_model
,
multilevel_roi_align
)
fpn_model
,
multilevel_roi_align
,
multilevel_rpn_losses
,
generate_fpn_proposals
)
from
model_box
import
(
from
model_box
import
(
clip_boxes
,
decode_bbox_target
,
encode_bbox_target
,
clip_boxes
,
decode_bbox_target
,
encode_bbox_target
,
crop_and_resize
,
roi_align
,
RPNAnchors
)
crop_and_resize
,
roi_align
,
RPNAnchors
)
...
@@ -163,7 +163,7 @@ class ResNetC4Model(DetectionModel):
...
@@ -163,7 +163,7 @@ class ResNetC4Model(DetectionModel):
image
=
self
.
preprocess
(
image
)
# 1CHW
image
=
self
.
preprocess
(
image
)
# 1CHW
featuremap
=
resnet_c4_backbone
(
image
,
cfg
.
BACKBONE
.
RESNET_NUM_BLOCK
[:
3
])
featuremap
=
resnet_c4_backbone
(
image
,
cfg
.
BACKBONE
.
RESNET_NUM_BLOCK
[:
3
])
rpn_label_logits
,
rpn_box_logits
=
rpn_head
(
'rpn'
,
featuremap
,
1024
,
cfg
.
RPN
.
NUM_ANCHOR
)
rpn_label_logits
,
rpn_box_logits
=
rpn_head
(
'rpn'
,
featuremap
,
cfg
.
RPN
.
HEAD_DIM
,
cfg
.
RPN
.
NUM_ANCHOR
)
anchors
=
RPNAnchors
(
get_all_anchors
(),
anchor_labels
,
anchor_boxes
)
anchors
=
RPNAnchors
(
get_all_anchors
(),
anchor_labels
,
anchor_boxes
)
anchors
=
anchors
.
narrow_to
(
featuremap
)
anchors
=
anchors
.
narrow_to
(
featuremap
)
...
@@ -309,33 +309,15 @@ class ResNetFPNModel(DetectionModel):
...
@@ -309,33 +309,15 @@ class ResNetFPNModel(DetectionModel):
self
.
slice_feature_and_anchors
(
image_shape2d
,
p23456
,
multilevel_anchors
)
self
.
slice_feature_and_anchors
(
image_shape2d
,
p23456
,
multilevel_anchors
)
# Multi-Level RPN Proposals
# Multi-Level RPN Proposals
multilevel_proposals
=
[]
rpn_outputs
=
[
rpn_head
(
'rpn'
,
pi
,
cfg
.
FPN
.
NUM_CHANNEL
,
len
(
cfg
.
RPN
.
ANCHOR_RATIOS
))
rpn_loss_collection
=
[]
for
pi
in
p23456
]
for
lvl
in
range
(
num_fpn_level
):
multilevel_label_logits
=
[
k
[
0
]
for
k
in
rpn_outputs
]
rpn_label_logits
,
rpn_box_logits
=
rpn_head
(
multilevel_box_logits
=
[
k
[
1
]
for
k
in
rpn_outputs
]
'rpn'
,
p23456
[
lvl
],
cfg
.
FPN
.
NUM_CHANNEL
,
len
(
cfg
.
RPN
.
ANCHOR_RATIOS
))
with
tf
.
name_scope
(
'FPN_lvl{}'
.
format
(
lvl
+
2
)):
fpn_nms_topk
=
cfg
.
RPN
.
TRAIN_FPN_NMS_TOPK
if
is_training
else
cfg
.
RPN
.
TEST_FPN_NMS_TOPK
anchors
=
multilevel_anchors
[
lvl
]
proposal_boxes
,
proposal_scores
=
generate_fpn_proposals
(
pred_boxes_decoded
=
anchors
.
decode_logits
(
rpn_box_logits
)
multilevel_anchors
,
multilevel_label_logits
,
multilevel_box_logits
,
proposal_boxes
,
proposal_scores
=
generate_rpn_proposals
(
image_shape2d
,
fpn_nms_topk
,
fpn_nms_topk
)
tf
.
reshape
(
pred_boxes_decoded
,
[
-
1
,
4
]),
tf
.
reshape
(
rpn_label_logits
,
[
-
1
]),
image_shape2d
,
cfg
.
RPN
.
TRAIN_FPN_NMS_TOPK
if
is_training
else
cfg
.
RPN
.
TEST_FPN_NMS_TOPK
)
multilevel_proposals
.
append
((
proposal_boxes
,
proposal_scores
))
if
is_training
:
label_loss
,
box_loss
=
rpn_losses
(
anchors
.
gt_labels
,
anchors
.
encoded_gt_boxes
(),
rpn_label_logits
,
rpn_box_logits
)
rpn_loss_collection
.
extend
([
label_loss
,
box_loss
])
# Merge proposals from multi levels, pick top K
proposal_boxes
=
tf
.
concat
([
x
[
0
]
for
x
in
multilevel_proposals
],
axis
=
0
)
# nx4
proposal_scores
=
tf
.
concat
([
x
[
1
]
for
x
in
multilevel_proposals
],
axis
=
0
)
# n
proposal_topk
=
tf
.
minimum
(
tf
.
size
(
proposal_scores
),
cfg
.
RPN
.
TRAIN_FPN_NMS_TOPK
if
is_training
else
cfg
.
RPN
.
TEST_FPN_NMS_TOPK
)
proposal_scores
,
topk_indices
=
tf
.
nn
.
top_k
(
proposal_scores
,
k
=
proposal_topk
,
sorted
=
False
)
proposal_boxes
=
tf
.
gather
(
proposal_boxes
,
topk_indices
)
if
is_training
:
if
is_training
:
rcnn_boxes
,
rcnn_labels
,
fg_inds_wrt_gt
=
sample_fast_rcnn_targets
(
rcnn_boxes
,
rcnn_labels
,
fg_inds_wrt_gt
=
sample_fast_rcnn_targets
(
...
@@ -351,11 +333,9 @@ class ResNetFPNModel(DetectionModel):
...
@@ -351,11 +333,9 @@ class ResNetFPNModel(DetectionModel):
'fastrcnn'
,
roi_feature_fastrcnn
,
cfg
.
DATA
.
NUM_CLASS
)
'fastrcnn'
,
roi_feature_fastrcnn
,
cfg
.
DATA
.
NUM_CLASS
)
if
is_training
:
if
is_training
:
# rpn loss is already defined above
# rpn loss:
with
tf
.
name_scope
(
'rpn_losses'
):
rpn_label_loss
,
rpn_box_loss
=
multilevel_rpn_losses
(
rpn_total_label_loss
=
tf
.
add_n
(
rpn_loss_collection
[::
2
],
name
=
'label_loss'
)
multilevel_anchors
,
multilevel_label_logits
,
multilevel_box_logits
)
rpn_total_box_loss
=
tf
.
add_n
(
rpn_loss_collection
[
1
::
2
],
name
=
'box_loss'
)
add_moving_summary
(
rpn_total_box_loss
,
rpn_total_label_loss
)
# fastrcnn loss:
# fastrcnn loss:
matched_gt_boxes
=
tf
.
gather
(
gt_boxes
,
fg_inds_wrt_gt
)
matched_gt_boxes
=
tf
.
gather
(
gt_boxes
,
fg_inds_wrt_gt
)
...
@@ -390,7 +370,7 @@ class ResNetFPNModel(DetectionModel):
...
@@ -390,7 +370,7 @@ class ResNetFPNModel(DetectionModel):
'(?:group1|group2|group3|rpn|fpn|fastrcnn|maskrcnn)/.*W'
,
'(?:group1|group2|group3|rpn|fpn|fastrcnn|maskrcnn)/.*W'
,
l2_regularizer
(
cfg
.
TRAIN
.
WEIGHT_DECAY
),
name
=
'wd_cost'
)
l2_regularizer
(
cfg
.
TRAIN
.
WEIGHT_DECAY
),
name
=
'wd_cost'
)
total_cost
=
tf
.
add_n
(
rpn_loss_collection
+
[
total_cost
=
tf
.
add_n
(
[
rpn_label_loss
,
rpn_box_loss
,
fastrcnn_label_loss
,
fastrcnn_box_loss
,
fastrcnn_label_loss
,
fastrcnn_box_loss
,
mrcnn_loss
,
wd_cost
],
'total_cost'
)
mrcnn_loss
,
wd_cost
],
'total_cost'
)
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment