1. 前言
图像分类,是指对一张图片进行分类,比如将动物的图片归为动物类别下的狗、猫、鱼等。图像分类可以广泛应用于人脸识别、文字识别、自动驾驶等领域。
本文旨在通过Python语言来实现对图片的图像分类,我们主要使用Keras深度学习框架,以及预训练的卷积神经网络ResNet50模型。这篇文章将介绍如何准备数据集、建立模型、训练模型以及如何评估模型。
2. 数据准备
2.1 数据收集
首先,我们需要收集大量图片数据,这些数据应当覆盖了我们所要分类的所有类别。在本文中,我们以动物图片分类为例子,将收集大量狗、猫、鱼等动物的图片。
import os
import urllib.request
# 设置下载的图片类型和数量
animal_type = ["dog", "cat", "fish"]
num_images = 200
# 下载图片
for animal in animal_type:
# 新建文件夹
if not os.path.exists(animal):
os.makedirs(animal)
# 下载图片并保存到相应文件夹
for i in range(num_images):
try:
url = f"https://source.unsplash.com/200x200/?{animal}"
urllib.request.urlretrieve(url, f"{animal}/{animal}_{i}.jpg")
except:
print(f"Download error: {url}")
else:
print(f"Downloaded: {url}")
在上面的代码中,我们使用了Python自带的urllib库实现图片的下载。同时,我们通过设置animal_type和num_images来控制下载图片的类别和数量。
2.2 数据预处理
接下来,我们需要对收集到的图片进行预处理,以便将其用于训练模型。首先,我们需要将图片转换成数组的形式,以便让模型可以处理。其次,我们需要将每一张图片进行缩放和标准化,以便使训练更为有效。
from keras.preprocessing.image import ImageDataGenerator
# 数据增强
train_datagen = ImageDataGenerator(
rescale=1./255,
shear_range=0.2,
zoom_range=0.2,
horizontal_flip=True)
# 加载数据
batch_size = 32
train_path = "./"
train_generator = train_datagen.flow_from_directory(
train_path,
target_size=(224, 224),
batch_size=batch_size,
class_mode="categorical")
在上述代码中,我们对每张图片进行了缩放,使其大小为224x224,并进行了标准化。同时,我们还对图片进行了数据增强,比如随机移动、水平翻转等方式,以便增加我们训练模型的数据量。
3. 建立模型
接下来,我们将使用Keras框架来建立我们的模型。在本文中,我们将使用预训练的卷积神经网络模型ResNet50。
from keras.applications.resnet50 import ResNet50
from keras.layers import Flatten, Dense, GlobalAveragePooling2D
from keras.models import Model
# 加载预训练模型
def get_resnet50_model():
resnet_model = ResNet50(include_top=False, weights="imagenet", input_shape=(224, 224, 3))
x = resnet_model.output
x = GlobalAveragePooling2D()(x)
x = Dense(256, activation="relu")(x)
prediction = Dense(3, activation="softmax")(x)
model = Model(inputs=resnet_model.input, outputs=prediction)
# 添加微调层
for layer in resnet_model.layers:
layer.trainable = False
return model
model = get_resnet50_model()
model.summary()
在上述代码中,我们通过加载ResNet50模型来快速搭建了我们的模型架构。ResNet50是一个比较强大的深度学习模型,其使用的是残差神经网络结构。我们通过使用该模型,可以加快模型的训练速度,同时也可以提高模型的预测精度。在模型建立的过程中,我们还添加了微调层,以便更好的适应我们所要分类的数据集。
4. 训练模型
接下来,我们将使用所建立的模型来对数据集进行训练,以便让模型适应我们所要分类的数据集。在模型训练过程中,我们需要设置训练过程的相关参数,比如设置训练次数、优化器、学习率衰减等。
from keras.callbacks import ModelCheckpoint
from keras.optimizers import Adam, RMSprop
# 设置训练参数
num_epochs = 20
lr = 0.001
# 编译模型
opt = Adam(lr=lr)
model.compile(loss="categorical_crossentropy", optimizer=opt, metrics=["accuracy"])
# 训练模型
checkpointer = ModelCheckpoint(filepath="./weights.hdf5", verbose=1, save_best_only=True)
model.fit_generator(train_generator, epochs=num_epochs, callbacks=[checkpointer])
在上述代码中,我们使用了Adam优化器来进行模型的优化,同时还采用了模型保存以便在之后的预测过程中使用。
5. 评估模型
训练模型完成之后,我们需要对模型进行评估。在评估模型之前,我们需要进行模型的加载,以便在测试集上进行预测。
from keras.models import load_model
# 加载模型
model = load_model("./weights.hdf5")
# 计算测试集精度
test_datagen = ImageDataGenerator(rescale=1./255)
test_path = "./"
test_generator = test_datagen.flow_from_directory(
test_path,
target_size=(224, 224),
batch_size=batch_size,
class_mode="categorical",
shuffle=False)
_, accuracy = model.evaluate_generator(test_generator, steps=len(test_generator))
print(f"Test accuracy: {accuracy}")
在上述代码中,我们使用了在之前训练过程中保存的模型进行预测,同时计算了模型在测试集上的精度。
6. 结论
本文简要介绍了如何使用Python语言通过深度学习框架Keras,以及预训练的卷积神经网络ResNet50模型来对图像进行分类。我们通过对数据集的准备、建立模型、训练模型以及对模型进行评估等过程进行了详细的阐述。希望读者能够通过该文来了解到如何使用Python对图像进行分类。