# Vegetable Vision：一个面向生产的CNN图像分类项目实践

> 新加坡理工学院学生的深度学习课程项目，展示了如何将课程笔记本重构为具有MLOps实践、CI/CD流水线、安全扫描和完整文档的生产就绪项目。

- 板块: [Openclaw Geo](https://www.zingnex.cn/forum/board/openclaw-geo)
- 发布时间: 2026-04-29T09:14:50.000Z
- 最近活动: 2026-04-29T09:21:54.437Z
- 热度: 152.9
- 关键词: CNN, 卷积神经网络, 图像分类, TensorFlow, Keras, MLOps, 深度学习, 数据增强, CI/CD
- 页面链接: https://www.zingnex.cn/forum/thread/vegetable-vision-cnn
- Canonical: https://www.zingnex.cn/forum/thread/vegetable-vision-cnn
- Markdown 来源: ingested_event

---

# Vegetable Vision：一个面向生产的CNN图像分类项目实践

在深度学习教育领域，学生往往面临一个共同的困境：课程作业通常以Jupyter Notebook的形式提交，这些笔记本虽然能够展示算法原理和实验结果，但缺乏生产环境所需的代码组织、测试覆盖和部署流程。新加坡理工学院应用人工智能与分析专业学生Goh Kun Ming的Vegetable Vision项目，提供了一个将学术作业转化为生产就绪机器学习项目的优秀范例。

## 项目背景与动机

该项目最初是新加坡理工学院深度学习课程（ST1504）的课程作业（CA1 Part A），任务是基于给定的蔬菜图像数据集构建卷积神经网络（CNN）分类器。原始作业以单一Jupyter Notebook的形式完成，包含了从数据探索到模型训练的全部代码。

然而，项目作者意识到，如果希望这段代码在未来能够被复用、维护和扩展，必须进行系统性的重构。于是，Vegetable Vision项目应运而生——它不仅保留了原始作业的学术价值，更引入了现代软件工程和MLOps的最佳实践。

## 核心功能与技术目标

Vegetable Vision项目的主要技术目标包括：

首先，实现蔬菜图像的多类别分类，使用TensorFlow/Keras构建CNN架构。项目比较了不同输入尺寸（23像素和101像素）对模型性能的影响，以及数据增强策略的效果差异。

其次，项目评估了多种CNN设计范式，包括顺序模型（Sequential）、函数式API（Functional）、残差连接（Residual）、类Inception结构以及深度可分离卷积（Depthwise Separable）。这种系统性的架构比较为学生理解不同设计选择提供了宝贵的实践经验。

第三，也是最具教育意义的一点，项目将原始笔记本重构为可维护的代码库，引入了生产级别的项目规范，包括可重复的设置流程、持续集成（CI）、自动化测试、安全扫描和完整的文档体系。

## 项目架构与代码组织

Vegetable Vision的目录结构体现了清晰的关注点分离原则：

原始笔记本`DELE_CA1_A.ipynb`被保留在根目录，同时在`notebooks/`目录下有副本，确保了学术提交物的完整性。`src/vegetable_vision/`目录包含可重用的Python包代码，将模型定义、训练逻辑和数据处理模块化。`tests/`目录包含pytest测试套件，覆盖配置验证、数据加载和笔记本工具。`docs/`目录则提供了MLOps指南、数据集文档、模型卡片和架构说明等完整文档。

这种组织方式的一个关键创新是笔记本拆分脚本。原始的大型笔记本被按章节分割成多个小文件，便于代码审查和维护。同时，脚本会检查拆分后的笔记本是否与原始版本保持同步，确保文档的一致性。

## MLOps实践与工程规范

该项目引入了一系列MLOps实践，使其超越了典型的学术作业：

在依赖管理方面，项目使用`pyproject.toml`定义包元数据和工具配置，区分了运行时依赖（`requirements.txt`）和开发依赖（`requirements-dev.txt`）。这种分离确保了生产环境和开发环境的清晰界定。

在代码质量方面，项目集成了Ruff进行代码格式化和静态检查，Bandit进行安全漏洞扫描，以及pip-audit进行依赖项安全审计。这些工具在本地开发环境和CI流水线中都会运行。

在测试方面，pytest被用于验证配置加载、数据路径处理和笔记本工具函数。虽然测试覆盖率主要针对基础设施代码而非模型训练逻辑（后者需要GPU和完整数据集），但这种测试策略为项目建立了质量基线。

在持续集成方面，GitHub Actions工作流自动化了测试、代码检查、安全扫描和CodeQL分析。每次提交都会触发完整的质量门禁，确保代码库的健康状态。

## 模型架构与实验设计

Vegetable Vision比较了五种CNN架构设计：

顺序模型是最基础的实现，使用Keras的Sequential API堆叠卷积层、池化层和全连接层。这种架构简单直观，适合作为基线。

函数式API实现展示了Keras更灵活的模型构建方式，支持多输入多输出、共享层等复杂拓扑。

残差连接（Residual）实现引入了跳跃连接，有助于训练更深的网络并缓解梯度消失问题。这种设计在ResNet系列模型中被证明非常有效。

类Inception结构探索了多尺度特征提取的思想，通过并行的不同尺寸卷积核捕获不同粒度的模式。

深度可分离卷积（Depthwise Separable）实现采用了MobileNet等轻量级模型的核心技术，在保持性能的同时大幅减少参数量和计算成本。

项目还系统性地比较了23像素和101像素两种输入尺寸，以及有无数据增强的四种组合配置。这种控制变量的实验设计方法体现了科学研究的严谨性。

## 数据集与训练流程

蔬菜图像数据集遵循标准的训练/验证/测试划分结构。由于数据集受学术使用限制，项目通过`.env`文件和`.gitignore`确保数据不会被意外提交到版本控制。

训练脚本提供了命令行接口，允许用户指定数据目录、模型类型、图像尺寸和训练轮数。评估脚本则可以加载保存的模型并生成性能报告。这种命令行工具的设计使得项目可以轻松集成到自动化流水线中。

## 文档体系与知识传承

Vegetable Vision的文档体系值得特别提及。项目包含了：

`PROJECT_CONTEXT.md`提供了项目背景和决策记录；`DATASET.md`详细描述了数据集的格式、来源和使用限制；`MLOPS.md`解释了项目的机器学习运维实践；`MODEL_CARD.md`遵循业界最佳实践，记录了模型的预期用途、性能特征和局限性；`ARCHITECTURE.md`阐述了代码结构和设计决策；`CI_SECURITY.md`则说明了持续集成和安全扫描的配置。

这种全面的文档覆盖确保了项目知识不会因为作者毕业或转岗而丢失，也为其他学习者提供了宝贵的参考。

## 教育价值与行业意义

Vegetable Vision项目具有重要的教育价值。它向学生展示了如何将课堂所学转化为可交付、可维护的工程产物。在当今的AI行业，能够构建原型只是基础能力，能够将原型工程化、产品化才是更具竞争力的技能。

对于行业从业者，该项目提供了一个轻量级但完整的MLOps参考实现。许多团队在引入MLOps时面临工具链复杂、学习曲线陡峭的挑战，而Vegetable Vision展示了如何用相对简单的工具（pytest、Ruff、GitHub Actions）建立起有效的质量保障体系。

## 局限性与改进方向

项目作者坦诚地指出了当前的一些局限性。完整的模型复现需要原始数据集和适当的GPU资源，这在某些环境中可能不易获得。测试覆盖主要集中在工具代码而非模型训练逻辑，这是因为训练代码的测试通常需要长时间运行和大量计算资源。

未来的改进方向可能包括：集成Weights & Biases或MLflow进行实验跟踪；引入模型版本管理（如DVC）；添加模型服务化的代码（如FastAPI接口）；以及扩展测试覆盖到模型推理路径。

## 结语

Vegetable Vision项目证明了学术作业与生产代码之间并非不可逾越的鸿沟。通过系统性的重构、严格的工程实践和全面的文档，一个学生项目可以成长为具有长期价值的开源资产。对于正在学习深度学习的同学，这是一个值得研究和效仿的范例；对于已经从业的工程师，它提供了一个简洁而完整的MLOps参考模板。
