生活垃圾数据集(YOLO版)

news2024/11/24 9:45:42

文章目录

  • 1、数据集介绍
    • 1.1、数据集图片组成
    • 2.1、获取数据集方式
  • 2、扩展代码
    • 2.1、文件结构树
    • 2.2、划分数据集
    • 2.3、获取数据集文件名字
    • 2.4、文件成功对应检测
  • 3、其他文章

1、数据集介绍

1.1、数据集图片组成

  1. 【有害垃圾】:电池(1 号、2 号、5 号)、过期药品或内包装等;
  2. 【可回收垃圾】:易拉罐、小号矿泉水瓶;
  3. 【厨余垃圾】:小土豆、切过的白萝卜、胡萝卜,尺寸为电池大小;
  4. 【其他垃圾】:瓷片、鹅卵石(小土豆大小)、砖块等。

部分类别图片展示:

文件结构:

----ImageSet\
    |----classes.txt  # 标签种类
    |----data-txt\  # 数据集文件集合
    |    |----test.txt
    |    |----train.txt
    |    |----val.txt
    |----images\ # 数据集图片
    |    |----test\
    |    |    |----fimg_23.jpg
    |    |    |----fimg_38.jpg
    |    |    |----.....
    |    |----train\
    |    |    |----fimg_1.jpg
    |    |    |----fimg_2.jpg
    |    |    |----.....
    |    |----val\
    |    |    |----fimg_4.jpg
    |    |    |----fimg_6.jpg
    |    |    |----.....
    |----labels\  # yolo标签
    |    |----test\
    |    |    |----fimg_23.txt
    |    |    |----fimg_38.txt
    |    |    |----.....
    |    |----train\
    |    |    |----fimg_1.txt
    |    |    |----fimg_2.txt
    |    |    |----.....
    |    |----val\
    |    |    |----fimg_4.txt
    |    |    |----fimg_6.txt
    |    |    |----.....

2.1、获取数据集方式

点击这里:下载本文生活垃圾数据集

2、扩展代码

2.1、文件结构树

draw-tree.py

from pathlib import Path
import os

tree_str = ''
def generate_tree(pathname, n=0):
    global tree_str
    if pathname.is_file():
        tree_str += '    |' * n + '-' * 4 + pathname.name + '\n'
    elif pathname.is_dir():
        tree_str += '    |' * n + '-' * 4 + \
            str(pathname.relative_to(pathname.parent)) + '\\' + '\n'
        for cp in pathname.iterdir():
            generate_tree(cp, n + 1)

if __name__ == '__main__':
    path=os.getcwd()+'/ImageSet'  # 查看当前ImageSet目录下的文件树
    generate_tree(Path(path), 0)
    print(tree_str)

2.2、划分数据集

split-data.py

import os, shutil, random
from tqdm import tqdm

"""
标注文件是yolo格式(txt文件)
训练集:验证集:测试集 (7:2:1) 
"""

def split_img(current_path,img_path, label_path, split_list):
    try:
        Data = current_path+'/ImageSets'
        # Data是你要将要创建的文件夹路径(路径一定是相对于你当前的这个脚本而言的)
        # os.mkdir(Data)

        train_img_dir = Data + '/images/train'
        val_img_dir = Data + '/images/val'
        test_img_dir = Data + '/images/test'

        train_label_dir = Data + '/labels/train'
        val_label_dir = Data + '/labels/val'
        test_label_dir = Data + '/labels/test'

        # 创建文件夹
        os.makedirs(train_img_dir)
        os.makedirs(train_label_dir)
        os.makedirs(val_img_dir)
        os.makedirs(val_label_dir)
        os.makedirs(test_img_dir)
        os.makedirs(test_label_dir)

    except:
        print('文件目录已存在')

    train, val, test = split_list
    all_img = os.listdir(img_path)
    all_img_path = [os.path.join(img_path, img) for img in all_img]
    train_img = random.sample(all_img_path, int(train * len(all_img_path)))
    train_img_copy = [os.path.join(train_img_dir, img.split('\\')[-1]) for img in train_img]
    train_label = [toLabelPath(img, label_path) for img in train_img]
    train_label_copy = [os.path.join(train_label_dir, label.split('\\')[-1]) for label in train_label]
    for i in tqdm(range(len(train_img)), desc='train ', ncols=80, unit='img'):
        _copy(train_img[i], train_img_dir)
        _copy(train_label[i], train_label_dir)
        all_img_path.remove(train_img[i])
    val_img = random.sample(all_img_path, int(val / (val + test) * len(all_img_path)))
    val_label = [toLabelPath(img, label_path) for img in val_img]
    for i in tqdm(range(len(val_img)), desc='val ', ncols=80, unit='img'):
        _copy(val_img[i], val_img_dir)
        _copy(val_label[i], val_label_dir)
        all_img_path.remove(val_img[i])
    test_img = all_img_path
    test_label = [toLabelPath(img, label_path) for img in test_img]
    for i in tqdm(range(len(test_img)), desc='test ', ncols=80, unit='img'):
        _copy(test_img[i], test_img_dir)
        _copy(test_label[i], test_label_dir)


