自定义语义分割数据集(划分训练集与验证集)、并且将一个文件夹下的所有图片的名字存到txt文件
我们可以借助Pytorch从文件夹中读取数据集,十分方便,但是Pytorch中没有提供数据集划分的操作,需要手动将原始的数据集划分为训练集、验证集和测试集,废话不多说, 这里写了一个工具类,帮助大家将数据集自动划分为训练集、验证集和测试集,还可以指定比例,代码如下。

1.划分训练集、验证集与测试集

工具类

import os
import random
import shutil
from shutil import copy2def data_set_split(src_data_folder, target_data_folder, train_scale=0.8, val_scale=0.1, test_scale=0.1):'''读取源数据文件夹,生成划分好的文件夹,分为trian、val、test三个文件夹进行:param src_data_folder: 源文件夹 E:/biye/gogogo/note_book/torch_note/data/utils_test/data_split/src_data:param target_data_folder: 目标文件夹 E:/biye/gogogo/note_book/torch_note/data/utils_test/data_split/target_data:param train_scale: 训练集比例:param val_scale: 验证集比例:param test_scale: 测试集比例:return:'''print("开始数据集划分")class_names = os.listdir(src_data_folder)# 在目标目录下创建文件夹split_names = ['train', 'val', 'test']for split_name in split_names:split_path = os.path.join(target_data_folder, split_name)if os.path.isdir(split_path):passelse:os.mkdir(split_path)# 然后在split_path的目录下创建类别文件夹for class_name in class_names:class_split_path = os.path.join(split_path, class_name)if os.path.isdir(class_split_path):passelse:os.mkdir(class_split_path)# 按照比例划分数据集,并进行数据图片的复制# 首先进行分类遍历for class_name in class_names:current_class_data_path = os.path.join(src_data_folder, class_name)current_all_data = os.listdir(current_class_data_path)current_data_length = len(current_all_data)current_data_index_list = list(range(current_data_length))random.shuffle(current_data_index_list)train_folder = os.path.join(os.path.join(target_data_folder, 'train'), class_name)val_folder = os.path.join(os.path.join(target_data_folder, 'val'), class_name)test_folder = os.path.join(os.path.join(target_data_folder, 'test'), class_name)train_stop_flag = current_data_length * train_scaleval_stop_flag = current_data_length * (train_scale + val_scale)current_idx = 0train_num = 0val_num = 0test_num = 0for i in current_data_index_list:src_img_path = os.path.join(current_class_data_path, current_all_data[i])if current_idx <= train_stop_flag:copy2(src_img_path, train_folder)# print("{}复制到了{}".format(src_img_path, train_folder))train_num = train_num + 1elif (current_idx > train_stop_flag) and (current_idx <= val_stop_flag):copy2(src_img_path, val_folder)# print("{}复制到了{}".format(src_img_path, val_folder))val_num = val_num + 1else:copy2(src_img_path, test_folder)# print("{}复制到了{}".format(src_img_path, test_folder))test_num = test_num + 1current_idx = current_idx + 1print("*********************************{}*************************************".format(class_name))print("{}类按照{}:{}:{}的比例划分完成,一共{}张图片".format(class_name, train_scale, val_scale, test_scale, current_data_length))print("训练集{}:{}张".format(train_folder, train_num))print("验证集{}:{}张".format(val_folder, val_num))print("测试集{}:{}张".format(test_folder, test_num))if __name__ == '__main__':src_data_folder = "/home/ubuntu/PycharmProjects/DataSet/workshop"target_data_folder = "/home/ubuntu/PycharmProjects/DataSet/workshop"data_set_split(src_data_folder, target_data_folder)

2.文件名称保存为txt

import osimg_path = '/home/ubuntu/PycharmProjects/DataSet/workshop/train/'
img_list = os.listdir(img_path)
print(img_list)
f = open('/home/ubuntu/PycharmProjects/DataSet/workshop/workshop_train_list.txt', 'w')
for img in img_list:img = img[:-4] + '.jpg'imgstr = 'train/'+img+' '+'trainannot/'+img[:-4]+'.png'+'\n'print(imgstr)f.write(imgstr)
f.close()

