Python实现随机划分图片数据集的示例代码

 更新时间:2023年05月21日 15:28:42   作者:风吹落叶花飘荡  
这篇文章主要为大家详细介绍了如何通过Python实现随机将图片与标注文件划分为训练集和测试集,文中的示例代码简洁易懂,感兴趣的小伙伴可以跟随小编一起学习一下

一、前言

前几天需要划分数据集,就写了一个小demo去完成这个任务。

随机划分图片数据集

任务描述:我的所有图片保存在同一个文件夹里,需要随机将图片与标注文件划分为训练集和测试集。

处理过程:读取文件列表,将列表打乱,截取列表一部分

二、实现代码如下

import os
import random
import shutil

def get_imlist(path):
    return [os.path.join(path, f) for f in os.listdir(path) if f.endswith('.jpg')]

def getData(src_path):

    dest_dir = src_path+'val' #划分出来的验证集
    if not os.path.isdir(dest_dir):
        os.mkdir(dest_dir)

    img_list = get_imlist(src_path)
    random.shuffle(img_list)
    le = int(len(img_list) * 0.8)  # 这个可以修改划分比例
    for f in img_list[le:]:
        shutil.move(f, dest_dir)


'''
函数功能:
划分数据集
'''
def SplitImg(filePath):
    getData(filePath)

'''
函数功能:
根据划分的数据集进行移动标注文件
'''
def MoveAn(filePathAn,filePathImg):
    Imgs=os.listdir(filePathImg)
    if not os.path.isdir(filePathAn+'val'):
        os.mkdir(filePathAn+'val')

    for file in os.listdir(filePathAn):
        #print(filePathAn,filePathImg)
        #print(os.path.join(filePathAn,file),os.path.join(filePathAn+'val',file))
        if file[:-4]+'.jpg' in Imgs:

            shutil.move(os.path.join(filePathAn,file),os.path.join(filePathAn+'val',file))

if __name__=='__main__':
    filePath='./宠物/宠物'# 换成你的数据集

    #拆分的数据集
    SplitImg(filePath)
    filePathAn='./宠物/宠物An'# 换成你的标注文件地址

    # 根据数据集进行移动标注文件
    MoveAn(filePathAn,filePath+'val')

三、方法补充

除了以上的方法,小编还为大家整理了其他划分数据集的方法,希望对大家有所帮助

方法一:使用random.sample将数据集随机划分为训练集与验证集并另存在文件夹中,设置随机种子

import os
import random
import shutil
 

def moveFile(input1,input2,save1,save2):
    pathDir = os.listdir(input1)  # 取图片的原始路径
    random.seed(1)
    filenumber = len(pathDir)  # 原文件个数
    rate = 0.1  # 抽取的验证集的比例,占总数据的多少
    picknumber = int(filenumber * rate)  # 按照rate比例从文件夹中取一定数量图片
    sample = random.sample(pathDir, picknumber)  # 随机选取需要数量的样本图片
    print(sample)
    list_len=len(sample)
    print(list_len)
    list=[]
    for i in range(len(sample)):
        list.append(sample[i].split('.')[0])
    print(list)
    for flie_name in list:
        path_img=os.path.join(input1,flie_name+'.jpg')
        shutil.move(path_img,save1)
        path_lab=os.path.join(input2,flie_name+'.txt')
        shutil.move(path_lab,save2)
 
if __name__ == '__main__':
    input_path1='./train1200/images/train'
    input_path2= './train1200/labels/train'
    save_img='./train1200/images/val'
    save_lab='./train1200/labels/val'
    if not os.path.exists(save_lab):
        os.makedirs(save_lab)
    if not os.path.exists(save_img):
        os.makedirs(save_img)
    moveFile(input_path1,input_path2,save_img,save_lab)

方法二:通过train test_splt函数实现随机划分数据

Python中,随机划分数据集可以通过train test_splt函数实现。该函数可以将数据集随机分成训练集和测试集,用于机器学习中的数据训练和测试。

函数的基本用法如下:

