yolo训练策略--使用 Python 和 OpenCV 进行图像亮度增强与批量文件复制

news2024/9/21 16:50:17

简介

在计算机视觉和深度学习项目中,数据增强是一种常用的技术,通过对原始图像进行多种变换,可以增加数据集的多样性,从而提高模型的泛化能力。本文将介绍如何使用 Python 和 OpenCV 实现图像的亮度增强,并将增强后的图像与对应的注释文件批量复制到新目录中。

项目背景

假设你有一个数据集,包含若干图像及其对应的 XML 注释文件和标签文件。在模型训练前,你希望对这些图像进行亮度增强,并生成新的图像及其对应的注释文件和标签文件。本教程将指导你如何编写一个 Python 脚本,实现此功能。

train目录如下:

在这里插入图片描述
生成的augmented_data如下:

在这里插入图片描述

代码实现

1. 图像亮度调整函数

首先,我们需要编写一个函数,来调整图像的亮度。此处我们使用 HSV 色彩空间的 V(亮度)通道进行调整。

import cv2
import numpy as np

def adjust_brightness(im, vgain):
    hsv = cv2.cvtColor(im, cv2.COLOR_BGR2HSV)
    hue, sat, val = cv2.split(hsv)
    val = np.clip(val * vgain, 0, 255).astype(np.uint8)
    enhanced_hsv = cv2.merge((hue, sat, val))
    brightened_img = cv2.cvtColor(enhanced_hsv, cv2.COLOR_HSV2BGR)
    return brightened_img

2. 创建输出目录

在进行文件操作前,我们需要为增强后的文件创建一个新的输出目录。

import os

def create_output_folders(base_folder):
    new_base_folder = os.path.join(os.path.dirname(base_folder), "augmented_data")
    output_folders = {
        "images": os.path.join(new_base_folder, "images"),
        "annotations": os.path.join(new_base_folder, "annotations"),
        "labels": os.path.join(new_base_folder, "labels")
    }
    for folder in output_folders.values():
        os.makedirs(folder, exist_ok=True)
    return output_folders

3. 文件复制函数

为了复制原始图像和对应的注释文件,我们编写一个通用的文件复制函数。该函数可以根据需要在文件名后添加后缀。

import shutil

def copy_file(src_path, dst_folder, filename_suffix, preserve_ext=True):
    base_filename, ext = os.path.splitext(os.path.basename(src_path))
    if preserve_ext:
        new_filename = f"{base_filename}{filename_suffix}{ext}"
    else:
        new_filename = f"{base_filename}{filename_suffix}"
    dst_path = os.path.join(dst_folder, new_filename)
    shutil.copy(src_path, dst_path)
    return dst_path

4. 图像增强与文件复制

该函数实现了图像的亮度增强,同时将增强后的图像和对应的注释文件保存到新的目录中。

def augment_and_copy_files(base_folder, image_filename, num_augmentations=2, vgain_range=(1, 1.5)):
    base_filename, image_ext = os.path.splitext(image_filename)

    # 构建原始文件路径
    file_paths = {
        "images": os.path.join(base_folder, "images", image_filename),
        "annotations": os.path.join(base_folder, "annotations", f"{base_filename}.xml"),
        "labels": os.path.join(base_folder, "labels", f"{base_filename}.txt")
    }

    # 创建输出文件夹
    output_folders = create_output_folders(base_folder)

    # 复制原始文件
    for key in file_paths:
        copy_file(file_paths[key], output_folders[key], "", preserve_ext=True)

    # 确保增强结果不重复
    unique_vgains = set()

    while len(unique_vgains) < num_augmentations:
        vgain = np.random.uniform(*vgain_range)
        if vgain not in unique_vgains:
            unique_vgains.add(vgain)
            brightened_img = adjust_brightness(cv2.imread(file_paths["images"]), vgain)

            for key in file_paths:
                filename_suffix = f"_enhanced_{len(unique_vgains)}"
                output_path = copy_file(file_paths[key], output_folders[key], filename_suffix, preserve_ext=True)
                if key == "images":
                    cv2.imwrite(output_path, brightened_img)
                    print(f"Saved: {output_path}")
                else:
                    print(f"Copied {key}: {output_path}")

    print(f"All unique images and their annotations for {image_filename} have been enhanced and saved!")

