如何使用Python对图片进行图像分类

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对图像进行分类。

后端开发标签