3.文件移动
第一张图是训练集(train),第二张图是未划分之前的原标签(mask)数据集,现在需要根据训练集中的图片,将与之对应的标签(mask)图片移动到另一个文件夹(trainannot)中


import os, random, shutildef moveImage(fileImageDir):pathDir = os.listdir(fileImageDir)filenumber = len(pathDir)rate = 0.1picknumber = int(filenumber * rate)  # 按照设定比例从文件夹中取一定数量图片sample = random.sample(pathDir, picknumber)print(sample)for name in sample:shutil.move(fileImageDir + name, tarImageDir + name)returndef extract_name(Image_dir, write_file_name):file_list = []# 读取文件,并将地址、图片名和标签写到txt文件中write_file = open(write_file_name, "w")  # 打开write_file_name文件for file in os.listdir(Image_dir):if file.endswith(".jpg"):name = file.split('.')[0]  # 分割图像名称和后缀名write_name = namefile_list.append(write_name)sorted(file_list)  # 将列表中所有元素随机排列number_of_lines = len(file_list)for current_line in range(number_of_lines):write_file.write(file_list[current_line] + '\n')write_file.close()def moveLabel(fileLabelDir, write_file_name):pathDir = os.listdir(fileLabelDir)f = open(write_file_name, 'r')lines = f.readlines()for line in lines:line = line.strip('\n')  # 去除文本的换行符,否则报错shutil.move(fileLabelDir + str(line) + '.jpg', tarLabelDir + str(line) + '.jpg')if __name__ == '__main__':fileImageDir = '/home/ubuntu/PycharmProjects/DataSet/workshop/img/'  # 训练集图像地址tarImageDir = '/home/ubuntu/PycharmProjects/DataSet/workshop/test/'  # 测试集图像地址Image_dir = tarImageDirwrite_file_name = '/home/ubuntu/PycharmProjects/DataSet/workshop/img.txt'  # 提取测试集文件名称文件存放地址fileLabelDir = '/home/ubuntu/PycharmProjects/DataSet/workshop/mask/'  # 训练集标签地址tarLabelDir = '/home/ubuntu/PycharmProjects/DataSet/workshop/testannot/'  # 测试集标签地址moveImage(fileImageDir)extract_name(Image_dir, write_file_name)moveLabel(fileLabelDir, write_file_name)

4.将数据集保存为.pkl格式以及读取.pkl格式文件

import pickle  dict_data = {"name":["张三", "李四"]}with open("dict_data.pkl", 'wb') as fo:     # 将数据写入pkl文件pickle.dump(dict_data, fo)with open("dict_data.pkl", 'rb') as fo:     # 读取pkl文件数据dict_data = pickle.load(fo, encoding='bytes')print(dict_data.keys())    # 测试我们读取的文件
print(dict_data)
print(dict_data["name"])
==============================
结果如下:
dict_keys(['name'])
{'name': ['张三', '李四']}
['张三', '李四']

