def _add_roi_mask_head( model, add_roi_mask_head_func, blob_in, dim_in, spatial_scale_in ): """Add a mask prediction head to the model.""" # Capture model graph before adding the mask head bbox_net = copy.deepcopy(model.net.Proto()) # Add the mask head blob_mask_head, dim_mask_head = add_roi_mask_head_func( model, blob_in, dim_in, spatial_scale_in ) # Add the mask output blob_mask = mask_rcnn_heads.add_mask_rcnn_outputs( model, blob_mask_head, dim_mask_head ) if not model.train: # == inference # Inference uses a cascade of box predictions, then mask predictions. # This requires separate nets for box and mask prediction. # So we extract the mask prediction net, store it as its own network, # then restore model.net to be the bbox-only network model.mask_net, blob_mask = c2_utils.SuffixNet( 'mask_net', model.net, len(bbox_net.op), blob_mask ) model.net._net = bbox_net loss_gradients = None else: loss_gradients = mask_rcnn_heads.add_mask_rcnn_losses(model, blob_mask) return loss_gradients
def _add_roi_mask_head(model, add_roi_mask_head_func, blob_in, dim_in, spatial_scale_in, blob_boundary_attention): """Add a mask prediction head to the model.""" # Capture model graph before adding the mask head bbox_net = copy.deepcopy(model.net.Proto()) # Add the mask head blob_mask_head, dim_mask_head = add_roi_mask_head_func( model, blob_in, dim_in, spatial_scale_in) # attention if cfg.MODEL.BOUNDARY_ON and cfg.BOUNDARY.CONCAT_MASK: # s = model.net.Sum([blob_mask_head, blob_boundary_attention], 'm_b_sum') bo = 'm_b_concat' concat_F, concat_dims = model.net.Concat( [blob_mask_head, blob_boundary_attention], [bo, "_" + bo + "_concat_dims"]) concat_dims = dim_mask_head * 2 else: concat_F = blob_mask_head concat_dims = dim_mask_head # Add the mask output blob_mask = mask_rcnn_heads.add_mask_rcnn_outputs(model, concat_F, concat_dims) if not model.train: # == inference # Inference uses a cascade of box predictions, then mask predictions. # This requires separate nets for box and mask prediction. # So we extract the mask prediction net, store it as its own network, # then restore model.net to be the bbox-only network model.mask_net, blob_mask = c2_utils.SuffixNet('mask_net', model.net, len(bbox_net.op), blob_mask) model.net._net = bbox_net loss_gradients = None else: loss_gradients = mask_rcnn_heads.add_mask_rcnn_losses(model, blob_mask) return loss_gradients