欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

荐 python实用的几个脚本程序(自己在用)

程序员文章站 2022-11-01 21:26:57
文章目录一、简介二、 重点1. 数据集划分训练集与测试集1.1 数据集为视频帧文件夹(文件夹划分)1.2 数据集为视频文件(文件划分)2. label的重建2.1 原label读取2.2 新label的建立一、简介本文主要是自己近期在做毕业设计(连续手语识别)时候写的几个python脚本,用于处理数据集的。记录一下。二、 重点本文撰写采用Windows操作系统,如果是Linux记得修改字符串分割方式及目录层数多加一层。1. 数据集划分训练集与测试集1.1 数据集为视频帧文件夹(文件夹划分)tr...

一、简介

本文主要是自己近期在做毕业设计(连续手语识别)时候写的几个python脚本,用于处理数据集的。记录一下。

二、 重点

本文撰写采用Windows操作系统,如果是Linux记得修改字符串分割方式及目录层数多加一层

1. 数据集划分训练集与测试集

1.1 数据集为视频帧文件夹(文件夹划分)

trainNum 参数是划分训练集的视频数,即文件夹数,我的划分是9:1,总数是250个视频,那这里就写225。
dirLongNum 参数为你当前原数据集最深的目录层数
举个例子:
F:\data 是我视频帧数据集
荐
                                                        python实用的几个脚本程序(自己在用)
000020是我的一个视频类,里面的事每个视频抽帧后的文件夹,要截止到最后一个文件夹
荐
                                                        python实用的几个脚本程序(自己在用)

def splitTrainAndTestOnDir(rootFileDir, dstDir, trainNum, dirLongNum): # dirLongNum目录结构最长多少
    root_dir = os.walk(rootFileDir)
    # 训练集、测试集的路径,脚本测试用
    # root_train_dir = "F:/pytest/datat/train/"
    root_train_dir = dstDir + "/train/"
    # root_test_dir = "F:/pytest/datat/test/"
    root_test_dir = dstDir + "/test/"
    # 记录训练集个数
    trainFileCount = 0
    # 记录当前某类文件夹名
    lastFileDirName = ""

    # 开始遍历
    for root, dirs, files in root_dir:
        # 组合目录名
        nameFile = os.path.join(root)
        # 拆分成数组 注意修改
        nameArr = nameFile.split("\\")
        # 判定,根据文件夹目录关系:F:\newdata2\000000\P01_s1_00_0_color,判定 类 目录是否更换,即是否到了新的一类,如果到了,清零计数
        if lastFileDirName != str(nameArr[-2]):
            trainFileCount = 0
            # 重新赋值
            lastFileDirName = str(nameArr[-2])
        print(nameArr)
        # 训练集的数量
        if trainFileCount < trainNum:
            # 移动一次,加一
            trainFileCount = trainFileCount + 1
            # 定义训练集路径
            dstTrainPath = root_train_dir + str(nameArr[-2]) + "/" + str(nameArr[-1])
            # 由于遍历时候只需要带有类别和类别内的文件夹两层,根据当前路径得到了len(nameArr)==5时候是拆分后的全路径,然后进行文件夹复制,即将000000\某一个文件夹移动到新的目录下
            if len(nameArr) == dirLongNum:
                shutil.copytree(nameFile, dstTrainPath)
        else:
            # 类似于train,将类内剩余部分划分为测试集
            dstTestPath = root_test_dir + str(nameArr[-2]) + "/" + str(nameArr[-1])
            shutil.copytree(nameFile, dstTestPath)

不明白的部分可以保留住print(nameArr),后面的注释看一下

1.2 数据集为视频文件(文件划分)

这次是记录文件数

def splitTrainAndTest(rootFileDir, dstDir, trainNum): #, trainDir, testDir
    root_dir = os.walk(rootFileDir)
    # root_train_dir = "F:/pytest/datat/train/"
    root_train_dir = dstDir + "/train/"
    # root_test_dir = "F:/pytest/datat/test/"
    root_test_dir = dstDir + "/test/"
    trainFileCount = 0
    lastFileDirName = ""
    for root, dirs, files in root_dir:
        for f in files:
            nameFile = os.path.join(root, f)
            print(nameFile)
            nameArr = nameFile.split("\\")
            if lastFileDirName != str(nameArr[-2]):
                trainFileCount = 0
                lastFileDirName = str(nameArr[-2])
            print(nameArr)
            if trainFileCount < trainNum:
                trainFileCount = trainFileCount + 1
                dstTrainPath = root_train_dir + str(nameArr[-2]) + "/" + str(nameArr[-1])
                creatDir(root_train_dir + str(nameArr[-2]))
                print(dstTrainPath)
                shutil.copy(nameFile, dstTrainPath)
            else:
                dstTestPath = root_test_dir + str(nameArr[-2]) + "/" + str(nameArr[-1])
                creatDir(root_test_dir + str(nameArr[-2]))
                shutil.copy(nameFile, dstTestPath)

2. label的重建

由于提供的数据集label不能直接使用,有所变化,转化成tsn的输入形式。这里学习着写了一下文件的读取与生成,思路来自于LeetCode的一到题,没事多刷刷算法能给自己提供更多的思路方法。

2.1 原label读取

采用字典去存取,因为后边会需要,一个类有多个视频,我得通过类文件夹去更新label,而不是计数的形式

def getLabelDict(labelFile):
    f = codecs.open(labelFile, mode='r', encoding='utf-8')  # 打开txt文件,以‘utf-8’编码读取
    line = f.readline()  # 以行的形式进行读取文件
    list1 = []
    dict1 = {}
    while line:
        print(line)
        a = line.split()
        b = a[0:1]   # 这是选取需要读取的位数
        c = a[1:2]
        dict1[str(b[0])] = str(c[0])
        list1.append(b)  # 将其添加在列表之中
        line = f.readline()
    f.close()
    return dict1

2.2 新label的建立

其中len(nameArr)的长度根据实际情况判定,这个只读取到类文件夹下的视频帧文件夹长度即可,满足长度的打标签,否则从root层就开始打label。

def listfiles(rootDir,txtfile,dict1):
    ftxtfile = open(txtfile, 'w', encoding='utf-8')
    list_dirs = os.walk(rootDir)
    count = 0
    fixNum = []
    for root, dirs, files in list_dirs:
        for f in files:
            nameFile = os.path.join(root, f)
            fixNum.append(nameFile)
        name = os.path.join(root)
        # print(os.path.join(root))
        # print(os.path.join(root,f))
        nameArr = name.split("\\")
        print(nameArr)
        label = ""
        try:
            # print(dict1[str(nameArr[4])])
            if len(nameArr) == 4 :
                # label = str(dict1[str(nameArr[4])])
                # print(label)
                txtString = os.path.join(root) + ' ' + str(len(fixNum)) + ' ' + str(dict1[str(nameArr[2])]) + '\n'
                print(txtString)
                ftxtfile.write(txtString)
        except:
            label = '1'
        fixNum = []
        count = count + 1
    #print rootDir+"has"+str(count)+"files"
    print( rootDir+"has "+str(count)+" files" )

本文地址:https://blog.csdn.net/qq_42009978/article/details/106117002