python将图片以及标注信息按类别分开

news2024/11/25 15:54:18

目录

需求:

思路:

原数据集结构:

代码1(效率低,但不用提前知道需要分多少个类别):

代码2(效率相对高点,但类别数量如果超过设定的11个,则需要改下代码) :

分类后的数据集结构:


需求:

现有的数据集一张图片上往往有多个标注类别,这样训练出的模型可以识别多个类别目标,我们需要只能识别单一类别的模型

思路:

将原有的数据集按照类别分开,重新进行训练

原数据集结构:

标注信息(yolo格式的五列标注信息:类别、中心点的x、中心点的y、宽、高):

代码1(效率低,但不用提前知道需要分多少个类别):
# -*- coding: utf-8 -*-
"""
Created on Fri Dec 29 14:06:08 2023

@author: DIY-PC
"""

import os
import random
import shutil

# 原数据集目录
root_dir = 'Z:\dataset\drone_images'
# 使用时仅需创建target_path
target_path = 'Z:\dataset\drone_images_classify'
label_path = 'labels'
images_path = 'images'

for file in os.listdir(root_dir):
    name, ext = os.path.splitext(file)
    if name == 'classes':
        break
    if file.endswith('.txt'):
        # 读取每一行
        with open(os.path.join(root_dir, file), "r") as annofile:
            for line in annofile:
                line = line.strip()
                rects = line.split(" ")
                target_labels_path = os.path.join(target_path, rects[0], label_path)
                target_images_path = os.path.join(target_path, rects[0], images_path)
                # 文件不存在,创建新文件并写入内容
                if not os.path.exists(target_labels_path):
                    os.makedirs(target_labels_path, exist_ok=True)
                    os.makedirs(target_images_path, exist_ok=True)
                if not os.path.exists(os.path.join(target_labels_path, file)):
                    shutil.copy(os.path.join(root_dir, name + '.JPG'), target_images_path)
                with open(os.path.join(target_labels_path, file), 'a') as classify_annofile:
                    classify_annofile.write(line + "\n")  # 写入内容并换行
代码2(效率相对高点,但类别数量如果超过设定的11个,则需要改下代码) :
# -*- coding: utf-8 -*-
"""
Created on Fri Dec 29 14:06:08 2023

@author: DIY-PC
"""

import os
import shutil

# 原数据集目录
root_dir = 'Z:\dataset\drone_images'
# 使用时仅需创建target_path
target_path = 'Z:\dataset\drone_images_classify'
label_path = 'labels'
images_path = 'images'
anno_0_list = []
anno_1_list = []
anno_2_list = []
anno_3_list = []
anno_4_list = []
anno_5_list = []
anno_6_list = []
anno_7_list = []
anno_8_list = []
anno_9_list = []
anno_10_list = []
anno_list_dict = {
    '0': anno_0_list,
    '1': anno_1_list,
    '2': anno_2_list,
    '3': anno_3_list,
    '4': anno_4_list,
    '5': anno_5_list,
    '6': anno_6_list,
    '7': anno_7_list,
    '8': anno_8_list,
    '9': anno_9_list,
    '10': anno_10_list
}
for file in os.listdir(root_dir):
    name, ext = os.path.splitext(file)
    if name == 'classes':
        break
    if file.endswith('.txt'):
        # 读取每一行
        with open(os.path.join(root_dir, file), "r") as annofile:
            class_list = []
            for line in annofile:
                line = line.strip()
                rects = line.split(" ")
                anno_list_dict[rects[0]].append(line)
                if rects[0] not in class_list:
                    class_list.append(rects[0])

        print(file + "文件读取完毕")
        # 遍历类别
        for cla in class_list:
            # 如果不存在则创建文件夹,写入文件
            target_labels_path = os.path.join(target_path, cla, label_path)
            target_images_path = os.path.join(target_path, cla, images_path)
            # 文件不存在,创建新文件并写入内容
            if not os.path.exists(target_labels_path):
                os.makedirs(target_labels_path, exist_ok=True)
                os.makedirs(target_images_path, exist_ok=True)
            with open(os.path.join(target_labels_path, file), 'a') as classify_annofile:
                for item in anno_list_dict[cla]:
                    classify_annofile.write(item + "\n")  # 写入内容并换行
            if not os.path.exists(os.path.join(target_images_path, name + '.JPG')):
                shutil.copy(os.path.join(root_dir, name + '.JPG'), target_images_path)
        print(file + "文件写入完毕")
分类后的数据集结构:

 

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

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

相关文章

MySQL·索引

目录 索引的意义 索引的理解 为何IO交互要是 Page 理解Page 其他数据结构为何不行? 聚簇索引 VS 非聚簇索引 索引操作 主键索引操作 唯一键索引操作 普通索引的创建 总结 全文索引 索引的意义 索引:提高数据库的性能,索引是物美…

[AIGC] 压缩列表了解吗?快速列表 quicklist 了解吗?

文章目录 压缩列表了解吗?快速列表 quicklist 了解吗? 压缩列表了解吗? 压缩列表是 Redis 为了节约内存 而使用的一种数据结构,是由一系列特殊编码的连续内存快组成的顺序型数据结构。 一个压缩列表可以包含任意多个节点&#xf…

ae如何导出mp4格式?图文教程,手把手教您搞定

在创作精彩的视频内容后,将其成功导出为通用的MP4格式是确保作品在不同平台上流畅播放的重要一环。Adobe After Effects作为一款专业的视频后期制作工具,提供了丰富的功能来实现这一目标。在本文中,我们将通过图文教程,手把手地向…

人生是旷野,不是轨道

最近看到一句话,很喜欢,分享一下。"人生是旷野,不是轨道"。人生不是固定的方程式,也没有唯一答案,没有谁生来就应该是什么样。别太被太多世俗观念束缚住手脚,每个人都有权利自由生长,…

