CV | 计算机视觉中数据集的txt,csv数据预处理代码及实例

news2024/11/14 15:45:36

本文使用同一个数据集进行数据预处理练习,其中包含了人脸图片文件夹,CSV文件,txt文件。

数据集主要是针对于人脸照片进行年龄以及性别的预测,在导入模型签的一些简单的数据处理。

1.对人脸图片文件夹,txt文件的操作

1.1.数据集格式

├── faces
       ├── 00000A02.jpg
       ├── 00002A02.jpg
       ├── 00004A02.jpg
       ├── 00006A02.jpg
       ├── ......
 ├── face_gender_label.txt 

- 在txt文件中,对每个jpg文件,都标注了文件类别:0 ,1。

 其中第一列就是对应文件的名字第二列就是该文件所属的类别

然后,还给出了不同类别对应的分类的具体名称:0 为女性 ,1为男性。

目的就是实现将女性男性分别建立文件夹,根据标签进行分类至不同文件夹,并保存照片。

想实现的效果如下:

├── Female
       ├── 00000A02.jpg
       ├── 00002A02.jpg
       ├── 00004A02.jpg
       ├── 00006A02.jpg
       ├── ......
├── Male
       ├── 07974A11.jpg 
       ├── 07976A12.jpg
       ├── 07978A12.jpg
       ├── 07980A12.jpg
       ├── ......

1.2.提取txt文件中的标签,按照标签类型保存人脸图片的代码实现。

(如果是修改为自己的数据集的话,只需要修改读取的路径,以及txt文件路径及名称)

import os
import shutil

label_file = open("D:\\Pro\stfa1227\\STFA\\face_gender_label.txt", 'r')

input_path = "D:\\Pro\stfa1227\\STFA\data_set\\face_data\\faces_JinChungChen"

output_path = "D:\\Pro\stfa1227\\STFA\data_set\\faces_split"

lables=["Male","Female"]

data = label_file.readlines()
i = 1
for line in data:

    str1 = line.split(" ")
    file_name = str1[0]
    file_label = str1[1].strip() 

    old_file_path = os.path.join(input_path, file_name)

    new_file_path = ""

    if "0" in file_label:
        new_file_path = os.path.join(output_path, lables[int(file_label) - 1])

    elif "1" in file_label:
        new_file_path = os.path.join(output_path, lables[int(file_label) - 1])
    if not os.path.exists(new_file_path):
        print("Path " + new_file_path + " not existed,creat new one......")
        os.makedirs(new_file_path)


    new_file_path = os.path.join(new_file_path, file_name)
    print("" + str(i) + "\tcopy file : " + old_file_path + " to " + new_file_path)
 
    shutil.copyfile(old_file_path, new_file_path)

    i = i + 1

print("Data Processing Done")

str1[1]和str1[1].strip()的区别

strip: 用来去除头尾字符、空白符(包括\n、\r、\t、' ',即:换行、回车、制表符、空格)

结果

 1.2.根据上面提取的文件,按照比例划分为训练集和测试集

(如果是修改为自己的数据集的话,只需要修改读取的路径)

代码

import os
from shutil import copy, rmtree
import random


def mk_file(file_path: str):
    if os.path.exists(file_path):

        rmtree(file_path)
    os.makedirs(file_path)


def main():

    random.seed(0)

    split_rate = 0.1

    
    cwd = os.getcwd()
    data_root = os.path.join(cwd, "data_set/face_data")
    origin_photos_path = os.path.join(data_root, "faces_split")
    assert os.path.exists(origin_photos_path), "path '{}' does not exist.".format(origin_photos_path)

    photo_class = [cla for cla in os.listdir(origin_photos_path)
                    if os.path.isdir(os.path.join(origin_photos_path, cla))]

    train_root = os.path.join(data_root, "train")
    mk_file(train_root)
    for cla in photo_class:
    
        mk_file(os.path.join(train_root, cla))

    val_root = os.path.join(data_root, "val")
    mk_file(val_root)
    for cla in photo_class:
    
        mk_file(os.path.join(val_root, cla))

    for cla in photo_class:
        cla_path = os.path.join(origin_photos_path, cla)
        images = os.listdir(cla_path)
        num = len(images)

        eval_index = random.sample(images, k=int(num*split_rate))
        for index, image in enumerate(images):
            if image in eval_index:
                
                image_path = os.path.join(cla_path, image)
                new_path = os.path.join(val_root, cla)
                copy(image_path, new_path)
            else:
                
                image_path = os.path.join(cla_path, image)
                new_path = os.path.join(train_root, cla)
                copy(image_path, new_path)
            print("\r[{}] processing [{}/{}]".format(cla, index+1, num), end="")  # processing bar
        print()

    print("processing done!")


