通过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博客

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/843387.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

阿尔泰科技利用485模块搭建自动灌溉系统实现远程控制

自动灌溉系统又叫土壤墒情监控系统,土壤墒情监控系统主要实现固定站无人值守情况下的土壤墒情数据的自动采集和无线传输,数据在监控中心自动接收入库;可以实现24小时连续在线监控并将监控数据通过有线、无线等传输方式实时传输到监控中心生成…

破解反爬虫策略 /_guard/auto.js(二)实战

这次我们用上篇文章讲到的方法来真正破解一下反爬虫策略,这两个案例是两个不同的网站,一个用的是 /_guard/auto.js,另一个用的是/_guard/delay_jump.js。经过解析发现这两个网站用的反爬虫策略基本是一模一样,只不过在js混淆和生成…

FOG Project 文件名命令注入漏洞复现(CVE-2024-39914)

0x01 产品简介 FOG是一个开源的计算机镜像解决方案,旨在帮助管理员轻松地部署、维护和克隆大量计算机。FOG Project 提供了一套功能强大的工具,使用户能够快速部署操作系统、软件和配置设置到多台计算机上,从而节省时间和精力。该项目支持基于网络的 PXE 启动、镜像创建和还…

Python | Leetcode Python题解之第240题搜索二维矩阵II

题目&#xff1a; 题解&#xff1a; class Solution:def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:m, n len(matrix), len(matrix[0])x, y 0, n - 1while x < m and y > 0:if matrix[x][y] target:return Trueif matrix[x][y] > tar…

使用崖山YMP 迁移 Oracle/MySQL 至YashanDB 23.2 验证测试

前言 首届YashanDB「迁移体验官」开放后&#xff0c;陆续收到「体验官」们的投稿&#xff0c;小崖在此把优秀的投稿文章分享给大家~今天分享的用户文章是《使用崖山YMP 迁移 Oracle/MySQL 至YashanDB 23.2 验证测试》&#xff08;作者&#xff1a;尚雷&#xff09;&#xff0c…

数据结构(队列及其实现)

概念与结构 概念&#xff1a;只允许在⼀端进⾏插⼊数据操作&#xff0c;在另⼀端进⾏删除数据操作的特殊线性表&#xff0c; 队列具有先进先出FIFO(First In First Out)原则。 ⼊队列&#xff1a;进⾏插⼊操作的⼀端称为队尾 出队列&#xff1a;进⾏删除操作的⼀端称为队头…

MyBatis 持久层框架-上

一、Mybatis 简介 1. 简介 MyBatis 是一款优秀的持久层框架&#xff0c;它支持自定义SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和Java POJO 为数据库中的记…

使用SpringAOP解决日志记录问题+获取MyBatis执行的SQL语句(企业中常用的日志审计功能)

前言 需求是这样的&#xff1a;每个接口都有不同的数据库操作。想要将这些请求和数据库操作放到日志当中&#xff0c;方便管理员查看有哪些操作被执行了。这里排除查询操作&#xff0c;只在日志中记录 update、insert、delete 这三个操作。期望的日志表中应该有每次执行的 sql …

基于电鸿(电力鸿蒙)的边缘计算网关,支持定制

1 产品信息 边缘计算网关基于平头哥 TH1520 芯片&#xff0c;支持 OpenHarmony 小型系统&#xff0c;是 连接物联网设备和云平台的重要枢纽&#xff0c;可应用于城市基础设施&#xff0c;智能工厂&#xff0c;智能建筑&#xff0c;营业网点&#xff0c;运营 服务中心相关场…

RK3568笔记四十一:DHT11驱动开发测试

若该文为原创文章&#xff0c;转载请注明原文出处。 记录开发单总线&#xff0c;读取DHT11温湿度 一、DHT11介绍 DHT11是串行接口&#xff08;单线双向&#xff09;DATA 用于微处理器与 DHT11之间的通讯和同步&#xff0c;采用单总线数据格式&#xff0c;一次通讯时间4ms左右…

好用的AI搜索引擎

