Flower102的鮮花分類數(shù)據(jù)準(zhǔn)備及處理
寫在前面
寫這篇文章的初衷是想幫助像我一樣疑惑在flower102分類中數(shù)據(jù)處理階段的小朋友。
不知大家發(fā)現(xiàn)沒(méi)有突勇,現(xiàn)有的網(wǎng)絡(luò)資源中装盯,大部分博主都詳細(xì)記載了分類過(guò)程,但是對(duì)于數(shù)據(jù)準(zhǔn)備階段甲馋,都輕描淡寫的說(shuō)“簡(jiǎn)單處理一下”埂奈。如下圖所示,只告訴了數(shù)據(jù)的組織方式定躏,卻沒(méi)有告知如何生成這種數(shù)據(jù)的組織方式账磺。
當(dāng)然啦芹敌,博主們熱心的提供了已做好處理的數(shù)據(jù)收費(fèi)鏈接,而我呢垮抗,就不想花錢氏捞。
如果你也有上述疑惑和需求,那就繼續(xù)往下看吧~
1冒版、數(shù)據(jù)下載
flower102數(shù)據(jù)集鏈接地址為:http://www.robots.ox.ac.uk/~vgg/data/flowers/102/
看到上圖的Downloads液茎,下載1,4,5。其中1為全部數(shù)據(jù)集圖片辞嗡,下載后解壓豁护,備用。4和5都為mat文件欲间,他們標(biāo)記了整個(gè)數(shù)據(jù)集的label。其中4文件總共有8189列断部,每列上的數(shù)字代表類別號(hào)猎贴。5文件總共有3個(gè)字段,分別為trnid:1020列蝴光;valid:1020列她渴;tstid:6149列。
2蔑祟、數(shù)據(jù)預(yù)處理編碼
經(jīng)歷過(guò)上一步下載數(shù)據(jù)之后趁耗,我們已經(jīng)把需要的物料都準(zhǔn)備好了,接下來(lái)就是將數(shù)據(jù)分成訓(xùn)練集疆虚、測(cè)試集以進(jìn)行訓(xùn)練苛败。我們理想狀態(tài)下需要將數(shù)據(jù)組織成下面形式:
data_prepare/
? ? pic/
? ? ? ? train/
? ? ? ? ? ? class1/
? ? ? ? ? ? ? ? img1
? ? ? ? ? ? ? ? img2
? ? ? ? ? ? ? ? ...
? ? ? ? ? ? class2
? ? ? ? ? ? ? ? img1
? ? ? ? ? ? ? ? img2
? ? ? ? ? ? ? ? ...
? ? ? ? validation/
? ? ? ? ? ? class1/
? ? ? ? ? ? ? ? img1
? ? ? ? ? ? ? ? img2
? ? ? ? ? ? ? ? ...
? ? ? ? ? ? class2
? ? ? ? ? ? ? ? img1
? ? ? ? ? ? ? ? img2
? ? ? ? ? ? ? ? ...
為了將數(shù)據(jù)組織成上述形式,我們要先將下載好的1,4,5文件存放在項(xiàng)目目錄里径簿,下圖為我存放的數(shù)據(jù)地址罢屈,將4和5文件存放在項(xiàng)目直系目錄下,將1源數(shù)據(jù)放在flower_data目錄下篇亭,這里的jpg里面包含了所有數(shù)據(jù)圖片缠捌。jpg文件夾來(lái)自下載好數(shù)據(jù)壓縮包解壓后得到的文件名,我沒(méi)有去掉译蒂,你也可以去掉曼月,直接將全部數(shù)據(jù)圖片放到flower_data文件夾中。
在項(xiàng)目中新建文件夾prepare_pic柔昼,再在prepare_pic下新建文件夾test哑芹、train、validation岳锁。
實(shí)現(xiàn)數(shù)據(jù)集劃分的編碼:
# encoding:utf-8
import scipy.io
import numpy as np
import os
from PIL import Image
import shutil
labels = scipy.io.loadmat('D:\\felicity\\code\\flower102\\imagelabels.mat')#該地址為imagelabels.mat的絕對(duì)地址
labels = np.array(labels['labels'][0]) - 1
print("labels:", labels)
setid = scipy.io.loadmat('D:\\felicity\\code\\flower102\\setid.mat')#該地址為setid.mat的絕對(duì)地址
validation = np.array(setid['valid'][0]) - 1
np.random.shuffle(validation)
train = np.array(setid['trnid'][0]) - 1
np.random.shuffle(train)
test = np.array(setid['tstid'][0]) - 1
np.random.shuffle(test)
flower_dir = list()
for img in os.listdir("D:\\felicity\\code\\flower102\\flower_data\\jpg"):#該地址為源數(shù)據(jù)圖片的絕對(duì)地址? ? ?????flower_dir.append(os.path.join("D:\\felicity\\code\\flower102\\flower_data\\jpg", img))
flower_dir.sort()
# print(flower_dir)
des_folder_train = "D:\\felicity\\code\\flower102\\prepare_pic\\train"#該地址為新建的訓(xùn)練數(shù)據(jù)集文件夾的絕對(duì)地址
for tid in train:
? ? #打開(kāi)圖片并獲取標(biāo)簽
? ? img = Image.open(flower_dir[tid])
? ? print(img)
? ? # print(flower_dir[tid])
? ? img = img.resize((256, 256), Image.ANTIALIAS)
? ? lable = labels[tid]
? ? # print(lable)
? ? path = flower_dir[tid]
? ? print("path:", path)
? ? base_path = os.path.basename(path)
? ? print("base_path:", base_path)
? ? classes = "c" + str(lable)
? ? class_path = os.path.join(des_folder_train, classes)
? ? # 判斷結(jié)果
? ? if not os.path.exists(class_path):
? ? ? ? os.makedirs(class_path)
? ? print("class_path:", class_path)
? ? despath = os.path.join(class_path, base_path)
? ? print("despath:", despath)
? ? img.save(despath)
des_folder_validation = "D:\\felicity\\code\\flower102\\prepare_pic\\validation"#該地址為新建的驗(yàn)證數(shù)據(jù)集文件夾的絕對(duì)地址
for tid in validation:
? ? img = Image.open(flower_dir[tid])
? ? # print(flower_dir[tid])
? ? img = img.resize((256, 256), Image.ANTIALIAS)
? ? lable = labels[tid]
? ? # print(lable)
? ? path = flower_dir[tid]
? ? print("path:", path)
? ? base_path = os.path.basename(path)
? ? print("base_path:", base_path)
? ? classes = "c" + str(lable)
? ? class_path = os.path.join(des_folder_validation, classes)
? ? # 判斷結(jié)果
? ? if not os.path.exists(class_path):
? ? ? ? os.makedirs(class_path)
? ? print("class_path:", class_path)
? ? despath = os.path.join(class_path, base_path)
? ? print("despath:", despath)
? ? img.save(despath)
des_folder_test = "D:\\felicity\\code\\flower102\\prepare_pic\\test"#該地址為新建的測(cè)試數(shù)據(jù)集文件夾的絕對(duì)地址
for tid in test:
? ? img = Image.open(flower_dir[tid])
? ? # print(flower_dir[tid])
? ? img = img.resize((256, 256), Image.ANTIALIAS)
? ? lable = labels[tid]
? ? # print(lable)
? ? path = flower_dir[tid]
? ? print("path:", path)
? ? base_path = os.path.basename(path)
? ? print("base_path:", base_path)
? ? classes = "c" + str(lable)
? ? class_path = os.path.join(des_folder_test, classes)
? ? # 判斷結(jié)果
? ? if not os.path.exists(class_path):
? ? ? ? os.makedirs(class_path)
? ? print("class_path:", class_path)
? ? despath = os.path.join(class_path, base_path)
? ? print("despath:", despath)
? ? img.save(despath)
將所有涉及的地址部分修改正確后绩衷,就可以運(yùn)行該文件蹦魔,我將該文件命名為data_prepare.py。
運(yùn)行之后咳燕,就可以看到項(xiàng)目目錄里面有了已經(jīng)劃分好的數(shù)據(jù)集了勿决。
好啦,恭喜你招盲,你可以繼續(xù)做分類了低缩,另外,如果你覺(jué)得有用請(qǐng)給我點(diǎn)贊曹货,哈哈哈咆繁,讓它獲得流量,幫助更多的人顶籽。