if __name__ == '__main__':
    main()

结果

 (为了看的方便,我把刚才的faces_split文件夹名修改为faces_gender_photos)

 

 原本的照片不变,只是重新划分了训练集和验证集,以此方便深度网络模型去训练!

2.对人脸图片文件夹,CSV文件的操作

(python深度学习图像处理CSV文件分类标签图片到各个文件夹)

2.1.数据集格式

├── faces
       ├── 00000A02.jpg
       ├── 00002A02.jpg
       ├── 00004A02.jpg
       ├── 00006A02.jpg
       ├── ......
 ├── faces.csv

faces.csv文件详情

 

 
import pandas as pd
import os
import shutil  
 
# 读取表格文件+填写你的csv文件的位置
f = open(r"D:\\Pro\\stfa1227\\STFA\\data_set\\face_data\\train_age_JCC.csv", "rb") 
list = pd.read_csv(f)
 
# 进行分类----填写你要分类文件夹的标签,有多少就写多少
for i in ['age','gender']:
    if not os.path.exists(i):
        os.mkdir(i)
    listnew = list[list["age"] == i]#type是你csv文件里面的你要处理的那一列的列名称
    l = listnew["id"].tolist()#image这里是你的处理文件的名字的列名称
    j = str(i)
    for each in l:
        #这里是你数据文件放置的位置
        shutil.copy('D:\\Pro\\stfa1227\\STFA\\data_set\\csv_datapro\\' + each, j)

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

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

相关文章

详解 Redis 中的 RDB 快照

内存快照。所谓内存快照,就是指内存中的数据在某一个时刻的状态记录。这就类似于照片,当你给朋友拍照时,一张照片就能把朋友一瞬间的形象完全记下来。 对 Redis 来说,它实现类似照片记录效果的方式,就是把某一时刻的状…

1D/2D动画混合

1、动画混合 游戏动画中常见的功能就是在两个或者多个相似运动之间进行混合,比如: 根据角色的速度来混合行走和奔跑动画根据角色的转向来混合向左或向右倾斜的动作 可以理解是高级版的动画过渡,之前的动画过渡是处理两个不同类型动作之间切…

【ROS】—— ROS通信机制——参数服务器(四)

文章目录前言1. 参数服务器理论模型2. 参数操作(C)2.1 增加参数2.2 参数修改2.3 参数的获取2.3.1 ros::NodeHandle2.3.2 ros::param2.4 参数的删除3. 参数操作(python)3.1 增加参数与修改参数3.2 获取参数3.3 删除参数前言 📢本系列将依托赵虚左老师的ROS课程&#…

九联UNT403G/UNT413G_国科GK6323芯片_5621ds无线wifi_免拆卡刷固件

九联UNT403G/UNT413G_国科GK6323芯片_5621ds无线wifi_免拆卡刷固件。 固件特点: 1、修改dns,三网通用; 2、开放原厂固件屏蔽的市场安装和u盘安装apk; 3、无开机广告,无系统更新,不在被强制升…

判断成绩-C语言实现

任务描述 本关任务:判定学生成绩。 相关知识 if-else 分支语句基本用法 C 语言提供了 if-else 分支语句用于实现程序的选择结构。 基本格式如下: if ( 表达式 ) 语句A else 语句B 基本流程图如下: 图1 if-else 分支语句流程图 从上面的…

单相全桥逆变原理及仿真实验

前言 一、单相全桥逆变器组成原理 1.全桥逆变电路拓扑结构 2.单相逆变器的SPWM调制方式 二、单相全桥逆变器仿真 1.SPWM调制波仿真 2.全桥逆变仿真 三、SPWM单片机程序实现 1.CubeMX配置 2.SPWM正弦表数据生成 3.Keil5代码 4.protues仿真观测波形 前言 通常把直流电变成…

力扣 # 1323. 6 和 9 组成的最大数字 JAVA实现

力扣 1323. 6 和 9 组成的最大数字 给你一个仅由数字 6 和 9 组成的正整数 num。 你最多只能翻转一位数字,将 6 变成 9,或者把 9 变成 6 。 请返回你可以得到的最大数字。 难度:简单 示例 1: 输入:num 9669 输出&a…

基于采样的规划算法之动态规划方法

