class_docstr: S2Anet head
  Args:
      stacked_convs (int): number of stacked_convs
      feat_in (int): input channels of feat
      feat_out (int): output channels of feat
      num_classes (int): num_classes
      anchor_strides (list): stride of anchors
      anchor_scales (list): scale of anchors
      anchor_ratios (list): ratios of anchors
      target_means (list): target_means
      target_stds (list): target_stds
      align_conv_type (str): align_conv_type ['Conv', 'AlignConv']
      align_conv_size (int): kernel size of align_conv
      use_sigmoid_cls (bool): use sigmoid_cls or not
      reg_loss_weight (list): loss weight for regression
class_docstr_tok: ["S2Anet","head","Args",":","stacked_convs","(","int",")",":","number","of","stacked_convs","feat_in","(","int",")",":","input","channels","of","feat","feat_out","(","int",")",":","output","channels","of","feat","num_classes","(","int",")",":","num_classes","anchor_strides","(","list",")",":","stride","of","anchors","anchor_scales","(","list",")",":","scale","of","anchors","anchor_ratios","(","list",")",":","ratios","of","anchors","target_means","(","list",")",":","target_means","target_stds","(","list",")",":","target_stds","align_conv_type","(","str",")",":","align_conv_type","[","'Conv","'",",","'AlignConv","'","]","align_conv_size","(","int",")",":","kernel","size","of","align_conv","use_sigmoid_cls","(","bool",")",":","use","sigmoid_cls","or","not","reg_loss_weight","(","list",")",":","loss","weight","for","regression"]
docstr: decode bbox from deltas
  Args:
      preds: [B, L, 5]
      anchors: [1, L, 5]
  return:
      bboxes: [B, L, 5]
docstr_tok: ["decode","bbox","from","deltas","Args",":","preds",":","[","B",",","L",",","5","]","anchors",":","[","1",",","L",",","5","]","return",":","bboxes",":","[","B",",","L",",","5","]"]
code: def bbox_decode(self, preds, anchors, wh_ratio_clip=1e-6):
      """decode bbox from deltas
      Args:
          preds: [B, L, 5]
          anchors: [1, L, 5]
      return:
          bboxes: [B, L, 5]
      """
      preds = paddle.add(paddle.multiply(preds, self.stds), self.means)
  
      dx, dy, dw, dh, dangle = paddle.split(preds, 5, axis=-1)
      max_ratio = np.abs(np.log(wh_ratio_clip))
      dw = paddle.clip(dw, min=-max_ratio, max=max_ratio)
      dh = paddle.clip(dh, min=-max_ratio, max=max_ratio)
  
      rroi_x, rroi_y, rroi_w, rroi_h, rroi_angle = paddle.split(
          anchors, 5, axis=-1
      )
  
      gx = (
          dx * rroi_w * paddle.cos(rroi_angle)
          - dy * rroi_h * paddle.sin(rroi_angle)
          + rroi_x
      )
      gy = (
          dx * rroi_w * paddle.sin(rroi_angle)
          + dy * rroi_h * paddle.cos(rroi_angle)
          + rroi_y
      )
      gw = rroi_w * dw.exp()
      gh = rroi_h * dh.exp()
      ga = np.pi * dangle + rroi_angle
      ga = (ga + np.pi / 4) % np.pi - np.pi / 4
      bboxes = paddle.concat([gx, gy, gw, gh, ga], axis=-1)
      return bboxes
  
imports: import paddle
  from paddle import ParamAttr
  import paddle.nn
  import paddle.nn.functional
  from paddle.nn.initializer import Normal, Constant
  from ppdet.core.workspace import register
  from ppdet.modeling.proposal_generator.target_layer import RBoxAssigner
  from ppdet.modeling.proposal_generator.anchor_generator import S2ANetAnchorGenerator
  from ppdet.modeling.layers import AlignConv
  from ..cls_utils import _get_class_default_kwargs
  import numpy
label_desc: Use image node_id 10 for calling the S2ANetHead obj's underlying member method code with example usage: obj.bbox_decode(preds, anchors, wh_ratio_clip) and returns: bboxes