目标检测和语义分割常用的数据增强(代码)

2023-11-17

语义分割:

from PIL import Image, ImageFont, ImageDraw, ImageEnhance
import matplotlib.pyplot as plt
import numpy as np
import random
import  random
import os

def image_rotate(image,label):

    """
    对图像进行一定角度的旋转
    :param image_path:  图像路径
    :param save_path:   保存路径
    :param angle:       旋转角度
    :return:
    """
    image_rotated = image.transpose(Image.ROTATE_90).convert('RGB')
    label_rotated = label.transpose(Image.ROTATE_90)
    return image_rotated,label_rotated
def image_rotate1(image,label):

    """
    对图像进行一定角度的旋转
    :param image_path:  图像路径
    :param save_path:   保存路径
    :param angle:       旋转角度
    :return:
    """
    image_rotated = image.transpose(Image.ROTATE_270).convert('RGB')
    label_rotated = label.transpose(Image.ROTATE_270)
    return image_rotated,label_rotated
def bright(image):
    enh_bri = ImageEnhance.Brightness(image)
    brightness = 1.2
    image_brightened = enh_bri.enhance(brightness)

    return image_brightened.convert('RGB')
def ruidu(image):

    enh_sha = ImageEnhance.Sharpness(image)
    sharpness = 2.3
    image_sharped = enh_sha.enhance(sharpness)

    return image_sharped.convert('RGB')
def sedu(image):
    enh_col = ImageEnhance.Color(image)
    color = 1.2
    image_colored = enh_col.enhance(color)

    return image_colored.convert('RGB')
def duibidu(image):
    enh_con = ImageEnhance.Contrast(image)
    contrast = 1.3
    image_contrasted = enh_con.enhance(contrast)

    return image_contrasted.convert('RGB')
def image_flip(image,label):
    image_transpose = image.transpose(Image.FLIP_LEFT_RIGHT).convert('RGB')
    label_transpose = label.transpose(Image.FLIP_LEFT_RIGHT)
    return image_transpose,label_transpose
def image_color(image,label):
    image_transpose = image.transpose(Image.FLIP_TOP_BOTTOM).convert('RGB')
    label_transpose = label.transpose(Image.FLIP_TOP_BOTTOM)
    return image_transpose,label_transpose


path_img = r'E:\New_gj\dataset\T2\cut\images'
path_label = r'E:\New_gj\dataset\T2\cut\labels'
path_new_img = r'E:\New_gj\dataset\T2\after_enhance\images'
path_new_label = r'E:\New_gj\dataset\T2\after_enhance\labels'
img_list = os.listdir(path_img)
label_list = os.listdir(path_label)

k=0
for i in range(len(img_list)):
    img = Image.open(path_img + '/' + img_list[i])
    label =Image.open(path_label + '/' + img_list[i][0:-4] + '.png')
    #保存原图
    img.convert('RGB').save(path_new_img + '/' + str(("%05d" % (k))) + '.png')
    label.save(path_new_label + '/' + str(("%05d" % (k))) + '.png')
    k += 1
    #角度旋转第一次
    img1,mask = image_rotate(img,label)
    img1.save(path_new_img + '/' + str(("%05d" % (k))) + '.png')
    mask.save(path_new_label + '/' + str(("%05d" % (k))) + '.png')
    k+=1
    #角度旋转第二次
    img1,mask = image_rotate1(img,label)
    img1.save(path_new_img + '/' + str(("%05d" % (k))) + '.png')
    mask.save(path_new_label + '/' + str(("%05d" % (k))) + '.png')
    k+=1
    #调整亮度
    img1 = bright(img)
    img1.save(path_new_img + '/' + str(("%05d" % (k))) + '.png')
    label.save(path_new_label + '/' + str(("%05d" % (k))) + '.png')
    k+=1
    #调整对比度
    img1 = duibidu(img)
    img1.save(path_new_img + '/' + str(("%05d" % (k))) + '.png')
    label.save(path_new_label + '/' + str(("%05d" % (k))) + '.png')
    k+=1
    #调整锐度
    img1 = ruidu(img)
    img1.save(path_new_img + '/' + str(("%05d" % (k))) + '.png')
    label.save(path_new_label + '/' + str(("%05d" % (k))) + '.png')
    k+=1
    #调整色度
    img1 = sedu(img)
    img1.save(path_new_img + '/' + str(("%05d" % (k))) + '.png')
    label.save(path_new_label + '/' + str(("%05d" % (k))) + '.png')
    k+=1
    #左右翻转
    img1,mask = image_flip(img,label)
    img1.save(path_new_img + '/' + str(("%05d" % (k))) + '.png')
    mask.save(path_new_label + '/' + str(("%05d" % (k))) + '.png')
    k+=1
    #上下翻转
    img1,mask = image_color(img,label)
    img1.save(path_new_img + '/' + str(("%05d" % (k))) + '.png')
    mask.save(path_new_label + '/' + str(("%05d" % (k))) + '.png')
    k += 1



    print(img_list[i] + 'is finished')

