📜  识别 BTS 的成员——一个图像分类器(1)

📅  最后修改于: 2023-12-03 15:41:45.897000             🧑  作者: Mango

识别 BTS 的成员 —— 一个图像分类器

在本项目中,我们将使用深度学习技术构建一个图像分类器,能够识别韩国男团 BTS 的七名成员。

项目大纲

本项目包含几个关键步骤:

  1. 数据集准备
  2. 构建图像分类器模型
  3. 训练模型并进行评估
  4. 使用模型进行预测
数据集准备

为了训练我们的图像分类器,我们需要一个包含 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 模型作为我们的基本模型,然后在其顶部添加了一些自定义层以实现我们的分类任务。我们还说明了如何在本地环境中训练和评估模型,以及如何使用该模型进行预测。