图像识别基础第二课
课程链接:
本次课由李老师进行讲解
课程将以柠檬分类比赛为例,详情讲解完成一整个项目实践的搭建方法。
将以柠檬品相分类比赛为例,为大家详细介绍下图像分类比赛的完整流程,并对比赛中常用的技巧进行介绍。课程侧重于图像分类比赛的一般性流程,适合飞桨2.0入门学习以及图像分类竞赛总结思考。通过本次课程你将了解图像分类的常见模型,并且能够具备参加图像分类竞赛的能力
########################################################
###实践项目:柠檬品相分类比赛
比赛链接:https://signate.jp/competitions/431
项目要求与描述:
详情见比赛连接 大致就是在一个小的设备上做柠檬品相的分类
对于图像分类任务,我们首先应该统计出每种类别的数量,查看训练集的测试分布,然后可以稍微预测一下测试集的数据分布。通过数据分布情况判断赛题的难点在于哪里。
(Exploratory Data Analysis,简称EDA),是指对已有的数据(原始数据)在进行分析探索,通过作图、制表、方程拟合、计算特征量等手段探索数据的结构和规律的一种数据分析方法。一般来说,我们最初接触到数据的时候往往是毫无头绪的,不知道如何下手,这时候探索性数据分析就非常有效。
1、写出一系列你自己做的假设,然后接着做更深入的数据分析
2、记录下自己探索过程中更进一步的数据分析过程
3、把自己的中间的结果给自己的同行看看,让他们能够给你一些更有拓展性的反馈、或者意见。(open to everybody)
4、将可视化与结果结合一起
比如 针对此次的柠檬数据及分类:
柠檬的颜色和大小相对来说比形状要重要,先从评价指标的角度考虑入手,然后再对网络进行合理选择和对图像进行处理。由此才能保证将图片中的信息最高效的利用起来。
1,。限制模型大小(要部署在树莓派上)
2. 数据量少(只有1000张图片)
最常见的对图像预处理方法有两种,正常白化处理又叫图像标准化处理,另外一种方法叫做归一化处理.图像标准化是将数据通过去均值,实现中心化,根据凸优化理论和数据概率分布的相关知识,数据中心化符合数据分布规律,更容易取得训练之后的泛化效果,数据标准化是数据常见的处理方法之一。原图与归一化之后的运行结果完全一致,说明归一化不会改变图像本身的信息存储,但是通过打印出来的像素值可以发现,取值范围从0~255已经转化为0~1之间了,这个对于后续的神经网络或者卷积神经网络处理有很大的好处。
作用:
使不同量纲的特征处于同一数值量级,减少方差大的特征的影响,使模型更准确。
加快学习算法的收敛速度。
选择确定模型
选择网络输入尺寸
理想情况中,模型越大拟合能力越强,图像尺寸越大,保留的信息也越多。在实际情况中模型越复杂训练时间越长,图像输入尺寸越大训练时间也越长。
比赛开始优先使用最简单的模型(如ResNet18),快速跑完整个训练和预测流程;分类模型的选择需要根据任务复杂度来进行选择,并不是精度越高的模型越适合比赛。
在实际的比赛中我们可以逐步增加图像的尺寸,比如先在64 * 64的尺寸下让模型收敛,进而将模型在128 * 128的尺寸下训练,进而到224 * 224的尺寸情况下,这种方法可以加速模型的收敛速度。
飞桨框架支持sequential 或 subclass 的方式进行模型组建,我们可以根据实际使用场景来选择组网方式 (需要根据具体场合具体选取)
(一般更常用subclass 因为更加标准化,结构也更加容易被看清)
paddle.model 是一种模型封装的方式,model是一个神经网络对象
因为竞赛要考虑到网络结构,所以需要计算特征图(feature map)尺寸来估计算模型所需参数。
调用VisualDL工具,在命令行中输入: visualdl --logdir ./visualdl_log_dir --port 8080,打开浏览器,输入网址 http://127.0.0.1:8080 就可以在浏览器中看到相关的训练信息,具体如下:
在分类问题中,一般最后一层是全连接层,然后对应one-hot编码,这种编码方式和通过降低交叉熵损失来调整参数的方式结合起来,会有一些问题。这种方式鼓励模型对不同类别的输出分数差异非常大,或者说模型过分相信他的判断,但是由于人工标注信息可能会出现一些错误。模型对标签的过分相信会导致过拟合。 标签平滑可以有效解决该问题,它的具体思想是降低我们对于标签的信任,例如我们可以将损失的目标值从1稍微降到0.9,或者将从0稍微升到0.1。总的来说,标签平滑是一种通过在标签y中加入噪声,实现对模型约束,降低模型过拟合程度的一种正则化方法。 论文地址 飞桨2.0API地址
首先对原始的图像列表,按照标签顺序进行排序; 然后计算每个类别的样本数量,并得到样本最多的那个类别的样本数。 根据这个最多的样本数,对每类随机都产生一个随机排列的列表; 然后用每个类别的列表中的数对各自类别的样本数求余,得到一个索引值,从该类的图像中提取图像,生成该类的图像随机列表; 然后把所有类别的随机列表连在一起,做个Random Shuffling,得到最后的图像列表,用这个列表进行训练。
为了获得更多数据,我们只需要对现有数据集进行微小改动。例如翻转剪裁等操作。对图像进行微小改动,模型就会认为这些是不同的图像。常用的有两种数据增广方法: 第一个方法称为离线扩充。对于相对较小的数据集,此方法是首选。 第二个方法称为在线增强,或即时增强。对于较大的数据集,此方法是首选,因为GPU无法承受大小的爆炸式增长。
调参是比赛环节里非常重要的一步,即使是日常工作中也不可避免
合适的学习率对比不合适的学习率得到的结果相差非常大
batch_size最好设置成2的幂函数次,因为能够匹配计算机的二进制提升效率
随机打乱:便于模型学习的时候不走弯路(否则如果一个批次输入的都是同一个类别的,模型就会多样性减少)
LSR 在分类问题中,通过全连接层一般都是通过交叉熵函数,在这个过程中可能会出现过拟合的问题(模型对标签过分相信)。由此,标签平滑可以解决此问题,降低模型对标签的信任
不要妄自菲薄,小白也可以参加这个比赛。
追求知识,而不是追求名次