5. 处理整个目录

最后,我们编写一个函数,用于处理指定目录中的所有图像文件,并对每张图像进行增强。

def process_all_images_in_folder(base_folder, num_augmentations=2, vgain_range=(1, 1.5)):
    images_folder = os.path.join(base_folder, "images")
    for image_filename in os.listdir(images_folder):
        if image_filename.lower().endswith(('.bmp', '.jpg', '.jpeg', '.png')):
            augment_and_copy_files(base_folder, image_filename, num_augmentations, vgain_range)

6. 运行脚本

你可以通过以下代码来运行整个图像增强与文件复制过程:

# 使用示例
base_folder = r"C:\Users\linds\Desktop\fsdownload\upgrade_algo_so\data_res_2024_08_31_10_29\train"
process_all_images_in_folder(base_folder)

7.整体代码

import cv2
import numpy as np
import os
import shutil


def adjust_brightness(im, vgain):
    hsv = cv2.cvtColor(im, cv2.COLOR_BGR2HSV)
    hue, sat, val = cv2.split(hsv)
    val = np.clip(val * vgain, 0, 255).astype(np.uint8)
    enhanced_hsv = cv2.merge((hue, sat, val))
    brightened_img = cv2.cvtColor(enhanced_hsv, cv2.COLOR_HSV2BGR)
    return brightened_img


def create_output_folders(base_folder):
    new_base_folder = os.path.join(os.path.dirname(base_folder), "augmented_data")
    output_folders = {
        "images": os.path.join(new_base_folder, "images"),
        "annotations": os.path.join(new_base_folder, "annotations"),
        "labels": os.path.join(new_base_folder, "labels")
    }
    for folder in output_folders.values():
        os.makedirs(folder, exist_ok=True)
    return output_folders


def copy_file(src_path, dst_folder, filename_suffix, preserve_ext=True):
    base_filename, ext = os.path.splitext(os.path.basename(src_path))
    if preserve_ext:
        new_filename = f"{base_filename}{filename_suffix}{ext}"
    else:
        new_filename = f"{base_filename}{filename_suffix}"
    dst_path = os.path.join(dst_folder, new_filename)
    shutil.copy(src_path, dst_path)
    return dst_path


def augment_and_copy_files(base_folder, image_filename, num_augmentations=2, vgain_range=(1, 1.5)):
    base_filename, image_ext = os.path.splitext(image_filename)

    # 构建原始文件路径
    file_paths = {
        "images": os.path.join(base_folder, "images", image_filename),
        "annotations": os.path.join(base_folder, "annotations", f"{base_filename}.xml"),
        "labels": os.path.join(base_folder, "labels", f"{base_filename}.txt")
    }

    # 创建输出文件夹
    output_folders = create_output_folders(base_folder)

    # 复制原始文件
    for key in file_paths:
        copy_file(file_paths[key], output_folders[key], "", preserve_ext=True)

    # 确保增强结果不重复
    unique_vgains = set()

    while len(unique_vgains) < num_augmentations:
        vgain = np.random.uniform(*vgain_range)
        if vgain not in unique_vgains:
            unique_vgains.add(vgain)
            brightened_img = adjust_brightness(cv2.imread(file_paths["images"]), vgain)

            for key in file_paths:
                filename_suffix = f"_enhanced_{len(unique_vgains)}"
                output_path = copy_file(file_paths[key], output_folders[key], filename_suffix, preserve_ext=True)
                if key == "images":
                    cv2.imwrite(output_path, brightened_img)
                    print(f"Saved: {output_path}")
                else:
                    print(f"Copied {key}: {output_path}")

    print(f"All unique images and their annotations for {image_filename} have been enhanced and saved!")


def process_all_images_in_folder(base_folder, num_augmentations=2, vgain_range=(1, 1.5)):
    images_folder = os.path.join(base_folder, "images")
    for image_filename in os.listdir(images_folder):
        if image_filename.lower().endswith(('.bmp', '.jpg', '.jpeg', '.png')):
            augment_and_copy_files(base_folder, image_filename, num_augmentations, vgain_range)


# 使用示例
base_folder = r"C:\Users\linds\Desktop\fsdownload\upgrade_algo_so\data_res_2024_08_31_10_29\train"
process_all_images_in_folder(base_folder)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

