yolov5标签数据增强脚本

2023-05-16

此代码用于将标注好的图片及其标签进行数据增强,优点在于不需要重新打标签

import xml.etree.ElementTree as ET
import os
import numpy as np
from PIL import Image
import shutil
import imgaug as ia
from imgaug import augmenters as iaa
from tqdm import tqdm


def read_xml_annotation(root, image_id):
    in_file = open(os.path.join(root, image_id), encoding='UTF-8')
    # print(in_file)
    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)

    # ndbox = root.find('object').find('bndbox')
    return bndboxlist



def change_xml_list_annotation(root, image_id, new_target, saveroot, xml_id):
    save_path = os.path.join(saveroot, xml_id)
    in_file = open(os.path.join(root, str(image_id) + '.xml'), encoding='UTF-8')  # 这里root分别由两个意思
    tree = ET.parse(in_file)
    elem = tree.find('filename')
    elem.text = xml_id + img_type
    xmlroot = tree.getroot()
    index = 0

    for object in xmlroot.findall('object'):  # 找到root节点下的所有country节点
        bndbox = object.find('bndbox')  # 子节点下节点rank的值

        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 += 1

    tree.write(save_path + '.xml')


def simple_example(AUGLOOP,IMG_DIR,XML_DIR,AUG_IMG_DIR,AUG_XML_DIR):
    boxes_img_aug_list = []
    new_bndbox_list = []
    new_name = None

    for root, sub_folders, files in os.walk(XML_DIR):
        for name in tqdm(files):
            bndbox = read_xml_annotation(XML_DIR, name)
            shutil.copy(os.path.join(XML_DIR, name), AUG_XML_DIR)
            try:
                shutil.copy(os.path.join(IMG_DIR, name[:-4] + img_type), AUG_IMG_DIR)
            except:
                shutil.copy(os.path.join(IMG_DIR, name[:-4] + '.JPG'), AUG_IMG_DIR)
            # print(os.path.join(IMG_DIR, name[:-4] + img_type))

            for epoch in range(1, AUGLOOP + 1):
                # 增强
                if epoch == 1:
                    seq = iaa.Sequential([
                        ####0.75-1.5随机数值为alpha,对图像进行对比度增强,该alpha应用于每个通道
                        iaa.ContrastNormalization((0.75, 1.5), per_channel=True),
                    ])
                elif epoch == 2:
                    seq = iaa.Sequential([
                        #### loc 噪声均值,scale噪声方差,50%的概率,对图片进行添加白噪声并应用于每个通道
                        iaa.AdditiveGaussianNoise(loc=0, scale=(0.0, 0.1 * 255), per_channel=0.75),
                    ])
                elif epoch == 3:
                    seq = iaa.Sequential([
                        iaa.Fliplr(1),  # 水平镜像翻转
                    ])
                # else:
                #     seq = iaa.Sequential([
                #         iaa.OneOf([iaa.Affine(rotate=90),
                #                    iaa.Affine(rotate=90),
                #                    iaa.Affine(rotate=270),
                #                    iaa.Affine(rotate=180),
                #                    iaa.Affine(rotate=180),
                #                    iaa.Affine(rotate=270)])
                #     ])
                seq_det = seq.to_deterministic()  # 保持坐标和图像同步改变,而不是随机
                # 读取图片
                try:
                    img = Image.open(os.path.join(IMG_DIR, name[:-4] + img_type))
                except:
                    img = Image.open(os.path.join(IMG_DIR, name[:-4] + '.JPG'))

                # JPG不支持alpha透明度,有可能报RGBA错误,将图片丢弃透明度转成RGB
                img = img.convert('RGB')
                # sp = img.size
                img = np.asarray(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)

                    # new_bndbox_list:[[x1,y1,x2,y2],...[],[]]
                    n_x1 = int(max(1, min(img.shape[1], bbs_aug.bounding_boxes[0].x1)))
                    n_y1 = int(max(1, min(img.shape[0], bbs_aug.bounding_boxes[0].y1)))
                    n_x2 = int(max(1, min(img.shape[1], bbs_aug.bounding_boxes[0].x2)))
                    n_y2 = int(max(1, min(img.shape[0], bbs_aug.bounding_boxes[0].y2)))
                    if n_x1 == 1 and n_x1 == n_x2:
                        n_x2 += 1
                    if n_y1 == 1 and n_y2 == n_y1:
                        n_y2 += 1
                    if n_x1 >= n_x2 or n_y1 >= n_y2:
                        print('error', name)
                    new_bndbox_list.append([n_x1, n_y1, n_x2, n_y2])

                    # 存储变化后的图片
                    image_aug = seq_det.augment_images([img])[0]
                    # 新文件名
                    new_name = name[:-4] + '-' + str(epoch)
                    path = os.path.join(AUG_IMG_DIR, new_name + img_type)

                    image_auged = bbs.draw_on_image(image_aug, thickness=0)
                    Image.fromarray(image_auged).save(path)

                # 存储变化后的XML
                change_xml_list_annotation(XML_DIR, name[:-4], new_bndbox_list, AUG_XML_DIR, new_name)
                new_bndbox_list = []


