不同文件夹下的乱序数据集处理

首先是处理图片数据集:

import numpy as np
import pandas as pd
from PIL import Image
import os
import glob # glob是用来遍历文件夹下的所有bmp文件
cwd = os.getcwd() # 获取电脑的主文件夹路径:/home/xm
arr = [[]]
classes = [‘fastfading’,’gblur’,’jp2k’,’jpeg’,’wn’] #将所有的文件夹按照预先知道的顺序排列
#存在列表中,实际图片文件夹的顺序要和dmos文件中的标签的顺序要一一对应,
for index,name in enumerate(classes):
    class_path = cwd + '/data/' + name + '/' #获取图像文件夹的路径
    for infile in glob.glob(class_path + '*.bmp'): #遍历classes列表元素的文件夹中的
    #所有bmp格式的文件
        file,ext = os.path.splitext(infile)
        img = Image.open(infile) # 打开每一张图片
        img = img.resize([32,32]) # 将图片压缩
        r,g,b = img.split() #彩色图片拆分成三色通道
        r_array = np.array(r).reshape([1024])
        g_array = np.array(g).reshape([1024])
        b_array = np.array(b).reshape([1024]) # 将三色通道的图片信息转换成
        #numpy的格式
        merge_array = np.concatenate((r_array,g_array,b_array))
        #将三色通道的信息进行横向拼接,这样一张图片的所有信息就全部包含在一个行向量中了
        if arr == [[]]: #将第一张图片的信息放到arr列表中
            arr = [merge_array]
            continue
        arr = np.concatenate((arr,[merge_array]),axis = 0)
        #从第二张开始的图片信息都按照np.concatenate的方式一张一张往下拼接,这样
        #得到的arr.shape = [982,32 * 32 * 3],982张32x32的三色通道图片

标签处理:这里的标签处理是按照噪声作为标签来进行处理的,因为噪声的标签也是在不同的文件夹下
的,而且噪声的文件信息的格式都不是一个格式,所以处理起来比较麻烦,这一部分的内容没有进行封装。

a = []
for index,name in enumerate(classes):
    class_path = cwd + '/data/' + name + '/'
    label_path = class_path + 'info.txt'
    f = open(label_path)
    lines = f.readlines()
    for line in lines:
        line.strip('\n')
        line = line.split(' ')
        a.append(line)

得到的数据最后一列是有‘\n’的,脱掉’\n’

for i in range(len(a)):
a[i][2] = a[i][2].strip(‘\n’)

d = pd.DataFrame(a)

得到的数据的最后一列是字符串的形式,需要将它转换成浮点形的,所以有了以下的代码:

d[2] = d[2].astype(‘float’)

得到的d的最后一列就是float的形式的了。

for i in range(start,end):
            for j in range(i + 1,end):
                if len(a[i][1]) > len(a[j][1]):
                    temp = a[i]
                    a[i] = a[j]
                    a[j] = temp

有的文件夹数据集中和图片对应的标签的索引有的是乱序的,利用冒泡的方法将文件名小的上浮,如1.bmp < 2.bmp

for i in range(start,end):
            for j in range(i + 1,end):
                if len(a[i][1]) == len(a[j][1]): #如果字符串的长度一样
                    if a[i][1] > a[j][1]:
                        temp = a[i]
                        a[i] = a[j]
                        a[j]= temp

标签的处理也可以用以下的方式来读取:

f1 = open('/home/xm/data/fastfading/info.txt') # 4
data1 = pd.read_csv(f1,header = None,delim_whitespace = True)
# print(data1)
f2 = open('/home/xm/data/jp2k/info.txt') # 1
data2 = pd.read_csv(f2,header = None,delim_whitespace = True)
# print(data2)
f3 = open('/home/xm/data/jpeg/info.txt') # 2
data3 = pd.read_csv(f3,header = None,delim_whitespace = True)
# print(data3)
f4 = open('/home/xm/data/wn/info.txt') # 5
data4 = pd.read_csv(f4,header = None,delim_whitespace = True)
data4 = np.array(data4)
data4 = list(data4)

for i in range(len(data4)): #按照文件名的长度进行排序,冒泡算法
            for j in range(i + 1,len(data4)):
                if len(data4[i][1]) > len(data4[j][1]):
                    temp = data4[i]
                    data4[i] = data4[j]
                    data4[j] = temp
for i in range(len(data4)): #文件名长度相等的话,按照字符串中字符的大小来排序,也用冒泡算法
            for j in range(i + 1,len(data4)):
                if len(data4[i][1]) == len(data4[j][1]): #如果字符串的长度一样
                    if data4[i][1] > data4[j][1]:
                        temp = data4[i]
                        data4[i] = data4[j]
                        data4[j]= temp
data4 = np.array(data4)
data4 = pd.DataFrame(data4)
datas = pd.concat([data2,data3,data,data1,data4],axis = 0) #拼接5个文件夹中的所有label
#的info信息
datas = np.array(datas)
noiseset = datas[:,2][:,np.newaxis]
print(noiseset.shape) 

你可能感兴趣的:(数据处理)