鱼类识别系统项目实践:基于 Django 与深度学习的图像分类应用

🐟 项目简介

本项目是一个基于深度学习的鱼类图像分类识别系统,专注于解决鱼类物种自动识别问题。系统采用前后端分离的架构设计:

  • 后端服务:基于 Django 框架,提供 Web 页面渲染、图片上传接口和模型推理服务
  • 模型架构:集成多种经典 CNN 与 Transformer 模型,支持多种深度学习网络结构
  • 核心功能:实现鱼类图片的自动分类识别,准确判别不同鱼类物种

系统首页集成了模型选择、图片上传、识别结果展示和数据集类别浏览等功能模块,适合作为:

  • 🎓 课程设计:深度学习与计算机视觉课程的实践项目
  • 🔬 实验展示:模型对比与性能评估的实验平台
  • 💼 项目实践:完整的 AI 应用开发案例

🛠️ 技术栈

后端框架

  • Web 框架:Django 4.x

深度学习框架

  • 核心框架:PyTorch 2.0+
  • 扩展库:Torchvision、TorchMetrics

支持的模型架构

本项目集成了多种经典和现代的深度学习模型:

经典 CNN 模型

  • AlexNet、VGGNet、ResNet 系列
  • GoogLeNet、DenseNet、MobileNet
  • EfficientNet、RegNet、ShuffleNet

Transformer 模型

  • Vision Transformer (ViT)
  • Swin Transformer
  • DeiT(Data-efficient Image Transformers)

数据处理与可视化

  • 数据加载torchvision.datasets.ImageFolder
  • 预处理:图像缩放、随机裁剪、水平翻转、归一化
  • 可视化工具:Matplotlib、Seaborn、Plotly
  • 数据分析:Pandas、NumPy
  • 结果导出:Excel、CSV 格式训练日志

🖥️ 系统界面设计

识别结果展示

识别完成后,系统以卡片形式展示详细结果:

📊 数据集介绍

数据集结构

数据集位于项目 djangoProject/data_set 目录下,采用标准组织格式:

复制代码
data_set/
├── train/                    # 训练集
│   ├── bass/                # 鲈鱼类别
│   │   ├── bass_001.jpg
│   │   ├── bass_002.jpg
│   │   └── ...
│   ├── carp/                # 鲤鱼类别
│   └── ...
├── test/                     # 测试集
│   ├── bass/
│   ├── carp/
│   └── ...
└── en2ch.txt                # 中英文类别映射文件

类别覆盖

数据集共包含 30 种常见鱼类,涵盖:

中文名称 英文名称 样本数量
黄鱼 Yellow Croaker ~150
鲤鱼 Carp ~140
鲫鱼 Crucian Carp ~130
鲈鱼 Perch ~120
带鱼 Hairtail ~110
草鱼 Grass Carp ~100
鲑鱼 Salmon ~90
罗非鱼 Tilapia ~85
石斑鱼 Grouper ~80
多宝鱼 Turbot ~75

数据特点

  1. 多样性:包含不同角度、光照条件下的鱼类图片
  2. 标准化:所有图片统一调整为 224×224 分辨率
  3. 平衡性:各类别样本数量相对均衡
  4. 扩展性:支持轻松添加新鱼类类别

数据预处理流程

python 复制代码
# 数据预处理示例代码
from torchvision import transforms

train_transform = transforms.Compose([
    transforms.RandomResizedCrop(224),
    transforms.RandomHorizontalFlip(),
    transforms.ToTensor(),
    transforms.Normalize([0.485, 0.456, 0.406], 
                        [0.229, 0.224, 0.225])
])

test_transform = transforms.Compose([
    transforms.Resize(256),
    transforms.CenterCrop(224),
    transforms.ToTensor(),
    transforms.Normalize([0.485, 0.456, 0.406],
                        [0.229, 0.224, 0.225])
])

🔄 模型训练与识别流程

训练阶段

1. 数据准备
python 复制代码
# main_train.py - 数据加载部分
from torchvision.datasets import ImageFolder
from torch.utils.data import DataLoader

