通过albumentation对目标检测进行数据增强(简单直接)

albumentation官方文档看不懂?xml文件不知道如何操作?下面只需要修改部分代码即可上手使用

要使用这个方法之前需要按照albumentation这个库还有一些辅助库,自己看着来安装就行

pip install albumentation
pip install opencv-python
pip install json
pip install xml
import os
import cv2
import json
import xml.etree.ElementTree as ET
import albumentations as A

def data_aug(source_annotated, data_aug_annotated, times=3):
    transform = A.Compose([
            A.RandomBrightnessContrast(p=0.3),  # 随机亮度对比度
            A.OneOf([A.GaussNoise(), ], p=0.5),  # 高斯噪声
            A.OneOf([
                A.MotionBlur(p=0.2),  # 运动模糊
                A.MedianBlur(blur_limit=3, p=0.5),  # 中值模糊
                A.Blur(blur_limit=3, p=0.2),  # 模糊
            ], p=0.5),

            A.RandomBrightnessContrast(p=0.5),   
            A.RandomCrop(300, 300, p=0.5),  # 随机裁剪
            A.RandomRotate90(p=0.5),  # 随机旋转90度
            A.HorizontalFlip(p=0.5),  # 水平翻转
            A.VerticalFlip(p=0.5),  # 垂直翻转
        ], bbox_params=A.BboxParams(format='pascal_voc', min_area=0., min_visibility=0., label_fields=['class_labels']))

    for xml_file in os.listdir(source_annotated):
        if xml_file.endswith(".xml"):
            for nth in range(times):
                tree = ET.parse(os.path.join(source_annotated, xml_file))
                root = tree.getroot()

                image_file = root.find('filename').text
                image_path = os.path.join(source_annotated, image_file)
                image = cv2.imread(image_path)

                bboxes = []
                class_labels = []
                for obj in root.findall('object'):
                    label = obj.find('name').text
                    bbox = obj.find('bndbox')
                    xmin = int(bbox.find('xmin').text)
                    ymin = int(bbox.find('ymin').text)
                    xmax = int(bbox.find('xmax').text)
                    ymax = int(bbox.find('ymax').text)
                    bboxes.append([xmin, ymin, xmax, ymax])
                    class_labels.append(label)

                transformed = transform(image=image, bboxes=bboxes, class_labels=class_labels)
                transformed_image = transformed['image']
                transformed_bboxes = transformed['bboxes']

                save_base_name = os.path.splitext(image_file)[0] + "_" + str(nth)
                cv2.imwrite(os.path.join(data_aug_annotated, save_base_name + ".jpg"), transformed_image)

                # 更新XML文件中的变换数据
                root.find('filename').text = save_base_name + ".jpg"
                root.find('path').text = os.path.join(data_aug_annotated, save_base_name + ".jpg")

                for obj, tb in zip(root.findall('object'), transformed_bboxes):
                    bbox = obj.find('bndbox')
                    bbox.find('xmin').text = str(int(tb[0]))
                    bbox.find('ymin').text = str(int(tb[1]))
                    bbox.find('xmax').text = str(int(tb[2]))
                    bbox.find('ymax').text = str(int(tb[3]))

                tree.write(os.path.join(data_aug_annotated, save_base_name + ".xml"))

if __name__ == "__main__":
    source_annotated = "data_annotated/"  # 原始的图片、标签路径
    data_aug_annotated = "data_aug_annotated" # 处理后的图片、标签路径
    times = 3  
    data_aug(source_annotated, data_aug_annotated, times)

1.需要增强的图片标签文件存放形式

 

标签和文件放在统一文件夹下,同一图片和标签命名对应相同 

2.修改需要增强的要求,如旋转,切割等

            A.RandomBrightnessContrast(p=0.3),  # 随机亮度对比度
            A.OneOf([A.GaussNoise(), ], p=0.5),  # 高斯噪声
            A.OneOf([
                A.MotionBlur(p=0.2),  # 运动模糊
                A.MedianBlur(blur_limit=3, p=0.5),  # 中值模糊
                A.Blur(blur_limit=3, p=0.2),  # 模糊
            ], p=0.5),

            A.RandomBrightnessContrast(p=0.5),   
            A.RandomCrop(300, 300, p=0.5),  # 随机裁剪
            A.RandomRotate90(p=0.5),  # 随机旋转90度
            A.HorizontalFlip(p=0.5),  # 水平翻转
            A.VerticalFlip(p=0.5),  # 垂直翻转

上述已经列出常见增强方式,可通过注释方式对方法进行取舍,代码中的p代表概率,即每一次增强有多少概率使用到这个方法,可通过自己的爱好进行调增,其他方法查询一下均可容易上手使用,这里不作过多的一一讲解了。

3.创建新的文件夹,用作输出路径

通过修改time这个增强倍数,最后写入要输出的文件夹运行即可

最后结果如图所示:

同时会生成对应的xml,简单快捷。 

增强后可通过以下方法将xml转化成训练需要的txt格式

将目标检测标签中的xml转化成训练输入的txt(简单直接)-CSDN博客

希望这篇博文对你有帮助!!!!

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-20 05:08:05       52 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-20 05:08:05       54 阅读
  3. 在Django里面运行非项目文件

    2024-07-20 05:08:05       45 阅读
  4. Python语言-面向对象

    2024-07-20 05:08:05       55 阅读

热门阅读

  1. Apple Vision Pro 开发资源大全

    2024-07-20 05:08:05       14 阅读
  2. mysql 浮点数类型

    2024-07-20 05:08:05       16 阅读
  3. stack

    2024-07-20 05:08:05       17 阅读
  4. DGPU共享内存的问题

    2024-07-20 05:08:05       18 阅读
  5. 阿里云服务器 篇三:提交搜索引擎收录

    2024-07-20 05:08:05       18 阅读
  6. python 打包工具 nuitka 使用笔记

    2024-07-20 05:08:05       17 阅读
  7. 【XSS】

    【XSS】

    2024-07-20 05:08:05      18 阅读
  8. PyTorch张量运算函数

    2024-07-20 05:08:05       20 阅读
  9. 使用css制作心形图案并且添加动画心动效果

    2024-07-20 05:08:05       16 阅读
  10. Spring Boot:简化Spring应用开发的利器

    2024-07-20 05:08:05       20 阅读