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

简介

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

项目背景

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

train目录如下:

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

在这里插入图片描述

代码实现

1. 图像亮度调整函数

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

import cv2
import numpy as npdef 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 osdef 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 shutildef 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 shutildef 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_imgdef 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_foldersdef 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_pathdef 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.rhkb.cn/news/413299.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Golang | Leetcode Golang题解之第383题赎金信

题目&#xff1a; 题解&#xff1a; func canConstruct(ransomNote, magazine string) bool {if len(ransomNote) > len(magazine) {return false}cnt : [26]int{}for _, ch : range magazine {cnt[ch-a]}for _, ch : range ransomNote {cnt[ch-a]--if cnt[ch-a] < 0 {r…

Vue(八) localStorage、组件的自定义事件、Todo案例修改

文章目录 一、浏览器本地存储1. 相关API2. Todo案例中的应用 二、组件的自定义事件1. 回顾props传值方式2. 绑定自定义事件&#xff08;1&#xff09;方式一&#xff1a;v-on或&#xff08;2&#xff09;方式二&#xff1a; ref 3. 解绑自定义事件4. 注意点总结 三、Todo案例采…

算法复盘——LeetCode hot100:哈希

文章目录 哈希表哈希表的基本概念哈希表的使用1. 插入操作2. 查找操作3. 删除操作 哈希表的优点和缺点1.两数之和复盘 242.有效的字母异位词复盘 49.字母异位词分组复盘 128. 最长连续序列复盘HashSet 哈希表 先来搞清楚什么是哈希表吧~ 概念不清楚方法不清楚怎么做题捏 哈希表…

c++习题28-计算2的N次方

目录 一&#xff0c;题目 二&#xff0c;思路 三&#xff0c;代码 一&#xff0c;题目 描述 任意给定一个正整数N(N<100)&#xff0c;计算2的n次方的值。 输入描述 输入一个正整数N。 输出描述 输出2的N次方的值。 用例输入 1 5 用例输出 1 32 二&#xff0…

【王树森】Transformer模型(2/2): 从Attention层到Transformer网络(个人向笔记)

Single Head Self-Attention 上节课讲到的属于单头注意力&#xff1a; Multi-Head Self-Attention 使用 l l l 个单头注意力层堆叠成一个多头注意力层&#xff0c;注意它们之间不共享参数一个单头注意力有 3 个参数矩阵&#xff0c;所以多头注意力有 3 l 3l 3l 个参数矩阵…

docker文档

一、docker概述 1、java项目通过docker打包成镜像&#xff08;包含了所有的环境&#xff09;放到docker仓库中&#xff0c;只需要下载发布的镜像直接运行即可&#xff1b; 2、虚拟机技术的缺点&#xff1a; 资源占用多、冗余步骤多、启动很慢 容器化技术&#xff1a; 比较do…

色彩与笔触的交响:广州米塔在线科教技术有限公司揭秘PS绘画秘籍!

在数字艺术的广阔天地里,PS无疑是一颗璀璨的明星&#xff0c;它不仅在图像处理领域独领风骚&#xff0c;更以其强大的功能成为了众多艺术家和设计师进行数字绘画的首选工具。广州米塔在线科教技术有限公司&#xff0c;作为致力于艺术教育与技术分享的平台&#xff0c;深知掌握P…

RNN及其变体

RNN及其变体 RNN模型定义 循环神经网络:一般接受的一序列进行输入,输出也是一个序列 作用和应用场景: RNN擅长处理连续语言文本,机器翻译,文本生成,文本分类,摘要生成 RNN模型的分类 根据输入与输出结构 N Vs N : 输入和输出等长,应用场景:对联生…

科技改变搜索习惯:Anytxt Searcher,重新定义你的信息获取方式!

前言 史蒂夫乔布斯所言&#xff1a;“创新就是把事物联系起来的能力”。这种能力不仅推动了全球科技的飞速发展&#xff0c;也深刻影响着我们的日常生活方式。在这样的背景下&#xff0c;一款名为Anytxt Searcher的本地数据全文搜索引擎应运而生&#xff0c;它以其独特的功能和…

【Android】使用 ADB 查看 Android 设备的 CPU 使用率

目录 一 查看整体CPU使用率 1 top 二 查看特定应用的CPU使用率 1 获取特定应用的进程 ID (PID) 2 使用 top 命令并过滤该 PID 三 常见的CPU相关命令参数 1 adb shell top 参数 一 查看整体CPU使用率 1 top top命令将显示当前所有进程的 CPU 使用情况&#xff0c;包括每…

