在当今的移动设备上,实时图像分类的需求日益增长。为了满足这一需求,Google开发了MobileNetV2模型,它能够在计算资源受限的设备上提供高效的图像分类能力。该模型通过迁移学习技术,将ImageNet预训练模型的知识迁移到自定义数据集上,从而实现快速且准确的分类。本教程将指导如何利用Roboflow平台下载数据、构建模型、训练和评估MobileNetV2模型,并通过微调进一步提高模型的准确性。
MobileNetV2模型的核心创新在于其倒置残差结构,该结构在残差块的输入和输出之间使用了薄的瓶颈层。此外,它还采用了轻量级卷积来过滤扩展层中的特征,并在狭窄层中移除了非线性激活。这种架构设计使得MobileNetV2在保持高准确率的同时,还能降低延迟。通过使用Roboflow平台,可以轻松地管理数据集、一键训练模型,并将其部署到Web、移动设备或边缘设备上。即使是少量的图像,也可以在一个下午内训练出一个有效的计算机视觉模型。
要开始使用MobileNetV2模型,首先需要将数据集转换为TensorFlow的ImageFolder格式。TensorFlow Datasets提供的ImageFolder API允许直接使用Roboflow中的图像与TensorFlow构建的模型一起使用。通过以下代码,可以将数据集转换为TensorFlow数据集,并使用tfds.show_examples函数查看数据加载情况。
import tensorflow_datasets as tfds
builder = tfds.folder_dataset.ImageFolder('images/')
print(builder.info)
raw_train = builder.as_dataset(split='train', shuffle_files=True)
raw_test = builder.as_dataset(split='test', shuffle_files=True)
raw_valid = builder.as_dataset(split='valid', shuffle_files=True)
tfds.show_examples(raw_train, builder.info)
接下来,将构建MobileNetV2模型。首先,创建一个基于预训练模型MobileNet V2的基础模型。然后,冻结卷积层以使用基础模型作为特征提取器。接着,通过全局平均池化2D层将特征向量转换为1280元素向量,并通过Dense层获得最终预测。最后,将这些层堆叠到一个顺序模型中,并使用二元交叉熵损失和RMSProp优化器编译模型。
IMG_SHAPE = (IMG_SIZE, IMG_SIZE, 3)
base_model = tf.keras.applications.MobileNetV2(input_shape=IMG_SHAPE,
include_top=False,
weights='imagenet')
base_model.trainable = False
global_average_layer = tf.keras.layers.GlobalAveragePooling2D()
prediction_layer = tf.keras.layers.Dense(1)
model = tf.keras.Sequential([
base_model,
global_average_layer,
prediction_layer
])
base_learning_rate = 0.0001
model.compile(optimizer=tf.keras.optimizers.RMSprop(learning_rate=base_learning_rate),
loss=tf.keras.losses.BinaryCrossentropy(from_logits=True),
metrics=['accuracy'])
在训练模型之前,可以通过评估模型获得初始损失和准确率。然后,开始训练模型以提高准确率并降低损失。通过绘制损失和准确率图表,可以评估模型在训练和验证期间的性能。
为了进一步提高模型的准确性,可以通过微调模型来实现。首先,解冻基础模型并冻结所有在某个层之前的层;在这个例子中,将冻结所有在第100层之前的层。然后,重新编译并开始训练模型。通过查看准确率和损失,可以看到两个指标都有显著的提高。