使用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库的无缝集成使其成为各种图像处理应用程序的通用工具。