def _copy(from_path, to_path):
    shutil.copy(from_path, to_path)


def toLabelPath(img_path, label_path):
    img = img_path.split('\\')[-1]
    label = img.split('.jpg')[0] + '.txt'
    return os.path.join(label_path, label)


if __name__ == '__main__':
    current_path=os.current_path()
    img_path = current_path+'/images'  # 你的图片存放的路径(路径一定是相对于你当前的这个脚本文件而言的)
    label_path = current_path+'/labels'  # 你的txt文件存放的路径(路径一定是相对于你当前的这个脚本文件而言的)
    split_list = [0.7, 0.2, 0.1]  # 数据集划分比例[train:val:test]
    split_img(current_path,img_path, label_path, split_list)

2.3、获取数据集文件名字

list_name.py

import os

"""
整体目录
----ImageSets\
    |----images\    
    |    |----test\ 
    |    |----train\
    |    |----val\  
    |----labels\    
    |    |----test\ 
    |    |----train\
    |    |----val\ 
"""

def generate(current_path):
    # 存放图片的路径 这里images下面分别有train,test和val文件夹
    for item in os.listdir(current_path):
        files_path=current_path+'/'+item
        files = os.listdir(files_path) # 全部的图片名称
        files.sort()
        print
        '****************'
        print
        'input :', item
        print
        'start...'
        # 打开train.txt
        item_txt='ImageSets/data-txt/'+item+'.txt'
        listText = open(item_txt, 'a')
        for file in files:
            # 具体图片存放路径,如 data/images/train/1.jpg
            name = 'data/images/'+item+'/'+file + '\n'
            listText.write(name)
        listText.close()
        print
        'down!'
        print
        '****************'

if __name__ == '__main__':
    current_path=os.getcwd()+'/ImageSets/images' # # 查看当前ImageSet\images目录下各个文件的名字
    generate(current_path)

2.4、文件成功对应检测

del-error-files.py用于获取数据集文件后,检测images文件labels文件是否都一一对应上。

创建.py文件放在mages文件和labels同目录下运行

import os

currentPath=os.getcwd()
currentPath=currentPath
print(currentPath)
labelArray=[]
imagesArray=[]

def split_extension(fileName):
    return fileName.split('.')[0]

print('自检程序启动!查找到labels目录下异常文件:')
error_label_names = []
for la_name in os.listdir('labels'):
    la_name = split_extension(la_name)
    is_exists = False
    for im_name in os.listdir('images'):
        im_name = split_extension(im_name)
        if la_name == im_name:
            is_exists = True
    if not is_exists:
        error_la_name = la_name + '.txt'
        error_label_names.append(error_la_name)
        labelArray.append(error_la_name)
        print(error_la_name)

print('自检程序启动!查找到images目录下异常文件:')
error_image_names = []
for im_name in os.listdir('images'):
    im_name = split_extension(im_name)
    is_exists = False
    for la_name in os.listdir('labels'):
        la_name = split_extension(la_name)
        if la_name == im_name:
            is_exists = True
    if not is_exists:
        error_im_name = im_name + '.jpg'
        error_image_names.append(error_im_name)
        print(error_im_name)
        imagesArray.append(error_im_name)