【Datawhale AI夏令营】从零上手CV竞赛Task3

文章目录 前言一、数据集增强二、设置 YOLO 模型训练参数三、模型微调总结 前言 本文的Task3对Task1的baseline代码继续进行优化的过程。 一、数据集增强 数据增强是机器学习和深度学习中常用的技术&#xff0c;用于通过从现有数据集中生成新的训练样本来提高模型的泛化能力。…

gitee版本控制

前置要求&#xff1a; 安装Git git下载地址&#xff1a;https://git-scm.com/download/win 注册gitee gitee官网&#xff1a;Gitee - 基于 Git 的代码托管和研发协作平台 创建普通项目 目录 git推送远程仓库基本操作 克隆仓库到本地 项目上传 版本管理 分支管理版本…

基于ssm的实习课程管理系统/在线课程系统

实习课程管理系统 摘 要 互联网的快速发展&#xff0c;给各行各业带来不同程度的影响&#xff0c;悄然改变人们的生活、工作方式&#xff0c;也倒逼很多行业创新和变革&#xff0c;以适应社会发展的变化。人们为了能够更加方便地管理项目任务&#xff0c;实习课程管理系统被人们…

55.基于IIC协议的EEPROM驱动控制(2)

升腾A7pro的EEPROM芯片为24C64芯片&#xff0c;器件地址为1010_011。 &#xff08;1&#xff09;Visio整体设计视图&#xff08;IIC_SCL为250KHz&#xff0c;IIC_CLK为1MHz&#xff0c;addr_num为1&#xff0c;地址字节数为2字节&#xff0c;addr_num为0&#xff0c;地址字节数…

产品经理的学习笔记(全集)-持续更新

1.前言 产品经理不是一个软件&#xff0c;也不是一个专业技能&#xff0c;是一个思维量变的过程&#xff1b;内容介绍&#xff1a;P1-产品经理基础认知&#xff1b;P2-从0-1搭建实战项目&#xff08;电商&#xff09; 2.产品经理基础 2.1产品经理定义 产品管理--产品的设计…

【手撕数据结构】二叉树oj题

目录 单值二叉树题目描述题目思路及代码 相同的树题目描述题目思路及代码 对称二叉树题目描述题目思路及代码 另一棵树的子树题目描述题目思路及代码 二叉树的前序遍历题目描述题目思路及代码 二叉树的构建与遍历题目描述题目思路及代码 单值二叉树 题目描述 题目思路及代码 …

SAP LE学习笔记07 - MM与WM跨模块收货到仓库的流程中 如何实现 先上架再入库

上一章讲了LE中收货的一些特殊情况&#xff1a; 1&#xff0c;MM模块收货时&#xff0c;特别移动指标来标识的物料直接产生TO 2&#xff0c;MM中直接收货到仓库的固定Storage Bin(棚番)上 SAP LE学习笔记06 - MM与WM跨模块收货到仓库的流程中 带特别移动指标的物料也可以直接…

怎么将日常的文件做成二维码?文件二维码的在线转换方法

文件做成二维码来展示的应用场景越来越多&#xff0c;可以通过二维码在存储文件的同时&#xff0c;提供文件预览以及下载服务&#xff0c;并且二维码没有时效限制&#xff0c;能够长期提供内容展示服务&#xff0c;更符合现在的展示需求。那么文件生成二维码比较简单的方法可以…

黑屏环境下,如何利用OBD部署OceanBase企业版集群

一、前言 OBD&#xff0c;作为OceanBase官方推出的部署工具&#xff0c;显著简化了OB单机及集群的部署流程。此前&#xff0c;OBD能够支持对社区版OB进行一键部署&#xff0c;那OBD是否同样支持OB企业版的部署呢&#xff1f; 本文为大家介绍通过OBD&#xff0c;在OB企业版集群…

(最新)华为 2024 届秋招-硬件技术工程师-单板硬件开发—机试题—(共12套)(每套四十题)

&#xff08;最新&#xff09;华为 2024 届秋招-硬件技术工程师-单板硬件开发—机试题—&#xff08;共12套&#xff09;&#xff08;每套四十题&#xff09; 岗位——硬件技术工程师 岗位意向——单板硬件开发 真题题目分享&#xff0c;完整版带答案(有答案和解析&#xff0…