基于 VGG19 的车辆图像分类模型微调
基于 VGG19 的车辆图像分类模型微调
本文将介绍如何使用 Keras 和 VGG19 预训练模型对车辆图像进行分类。我们将涵盖以下步骤:
- 准备数据:加载图像数据集并进行预处理。
- 加载 VGG19 模型:使用 Keras 加载 VGG19 预训练模型,并移除顶层。
- 添加自定义层:在 VGG19 模型的基础上添加自定义的全连接层以适应车辆分类任务。
- 冻结 VGG19 模型的部分层:为了加快训练速度,我们可以冻结 VGG19 模型的较低层。
- 编译和训练模型:使用合适的优化器和损失函数编译模型,并使用训练数据进行训练。
- 评估模型:使用测试数据评估模型的性能。
1. 数据准备
首先,我们需要加载车辆图像数据集。本文示例使用了一个包含 64 个类别的车辆图像数据集,训练集位于 'C:/Users/27546/Desktop/Vehicle Identification/train' 目录,验证集位于 'C:/Users/27546/Desktop/Vehicle Identification/test' 目录。
import os
import random
import numpy as np
import pandas as pd
import tensorflow as tf
import matplotlib.pyplot as plt
from tensorflow.keras.models import Sequential, Model
from tensorflow.keras.layers import Dense, Conv2D, Flatten, Dropout, MaxPooling2D, BatchNormalization, GlobalAveragePooling2D
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.preprocessing import image
# 设置参数
train_dir = 'C:/Users/27546/Desktop/Vehicle Identification/train' # 训练集目录
val_dir = 'C:/Users/27546/Desktop/Vehicle Identification/test' # 验证集目录
classes = os.listdir(train_dir) # 获取类别列表
batch_size = 64 # 批大小
IMG_HEIGHT = 150 # 图像高度
IMG_WIDTH = 150 # 图像宽度
epochs = 10 # 训练轮数
# 创建图像生成器
train_image_generator = ImageDataGenerator(
rescale=1./255, # 归一化
horizontal_flip=True # 水平翻转
)
val_image_generator = ImageDataGenerator(
rescale=1./255 # 归一化
)
train_data_gen = train_image_generator.flow_from_directory(
batch_size=batch_size, # 批大小
directory=train_dir, # 训练集目录
shuffle=True, # 是否打乱数据
target_size=(IMG_HEIGHT, IMG_WIDTH), # 图像大小
class_mode='categorical' # 分类方式
)
val_data_gen = val_image_generator.flow_from_directory(
batch_size=batch_size, # 批大小
directory=val_dir, # 验证集目录
shuffle=True, # 是否打乱数据
target_size=(IMG_HEIGHT, IMG_WIDTH), # 图像大小
class_mode='categorical' # 分类方式
)
total_train = train_data_gen.samples # 训练集样本数
total_val = val_data_gen.samples # 验证集样本数
2. 加载 VGG19 模型
# 加载 VGG19 模型并进行微调
input_tensor = tf.keras.layers.Input(shape=(IMG_HEIGHT, IMG_WIDTH, 3)) # 输入层
base_model = tf.keras.applications.VGG19(input_tensor=input_tensor, weights='imagenet', include_top=False) # 加载 VGG19 模型
print("基础模型中的层数总数: ", len(base_model.layers)) # 输出 VGG19 模型的层数
3. 添加自定义层
x = base_model.output # 获取 VGG19 模型的输出
x = GlobalAveragePooling2D()(x) # 添加全局平均池化层
x = Dense(1024, activation='relu')(x) # 添加全连接层
x = Dense(512, activation='relu')(x) # 添加全连接层
x = Dense(64, activation='relu')(x) # 添加全连接层
predictions = Dense(len(classes), activation='softmax')(x) # 添加输出层
model = Model(inputs=base_model.input, outputs=predictions)
4. 冻结 VGG19 模型的部分层
for layer in base_model.layers[:15]:
layer.trainable = False
5. 编译和训练模型
opt = tf.keras.optimizers.Nadam(learning_rate=0.00001) # 定义优化器
model.compile(optimizer=opt, loss='categorical_crossentropy', metrics=['accuracy']) # 编译模型
history = model.fit(
train_data_gen,# 训练集数据生成器
steps_per_epoch=total_train // batch_size,# 每轮迭代的步数
epochs=epochs,# 训练轮数
validation_data=val_data_gen,# 验证集数据生成器
validation_steps=total_val // batch_size# 验证集每轮迭代的步数
)
6. 评估模型
from sklearn.metrics import accuracy_score
# 模型测试
# 加载测试集数据生成器
test_image_generator = ImageDataGenerator(
rescale=1. / 255 # 归一化
)
test_data_gen = test_image_generator.flow_from_directory(
batch_size=1, # 批大小为1,每次测试一个样本
directory=val_dir, # 测试集目录
shuffle=False, # 不打乱数据
target_size=(IMG_HEIGHT, IMG_WIDTH), # 图像大小
class_mode='categorical' # 分类方式
)
# 获取测试集样本数
total_test = len(test_data_gen)
print("Total testing data batches : ", total_test)
# 进行预测并计算准确率
y_pred = model.predict(test_data_gen) # 对测试集进行预测
y_pred_class = np.argmax(y_pred, axis=1) # 获取预测结果的类别
y_true_class = test_data_gen.classes # 获取真实标签的类别
class_names = list(test_data_gen.class_indices.keys()) # 获取类别名称
accuracy = accuracy_score(y_true_class, y_pred_class) # 计算准确率
print('Accuracy: {:.2f}%'.format(accuracy * 100))
7. 其他模型推荐
除了 VGG19,还有其他优秀的模型可以用于训练图像分类模型,例如:
- ResNet:ResNet是一个非常深的卷积神经网络,通过使用残差块(residual block)解决了梯度消失的问题,可以训练非常深的网络。
- InceptionNet:InceptionNet是一个具有多个分支的卷积神经网络,每个分支使用不同大小的卷积核来捕捉不同尺度的特征。
- DenseNet:DenseNet是一个密集连接的卷积神经网络,每个层的输出都与前面所有层的输出连接在一起,可以更好地利用特征。
- MobileNet:MobileNet是一种轻量级的卷积神经网络,通过使用深度可分离卷积(depthwise separable convolution)来减少参数量,适用于移动设备等资源有限的场景。
这些模型都可以通过在Keras中调用相应的预训练模型来使用,例如tf.keras.applications模块中提供了这些模型的预训练权重。你可以根据具体的任务和需求选择适合的模型进行训练。
原文地址: https://www.cveoy.top/t/topic/gu5 著作权归作者所有。请勿转载和采集!