code: def forward(self, x, batch):
      # apply pointnet classification network to get per-point
      # features and global feature
      x = self.input_stn(x, batch)
      x = self.local_nn_1(x)
      x_feat_trans = self.feat_stn(x, batch)
      x3 = self.local_nn_2(x_feat_trans)
  
      global_feature = self.func_global_max_pooling(x3, batch)
      # concat per-point and global feature and regress to get
      # per-point scores
      if x_feat_trans.dim() == 2:
          feat_concat = torch.cat(
              [x_feat_trans, global_feature[batch]], dim=1
          )
      else:
          feat_concat = torch.cat(
              [
                  x_feat_trans,
                  global_feature.unsqueeze(1).repeat(
                      (1, x_feat_trans.shape[1], 1)
                  ),
              ],
              dim=-1,
          )
      out = self.seg_nn(feat_concat)
  
      return out
  
imports: import torch
  from torch_geometric.nn import global_max_pool, global_mean_pool
  from torch_points3d.core.common_modules.base_modules import *
  from torch_points3d.core.common_modules.spatial_transform import BaseLinearTransformSTNkD
  from torch_points3d.models.base_model import BaseInternalLossModule
label_desc: Use image node_id 4 for calling the PointNetSeg obj's underlying member method code with example usage: obj.forward(x, batch) and returns: out