深度学习------图像分类项目
目录
今天学图像分类项目,才算把之前零散的知识点串了起来 —— 原来图像分类不只是 “把猫和狗分开” 这么简单,还分不同难度的 “境界”;更重要的是,光训练出模型没用,得会用指标判断模型好不好,还得解决 “样本太少训不动” 的实际问题。整理了我觉得最关键的内容,用自己踩过的坑当例子,帮和我一样刚入门的小伙伴少走弯路。
一、先搞懂:图像分类的 “三层境界”,你在第几层?
1. 第一层:通用多类别分类(“分清大类”)
这是最基础的一层,目标是把图像分到 “大类别” 里,比如分辨是飞机、汽车、猫、狗还是船。最经典的就是 CIFAR-10 数据集,一共 10 个大类,每个类的差异很明显 —— 比如飞机有翅膀,汽车有轮子,模型只要抓住这些 “大特征” 就能分对。
我之前练手时用 CIFAR-10,随便搭个简单 CNN,准确率很快就到了 70% 多,这层的关键是 “类间差异大”,不用太精细的特征。
2. 第二层:子类细粒度分类(“分清小类”)
到这层难度就上来了,目标是分 “同一大类下的子类”。比如同样是狗,要分清是金毛、泰迪还是哈士奇;同样是花,要分清是玫瑰、月季还是蔷薇。这些子类的差异很小 —— 比如金毛和拉布拉多都是短毛、黄色,只靠 “有没有双眼皮”“耳朵形状” 这种细节才能区分。
老师放了张不同品种鸟类的图,我自己看都分不清,更别说模型了。这层的关键是 “抓细粒度特征”,得用更深的网络,还得做数据增强,不然很容易把相似子类搞混。
3. 第三层:实例级分类(“分清个体”)
这是最难的一层,目标是分 “同一个体的不同图像”,比如人脸识别 —— 即使同一个人,换了发型、戴了眼镜、光线变了,模型也要认出来;再比如商品溯源,要分清同一款手机的不同个体(靠机身的细微划痕、序列号等)。
这层的挑战是 “类内差异大,类间差异小”—— 比如同一个人笑和不笑的照片,差异可能比和另一个人的照片还大。老师说,这层通常要用到人脸识别专用的模型(比如 FaceNet),还得用迁移学习才能做好。
二、别踩坑:图像分类的 “评估指标”,你真的懂吗?
之前我总以为 “准确率(Accuracy)高就是好模型”,今天才发现大错特错 —— 比如遇到正负样本不均衡(比如 1000 个样本里 990 个是猫,10 个是狗),模型全判成猫,准确率也有 99%,但根本没分出狗,这时候就得靠其他指标。
1. 混淆矩阵:先看清 “错在哪”
混淆矩阵是所有指标的基础,能直观看到模型把哪些样本判错了。二分类的混淆矩阵是 2×2 的,四个核心概念一定要记牢:
-
TP(真正例):把 “真猫” 判成 “猫”(判对了);
-
FP(假正例):把 “真狗” 判成 “猫”(判错了,冤枉好狗);
-
TN(真反例):把 “真狗” 判成 “狗”(判对了);
-
FN(假反例):把 “真猫” 判成 “狗”(判错了,漏判猫)。
比如我测试了 100 个样本,混淆矩阵显示 TP=45,FP=5,TN=48,FN=2—— 说明有 5 只狗被错判成猫,2 只猫被错判成狗,这样一看就知道模型在 “狗→猫” 的判断上容易出错。
2. 核心指标:准确率、精确率、召回率、F1
光看混淆矩阵还不够,得算具体指标,不同场景看不同指标:
- 准确率(Accuracy):所有判对的样本占总样本的比例,公式是(TP+TN)/(TP+FP+TN+FN)。适合正负样本均衡的场景,比如 CIFAR-10,要是样本不均衡就别只看它了;
- 精确率(Precision,查准率):模型判为 “正类” 的样本里,真的是正类的比例,公式是 TP/(TP+FP)。比如我关心 “判成猫的样本里,真猫有多少”,就看精确率 —— 要是精确率低,说明很多狗被错当成猫,会导致 “误报多”;
- 召回率(Recall,查全率):所有真正类样本里,被模型判对的比例,公式是 TP/(TP+FN)。比如我关心 “所有真猫里,有多少被判对了”,就看召回率 —— 要是召回率低,说明很多猫被错当成狗,会导致 “漏报多”;
- F1-Score:精确率和召回率的调和平均,公式是 2×(精确率 × 召回率)/(精确率 + 召回率)。当精确率和召回率 “打架” 时(比如精确率高了召回率就低),用 F1 看综合性能,F1 越接近 1 越好。
老师举了个例子:医疗影像诊断(比如判断是否有肿瘤),召回率比精确率重要 —— 哪怕把一些正常影像判成肿瘤(精确率低),也不能漏判真肿瘤(召回率要高),不然会耽误治疗;而垃圾邮件过滤,精确率更重要 —— 别把正常邮件判成垃圾邮件(精确率高),不然会错过重要信息。
3. P-R 曲线:直观对比模型好坏
P-R 曲线是 “精确率(P)” 和 “召回率(R)” 的关系图 —— 召回率增加时,精确率通常会下降(想把更多真猫判对,难免会把狗错判成猫)。
判断模型好不好看两点:
- 曲线 “越靠右上角” 越好,说明在高召回率下,精确率也很高;
- 曲线和坐标轴围成的 “面积越大”,模型综合性能越好。
老师放了两个模型的 P-R 曲线,一个曲线几乎贴满右上角,另一个在召回率 0.5 时精确率就降到 0.3,高下立判 —— 以后对比模型,光看单一指标不够,画个 P-R 曲线更直观。
4. 多分类的小技巧:k×k 混淆矩阵
如果是多分类(比如 CIFAR-10 的 10 类),混淆矩阵就是 k×k 的,对角线元素是 “判对的样本数”,非对角线是 “判错的样本数”。比如第 3 行第 5 列的数,就是 “真类别 3(比如鸟)被判成类别 5(比如狗)的样本数”。
对角线元素之和越大,模型整体准确率越高;某一行非对角线元素多,说明这个类容易被错判 —— 比如我之前做 CIFAR-10 时,“猫” 和 “狗” 那两行的非对角线元素多,说明模型总把猫和狗搞混,后来加了数据增强才好一些。
三、必学:模型的 “深度” 和 “宽度”,影响性能的关键
之前我搭 CNN 时,总随便设 “几层卷积、几个通道”,今天才知道这对应模型的 “深度” 和 “宽度”,直接影响性能:
1. 深度:网络 “走多远”
模型的深度是 “计算最长路径的卷积层 + 全连接层数量”。比如经典的 LeNet,路径是 C1(卷积层)→C3(卷积层)→C5(卷积层)→F6(全连接层)→Output(全连接层),一共 5 层,所以深度是 5。
深度越深,模型能抓的特征越精细 —— 浅层抓边缘、颜色,深层抓形状、纹理,再深层抓 “猫耳朵”“狗鼻子” 这种高级特征。但也不是越深越好,太深了会过拟合,还难训练(梯度消失)。
2. 宽度:网络 “有多胖”
模型的宽度是 “每一层的通道数”,主要看卷积层。比如 LeNet 的 C1 层有 6 个通道,C3 层有 16 个通道,所以宽度是 6 和 16。
宽度越宽,模型能同时抓的特征种类越多 —— 比如 6 个通道可以分别抓 “水平边缘”“垂直边缘”“红色区域”“蓝色区域” 等不同特征。但宽度太宽会导致参数量暴增,训练变慢,所以通常是 “浅层窄、深层宽”(比如一开始 6 个通道,慢慢加到 64、128)。
四、实战痛点:样本太少怎么办?两个解决方案
做实际项目时,我最头疼的就是 “样本太少”—— 比如做工业产品缺陷检测,缺陷样本只有几十张;做医疗影像分类,病人数据更少,根本训不动模型。老师讲了两个超实用的解决方案:
1. 迁移学习:站在 “预训练模型” 的肩膀上
迁移学习的思路很简单:用别人在大数据集(比如 ImageNet,1400 万张图,1000 类)上训好的模型(比如 ResNet、VGG),当自己的 “特征提取器”,再在自己的小数据集上微调。
比如我做 “花瓣分类”(只有 200 张图),直接用 ResNet50 的前半部分(卷积层)提取特征,只训练最后几层全连接层 —— 这样不用从头训,不仅快,准确率还高。老师说,ImageNet 数据集很通用,预训练模型学到的 “边缘、纹理” 等特征,在其他图像任务上也能用,这就是迁移学习的魔力。
2. 数据增强:“造” 更多样本
如果样本实在太少,还可以用数据增强 “造” 样本,分有监督和无监督两种:
- 有监督增强:最常用,不改变样本标签,只做外观变换,比如:
- 平移:把图片往左 / 右 / 上 / 下挪一点;
- 翻转:水平翻转、垂直翻转(比如猫的图片翻转后还是猫);
- 亮度 / 对比度调整:让图片亮一点、暗一点,对比度强一点;
- 裁剪 / 缩放:随机裁一块再缩放到固定尺寸(比如从 256×256 裁 224×224)。我之前做细粒度分类时,用了这些增强,样本量相当于翻了 3 倍,准确率提升了 15%。
- 无监督增强:更高级,用 GAN(生成对抗网络)生成全新的样本,比如用 GAN 生成 “看起来像真的” 的猫图片,再用来训模型。这种方法适合样本极度稀缺的场景(比如医疗影像),但 GAN 训练起来有点难,新手可以先从有监督增强入手。
五、结尾:我的图像分类实战计划
今天学完这些,我终于有了清晰的实战思路:接下来先从 “通用多类别分类”(CIFAR-10)练手,用 CNN + 数据增强,重点练评估指标的计算;然后挑战 “细粒度分类”(比如花分类),试试迁移学习;最后再研究实例级分类(简单的人脸识别)。
如果和我一样刚入门,建议别一开始就搞复杂的,先把 “评估指标” 和 “样本少的解决方案” 吃透 —— 这两个是实战中最常用的,比单纯搭模型重要多了。
更多推荐


所有评论(0)