这个项目是拿AI跑的,仅供学习使用。

0x00 背景
图像分类是计算机视觉领域的“Hello World”。在这个项目中,我的目标是区分猫和狗的图片。
为什么不自己从零开始训练一个网络?因为卷积神经网络(CNN)通常需要海量的数据和强大的算力。作为替代方案,我们采用了迁移学习(Transfer Learning)。
骨干网络:选用了 ResNet18。这是一个非常经典的轻量级深度残差网络,最初在 ImageNet 大赛中大放异彩。
策略:我们冻结了网络前半部分的预训练权重(Feature Extractor),只替换并训练最后的全连接层(Classifier)。这样既利用了大模型提取特征的能力,又大大缩短了训练时间(我的GPU并不强劲)。
0x01 环境配置
项目在 Arch Linux 环境下开发,但在环境配置阶段遇到了一个典型的兼容性问题:
Python 3.14 与 PyQt6 的冲突
由于 Arch 滚动更新机制,系统中的 Python 版本较新(3.14),而 PyQt6 官方尚未发布适配 Python 3.14 的预编译包,导致安装PyQt6时报了No matching distribution found。我果断放弃了3.14的venv,安装了3.12版本的Python成功解决问题。
0x02 模型训练
我使用 torchvision的 ImageFolder加载数据集,并应用了一系列数据增强和标准化变换。
训练日志节选:
[epoch 1] ★ New best val_acc=94.38% saved
[epoch 10] ★ New best val_acc=99.00% saved
最终,模型在验证集上达到了 99.00% 的最佳准确率,最终的测试集准确率为 98.12%。对于这样一个轻量级模型来说,这是一个相当不错的成绩。
0x03 预测程序图形化设计
为了让模型真正“可用”,我编写了基于 PyQt6 的图形界面。为了提升视觉体验,放弃了传统的原生控件风格,采用了深色主题 (Dark Mode) 设计。
界面核心组件:
- 左侧:图片预览区
- 使用
QLabel动态显示用户选择的图片。 - 添加了圆角和边框样式,提升质感。
- 使用
- 右侧:控制与数据区
- 模型加载:通过
QPushButton触发文件选择器,加载best_catdog.pth。 - 自定义概率条 (PredictionBar):重写
QProgressBar样式,做出了类似游戏 UI 的动态渐变进度条。猫的概率显示为暖橙色 (#FF9800),狗的概率显示为科技蓝 (#2196F3)。 - Matplotlib 数据可视化:将 Matplotlib 图表直接嵌入 PyQt6 窗口。每次预测后,柱状图会动态刷新,直观展示各类别的置信度。
- 模型加载:通过
本文采用 CC BY-NC-SA 4.0 国际许可协议进行许可。
转载请注明作者及原文链接,并遵循相同方式共享原则。
链接:
发表回复