驱动(RK3588S)第二课时:引导程序和内核

目录 一、引导程序&#xff08;uboot&#xff09;1、uboot介绍2、A 系列通用芯片启动流程3、uboot的配置与使用 二、内核&#xff08;kernel&#xff09;1、内核的介绍2、内核的配置、裁剪和编译 三、其他知识点 一、引导程序&#xff08;uboot&#xff09; 1、uboot介绍 ubo…

PDF转CAD必备工具:四款转换神器对比推荐

随着数字办公的普及&#xff0c;我们常常需要处理不同格式的文档。在工程和设计领域&#xff0c;PDF转CAD的转换工具更是必备之选。本文将为大家介绍四款高效、便捷的PDF转CAD工具&#xff1a; 一、福昕PDF在线转换器 直通车&#xff08;粘贴到浏览器打开&#xff09;&#x…

软件测试 - 性能测试 (概念)(并发数、吞吐量、响应时间、TPS、QPS、基准测试、并发测试、负载测试、压力测试、稳定性测试)

一、性能测试 目标&#xff1a;能够对个人编写的项目进行接口的性能测试。 一般是功能测试完成之后&#xff0c;最后做性能测试。性能测试是一个很大的范围&#xff0c;在学习过程中很难直观感受到性能。 以购物软件为例&#xff1a; 1&#xff09;购物过程中⻚⾯突然⽆法打开…

PCB设计中” 铺铜的方式“导致电焊机设计失败

发现这个问题的背景 在看到网上视频设计一个小电池的点焊机很容易&#xff0c;在一些需要电力的小设计少不了点焊&#xff0c;就想尝试一下。当然其中遇到很多坑&#xff0c;后面会一起总结。这里遇到的一个小坑&#xff0c;但让人有点苦笑不得。 首先&#xff0c;点焊需要大…

【SQL】统一字符格式

目录 语法 需求 示例 分析 代码 语法 substring(column_name, start, length)用于从一个字符串中提取子字符串 column_name&#xff08;或任何字符串表达式&#xff09;&#xff1a;这是要从中提取子字符串的列名或字符串表达式。start&#xff1a;这是子字符串开始的位置…

用Python实现时间序列模型实战——Day 3: 时间序列数据预处理

一、学习内容 1. 时间序列的差分运算 差分运算&#xff1a; 差分运算是时间序列平稳化的一种方法&#xff0c;通过计算相邻时间点的差值来消除序列中的趋势和季节性成分。 一阶差分用于去除线性趋势&#xff0c;公式为&#xff1a; 其中&#xff1a; 是时间 的原始值&…

【网络安全】服务基础第一阶段——第三节:Windows系统管理基础----服务器远程管理与安全权限

服务器远程管理是一种技术&#xff0c;服务器远程管理是指通过远程连接来监控、配置和维护服务器的过程&#xff0c;而无需直接在物理服务器前操作。它允许IT管理员在不同的地点对服务器进行配置、监控和维护&#xff0c;无需物理上接触到服务器本身。这种能力对于管理分布在多…

LLaVA-MoLE:解决多模态大型语言模型指令微调中的数据冲突问题

人工智能咨询培训老师叶梓 转载标明出处 多模态大模型&#xff08;MLLMs&#xff09;通过指令微调&#xff08;instruction finetuning&#xff09;&#xff0c;能够执行各种任务&#xff0c;如理解图表、处理文档和回答基于图像的问题。但是&#xff0c;当从不同领域混合指令…

算法——K-means算法和算法改进

简介&#xff1a;个人学习分享&#xff0c;如有错误&#xff0c;欢迎批评指正。 一、什么是K-means算法&#xff1f; K-means算法是一种无监督的聚类算法&#xff0c;用于将一组数据点分为K个簇&#xff08;cluster&#xff09;。其核心目标是将数据点划分到K个不同的簇中&…

CAS单点登录安装文档

CAS单点登录安装文档 目录 1、 下载CAS 2、 下载xmlsectool 3、 安装xmlsectool 4、 打包CAS 5、 部署CAS 6、 访问CAS 1.下载CAS 在CAS官方Github下载&#xff1a;https://codeload.github.com/apereo/cas/zip/v5.3.0 2.下载xmlsectool 在MVNREPOSITORY下载xm…