1. 360AI 搜索 访问 360AI 搜索: https://www.huntagi.com/sites/1706642948656.html 360AI 搜索介绍&#xff1a; 360AI 搜索&#xff0c;新一代智能答案引擎&#xff0c;值得信赖的智能搜索伙伴&#xff0c;为复杂搜索提供专业支持&#xff0c;解锁更相关、更全面的答案。AI…

视频汇聚,GB28181,rtsp,rtmp,sip,webrtc,视频点播等多元异构视频融合,视频通话,视频会议交互方案

现在视频汇聚&#xff0c;视频融合和视频互动&#xff0c;是视频技术的应用方向&#xff0c;目前客户一般有很多视频的业务系统&#xff0c;如已有GB28181的监控&#xff08;GB现在是国内主流&#xff0c;大量开源接入和商用方案&#xff09;&#xff0c;rtsp设备&#xff0c;音…

建筑集团工程地产类公司网站源码系统 带完整的安装代码包以及搭建部署教程

系统概述 在数字化浪潮的推动下&#xff0c;建筑行业正经历着前所未有的变革。为了提升企业形象&#xff0c;优化客户体验&#xff0c;加强项目管理&#xff0c;建筑集团工程地产类公司急需一套高效、易用的网站源码系统。小编给大家分享一款专为建筑行业量身定制的网站源码系…

C语言 ——— 在控制台上打印动态变化的菱形

目录 代码要求 代码实现 代码要求 输入 整数line &#xff0c;菱形的上半部分的长度就为line&#xff08;动态变化的菱形&#xff09; 菱形由 "*" 号构成 代码实现 #include<stdio.h> int main() {// 上半长int line 0;scanf("%d", &line)…

MYSQL——库表操作

MYSQL——库表操作 1.1 SQL语句基础1.1.1. SQL简介1.1.2. SQL语句分类1.1.3. SQL语句的书写规范 1.2 数据库的操作1.2.1 数据库的登录及退出1.2.2 查看数据库1.2.3 创建数据库1.2.4 切换数据库1.2.5 查看当前用户1.2.6 删除数据库 1.3 MySQL字符集1.3.1. 字符集1.3.2. 字符序1.…

LeetCode刷题记录(第三天)55. 跳跃游戏

题目&#xff1a; 55. 跳跃游戏 标签&#xff1a;贪心 数组 动态规划 题目信息&#xff1a; 思路一&#xff1a;动态规划 确定dp数组含义&#xff1a; dp[i] 第[i]个位置能否达到确定递推公式&#xff1a; dp[i] 能不能达到&#xff0c;取决于前面d[i-j]&#xff0c;d[i-j…

7月18日学习打卡,数据结构堆

hello大家好呀&#xff0c;本博客目的在于记录暑假学习打卡&#xff0c;后续会整理成一个专栏&#xff0c;主要打算在暑假学习完数据结构&#xff0c;因此会发一些相关的数据结构实现的博客和一些刷的题&#xff0c;个人学习使用&#xff0c;也希望大家多多支持&#xff0c;有不…

SourceCodester v1.0 SQL 注入漏洞(CVE-2023-2130)

前言 CVE-2023-2130是一个影响SourceCodester Purchase Order Management System v1.0的SQL注入漏洞。此漏洞的存在是由于应用程序未能正确过滤和验证用户输入&#xff0c;使得攻击者可以通过SQL注入来执行任意SQL命令&#xff0c;从而对数据库进行未授权的访问和操作。 在利…

java学习--类方法和类方法

类变量 类中static变量会在类加载的时候创建&#xff0c;生存的地方在jdk版本8.0以后都是在堆中&#xff0c;之前都是在方法区&#xff0c;生成的空间不会随着新创建得对象一样变多&#xff0c;同一类的该static变量只会生成一个&#xff0c;每个新创建得对象可共享该变量 类方…

docker compose 容器 编排分组

遇到问题&#xff1a;执行docker compose up -d 后docker compose 创建的容器们 在desktop-docker 中都在docker下一堆 搜索想着能不能把这个docker名字改一下&#xff0c;但是都没有找到这样的一个方案&#xff1b; 最后发现&#xff0c;我执行docker compose up -d 命令所在…