# 自动删除文件
def delLabels():
    for item in labelArray:
        labelPath=currentPath+'/labels/'+item
        os.remove(labelPath)
        print(labelPath+'\t'+'删除成功')

def delImages():
    for item in imagesArray:
        imagesPath=currentPath+'/images/'+item
        os.remove(imagesPath)
        print(imagesPath+'\t'+'删除成功') 

if __name__ == '__main__':
    delLabels()
    delImages()

3、其他文章

  1. 双向控制舵机(树莓派版)
  2. YOLOv5s网络模型讲解(一看就会)

参考文献

【yolo训练数据集】标注好的垃圾分类数据集共享
基于YOLOv8分割模型实现垃圾识别
TACO垃圾图像数据集

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

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

相关文章

TensorFlow安装 ,在原本的虚拟环境下配置Tensorflow.

1.TensorFlow安装 ,在原本的虚拟环境下配置Tensorflowh和pytorch 2.我首先在anaconda的环境下创建了一个tensorflow文件夹 如何先进入D盘,再进入tensorflow文件夹的目录D:cd D:\Anaconda\TensorFlowSoftWarepip install tensorflow如图所示报错解决方法 …

软件设计师考试学习2

数据结构与算法基础 数组 稀疏矩阵 用代入法计算,A 数据结构的定义 非线性结构分为树和图,区别在于有没有环路 顺序表与链表 引入头节点可以使所有的节点处理方式一致 如果没有空的头节点,头节点需要单独处理 顺序存储与链式存储 查找…

文件操作(2)

目录 文件操作的步骤: 流: 标准流: 文件指针: 文件信息区: 概念: 关系转化: 注意: 文件指针: 文件的打开和关闭: 打开方式: 打开成…

虹科方案 | LIN/CAN总线汽车零部件测试方案

文章目录 摘要一、汽车零部件测试的重要性?二、虹科的测试仿真工具如何在汽车零部件测试展露头角?三、应用场景**应用场景1:方向盘开关的功能测试****应用场景2:各类型电机的控制测试****应用场景3:RGB氛围灯的功能测试…

基于STM32+华为云IOT设计的智能门禁系统

一、项目介绍 智能门禁系统是一种应用物联网技术的智能化安防系统,提供安全高效的门禁管理和远程监控功能。传统的门禁系统通常使用磁卡、密码或钥匙等方式进行开锁,但存在易丢失、易复制、操作繁琐等问题。为了解决这些问题,并提高门禁安全…

postman-pre-request-scripts使用

