基于 Django 和 PyTorch 的食物图像分类系统设计与实现

一、项目简介

本项目实现了一个面向食物图像识别的分类系统,系统以 Django 作为 Web 服务框架,以 PyTorch 模型作为图像分类核心。用户在页面中上传菜品图片并选择识别模型后,系统会完成图片预处理、模型推理、类别解析和结果展示。项目适合作为深度学习图像分类、Web 部署和多模型对比实验的综合实践案例。

系统页面围绕"上传图片、选择模型、查看结果"这一主流程设计,同时在页面中展示数据集路径、训练/测试目录和类别信息,使项目的运行入口更加直观。

二、技术栈介绍

核心框架:

  • 后端框架:Django
  • 深度学习框架:PyTorch
  • 前端页面:HTML、CSS、Django Template
  • 数据存储:SQLite、media 上传目录、本地数据集目录

支持的模型结构:

  • 经典 CNN:AlexNet、VGG、ResNet、GoogLeNet
  • 轻量级网络:MobileNet、ShuffleNet、EfficientNet
  • 现代架构:DenseNet、RegNet、Swin Transformer、Vision Transformer

整体架构采用 Web 页面与模型推理模块分离的方式。前端负责上传图片和展示结果,后端负责接收请求、保存上传文件、加载模型并调用对应预测函数。模型目录中保留了训练脚本、预测脚本、类别映射文件和训练过程结果文件,便于后续扩展。

三、数据集介绍

项目数据集位于 djangoProject/data_set/foods,采用固定的 train/test 划分方式。每个类别对应一个独立文件夹,目录名称即类别名称,训练脚本可以直接根据目录生成类别索引。

当前包含的食物类别示例:

  • apple_pie
  • baby_back_ribs
  • baklava
  • beef_carpaccio
  • beef_tartare

这种结构非常适合图像分类任务:训练阶段通过目录读取图片和标签,预测阶段再通过 class_indices.json 将模型输出编号转换为类别名称。系统中各模型目录下的类别映射已经与当前食物数据集保持一致。

四、系统功能设计

核心功能模块:

  1. 图片上传:用户可以上传待识别的食物图片
  2. 模型选择:页面提供可用模型下拉选择,便于切换不同网络结构
  3. 图像预处理:预测脚本会对图片进行尺寸缩放、裁剪、归一化等处理
  4. 分类预测 :后端根据所选模型调用对应 predict.py 完成推理
  5. 结果展示:页面展示上传图片、预测类别、使用模型和识别置信度
  6. 数据集概览:页面同步展示数据集路径、划分方式和类别数量

页面风格围绕食物分类系统重新设计,避免通用模板化布局,整体采用左右分栏的工作台形式:左侧为上传与模型设置,右侧为结果预览区域。

五、模型训练与预测流程

训练流程

训练流程主要包括数据读取、数据增强、模型初始化、损失计算、参数更新和结果保存。项目中的 main_train.py 提供统一入口,可以根据参数选择不同模型进行训练。训练完成后,每个模型目录会保存权重文件、类别索引文件和训练过程记录。

预测流程

预测流程主要包括以下步骤:

  1. 读取用户上传图片
  2. 按模型要求进行 Resize、CenterCrop、ToTensor 和 Normalize
  3. 加载对应模型结构和权重文件
  4. 根据 class_indices.json 解析输出类别
  5. 将识别结果返回到页面

为了保证不同运行目录下都能正确加载资源,预测脚本中的类别文件和权重路径均按脚本所在目录定位,降低路径依赖带来的运行问题。

六、训练过程可视化

项目中保留了多个模型的训练结果文件。为了让文章更便于阅读,这里只选取部分模型和部分训练轮次进行趋势展示,不展开完整指标表。

从训练趋势可以看出,不同网络结构在训练初期的收敛速度和波动情况存在差异。轻量级模型通常训练更快,深层网络和 Transformer 类模型在特征表达方面更具扩展空间。实际使用时可以结合运行速度、模型体积和部署环境综合选择。

七、多维度结果分析

除了观察训练损失变化,还可以从精确率、召回率和 F1 等维度观察模型表现。热力图可以快速体现不同模型在多个维度上的相对差异,适合用于项目汇报中的横向比较。

该系统并不局限于某一个固定模型,后续可以根据数据规模和部署目标继续补充新的网络结构。对于服务器部署场景,可以优先考虑综合表现稳定的模型;对于边缘设备或普通电脑运行场景,则可以更多考虑轻量级模型。

八、运行方式

进入 djangoProject 目录后,可以通过以下命令启动系统:

python manage.py runserver

训练模型时可以使用统一入口,例如:

python main_train.py --model swin --data_set foods --epoch 10

项目支持的模型名称包括:alexnetgooglenetresnetvggvitlenetdensenetmobilenetefficientnetregnetshufflenetswin

九、项目总结

本项目将深度学习图像分类模型与 Django Web 系统结合,实现了从数据集整理、模型训练、图片上传到分类结果展示的完整流程。相比单独运行预测脚本,Web 页面可以让模型能力以更直观的方式呈现,也方便后续加入更多交互功能。

后续可以继续优化的方向包括:

  • 增加批量预测功能,支持多张图片同时上传。
  • 增加训练日志可视化页面,在系统中直接查看曲线变化。
  • 增加模型管理模块,支持动态切换权重文件。
  • 增加 Top-K 分类结果展示,让用户看到更多候选类别。
  • 优化移动端适配,让系统在不同屏幕下都有更好的展示效果。