使用Python整理数据集,规范化数据

2024-08-24 07:58

本文主要是介绍使用Python整理数据集,规范化数据,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

写在前面的话:经过大量的采图实验,数据散落各处,设备也调整过,标定参数之类的也都不一致,以前整理数据都是用的C/C++傻乎乎地system(“cp str str”)虽然知道shell更简单,但是毕竟懒,现在发现PY真是一把利器。

1.0按照指定的文件路径组织文件

已知部分(多数数据)数据目录结构如下:
目录结构
用下面的方式整理实验数据,写完这个也可以当是PY学习的小例子:

import os
import shutildirroot = "O:\\380A"
dir1 = [d for d in os.listdir(dirroot) if os.path.isdir(os.path.join(dirroot, d))]
dir1 = [os.path.join(dirroot, d) for d in dir1]
dir1 = [os.path.join(d, "1") for d in dir1]
dirs = []
for d in dir1:dirs.extend( os.path.join(d, dd) for dd in os.listdir(d))
dirtmp = dirs.copy()
dirs.clear()
for d in dirtmp:dirs.extend(os.path.join(d, dd) for dd in os.listdir(d))tardir = "O:\\chengdudongdataset\\380Adata"
calibdir = "O:\\chengdudongdataset\\calib\\chengdudongIU20181122bd"
cooresponding = []
error_s = []
for index, d in enumerate(dirs):if not os.path.isdir(d):continuedir_d = os.path.join(tardir, ("%05d" % index))os.mkdir(dir_d)##vector<string> robot1{ "1-r.jpg","1-t.jpg","2-r.jpg", "2-t.jpg","1-g.jpg", "2-g.jpg","2d.jpg"};#vector<string> robot2{ "3-r.jpg","3-t.jpg","4-r.jpg", "4-t.jpg","3-g.jpg", "4-g.jpg","2d.jpg"};robot1_b = os.path.exists(os.path.join(d, "1-r.jpg"))robot2_b = os.path.exists(os.path.join(d, "3-r.jpg"))try:# FileNotFoundError: [Errno 2] No such file or directory: '# O:\\380A\\20190311-081911 (CRH380A-2867(B)) {10560529268737}# \\1\\1\\01.04.15.23.1-2\\1-t.jpg'if robot1_b:shutil.copyfile(os.path.join(d, "1-r.jpg"), os.path.join(dir_d, "img2r.jpg"))shutil.copyfile(os.path.join(d, "1-t.jpg"), os.path.join(dir_d, "img2t.jpg"))shutil.copyfile(os.path.join(d, "1-g.jpg"), os.path.join(dir_d, "img2g.jpg"))shutil.copyfile(os.path.join(d, "2-r.jpg"), os.path.join(dir_d, "img1r.jpg"))shutil.copyfile(os.path.join(d, "2-t.jpg"), os.path.join(dir_d, "img1t.jpg"))shutil.copyfile(os.path.join(d, "2-g.jpg"), os.path.join(dir_d, "img1g.jpg"))shutil.copyfile(os.path.join(d, "2d.jpg"), os.path.join(dir_d, "imgcom.jpg"))shutil.copyfile(os.path.join(calibdir, "para_stero_1_2.xml"), os.path.join(dir_d, "para_stereo.xml"))shutil.copyfile(os.path.join(calibdir, "para1.xml"), os.path.join(dir_d, "cam1.xml"))shutil.copyfile(os.path.join(calibdir, "para2.xml"), os.path.join(dir_d, "cam2.xml"))elif robot2_b:shutil.copyfile(os.path.join(d, "3-r.jpg"), os.path.join(dir_d, "img2r.jpg"))shutil.copyfile(os.path.join(d, "3-t.jpg"), os.path.join(dir_d, "img2t.jpg"))shutil.copyfile(os.path.join(d, "3-g.jpg"), os.path.join(dir_d, "img2g.jpg"))shutil.copyfile(os.path.join(d, "4-r.jpg"), os.path.join(dir_d, "img1r.jpg"))shutil.copyfile(os.path.join(d, "4-t.jpg"), os.path.join(dir_d, "img1t.jpg"))shutil.copyfile(os.path.join(d, "4-g.jpg"), os.path.join(dir_d, "img1g.jpg"))shutil.copyfile(os.path.join(d, "2d.jpg"), os.path.join(dir_d, "imgcom.jpg"))shutil.copyfile(os.path.join(calibdir, "para_stero_3_4.xml"), os.path.join(dir_d, "para_stereo.xml"))shutil.copyfile(os.path.join(calibdir, "para3.xml"), os.path.join(dir_d, "cam1.xml"))shutil.copyfile(os.path.join(calibdir, "para4.xml"), os.path.join(dir_d, "cam2.xml"))else:passcoor = (("%05d" % index)+'\t'+d+'\n')cooresponding.append(coor)except:coor = (("%05d" % index)+'\t'+d+'\n')error_s.append(coor)
cooresponding[-1] = cooresponding[-1][:-1]with open(os.path.join(tardir, "cooresponding.txt"), 'w') as file_obj:for coor in cooresponding:file_obj.write(coor)if len(error_s):error_s[-1] = error_s[-1][:-1]with open(os.path.join(tardir, "error_s.txt"), 'w') as file_error_obj:for coor in error_s:file_error_obj.write(coor)

