生活垃圾数据集(YOLO版)

news/2024/7/11 1:01:03 标签: 生活, YOLO, python

文章目录

  • 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. 【其他垃圾】:瓷片、鹅卵石(小土豆大小)、砖块等。

部分类别图片展示:

文件结构:

python">----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

python">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

python">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

python">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同目录下运行

python">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.niftyadmin.cn/n/5046068.html

相关文章

【Hello Linux】多路转接之 poll

本篇博客介绍: 介绍高级IO多路转接方式之poll 多路转接之 poll epoll poll函数初识poll函数poll服务器poll的优缺点 poll函数初识 poll是系统提供的一个多路转接接口 它的作用和select函数基本一致 在学习poll函数之前我们先回顾下select函数的缺点 为了维护第三…

三年了,你知道我是什么怎么过来的吗?

时间真快 不知不觉的已经毕业三年了,时间是真的过的快,这次记录主要是记录自己技术上的成长,这篇文章不会讲很多; 重点事件 运动 运动使我快乐,每个程序员都应该运动; 坚持了大半年健身,效果是从2023.2.11…

2023手把手教授neo4j安装及环境配置

安装包下载: 首先进入Neo4j官网:Neo4j Graph Database & Analytics | Graph Database Management System 在上方选择栏中选择“Products”,在其中选择“Deployment Center”,点击“Download Neo4j to get started” 然后往下…

Linux 查看权限控制

1、认知权限信息 通过ls -l 可以以列表形式查看内容,并显示权限细节 序号1,表示文件、文件夹的权限控制信息 序号2,表示文件、文件夹所属用户 序号3,表示文件、文件夹所属用户组 2、权限细节 权限细节总共分为10个槽位 举例&…

十小时开源了一个加密算法仓库,功能强大,后端开发人员狂喜!

写在前面 昨晚上睡觉前我就在想能不能把多个加密算法集成到一个库中,方便开发者调用,说干就干,今天肝了一天,中午直接吃的外卖哈哈哈哈,终于把仓库开源了,欢迎各位Go开发者Star和Fork! 仓库地址 go-cryp…

代码随想录算法训练营19期第53天

1143.最长公共子序列 视频讲解:动态规划子序列问题经典题目 | LeetCode:1143.最长公共子序列_哔哩哔哩_bilibili 代码随想录 初步思路:动态规划。 总结: dp[i][j] :长度为[0, i - 1]的字符串A与长度为[0, j - 1]…

【音视频笔记】Mediacodec+Muxer生成mp4,浏览器无法播放问题处理

文章目录 背景解决过程曲线修复方案 解决问题根源 背景 最近在测试视频录制功能时发现,AudioRecord MediaCodec MediaMuxer生成的MP4,PC浏览器无法播放 ,但是Android、Windows、Mac的播放器应用都能正常播放。虽然不禁想吐槽浏览器视频组件…

【云原生】k8s集群调度

目录 一、调度约束 1.1List-Watch工作机制 1.2调度过程 二、指定调度节点 2.1修改成 nodeSelector 调度方式 三、亲和性 (1)节点亲和性 (2)Pod 亲和性 3.1 键值运算关系 四、污点(Taint) 和 容忍(Tolerations) 4.1污点(…