def __init__(self, **kwags): super(RPN, self).__init__(**kwags) # Anchor attributes self.ANCHOR_SCALES = (32, 64, 128, 256, 512) self.ANCHOR_RATIOS = (0.5, 1, 2) # The strides of each layer of the FPN Pyramid. self.FEATURE_STRIDES = (4, 8, 16, 32, 64) # Bounding box refinement mean and standard deviation self.RPN_TARGET_MEANS = (0., 0., 0., 0.) self.RPN_TARGET_STDS = (0.1, 0.1, 0.2, 0.2) self.backbone = resnet.ResNet(depth=101, name='res_net') self.neck = fpn.FPN(name='fpn') self.rpn_head = rpn_head.RPNHead(anchors_per_location=len( self.ANCHOR_RATIOS), name='rpn_head') self.generator = anchor_generator.AnchorGenerator( scales=self.ANCHOR_SCALES, ratios=self.ANCHOR_RATIOS, feature_strides=self.FEATURE_STRIDES) self.anchor_target = anchor_target.AnchorTarget( target_means=self.RPN_TARGET_MEANS, target_stds=self.RPN_TARGET_STDS) self.rpn_class_loss = losses.rpn_class_loss self.rpn_bbox_loss = losses.rpn_bbox_loss
def __init__(self, anchor_scales=(32, 64, 128, 256, 512), anchor_ratios=(0.5, 1, 2), anchor_feature_strides=(4, 8, 16, 32, 64), proposal_count=2000, nms_threshold=0.7, target_means=(0., 0., 0., 0.), target_stds=(0.1, 0.1, 0.2, 0.2), num_rpn_deltas=256, positive_fraction=0.5, pos_iou_thr=0.7, neg_iou_thr=0.3, **kwags): ''' Network head of Region Proposal Network. / - rpn_cls (1x1 conv) input - rpn_conv (3x3 conv) - \ - rpn_reg (1x1 conv) Attributes --- anchor_scales: 1D array of anchor sizes in pixels. anchor_ratios: 1D array of anchor ratios of width/height. anchor_feature_strides: Stride of the feature map relative to the image in pixels. proposal_count: int. RPN proposals kept after non-maximum suppression. nms_threshold: float. Non-maximum suppression threshold to filter RPN proposals. target_means: [4] Bounding box refinement mean. target_stds: [4] Bounding box refinement standard deviation. num_rpn_deltas: int. positive_fraction: float. pos_iou_thr: float. neg_iou_thr: float. ''' super(RPNHead, self).__init__(**kwags) self.proposal_count = proposal_count self.nms_threshold = nms_threshold self.target_means = target_means self.target_stds = target_stds self.generator = anchor_generator.AnchorGenerator( scales=anchor_scales, ratios=anchor_ratios, feature_strides=anchor_feature_strides) self.anchor_target = anchor_target.AnchorTarget( target_means=target_means, target_stds=target_stds, num_rpn_deltas=num_rpn_deltas, positive_fraction=positive_fraction, pos_iou_thr=pos_iou_thr, neg_iou_thr=neg_iou_thr) self.rpn_class_loss = losses.rpn_class_loss self.rpn_bbox_loss = losses.rpn_bbox_loss # Shared convolutional base of the RPN self.rpn_conv_shared = layers.Conv2D(512, (3, 3), padding='same', kernel_initializer='he_normal', name='rpn_conv_shared') self.rpn_class_raw = layers.Conv2D(len(anchor_ratios) * 2, (1, 1), kernel_initializer='he_normal', name='rpn_class_raw') self.rpn_delta_pred = layers.Conv2D(len(anchor_ratios) * 4, (1, 1), kernel_initializer='he_normal', name='rpn_bbox_pred')
def __init__(self, num_classes, **kwags): super(FasterRCNN, self).__init__(**kwags) self.NUM_CLASSES = num_classes # Anchor attributes self.ANCHOR_SCALES = (32, 64, 128, 256, 512) self.ANCHOR_RATIOS = (0.5, 1, 2) # The strides of each layer of the FPN Pyramid. self.FEATURE_STRIDES = (4, 8, 16, 32, 64) # Bounding box refinement mean and standard deviation self.RPN_TARGET_MEANS = (0., 0., 0., 0.) self.RPN_TARGET_STDS = (0.1, 0.1, 0.2, 0.2) self.PRN_PROPOSAL_COUNT = 2000 self.PRN_NMS_THRESHOLD = 0.7 self.ROI_BATCH_SIZE = 512 # Bounding box refinement mean and standard deviation self.RCNN_TARGET_MEANS = (0., 0., 0., 0.) self.RCNN_TARGET_STDS = (0.1, 0.1, 0.2, 0.2) self.POOL_SIZE = (7, 7) self.backbone = resnet.ResNet(depth=101, name='res_net') self.neck = fpn.FPN(name='fpn') self.rpn_head = rpn_head.RPNHead( anchors_per_location=len(self.ANCHOR_RATIOS), proposal_count=self.PRN_PROPOSAL_COUNT, nms_threshold=self.PRN_NMS_THRESHOLD, target_means=self.RPN_TARGET_MEANS, target_stds=self.RPN_TARGET_STDS, name='rpn_head') self.roi_align = roi_align.PyramidROIAlign(pool_shape=self.POOL_SIZE, name='pyramid_roi_align') self.bbox_head = bbox_head.BBoxHead(num_classes=self.NUM_CLASSES, pool_size=self.POOL_SIZE, name='b_box_head') self.generator = anchor_generator.AnchorGenerator( scales=self.ANCHOR_SCALES, ratios=self.ANCHOR_RATIOS, feature_strides=self.FEATURE_STRIDES) self.anchor_target = anchor_target.AnchorTarget( target_means=self.RPN_TARGET_MEANS, target_stds=self.RPN_TARGET_STDS) self.bbox_target = bbox_target.ProposalTarget( target_means=self.RCNN_TARGET_MEANS, target_stds=self.RPN_TARGET_STDS, num_rcnn_deltas=self.ROI_BATCH_SIZE) self.rpn_class_loss = losses.rpn_class_loss self.rpn_bbox_loss = losses.rpn_bbox_loss self.rcnn_class_loss = losses.rcnn_class_loss self.rcnn_bbox_loss = losses.rcnn_bbox_loss