目标检测:

import xml.etree.ElementTree as ET
import pickle
import os
from os import getcwd
import numpy as np
from PIL import Image
import shutil
import matplotlib.pyplot as plt

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("%06d" % (str(id) + '.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)
    elem = tree.find('filename')
    elem.text = (id + '.jpg')
    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, 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 = "E:/New_gj/dataset/cml/JPEGImages"
    XML_DIR = "E:/New_gj/dataset/cml/Annotations"

    AUG_XML_DIR = "E:/New_gj/dataset/cml/xml_aug"  # 存储增强后的XML文件夹路径
    try:
        shutil.rmtree(AUG_XML_DIR)
    except FileNotFoundError as e:
        a = 1
    mkdir(AUG_XML_DIR)

    AUG_IMG_DIR = "E:/New_gj/dataset/cml/img_aug"  # 存储增强后的影像文件夹路径
    try:
        shutil.rmtree(AUG_IMG_DIR)
    except FileNotFoundError as e:
        a = 1
    mkdir(AUG_IMG_DIR)

    AUGLOOP = 5  # 每张影像增强的数量

    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)),  # change brightness, doesn't affect BBs
        iaa.GaussianBlur(sigma=(0, 3.0)),  # iaa.GaussianBlur(0.5),
        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
    ])

    for root, sub_folders, files in os.walk(XML_DIR):

        for name in files:

            bndbox = read_xml_annotation(XML_DIR, name)
            shutil.copy(os.path.join(XML_DIR, name), AUG_XML_DIR)
            shutil.copy(os.path.join(IMG_DIR, name[:-4] + '.jpg'), AUG_IMG_DIR)

            for epoch in range(AUGLOOP):
                seq_det = seq.to_deterministic()  # 保持坐标和图像同步改变,而不是随机
                # 读取图片
                img = Image.open(os.path.join(IMG_DIR, name[:-4] + '.jpg'))
                # 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]
                path = os.path.join(AUG_IMG_DIR, name[:-4] + '_' + str(epoch+1) + '.jpg')
                #path = os.path.join(AUG_IMG_DIR, str("%06d" % (len(files) + int(name[:-4]) + epoch * 250)) + '.jpg')
                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, name[:-4] + '_' + str(epoch+1))
                print(name[:-4] + '_' + str(epoch+1) + '.jpg')
                new_bndbox_list = []

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

