本研究旨在基于改进的YOLOv8模型,构建一个高效的农作物病害图像分割系统。该系统将利用一个包含1000张图像的数据集,涵盖29种不同类别的农作物病害。这些类别包括健康和不健康的甜椒、黄瓜、生菜、草莓和番茄等,能够有效地反映出不同作物在遭受病害时的表现。这一数据集的多样性和丰富性为模型的训练提供了良好的基础,使其能够在实际应用中更好地适应不同的农作物病害识别需求。
在传统的农作物病害识别方法中,往往依赖于人工观察和经验判断,这不仅效率低下,而且容易受到主观因素的影响。通过引入基于深度学习的图像分割技术,可以显著提高病害识别的准确性和效率。YOLOv8模型的改进版本,结合了先进的图像处理技术,能够实现对农作物病害的精确分割,帮助农民及时发现病害并采取相应的防治措施。
此外,农作物病害的及时识别不仅对提高作物产量具有重要意义,也对保障食品安全、促进可持续农业发展起到了积极的推动作用。通过对病害的早期检测,可以有效减少农药的使用,降低环境污染,推动绿色农业的发展。因此,构建一个基于改进YOLOv8的农作物病害图像分割系统,不仅具有重要的学术价值,也具有广泛的应用前景。
综上所述,本研究通过改进YOLOv8模型,构建农作物病害图像分割系统,旨在为农业病害管理提供一种高效、准确的技术手段。这一研究不仅能够推动农业智能化的发展,也为实现农业可持续发展目标提供了有力支持。随着技术的不断进步和应用的深入,期待该系统能够在未来的农业生产中发挥更大的作用,助力农民增收、促进农业现代化。
(1)适配了YOLOV8的“目标检测”模型和“实例分割”模型,通过加载相应的权重(.pt)文件即可自适应加载模型。
(2)支持“图片识别”、“视频识别”、“摄像头实时识别”三种识别模式。
(3)支持“图片识别”、“视频识别”、“摄像头实时识别”三种识别结果保存导出,解决手动导出(容易卡顿出现爆内存)存在的问题,识别完自动保存结果并导出到tempDir中。
(4)支持Web前端系统中的标题、背景图等自定义修改,后面提供修改教程。
另外本项目提供训练的数据集和训练教程,暂不提供权重文件(best.pt),需要您按照教程进行训练后实现图片演示和Web前端界面演示的效果。
数据集信息展示
在农业领域,作物病害的早期识别与处理对于保障农作物的健康生长和提高产量至关重要。为此,本研究采用了名为“CropDiseaseIdentification”的数据集,以训练和改进YOLOv8-seg模型,旨在实现高效的农作物病害图像分割系统。该数据集包含20个不同的类别,涵盖了多种常见农作物的健康与病害状态,能够为模型提供丰富的训练样本,从而提升其在实际应用中的准确性和鲁棒性。
具体而言,数据集中包括了多种不同类型的作物及其病害表现。例如,甜椒的叶片健康与不健康状态被清晰地标注,便于模型学习如何区分健康的植物组织与受到病害侵袭的部分。黄瓜作为另一种重要的农作物,其叶片和果实的健康与病害状态同样被详细记录,尤其是黄瓜花叶病和白粉病等特定病害的表现,为模型提供了丰富的学习素材。此外,生菜的多种病害,如细菌性叶斑病、霜霉病以及多种病毒感染,也在数据集中得到了充分体现。这些多样化的病害信息不仅增加了数据集的复杂性,也为模型的学习提供了多维度的挑战。
此外,草莓和番茄作为广泛种植的作物,其健康与病害状态同样被纳入数据集。草莓的健康叶片与角斑病的表现,以及番茄早期枯萎病的特征,都为模型的训练提供了必要的参考。这些类别的细致划分使得模型能够在识别过程中更加精准,能够有效地区分不同作物的健康状态与病害类型,从而实现更为精确的图像分割。
在数据集的构建过程中,确保了每个类别的样本数量和质量,以保证模型训练的有效性。通过多样化的图像采集和标注,数据集不仅涵盖了不同生长阶段的作物图像,还考虑了不同环境条件下的表现。这种全面性使得模型在面对真实世界中的复杂情况时,能够展现出更强的适应能力和识别准确性。
综上所述,“CropDiseaseIdentification”数据集为改进YOLOv8-seg的农作物病害图像分割系统提供了坚实的基础。通过对20个类别的详细标注和丰富样本的提供,该数据集不仅能够帮助模型学习到不同作物的病害特征,还能提升其在实际应用中的表现。随着农业科技的不断进步,借助于这一数据集所训练出的模型,将为农作物的健康管理和病害防治提供更为精准和高效的解决方案,助力现代农业的可持续发展。
按照上面的训练视频教程链接加载项目提供的数据集,运行train.py即可开始训练
原始YOLOv8-seg算法原理
YOLOv8-seg算法是YOLO系列模型的最新版本,它在目标检测的基础上,进一步扩展了实例分割的能力。作为一种先进的计算机视觉技术,YOLOv8-seg不仅具备了快速而高效的目标检测能力,还能够对图像中的目标进行精确的像素级分割,从而实现更为细致的图像理解。YOLOv8-seg的设计理念和实现方法,体现了深度学习领域的最新研究成果,尤其是在卷积神经网络(CNN)架构的优化、特征提取与融合、以及损失函数的改进等方面。
YOLOv8-seg的核心结构依然遵循YOLO系列的传统,即由Backbone、Neck和Head三部分组成。Backbone部分负责从输入图像中提取多层次的特征,通常采用深度卷积网络以增强特征提取的能力。YOLOv8在Backbone中引入了CSP(CrossStagePartial)结构,这种结构通过分割和合并特征图,能够有效减少计算量,同时提升模型的表达能力。相较于之前的版本,YOLOv8的Backbone设计更加深度和宽度可调,用户可以根据具体应用需求灵活设置depth_factor和width_factor,以适应不同的硬件环境和任务复杂度。
在Neck部分,YOLOv8-seg采用了PAN-FPN(PathAggregationNetwork-FeaturePyramidNetwork)结构,旨在通过特征融合提升不同尺度目标的检测性能。PAN-FPN通过将不同层次的特征图进行连接和融合,能够有效地捕捉到图像中目标的多尺度信息。这一设计使得YOLOv8-seg在处理小目标和大目标时,均能保持较高的检测精度和分割效果。
Head部分是YOLOv8-seg的关键所在,它采用了全新的Anchor-Free检测头,摒弃了传统的Anchor-Based方法。通过这种解耦设计,YOLOv8-seg能够独立处理目标的分类和回归任务,进一步提升了模型的灵活性和准确性。解耦头的引入,使得模型在处理复杂场景时,能够更好地应对目标重叠和密集分布的情况。此外,YOLOv8-seg还引入了新的损失函数,以优化分割任务的训练过程,确保模型在像素级别的精度。
在训练过程中,YOLOv8-seg利用多尺度训练策略,通过对不同分辨率的图像进行训练,增强了模型的泛化能力。这种方法使得模型能够在不同场景和条件下,保持较高的检测和分割性能。同时,YOLOv8-seg还支持数据增强技术,通过随机裁剪、旋转、翻转等方式,进一步丰富训练数据,提高模型的鲁棒性。
YOLOv8-seg的应用场景非常广泛,涵盖了智能监控、自动驾驶、医学影像分析等多个领域。在智能监控中,YOLOv8-seg能够实时检测和分割出监控画面中的人、车、物等目标,为安全监控提供有力支持。在自动驾驶领域,YOLOv8-seg可以精确识别道路上的行人、车辆和交通标志,为自动驾驶系统提供重要的环境感知能力。此外,在医学影像分析中,YOLOv8-seg能够对CT、MRI等医学图像进行精确分割,辅助医生进行疾病诊断。
总的来说,YOLOv8-seg算法在YOLO系列的基础上,结合了最新的深度学习技术和优化策略,极大地提升了目标检测和实例分割的性能。其高效的推理速度和优越的精度,使得YOLOv8-seg成为当前计算机视觉领域中的一项重要工具。随着技术的不断进步,YOLOv8-seg有望在更多实际应用中发挥更大的作用,推动计算机视觉技术的进一步发展。
图9.1.系统支持检测结果表格显示
图9.2.系统支持置信度和IOU阈值手动调节
图9.3.系统支持自定义加载权重文件best.pt(需要你通过步骤5中训练获得)
图9.4.系统支持摄像头实时识别
图9.5.系统支持图片识别
图9.6.系统支持视频识别
图9.7.系统支持识别结果文件自动保存
图9.8.系统支持Excel导出检测结果数据
尽管ViT在低分辨率和高计算领域取得了巨大成功,但在高分辨率和低计算场景下,ViT仍不如cnn。例如,下图(左)比较了COCO数据集上当前基于cnn和基于vit的一级检测器。基于vit的检测器(160Gmac)和基于cnn的检测器(6Gmac)之间的效率差距超过一个数量级。这阻碍了在边缘设备的实时高分辨率视觉应用程序上部署ViT。
左图:现有的基于vit的一级检测器在实时目标检测方面仍然不如当前基于cnn的一级检测器,需要的计算量多出一个数量级。本文引入了第一个基于vit的实时对象检测器来弥补这一差距。在COCO上,efficientvit的AP比efficientdet高3.8,而mac较低。与YoloX相比,efficientViT节省67.2%的计算成本,同时提供更高的AP。
中:随着输入分辨率的增加,计算成本呈二次增长,无法有效处理高分辨率的视觉应用。
右图:高分辨率对图像分割很重要。当输入分辨率从1024x2048降低到512x1024时,MobileNetV2的mIoU减少12%(8.5mIoU)。在不提高分辨率的情况下,只提高模型尺寸是无法缩小性能差距的。
解决这个问题的一个直接方法是降低输入分辨率。然而,高分辨率的视觉识别在许多现实世界的计算机视觉应用中是必不可少的,如自动驾驶,医疗图像处理等。当输入分辨率降低时,图像中的小物体和精细细节会消失,导致目标检测和语义分割性能显著下降。
上图(右)显示了在cityscape数据集上不同输入分辨率和宽度乘法器下MobileNetV2的性能。例如,将输入分辨率从1024x2048降低到512x1024会使cityscape的性能降低12%(8.5mIoU)。即使是3.6倍高的mac,只放大模型尺寸而不增加分辨率也无法弥补这一性能损失。
除了降低分辨率外,另一种代表性的方法是限制softmax注意,方法是将其范围限制在固定大小的局部窗口内[Swintransformer,Swintransformerv2]或降低键/值张量的维数[Pyramidvisiontransformer,Segformer]。然而,它损害了ViT的非局部注意能力,降低了全局接受域(ViT最重要的优点),使得ViT与大内核cnn的区别更小[Aconvnetforthe2020s,Scalingupyourkernelsto31x31:Revisitinglargekerneldesignincnns,Litepose:Efficientarchitecturedesignfor2dhumanposeestimation]。
本文介绍了一个有效的ViT体系结构,以解决这些挑战。发现没有必要坚持softmax注意力。本文建议用线性注意[Transformersarernns:Fastautoregressivetransformerswithlinearattention]代替softmax注意。
线性注意的关键好处是,它保持了完整的n2n^2n2注意映射,就像softmax注意。同时,它利用矩阵乘法的联想特性,避免显式计算完整的注意映射,同时保持相同的功能。因此,它保持了softmax注意力的全局特征提取能力,且计算复杂度仅为线性。线性注意的另一个关键优点是它避免了softmax,这使得它在移动设备上更有效(下图左)。
左图:线性注意比类似mac下的softmax注意快3.3-4.5倍,这是因为去掉了硬件效率不高的softmax功能。延迟是在QualcommSnapdragon855CPU和TensorFlow-Lite上测量的。本文增加线性注意的头部数量,以确保它具有与softmax注意相似的mac。
中:然而,如果没有softmax注意中使用的非线性注意评分归一化,线性注意无法有效集中其注意分布,削弱了其局部特征提取能力。后文提供了可视化。
右图:本文用深度卷积增强线性注意,以解决线性注意的局限性。深度卷积可以有效地捕捉局部特征,而线性注意可以专注于捕捉全局信息。增强的线性注意在保持线性注意的效率和简单性的同时,表现出在各种视觉任务上的强大表现(图4)。
然而,直接应用线性注意也有缺点。以往的研究表明线性注意和softmax注意之间存在显著的性能差距(下图中间)。
左:高通骁龙855上的精度和延迟权衡。效率vit比效率网快3倍,精度更高。中:ImageNet上softmax注意与线性注意的比较。在相同的计算条件下,本文观察到softmax注意与线性注意之间存在显著的精度差距。而深度卷积增强模型后,线性注意的精度有明显提高。
相比之下,softmax注意的精度变化不大。在相同MAC约束下,增强线性注意比增强软最大注意提高了0.3%的精度。右图:与增强的softmax注意相比,增强的线性注意硬件效率更高,随着分辨率的增加,延迟增长更慢。
深入研究线性注意和softmax注意的详细公式,一个关键的区别是线性注意缺乏非线性注意评分归一化方案。这使得线性注意无法有效地将注意力分布集中在局部模式产生的高注意分数上,从而削弱了其局部特征提取能力。
本文认为这是线性注意的主要限制,使其性能不如softmax注意。本文提出了一个简单而有效的解决方案来解决这一限制,同时保持线性注意在低复杂度和低硬件延迟方面的优势。具体来说,本文建议通过在每个FFN层中插入额外的深度卷积来增强线性注意。因此,本文不需要依赖线性注意进行局部特征提取,避免了线性注意在捕捉局部特征方面的不足,并利用了线性注意在捕捉全局特征方面的优势。
本文广泛评估了efficientvit在低计算预算下对各种视觉任务的有效性,包括COCO对象检测、城市景观语义分割和ImageNet分类。本文想要突出高效的主干设计,所以没有包括任何正交的附加技术(例如,知识蒸馏,神经架构搜索)。尽管如此,在COCOval2017上,efficientvit的AP比efficientdet-d1高2.4倍,同时节省27.9%的计算成本。在cityscape上,efficientvit提供了比SegFormer高2.5个mIoU,同时降低了69.6%的计算成本。在ImageNet上,efficientvit在584Mmac上实现了79.7%的top1精度,优于efficientnet-b1的精度,同时节省了16.6%的计算成本。
与现有的以减少参数大小或mac为目标的移动ViT模型[Mobile-former,Mobilevit,NASVit]不同,本文的目标是减少移动设备上的延迟。本文的模型不涉及复杂的依赖或硬件低效操作。因此,本文减少的计算成本可以很容易地转化为移动设备上的延迟减少。
在高通骁龙855CPU上,efficientvit运行速度比efficientnet快3倍,同时提供更高的ImageNet精度。本文的代码和预训练的模型将在出版后向公众发布。
提高ViT的效率对于在资源受限的边缘平台上部署ViT至关重要,如手机、物联网设备等。尽管ViT在高计算区域提供了令人印象深刻的性能,但在针对低计算区域时,它通常不如以前高效的cnn[Efficientnet,mobilenetv3,Onceforall:Trainonenetworkandspecializeitforefficientdeployment]。为了缩小差距,MobileViT建议结合CNN和ViT的长处,使用transformer将卷积中的局部处理替换为全局处理。MobileFormer提出了在MobileNet和Transformer之间建立双向桥以实现特征融合的并行化。NASViT提出利用神经架构搜索来搜索高效的ViT架构。
这些模型在ImageNet上提供了极具竞争力的准确性和效率的权衡。然而,它们并不适合高分辨率的视觉任务,因为它们仍然依赖于softmax注意力。
在本节中,本文首先回顾了自然语言处理中的线性注意,并讨论了它的优缺点。接下来,本文介绍了一个简单而有效的解决方案来克服线性注意的局限性。最后,给出了efficientvit的详细架构。
为可学习投影矩阵。Oi表示矩阵O的第i行。Sim(·,·)为相似度函数。
虽然softmax注意力在视觉和NLP方面非常成功,但它并不是唯一的选择。例如,线性注意提出了如下相似度函数:
线性注意的一个关键优点是,它允许利用矩阵乘法的结合律,在不改变功能的情况下,将计算复杂度从二次型降低到线性型:
除了线性复杂度之外,线性注意的另一个关键优点是它不涉及注意模块中的softmax。Softmax在硬件上效率非常低。避免它可以显著减少延迟。例如,下图(左)显示了softmax注意和线性注意之间的延迟比较。在类似的mac上,线性注意力比移动设备上的softmax注意力要快得多。
EnhancingLinearAttentionwithDepthwiseConvolution
本文对这一假设提出了质疑,认为线性注意的低劣性能主要是由于局部特征提取能力的丧失。如果没有在softmax注意中使用的非线性评分归一化,线性注意很难像softmax注意那样集中其注意分布。下图(中间)提供了这种差异的示例。
在相同的原始注意力得分下,使用softmax比不使用softmax更能集中注意力。因此,线性注意不能有效地聚焦于局部模式产生的高注意分数(下图),削弱了其局部特征提取能力。
注意图的可视化显示了线性注意的局限性。通过非线性注意归一化,softmax注意可以产生清晰的注意分布,如中间行所示。相比之下,线性注意的分布相对平滑,使得线性注意在捕捉局部细节方面的能力较弱,造成了显著的精度损失。本文通过深度卷积增强线性注意来解决这一限制,并有效提高了准确性。
介绍了一个简单而有效的解决方案来解决这个限制。本文的想法是用卷积增强线性注意,这在局部特征提取中是非常有效的。这样,本文就不需要依赖于线性注意来捕捉局部特征,而可以专注于全局特征提取。具体来说,为了保持线性注意的效率和简单性,本文建议在每个FFN层中插入一个深度卷积,这样计算开销很小,同时极大地提高了线性注意的局部特征提取能力。
下图(右)展示了增强线性注意的详细架构,它包括一个线性注意层和一个FFN层,在FFN的中间插入深度卷积。
与之前的方法[Swintransformer,Coatnet]不同,本文在efficientvit中没有使用相对位置偏差。相对位置偏差虽然可以改善模型的性能,但它使模型容易受到分辨率变化[Segformer]的影响。多分辨率训练或新分辨率下的测试在检测和分割中很常见。去除相对位置偏差使高效率vit对输入分辨率更加灵活。
与之前低计算CNNs[Mobilenetv2,mobilenetv3]的设计不同,本文为下采样块添加了额外的下采样快捷方式。每个下采样快捷方式由一个平均池和一个1x1卷积组成。在本文的实验中,这些额外的下采样快捷方式可以稳定训练效率,提高性能。
下图说明了efficientvit的宏观体系结构。它由输入stem和4级组成。最近的研究[Coatnet,Levit,Earlyconvolutionshelptransformersseebetter]表明在早期阶段使用卷积对ViT更好。本文遵循这个设计,在第三阶段开始使用增强的线性注意。
EfficientViT宏观架构。本文从第三阶段开始使用增强的线性注意。P2、P3和P4形成了一个金字塔特征图,用于检测和分割。P4用于分类。
为了突出高效的主干本身,本文对MBConv和FFN使用相同的扩展比e(e=4)保持超参数简单,对所有深度卷积使用相同的内核大小k(除了输入stem),对所有层使用相同的激活函数(hardswish)。
P2、P3和P4表示阶段2、3和4的输出,形成了特征图的金字塔。本文按照惯例将P2、P3和P4送至检测头。本文使用Yolov8进行检测。为了分割,本文融合了P2和P4。融合特征被馈送到一个轻量级头,包括几个卷积层,遵循Fast-SCNN。为了分类,本文将P4输入到轻量级头部,与MobileNetV3相同。
最后,__all__变量被定义为一个元组,包含了三个类的名称。这意味着当使用fromultralytics.models.yolo.detectimport*这种方式导入时,只会导入DetectionPredictor、DetectionTrainer和DetectionValidator这三个类。这种做法有助于控制模块的公共接口,避免不必要的命名冲突或暴露内部实现细节。
以下是代码中最核心的部分,并附上详细的中文注释:
文件中定义了一些私有函数,用于记录不同类型的数据到NeptuneAI实验日志中。_log_scalars函数用于记录标量数据,比如损失值和学习率;_log_images函数用于上传图像数据;_log_plot函数用于记录绘图数据,接收绘图标题和路径,并使用Matplotlib读取和上传图像。
接下来,定义了一些回调函数,这些函数在训练的不同阶段被调用。on_pretrain_routine_start函数在训练开始前被调用,初始化Neptune运行并记录超参数配置。on_train_epoch_end函数在每个训练周期结束时被调用,记录训练损失和学习率,并在第一轮结束时上传训练批次的图像。on_fit_epoch_end函数在每个训练和验证周期结束时被调用,记录模型的配置信息和训练指标。on_val_end函数在验证结束时被调用,上传验证图像。最后,on_train_end函数在训练结束时被调用,记录最终结果、混淆矩阵和其他性能曲线,并上传最佳模型的权重。
最后,程序将这些回调函数组织成一个字典,只有在成功导入Neptune时才会创建这个字典,以便在训练过程中根据需要调用相应的回调函数。整体上,这个模块的目的是方便用户在使用YOLO模型进行训练时,能够将训练过程中的重要数据实时记录到NeptuneAI中,便于后续的分析和可视化。
在文件中,定义了一些辅助函数来处理图像和图表的记录。_log_images函数用于记录指定路径下的图像,并支持使用前缀来组织图像。_log_plots函数则用于记录训练过程中的图表,如果图表未被处理过,则会记录这些图表。_log_confusion_matrix函数用于记录混淆矩阵,这对于分类任务的性能评估非常重要。
on_train_epoch_start函数在每个训练周期开始时设置一个全局变量,表示当前正在进行训练周期。on_fit_epoch_end函数在每个训练周期结束时记录训练指标和模型信息,并调用_log_plots函数记录训练和验证的图表。on_train_end函数在训练结束时记录最佳指标、图表和混淆矩阵,并结束DVCLive的记录。
最后,代码定义了一个回调字典callbacks,其中包含了所有在DVCLive启用时需要调用的回调函数。如果DVCLive未启用,则该字典将为空。这个文件的整体目的是通过DVCLive提供的功能来增强模型训练过程中的可视化和记录能力,帮助用户更好地理解和分析模型的性能。
这个程序文件ultralytics/utils/files.py是一个用于处理文件和目录的工具类,主要用于在UltralyticsYOLO项目中。文件中定义了一些函数和类,帮助用户管理工作目录、处理路径、获取文件信息等。
接下来,定义了一个WorkingDirectory类,它是一个上下文管理器,用于在特定的工作目录中执行代码。通过使用@WorkingDirectory(dir)装饰器或withWorkingDirectory(dir):语句,用户可以方便地在指定目录下执行代码,执行完毕后会自动恢复到原来的工作目录。
然后,定义了一个spaces_in_path上下文管理器,用于处理路径中包含空格的情况。如果路径中有空格,它会将空格替换为下划线,并将文件或目录复制到一个临时路径中。在执行上下文代码块后,它会将文件或目录复制回原来的位置。这对于处理某些文件系统或工具不支持空格的情况非常有用。
接着,increment_path函数用于递增文件或目录的路径。如果指定的路径已经存在,并且exist_ok参数为False,则会在路径后面添加一个数字(例如runs/exp2、runs/exp3等)。这个函数还可以选择创建目录。
file_age函数返回自上次文件更新以来的天数,而file_date函数返回文件的可读修改日期。file_size函数则用于返回文件或目录的大小,单位为MB。
最后,get_latest_run函数用于返回指定目录中最新的last.pt文件的路径,这通常用于恢复训练过程。
总体来说,这个文件提供了一系列实用的工具函数和上下文管理器,帮助用户更方便地处理文件和目录,尤其是在机器学习和深度学习的训练过程中。
接下来的几行代码是从其他模块导入了三个类:SegmentationPredictor、SegmentationTrainer和SegmentationValidator。这些类分别用于图像分割的不同功能。具体来说,SegmentationPredictor可能用于进行图像分割的预测,SegmentationTrainer用于训练模型,而SegmentationValidator则用于验证模型的性能。
最后一行代码定义了__all__,这是一个特殊的变量,用于控制当使用frommoduleimport*语句时,哪些名称会被导入。在这里,只有SegmentationPredictor、SegmentationTrainer和SegmentationValidator这三个类会被导入,这有助于避免命名冲突并保持命名空间的整洁。
项目的主要组成部分包括:
注意:由于此博客编辑较早,上面“11.项目核心源码讲解(再也不用担心看不懂代码逻辑)”中部分代码可能会优化升级,仅供参考学习,完整“训练源码”、“Web前端界面”和“50+种创新点源码”以“14.完整训练+Web前端界面+50+种创新点源码、数据集获取”的内容为准。
在这个博客小节中,我们将讨论如何在不使用WebUI的情况下,实现图像分割模型的使用。本项目代码已经优化整合,方便用户将分割功能嵌入自己的项目中。核心功能包括图片、视频、摄像头图像的分割,ROI区域的轮廓提取、类别分类、周长计算、面积计算、圆度计算以及颜色提取等。这些功能提供了良好的二次开发基础。
以下是主要代码片段,我们会为每一块代码进行详细的批注解释: