服装图像分类毕业设计:基于 VGG19 的深度学习模型
#!/usr/bin/env python
coding: utf-8
# 毕业设计
### 一、数据准备
In[1]:
导入所需要的库包
import numpy as np import os import glob as gb import cv2 import random from keras import regularizers from keras.preprocessing.image import ImageDataGenerator from keras.models import Sequential from keras.layers import Activation, Conv2D, Dense, Dropout, Flatten, MaxPooling2D from keras import models,optimizers,regularizers import matplotlib.pyplot as plt from keras.callbacks import ReduceLROnPlateau from keras.applications import VGG19
In[2]:
导入数据集
train_dir = 'D:/Clothing Dataset/train/' test_dir = 'D:/Clothing Dataset/test/' validation_dir = 'D:/Clothing Dataset/valid/'
### 二、数据预处理、可视化
- 查看训练集的数量和种类名称
In[3]:
查看训练集的数量和种类名称
for folder in os.listdir(train_dir): files=gb.glob(pathname=str(train_dir+folder+'/*')) print(f'for training data,found{len(files)} in folder {folder}')
- 查看测试集的数量和种类名称
In[4]:
查看测试集的数量和种类名称
for folder in os.listdir(test_dir): files=gb.glob(pathname=str(test_dir+folder+'/*')) print(f'for testing data,found{len(files)} in folder {folder}')
- 查看验证集集的数量和种类名称
In[5]:
查看验证集的数量和种类名称
for folder in os.listdir(validation_dir): files=gb.glob(pathname=str(validation_dir+folder+'/*')) print(f'for testing data,found{len(files)} in folder {folder}')
- 进行图像增强
In[6]:
设置图像预处理和增强操作
train_datagen = ImageDataGenerator(rescale=1./255) test_datagen = ImageDataGenerator(rescale=1./255) validation_datagen = ImageDataGenerator(rescale=1./255)
In[7]:
定义训练、验证和测试数据生成器
train_generator = train_datagen.flow_from_directory( train_dir, target_size=(150, 150), batch_size=20, class_mode='categorical') validation_generator = validation_datagen.flow_from_directory( validation_dir, target_size=(150, 150), batch_size=20, class_mode='categorical') test_generator = validation_datagen.flow_from_directory( test_dir, target_size=(150, 150), batch_size=20, class_mode='categorical')
In[8]:
训练和验证数据集中存在的类别的标签映射
labels = {value: key for key, value in train_generator.class_indices.items()} print('Label Mappings for classes present in the training and validation datasets\n') for key, value in labels.items(): print(f'{key} : {value}')
In[9]:
code = {'Long sleeved':0, 'Short sleeve':1, 'cotton-padded jacket':2, 'longuette':3, 'shorts':4} x_train = [] y_train = []
for folder in os.listdir(train_dir): files = gb.glob(pathname= str(train_dir+folder+'/*')) for file in files : imag = cv2.imread(file) imag_array = cv2.resize(imag, (150, 150)) x_train.append(imag_array) y_train.append(code[folder])
In[10]:
随机选择25张训练集图片
sample_images = random.sample(list(zip(x_train, y_train)), 25)
展示训练集中的部分图片及其种类
plt.figure(figsize=(20,20)) for n, (image, label) in enumerate(sample_images): plt.subplot(5, 5, n + 1) plt.imshow(image) plt.axis('off') plt.title(labels[label]) plt.show()
### 四、编译、训练模型
In[11]:
加载VGG19模型,并冻结前面几层
conv_base = VGG19(weights='imagenet', include_top=False, input_shape=(150, 150, 3)) for layer in conv_base.layers[:15]: layer.trainable = False conv_base.summary()
In[12]:
构建新模型,在VGG16模型基础上添加自定义的分类层
Model = models.Sequential() Model.add(conv_base) Model.add(Flatten()) Model.add(Dense(4092, activation='relu')) Model.add(Dropout(0.5)) Model.add(Dense(5, activation='softmax')) Model.summary()
In[13]:
编译模型,并指定优化器、损失函数和评价指标
Model.compile(optimizer=optimizers.RMSprop(learning_rate=2e-5), loss='categorical_crossentropy', metrics=['accuracy'])
In[16]:
#训练模型 history = Model.fit_generator( train_generator, epochs=20, verbose=1, steps_per_epoch=50, validation_data=validation_generator, validation_steps=50)
### 五、模型训练过程可视化
In[17]:
正常显示中文
plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = False
定义函数
acc = history.history['accuracy'] val_acc = history.history['val_accuracy'] loss = history.history['loss'] val_loss = history.history['val_loss'] epochs = range(1, len(acc) + 1) plt.figure(figsize=(12, 4))
绘制训练集与验证集准确率曲线
plt.subplot(1, 2, 1) plt.plot(epochs, acc, 'bo', label='训练集准确率') plt.plot(epochs, val_acc, 'b', label='验证集准确率') plt.title('训练集与验证集准确率曲线') plt.xlabel('Epochs') plt.ylabel('准确率') plt.legend()
绘制训练集与验证集损失曲线
plt.subplot(1, 2, 2) plt.plot(epochs, loss, 'bo', label='训练集损失') plt.plot(epochs, val_loss, 'b', label='验证集损失') plt.title('训练集与验证集损失曲线') plt.xlabel('Epochs') plt.ylabel('损失') plt.legend()
plt.tight_layout() plt.show()
六、模型预测及预测展示
In[18]:
对测试集进行预测
pred = Model.predict(test_generator)
获取预测结果中的最大概率对应的类别
pred_classes = np.argmax(pred, axis=1)
获取测试集中的类别
test_classes = test_generator.classes
获取测试集中所有样本对应的类别标签
test_labels = list(test_generator.class_indices.keys())
随机选择25张测试集图片
sample_images = random.sample(list(zip(test_generator.filenames, pred_classes, test_classes)), 25)
展示测试集中的部分图片及其预测结果
plt.figure(figsize=(20,20)) for n, (image, pred_class, true_class) in enumerate(sample_images): img = cv2.imread(test_dir + image) img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) plt.subplot(5, 5, n + 1) plt.imshow(img) plt.axis('off') plt.title(f'预测结果: {test_labels[pred_class]}\n真实结果:{test_labels[true_class]}') plt.show()
原文地址: https://www.cveoy.top/t/topic/ph8X 著作权归作者所有。请勿转载和采集!