| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| from __future__ import absolute_import |
| from __future__ import division |
| from __future__ import print_function |
|
|
| from ppdet.core.workspace import register, create |
| from .meta_arch import BaseArch |
| import paddle |
| import paddle.nn.functional as F |
|
|
| __all__ = ['RetinaNet'] |
|
|
|
|
| @register |
| class RetinaNet(BaseArch): |
| __category__ = 'architecture' |
|
|
| def __init__(self, backbone, neck, head): |
| super(RetinaNet, self).__init__() |
| self.backbone = backbone |
| self.neck = neck |
| self.head = head |
|
|
| @classmethod |
| def from_config(cls, cfg, *args, **kwargs): |
| backbone = create(cfg['backbone']) |
|
|
| kwargs = {'input_shape': backbone.out_shape} |
| neck = create(cfg['neck'], **kwargs) |
|
|
| kwargs = {'input_shape': neck.out_shape} |
| head = create(cfg['head'], **kwargs) |
|
|
| return { |
| 'backbone': backbone, |
| 'neck': neck, |
| 'head': head, |
| } |
|
|
| def _forward(self): |
| body_feats = self.backbone(self.inputs) |
| neck_feats = self.neck(body_feats) |
|
|
| if self.training: |
| return self.head(neck_feats, self.inputs) |
| else: |
| head_outs = self.head(neck_feats) |
| bbox, bbox_num, nms_keep_idx = self.head.post_process( |
| head_outs, self.inputs['im_shape'], self.inputs['scale_factor']) |
|
|
| if self.use_extra_data: |
| extra_data = {} |
| """extra_data:{ |
| 'scores': predict scores, |
| 'nms_keep_idx': bbox index before nms, |
| } |
| """ |
| preds_logits = self.head.decode_cls_logits(head_outs[0]) |
| preds_scores = F.sigmoid(preds_logits) |
| extra_data['logits'] = preds_logits |
| extra_data['scores'] = preds_scores |
| extra_data['nms_keep_idx'] = nms_keep_idx |
| return {'bbox': bbox, 'bbox_num': bbox_num, "extra_data": extra_data} |
| else: |
| return {'bbox': bbox, 'bbox_num': bbox_num} |
|
|
| def get_loss(self): |
| return self._forward() |
|
|
| def get_pred(self): |
| return self._forward() |
|
|