经过前面对RRT的介绍,我们发现基于采样的规划算法与基于图搜索的规划算法都是通过对路径树进行拓展新节点,来找到起点到终点的路径解。RRT家族通过随机采样来生成这棵路径树,随机采样会面临采样低效的问题——大部分采样的新节点都无益于提升路径解的最优性。动态规划基于特…

JS对数组的操作详解

目录 shift 方法 unshift 方法 reverse方法 sort方法 reduce方法 concat方法 join方法 push方法 pop方法 slice方法 splice方法 forEach方法 map方法 filter方法 every方法 some方法 indexOf方法 find方法 includes方法 在这里总结一下JS的数组方法&#xf…

JDBC基本使用

文章目录一、JDBC技术1.1、JDBC概念1.2、JDBC作用1.3、JDBC工作原理1.4、JDBC工作流程二、使用JDBC访问数据库2.1、创建Maven项目2.2、添加数据库依赖2.2.1、mysql依赖2.2.2、oracle依赖2.3、编写代码2.3.1、加载驱动2.3.2、通过DriverManager获取connection连接2.3.3、执行SQL…

java中线程安全问题及解决方法、线程状态、线程间通信(线程等待唤醒机制)

线程安全 概述: 多线程访问了共享数据,此时会产生冲突(如:在多个线程中执行售卖货物的业务,要求是某个货被某个线程售卖后,其他线程应该不再可以售卖此个货,但是默认被某个线程售卖后&#xf…

JVM 教程

jvm教程jvm概述前言JVM 定义JVM 的作用查看自己的 JVMJVM,JRE 和 JDK 联系小结JVM 整体架构目标JVM 整体架构类加载子系统运行时数据区执行引擎小结JVM 常用参数配置IntelliJ IDEA 添加运行参数JVM 参数:跟踪垃圾回收JVM 参数:跟踪类的加载与…

手把手代码实现五级流水线CPU——第二篇:分支预测流水线

系列文章目录 第三篇:流水线控制逻辑 第一篇:初级顺序流水线 文章目录系列文章目录一、流水线硬件结构二、流水线各阶段的实现实现原理一、流水线硬件结构 取指阶段 PC增加器:用来计算下一条指令的地址valP 译码阶段 一次译码操作读出俩个寄…

学习vue的准备工作

一、前提: 1、vscode安装: https://blog.csdn.net/m0_55400356/article/details/1260267332、node.js安装: 已安装 16.0 或更高版本的 Node.js; https://www.runoob.com/nodejs/nodejs-install-setup.html3、安装vue&#xff…

hadoop之ranger权限配置(二)

文章目录一、编译ranger(node12)二、安装前环境准备(node12)三、安装RangerAdmin(node12)(root)五、Ranger Hive-plugin(node10)六、Ranger Hdfs-plugin(node10、11&…

ansible远程控制及其相关操作

1.控制主机和受控主机通过root用户通过免密验证方式远程控住受控主机实施对应(普通命令,特权命令)任务(以下所有结果均见截图) (1)控住主机--server通过主机名匹配对应连接的受控主机 [rootserver ~]#vim /etc/hosts …

一本通 1267:【例9.11】01背包问题(详细代码+严谨思路+清晰图片)

经典01背包问题 这里给你3种方法 目录 DFS 思路: 代码: DFS记忆化 思路: 代码: 动态规划 思路: 代码: DFS 时间复杂度 :O(2^n) 思路: DFS求出所有选法,再用…

Git Stash、Git Merge、Git Rebase、Git Revert

GIT 日常使用总结git stashgit mergegit rebase将多个commit合并成一个commitgit revert撤销修改撤销commit 但是不撤销add 的内容撤销addGIT Rebase 补充说明:git stash git stash:将修改后的代码存储到本地的一个栈结构,将工作区和暂存区恢…

37-Vue之ECharts高级-交互API

交互API前言全局ECharts对象echartsInstance对象前言 本篇来学习下ECharts中交互API的使用 全局ECharts对象 全局 echarts 对象是引入 echarts.js 文件之后就可以直接使用的 init :初始化ECharts实例对象,使用主题 registerTheme:注册主题…

Avatar和虚拟场景如何影响用户VR社交行为

对于VR社交来讲,虚拟场景(社交环境)、Avatar(虚拟化身)是两个重要的元素,一个代表了人们在VR中互动的空间,而另一个则代表他们在这个空间中所扮演的角色。现阶段,Avatar有多种形态&a…