整理完就是:
整理后

2.0 制作简单GUI工具筛选数据。使用tkinter

先设计一个大概的应用界面:
GUI设计
这是最终完成的样子:
最终设计结果
Code如下:通过这个例子就可以基本摸清楚tkinter的套路了,和HTML,Android XML这些常见GUI很类似
纠正:做标记时候建议用:1、2、4、8、来做标记,因为这样方便位运算。我用了1/2/3来做标记也可以用,但是不建议这样做

# -*- coding: utf-8 -*-
"""
Created on Wed Jul 17 16:57:48 2019@author: frank
"""
import os
import tkinter as tk
from PIL import Image, ImageTk
window = tk.Tk()
window.title('西南交大光电工程研究所数据分类工具_ClassifyTo3 - - - Quasimo')
window.geometry('1000x730')# 撤销操作的标记,这个标记用于记录上一次的按键操作是啥,所有的操作会被记录进optList,
# optList的标记分别对应dirs的每个目录的数据是什么# 各个标记的定义
TRAIN_CLASS = 1
NOT_WELL_CLASS = 2
TOO_MUCH_NOISE = 3
SPECIAL_PART = 8
# 当前图像的标记
optAndMark = 0dirs = []global dirRoot
dirRoot = r'D:\chengdudongdataset\stereodata'
with open(os.path.join(dirRoot, "dirList_windows.txt"), 'r') as file_obj:dirs = file_obj.readlines()
for idx, d in enumerate(dirs):dirs[idx] = dirs[idx].rstrip()trainDirList = []
notVeryWell = []
tooMuchNoise = []
specialPart = []
global optMarks, isWheelFlag
optMarks = ['0']*len(dirs)
isWheelFlag = Falseglobal indexOfDirs
indexOfDirs = 0
global dispImg
global img_show
pathBingLookVar = tk.StringVar()
pathBingLookVar.set('this is path')if os.path.exists(os.path.join(dirRoot, "optMarks.txt")):with open(os.path.join(dirRoot, "optMarks.txt"), 'r') as file_obj:optMarks = file_obj.readlines()for idx, d in enumerate(optMarks):optMarks[idx] = optMarks[idx].rstrip()
indexOfDirs = optMarks.index('0')def openImgAndShow():bkgimg = Image.open(os.path.join(dirs[indexOfDirs], 'dispRainbowBlack.png'))pathBingLookVar.set(dirs[indexOfDirs])global dispImgdispImg = ImageTk.PhotoImage(bkgimg)global img_showimg_show.configure(image=dispImg)progressbarVar.set(str(indexOfDirs) +' / ' + str(len(dirs)))#canvas = tk.Canvas(frame2, bg='green', height=540, width=960)#image = canvas.create_image(0, 0, anchor='NW',image=image_file) def saveBtFun():#保存当前进度global dirRootglobal optMarkswith open(os.path.join(dirRoot, "optMarks.txt"), 'w') as file_obj:for recor in optMarks:file_obj.writelines(recor+"\n")returndef revocationBtFun():#撤销一步global indexOfDirsindexOfDirs -= 1global optMarks,isWheelFlagoptMarks[indexOfDirs] = str(0)isWheelFlag = FalseopenImgAndShow()returndef wheelSurfBtFun():# 标记这是 : 车轮踏面global isWheelFlagisWheelFlag = SPECIAL_PARTreturndef tooMuchNoiseBtFun():# 标记这个 : 太多噪声global indexOfDirs,dirsglobal optMarks,isWheelFlagoptMarks[indexOfDirs] = str(TOO_MUCH_NOISE | isWheelFlag)isWheelFlag = FalseindexOfDirs += 1if indexOfDirs == len(dirs):saveBtFun()exit()openImgAndShow()returndef notVeryWellBtFun():# 标记这个 : 不是很好global indexOfDirsglobal optMarks,isWheelFlagoptMarks[indexOfDirs] = str(NOT_WELL_CLASS | isWheelFlag)isWheelFlag = FalseindexOfDirs += 1if indexOfDirs == len(dirs):saveBtFun()exit()openImgAndShow()return
global switchFlag
switchFlag = True
def switchPic():# 查看一下实际图,global switchFlagglobal img_showglobal dispImgif switchFlag:bkgimg = Image.open(os.path.join(dirs[indexOfDirs], 'img1tCV8UC3.png'))dispImg = ImageTk.PhotoImage(bkgimg)img_show.configure(image=dispImg)switchFlag = not switchFlagelse:bkgimg = Image.open(os.path.join(dirs[indexOfDirs], 'dispRainbowBlack.png'))dispImg = ImageTk.PhotoImage(bkgimg)img_show.configure(image=dispImg)switchFlag = not switchFlagreturn
def trainDataBtFun():# 标记这个 : 数据可用global indexOfDirsglobal optMarks,isWheelFlagoptMarks[indexOfDirs] = str(TRAIN_CLASS | isWheelFlag)isWheelFlag = FalseindexOfDirs += 1if indexOfDirs == len(dirs):saveBtFun()exit()openImgAndShow()returnframe = window
frame1 = tk.Frame(master=frame, bg='#000fff000', borderwidth=10)
frame2 = tk.Frame(master=frame, borderwidth=10)
frame3 = tk.Frame(master=frame, bg='red', borderwidth=10)
frame4 = tk.Frame(master=frame, borderwidth=10)#progressbar = tk.Scale(window)#不用canvas了pathBingLook = tk.Label(master=frame1,font=('Arial', 12), width =35, textvariable = pathBingLookVar).pack(side='left', fill='x',expand='yes')
progressbarVar = tk.StringVar()
progressbarVar.set('step / Num');
progressbar = tk.Label(master=frame1, bg='red', font=('Arial', 12), width =15, textvariable = progressbarVar).pack(side='left')
frame1.pack(side='top', fill='both',expand='NO')bkgimg = Image.open(os.path.join(dirs[indexOfDirs], 'dispRainbowBlack.png'))
global dispImg
dispImg = ImageTk.PhotoImage(bkgimg) 
img_show = tk.Label(master=frame2, image = dispImg,height=540,width=960)
img_show.pack()
#canvas = tk.Canvas(frame2, bg='green', height=540, width=960)
#image = canvas.create_image(0, 0, anchor='NW',image=image_file) 
frame2.pack(side='top', fill='both')saveBt = tk.Button(frame3, text = '保存进度',font=('宋体', 17), command=saveBtFun).pack( side='left', anchor='center', expand='YES')
lookLook = tk.Button(frame3, text = 'LookLook',font=('宋体', 17), command=switchPic).pack( side='left', anchor='center', expand='YES')
revocationBt = tk.Button(frame3, text = '撤销一步',font=('宋体', 17), command=revocationBtFun).pack( side='left', anchor='center', expand='YES')
wheelSurfBt = tk.Button(frame3, text = '车轮踏面',font=('宋体', 17), command=wheelSurfBtFun).pack( side='left', anchor='center', expand='YES')
frame3.pack(side='top', fill='both',expand='NO')tooMuchNoiseBt = tk.Button(frame4, text = '不能用',font=('宋体', 17), command=tooMuchNoiseBtFun).pack(side='left', anchor='center', expand='YES')
notVeryWellBt = tk.Button(frame4, text = '还可以',font=('宋体', 17), command=notVeryWellBtFun).pack(side='left', anchor='center', expand='YES')
trainDataBt = tk.Button(frame4, text = '可以用',font=('宋体', 17), command=trainDataBtFun).pack(side='left', anchor='center', expand='YES')
frame4.pack(side='top', fill='both',expand='NO')window.mainloop()

