车辆识别模型训练:数据预处理和VGG19微调
车辆识别模型训练:数据预处理和 VGG19 微调
本文将介绍使用 TensorFlow 和 Keras 进行车辆识别模型训练的代码,涵盖数据预处理、VGG19 模型加载和微调,以及训练结果可视化等步骤。
代码:
# 导包
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 # 训练轮数
# 定义函数以展示图像
def plotImages(img_arr):
# 创建一个包含1行10列的子图,并设置整个图的大小为20x20
fig, axes = plt.subplots(1, 10, figsize=(20,20))
axes = axes.flatten() # 将子图展平为一维数组
# 遍历图像数组和子图,将图像显示在对应的子图上
for img, ax in zip(img_arr, axes):
ax.imshow(img) # 在子图上显示图像
ax.axis('off') # 不显示坐标轴
plt.tight_layout() # 调整子图之间的间距
plt.show() # 显示图像
# 创建图像生成器
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 # 验证集样本数
# 展示一些图像
training_images, _ = next(train_data_gen) # 从训练集数据生成器中获取一批图像数据
plotImages(training_images[:10]) # 调用plotImages函数展示前10张图像
# 加载 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 模型的层数
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)
opt = tf.keras.optimizers.Nadam(learning_rate=0.00001) # 定义优化器
model.compile(optimizer=opt, loss='categorical_crossentropy', metrics=['accuracy']) # 编译模型
model.summary() # 输出模型结构
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# 验证集每轮迭代的步数
)
# 绘制训练过程中的准确率和损失曲线
acc = history.history['accuracy'] # 获取训练准确率列表
val_acc = history.history['val_accuracy'] # 获取验证准确率列表
loss = history.history['loss'] # 获取训练损失列表
val_loss = history.history['val_loss'] # 获取验证损失列表
epochs_range = range(epochs) # 创建轮数范围
# 绘制准确率曲线
plt.figure(figsize=(16, 8))
plt.subplot(1, 2, 1)
plt.plot(epochs_range, acc, label='Training Accuracy') # 绘制训练准确率曲线
plt.plot(epochs_range, val_acc, label='Validation Accuracy') # 绘制验证准确率曲线
plt.legend(loc='lower right') # 添加图例,位置在右下角
plt.title('Training and Validation Accuracy') # 设置标题
# 绘制损失曲线
plt.subplot(1, 2, 2)
plt.plot(epochs_range, loss, label='Training Loss') # 绘制训练损失曲线
plt.plot(epochs_range, val_loss, label='Validation Loss') # 绘制验证损失曲线
plt.legend(loc='upper right') # 添加图例,位置在右上角
plt.title('Training and Validation Loss') # 设置标题
plt.show() # 显示图像
代码解析:
-
数据预处理:
- 使用
ImageDataGenerator类创建图像生成器,进行图像归一化和水平翻转等预处理操作。 - 使用
flow_from_directory方法从训练集和验证集目录加载图像数据并生成数据生成器。
- 使用
-
模型加载和微调:
- 加载预训练的 VGG19 模型,并将其设置为不可训练 (
include_top=False)。 - 在 VGG19 模型的输出层上添加全局平均池化层和全连接层,并最终输出分类结果。
- 加载预训练的 VGG19 模型,并将其设置为不可训练 (
-
模型编译和训练:
- 定义优化器并编译模型,使用
categorical_crossentropy作为损失函数,并使用accuracy作为评估指标。 - 使用
model.fit方法训练模型,并使用steps_per_epoch和validation_steps参数设置每轮迭代的步数。
- 定义优化器并编译模型,使用
-
训练结果可视化:
- 使用
matplotlib.pyplot库绘制训练过程中的准确率和损失曲线,以观察模型的训练效果。
- 使用
总结:
本篇文章介绍了使用 TensorFlow 和 Keras 进行车辆识别模型训练的代码,涵盖数据预处理、VGG19 模型加载和微调,以及训练结果可视化等步骤。该代码可以作为车辆识别模型训练的示例,并可以根据实际情况进行调整。
原文地址: https://www.cveoy.top/t/topic/gVt 著作权归作者所有。请勿转载和采集!