承接上篇爬取了想要的數據集之後,先將圖片的尺寸統一。(我自己爬取了塗鴉,油畫,素描這3類圖片)
關於塗鴉數據集爬下來的圖片,其中混入了一些妹子和西海岸黑人黑幫文化的圖片。(爲什麼我也不知道。。。)注意清除,數據集的好壞很關鍵!
resize
先統一圖片格式32*32
# coding=utf-8
from PIL import Image
import os.path
import glob
def convertjpg(jpgfile,outdir,width=32,height=32):
img = Image.open(jpgfile)
try:
new_img = img.resize((width,height),Image.BILINEAR)
new_img.save(os.path.join(outdir,os.path.basename(jpgfile)))
except Exception as e:
print(e)
for jpgfile in glob.glob("./素描/*.jpg"):
convertjpg(jpgfile,"./素描數據集")
方方正正的效果不錯
分類
然後是分類,我設定的規則是
類別 | 名稱 |
---|---|
0 | 塗鴉數據集 |
1 | 油畫數據集 |
2 | 素描數據集 |
通過批量修改文件前綴來判斷,如2_1.jpg因爲是2_的前綴說明是素描圖像
#coding:utf-8
import os
movie_name = os.listdir('./油畫數據集')
for temp in movie_name:
new_name = '1_' + temp
os.rename('./油畫數據集/'+temp,'油畫數據集/'+new_name)
歸一化,生成數組
把數據集集中在data文件夾下,然後讀取數據,順便將數據歸一化
import os
import numpy as np
import tensorflow as tf
from PIL import Image
train = True
data_dir = "data"
model_path = "../image_model"
def read_data(data_dir):
datas = []
labels = []
fpaths = []
for fname in os.listdir(data_dir):
fpath = os.path.join(data_dir, fname)
fpaths.append(fpath)
image = Image.open(fpath)
data = np.array(image)/255.0
label = int(fname.split("_")[0])
datas.append(data)
labels.append(label)
datas = np.array(datas)
labels = np.array(labels)
print("shape of datas: {}\tshape of labels: {}".format(datas.shape,
labels.shape))
return fpaths, datas, labels
fpaths, datas, labels = read_data(data_dir)
num_classes = len(set(labels))
注意!在生成數組(np.array)的時候很可能會出現通道數不同的情況,尤其是素描數據集有大量的黑白圖片,這個時候要手動刪除那些不合格的圖片。具體來說有些圖是灰度圖,位深度是8而RGB的位深度是24,在屬性中可以查看
把那些不合格的圖片刪除以後就完成了自制數據集啦(手動撒花)
結果如下(我一共收集了596張32×32×3的圖片):
shape of datas: (596, 32, 32, 3) shape of labels: (596,)