text: import copy
  import numpy as np
  
  from ...utils import common_utils
  
  
  def random_flip_along_x(gt_boxes, points):
      """
      Args:
          gt_boxes: (N, 7 + C), [x, y, z, dx, dy, dz, heading, [vx], [vy]]
          points: (M, 3 + C)
      Returns:
      """
      enable = np.random.choice([False, True], replace=False, p=[0.5, 0.5])
      if enable:
          gt_boxes[:, 1] = -gt_boxes[:, 1]
          gt_boxes[:, 6] = -gt_boxes[:, 6]
          points[:, 1] = -points[:, 1]
  
          if gt_boxes.shape[1] > 7:
              gt_boxes[:, 8] = -gt_boxes[:, 8]
  
      return gt_boxes, points
  
  
  def random_flip_along_y(gt_boxes, points):
      """
      Args:
          gt_boxes: (N, 7 + C), [x, y, z, dx, dy, dz, heading, [vx], [vy]]
          points: (M, 3 + C)
      Returns:
      """
      enable = np.random.choice([False, True], replace=False, p=[0.5, 0.5])
      if enable:
          gt_boxes[:, 0] = -gt_boxes[:, 0]
          gt_boxes[:, 6] = -(gt_boxes[:, 6] + np.pi)
          points[:, 0] = -points[:, 0]
  
          if gt_boxes.shape[1] > 7:
              gt_boxes[:, 7] = -gt_boxes[:, 7]
  
      return gt_boxes, points
  
  
  def global_rotation(gt_boxes, points, rot_range):
      """
      Args:
          gt_boxes: (N, 7 + C), [x, y, z, dx, dy, dz, heading, [vx], [vy]]
          points: (M, 3 + C),
          rot_range: [min, max]
      Returns:
      """
      noise_rotation = np.random.uniform(rot_range[0], rot_range[1])
      points = common_utils.rotate_points_along_z(points[np.newaxis, :, :], np.array([noise_rotation]))[0]
      gt_boxes[:, 0:3] = common_utils.rotate_points_along_z(gt_boxes[np.newaxis, :, 0:3], np.array([noise_rotation]))[0]
      gt_boxes[:, 6] += noise_rotation
      if gt_boxes.shape[1] > 7:
          gt_boxes[:, 7:9] = common_utils.rotate_points_along_z(
              np.hstack((gt_boxes[:, 7:9], np.zeros((gt_boxes.shape[0], 1))))[np.newaxis, :, :],
              np.array([noise_rotation])
          )[0][:, 0:2]
  
      return gt_boxes, points
  
  
  def global_scaling(gt_boxes, points, scale_range):
      """
      Args:
          gt_boxes: (N, 7), [x, y, z, dx, dy, dz, heading]
          points: (M, 3 + C),
          scale_range: [min, max]
      Returns:
      """
      if scale_range[1] - scale_range[0] < 1e-3:
          return gt_boxes, points
      noise_scale = np.random.uniform(scale_range[0], scale_range[1])
      points[:, :3] *= noise_scale
      gt_boxes[:, :6] *= noise_scale
      return gt_boxes, points
  
  def random_image_flip_horizontal(image, depth_map, gt_boxes, calib):
      """
      Performs random horizontal flip augmentation
      Args:
          image: (H_image, W_image, 3), Image
          depth_map: (H_depth, W_depth), Depth map
          gt_boxes: (N, 7), 3D box labels in LiDAR coordinates [x, y, z, w, l, h, ry]
          calib: calibration.Calibration, Calibration object
      Returns:
          aug_image: (H_image, W_image, 3), Augmented image
          aug_depth_map: (H_depth, W_depth), Augmented depth map
          aug_gt_boxes: (N, 7), Augmented 3D box labels in LiDAR coordinates [x, y, z, w, l, h, ry]
      """
      # Randomly augment with 50% chance
      enable = np.random.choice([False, True], replace=False, p=[0.5, 0.5])
  
      if enable:
          # Flip images
          aug_image = np.fliplr(image)
          aug_depth_map = np.fliplr(depth_map)
  
          # Flip 3D gt_boxes by flipping the centroids in image space
          aug_gt_boxes = copy.copy(gt_boxes)
          locations = aug_gt_boxes[:, :3]
          img_pts, img_depth = calib.lidar_to_img(locations)
          W = image.shape[1]
          img_pts[:, 0] = W - img_pts[:, 0]
          pts_rect = calib.img_to_rect(u=img_pts[:, 0], v=img_pts[:, 1], depth_rect=img_depth)
          pts_lidar = calib.rect_to_lidar(pts_rect)
          aug_gt_boxes[:, :3] = pts_lidar
          aug_gt_boxes[:, 6] = -1 * aug_gt_boxes[:, 6]
  
      else:
          aug_image = image
          aug_depth_map = depth_map
          aug_gt_boxes = gt_boxes
  
      return aug_image, aug_depth_map, aug_gt_boxes