一、场景 二、定义模拟接口 using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using SaaS.Framework.DataTransfer; using System.Threading.Tasks;namespace SaaS.KDemo.Api.Controllers {[Route("api/[co…

引领初创企业的数字化转型:选择适合的低代码平台

初创企业在初期各项架构都还不完善,对于应用程序的需求多样,但是又要考量成本。所以,低代码平台就是在综合考量成本和需求的情况下的一个突出的选择。下面我们就六个方面为您介绍:初创企业选择的Zoho Creator低代码平台。 1、功能…

PREEvision Client 10.8.0

PREEvision Client 10.6.0 2692407267qq.com,更多内容请见http://user.qzone.qq.com/2692407267/

php代码审计篇熊海cms代码审计

文章目录 自动审计逐个分析首页index.php文件包含漏洞后台逻辑漏洞cookie绕过登录后台sql报错注入存储型XSS 结束吧 自动审计 看到有很多 逐个分析 首页index.php文件包含漏洞 读一下代码&#xff0c;可以看到很明显的一个文件包含 <?php //单一入口模式 error_repor…

(1) ESP32获取图像,并通过电脑端服务器显示图像

目录​​​​​​​ 一、所需器件工具 二、客户端与服务器进行UDP通信 1、客户端代码 2、服务器端代码 3、效果展示 三、客户端拍照&#xff0c;通过UDP传输到服务器进行显示 1、客户端获取图像并UDP传输 2、电脑端服务器显示图像 3、效果展示 四、代码链接 一、所需器…

高压放大器电源有什么作用和用途

高压放大器是一种专门用于放大高压信号的电子设备。它可以将低幅度的输入信号放大成高幅度的输出信号&#xff0c;用于驱动高压负载或处理高压信号。然而&#xff0c;高压放大器需要特定的电能来运行&#xff0c;而这就是电源的作用。 高压放大器电源的主要作用是为高压放大器提…

Python入门教程 | Python 命名空间和作用域

命名空间 先看看官方文档的一段话&#xff1a; A namespace is a mapping from names to objects.Most namespaces are currently implemented as Python dictionaries。 中文翻译&#xff1a;命名空间(Namespace)是从名称到对象的映射&#xff0c;大部分的命名空间都是通过 P…

投资理财五大定律

大家好&#xff0c;我是财富智星&#xff0c;今天跟大家分享一下理财的五大定律&#xff0c;一起来学习吧。 一、投资理财&#xff0c;别把鸡蛋放一个篮子里 投资理财&#xff0c;不要把所有的资金都放在同一个理财产品中。应该了解市场上各种理财产品的风险、收益、周期和起买…

古代有没有电子元器件?

手机&#xff0c;电脑&#xff0c;电视等等电子产品&#xff0c;无时无刻充斥在我们的生活中&#xff0c;如果有一天突然没有了这些功能多样的电子产品&#xff0c;估计大部分人都会一时之间难以适应。 这就好比正在上网&#xff0c;结果突然被人断了网&#xff0c;导致无网络连…

Linux实现HTTP服务器

在Linux系统中&#xff0c;我们可以利用HTTP服务器代理来实现网络请求的转发和加速&#xff0c;从而提高网站的访问速度和性能。本文将为您详细介绍如何搭建HTTP服务器代理&#xff0c;让您在网络世界中畅通无阻&#xff0c;更加快速高效地进行数据通信。 一、了解HTTP服务器代…

下载水果FLStudio21.2软件安装更新教程

编曲是一种对音乐创作过程中涉及的元素和步骤进行组织和安排的艺术形式。对于想要学习编曲的人来说&#xff0c;以下是一些有用的建议&#xff1a; 1. 学习基础知识 在开始学习编曲之前&#xff0c;你需要掌握一些基础知识&#xff0c;例如音乐理论、乐器演奏和数字音乐制作技…

【Elsevier旗下】JCR2/3区,最快25天录用!计算机与娱乐、教育、游戏、新媒体均可

期刊简介&#xff1a; 出版社&#xff1a;Elsevier 影响因子&#xff08;2022&#xff09;&#xff1a;2.5-3.0 期刊分区&#xff1a;JCR2/3区&#xff0c;中科院4区 检索数据库&#xff1a;SCIE 在检 数据库检索年份&#xff1a;2016年 预警情况&#xff1a;无中科院预警…

【计算机毕业设计】基于SpringBoot的电影在线预定与管理系统的设计与实现

博主主页&#xff1a;一季春秋博主简介&#xff1a;专注Java技术领域和毕业设计项目实战、Java、微信小程序、安卓等技术开发&#xff0c;远程调试部署、代码讲解、文档指导、ppt制作等技术指导。主要内容&#xff1a;毕业设计(Java项目、小程序等)、简历模板、学习资料、面试题…

uni-app 苹果手机底部安全区域的适配问题

方案一(最快速) 解决办法&#xff1a;利用 IOS 新增的 env() 和 constant() 特性来解决&#xff0c;不需要自己动态计算高度&#xff0c;只需将如下 CSS 代码添加到样式中即可。无法解决如果底部区域是输入框&#xff0c;苹果手机的输入法会把输入框遮挡的问题 <!-- 底部栏…

驱动相关命令,指令,API,结构体,路径

【linux内核模块编程】 内核模块 编译&#xff1a;make modlues 安装模块&#xff1a;insmod ***.ko 查看已安装模块&#xff1a;lsmod 卸载模块&#xff1a;rmmod *** 查看模块相关信息&#xff1a;modinfo ***.ko【printk打印 & 输出级别 & dmesg命令】 打印函数&a…