目标检测和语义分割常用的数据增强(代码) 的相关文章

  • Python获取MP3文件的ID3标签信息

    在Python中 你可以使用第三方库来获取MP3文件的ID3标签信息 ID3标签是嵌入在MP3文件中的元数据 它包含了有关音频文件的信息 如歌曲名称 艺术家 专辑 年份等 一种常用的Python库是mutagen 它提供了一个简单而强大的接
  • 如何用matlab计算自相关,Matlab计算自相关和互相关

    1 x t sinc 10t y t rect 10t 利用Matlab求 x t y t 的自相关函数及互相关函数 rect x abs s lt 0 5 定义rect 矩形脉冲 T 10 dt 0 001 t T 2 dt T 2 x
  • QT ToolBar上工具按钮隐藏

    之前再toolBar上添加工具时 用的QPushButton 然后再addWidget就可以了 但是当想要隐藏掉 调用hide和setVisible时 发现没反应 这块也没有细究 只寻找答案 解决办法 1 使用QToolButton和QAc
  • 学习笔记:运算放大器(OPA)超详细讲解(内含运用电路仿真)

    一运算放大器的简介 放大器 简称 运放 是具有很高放大倍数的电路单元 运算放大器是一个内含多级放大电路的电子集成电路 分别是输入级 中间级 发大级还有偏置电路 红色绿色蓝色分别是输入级 中间级和输出级 输入级采用具有很强零点漂移抑制能力的差
  • CSDN超级实习生计划——大厂实习直通车,年薪最高可达30W。2022正式开启~

    一 CSDN超级实习生计划是什么 2022届高校毕业生规模预计1076万人 同比增加167万人 这是高校毕业生规模首次超过千万 也是近几年增长人数最多的一年 1076万大学生就业的压力急剧暴增 也将迎来最难就业季 超级实习生计划是CSDN重
  • 一天1个机器学习知识点(一)

    陆陆续续整理的机器学习的知识点 资料大多数来自网上 不做盈利目的 如果侵权请告知即删 如果文章中有错误的地方还请各位同学指正 一起学习 一起进步 每天都在更新中 记得收藏 每天进步一点点 一天1个机器学习知识点 一 决策树 有无监督学习 S
  • ajax中的application/x-www-form-urlencoded中的使用

    一 HTTP上传的基本知识 在Form元素的语法中 EncType表明提交数据的格式 用 Enctype 属性指定将数据回发到服务器时浏览器使用的编码类型 下边是说明 application x www form urlencoded 窗体
  • MSP430 F5529的按钮控制led灯亮灭程序代码——按一下亮一下,再按一下暗

    2019 6 27 MP430F5529 电子工艺实习实验1 作业1 按下按键 LED亮 再按一次 LED灭 设置P8 1输出灯 P1 2输入按钮 P1 2下降沿 1 0 中断 中断标识为0 给按钮设置上拉电阻让其的高电位更加稳定 设置这两
  • 详解Java基础中注释添加的位置以及原则

    一 添加注释的位置 1 类 接口 这一部分注释是必须的 在这里 我们需要使用javadoc注释 需要标明 创建者 创建时间 版本 以及该类的作用 2 方法 在方法中 我们需要对入参 出参 以及返回值 均要标明 3 常量 对常量 我们需要使用