# 加载训练集和测试集
train_dataset = ImageFolder('data_set/train', transform=train_transform)
test_dataset = ImageFolder('data_set/test', transform=test_transform)

# 创建数据加载器
train_loader = DataLoader(train_dataset, batch_size=32, shuffle=True)
test_loader = DataLoader(test_dataset, batch_size=32, shuffle=False)
2. 模型配置

项目提供统一的训练入口 main_train.py,支持通过命令行参数切换不同模型:

bash 复制代码
# 训练 ResNet50
python main_train.py --model resnet50 --epochs 50 --lr 0.001

# 训练 Vision Transformer
python main_train.py --model vit --epochs 100 --lr 0.0001

# 训练 MobileNetV3
python main_train.py --model mobilenetv3 --epochs 30 --lr 0.01
3. 智能模型过滤

系统自动检测可用的模型权重文件,只向用户展示:

  • ✅ 已完成训练的模型
  • ✅ 权重文件完整的模型
  • ✅ 通过基础测试的模型

避免用户选择未训练或损坏的模型,减少运行时错误。

📈 可视化分析与模型评估

数据分布分析

1. 类别样本分布

通过统计分析发现,不同鱼类类别的样本数量存在差异:

python 复制代码
import pandas as pd
import matplotlib.pyplot as plt

# 统计各类别样本数量
class_counts = {}
for class_name in train_dataset.classes:
    class_counts[class_name] = len(train_dataset.class_to_idx[class_name])

# 可视化展示
plt.figure(figsize=(12, 6))
plt.bar(range(len(class_counts)), list(class_counts.values()))
plt.xlabel('类别索引')
plt.ylabel('样本数量')
plt.title('训练集类别分布')
plt.show()
2. 数据不平衡处理策略

针对样本不均衡问题,我们采用以下策略:

  • 过采样:对少数类别进行数据增强
  • 类别权重:在损失函数中为少数类别分配更高权重
  • 分层采样:确保每个 batch 包含所有类别的样本

训练过程可视化

1. 训练趋势图
python 复制代码
# 训练日志分析
import pandas as pd

# 读取训练日志
log_df = pd.read_csv('training_log.csv')

# 绘制训练曲线
fig, axes = plt.subplots(2, 2, figsize=(15, 10))

# 训练损失
axes[0, 0].plot(log_df['epoch'], log_df['train_loss'])
axes[0, 0].set_title('训练损失变化')
axes[0, 0].set_xlabel('Epoch')
axes[0, 0].set_ylabel('Loss')

# 验证准确率
axes[0, 1].plot(log_df['epoch'], log_df['val_accuracy'])
axes[0, 1].set_title('验证准确率')
axes[0, 1].set_xlabel('Epoch')
axes[0, 1].set_ylabel('Accuracy')

# 学习率变化
axes[1, 0].plot(log_df['epoch'], log_df['learning_rate'])
axes[1, 0].set_title('学习率调度')
axes[1, 0].set_xlabel('Epoch')
axes[1, 0].set_ylabel('Learning Rate')

# 模型对比
models = ['ResNet50', 'MobileNetV3', 'ViT']
accuracies = [0.92, 0.88, 0.94]
axes[1, 1].bar(models, accuracies)
axes[1, 1].set_title('不同模型准确率对比')
axes[1, 1].set_ylabel('Accuracy')

plt.tight_layout()
plt.show()
2. 关键指标分析
  • 收敛速度:ResNet 系列收敛最快,Transformer 需要更多 epoch
  • 稳定性:CNN 模型训练更稳定,ViT 需要精细调参
  • 过拟合:通过早停、Dropout、权重衰减控制

项目总结与优化方向

该系统完成了从数据集组织、模型训练、权重加载到 Web 端识别展示的完整闭环。后续可以继续从三个方向优化:一是补充更多复杂背景、不同角度和不同光照条件下的鱼类图片;二是加入更细致的错误样本分析和混淆类别对比;三是完善模型权重管理、历史识别记录和批量预测功能,让系统更适合实际部署和演示。