from sklearn.model_selection import train_test_split

#X是所有的样本特征,y是目标变量,test_size是测试集占总样本数的比例
# random_state是随机数发生器的种子,保证每次划分结果一致
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0,3, random_state=42)

其中,X是所有的样本特征,是目标变量,test_size是测试集占总样本数的比例。random_state用于设置随机数发生器的种子,以保i每次划分结果一致。函数会返回4个数组: X_train、X_test、y_train,y_test,分别代表训练集的特征、测试集的特征、训练集的目标变量和测试集的目标变量

方法三:将一个数据集按比例随机分割成训练集、验证集、测试集

import random

def split(fname, train_ratio, var_ratio):
    lines = fname.readlines()
    n_total = len(lines)          # 获取数据集的总长度

    train_offset = int(n_total * train_ratio)
    val_offset = int(n_total * (train_ratio + var_ratio))
    random.shuffle(fname.read())  # 按行打乱顺序

    train_data = open('train.txt.bio', 'wb')
    val_data = open('val.txt.bio', 'wb')
    test_data = open('test.txt.bio', 'wb')


    for i, line in enumerate(lines):
        if i < train_offset:
            train_data.write(line)
        elif i < val_offset:
            val_data.write(line)
        else:
            test_data.write(line)

    train_data.close()
    val_data.close()
    test_data.close()


if __name__ == "__main__":
   fname = open('en/en_total.txt.bio', "rb")
   split(fname, train_ratio = 0.6, var_ratio = 0.2)
   fname.close()

到此这篇关于Python实现随机划分图片数据集的示例代码的文章就介绍到这了,更多相关Python随机划分数据集内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 三个Python自动化办公好用到爆的模块分享

    三个Python自动化办公好用到爆的模块分享

    本文小编来给大家推荐几个在自动化办公领域当中非常好用的Python模块,可以帮助大家在工作当中及大地提高效率,避免重复机械化地操作流程
    2022-07-07
  • Python异步发送日志到远程服务器详情

    Python异步发送日志到远程服务器详情

    这篇文章主要介绍了Python异步发送日志到远程服务器详情,文章通过简单输出到cmd和文件中的代码展开详情,需要的朋友可以参考一下
    2022-07-07
  • Python使用OpenCV对图像进行缩放功能

    Python使用OpenCV对图像进行缩放功能

    这篇文章主要介绍了Python使用OpenCV对图像进行缩放功能,文中给大家提到了两种调用方式及OpenCV中pryUp和pryDown的用法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-03-03
  • Python常用工具类之adbtool示例代码

    Python常用工具类之adbtool示例代码

    本文主要介绍了Python中常用工具类之adb命令的使用,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • PyQt5 QTreeWidget 树形结构递归遍历当前所有节点的实现

    PyQt5 QTreeWidget 树形结构递归遍历当前所有节点的实现

    Qt中实现树形结构可以使用QTreeWidget类,也可以使用QTreeView类,本文主要介绍了PyQt5 QTreeWidget 树形结构递归遍历当前所有节点的实现,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • python如何为被装饰的函数保留元数据

    python如何为被装饰的函数保留元数据

    这篇文章主要为大家详细介绍了python如何为被装饰的函数保留元数据,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-03-03
  • Python实现生成多种有规律的数字序列

    Python实现生成多种有规律的数字序列

    在 Python 编程中,生成数字序列是一项常见且重要的任务,本文将深入探讨如何使用Python中的内置函数、列表推导式、生成器等方式来生成多种有规律的数字序列,需要的可以参考下
    2024-03-03
  • django静态文件加载的方法

    django静态文件加载的方法

    本篇文章主要介绍了django静态文件加载的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-05-05
  • Python Django ORM与模型详解

    Python Django ORM与模型详解

    这篇文章主要介绍了django的ORM与模型的实现原理,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧v
    2021-11-11
  • Python中如何创建和运行异步任务详解

    Python中如何创建和运行异步任务详解

    这篇文章主要为大家介绍了Python中如何创建和运行异步任务详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03

最新评论