使用深度学习和图像分割进行大豆叶片病虫害分类
在本文中,我们将建立一个利用大豆叶片图像进行病虫害分类的深度学习模型。
第1部分:问题定义和目标
问题定义:
植物以蔬菜、水果和各种消费品的形式在人们的日常生活中起着至关重要的作用。因此,识别植物叶片病害对农民生产优质作物和提高农业生产效率具有重要意义。但由于病害种类繁多,用肉眼进行叶病鉴定耗时长、难度大、准确率低。
因此,需要一种自动的叶片病害识别技术,它能帮助农民以更少的精力、更少的时间和更准确地识别各种病害。这些技术还有助于对农田进行健康监测,以确保农产品的质量。
在本研究中,我们收集了大豆植株的不同病叶图像。我们的任务是对给定的叶子进行高精度的分类。
目标:
- 预测尚未确定的新叶子的疾病。
- 找出叶片发生各种病害的概率,选择概率值高的类别作为预测病害(Softmax)。
- 最小化预测和实际疾病之间的差异(分类交叉熵)。
评估指标:
准确性用作此案例研究的评估指标。它定义为正确预测的样本数与预测总数之比。
第2部分:数据收集
该机器学习数据集包含大豆植物的叶片图像。数据是从Digipathos存储库收集的。资料来源:https://www.digipathos-rep.cnptia.embrapa.br/jspui/
在这个案例研究中,只使用了单个叶子图像。在这个数据集中总共有383张叶子图像。
该数据集具有10种不同类型的叶病。它们是Bacterial Blight, Brown Spot, Copper Phytotoxicity, Downy Mildew, Healthy, Mosaic Virus, Powdery Mildew, Rust, Rust & Target Spot and Southern Blight。一些叶子图像如下所示:
图1:各种疾病的叶片图像样本
第三部分:探索性数据分析
首先导入Python库:
读取机器学习数据集并绘制每种疾病叶片图像的分布图。
图2:每种疾病的叶片图像分布
从上图可以看出,机器学习数据集高度不平衡。因此,我们需要对训练数据进行了上采样。该机器学习数据集也非常小(仅383张图像)。因此,我们还要执行数据增强。
通过观察图像,很明显,实际的叶子像素仅占整个图像的一小部分。大多数像素是具有不同颜色的背景像素。由于我们只对实际的叶子像素感兴趣,因此可以裁剪图像或通过图像分割方法提取叶子像素。
我们在3个数据集上实验深度学习分类模型,即原始图像,裁剪图像和分割图像。最后,我们比较从各种深度学习模型获得的结果。
图3:叶片图像样本-原始,裁剪和分割
第4部分:叶图像分割
为了提取实际的叶子像素,我们使用K-means聚类方法执行图像分割。
1:寻找最佳的色彩分割色彩通道
给定的原始图像在RGB颜色空间中。由于原始叶片图像的颜色差异很大,因此很难将k均值聚类直接应用于原始图像。因此,我们通过将各种可用颜色空间中的图像分成单独的通道来找到最合适的颜色通道。
在执行一些操作后,发现CIE Lab颜色空间的b 通道最适合k均值聚类。
图4:叶子图像的R,G,B通道
图5:叶图像的L,a,b通道
图6:叶子图像的H,S,V通道
因此,最后我们选择Lab Color空间的b通道,以使用k-means聚类进行颜色分割。
2:在Lab色彩空间的b通道上进行K均值聚类
由于我们只想提取实际的叶子像素并删除其他背景像素,因此我们选择2个聚类进行k均值聚类。
一个聚类用于前景叶子像素,而另一个聚类用于不需要的背景像素。
图7:k均值聚类后获得的两个聚类
从上图可以看出,一些不需要的背景像素也聚集在了实际的前景聚类下。
为了只提取实际的前景叶像素,我们在前景聚类中找到所有的连接部分,最后得到实际的包含叶像素的部分。
3:在2个聚类的像素标签中查找连接的部分
现在,我们在聚类像素中找到所有连接的部分。
图8:此图显示了前景聚类中所有连接的部分
4:查找实际叶子所属的主要部分
要找到实际像素所在的主要部分,简单的逻辑就是在所有连接的部分中找到最大的部分。我们使用max(行数,列数)过滤最大的部分。获取主要部分后,我们创建一个mask以提取与主要部分相对应的实际像素
图9:分割的叶子图像
现在,我们裁剪分割后的图像,以去除所有周围的黑色像素(删除像素值为0的像素)。
图10:最终裁剪的分割叶图像
第5部分:使用CNN的深度学习模型
如上所述,我们尝试了3种分类模型。
- 原始图像分类模型
- 裁剪图像分类模型
- 分割图像分类模型
原始图像分类模型
数据准备:
在此步骤中,我们以numpy数组格式存储原始图像数据,并创建一个包含图像名称和相应疾病名称的csv文件。
在本案例研究中,所有图像均调整为144x144。这些调整大小的图像用于构建深度学习模型。
将CSV文件加载到数据框
图11:csv文件的前五行
图12:最终的csv文件
现在,由于数据集非常小,我们将数据按85:15的比例分为训练和测试数据,以确保有足够的训练数据。
图13:训练数据的分布
我们执行上采样,以使所有类具有相同的样本数量
对于每个数据集,我们将构建两个具有不同架构的深度学习模型,并将其性能与评估指标(准确性)进行比较。
对训练数据执行数据扩充,以确保有足够的数据进行训练。
对于所有深度学习模型,都使用具有各种深度的卷积层,最大池化,Dropout和批归一化。对于所有隐藏层,将relu用作激活函数,其中将softmax用作输出分类层的激活函数。
对于每个模型,我们都将最佳模型权重保存到磁盘上。
数据增强:
模型1:
图14:准确度和损失图
模型2:
图15:准确度和损失图
同样,我们对裁剪和分割的图像数据集也重复上述相同步骤。
第6部分:结果和结论
在3个不同的数据集上所有深度学习模型的结果是:
图16:最终结果表
- 从结果表中可以看出,两种CNN模型在原始图像上的性能均优于裁剪和分割后的图像。
- 由于数据集非常小且高度不平衡,因此模型的性能在准确性方面不是最佳的。如果机器学习数据集很大,则深度模型的性能可能会进一步提高。
- 尽管对图像执行了图像分割,但是与原始图像相比,这没有帮助获得更好的结果。
- 在本案例研究中,原始图像上的模型1在所有模型中都是赢家。
该案例研究的一个重要教训–图像分割并不一定有助于深度学习模型提供更好的结果。