多类别的大豆叶病识别模型复现
🏡作者主页:点击!
🤖编程探索专栏:点击!
⏰️创作时间:2024年11月30日17点28分
神秘男子影,
秘而不宣藏。
泣意深不见,
男子自持重,
子夜独自沉。
论文链接
点击开启你的论文编程之旅https://www.aspiringcode.com/content?id=17322527814888&uid=55cc1f99fb3d4936a3a0ebb7d1e29d6f
用于多类别大豆叶病识别的两阶段特征聚合网络
CNN 模型在图像识别领域展现出了强大的特征提取能力和高效的计算效率,为众多图像处理任务提供了有力的技术支持。
然而,将其应用于大豆叶部病害识别这样一个复杂且精细的任务时,在识别效果上仍存在一定的上升空间。具体而言,由于不同类型的大豆叶部病害在症状表现上可能仅存在细微的差异,同一类型的病害在不同时期的症状表现可能会有较大的差别以及实际应用环境中病害图像背景信息较为复杂等问题,使得传统 CNN 模型在提取和表示关键病害特征信息方面面临着较大的挑战。
为解决此问题,本章基于 CNN 搭建了大豆叶部病害识别模型。通过设计主干结构、融合注意力机制、设计和结合多尺度特征融合方法等方式,达到实现更高识别精度的同时控制模型参数量大小的目的。同时,基于经过图像预处理之后的大豆叶部病害图像数据集,展开模型训练和对比实验分析,综合评估模型性能。
数据集准备
- 因原始数据集较大(42GB),超过了网站限制,因此本文不提供数据集
本研究的数据样本均来自于 Auburn 大豆病害图像数据集(ASDID),一个已经经过广泛研究和验证且具有丰富的样本和代表性的公开大豆叶病图像数据集。数据集中包含 8 类大豆叶片图像,分别是细菌性枯萎病(Bacterial Blight, B_B) 、尾孢叶枯病(Cercospora Leaf Bligh, CL_B) 、霜霉病(Downey Mildew, D_W)、蛙眼叶斑病(Frogeye Leaf Spot, FL_B)、 健康(Healthy, H)、缺钾(Potassium Deficiency, P_D)、锈病(Soybean Rust, S_R)和靶斑病(Target Spot, T_S)。
数据集中的所有的大豆叶片均来源于亚拉巴马州(美国东南部)的几个大豆种植区域,大豆叶片图像的采集时间为 2020 年和2021 年当地的大豆生长时期。在此期间,图像采集人员使用智能手机和单反相机拍摄大豆叶片图像,具体的方式包括在真实田间环境下拍摄和将叶片摘下后放在修剪过的草坪上或者白色汽车引擎盖上拍摄,这在一定程度上丰富了数据集中图像的背景信息。根据最初的实验设计,本研究利用数据集中的 9648 张大豆图像开展实验,各类别大豆叶片的示例图像如图所示。
图像预处理
由于数据集中存在的图像分辨率较高、分辨率大小不一致和各个类别的数据量不平衡等问题会影响模型的计算负荷和训练效果,在模型训练之前对数据集图像进行预处理是提升其识别精度和训练速度不可缺少的操作。在基于深度学习的图像识别方法研究当中,常用的数据预处理方法主要是特征缩放和数据增强。
特征缩放,即对所有的输入特征值进行归一化或标准化处理,将其映射至某一区间内,从而缓解数值的量级差异过大带来的低效率和低精度问题。数据增强则是采用几何变换、像素变换等能够在保留图像原始特征的同时增加图像数量和丰富性的方法对原始图像进行处理,从而扩充用于训练的图像数据集,使模型获得更好的泛化能力和鲁棒性,并避免过拟合情况的发生。因此,本研究在模型训练之前对数据进行了预处理,具体流程如下:
首先,将所有大豆病害图像按照7:1:2 的比例分别将各个类别的图像数据分配至训练集、验证集和测试集,用于模型性能的训练与评估。
虚拟环境配置
conda create --name tfanet python=3.9 -y
conda activate tfanet
pip install -r requirements.txt
使用脚本img_resize
将下载好的数据集图片缩放,避免磁盘空间浪费(该脚本工作量较大,运行时间会很长,请耐心等待)
使用脚本dataset_split
将数据集按照7:1:2的比例划分为训练集、验证集和测试集
其次,采用数据增强的方法扩增原始病害图像数据集。为了保证验证集和测试集的独立性,防止出现数据泄露的情况造成结果偏移,这里只对训练集的数据进行增强操作。
关于具体的数据增强方法,此处采用了旋转、翻转、颜色或亮度抖动、加入噪声以及限制对比度的自适应直方图均衡化(Contrast Limited Adaptive Histogram Equalization, CLAHE)等方法扩增病害图像数据集。其中,CLAHE 算法是针对直方图均衡化(Histogram Equalization, HE)会造成图像中不同区域的灰度分布相差较大的问题做出的优化, 它通过为每个局部直方图设置阈值并将超过该阈值的像素数均匀分散至直方图的其他部分,以此来抑制对比度的增强幅度,从而限制噪声的放大以及局部对比度的过度增强
使用脚本img_amplify
将训练集的图片扩增到2000张,避免模型过拟合
使用脚本dataset_count
统计并查看数据集的图片数量
类别 | 训练集 | 扩增后训练集 | 验证集 | 测试集 |
potassium_deficiency | 725 | 2000 | 103 | 206 |
downey_mildew | 457 | 2000 | 65 | 130 |
healthy | 1143 | 2000 | 163 | 326 |
target_spot | 757 | 2000 | 108 | 216 |
cercospora_leaf_blight | 1119 | 2000 | 160 | 319 |
bacterial_blight | 340 | 2000 | 48 | 96 |
frogeye | 1078 | 2000 | 154 | 308 |
soybean_rust | 1140 | 2000 | 163 | 324 |
最后,将所有大豆病害图像的大小调整为 224× 224
使用脚本img_zoom
将数据集的图片缩放成224x224,以方便后续的训练
模型的设计与搭建
针对大豆叶部病害识别任务的特点,为了克服传统 CNN 模型在重要病害特征信息提取和特征表示方面的不足,缓解模型在特征提取过程中的特征信息丢失问题,并增强模型在大豆叶部病害识别领域的实际应用价值,本节提出了一种基于CNN 的两阶段特征聚合网络模型——TFANet。
模型主要分为以下三个部分:第一个部分为特征提取模块,它通过两个串联的卷积层提取输入图像的特征信息,并利用基于膨胀卷积的特征融合(Dilated Convolution-based Feature Fusion, DCFF)模块扩大感受野,充分保留图像浅层的细节信息特征,尽可能地减少关键信息损失;第二个部分由 4 个两阶段特征聚合(Two-stage Feature Aggregation, TFA)模块和 1 个 InceptionC 模块组成。TFA 模块通过两阶段的特征聚合操作融合多个不同的特征,有效地提高了模型的特征复用能力,并引入高效通道注意力(Efficient Channel Attention, ECA)模块促进模型对重要病征信息的关注度,使其能够充分利用不同维度的特征信息,从而提高其特征表示的有效性。同时,InceptionC 模块通过融合来自多个不同大小的非对称卷积的多尺度特征信息,提升模型对病害特征的识别能力;第三部分是包含自适应平均池化层和全连接层的分类器,实现对病害类型的识别。
TFA 模块
为了最大限度地减少大豆病害特征信息的丢失,使模型能够充分利用不同层次的特征信息,获得更综合、更多样化的特征表示和更多接受域的特征映射,设计了一个两阶段特征聚合模块——TFA 模块。该模块由 1 个最大池化层、 4 个3×3卷积层、1 个1×1 卷积层和 ECA 注意力机制组成,其内部结构如图所示。
由上图可知,首先,通过最大池化层来降低输入特征图的空间维数以增强模型对上下文信息的感知能力并减少计算消耗。其次,通过连续两次多特征拼接操作完成两阶段特征聚合任务以促进不同尺度信息的融合。在两阶段特征聚合的过程中,每个卷积层的输入特征均为来自不同抽象层级的表征,它们之间可能存在互补的特征信息。第一阶段的输出通过聚合最大池化层和前两个卷积层的输出特征而得到,它整合了来自不同层级的特征信息,以提供更全面、更丰富的特征表示并最大限度地减少特征信息的丢失。第二阶段的输出是通过进一步聚合来自前一阶段和最后两个卷积层的输出特征图而得到,它将浅层的细节和局部信息与深层次的语义和上下文信息相结合,从而提高了模型对病害特征的适应能力和表征能力。同时,为了在模型性能和参数数量之间取得平衡,过程中的每个卷积层的输出通道数都被设置为小于 C 的值。随后,利用1× 1 卷积层进行降维,以缓解计算资源浪费和特征冗余的问题。最后,结合 ECA 模块对每个通道的特征图进行自适应加权,以生成具有更强任务相关性的输出特征图。
ECA 模块
在 CNN 模型中引入注意力机制能够有效地使其聚焦于重要的特征信息而淡化不相关的背景信息和噪声,从而提升识别精度。基于此,本章将 ECA 模块集成到 TFA 模块中,以强化网络对大豆病征信息的关注度,抑制背景信息带来的不利影响,从而优化网络对症状不明显的病害图像的识别能力。ECA 模块的结构如图所示。
作为一种轻量级的注意力机制,它采用不降维的局部跨通道交互策略来捕捉通道间的交互信息,从而避免降维带来的特征信息丢失问题,其最终目的是付出少量参数就能获得明显的性能收益。
该模块通过全局平均池化将输入特征图转换为 1× 1× C 的向量,并应用一维卷积来获取每个通道的权重,随后将归一化权重与输入特征图相乘生成加权后的特征图。
DCFF 模块
为了有效地保留病害图像的浅层特征信息并优化模型的特征提取能力,本章基于膨胀卷积设计了DCFF 模块。 膨胀卷积可以在固定参数量和分辨率的情况下增大卷积核的感受野,扩大卷积的输出范围。相较于普通卷积,膨胀卷积新增了一个需要手动设定的参数——膨胀率,该参数决定了原始元素在卷积过程中的扩展倍数。
然而,已有研究结果表明,叠加多个相同的膨胀卷积会导致感受野中的部分像素失去利用价值,丢失了数据的完整性。为了充分利用膨胀卷积的优势,同时防止过度扩张导致的信息丢失,通过融合具有不同膨胀率的多个膨胀卷积构建了 DCFF 模块,其结构如图所示。
首先,对膨胀率为 1、3、5、7 的膨胀卷积进行并行处理,利用不同大小的感受野去提取输入特征信息;其次,分别通过残差连接融合原始特征信息与膨胀卷积的输出结果,减少信息丢失;接下来,将融合之后的多个特征图进行拼接,对各个分支的特征信息进行整合;最后,通过跳跃连接将输入特征信息与整合之后的特征信息进行融合,提高特征利用效率。
InceptionC 模块
Inception 系列模型将不同层之间的卷积运算进行了拓展,在利用多个不同大小的卷积核进行特征提取之后,拼接实现不同尺度特征的融合,以较低的参数即可实现较好的识别性能,这也使它被广泛应用于各个领域的研究当中。 InceptionC 作为 Inception V3 模型中的一个模块, 主要通过多个非线性激活层来增强表达能力,并采用非对称卷积替换对称卷积以降低参数量和计算量,即把 k × k 的卷积替换为1× k 和 k × 1 的卷积。
已有研究表明,当输入特征图的大小处于 12× 12 和 20× 20 之间时, InceptionC 模块可以带来更好的识别结果。因此,为了提高模型的识别性能,本章在 TFANet 中输出特征图尺寸为 14 × 14 的位置添加了 InceptionC 模块。下图展示了InceptionC 模块的结构。
该模块采用 1× 1 卷积对输入特征进行降维,并利用非对称卷积代替普通卷积以降低计算复杂度。同时,通过并联不同尺度的卷积核来获取更密集的特征信息以拓展模型的宽度和深度,优化其识别能力。
模型训练的超参数配置
超参数 | 配置 |
优化器 | Adam |
损失函数 | Cross-Entropy |
训练周期 | 100 |
学习率 | 0.0001 |
批量大小 | 32 |
模型训练结果如下图所示。
模型测试
使用脚本test.py
进行预测。模型测试结果如下图所示。
模型部署
在本目录执行命令uvicorn app:app --host 0.0.0.0 --port 8000
启动服务器。
在浏览器中输入http://localhost:8000/
进入主页。
上传图片开始评测
成功的路上没有捷径,只有不断的努力与坚持。如果你和我一样,坚信努力会带来回报,请关注我,点个赞,一起迎接更加美好的明天!你的支持是我继续前行的动力!"
"每一次创作都是一次学习的过程,文章中若有不足之处,还请大家多多包容。你的关注和点赞是对我最大的支持,也欢迎大家提出宝贵的意见和建议,让我不断进步。"
神秘泣男子