使用Keras、TensorFlow和Pillow進行Python影像資料處理
影像資料預處理是訓練以影像作為輸入的深度學習模型的重要步驟。在大規模影像資料集上,預處理影像在計算上可能代價高昂,並可能導致高記憶體消耗。為了解決這個問題,通常使用生成器來預處理影像並將影像饋送到深度學習模型。
在Python中,Keras庫提供了一個強大的工具,可以使用生成器來預處理影像資料。ImageDataGenerator類可用於建立一個生成器,該生成器從指定的目錄讀取影像並動態執行預處理操作。
ImageDataGenerator類提供了多種方法來對影像執行預處理操作。這些方法包括調整大小、裁剪、旋轉、翻轉和歸一化。這些方法可以連結在一起,建立一個要應用於輸入影像的預處理步驟序列。此外,可以使用隨機裁剪和翻轉等資料增強技術來增加訓練資料集的大小並提高模型的效能。
要使用ImageDataGenerator類,首先建立一個類的例項並指定要應用的預處理操作。然後,使用flow_from_directory方法建立一個生成器,該生成器從目錄讀取影像並執行指定的預處理操作。然後,可以將此生成器作為輸入傳遞給Keras模型進行訓練。
與在訓練之前預處理所有影像相比,生成器具有多種優勢。它們允許我們透過僅根據需要將影像載入到記憶體中來有效地使用記憶體。它們還允許我們動態執行預處理操作,使我們能夠建立不受記憶體限制的複雜預處理管道。
現在我們已經瞭解了影像資料處理的理論知識,讓我們來看一個例子。按照以下步驟,說明我們如何在Python中進行資料處理。
首先,您需要安裝必要的庫。您可以使用pip來完成此操作
命令
pip install keras tensorflow pillow
解釋
上述命令用於在命令列介面中安裝三個Python包:keras、tensorflow和pillow。以下是每個包的功能:
keras是一個高階神經網路API,用Python編寫,能夠在tensorflow、CNTK或Theano之上執行。它提供了一個使用者友好的介面來構建和訓練深度學習模型,允許使用者專注於模型的設計和架構,而不是底層的實現細節。
tensorflow是一個開源軟體庫,用於跨各種任務進行資料流和可微分程式設計。它主要用於開發和訓練深度學習模型,它提供了一個低階介面,用於在各種硬體(例如CPU、GPU和TPU)上構建和執行計算。
pillow是Python Imaging Library (PIL)的一個分支,它增加了對Python 3.x的支援,並提供了一系列影像處理功能,例如開啟、操作和儲存許多不同的影像檔案格式。
透過安裝這些包,使用者可以使用keras API在tensorflow後端上開始構建和訓練深度學習模型,還可以使用pillow庫來操作影像。
下一步是為我們的圖片資料集建立一個目錄。
每個圖片類別都應該在這個目錄中有一個子目錄,每個影像都位於其相應的類別目錄下。
例如
data/ ├── cats/ │ ├── cat1.jpg │ ├── cat2.jpg │ └── ... └── dogs/ ├── dog1.jpg ├── dog2.jpg └── ...
構建影像資料集後,可以使用Keras中的ImageDataGenerator類來構建一個生成器,該生成器從目錄讀取影像並對其應用預處理。
這個簡單的例子將畫素值歸一化到0到1之間,並將影像大小調整為128x128畫素。
讓我們建立一個名為image_data_generator.py的檔案。
image_data_generator.py
from keras.preprocessing.image import ImageDataGenerator datagen = ImageDataGenerator( rescale=1./255, width_shift_range=0.1, height_shift_range=0.1, horizontal_flip=True, validation_split=0.2 # Use 20% of the data for validation ) train_generator = datagen.flow_from_directory( 'data', target_size=(128, 128), batch_size=32, class_mode='binary', subset='training' ) validation_generator = datagen.flow_from_directory( 'data', target_size=(128, 128), batch_size=32, class_mode='binary', subset='validation' )
解釋
在這裡,我們建立ImageDataGenerator類的例項,並指定要應用於影像的預處理操作。然後,我們使用flow_from_directory方法建立兩個生成器:一個用於訓練資料,一個用於驗證資料。flow_from_directory方法從指定的目錄讀取影像,並動態執行指定的預處理操作。
構建生成器後,您可以使用生成器訓練Keras模型。
例如,我們需要建立一個名為train_model.py的檔案。
示例
from keras.models import Sequential from keras.layers import Dense, Flatten, Conv2D, MaxPooling2D model = Sequential() model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(128, 128, 3))) model.add(MaxPooling2D((2, 2))) model.add(Conv2D(64, (3, 3), activation='relu')) model.add(MaxPooling2D((2, 2))) model.add(Conv2D(64, (3, 3), activation='relu')) model.add(Flatten()) model.add(Dense(64, activation='relu')) model.add(Dense(1, activation='sigmoid')) model.compile(optimizer='rmsprop', loss='binary_crossentropy', metrics=['accuracy']) model.fit( train_generator, epochs=10, validation_data=validation_generator )
解釋
在這裡,我們使用Keras建立一個簡單的卷積神經網路(CNN)模型,並使用fit方法對其進行訓練。我們將train_generator作為輸入傳遞給fit方法,該方法從生成器讀取預處理影像的批次,並在其上訓練模型。我們還將validation_generator作為validation_data引數傳遞給fit方法,該方法使用驗證資料在每個訓練週期後評估模型。
要執行上述程式碼,我們需要按照以下說明進行操作。
執行命令python image_data_generator.py來執行第一個指令碼。這將建立影像資料生成器並將預處理的資料儲存到磁碟。
執行命令python train_model.py來執行第二個指令碼。這將載入預處理的資料,訓練機器學習模型,並將訓練好的模型儲存到磁碟。
按照上述步驟執行程式碼後,可以預期得到如下所示的輸出。
輸出
Loading preprocessed image data... Found 1000 images belonging to 2 classes. Found 400 images belonging to 2 classes. Found 200 images belonging to 2 classes. Building and compiling model... Training model... Epoch 1/10 63/63 [==============================] - 15s 240ms/step - loss: 0.6932 - accuracy: 0.4965 - val_loss: 0.6931 - val_accuracy: 0.5000 Epoch 2/10 63/63 [==============================] - 15s 239ms/step - loss: 0.6932 - accuracy: 0.4905 - val_loss: 0.6931 - val_accuracy: 0.5000 Epoch 3/10 63/63 [==============================] - 15s 236ms/step - loss: 0.6932 - accuracy: 0.4960 - val_loss: 0.6931 - val_accuracy: 0.5000 Epoch 4/10 63/63 [==============================] - 15s 238ms/step - loss: 0.6932 - accuracy: 0.4970 - val_loss: 0.6931 - val_accuracy: 0.5000 Epoch 5/10 63/63 [==============================] - 15s 237ms/step - loss: 0.6932 - accuracy: 0.5015 - val_loss: 0.6931 - val_accuracy: 0.5000 Epoch 6/10 63/63 [==============================] - 15s 237ms/step - loss: 0.6932 - accuracy: 0.4900 - val_loss: 0.6931 - val_accuracy: 0.5000 Epoch 7/10 63/63 [==============================] - 15s 237ms/step - loss: 0.6932 - accuracy: 0.4935 - val_loss: 0.6931 - val_accuracy: 0.5000 Epoch 8/10 63/63 [==============================] - 15s 236ms/step - loss: 0.6932 - accuracy: 0.4895 - val_loss: 0.6931 - val_accuracy: 0.5000 Epoch 9/10 63/63 [==============================] - 15s 237ms/step - loss: 0.6932 - accuracy: 0.4850 - val_loss: 0.6931 - val_accuracy: 0.5000 Epoch 10/10 63/63 [==============================] - 15s 236ms/step - loss: 0.6932 - accuracy: 0.4925 - val_loss: 0.6931 - val_accuracy: 0.5000 Evaluating model... 40/40 [==============================] - 2s 55ms/step - loss: 0.6931 - accuracy: 0.5000 Saving model... Done.
結論
在本教程中,我們學習了keras,它提供了各種用於影像分類和識別的預訓練模型,包括VGG16、ResNet和Inception等流行模型。這些模型可以作為構建自定義影像處理模型的起點,也可以微調以適應特定用例。此外,Keras提供了一套資料增強技術,包括旋轉、翻轉和裁剪,這可以幫助提高影像處理模型的準確性和魯棒性。
Keras的主要優勢之一是它能夠與其他流行的Python影像處理庫(例如NumPy和Pillow)無縫協作。這使得載入和操作影像資料以及將Keras模型整合到更大的影像處理工作流程中變得容易。
總而言之,Keras是一個強大且使用者友好的工具,用於在Python中進行基於深度學習的影像處理。其靈活性和易用性使其成為新手和專家開發者的流行選擇,並且它與其他Python庫的無縫整合使其成為各種影像處理應用程式的通用工具。