农作物病害识别挑战赛
AI CHANLENGER 2018 上实验赛道的比赛,农作物病害检测,对近5万张按“物种-病害-程度”分成61类的植物叶片照片进行分类,是一个多分类的问题。难点在数据样本不平衡,有一些类的样本太少,甚至没有,标签也有部分错误。
比赛在2018年8月29开始,到11月11日结束,在国庆期间做了一下,一直在关注,但是没有投入太多精力,还有其他事情。
数据分析
拿到数据后首先进行分析,数据如下图所示,并不复杂,背景简单。
使用python绘图库对数据样本种类、数量进行了统计,结果如图所示:
训练集:
验证集:
训练集+验证集:
统计结果:
可以看出,训练集与验证集样本类别分布不均,但是分布大致相同,第44、45类训练集中分别只有一张图片,验证集分别有1、0张,所以为了提高准确率,我们直接剔除这两类。
数据增强
病害识别与颜色等有关,所以只做了旋转、翻转等变换
- 左右翻转
- 上下翻转
- 随机旋转
- 随机crop
- 高斯噪声
- 亮度变化
模型
迁移学习,首先尝试了Inception-V3,直接使用pool_3层的输出,接上一个全连接的分类层,使用softmax进行分类,使用Inception-V3的默认输入,可以达到 0.81 左右的准确率。
GoogleNet的思想是通过Inception结构增加增加网络的宽度,这样可以在保证网络性能的情况下减少网络的深度,减少计算量。下图是Inception-V1的结构,
1
×
1
1 \times 1
1×1 的卷积用来跨通道组织信息,实现降维操作,分别用了
3
×
3
3\times 3
3×3 和
5
×
5
5 \times 5
5×5 的卷积核,感受野不同,最后进行拼接相当于不同尺度特征的融合。
卷积核分别为
1
×
1
,
3
×
3
,
5
×
5
1 \times 1,3\times 3,5 \times 5
1×1,3×3,5×5,在步长设置为1,pad分别设置为0,1,2的情况下可以在卷积后得到相同维度的特征,实现不同尺度特征的汇聚拼接。
在后面的改进中,将
5
×
5
5 \times 5
5×5 的卷积核替换为了两个
3
×
3
3 \times 3
3×3 的卷积核,可以在感受野不变的情况下减少计算量。
Inception-ResNet-V2: 将主干网络更换为Inception-ResNet-V2,准确率达到 0.88上下,也是最终成绩,勉强进入前20%。
Inception-ResNet-V2 中加入了ResNet的恒等映射思想,进一步减少计算量,防止过拟合、梯度饱和、梯度消失/爆炸。
优化思路
- 增大输入图像尺寸:在交流群中有人使用ResNet-50,650宽高的输入,取得了较好的成绩;
- 模型集成:使用几个不同的模型,建立一个投票机制,增加准确率,在实际应用中没有意义,但可以刷分使用;
- 平衡样本:目前只剔除了样本过少的两类,但是没有平衡样本,可以通过对数据集重采样(对大类欠采样,对小类过采样)平衡类别;
收获
- 这算是自己独立完成的第一个竞赛,入了个门,为kaggle等做个铺垫;
- 代码能力提升,对tensorflow的熟练程度增加;
- 对各种超参的理解进一步加深;
- 对迁移学习理解加深,对 pre-trained model 使用熟练度增加;
不足
- 还没有自己的东西,停留在搬运阶段;
- 测试的模型也不够多;
- 没有尝试模型级联;