Python 使用Keras,TensorFlow和Pillow进行图像数据处理
图像数据预处理是训练以图像为输入的深度学习模型的重要步骤。在大规模图像数据集中,预处理图像可能具有计算量大和内存消耗高的问题。为解决这个问题,通常会使用生成器来预处理并将图像馈送到深度学习模型中。
在Python中,Keras库提供了一个强大的工具来使用生成器对图像数据进行预处理。ImageDataGenerator类可用于创建一个生成器,该生成器从指定目录读取图像并即时执行预处理操作。
ImageDataGenerator类提供了几种方法来对图像执行预处理操作。这些操作包括调整大小、裁剪、旋转、翻转和归一化。这些方法可以链接在一起,创建一系列要应用于输入图像的预处理步骤。此外,还可以使用数据增强技术,如随机裁剪和翻转,来增加训练数据集的大小并提高模型性能。
要使用ImageDataGenerator类,首先创建一个类的实例并指定要应用的预处理操作。然后,使用flow_from_directory方法创建一个从目录中读取图像并执行指定的预处理操作的生成器。然后,可以将此生成器作为输入传递给Keras模型进行训练。
生成器相对于在训练之前对所有图像进行预处理具有几个优点。它们允许我们通过仅在需要时将图像加载到内存中来有效地使用内存。它们还允许我们即时执行预处理操作,使我们能够创建复杂的预处理流水线,不受内存限制。
现在我们已经了解了一些关于图像数据处理理论的知识,让我们利用一个示例。按照下面给出的步骤进行数据处理。
首先,您需要安装必要的库。您可以使用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之间,并将图片调整为128×128像素。
让我们创建一个名为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作为fit方法的validation_data参数传递,该参数在每个训练周期后使用验证数据评估模型。
要运行上述代码,需要按照下面提供的说明进行操作。
- 运行命令 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库的无缝集成使它成为广泛应用于各种图像处理应用的多功能工具。