text: import xml.etree.ElementTree as ET
  import pickle
  import os
  from os import getcwd
  import numpy as np
  from PIL import Image
  
  import imgaug as ia
  from imgaug import augmenters as iaa
  
  ia.seed(1)
  
  def read_xml_annotation(root, image_id):
      in_file = open(os.path.join(root, image_id))
      tree = ET.parse(in_file)
      root = tree.getroot()
      bndboxlist = []
  
      for object in root.findall('object'):  # 找到root节点下的所有country节点
          bndbox = object.find('bndbox')  # 子节点下节点rank的值
  
          xmin = int(bndbox.find('xmin').text)
          xmax = int(bndbox.find('xmax').text)
          ymin = int(bndbox.find('ymin').text)
          ymax = int(bndbox.find('ymax').text)
          # print(xmin,ymin,xmax,ymax)
          bndboxlist.append([xmin,ymin,xmax,ymax])
          # print(bndboxlist)
  
      bndbox = root.find('object').find('bndbox')
      return bndboxlist
  # (506.0000, 330.0000, 528.0000, 348.0000) -> (520.4747, 381.5080, 540.5596, 398.6603)
  def change_xml_annotation(root, image_id, new_target):
      new_xmin = new_target[0]
      new_ymin = new_target[1]
      new_xmax = new_target[2]
      new_ymax = new_target[3]
  
      in_file = open(os.path.join(root, str(image_id) + '.xml'))  # 这里root分别由两个意思
      tree = ET.parse(in_file)
      xmlroot = tree.getroot()
      object = xmlroot.find('object')
      bndbox = object.find('bndbox')
      xmin = bndbox.find('xmin')
      xmin.text = str(new_xmin)
      ymin = bndbox.find('ymin')
      ymin.text = str(new_ymin)
      xmax = bndbox.find('xmax')
      xmax.text = str(new_xmax)
      ymax = bndbox.find('ymax')
      ymax.text = str(new_ymax)
      tree.write(os.path.join(root, str(image_id) + "resize_aug" + '.xml'))
  
  def change_xml_list_annotation(root, image_id, new_target,saveroot,id):
  
      in_file = open(os.path.join(root, str(image_id) + '.xml'))  # 这里root分别由两个意思
      tree = ET.parse(in_file)
      xmlroot = tree.getroot()
      index = 0
  
      for object in xmlroot.findall('object'):  # 找到root节点下的所有country节点
          bndbox = object.find('bndbox')  # 子节点下节点rank的值
  
          # xmin = int(bndbox.find('xmin').text)
          # xmax = int(bndbox.find('xmax').text)
          # ymin = int(bndbox.find('ymin').text)
          # ymax = int(bndbox.find('ymax').text)
  
          new_xmin = new_target[index][0]
          new_ymin = new_target[index][1]
          new_xmax = new_target[index][2]
          new_ymax = new_target[index][3]
  
          xmin = bndbox.find('xmin')
          xmin.text = str(new_xmin)
          ymin = bndbox.find('ymin')
          ymin.text = str(new_ymin)
          xmax = bndbox.find('xmax')
          xmax.text = str(new_xmax)
          ymax = bndbox.find('ymax')
          ymax.text = str(new_ymax)
  
          index = index + 1
  
      tree.write(os.path.join(saveroot, str(image_id) + "background_aug_" + str(id) + '.xml'))
  
  
  def mkdir(path):
  
      # 去除首位空格
      path = path.strip()
      # 去除尾部 \ 符号
      path = path.rstrip("\\")
      # 判断路径是否存在
      # 存在     True
      # 不存在   False
      isExists = os.path.exists(path)
      # 判断结果
      if not isExists:
          # 如果不存在则创建目录
           # 创建目录操作函数
          os.makedirs(path)
          print(path + ' 创建成功')
          return True
      else:
          # 如果目录存在则不创建，并提示目录已存在
          print(path + ' 目录已存在')
          return False
  
  if __name__ == "__main__":
  
  
      IMG_DIR = "C:/Users/YFZX/Desktop/13_institute/soil_bullet_hole/standard_pixel\\"
      XML_DIR = "C:\\Users\\YFZX\\Desktop\\13_institute\\soil_bullet_hole\\annotation\\"
  
      AUG_XML_DIR = "C:\\Users\\YFZX\\Desktop\\13_institute\\soil_bullet_hole\\bg_aug_xml\\"  # 存储增强后的XML文件夹路径
      mkdir(AUG_XML_DIR)
  
      AUG_IMG_DIR = "C:\\Users\\YFZX\\Desktop\\13_institute\\soil_bullet_hole\\bg_aug_img\\"  # 存储增强后的影像文件夹路径
      mkdir(AUG_IMG_DIR)
  
      AUGLOOP = 10 # 每张影像增强的数量
  
      boxes_img_aug_list = []
      new_bndbox = []
      new_bndbox_list = []
  
  
      # 影像增强
      seq = iaa.Sequential([
          iaa.Flipud(0.5),  # vertically flip 20% of all images
          iaa.Fliplr(0.5),  # 镜像
          #iaa.Multiply((1.2, 1.5),per_channel=0.2),  # change brightness, doesn't affect BBs
          #iaa.GaussianBlur(sigma=(0, 3.0)), # iaa.GaussianBlur(0.5),
          iaa.Multiply((0.9, 1.1), per_channel=1), ####20%的图片像素值乘以0.8-1.2中间的数值,用以增加图片明亮度或改变颜色
          #iaa.Affine(
          #    translate_px={"x": 15, "y": 15},
          #    scale=(0.8, 0.95),
          #    rotate=(-30, 30)
          #),  # translate by 40/60px on x/y axis, and scale to 50-70%, affects BBs
          #iaa.Crop(percent=(0, 0.3),keep_size=True), # 0-0.1的数值，分别乘以图片的宽和高为剪裁的像素个数，保持原尺寸
          iaa.Affine(scale=1,
             translate_percent=None,
             translate_px=None,
             rotate=(-180, 180),
             shear=0.0,
             order=1,
             cval=0,
             mode='constant',)
  
      ],random_order= True)
  
      for root, sub_folders, files in os.walk(XML_DIR):
  
          for name in files:
  
              bndbox = read_xml_annotation(XML_DIR, name)
  
              for epoch in range(AUGLOOP):
                  seq_det = seq.to_deterministic()  # 保持坐标和图像同步改变，而不是随机
  
                  # 读取图片
                  img = Image.open(os.path.join(IMG_DIR, name[:-4] + '.jpg'))
                  img = np.array(img)
  
                  # bndbox 坐标增强
                  for i in range(len(bndbox)):
                      bbs = ia.BoundingBoxesOnImage([
                          ia.BoundingBox(x1=bndbox[i][0], y1=bndbox[i][1], x2=bndbox[i][2], y2=bndbox[i][3]),
                      ], shape=img.shape)
  
                      bbs_aug = seq_det.augment_bounding_boxes([bbs])[0]
                      boxes_img_aug_list.append(bbs_aug)
  
                      # '''
                      # 把XML有负的剔除
                      # '''
                      # if int(bbs_aug.bounding_boxes[0].x1)< 0 or int(bbs_aug.bounding_boxes[0].y1) < 0 :
                      #     continue
                      # else:
                      #     pass
  
                      # new_bndbox_list:[[x1,y1,x2,y2],...[],[]]
                      new_bndbox_list.append([int(bbs_aug.bounding_boxes[0].x1),
                                              int(bbs_aug.bounding_boxes[0].y1),
                                              int(bbs_aug.bounding_boxes[0].x2),
                                              int(bbs_aug.bounding_boxes[0].y2)])
                  # 存储变化后的图片
                  image_aug = seq_det.augment_images([img])[0]
                  path = os.path.join(AUG_IMG_DIR, str(name[:-4]) + "background_aug_" + str(epoch) + '.jpg')
                  # image_auged = bbs.draw_on_image(image_aug, thickness=0)
                  Image.fromarray(image_aug).save(path)
  
                  # 存储变化后的XML
                  change_xml_list_annotation(XML_DIR, name[:-4], new_bndbox_list,AUG_XML_DIR,epoch)
                  print(str(name[:-4]) + "_aug_" + str(epoch) + '.jpg')
                  new_bndbox_list = []