
简介这份资源是面向计算机相关专业学生的数字图像处理课程设计完整项目以CUB-200-2011鸟类数据集为核心实现图像细粒度分类任务适合正在准备期末大作业或需要项目实战练习的学习者参考。项目作者以97分成绩完成代码经过严格调试下载后可直接运行省去从零搭建的繁琐过程。压缩包共14个文件约4.76MB包含4个Python源码文件、3份PDF讲解与报告、2个TXT说明、1个PPT演示文稿、1个Word文档、1个迁移学习模型文件、1个Markdown说明及1张示意图覆盖从数据预处理、模型训练到结果展示的完整链路。其中Python脚本涉及数据集构建与迁移学习实现PDF与PPT可用于理解细粒度分类原理和撰写实验报告模型文件则方便直接复现结果。目前已有280人学习下载适合希望快速掌握细粒度分类流程、完成高质量课程作业的读者借鉴。1. 从一次答辩被追问说起这套 CUB-200-2011 细粒度分类作业到底交付了什么很多数字图像处理大作业最后都停在「调个库跑通 MNIST」的水平答辩时老师一句「你这和图像处理有什么关系」就露馅了。这套资源走的是另一条路用 CUB-200-2011 做细粒度分类也就是在 200 种鸟里区分具体是哪一种类别间差异极小必须靠局部纹理和部件特征才能分开天然贴合数字图像处理里特征提取、图像增强、频域分析这些考点。压缩包里同时给了两条技术路线——迁移学习和 BCNN 双线性 CNN外加一份 97 分的讲解 PDF、答辩 slides、可解释性文档和完整源码。适合正在做课程设计、期末大作业或者想找一个能跑通、能讲清楚原理的细粒度分类实战项目的人。下面按「资源是什么 → 怎么跑 → 坑在哪 → 怎么讲出高分」的顺序拆开。2. 资源结构与两条技术路线迁移学习 vs BCNN 怎么选先把包里的东西按用途分个类不然打开一堆文件容易懵。核心可执行代码其实就三块transfer.py负责迁移学习路线bcnn.py负责双线性 CNN 路线create_h5_dataset.py负责把原始图片转成 HDF5 数据集。cub_util.py是公共工具处理标签映射、数据划分这些杂活。文档侧有数字图像处理大作业图像细粒度分类CUB-200-2011 细分类讲解.pdf讲原理DIP Project - Final Report.pdf是实验报告Interpret_CUB_200_2011.docx讲可解释性大作业布置.pdf是原始题目要求。两个 README 分别对应两条路线。2.1 迁移学习路线为什么用预训练模型打底CUB-200-2011 只有约 1.2 万张图200 类平均每类 30 张训练图。这个数据量从零训练一个 CNN 必然过拟合所以迁移学习是首选。transfer.py的思路是拿在 ImageNet 上预训练好的骨干网络常见做法是 ResNet 或 VGG冻结前面的卷积层做特征提取只重训最后的全连接分类层把输出从 1000 类改成 200 类。这样既利用了 ImageNet 学到的通用纹理和边缘特征又用很小的学习率微调收敛快、显存占用低是课程作业里性价比最高的方案。选它的理由很直接训练轮数少、单卡就能跑、结果稳定。缺点是精度上限受限于骨干网络细粒度任务里那些「喙的形状」「翅膀纹理」的细微差异靠全局池化后的特征容易被抹平。所以如果老师对精度有要求就得看第二条路线。2.2 BCNN 路线双线性池化为什么能拉开细粒度差距BCNN 的核心是双线性池化Bilinear Pooling。普通 CNN 在最后做全局平均池化把空间信息压成一个向量BCNN 则取两个特征图做外积得到一个能保留二阶统计量的表示。对细粒度分类来说二阶信息恰好能捕捉「特征和特征之间的共现关系」比如某种鸟的喙色和眼周纹路的组合这正是区分近缘物种的关键。bcnn.py里通常用两个并行的卷积分支各自输出 C×H×W 的特征图做外积后得到 C×C 的矩阵再池化、开方、归一化最后接全连接分类。代价是参数量和显存上升明显训练更慢但精度通常比单纯迁移学习高一截。两条路线的取舍可以看下面这张表。维度迁移学习 transfer.pyBCNN bcnn.py数据需求低万级即可中需要更多增强显存占用低高外积维度大训练速度快慢精度上限中高适合场景赶时间、单卡冲高分、有 GPU2.3 数据准备create_h5_dataset.py 做了什么原始 CUB-200-2011 是散落的 jpg 加几个 txt 标注文件直接读盘训练 IO 会成为瓶颈。create_h5_dataset.py把所有图片按固定尺寸常见 224×224读进来连同标签一起写进 HDF5 文件训练时一次性加载到内存或顺序读速度提升明显。这一步还顺带做了标签到 0-199 的映射避免类别索引错位。# create_h5_dataset.py 核心逻辑示意 import h5py import numpy as np from PIL import Image def build_h5(image_list, label_list, out_path, size(224, 224)): # 预分配数据集避免逐条 append 造成碎片 with h5py.File(out_path, w) as f: x f.create_dataset(images, (len(image_list), size[0], size[1], 3), dtypenp.uint8) y f.create_dataset(labels, (len(label_list),), dtypenp.int32) for i, (img_path, label) in enumerate(zip(image_list, label_list)): img Image.open(img_path).convert(RGB).resize(size) x[i] np.array(img) y[i] label逻辑说明用h5py预分配固定形状的数据集比逐条写入快很多图片统一转 RGB 再 resize防止灰度图混进来导致通道数不一致。参数上size要和后面模型输入对齐迁移学习常用 224BCNN 有时用 448 保留更多细节改这里就要同步改训练脚本的输入尺寸。3. 从零跑通环境、训练命令与参数怎么设拿到包别急着python transfer.py先把环境和数据路径理顺否则报错能让你怀疑人生。这一章按实际执行顺序走一遍。3.1 环境依赖与版本对齐常见做法是建一个独立虚拟环境装 PyTorch、torchvision、h5py、Pillow、numpy、matplotlib。版本上最容易翻车的是 PyTorch 和 CUDA 的匹配以及 torchvision 和 PyTorch 的对应关系。如果机器没有 GPU代码里.cuda()的地方要改成.to(device)并设devicecpu但 BCNN 在 CPU 上基本跑不动建议至少一块入门级显卡。# 建环境并装依赖版本按自己 CUDA 情况调整 conda create -n cub python3.8 -y conda activate cub pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118 pip install h5py pillow numpy matplotlib scikit-learn逻辑说明单独建环境是为了避免和系统里其他项目的 torch 版本打架。--index-url指定官方 wheel 源按自己显卡驱动对应的 CUDA 版本换cu118或cu121。装完用python -c import torch; print(torch.cuda.is_available())验证返回 True 才算通。3.2 生成 HDF5 数据集先确认 CUB-200-2011 原始数据放在哪通常解压后是CUB_200_2011/images/加train_test_split.txt、image_class_labels.txt这些。改create_h5_dataset.py里的路径变量指向你的实际目录然后运行。python create_h5_dataset.py \ --data_root ./CUB_200_2011 \ --out_train ./cub_train.h5 \ --out_test ./cub_test.h5逻辑说明--data_root是原始数据集根目录脚本会去读images和标注 txt--out_train、--out_test分别输出训练和测试的 HDF5。参数名以你包里的实际 argparse 为准如果脚本用的是硬编码路径就手动改那几行常量。跑完检查两个 h5 文件大小是否合理太小说明图片没读全。3.3 迁移学习训练与关键参数transfer.py里几个参数决定成败学习率、batch size、冻结层数、训练轮数。微调分类层时学习率一般设 1e-3 到 1e-4如果解冻部分卷积层一起训要降到 1e-5 级别否则预训练权重会被冲垮。python transfer.py \ --h5 ./cub_train.h5 \ --arch resnet50 \ --epochs 30 \ --lr 1e-3 \ --batch_size 32 \ --freeze_backbone逻辑说明--arch选骨干网络resnet50 是精度和速度的平衡点--freeze_backbone表示冻结卷积层只训分类头赶时间就开想冲精度就去掉并调小学习率--epochs 30配合早停一般够收敛。训练时盯 loss 曲线如果训练 loss 降但验证 loss 升就是过拟合加数据增强或减轮数。3.4 BCNN 训练与显存控制BCNN 的 batch size 要显著调小因为双线性外积产生的特征维度是 C×CC 通常几百到上千显存吃得很凶。常见做法是 batch size 设 8 或 16配合梯度累积模拟大 batch。python bcnn.py \ --h5 ./cub_train.h5 \ --backbone vgg16 \ --epochs 60 \ --lr 1e-4 \ --batch_size 8逻辑说明--backbone vgg16是 BCNN 论文里的经典配置两个分支共享或独立都可以--batch_size 8是显存妥协的结果如果爆显存就继续降到 4--lr 1e-4比迁移学习更小因为 BCNN 参数更多、更敏感。训练时间通常是迁移学习的好几倍做好心理准备。4. 避坑与排查跑这套代码最容易翻车的五个地方这一章是血泪经验集中区基本都是我实际跑细粒度分类时踩过的。现象一报错KeyError或标签越界。原因CUB 的类别标签在原始 txt 里是 1 到 200而 PyTorch 的 CrossEntropyLoss 要求 0 到 199。解决在cub_util.py或数据加载处统一做label - 1并检查 HDF5 里存的标签范围。现象二训练 loss 一直不降准确率卡在 0.5%。原因图片归一化参数和预训练模型不匹配或者数据增强把关键纹理破坏了。解决迁移学习要用 ImageNet 的均值和方差做归一化增强别用太激进的随机裁剪细粒度任务里裁掉关键部位就废了。现象三BCNN 一跑就 CUDA out of memory。原因双线性外积维度爆炸加上默认 batch size 太大。解决降 batch size、用torch.cuda.empty_cache()、或者把外积后的特征先做降维再进全连接。现象四验证集准确率远高于测试集。原因数据划分时把训练图漏进了验证或者用了测试集调参。解决严格按官方train_test_split.txt划分验证集从训练集里再切别碰测试集。现象五换了自己的图片预测结果全错。原因预处理流程和训练时不一致比如训练 resize 到 224 但预测没做。解决把预处理封装成一个函数训练和推理共用杜绝两套逻辑。提示每次改完参数先跑 2 个 epoch 看 loss 趋势别一上来就 60 轮省得白等几小时。5. 把 97 分讲出来可解释性、报告与答辩技巧代码跑通只是及格线这套资源能拿 97 分关键在Interpret_CUB_200_2011.docx和两份 PDF 报告里体现的分析深度。答辩时老师最想听的不是「我用了 ResNet」而是「我为什么这么选、结果说明了什么」。5.1 用可解释性证明模型真的在看鸟细粒度分类最容易被质疑「你是不是靠背景蒙对的」。Interpret_CUB_200_2011.docx里通常用类激活图CAM或注意力可视化把模型关注的区域画出来。如果热力图集中在鸟的头部、喙、翅膀说明模型学到了判别性部件如果集中在背景就得反思数据增强或裁剪策略。这一步在报告里放几张对比图说服力比一堆准确率数字强得多。# CAM 可视化核心思路 from pytorch_grad_cam import GradCAM from pytorch_grad_cam.utils.image import show_cam_on_image target_layers [model.layer4[-1]] # 取最后一个卷积块 cam GradCAM(modelmodel, target_layerstarget_layers) grayscale_cam cam(input_tensorimg_tensor)[0] visualization show_cam_on_image(rgb_img, grayscale_cam, use_rgbTrue)逻辑说明target_layers选最后一个卷积块因为那里保留空间信息又语义最强GradCAM用梯度加权得到热力图show_cam_on_image把热力图叠回原图。参数上img_tensor必须和训练时同样的预处理否则热力图会偏。5.2 报告里该放什么、怎么对比DIP Project - Final Report.pdf的结构值得抄先讲细粒度分类的难点和 CUB 数据集特点再分别介绍迁移学习和 BCNN 的原理然后给实验设置、超参表、两条路线的准确率对比、混淆矩阵、可解释性分析最后讨论失败案例。对比表是加分项把两条路线的 top-1、top-5 准确率、训练时间、显存占用列清楚再分析 BCNN 高在哪、代价是什么。5.3 答辩时怎么接住追问老师常问三个问题为什么不用从零训练、BCNN 的双线性到底解决了什么、你的模型错在哪。第一个用数据量回答第二个用二阶统计量捕捉部件共现回答第三个拿混淆矩阵里最容易混的几对鸟举例说明它们喙形或羽色接近模型确实难分。把大作业布置.pdf的要求逐条对照确保每个评分点都有对应内容。从那以后我每次交课程项目都会先把可解释性图跑出来再写报告因为一张能说明模型在看哪里的热力图比十页公式都管用。希望帮到你。本文还有配套的精品资源点击获取