| 197 | |
| 198 | |
| 199 | class ResNetFPNModel(GeneralizedRCNN): |
| 200 | |
| 201 | def inputs(self): |
| 202 | ret = [ |
| 203 | tf.TensorSpec((None, None, 3), tf.float32, 'image')] |
| 204 | num_anchors = len(cfg.RPN.ANCHOR_RATIOS) |
| 205 | for k in range(len(cfg.FPN.ANCHOR_STRIDES)): |
| 206 | ret.extend([ |
| 207 | tf.TensorSpec((None, None, num_anchors), tf.int32, |
| 208 | 'anchor_labels_lvl{}'.format(k + 2)), |
| 209 | tf.TensorSpec((None, None, num_anchors, 4), tf.float32, |
| 210 | 'anchor_boxes_lvl{}'.format(k + 2))]) |
| 211 | ret.extend([ |
| 212 | tf.TensorSpec((None, 4), tf.float32, 'gt_boxes'), |
| 213 | tf.TensorSpec((None,), tf.int64, 'gt_labels')]) # all > 0 |
| 214 | if cfg.MODE_MASK: |
| 215 | ret.append( |
| 216 | tf.TensorSpec((None, None, None), tf.uint8, 'gt_masks_packed') |
| 217 | ) |
| 218 | return ret |
| 219 | |
| 220 | def slice_feature_and_anchors(self, p23456, anchors): |
| 221 | for i in range(len(cfg.FPN.ANCHOR_STRIDES)): |
| 222 | with tf.name_scope('FPN_slice_lvl{}'.format(i)): |
| 223 | anchors[i] = anchors[i].narrow_to(p23456[i]) |
| 224 | |
| 225 | def backbone(self, image): |
| 226 | c2345 = resnet_fpn_backbone(image, cfg.BACKBONE.RESNET_NUM_BLOCKS) |
| 227 | p23456 = fpn_model('fpn', c2345) |
| 228 | return p23456 |
| 229 | |
| 230 | def rpn(self, image, features, inputs): |
| 231 | assert len(cfg.RPN.ANCHOR_SIZES) == len(cfg.FPN.ANCHOR_STRIDES) |
| 232 | |
| 233 | image_shape2d = tf.shape(image)[2:] # h,w |
| 234 | all_anchors_fpn = get_all_anchors_fpn( |
| 235 | strides=cfg.FPN.ANCHOR_STRIDES, |
| 236 | sizes=cfg.RPN.ANCHOR_SIZES, |
| 237 | ratios=cfg.RPN.ANCHOR_RATIOS, |
| 238 | max_size=cfg.PREPROC.MAX_SIZE) |
| 239 | multilevel_anchors = [RPNAnchors( |
| 240 | all_anchors_fpn[i], |
| 241 | inputs['anchor_labels_lvl{}'.format(i + 2)], |
| 242 | inputs['anchor_boxes_lvl{}'.format(i + 2)]) for i in range(len(all_anchors_fpn))] |
| 243 | self.slice_feature_and_anchors(features, multilevel_anchors) |
| 244 | |
| 245 | # Multi-Level RPN Proposals |
| 246 | rpn_outputs = [rpn_head('rpn', pi, cfg.FPN.NUM_CHANNEL, len(cfg.RPN.ANCHOR_RATIOS)) |
| 247 | for pi in features] |
| 248 | multilevel_label_logits = [k[0] for k in rpn_outputs] |
| 249 | multilevel_box_logits = [k[1] for k in rpn_outputs] |
| 250 | multilevel_pred_boxes = [anchor.decode_logits(logits) |
| 251 | for anchor, logits in zip(multilevel_anchors, multilevel_box_logits)] |
| 252 | |
| 253 | proposal_boxes, proposal_scores = generate_fpn_proposals( |
| 254 | multilevel_pred_boxes, multilevel_label_logits, image_shape2d) |
| 255 | |
| 256 | if self.training: |
no outgoing calls
no test coverage detected
searching dependent graphs…