📅  最后修改于: 2023-12-03 15:41:45.897000             🧑  作者: Mango
在本项目中,我们将使用深度学习技术构建一个图像分类器,能够识别韩国男团 BTS 的七名成员。
本项目包含几个关键步骤:
为了训练我们的图像分类器,我们需要一个包含 BTS 成员照片的数据集。我们可以从互联网上找到这些照片,并将它们组织成一个文件夹结构,如下所示:
dataset
├── jin
│ ├── jin1.jpg
│ ├── jin2.jpg
│ └── ...
├── suga
│ ├── suga1.jpg
│ ├── suga2.jpg
│ └── ...
├── jhope
│ ├── jhope1.jpg
│ ├── jhope2.jpg
│ └── ...
├── rm
│ ├── rm1.jpg
│ ├── rm2.jpg
│ └── ...
├── jimin
│ ├── jimin1.jpg
│ ├── jimin2.jpg
│ └── ...
├── v
│ ├── v1.jpg
│ ├── v2.jpg
│ └── ...
└── jungkook
├── jungkook1.jpg
├── jungkook2.jpg
└── ...
在此数据集中,每个子文件夹都包含一个成员的照片。我们需要确保每个成员具有相同数量的照片,以确保我们的模型在训练期间有相等的机会了解每个成员。
在此项目中,我们将使用 Keras 深度学习框架来构建图像分类器模型。我们将使用经过预训练的 VGG16 模型(一种流行的卷积神经网络)作为我们的基本模型,然后在其顶部添加几个自定义层以对我们的训练数据进行分类。
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout, Flatten
from tensorflow.keras.applications import VGG16
# 加载预训练的VGG16模型
vgg_base = VGG16(weights='imagenet', include_top=False, input_shape=(224, 224, 3))
# 创建新的模型
model = Sequential()
# 将预训练模型添加到新模型中
model.add(vgg_base)
# 在预训练模型的顶部添加自定义层
model.add(Flatten())
model.add(Dense(1024, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(512, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(7, activation='softmax'))
在此模型中,我们使用了 Dense
层,其中包括 1024 个神经元和 512 个神经元,其使用 ReLU 激活函数。我们还添加了两个 Dropout
层,分别带有 50% 的丢弃率,以减少模型的过拟合。
最后,我们添加一个 Dense
层,其中有 7 个神经元,使用 softmax 激活函数作为我们的输出层,以便我们将每个图像分成七个类别:BTS 中的每个成员。
模型构建完成后,我们需要从我们的数据集中获取样本,并训练该模型。在此之后,我们将评估模型的性能,并尝试对其进行调整,以提高其性能。
我们需要加载训练图像并对其进行预处理,以使其符合 VGG16 模型的输入规范。
from tensorflow.keras.preprocessing.image import ImageDataGenerator
# 定义训练和验证集的目录
train_dir = 'dataset/train'
val_dir = 'dataset/valid'
# 将训练和验证数据转换为格式化的张量
train_datagen = ImageDataGenerator(rescale=1./255,
shear_range=0.2,
zoom_range=0.2,
horizontal_flip=True)
val_datagen = ImageDataGenerator(rescale=1./255)
train_data = train_datagen.flow_from_directory(train_dir,
target_size=(224, 224),
batch_size=32,
class_mode='categorical')
val_data = val_datagen.flow_from_directory(val_dir,
target_size=(224, 224),
batch_size=32,
class_mode='categorical')
进行预测之前还需要进行模型的训练
# 编译模型
model.compile(loss='categorical_crossentropy',
optimizer='adam',
metrics=['accuracy'])
# 进行模型训练
epochs = 50
history = model.fit(train_data,
steps_per_epoch=len(train_data),
epochs=epochs,
validation_data=val_data,
validation_steps=len(val_data))
接下来,我们可以对模型进行评估,并查看其性能。
# 评估模型
score = model.evaluate(val_data, verbose=0)
print('Test loss:', score[0])
print('Test accuracy:', score[1])
我们还可以使用 Matplotlib 库绘制如下图所示的训练和验证拟合曲线:
import matplotlib.pyplot as plt
# 绘制训练和验证准确度曲线
plt.plot(history.history['accuracy'])
plt.plot(history.history['val_accuracy'])
plt.title('Model accuracy')
plt.ylabel('Accuracy')
plt.xlabel('Epoch')
plt.legend(['Train', 'Val'], loc='upper left')
plt.show()
# 绘制训练和验证损失曲线
plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.title('Model loss')
plt.ylabel('Loss')
plt.xlabel('Epoch')
plt.legend(['Train', 'Val'], loc='upper right')
plt.show()
最后,我们可以使用训练好的模型进行预测。我们可以从互联网上下载一些 BTS 成员的照片,并使用训练过的模型来识别它们。
from tensorflow.keras.preprocessing import image
import numpy as np
# 加载模型
model = load_model('model.h5')
# 加载图片
img = image.load_img('jin.jpg', target_size=(224, 224))
# 将图像转换为数组
x = image.img_to_array(img)
x = np.expand_dims(x, axis=0)
x /= 255.
# 进行预测
preds = model.predict(x)
print('Predicted:', preds)
我们得到的输出将是一个长度为7的一维数组,其中每个元素表示对应的成员的概率。可以通过np.argmax函数将概率转换为类别标签。
# 将预测结果转换为类别标签
labels = ['Jin', 'Suga', 'J-Hope', 'RM', 'Jimin', 'V', 'Jungkook']
pred_class = np.argmax(preds)
pred_label = labels[pred_class]
print('Predicted:', pred_label)
在本项目中,我们使用深度学习技术构建了一个图像分类器,能够识别 BTS 的七名成员。我们使用了 Keras 深度学习框架和 VGG16 模型作为我们的基本模型,然后在其顶部添加了一些自定义层以实现我们的分类任务。我们还说明了如何在本地环境中训练和评估模型,以及如何使用该模型进行预测。