资讯详情

PyTorch+VGG16珊瑚识别:从环境配置到界面预测完整指南

📅 2026/10/10 17:21:35 | 华诺云谱 👁 阅读
PyTorch+VGG16珊瑚识别:从环境配置到界面预测完整指南
简介面向深度学习和图像识别初学者的一套VGG卷积神经网络珊瑚种类识别项目完全基于PyTorch实现。代码覆盖从数据集生成、CNN模型训练到PyQt界面展示的完整流程压缩为8个文件包含3个Python脚本、3张分类提示图片、1份环境依赖清单和1份说明文档整体仅213KB轻量易部署。三个Python脚本功能划分清晰分别负责数据集划分、模型训练和可视化界面交互配套说明文档逐章讲解环境配置与运行要点requirement.txt则列出所需库及版本。资源不含数据集图片需要使用者自行搜集珊瑚图片并按类别放入对应文件夹这样反而便于灵活调整分类或替换为自己的图片集。所有代码均带逐行中文注释配合说明文档对刚接触PyTorch或CNN的开发者相当友好。目前已有70人学习下载适合希望通过实际项目理解图像分类、数据集组织与模型训练流程的入门者。1. VGG与CNN珊瑚识别一个不含数据集图片却能跑通的PyTorch项目下载资源时最怕遇到什么我猜是代码一跑全是报错、数据集十几个G压在硬盘里的情况。这套基于 VGG CNN 的珊瑚种类识别压缩包走的是另一个方向——它不含数据集图片却把三个 py 文件的每一行都写上了中文注释从 01生成txt.py 生成训练清单、02CNN训练数据集.py 跑 VGG16 分类训练到 03pyqt界面.py 加载权重做图形界面预测链路完整闭环。适合两类人一是用 PyTorch 入门 CNN 分类的初学者二是手里正好攒了一批珊瑚照片、想快速做成小型识别工具的从业者。用的时候不需要改模型结构只需建好三个类别文件夹、把图片放进去然后依次跑两个训练脚本就能看到分类结果。2. 环境与数据准备配好 PyTorch 1.7.1 之后再造三类珊瑚文件夹在这个压缩包里requirement.txt 是跟运行环境最直接相关的东西。它不会替你把 Python 装好只会把项目跑起来需要的依赖名和版本写清楚。拿到压缩包的第一件事不是急着打开 02CNN训练数据集.py而是先建一个干净的虚拟环境、装对 PyTorch 版本再把数据集文件夹搭起来。这一步如果省了后面所有报错都会变得很难排查。2.1 Anaconda 里装 PyTorch为什么建议 Python 3.7 1.7.1项目的说明写得很直白环境需要自行安装推荐先装 Anaconda再在里面装 Python 3.7 或 3.8PyTorch 推荐 1.7.1 或 1.8.1。我照着这个组合复现过确实是最稳的。原因不复杂torchvision 里的 vgg16 预训练权重在 1.7.x/1.8.x 这一代模型 API 非常稳定而 2.x 之后很多旧写法要么报警告要么直接废弃对于初学者来说没必要冒这个险。创建虚拟环境的命令我一般这样写conda create -n coral python3.8 conda activate coral pip install torch1.7.1 torchvision0.8.2 pip install -r requirement.txttorch 和 torchvision 的版本要配套1.7.1 对应 torchvision 0.8.21.8.1 对应 0.9.1混搭会出现 import 时找不到 vgg16 的怪事。如果机器只有 CPU建议到 PyTorch 官网按自己的操作系统选 CPU 版本的安装命令不要直接抄这条这个珊瑚分类项目的训练量不大CPU 完全跑得动。如果有 NVIDIA 显卡再按 CUDA 版本挑对应的安装命令。装完验证一下这一步的重要性常被忽略python -c import torch, torchvision; print(torch.__version__, torchvision.__version__)能正常输出版本号就说明核心依赖到位了。压缩包里那份说明文档.docx 里写了完整的环境安装步骤比网上零散教程更贴合这个项目遇到问题先翻它。我见过不少人在安装时图省事直接 pip install torch 装了最新的 2.x结果跑 02CNN训练数据集.py 时在 model.load_state_dict 附近遇到各种 key 不匹配的报错——不是代码的问题是版本墙。2.2 数据集文件夹结构三类珊瑚与自定义扩展这个资源不含数据集图片下载后需要自己往文件夹里放图。它的设计很灵活数据集目录下每个子文件夹就是一个类别类别不固定想加分类就新建文件夹。目录结构长这样data/ ├── 脑珊瑚/ │ ├── 脑珊瑚 1.jpg │ └── ... ├── 软珊瑚/ │ ├── 软珊瑚 1.jpg │ └── ... └── 扇形珊瑚/ ├── 扇形珊瑚 1.jpg └── ...每个类别文件夹里自带一张提示图告诉你图片应该放在哪里。跑训练前把搜集到的图片直接丢进对应文件夹就好。图片格式上jpg、jpeg、png 一般都能被 torchvision 读取但我建议统一转成 jpg省得某些老版本解码库在 png 上出幺蛾子。图片数量是决定这个小项目能不能用的关键因素。每类低于 30 张时VGG16 微调基本学不到区分性特征常见做法是每类凑到 100~300 张不用特别多但要保证每张图里珊瑚主体明显、背景不过于杂乱。越接近你真实使用场景越好因为最后测试时你也会拿这类图去测。水下拍的珊瑚照片普遍偏蓝训练集里最好也放一些同样色偏的图否则模型学到的可能是颜色分布而不是珊瑚形状。2.3 01生成txt.py先把图片清单导出来01生成txt.py 在整个流程里承担的是登记员角色。它扫描数据集文件夹把所有图片的路径和所属类别写成一个 txt02CNN训练数据集.py 再读取这个 txt 来训练。这种先清单、后训练的组织方式好处是训练脚本不直接依赖文件夹结构后面你增删图片只需要重新跑一次 01不用动训练代码。常见的实现逻辑是这样的import os data_root data classes [脑珊瑚, 软珊瑚, 扇形珊瑚] with open(train.txt, w, encodingutf-8) as f: for label, cls in enumerate(classes): folder os.path.join(data_root, cls) for img in os.listdir(folder): if img.lower().endswith((.jpg, .jpeg, .png)): f.write(f{os.path.join(folder, img)} {label}\n)逻辑说明外层循环按类别顺序给每类一个从 0 开始的数字标签内层循环遍历该文件夹下所有图片把图片路径 空格 类别数字逐行写进 train.txt。02 脚本读这个文件时会按空格把路径和标签拆开所以路径里不要有空格文件夹命名建议统一用中文或英文中间不要穿插空格。参数说明label 必须从 0 开始连续编号否则后面 CrossEntropyLoss 会把标签当成索引去查张量越界就是一排红色报错。如果你新建了第四个类别记得把 classes 列表补上顺序和文件夹目录保持一致。txt 生成后先打开看一眼路径能对应上真实文件就说明没问题。提示在 Windows 上生成时路径分隔符会被写成反斜杠。建议生成时统一把 \ 替换成 /避免后续 open 时匹配不到文件。3. 读懂三个 py 文件从 01 生成 txt 到 02 训练到 03 界面推理珊瑚识别这个任务本身不复杂但三个 py 文件把完整流程串了一遍01 负责把图片整理成清单02 负责用 VGG16 做迁移学习训练并保存权重03 用图形界面加载权重做单张图片预测。这一章把后两个文件讲透你拿到代码后就不需要猜它们在干什么了。3.1 为什么选 VGG16 而不是从零搭一个 CNN先说模型选型。VGG16 是 2014 年提出的结构放到今天看并不新但在小规模分类任务里依然是性价比很高的选择结构规整5 段卷积 3 层全连接卷积层全部 3x3、在 ImageNet 上预训练的权重可以直接迁移、torchvision 里一行代码就能加载。相比之下从零搭一个三层 CNN 虽然也能跑但要在这种小数据集上达到可用准确率需要自己调的结构细节远比想象的多。常见做法是加载预训练权重后把最后的全连接分类层从 1000 类改成自己的类别数import torchvision.models as models model models.vgg16(pretrainedTrue) num_classes 3 model.classifier[6] torch.nn.Linear(4096, num_classes)迁移学习的价值在于前面几层卷积学到的边缘、纹理特征和珊瑚识别是通用的真正需要从头学的是最后几层对类别区分敏感的映射关系。第一次运行时会自动下载权重到用户目录下的 .cache/torch 文件夹网络慢的话建议先手动把权重文件放进去免得卡在下载那一步。3.2 02CNN训练数据集.py 的核心流程02CNN训练数据集.py 是整套代码里的主力。它的流程可以拆成五步读 txt 清单、做图像预处理、构造 DataLoader、搭 VGG 模型迁移学习、训练并保存权重。我按常见写法还原一下核心部分方便你看懂原代码每一段在干什么from torch.utils.data import Dataset, DataLoader from torchvision import transforms from PIL import Image transform transforms.Compose([ transforms.Resize((224, 224)), transforms.RandomHorizontalFlip(), transforms.ToTensor(), transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) ]) class CoralDataset(Dataset): def __init__(self, txt_path): self.lines open(txt_path, encodingutf-8).readlines() def __len__(self): return len(self.lines) def __getitem__(self, idx): path, label self.lines[idx].strip().split( , 1) img Image.open(path).convert(RGB) return transform(img), int(label) dataset CoralDataset(train.txt) loader DataLoader(dataset, batch_size16, shuffleTrue, num_workers0)逻辑说明Resize 到 224x224 是因为 VGG 输入层固定是这个尺寸RandomHorizontalFlip 是一种零成本的数据增强珊瑚图片水平翻转后类别语义不变能缓解小样本过拟合Normalize 用的均值和方差是 ImageNet 标准值迁移学习场景下不要随意改。Dataset 里每一行按空格拆成路径和标签注意原 txt 里如果有中文路径整个读写过程要统一用 utf-8别让编码问题卡在数据加载这一步。参数说明batch_size 设 16 在 CPU 上也能跑显存 4G 以上的显卡可以直接上 32num_workers 在 Windows 上容易报 DataLoader worker 错误建议设 0。epochs 这个珊瑚项目一般 20~50 轮就明显收敛学习率用 0.0001优化器用 Adam 或带动量的 SGD 都行关键是别迷信大学习率本来数据量就小步子迈太大直接震荡。import torch import torch.nn as nn from torchvision import models model models.vgg16(pretrainedTrue) model.classifier[6] nn.Linear(4096, num_classes) optimizer torch.optim.Adam(model.parameters(), lr0.0001) criterion nn.CrossEntropyLoss() for epoch in range(20): for images, labels in loader: optimizer.zero_grad() outputs model(images) loss criterion(outputs, labels) loss.backward() optimizer.step() torch.save(model.state_dict(), vgg_coral.pth)这段是训练主循环的常见结构每轮遍历所有 batch前向传播算交叉熵损失反向传播更新权重一轮结束后把模型权重保存成 .pth 文件。跑完会在代码目录下留下 vgg_coral.pth这个文件就是后面 03 界面要加载的东西。3.3 03pyqt界面.py训练完用图形界面做预测训练结束后再让人在命令行里敲推理脚本很别扭。03pyqt界面.py 把这一步做成了图形界面选一张图片点击识别界面返回预测类别和置信度。如果运行 03 时提示 ModuleNotFoundError: PyQt5直接 pip install pyqt5 补上就好。核心推理代码不复杂常见写法是这样import torch from torchvision import transforms from PIL import Image model.load_state_dict(torch.load(vgg_coral.pth, map_locationcpu)) model.eval() img Image.open(test.jpg).convert(RGB) img transform(img).unsqueeze(0) with torch.no_grad(): out model(img) prob torch.softmax(out, dim1) _, pred torch.max(prob, 1)逻辑说明加载 .pth 权重后必须调用 model.eval() 切到推理模式否则 Dropout 层会继续生效同一个输入每次预测结果可能不一样。softmax 把输出转成概率分布取概率最大的索引作为预测类别索引对应 01 脚本里 classes 列表的顺序。用界面测试时如果发现某个类别识别率偏低回到 2.2 补图重训这是最有效的优化路径。4. 避坑记录珊瑚识别训练中常见的五个翻车点这类项目骨架简单但细节翻车率很高。珊瑚识别跟普通物体分类还不太一样水下拍摄条件差、光照偏色严重、同类珊瑚在不同生长期外观差异大这些都会放大训练时的小毛病。我把反复见过的问题按现象、原因、解决三个维度整理成五条基本覆盖了初学者最容易踩的坑。4.1 坑一每类只有十几张图就开训验证集准确率不到 60%现象训练 loss 降得很快但验证集准确率只有五成多跟随机猜差不多。原因每类样本太少。VGG16 全连接层参数量接近一亿十几张图连全连接层都喂不饱模型直接背下了训练集里仅有的几张图遇到没见过的图就瞎猜。解决回 2.2 补数据每类至少 100 张。如果实在凑不够优先把 epoch 降到 20 以内、增加 RandomHorizontalFlip 这类数据增强或者把模型换小一号的 vgg11。不要指望调参能创造数据这是血泪经验。4.2 坑二图片尺寸不一致训练中途直接报 size mismatch现象训练前几步正常跑着跑着报 RuntimeError: size mismatch或者出现 tensor shape 对不上的错误。原因有的图片长宽比差距太大虽然 Resize 统一到了 224x224但如果你额外写了等比缩放填充的逻辑batch 内张量尺寸可能不一致DataLoader 组合 batch 时直接翻车。解决所有图片统一走 transform强行缩放到 224x224 是最稳妥的。除非你明确知道自己在做什么否则不要用等比缩放加填充的写法。我一般会把 transform 定义成全局变量保证训练和推理共用同一个预处理省得两边不一致。4.3 坑三PyTorch 装成 2.x老代码有些 API 直接失效现象import 正常但跑到 model.load_state_dict 时抛 unexpected key 之类的报错或者 vgg16 加载时提示 weights 参数用法变了。原因torchvision 2.x 里 vgg 权重的组织和旧版不同旧权重文件和旧代码配新版本经常不对付。这个项目的三个 py 文件是按 1.7.1/1.8.1 写的装 2.x 属于自己给自己挖坑。解决最省事的办法是严格按 requirement.txt 装回 1.7.1 或 1.8.1。已经装了 2.x 也不用反复折腾conda 新建一个环境重装更干净。想保留 2.x 当日常用的可以再建一个 coral 环境专门跑这个项目。4.4 坑四01 生成的 txt 里路径带反斜杠DataLoader 找不到图现象训练脚本读取 train.txt 时报 FileNotFoundError手动去文件管理器里找又能找到那个文件。原因Windows 下 os.path.join 生成的是反斜杠路径写进 txt 后反斜杠被当成转义符的一部分PIL 打开时拼接出来的路径是错的。解决生成 txt 时统一把路径里的 \ 替换成 /或在 02 脚本读文件时做一次 replace。这个细节我在 2.3 里提醒过真遇上了也别慌改完重跑 01 就好。注意 txt 文件本身要存成 utf-8用记事本改容易存成 GBK反而多出编码问题。4.5 坑五界面预测永远输出同一个类别现象03 界面能打开、图片也能选但无论换哪张图结果全是同一个类置信度还很高。原因最常见的是模型加载后没调用 model.eval()Dropout 层还在生效另一种可能是预测时的预处理和训练时不一致比如没缩放到 224 或者没做归一化输入分布整体偏移模型只会输出它最熟悉的那个类别。解决模型加载后加 model.eval()预处理严格复用 3.2 里的 transform 定义。我遇到过一次是某张图片被 PIL 读成了 RGBA 四通道输入维度对不上最后在打开图片后强制 convert(RGB) 解决。这个坑不算大但排查起来很恼人建议推理代码里所有 Image.open 后面都带上 convert(RGB)。5. 验证训练结果的三个动作准确率曲线、界面测试与增量换类训练完成不是终点我习惯做三个动作确认这份资源真的可用你也可以照着走一遍。第一个动作是看准确率和 loss 曲线。02 脚本里每轮会打印训练 loss多数版本同时打印验证准确率。别只看最后一行的数字要观察趋势loss 稳步下降、准确率逐步抬升说明训练正常loss 降了但准确率纹丝不动多半是数据问题回第 4 章坑一处理。第二个动作是用 03pyqt界面.py 做一次独立测试。挑几张训练时没见过的、背景干扰比较大的珊瑚照片点开界面跑预测。这一步能同时验证权重文件是否完整、预处理是否一致、类别顺序是否对得上。如果单张预测结果和预期不符优先怀疑 txt 生成时类别顺序和界面显示顺序不一致。第三个动作是增量换类——把这套代码从三类扩展到自己关心的类别上。步骤很简单在 data 目录下新建文件夹放图片修改 01 脚本里的 classes 列表重跑 01 和 02。如果你只想微调不想从头训可以在 02 脚本里把加载预训练权重的部分改成加载上一次保存的 .pth并把学习率调小到 0.00005这样新类别的数据量不用很大也能收敛。最后交代一个我的习惯每次拿到这类入门项目我都会在开始训练前先写好一个二十行的验证脚本确定权重能加载、单张图能出结果再回去调参。省下的返工时间比写那段脚本的时间多得多这套 VGG 珊瑚识别资源尤其适合这种流程——先跑通再优化最后扩展类别。希望帮到你。本文还有配套的精品资源点击获取
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