JavaWeb JavaScript ⑨ 正则表达式

生命的价值在于你能够镇静而又激动的欣赏这过程的美丽与悲壮 —— 24.8.31 一、正则表达式简介 正则表达式是描述字符模式的对象。正则表达式用简单的API对字符串模式匹配及检索替换&#xff0c;是对字符串执行模式匹配的强大工具。 1.语法 var pattnew RegExp(pattern,modi…

【软考】IO软件

目录 1. 说明2. 读硬盘文件3. IO 系统的层次结构与每层的主要功能4. 例题4.1 例题1 1. 说明 1.设备管理软件的设计水平决定了设备管理的效率。2.从事I0 设备管理软件的结构&#xff0c;其基本思想是分层构造&#xff0c;也就是说把设备管理软件组织成为一系列的层次。3.低层与…

【机器学习】任务二:波士顿房价的数据与鸢尾花数据分析及可视化

目录 1.实验知识准备 1.1 NumPy 1.2 Matplotlib 库 1.3 scikit-learn 库&#xff1a; 1.4 TensorFlow 1.5 Keras 2.波士顿房价的数据分析及可视化 2.1波士顿房价的数据分析 2.1.1 步骤一&#xff1a;导入所需的模块和包 2.1.2 步骤二&#xff1a;从 Keras 库中加载波…

Linux驱动开发基础(DS18B20温度模块)

所学来自百问网 目录 1.DS18B20 简介 2.硬件设计 3.软件设计 3.1 存储器介绍 3.2 通信时序 3.2.1 初始化时序 3.2.2 写时序 3.2.3 读时序 3.3 常用命令 4. 示例代码 4.1 驱动代码 4.2 应用代码 4.3 Makefile 4.4 实验效果 1.DS18B20 简介 DS18B20 温度传感器具…

[线程]阻塞队列

文章目录 阻塞队列生产者消费者模型通过BlockingQueue理解阻塞队列自己实现阻塞队列 阻塞队列 我们之前学的队列, 其实是最基础的队列, 实际开发中, 针对队列还有很多种变种 普通队列优先级队列阻塞队列 先进先出, 线程安全, 并且带有阻塞功能 阻塞功能指: 如果队列为空, 尝试…

23种设计模式之模板模式

一.什么是模板模式 ‌‌模板模式是一种行为型设计模式&#xff0c;它定义了一个算法的骨架&#xff0c;而将一些步骤留给子类实现。‌这种模式允许子类在不改变算法结构的基础上&#xff0c;重新定义算法的某些步骤。模板模式属于行为型设计模式&#xff0c;主要用于处理那些需…

excel透视图、看板案例(超详细)

一、简介 Excel透视图&#xff08;Pivot Table&#xff09; 功能&#xff1a;透视图是一种强大的数据分析工具&#xff0c;用于汇总、分析和展示数据。它允许用户对数据进行重新排列和分类&#xff0c;从而更容易发现数据中的模式和趋势。用途&#xff1a;可以用来生成动态报表…

python07-单元测试框架unittest1-3

当测试用例数量增加&#xff0c;一个一个执行效率低下&#xff0c;需要将工程下的&#xff0c;case收集并按顺序执行将对应的代码放入run_tests.py run_tests.py&#xff1a;运行程序目的 收集所有的测试用例执行生成测试报告 运用测试用例的收集器或测试用例的加载器 7 Tes…

2.4梯度下降与量化策略优化

1. 梯度下降法的基本原理 欢迎来到“梯度下降”的世界&#xff01;听上去有点像在爬山对吧&#xff1f;其实&#xff0c;这个算法的灵感确实来自爬山。想象你在一个山谷中迷路了&#xff0c;周围雾蒙蒙的&#xff0c;看不清楚路&#xff0c;只能摸着石头一步一步往下走。每走一…

短效ip—互联网利器

《瞬息万变&#xff1a;短效IP在网络世界的奇幻之旅》 在浩瀚无垠的数字宇宙中&#xff0c;互联网如同一条奔腾不息的河流&#xff0c;携带着无数创新与技术的浪花。在这片日新月异的疆域里&#xff0c;短效IP以其独有的魅力&#xff0c;悄然成为网络探险家们手中的魔法钥匙。它…