本文是前文的延伸内容,前文主要是对单个麦穗上麦穗颗粒的检测计数,这里本文的主要目的是要对麦穗进行智能化自动化的检测计数,话不多说,简单先看下效果:
接下来看下数据集:
YOLO格式标注文件如下所示:
实例标注内容如下所示:
0 0.1625 0.790625 0.08125 0.15
0 0.223438 0.770312 0.021875 0.08125
0 0.273438 0.732031 0.028125 0.067187
0 0.264844 0.621875 0.042188 0.075
0 0.225781 0.620313 0.035937 0.075
0 0.374219 0.711719 0.051562 0.129688
0 0.435156 0.589844 0.045312 0.095312
0 0.446094 0.622656 0.029687 0.082812
0 0.376563 0.85 0.06875 0.1375
0 0.541406 0.4375 0.060937 0.140625
0 0.604688 0.732812 0.04375 0.08125
0 0.724219 0.774219 0.054688 0.110937
0 0.741406 0.728906 0.035937 0.120313
0 0.799219 0.744531 0.026562 0.120313
0 0.897656 0.713281 0.039062 0.076563
0 0.936719 0.667969 0.082812 0.070312
0 0.8125 0.917188 0.05 0.08125
0 0.632812 0.920312 0.028125 0.071875
0 0.861719 0.882031 0.089063 0.151562
0 0.903125 0.973437 0.053125 0.046875
0 0.982031 0.886719 0.029687 0.092188
0 0.982031 0.771875 0.035937 0.065625
0 0.805469 0.517188 0.029687 0.03125
0 0.883594 0.513281 0.026562 0.035937
0 0.78125 0.41875 0.046875 0.0375
0 0.421094 0.427344 0.051562 0.085938
0 0.467187 0.376563 0.04375 0.09375
0 0.640625 0.320312 0.025 0.05625
0 0.267969 0.432812 0.026562 0.05625
0 0.364844 0.425781 0.023438 0.035937
0 0.169531 0.461719 0.032813 0.045312
0 0.220312 0.25625 0.046875 0.096875
0 0.117969 0.26875 0.060937 0.10625
0 0.341406 0.2875 0.029687 0.034375
0 0.375781 0.282813 0.023438 0.0125
0 0.578125 0.283594 0.01875 0.067187
0 0.799219 0.152344 0.051562 0.067187
0 0.814844 0.085156 0.076563 0.054688
0 0.546094 0.073438 0.057813 0.065625
0 0.577344 0.049219 0.048438 0.035937
0 0.684375 0.150781 0.059375 0.073438
0 0.319531 0.107813 0.029687 0.059375
0 0.844531 0.690625 0.060937 0.05625
0 0.051562 0.06875 0.05 0.025
0 0.029687 0.210156 0.059375 0.073438
0 0.9875 0.379688 0.01875 0.025
0 0.471875 0.785937 0.0375 0.071875
0 0.178906 0.736719 0.054688 0.057813
0 0.498437 0.0375 0.028125 0.034375
0 0.65 0.397656 0.03125 0.051562
0 0.879687 0.10625 0.03125 0.04375
0 0.432031 0.8125 0.020313 0.078125
0 0.559375 0.725781 0.08125 0.154688
0 0.582031 0.774219 0.032813 0.076563
VOC格式标注文件如下所示:
实例标注内容如下所示:
<annotation>
<folder>Data</folder>
<filename>./images/37473f2ee637dc9e14a36293978d2a685c78a49001ced9231fa80da26cf23dad.jpg</filename>.
<source>
<database>The Database</database>
<annotation>Data</annotation>
<image>Data</image>
</source>
<owner>
<name>YMGZS</name>
</owner>
<size>
<width>1024</width>
<height>1024</height>
<depth>3</depth>
</size>
<segmented>0</segmented>
<object>
<name>wheat</name>
<pose>Unspecified</pose>
<truncated>0</truncated>
<difficult>0</difficult>
<bndbox>
<xmin>390</xmin>
<ymin>16</ymin>
<xmax>424</xmax>
<ymax>58</ymax>
</bndbox>
</object>
<object>
<name>wheat</name>
<pose>Unspecified</pose>
<truncated>0</truncated>
<difficult>0</difficult>
<bndbox>
<xmin>418</xmin>
<ymin>0</ymin>
<xmax>513</xmax>
<ymax>52</ymax>
</bndbox>
</object>
<object>
<name>wheat</name>
<pose>Unspecified</pose>
<truncated>0</truncated>
<difficult>0</difficult>
<bndbox>
<xmin>445</xmin>
<ymin>50</ymin>
<xmax>488</xmax>
<ymax>95</ymax>
</bndbox>
</object>
<object>
<name>wheat</name>
<pose>Unspecified</pose>
<truncated>0</truncated>
<difficult>0</difficult>
<bndbox>
<xmin>536</xmin>
<ymin>150</ymin>
<xmax>615</xmax>
<ymax>234</ymax>
</bndbox>
</object>
<object>
<name>wheat</name>
<pose>Unspecified</pose>
<truncated>0</truncated>
<difficult>0</difficult>
<bndbox>
<xmin>470</xmin>
<ymin>103</ymin>
<xmax>523</xmax>
<ymax>160</ymax>
</bndbox>
</object>
<object>
<name>wheat</name>
<pose>Unspecified</pose>
<truncated>0</truncated>
<difficult>0</difficult>
<bndbox>
<xmin>596</xmin>
<ymin>0</ymin>
<xmax>640</xmax>
<ymax>49</ymax>
</bndbox>
</object>
<object>
<name>wheat</name>
<pose>Unspecified</pose>
<truncated>0</truncated>
<difficult>0</difficult>
<bndbox>
<xmin>515</xmin>
<ymin>58</ymin>
<xmax>538</xmax>
<ymax>109</ymax>
</bndbox>
</object>
<object>
<name>wheat</name>
<pose>Unspecified</pose>
<truncated>0</truncated>
<difficult>0</difficult>
<bndbox>
<xmin>287</xmin>
<ymin>80</ymin>
<xmax>331</xmax>
<ymax>123</ymax>
</bndbox>
</object>
<object>
<name>wheat</name>
<pose>Unspecified</pose>
<truncated>0</truncated>
<difficult>0</difficult>
<bndbox>
<xmin>444</xmin>
<ymin>175</ymin>
<xmax>483</xmax>
<ymax>217</ymax>
</bndbox>
</object>
<object>
<name>wheat</name>
<pose>Unspecified</pose>
<truncated>0</truncated>
<difficult>0</difficult>
<bndbox>
<xmin>551</xmin>
<ymin>50</ymin>
<xmax>576</xmax>
<ymax>84</ymax>
</bndbox>
</object>
</annotation>
这里主要是想要尝试下最为轻量级的n系列的模型的检测效果,这里我们加入了CBAM注意力机制,模型如下:
# YOLOv5 🚀 by Ultralytics, GPL-3.0 license
# Parameters
nc: 1 # number of classes
depth_multiple: 0.33 # model depth multiple
width_multiple: 0.25 # 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次epoch的迭代计算,结果详情如下所示:
【混淆矩阵】
混淆矩阵是在机器学习和统计学中常用的工具,用于评估分类模型的性能。它是一个方阵,其中的每个元素表示模型对样本的分类结果与实际标签之间的一种组合。混淆矩阵可以帮助我们了解模型在不同类别上的分类准确度和错误情况。
混淆矩阵的四个基本术语如下:
- 真正类(True Positive,TP):模型正确地将正例(Positive)样本分类为正例。
- 假负类(False Negative,FN):模型错误地将正例样本分类为负例。
- 假正类(False Positive,FP):模型错误地将负例样本分类为正例。
- 真负类(True Negative,TN):模型正确地将负例样本分类为负例。
【Precision曲线】
精确率曲线(Precision-Recall Curve)是一种用于评估二分类模型在不同阈值下的精确率性能的可视化工具。它通过绘制不同阈值下的精确率和召回率之间的关系图来帮助我们了解模型在不同阈值下的表现。
精确率(Precision)是指被正确预测为正例的样本数占所有预测为正例的样本数的比例。召回率(Recall)是指被正确预测为正例的样本数占所有实际为正例的样本数的比例。
绘制精确率曲线的步骤如下:
使用不同的阈值将预测概率转换为二进制类别标签。通常,当预测概率大于阈值时,样本被分类为正例,否则分类为负例。
对于每个阈值,计算相应的精确率和召回率。
将每个阈值下的精确率和召回率绘制在同一个图表上,形成精确率曲线。
根据精确率曲线的形状和变化趋势,可以选择适当的阈值以达到所需的性能要求。
通过观察精确率曲线,我们可以根据需求确定最佳的阈值,以平衡精确率和召回率。较高的精确率意味着较少的误报,而较高的召回率则表示较少的漏报。根据具体的业务需求和成本权衡,可以在曲线上选择合适的操作点或阈值。
精确率曲线通常与召回率曲线(Recall Curve)一起使用,以提供更全面的分类器性能分析,并帮助评估和比较不同模型的性能。
【Recall曲线】
召回率曲线(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值越高表示模型的性能越好。
通过观察精确率-召回率曲线,我们可以根据需求选择合适的阈值来权衡精确率和召回率之间的平衡点。根据具体的业务需求和成本权衡,可以在曲线上选择合适的操作点或阈值。
【训练指标可视化】
【Batch计算实例】
从评估效果和实际测试结果上来看,轻量级的模型表现也还是不错的,感兴趣的话都可以自行实践下。