class_docstr: Args:
      ch_in (int): The channel number of input Tensor.
      ch_out (int): The channel number of output Tensor.
      num_classes (int): Number of classes.
      conv_num (int): The convolution number of hm_feat.
      dcn_head(bool): whether use dcn in head. False by default. 
      lite_head(bool): whether use lite version. False by default.
      norm_type (string): norm type, 'sync_bn', 'bn', 'gn' are optional.
          bn by default
  
  Return:
      Heatmap head output
code: def __init__(
      self,
      ch_in,
      ch_out=128,
      num_classes=80,
      conv_num=2,
      dcn_head=False,
      lite_head=False,
      norm_type="bn",
  ):
      super(HMHead, self).__init__()
      head_conv = nn.Sequential()
      for i in range(conv_num):
          name = "conv.{}".format(i)
          if lite_head:
              lite_name = "hm." + name
              head_conv.add_sublayer(
                  lite_name,
                  LiteConv(
                      in_channels=ch_in if i == 0 else ch_out,
                      out_channels=ch_out,
                      norm_type=norm_type,
                  ),
              )
          else:
              if dcn_head:
                  head_conv.add_sublayer(
                      name,
                      DeformableConvV2(
                          in_channels=ch_in if i == 0 else ch_out,
                          out_channels=ch_out,
                          kernel_size=3,
                          weight_attr=ParamAttr(
                              initializer=Normal(0, 0.01)
                          ),
                      ),
                  )
              else:
                  head_conv.add_sublayer(
                      name,
                      nn.Conv2D(
                          in_channels=ch_in if i == 0 else ch_out,
                          out_channels=ch_out,
                          kernel_size=3,
                          padding=1,
                          weight_attr=ParamAttr(
                              initializer=Normal(0, 0.01)
                          ),
                          bias_attr=ParamAttr(
                              learning_rate=2.0,
                              regularizer=L2Decay(0.0),
                          ),
                      ),
                  )
              head_conv.add_sublayer(name + ".act", nn.ReLU())
      self.feat = head_conv
      bias_init = float(-np.log((1 - 0.01) / 0.01))
      weight_attr = (
          None if lite_head else ParamAttr(initializer=Normal(0, 0.01))
      )
      self.head = nn.Conv2D(
          in_channels=ch_out,
          out_channels=num_classes,
          kernel_size=1,
          weight_attr=weight_attr,
          bias_attr=ParamAttr(
              learning_rate=2.0,
              regularizer=L2Decay(0.0),
              initializer=Constant(bias_init),
          ),
      )
  
imports: import paddle
  import paddle.nn
  import paddle.nn.functional
  from paddle import ParamAttr
  from paddle.nn.initializer import Constant, Normal
  from paddle.regularizer import L2Decay
  from ppdet.core.workspace import register
  from ppdet.modeling.layers import DeformableConvV2, LiteConv
  import numpy
label_desc: Use image node_id 1 to create a new HMHead object from inherited base classes: nn with example: obj = HMHead(ch_in, ch_out, num_classes, conv_num, dcn_head, lite_head, norm_type)