这篇关于使用Python整理数据集,规范化数据的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1101895

相关文章

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

关于数据埋点,你需要了解这些基本知识

产品汪每天都在和数据打交道,你知道数据来自哪里吗? 移动app端内的用户行为数据大多来自埋点,了解一些埋点知识,能和数据分析师、技术侃大山,参与到前期的数据采集,更重要是让最终的埋点数据能为我所用,否则可怜巴巴等上几个月是常有的事。   埋点类型 根据埋点方式,可以区分为: 手动埋点半自动埋点全自动埋点 秉承“任何事物都有两面性”的道理:自动程度高的,能解决通用统计,便于统一化管理,但个性化定

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

python: 多模块(.py)中全局变量的导入

文章目录 global关键字可变类型和不可变类型数据的内存地址单模块(单个py文件)的全局变量示例总结 多模块(多个py文件)的全局变量from x import x导入全局变量示例 import x导入全局变量示例 总结 global关键字 global 的作用范围是模块(.py)级别: 当你在一个模块(文件)中使用 global 声明变量时,这个变量只在该模块的全局命名空

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

异构存储(冷热数据分离)

异构存储主要解决不同的数据,存储在不同类型的硬盘中,达到最佳性能的问题。 异构存储Shell操作 (1)查看当前有哪些存储策略可以用 [lytfly@hadoop102 hadoop-3.1.4]$ hdfs storagepolicies -listPolicies (2)为指定路径(数据存储目录)设置指定的存储策略 hdfs storagepolicies -setStoragePo

