学弟的毕设是水果分拣,两百多张图,三种类别。他上来就搭 ResNet,训练三十轮,验证集准确率卡在 0.46 不动,来找我看日志。

打开代码一看,图片按原图送进去,尺寸从 320 到 1200 不等,也没做归一化。这种输入,换什么网络都白搭。

先分清任务,别一上来就堆深度

图像识别大致分三类:分类判断是什么,检测框出在哪,分割抠出轮廓。水果分拣只有分类需求,却套了检测框架,多出的标注工作量全浪费在框坐标上。任务选错,后面调参都是在补窟窿。

传统算法在样本少时更稳

两百张图这个量级,HOG 加 SVM、LBP 加 KNN 往往能到 0.85 以上,跑在纯 CPU 上,训练几分钟。SIFT 和 ORB 适合做特征匹配,比如比对两张图的同一物体,不适合直接当分类器,别被教程带偏。

深度模型的输入必须统一

  • 统一缩放到 224x224 或 256x256,短边缩放加中心裁剪
  • 像素归一化,均值方差按 ImageNet 那组参数来
  • 训练集做随机翻转和亮度扰动,验证集只做缩放

数据划分出错是最常见的假高准确率

他同一张图连拍五张,随机打散后分到训练和验证两边,模型记住了背景的桌面纹理,准确率看着漂亮,换一个桌面就崩。按拍摄批次划分,同一批只进一边,才是真实水平。

报错和调参的具体做法

训练时出现 loss 变 nan,先把学习率从 0.01 降到 1e-4,检查标签是不是从 0 开始。验证集准确率一直不动,看梯度是不是被冻结层挡住了,冻结层数先只留最后两层。

评估指标别看单一准确率

三类样本不均衡时,准确率会被多数类带高。打印混淆矩阵,看每一类的召回,再算宏平均 F1。坏果占比不到一成,全判成好果也能有 0.9 的准确率,这种模型上线等于没有。训练日志里每轮记 loss 和 F1,曲线开始分叉就是过拟合,尽早停。

后来他换成 HOG 特征加线性 SVM,准确率 0.89,答辩讲得清楚,比硬堆网络实在。样本量不够时,算法越简单越经得起追问。