随机推荐

  • error LNK2005: _DllMain@12 already defined in MSVCRTD.lib

    本文主要分析和解决编译链接时产生的 LNK2005 错误 错误信息 mfcs90ud lib dllmodul obj error LNK2005 DllMain 12 already defined in MSVCRTD lib dllm
  • System.currentTimeMillis()

    System currentTimeMillis 计算方式与时间的单位转换 一 时间的单位转换 1秒 1000毫秒 ms 1毫秒 1 1 000秒 s 1秒 1 000 000 微秒 s 1微秒 1 1 000 000秒 s 1秒 1 00
  • Nginx 解决跨域

    项目准备 前端网站地址 http localhost 8080 服务端网址 http localhost 8081 确认服务端是没有处理跨域的 先用postman测试服务端接口是正常的 当前端网站8080去访问服务端接口时 就产生了跨域问题
  • 华硕笔记本开机自动进入bios,进不了windows系统的解决方法

    亲测有效解决办法 1 开机的时候长按F2键进入BIOS界面 通过方向键进 Secure 菜单 通过方向键选择 Secure Boot Control 选项 将其设定为 Disabled 2 通过方向键进入 Boot 菜单 通过方向键选择 L
  • ROS2执行source setup.bash命令报错及解决办法

    1 错误类型 在对ros2包编译通过后 在终端执行 source path to your workspace install setup bash 时报错 not found path to your workspace install
  • 快手直播怎么引流?快手直播效果怎么样?每个人对时尚的定义不同

    快手直播怎么引流 快手直播效果怎么样 每个人对时尚的定义不同 快手直播效果怎么样 每个人对时尚的定义不同 对于普通人来说 都会有对美的追求 比如找到适合自己的穿搭 适合自己的美妆 几乎每一种时尚风格在快手平台都能有被老铁认可的机会和其存在的
  • mysql常用的hint(原创)

    转自 http linux chinaunix net techdoc database 2008 07 29 1021449 shtml 对于经常使用Oracle的朋友可能知道 oracle的hint功能种类很多 对于优化sql语句提供了
  • 网络部署运维实验(pat 端口映射含命令)

    作者 小刘在这里 每天分享云计算网络运维课堂笔记 疫情之下 你我素未谋面 但你一定要平平安安 一 起努力 共赴美好人生 夕阳下 是最美的 绽放 愿所有的美好 再疫情结束后如约而至 目录 一 实验简介 二 图纸 三 实验命令 一 实验简介 本
  • 区块链开发团队,公链开发才是主战场

    在区块链技术开发公司不断完善的当下 很多企业都想加入进来 有远见的人永远能嗅到区块链未来市场的发展趋向 以区块链技术开发实体企业应用 在空白的市场里拥有无限开发潜力 而创业者要做的就是快人一步 才能夺得市场先机 我们团队作为一家专业的区块链
  • python统计字符串中,字母的个数、数字的个数、其它字符个数。

    str input 请输入 letter 0 num 0 other 0 for i in str if i isdigit num 1 elif i isalnum letter 1 else other 1 print letter n
  • axios post传递对象_POST 方法的content-type类型

    content type是http请求的响应头和请求头的字段 当作为响应头时 告诉客户端实际返回的内容的内容类型 作为请求头时 post或者put 客户端告诉服务器实际发送的数据类型 在前端开发过程中 通常需要跟后端工程师对接接口的数据格式
  • React 条件渲染最佳实践(7 种方法)

    在 React 中 条件渲染可以通过多种方式 不同的使用方式场景取决于不同的上下文 在本文中 我们将讨论所有可用于为 React 中的条件渲染编写更好的代码的方法 条件渲染在每种编程语言 包括 javascript 中都是的常见功能 在 j
  • 线性dp的题目汇总

    恩 挺多 慢慢看 衔接在此
  • ccrypt 在 Windows上的使用教程

    ccrypt是个加密解密工具包 一般情况下在Linux上使用 这是个windows版的使用教程 请注意 ccrypt是一个 命令行 程序 它只能从DOS提示符或shell中运行 它不是那种双击就能运行的程序 step1 到官网下载对应的安装
  • gvim for verilog简易配置

    目录 前言 一 gvim的主题和字体资源 二 gvim编辑器基本配置 三 gvim针对verilog配置 总结 前言 分别介绍了gvim的主题和字体资源推荐 gvim编辑器基本配置和针对verilog的配置 以下为正文 一 gvim的主题和
  • 递归算法(demo:斐波那契数列的实现,树的遍历,快速排序)

    递归算法 执行代码 并没执行完全的时候调用自己本身 然后等待条件不满足递归的时候 完全执行代码 执行完全后返回上一层 执行未完成的部分 递归算法与for where循环可以相互转换 通过一定的方案达到一样的效果 比如for循环可以通过栈 实
  • MacOS IDEA配置scala

    1 前提 scala已经在mac本地安装 2 新建项目后 点击项目 右键 点击Add Framwork Support 3 找到scala 刚开始时 scala dk 2 11 8 是没有的 需要自己找 所以点击create 再点击Brow
  • 使用DQN训练Grid_word任务

    Tensorflow实战 一书中 强化学习一章里讲到了DQN网络 很有感触 在这里和大家分享一下 DQN网络也是Q learning的升级版 在原有的Q learning中加入了卷积层 由于深度学习需要大量的样本数据 DQN也就引入了Exp
  • 常见的计算机局域网络的拓扑结构是,局域网常见的拓扑结构有哪三种

    大家好 我是时间财富网智能客服时间君 上述问题将由我为大家进行解答 局域网常见的拓扑结构有星型结构 环型结构和总线型结构 1 星型结构 这种结构是目前在局域网中应用得最为普遍的一种 在企业网络中几乎都是采用这一方式 星型网络几乎是Ether
  • 目标检测和语义分割常用的数据增强(代码)

    语义分割 from PIL import Image ImageFont ImageDraw ImageEnhance import matplotlib pyplot as plt import numpy as np import ra