Hadoop集群数据均衡之磁盘间数据均衡

生产环境,由于硬盘空间不足,往往需要增加一块硬盘。刚加载的硬盘没有数据时,可以执行磁盘数据均衡命令。(Hadoop3.x新特性) plan后面带的节点的名字必须是已经存在的,并且是需要均衡的节点。 如果节点不存在,会报如下错误: 如果节点只有一个硬盘的话,不会创建均衡计划: (1)生成均衡计划 hdfs diskbalancer -plan hadoop102 (2)执行均衡计划 hd

Hadoop数据压缩使用介绍

一、压缩原则 (1)运算密集型的Job,少用压缩 (2)IO密集型的Job,多用压缩 二、压缩算法比较 三、压缩位置选择 四、压缩参数配置 1)为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器 2)要在Hadoop中启用压缩,可以配置如下参数

Makefile简明使用教程

文章目录 规则makefile文件的基本语法:加在命令前的特殊符号:.PHONY伪目标: Makefilev1 直观写法v2 加上中间过程v3 伪目标v4 变量 make 选项-f-n-C Make 是一种流行的构建工具,常用于将源代码转换成可执行文件或者其他形式的输出文件(如库文件、文档等)。Make 可以自动化地执行编译、链接等一系列操作。 规则 makefile文件