第 T7 周:咖啡豆识别

发布时间:2026/7/11 1:56:49

第 T7 周:咖啡豆识别 基于 VGG-16 的咖啡豆图像分类实践 声明本文为「365 天深度学习训练营」内部学习记录。本文参考 K 同学啊课程内容完成仅用于个人学习与交流。咖啡豆数据集仅用于学习交流请勿对外分享数据集。本篇为个人在 T7 关卡上的实践记录。我的环境Python 3.6.5 · Jupyter Lab · TensorFlow 2.4.1难度夯实基础 ⭐⭐项目简介本文记录一次基于卷积神经网络CNN的图像分类实践。本实验使用经典的VGG-16 网络结构完成对咖啡豆图片的四分类任务。主要目标包括理解 VGG-16 的网络结构手动搭建 VGG-16 网络加深对 CNN 模型组成的理解调用 TensorFlow 官方 VGG-16 实现进行对比熟悉完整的图像分类训练流程。分类目标为咖啡豆的不同类别DarkGreenLightMedium实验环境Python 3.6.5 TensorFlow 2.4.1 Jupyter Lab GPU NVIDIA GPU数据集4 个类别 共 1200 张 PNG 图片 每类约 300 张数据目录49-data/ ├── Dark/ ├── Green/ ├── Light/ └── Medium/一、数据读取与预处理1. 导入依赖fromtensorflowimportkerasfromtensorflow.kerasimportlayers,modelsimporttensorflowastfimportnumpyasnpimportmatplotlib.pyplotaspltimportosimportpathlibimportPIL2. GPU 配置如果使用 GPU可以开启显存动态增长避免 TensorFlow 一次占用全部显存。gpustf.config.list_physical_devices(GPU)ifgpus:tf.config.experimental.set_memory_growth(gpus[0],True)tf.config.set_visible_devices(gpus[0],GPU)print(gpus)3. 数据路径设置data_dir./49-data/data_dirpathlib.Path(data_dir)统计图片数量image_countlen(list(data_dir.glob(*/*.png)))print(Total images:,image_count)输出Total images: 1200二、构建 TensorFlow Dataset使用image_dataset_from_directory()自动根据文件夹名称生成标签。例如Dark - 0 Green - 1 Light - 2 Medium - 31. 设置图像参数batch_size32img_height224img_width2242. 加载训练集train_dstf.keras.preprocessing.image_dataset_from_directory(data_dir,validation_split0.2,subsettraining,seed123,image_size(img_height,img_width),batch_sizebatch_size)3. 加载验证集val_dstf.keras.preprocessing.image_dataset_from_directory(data_dir,validation_split0.2,subsetvalidation,seed123,image_size(img_height,img_width),batch_sizebatch_size)4. 查看类别信息class_namestrain_ds.class_namesprint(class_names)print(Number of classes:,len(class_names))输出[Dark, Green, Light, Medium] Number of classes: 4三、数据可视化在训练之前先观察部分样本。plt.figure(figsize(10,5))forimages,labelsintrain_ds.take(1):foriinrange(10):axplt.subplot(2,5,i1)plt.imshow(images[i].numpy().astype(uint8))plt.title(class_names[labels[i]])plt.axis(off)四、优化数据加载为了提高训练效率对数据 pipeline 进行优化cache()缓存数据减少重复读取shuffle()随机打乱数据prefetch()提前准备下一批数据。AUTOTUNEtf.data.AUTOTUNE train_ds(train_ds.cache().shuffle(1000).prefetch(buffer_sizeAUTOTUNE))val_ds(val_ds.cache().prefetch(buffer_sizeAUTOTUNE))五、VGG-16 网络结构VGG-16 是经典卷积神经网络由 Visual Geometry Group 提出。其主要特点使用统一的 3×3 卷积核网络结构简单通过增加深度提升特征表达能力。整体结构Input Image ↓ Convolution Blocks ↓ Max Pooling ↓ Fully Connected Layers ↓ Softmax Classification包含13 个卷积层5 个池化层3 个全连接层。因此称为 VGG-16。六、模型构建为了比较不同实现方式这里保留两个版本手动搭建 VGG-16TensorFlow 官方 VGG-16。USE_OFFICIAL_VGG16False七、调用官方 VGG-16ifUSE_OFFICIAL_VGG16:modeltf.keras.applications.VGG16(weightsNone,include_topTrue,classeslen(class_names),input_shape(img_height,img_width,3))model.summary()八、手动搭建 VGG-16fromtensorflow.keras.layersimport(Conv2D,MaxPooling2D,Dense,Flatten,Input)fromtensorflow.keras.modelsimportModeldefVGG16(nb_classes,input_shape):input_tensorInput(shapeinput_shape)# Block 1xConv2D(64,(3,3),activationrelu,paddingsame)(input_tensor)xConv2D(64,(3,3),activationrelu,paddingsame)(x)xMaxPooling2D((2,2))(x)# Block 2xConv2D(128,(3,3),activationrelu,paddingsame)(x)xConv2D(128,(3,3),activationrelu,paddingsame)(x)xMaxPooling2D((2,2))(x)# 后续 Block 3-5 与经典 VGG-16 相同xFlatten()(x)xDense(4096,activationrelu)(x)xDense(4096,activationrelu)(x)outputDense(nb_classes,activationsoftmax)(x)modelModel(input_tensor,output)returnmodel创建模型ifnotUSE_OFFICIAL_VGG16:modelVGG16(len(class_names),(img_width,img_height,3))model.summary()模型参数量约134,276,932九、模型编译由于标签采用整数编码Dark - 0 Green - 1 Light - 2 Medium - 3因此使用SparseCategoricalCrossentropy作为损失函数。model.compile(optimizertf.keras.optimizers.Adam(learning_rate1e-4),losstf.keras.losses.SparseCategoricalCrossentropy(from_logitsFalse),metrics[accuracy])十、模型训练epochs20historymodel.fit(train_ds,validation_dataval_ds,epochsepochs)训练过程中记录training lossvalidation losstraining accuracyvalidation accuracy。十一、训练结果可视化acchistory.history[accuracy]val_acchistory.history[val_accuracy]losshistory.history[loss]val_losshistory.history[val_loss]plt.figure(figsize(12,4))plt.subplot(1,2,1)plt.plot(acc)plt.plot(val_acc)plt.title(Accuracy)plt.legend([Training,Validation])plt.subplot(1,2,2)plt.plot(loss)plt.plot(val_loss)plt.title(Loss)plt.legend([Training,Validation])plt.show()十二、实验总结本次实践完成了基于 VGG-16 的咖啡豆图像分类任务。主要收获理解 CNN 图像分类完整流程掌握 TensorFlow 数据加载方式手动实现 VGG-16 网络结构对比官方模型实现理解深度网络参数量与性能之间的关系。实验结果表明VGG-16 能够较好完成咖啡豆分类任务但由于模型参数量较大在实际应用中通常需要结合迁移学习模型剪枝知识蒸馏MobileNet、EfficientNet 等轻量网络。这些方法可以进一步提高模型部署效率。

相关新闻