作者|Renu Khandelwal
編譯|VK
來源|Towards Data Science
在本文中,你將學(xué)習(xí)如何加載自定義數(shù)據(jù)和創(chuàng)建圖像序列和測試數(shù)據(jù)集,作為深度學(xué)習(xí)模型的輸入。
這里使用的數(shù)據(jù)集是來自Kaggle的Intel圖像分類。
數(shù)據(jù)集鏈接:https://www./puneet6060/intel-image-classification/version/2
“Intel圖像分類”數(shù)據(jù)集已分為train、test和Val,我們將僅使用訓(xùn)練數(shù)據(jù)集學(xué)習(xí)如何使用不同的庫加載數(shù)據(jù)集。
為深度學(xué)習(xí)模型加載自定義數(shù)據(jù)集的典型步驟
-
打開圖像文件。文件的格式可以是JPEG、PNG、BMP等。
-
調(diào)整圖像大小以匹配深度學(xué)習(xí)模型的輸入層的輸入大小。
-
將圖像像素轉(zhuǎn)換為浮點數(shù)據(jù)類型。
-
將圖像標準化,使像素值在0到1之間。
-
深度學(xué)習(xí)模型的圖像數(shù)據(jù)應(yīng)該是一個numpy數(shù)組或一個張量對象。
自定義圖像數(shù)據(jù)的文件夾結(jié)構(gòu)
每個類都是一個文件夾,其中包含該特定類的圖像。
使用CV2加載圖像數(shù)據(jù)
導(dǎo)入所需的庫
import pandas as pd
import numpy as np
import os
import tensorflow as tf
import cv2
from tensorflow import keras
from tensorflow.keras import layers, Dense, Input, InputLayer, Flatten
from tensorflow.keras.models import Sequential, Model
from matplotlib import pyplot as plt
import matplotlib.image as mpimg
%matplotlib inline
從其中一個文件夾中隨機輸出五張圖像
plt.figure(figsize=(20,20))
test_folder=r'CV\Intel_Images\seg_train\seg_train\forest'
for i in range(5):
file = random.choice(os.listdir(img_folder))
image_path= os.path.join(img_folder, file)
img=mpimg.imread(image_path)
ax=plt.subplot(1,5,i+1)
ax.title.set_text(file)
plt.imshow(img)
設(shè)置用于加載數(shù)據(jù)集的圖像維度和源文件夾
IMG_WIDTH=200
IMG_HEIGHT=200
img_folder=r'CV\Intel_Images\seg_train\seg_train\'
從文件夾中的圖像創(chuàng)建圖像數(shù)據(jù)和標簽
在下面的函數(shù)中
-
source文件夾是包含不同類的圖像的輸入?yún)?shù)。
-
從文件夾中讀取圖像文件并將其轉(zhuǎn)換為正確的顏色格式。
-
根據(jù)模型所需的輸入尺寸調(diào)整圖像大小
-
將圖像轉(zhuǎn)換為數(shù)據(jù)類型為float32的Numpy數(shù)組
-
將圖像數(shù)組標準化,使值在0和1之間,這有助于更快地收斂。
def create_dataset(img_folder):
img_data_array=[]
class_name=[]
for dir1 in os.listdir(img_folder):
for file in os.listdir(os.path.join(img_folder, dir1)):
image_path= os.path.join(img_folder, dir1, file)
image= cv2.imread( image_path, cv2.COLOR_BGR2RGB)
image=cv2.resize(image, (IMG_HEIGHT, IMG_WIDTH),interpolation = cv2.INTER_AREA)
image=np.array(image)
image = image.astype('float32')
image /= 255
img_data_array.append(image)
class_name.append(dir1)
return img_data_array, class_name
# extract the image array and class name
img_data, class_name =create_dataset(r'CV\Intel_Images\seg_train\seg_train')
將文本標簽轉(zhuǎn)換為數(shù)字編碼
為類的所有唯一值創(chuàng)建字典
target_dict={k: v for v, k in enumerate(np.unique(class_name))}
target_dict
根據(jù)字典將類名稱轉(zhuǎn)換為各自的數(shù)值
target_val= [target_dict[class_name[i]] for i in range(len(class_name))]
創(chuàng)建一個簡單的深度學(xué)習(xí)模型并編譯它
model=tf.keras.Sequential(
[
tf.keras.layers.InputLayer(input_shape=(IMG_HEIGHT,IMG_WIDTH, 3)),
tf.keras.layers.Conv2D(filters=32, kernel_size=3, strides=(2, 2), activation='relu'),
tf.keras.layers.Conv2D(filters=64, kernel_size=3, strides=(2, 2), activation='relu'),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(6)
])
encoder.compile(optimizer='rmsprop', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
我們最終調(diào)整數(shù)據(jù)集來訓(xùn)練模型。我們可以使用Numpy數(shù)組作為輸入
history = model.fit(x=np.array(img_data, np.float32), y=np.array(list(map(int,target_val)), np.float32), epochs=5)
我們還可以使用tf.cast()將輸入數(shù)據(jù)轉(zhuǎn)換為張量來訓(xùn)練模型。
history = model.fit(x=tf.cast(np.array(img_data), tf.float64), y=tf.cast(list(map(int,target_val)),tf.int32), epochs=5)
我們使用不同的庫加載圖像數(shù)據(jù)集但是我們使用相同的模型來進行進一步的訓(xùn)練
用PIL加載圖像數(shù)據(jù)
添加附加庫以使用PIL加載圖像數(shù)據(jù)集
from PIL import Image
使用PIL從文件夾中的圖像創(chuàng)建圖像數(shù)據(jù)和標簽
在下面的函數(shù)中
-
source文件夾是包含不同類的圖像的輸入?yún)?shù)。
-
使用PIL從文件夾中打開圖像文件。
-
根據(jù)模型所需的輸入尺寸調(diào)整圖像大小
-
將圖像轉(zhuǎn)換為數(shù)據(jù)類型為float32的Numpy數(shù)組
-
標準化圖像數(shù)組以加快收斂。
def create_dataset_PIL(img_folder):
img_data_array=[]
class_name=[]
for dir1 in os.listdir(img_folder):
for file in os.listdir(os.path.join(img_folder, dir1)):
image_path= os.path.join(img_folder, dir1, file)
image= np.array(Image.open(image_path))
image= np.resize(image,(IMG_HEIGHT,IMG_WIDTH,3))
image = image.astype('float32')
image /= 255
img_data_array.append(image)
class_name.append(dir1)
return img_data_array , class_name
PIL_img_data, class_name=create_dataset_PIL(img_folder)
將文本標簽轉(zhuǎn)換為數(shù)字編碼
下面是我們在CV2中使用的代碼
target_dict={k: v for v, k in enumerate(np.unique(class_name))}
target_val= [target_dict[class_name[i]] for i in range(len(class_name))]
創(chuàng)建和編譯一個簡單的深度學(xué)習(xí)模型
model=tf.keras.Sequential(
[
tf.keras.layers.InputLayer(input_shape=(IMG_HEIGHT,IMG_WIDTH, 3)),
tf.keras.layers.Conv2D(filters=32, kernel_size=3, strides=(2, 2), activation='relu'),
tf.keras.layers.Conv2D(filters=64, kernel_size=3, strides=(2, 2), activation='relu'),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(6)
])
encoder.compile(optimizer='rmsprop', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
我們最終調(diào)整數(shù)據(jù)集來訓(xùn)練模型。我們可以使用Numpy數(shù)組作為輸入
history = model.fit(x=np.array(PIL_img_data, np.float32), y=np.array(list(map(int,target_val)), np.float32), epochs=5)
我們還可以使用tf.cast()將輸入數(shù)據(jù)轉(zhuǎn)換為張量來訓(xùn)練模型。
history = model.fit(x=tf.cast(np.array(PIL_img_data), tf.float64), y=tf.cast(list(map(int,target_val)),tf.int32), epochs=5)
除了幾個步驟外,使用CV2和PIL加載數(shù)據(jù)集的過程是相同的。
現(xiàn)在這將幫助你使用CV2和PIL庫加載數(shù)據(jù)集。
這里提供了使用CV2和PIL加載數(shù)據(jù)集的代碼:https://github.com/arshren/Load_Dataset
在下一篇文章中,我們將使用以下的庫來加載數(shù)據(jù)集。
原文鏈接:https:///loading-custom-image-dataset-for-deep-learning-models-part-1-d64fa7aaeca6
歡迎關(guān)注磐創(chuàng)AI博客站:
http:///
sklearn機器學(xué)習(xí)中文官方文檔:
http:///
歡迎關(guān)注磐創(chuàng)博客資源匯總站:
http://docs./
|