if __name__ == "__main__":

    # 随机种子
    ia.seed(1)
    img_type = '.jpg'
    # img_type = '.png'

    # 原数据路径
    IMG_DIR = "/media/bvision/My Book/boatDetail/images/"
    XML_DIR = "/media/bvision/My Book/boatDetail/xml/"

    # 存储增强后的影像文件夹路径
    AUG_IMG_DIR = "/media/bvision/My Book/boatDetail/new_img/"
    if not os.path.exists(AUG_IMG_DIR):
        os.mkdir(AUG_IMG_DIR)

    # 存储增强后的XML文件夹路径
    AUG_XML_DIR = "/media/bvision/My Book/boatDetail/new_xml/"
    if not os.path.exists(AUG_XML_DIR):
        os.mkdir(AUG_XML_DIR)

    # 数据增强n倍
    simple_example(3, IMG_DIR, XML_DIR, AUG_IMG_DIR, AUG_XML_DIR)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

yolov5标签数据增强脚本 的相关文章

随机推荐

  • 树莓派入门(2)树莓派的远程控制

    目录 前言SSHPuTTY远程登录树莓派远程桌面连接VNC与树莓派进行文件传输 前言 在计算机网络中 xff0c 我们可以通过使用C S xff08 客户端 服务器 xff09 模式来实现远程控制 我们如果想用其他电脑来远程控制树莓派 xf
  • “我们“App功能介绍

    系统及开发配置 系统 xff1a Android系统 开发工具 xff1a Android Studio4 0 运行要求 xff1a Android系统5 1及以上 软件介绍 一款娱乐的 xff0c 记录您和爱人纪念日的软件 其中包含经典的
  • Linux/Debian下 root 用户没有声音的解决

    Linux Debian下 root 用户没有声音的解决 问题 xff1a 新装的Debian11 5 下root用户一直没有声音 背景 xff1a Debian11 5 为U盘dvd iso 版本 xff0c root用户下pulse a
  • dmpython win7安装遇到的问题

    系统环境 xff1a win7 python3 6 dm8 20230106 x86 win 64 安装过程及问题 xff1a 打开cmd进入达梦数据库安装目录D soft dm dm8 drivers python dmPython xf
  • python实现队列

    文章目录 队列实现操作实现 队列实现 队列是一种先进先出的数据结构 xff0c 本文用顺序表实现队列 操作 Queue 创建一个空的队列enqueue item 往队列中添加一个item元素dequeue 从队列头部删除一个元素is emp
  • vscode当前工作区不受信任,因此已禁用此扩展

    openGL系列文章目录 文章目录 openGL系列文章目录前言一 解决步骤首先点击左边的 扩展 xff0c 或者使用快捷键 xff1a ctrl 43 shift 43 x2 添加插件信任选择扩展工作区信任 前言 在vscode中安装插件
  • python实现二叉树的创建

    文章目录 二叉树的基本概念二叉树的性质 特性 二叉树的节点表示以及二叉树的创建1 二叉树的节点表示2 二叉树的创建 二叉树的基本概念 二叉树是每个节点最多有两个子树的树结构 通常子树被称作 左子树 xff08 left subtree xf
  • 目标跟踪——SORT算法原理浅析

    目标跟踪文章目录 目标跟踪 SORT算法原理浅析 目标跟踪 Deep Sort算法原理浅析 基于yolov5与Deep Sort的流量统计与轨迹跟踪 文章目录 目标跟踪文章目录SORT算法卡尔曼滤波匈牙利算法 SORT核心算法流程总结 SO
  • 目标跟踪——Deep Sort算法原理浅析

    目标跟踪文章目录 目标跟踪 SORT算法原理浅析 目标跟踪 Deep Sort算法原理浅析 基于yolov5与Deep Sort的流量统计与轨迹跟踪 文章目录 目标跟踪文章目录前言多目标跟踪主要流程Deep Sort总结 前言 背景 xff
  • 基于yolov5与Deep Sort的流量统计与轨迹跟踪

    系列文章目录 目标跟踪 SORT算法原理浅析 目标跟踪 Deep Sort算法原理浅析 基于yolov5与Deep Sort的流量统计与轨迹跟踪 文章目录 系列文章目录前言一 整体目录结构二 Deep Sort代码参数解释三 代码展示总结
  • Ubuntu中docker部署gpu版pytorch

    文章目录 docker简介安装docker与NVIDIA docker安装docke安装NVIDIA docker 安装显卡驱动拉取pytorch GPU版镜像文件运行pytoch容器总结 docker简介 Docker 是一个开源的应用容
  • Ubuntu安装cuda与cudnn,亲测可用

    文章目录 前言一 安装显卡驱动二 安装cuda三 安装cudnn总结 前言 前段时间被派到现场去部署算法 xff0c 之前同事搭好cuda的环境不好用了 xff0c 具体表现为 xff1a 1 屏幕的分辨率显示很奇怪且不可调节 2 输入nv
  • 实现对python源码加密的方法

    文章目录 前言一 将py文件编译成pyc二 将py转化成so文件2 1准备工作2 2新建py2so py文件2 3编译项目文件夹 总结 前言 由于项目的保密性需求 xff0c 对已开发完成的项目需要进行加密处理 xff0c 本文给出两种方法
  • python配置文件的两种方式

    文章目录 前言py文件作为配置文件yaml文件作为配置文件总结 前言 在运行项目程序时通常会有一个配置文件 xff0c 配置文件是用于配置程序的参数和初始化设置的文件 比如现在要做一个项目 xff0c 在部署程序时 xff0c 需要摄像头I
  • Ubuntu18.04安装OpenPCDet:spconv一键安装

    文章目录 前言本机安装环境安装Spconv安装pcdetclone 项目创建并配置虚拟环境安装pcdet 总结 前言 最近在摸索点云数据的处理 xff0c 希望实现对点云数据的目标检测 但是在复现PointPillars算法时遇到很多坑 x
  • OpenPCDet 训练自己的数据集详细教程!

    文章目录 前言一 pcd转bin二 labelCloud 工具安装与使用三 训练仿写代码对pcdet datasets custom custom dataset py进行改写新建tools cfgs dataset configs cus
  • Ubuntu16.04 用Nomachine进行远程控制的配置

    本文介绍如何在Ubuntu16 04环境下运用Nomachine进行远程控制 一 NoMachine介绍 NoMachine是一款基于NX技术进行远程控制的软件 xff0c 最大的优势是跨平台 xff0c 简单 xff0c 可以实现Linu
  • ROS一键安装

    文章目录 前言ROS一键安装总结 前言 这段时间接触到了雷达点云数据 xff0c 用到了ROS系统 xff0c 在安装过程中完成了手动安装 xff0c 也尝试了一键安装 xff0c 特此记录下一键安装方法 ROS一键安装 wget http
  • labelimg voc与yolo数据标签互转脚本

    xml2txt span class token keyword import span os span class token punctuation span path span class token keyword import s
  • yolov5标签数据增强脚本

    此代码用于将标注好的图片及其标签进行数据增强 xff0c 优点在于不需要重新打标签 span class token keyword import span xml span class token punctuation span etr