【Ubuntu】apt命令安装最新版本Nginx

目录 环境前言添加Nginx仓库步骤1、仓库公钥2、文本公钥转二进制GPG公钥(可选)3、添加apt软件源4、安装新版Nginx 参阅 环境 Ubuntu 22.04 前言 ubuntu官方apt软件仓库(或者叫软件源)的软件版本可能会比较旧,导致无…

Unity 性能优化之GPU Instancing(五)

提示:仅供参考,有误之处,麻烦大佬指出,不胜感激! 文章目录 前言一、GPU Instancing使用方法二、使用GPU Instancing的条件三、GPU Instancing弊端四、注意五、检查是否成功总结 前言 GPU Instancing也是一种Draw call…

xCode升级后: Library ‘iconv2.4.0’ not found

报错信息: targets 选中 xxxNotification: Build Phases ——> Link Binary With Libraries 中,移除 libiconv.2.4.0.tbd libiconv.2.4.0.dylib 这两个库(只有一个的移除一个就好)。 然后重新添加 libiconv.tbd 修改完…

如何将Git仓库中的文件打包成zip文件?

要将Git仓库中的文件打包成zip文件,您可以使用git archive命令。这个命令允许您将任何git可访问的树或提交导出成一个归档文件。以下是一些基本的步骤: 打开命令行或终端。切换到您的Git仓库的目录。执行git archive命令。 git archive --formatzip --o…

【ARMv8/v9 系统寄存器 5 -- CPU ID 判断寄存器 MPIDR_EL1 使用详细介绍】

文章目录 寄存器名称: MPIDR_EL1寄存器结构:主要功能和用途亲和级别(Affinity Levels)简介CORE ID 获取函数 在ARMv8-A架构中, MPIDR_EL1寄存器是一个非常重要的系统寄存器,它提供了关于处理器在其物理和逻辑配置中的位置的信息。…

力扣:48. 旋转图像(Java)

目录 题目描述:输入:输出:代码实现: 题目描述: 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使…

STM32快速入门(定时器之输出PWM波形)

STM32快速入门(定时器之输出PWM波形) 前言 本节主要讲解STM32利用通用定时器,利用CCR和CNT寄存器,输出指定占空比和频率的PWM波形。其功能的应用有:实现LED呼吸灯的效果、控制步进电机、控制直流电机转速等。 导航 …

GUI Pro - Survival Clean

通过开发生存游戏的经验,我们制作了一个带有科幻概念的GUI包。我们希望这个包对你的项目有所帮助。 主要特征 - 2560x1440分辨率图形 - GUI皮肤,包含布局演示场景和预制件 - 提供各种象形图标和项目图标 - 切片元素和白色元素,可定制尺寸和颜色 - 不包括编码和动画 资产 - 1…

栈和队列OJ练习题及解答

前言 上一篇博客已经讲到了栈和队列的数据结构,概括一下:栈后进先出(Last In First Out)、队列先进先出(First In First Out)。那么,接下来就来讲讲,关于栈和队列的相关练习题&#…

蓝桥杯-线性动态规划问题背包问题进阶策略详解-

题目&#xff1a;蓝桥云课-青蛙吃虫 解题代码&#xff1a; #include <iostream> #include<cstring> #include<algorithm> using namespace std;const int N106;int f[N][N]; int a[N]; int t,l,r,k,n;int main() {cin>>t;while(t--){scanf("%d%…

FANUC机器人初始化系统的基本方法和步骤

FANUC机器人初始化系统的基本方法和步骤 首先,在做系统初始化之前,必须做好系统的备份,这里做个镜像备份,更详细的镜像备份步骤可参考以下链接中的内容: FANUC机器人进行全部备份和镜像备份以及加载备份文件的具体操作(图文) 如下图所示,在示教器右边的USB接口上插个…

Android finishInputEvent 流程分析

InputDispatcher将事件分发给应用程序后&#xff0c;将该event放入connection的wq队列中&#xff0c;APP处理完之后&#xff0c;需要发送一个完成的信号给InputDispatcher&#xff0c;以供InputDispatcher来将该event从wq队列中移除。我们来分析这个过程。 我们知道&#xff0…

图文详解:synchronized关键字 及其底层原理

目录 一.线程安全问题 二.synchronized关键字 ▐ synchronized图解 ▐ 可重入锁及图解 ▐ synchronized用于方法上 三.Java标准库中synchronized的使用 四.synchronized的底层实现原理 一.线程安全问题 线程安全是指在多线程环境下&#xff0c;对共享资源的访问不会导致…

【数轮】数论、质数、最大公约数、菲蜀定理

数学 唯一分解定理 n>2都可以表示为质因数的乘方。 令 n a1b1a2b2 … \dots … a1,b1 … \dots …都是质因数&#xff0c;b1,b2 … \dots …是对应质因数的数量。 调和级数 11/2 1/3 1/4 ⋯ \cdots ⋯ 1/ n 约等于 logn。 证明过程&#xff1a; 1/3 1/4 < (1/2) …

程序员最趁手的SVM算法,学完你会哭着感谢努力的自己!下篇.

支持向量机上篇内容更重要。 上篇地址&#xff1a;程序员最趁手的SVM算法&#xff0c;学完你会哭着感谢努力的自己&#xff01;上篇。-CSDN博客 废话不说直接进入主题&#xff1a; 6核贝叶斯支持向量机 核贝叶斯支持向量机通过学习一些已知的例子&#xff0c;并找到一个特殊…

【0DAY】湖南建研工程质量检测系统Download接口处存在任意文件读取漏洞

免责声明&#xff1a;文章来源互联网收集整理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该…