制作自定义语义分割数据集相关推荐

  1. labelme 语义分割数据集_labelme自定义语义分割数据集 Python文件调用labelme_json_to_da...

    labelme自定义语义分割数据集 Python文件调用labelme_json_to_da labelme自定义语义分割数据集 Python文件调用labelme_json_to_dataset 批 ...

  2. 自定义语义分割数据集(划分训练集与验证集)、并且将一个文件夹下的所有图片的名字存到txt文件

    目录 1.划分训练集.验证集与测试集 2.文件名称保存为txt 3.文件移动 4. 将数据集保存为.pkl格式以及读取.pkl格式文件 我们可以借助Pytorch从文件夹中读取数据集,十分方便,但是P ...

  3. 从图片到dataframe——语义分割数据集制作全流程

    分享一下从原始图片,到标记图片,再到转换为python里的数据结构语义分割数据集制作全流程. 安装labelme labelme 是一个图形界面的图像标注软件,可以很方便地划分出多边形边界. 下面在w ...

  4. 图像分割数据集制作matlab,制作自己的图像语义分割数据集

    本文教你如何正确制作自己的图像语义分割数据集.假设我当前目录下有500张图片,命名从1.jpg开始,一直往上递增,我事先已经调整好了图像的大小. 首先下载Labelme工具:https://githu ...

  5. 快速制作自己的VOC语义分割数据集

    语义分割数据集制作与转换方法 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 第一章 基于PS的语义分割标注 第二章 构建VOC语义分割数据集 文章目录 语义分割数据集制作与转换方法 ...

  6. 自己制作语义分割语义分割数据集

    最近在用deeplab,需要自己标注数据集,整理一下. 制作语义分割数据集大致需要 (1)使用labelme对数据进行标注,生成对应图片的json格式. (2)执行label下的labelme_jso ...

  7. 【语义分割数据集制作】使用labelme制作自己的U-net语义分割数据集

      最近有一个工作需要使用Unet的语义分割结果作为上游任务,语义分割数据集需要自己制作,特此记录一下. 1.下载labelme   第一步当然是下载labelme工具,主要有两种方式:   1. 系 ...

  8. 无人驾驶常用数据集---图像语义分割数据集--Cityscapes数据集的解读(for 小白)

    ** 无人驾驶常用数据集–图像语义分割数据集–Cityscapes数据集的解读(for 小白) ** 一.什么是Cityscapes数据集? Cityscapes是关于城市街道场景的语义理解图片数据集 ...

  9. 语义分割数据集Pascal VOC2012的读取与处理

    语义分割数据集Pascal VOC2012的读取与处理 前言 读取文件路径 数据预处理 自定义数据集类 完整代码 前言 Pascal VOC2012是语义分割的一个重要数据集.学习一下使用Pytorc ...

最新文章

  1. CentOS 7 添加系统开机服务
  2. 多核分布式队列的实现:“偷”与“自私”的运用(4)
  3. pointPolygonTest函数
  4. 经典算法题每日演练——第二十一题 十字链表
  5. 广外计算机考研专业课,【广外考研论坛】 21广外各专业考研问题全解答!纯干货!...
  6. SAP Netweaver和阿里云的战略合作关系
  7. 苹果ios浏览器里面数字被当做电话号码
  8. 删除变量PHP之session的使用
  9. 20120530, BGP3
  10. 七、制作主题(二) Anatomy of a theme
  11. 惊恐的市场洗牌网游市场诞生危机论
  12. keil5——常见报错【cannot load flash device description】
  13. RS232和RS485标准在DB9公/母头上的接线定义
  14. Qt 未找到文件:NMAKE
  15. 51单片机培训计划(新订)
  16. 免流类软件无ROOT开热点教程
  17. PMP-计算题汇总(PV、EV、AC、BAC、EAC、ETC、)
  18. 论坛php 图片上传,Discuz! X3 论坛文件图片上传尺寸:小于2M的修改方法
  19. TensorFlow2.0 Guide官方教程 学习笔记17 -‘Using the SavedModel format‘
  20. 内存优化(一)浅谈内存优化

热门文章

  1. 智能优化算法:白冠鸡优化算法-附代码
  2. 32android好看的样式及demo汇总
  3. LaTex项目符号下建立子项目
  4. 计算机毕业设计(附源码)python英语单词记忆系统
  5. 运维过程中需要记住的英语单词
  6. 关于doc、docx、PPT等文件图标显示与打开不正常的问题
  7. linux防火墙配置80端口,Linux配置防火墙 开启80端口
  8. RC振荡器与有源滤波器1
  9. 为什么你没法对标阿里P8,拿高薪,Java架构师技术进阶路线图
  10. CWE 4.7中的新视图 -- 工业控制系统的安全漏洞类别