在我們開始進行模型訓練前還有一步要先做處理,由於我們所獲得的資料集可能大小不一而影響訓練模型,因此我們要先將所有照片統一大小。
import os
import cv2
import glob
import numpy as np
images = []
labels = []
size = (40, 40)
# load all pictures into list and give them labels
for folders in glob.glob("PetImages/*"):
for filename in os.listdir(folders):
type = folders[-3: len(folders)]
img = cv2.imread(os.path.join(folders, filename))
if img is not None:
img = cv2.resize(img, dsize = size)
images.append(img)
if (type == "Cat"):
labels.append(0)
elif (type == "Dog"):
labels.append(1)
執行如上述的程式碼,最終可以將所有貓狗的照片在調整成統一尺寸後,儲存在images這個list之中,而他們對應的label也會存在labels這個list之中。兩個list當中index相同的資料即為對應資料。
程式碼說明:
一開始先宣告images list儲存修改好尺寸的照片、labels list儲存對應的貓狗類別。以glob.glob獲得Dog資料夾和Cat資料夾位址,接著分別遍歷兩個資料夾,type變數紀錄該照片為貓還是狗(type變數只會是Cat或者是Dog,因為type變數所取的值為先前glob.glob獲得的位址末三字元,即兩資料夾名稱)。利用cv2套件中的resize將照片大小調整為40 x 40,調整完後就丟至images list之中。接著判斷type變數為Cat或是Dog,若為Cat,我們給予標籤為0;Dog則給予標籤1。
若是讀者的資料集為自己進行搜集,而導致資料筆數可能不夠時,筆者這邊推薦一個方法可能可以幫助資料筆數的提升,但若是能夠用更好的方法收集到更多不同的資料還是建議不要使用。
首先是原圖的展示,我們先將大小設定為100 x 100,方便觀察。
from PIL import Image
img = Image.open("cat.jpg")
img = img.resize((100, 100))
display(img)
接著執行如下圖程式碼,分別裁切左上、右上、右下以及左上區塊,如此產生位置稍微不同的相片。(crop函式的前兩個參數為新圖片左上頂點於原圖片的x座標以及y座標,而後兩個參數參數為新圖片右下頂點於原圖片的x坐標以及y座標)
newImg1 = img.crop((10, 10, 100, 100))
newImg1 = newImg1.resize((100, 100))
newImg2 = img.crop((0, 10, 90, 100))
newImg2 = newImg2.resize((100, 100))
newImg3 = img.crop((0, 0, 90, 90))
newImg3 = newImg3.resize((100, 100))
newImg4 = img.crop((10, 0, 100, 90))
newImg4 = newImg4.resize((100, 100))
display(newImg1)
display(newImg2)
display(newImg3)
display(newImg4)
結果如下圖,此種方法增加的圖片會導致圖片集內容相似可能導致訓練出的模型,對於外來圖片的辨識度降低,因此筆者認為可以的話盡量不用,在此只是提出此一辦法,接下來所使用的資料並未使用此方法進行資料擴充。