首先看下整体效果:
要进行茶叶嫩芽的检测和识别,可以使用计算机视觉和深度学习技术来实现。下面是一种基本的流程:
数据收集:收集包含毛尖、嫩芽以及其他类型茶叶图像的数据集。确保数据集中包含不同角度、光照条件和背景下的茶叶图像。
数据预处理:对图像进行预处理操作,如调整大小、裁剪、灰度化或彩色转换等,以便于后续处理。
特征提取:使用图像处理技术或特征提取方法,提取茶叶嫩芽的特征。可以使用传统的图像处理方法,如边缘检测、形态学操作等,也可以使用基于深度学习的特征提取方法,如卷积神经网络(CNN)。
模型训练:根据你的数据集,选择合适的分类模型进行训练。可以使用传统的机器学习算法,如支持向量机(SVM)、随机森林(Random Forest)等,也可以使用深度学习模型,如卷积神经网络(CNN)。
模型评估:使用测试集对训练好的模型进行评估,计算精确率、召回率等指标,以评估模型的性能。
部署应用:将训练好的模型部署到实际应用中,以进行茶叶嫩芽的检测和识别。可以使用图像输入或实时视频流作为输入,通过模型预测出茶叶的类别。
这里采用的是深度学习的方式,不需要人工去构建复杂的特征工程,计算量大效果也未必能够达标,接下来简单看下数据集:
这里主要基于YOLOv5系列n/s/m三款不同参数量级的模型进行开发训练,同时集成了CBAM注意力机制,分别开发构建了:yolov5n-CBAM、yolov5s-CBAM、yolov5m-CBAM三款不同参数量级的模型,不同系列的模型在yaml文件中只是缩放系数不同的区别,其他的操作都是相同的,这里就以m系列的模型为例来进行说明。
yolov5m模型文件如下所示:
# YOLOv5 by Ultralytics, GPL-3.0 license
# Parameters
nc: 1 # number of classes
depth_multiple: 0.67 # model depth multiple
width_multiple: 0.75 # layer channel multiple
anchors:
- [10,13, 16,30, 33,23] # P3/8
- [30,61, 62,45, 59,119] # P4/16
- [116,90, 156,198, 373,326] # P5/32
# YOLOv5 v6.0 backbone
backbone:
# [from, number, module, args]
[[-1, 1, Conv, [64, 6, 2, 2]], # 0-P1/2
[-1, 1, Conv, [128, 3, 2]], # 1-P2/4
[-1, 3, C3, [128]],
[-1, 1, Conv, [256, 3, 2]], # 3-P3/8
[-1, 6, C3, [256]],
[-1, 1, Conv, [512, 3, 2]], # 5-P4/16
[-1, 9, C3, [512]],
[-1, 1, Conv, [1024, 3, 2]], # 7-P5/32
[-1, 3, C3, [1024]],
[-1, 1, SPPF, [1024, 5]], # 9
]
# YOLOv5 v6.0 head
head:
[[-1, 1, Conv, [512, 1, 1]],
[-1, 1, nn.Upsample, [None, 2, 'nearest']],
[[-1, 6], 1, Concat, [1]], # cat backbone P4
[-1, 3, C3, [512, False]], # 13
[-1, 1, Conv, [256, 1, 1]],
[-1, 1, nn.Upsample, [None, 2, 'nearest']],
[[-1, 4], 1, Concat, [1]], # cat backbone P3
[-1, 3, C3, [256, False]], # 17 (P3/8-small)
[-1, 1, Conv, [256, 3, 2]],
[[-1, 14], 1, Concat, [1]], # cat head P4
[-1, 3, C3, [512, False]], # 20 (P4/16-medium)
[-1, 1, Conv, [512, 3, 2]],
[[-1, 10], 1, Concat, [1]], # cat head P5
[-1, 3, C3, [1024, False]], # 23 (P5/32-large)
[[17, 20, 23], 1, Detect, [nc, anchors]], # Detect(P3, P4, P5)
]
CBAM(Convolutional Block Attention Module)是一种用于增强卷积神经网络(CNN)性能的注意力机制。它结合了通道注意力和空间注意力,以提高模型对图像中重要特征的关注程度。
CBAM 注意力机制可以分为两个部分:
通道注意力模块(Channel Attention Module):该模块通过学习每个通道的权重来调整不同通道的特征图的重要性。它包含一个全局平均池化层,然后通过多个全连接层和激活函数来产生通道权重向量。最后,通过将通道权重向量与原始特征图相乘,实现对不同通道特征的加权融合。
空间注意力模块(Spatial Attention Module):该模块通过在空间维度上学习特征图的权重分布,来突出图像中的重要区域。它使用一个包含两个并行分支的结构。一个分支执行最大池化操作,另一个分支执行平均池化操作。然后,这两个分支通过卷积层和激活函数产生一个权重图。权重图被应用于原始特征图上,以突出具有重要信息的空间位置。
通过使用 CBAM 注意力机制,模型可以自动学习图像中的重要特征,并在训练过程中动态地调整对这些特征的关注程度。这有助于提高模型的表达能力和性能。
CBAM 注意力机制已经被广泛应用于计算机视觉任务,如图像分类、目标检测和图像分割等。它可以与各种 CNN 架构结合使用,例如 ResNet、DenseNet 等,以增强网络的性能和鲁棒性。
这里我们将CBAM注意力机制集成进yolov5m中,以期提升模型的精度。
yolov5m-CBAM模型文件如下所示:
# YOLOv5 by Ultralytics, GPL-3.0 license
# Parameters
nc: 1 # number of classes
depth_multiple: 0.67 # model depth multiple
width_multiple: 0.75 # layer channel multiple
anchors:
- [10,13, 16,30, 33,23] # P3/8
- [30,61, 62,45, 59,119] # P4/16
- [116,90, 156,198, 373,326] # P5/32
# YOLOv5 v6.0 backbone
backbone:
# [from, number, module, args]
[[-1, 1, Conv, [64, 6, 2, 2]], # 0-P1/2
[-1, 1, Conv, [128, 3, 2]], # 1-P2/4
[-1, 3, C3 [128]],
[-1, 1, Conv, [256, 3, 2]], # 3-P3/8
[-1, 6, C3, [256]],
[-1, 1, Conv, [512, 3, 2]], # 5-P4/16
[-1, 9, C3, [512]],
[-1, 1, Conv, [1024, 3, 2]], # 7-P5/32
[-1, 3, C3, [1024]],
[-1, 1, SPPF, [1024, 5]], # 9
]
# YOLOv5 v6.0 head
head:
[[-1, 1, Conv, [512, 1, 1]],
[-1, 1, nn.Upsample, [None, 2, 'nearest']],
[[-1, 6], 1, Concat, [1]], # cat backbone P4
[-1, 3, C3, [512, False]], # 13
[-1, 1, Conv, [256, 1, 1]],
[-1, 1, nn.Upsample, [None, 2, 'nearest']],
[[-1, 4], 1, Concat, [1]], # cat backbone P3
[-1, 3, C3, [256, False]], # 17 (P3/8-small)
[-1, 1, Conv, [256, 3, 2]],
[[-1, 14], 1, Concat, [1]], # cat head P4
[-1, 3, C3, [512, False]], # 20 (P4/16-medium)
[-1, 1, Conv, [512, 3, 2]],
[[-1, 10], 1, Concat, [1]], # cat head P5
[-1, 3, C3, [1024, False]], # 23 (P5/32-large)
[-1, 1, CBAM, [1024]],
[[17, 20, 24], 1, Detect, [nc, anchors]], # Detect(P3, P4, P5)
]
默认都是100次的迭代计算,接下来看下结果详情::
【yolov5m】
【Precision曲线】
精确率曲线(Precision-Recall Curve)是一种用于评估二分类模型在不同阈值下的精确率性能的可视化工具。它通过绘制不同阈值下的精确率和召回率之间的关系图来帮助我们了解模型在不同阈值下的表现。
精确率(Precision)是指被正确预测为正例的样本数占所有预测为正例的样本数的比例。召回率(Recall)是指被正确预测为正例的样本数占所有实际为正例的样本数的比例。
绘制精确率曲线的步骤如下:
使用不同的阈值将预测概率转换为二进制类别标签。通常,当预测概率大于阈值时,样本被分类为正例,否则分类为负例。
对于每个阈值,计算相应的精确率和召回率。
将每个阈值下的精确率和召回率绘制在同一个图表上,形成精确率曲线。
根据精确率曲线的形状和变化趋势,可以选择适当的阈值以达到所需的性能要求。
通过观察精确率曲线,我们可以根据需求确定最佳的阈值,以平衡精确率和召回率。较高的精确率意味着较少的误报,而较高的召回率则表示较少的漏报。根据具体的业务需求和成本权衡,可以在曲线上选择合适的操作点或阈值。
精确率曲线通常与召回率曲线(Recall Curve)一起使用,以提供更全面的分类器性能分析,并帮助评估和比较不同模型的性能。
【召回率曲线】
召回率曲线(Recall Curve)是一种用于评估二分类模型在不同阈值下的召回率性能的可视化工具。它通过绘制不同阈值下的召回率和对应的精确率之间的关系图来帮助我们了解模型在不同阈值下的表现。
召回率(Recall)是指被正确预测为正例的样本数占所有实际为正例的样本数的比例。召回率也被称为灵敏度(Sensitivity)或真正例率(True Positive Rate)。
绘制召回率曲线的步骤如下:
使用不同的阈值将预测概率转换为二进制类别标签。通常,当预测概率大于阈值时,样本被分类为正例,否则分类为负例。
对于每个阈值,计算相应的召回率和对应的精确率。
将每个阈值下的召回率和精确率绘制在同一个图表上,形成召回率曲线。
根据召回率曲线的形状和变化趋势,可以选择适当的阈值以达到所需的性能要求。
通过观察召回率曲线,我们可以根据需求确定最佳的阈值,以平衡召回率和精确率。较高的召回率表示较少的漏报,而较高的精确率意味着较少的误报。根据具体的业务需求和成本权衡,可以在曲线上选择合适的操作点或阈值。
召回率曲线通常与精确率曲线(Precision Curve)一起使用,以提供更全面的分类器性能分析,并帮助评估和比较不同模型的性能。
【F1值曲线】
F1值曲线是一种用于评估二分类模型在不同阈值下的性能的可视化工具。它通过绘制不同阈值下的精确率(Precision)、召回率(Recall)和F1分数的关系图来帮助我们理解模型的整体性能。
F1分数是精确率和召回率的调和平均值,它综合考虑了两者的性能指标。F1值曲线可以帮助我们确定在不同精确率和召回率之间找到一个平衡点,以选择最佳的阈值。
绘制F1值曲线的步骤如下:
使用不同的阈值将预测概率转换为二进制类别标签。通常,当预测概率大于阈值时,样本被分类为正例,否则分类为负例。
对于每个阈值,计算相应的精确率、召回率和F1分数。
将每个阈值下的精确率、召回率和F1分数绘制在同一个图表上,形成F1值曲线。
根据F1值曲线的形状和变化趋势,可以选择适当的阈值以达到所需的性能要求。
F1值曲线通常与接收者操作特征曲线(ROC曲线)一起使用,以帮助评估和比较不同模型的性能。它们提供了更全面的分类器性能分析,可以根据具体应用场景来选择合适的模型和阈值设置。
【PR曲线】
精确率-召回率曲线(Precision-Recall Curve)是一种用于评估二分类模型性能的可视化工具。它通过绘制不同阈值下的精确率(Precision)和召回率(Recall)之间的关系图来帮助我们了解模型在不同阈值下的表现。
精确率是指被正确预测为正例的样本数占所有预测为正例的样本数的比例。召回率是指被正确预测为正例的样本数占所有实际为正例的样本数的比例。
绘制精确率-召回率曲线的步骤如下:
使用不同的阈值将预测概率转换为二进制类别标签。通常,当预测概率大于阈值时,样本被分类为正例,否则分类为负例。
对于每个阈值,计算相应的精确率和召回率。
将每个阈值下的精确率和召回率绘制在同一个图表上,形成精确率-召回率曲线。
根据曲线的形状和变化趋势,可以选择适当的阈值以达到所需的性能要求。
精确率-召回率曲线提供了更全面的模型性能分析,特别适用于处理不平衡数据集和关注正例预测的场景。曲线下面积(Area Under the Curve, AUC)可以作为评估模型性能的指标,AUC值越高表示模型的性能越好。
通过观察精确率-召回率曲线,我们可以根据需求选择合适的阈值来权衡精确率和召回率之间的平衡点。根据具体的业务需求和成本权衡,可以在曲线上选择合适的操作点或阈值。
【yolov5m-CBAM】
对模型进行测试评估结果如下所示:
【yolov5m】
python val.py --weights runs/train/yolov5m_c3cbam_cbam/weights/best.pt --project runs/val --name yolov5m_c3cbam_cbam
Class Images Instances P R mAP50 mAP50-95: 100%|██████████| 8/8 [01:08<00:00, 8.59s/it]
all 252 598 0.851 0.862 0.882 0.501
【yolov5m_c3cbam_cbam】
python val.py --weights runs/train/yolov5m/weights/best.pt --name yolov5m
Class Images Instances P R mAP50 mAP50-95: 100%|██████████| 8/8 [01:02<00:00, 7.85s/it]
all 252 598 0.901 0.834 0.885 0.502
从结果指标上来看,融合了CBAM注意力机制的yolov5m模型整体性能都得到了提升。