YOLO,全称为"You Only Look Once",是一种实时目标检测算法。它由Joseph Redmon、Santosh Divvala、Ross Girshick和Ali Farhadi在2016年提出,核心在于将目标检测任务视为一个回归问题,直接从完整的输入图像中预测出边界框(bbox)和类别的概率。

YOLO的基本原理:

  1. 统一检测:YOLO摒弃了传统两阶段检测法的复杂流程,采用单阶段策略,无需生成候选区域,直接在整张图像的SxS网格上执行检测。每个网格旨在判断是否有物体存在及其中心位置是否落于该网格。
  2. 边界框预测:每个网格预测B个边界框,包含物体的位置信息(x, y, width, height)及置信度分数,该分数反映框内有物体的概率及框的准确度。同时,预测C个类别概率,指明框内物体可能所属的类别。
  3. 损失函数:通过一个多任务损失函数整合分类、定位及置信度的误差,以此来训练网络,优化检测性能。
    YOLO因其实时性和高效性,在诸如视频监控、自动驾驶、无人机等领域得到广泛应用,成为目标检测技术中的一个重要里程碑。

YOLOv8版本介绍:

YOLOv8是YOLO(You Only Look Once)系列目标检测模型的最新版本,由 Ultralytics 团队开发。YOLO 系列因其速度与准确性平衡而广受欢迎,尤其适合实时对象检测任务。YOLOv8 在继承了前代版本优势的基础上,引入了多项改进和新特性,主要亮点包括:

  1. 基于PyTorch的模型架构:YOLOv8完全使用PyTorch构建,这使得模型更易于定制、调试和部署。
  2. 无代码训练与推理:Ultralytics为YOLOv8提供了一个强大的命令行界面(CLI)工具,允许用户无需编写代码即可进行模型训练、微调、推理等操作,极大地降低了使用的门槛。
  3. 模型优化:YOLOv8对模型架构进行了优化,引入了EfficientNet等高效网络结构作为骨干网络,提升了模型在不同尺寸目标上的检测性能,同时保持了高效的推理速度。
  4. 自动注释与数据增强:集成了自动标注工具和先进的数据增强技术,帮助用户更高效地准备训练数据。
  5. 多任务学习:除了基本的目标检测外,YOLOv8还支持实例分割、关键点检测等多种任务,实现了统一的模型框架处理多种计算机视觉任务。
  6. 模型大小可选:YOLOv8提供了从Nano到X的大规模模型变体,用户可以根据具体需求选择合适的模型大小,平衡精度与速度。
  7. 推理优化:针对推理速度进行了特别优化,支持ONNX、TensorRT、OpenVINO等多种推理加速方式,确保在各种硬件平台上都能实现快速推理。
  8. 更新的损失函数与训练策略:采用更先进的损失函数和训练策略,如自适应anchors生成、更精细的梯度优化方法等,进一步提升训练效率和检测精度。
    总的来说,YOLOv8是一个高度优化且用户友好的目标检测框架,不仅在性能上有所提升,而且在易用性和灵活性方面也做了大量改进,非常适合研究人员和开发者用于各种计算机视觉项目。

阴阳师游戏中的实际应用场景:

  1. 探索任务的优化:

    1. 在Buff可以实现快速检测出:经验、金币、达摩(Buff);
    2. 同时检测出战斗标志,通过勾股定理找到Buff距离最近的战斗标志;
    3. 2步骤的优化:可以检索出所有斜边的值,若在范围内,则点击战斗标志;
    4. 3步骤的优化可以避免:场景内有一只需战斗的Buff怪,但没有这只怪的战斗图标时,此根据b的逻辑就会打其它不想打的Buff怪;
  2. 场景识别的优化:

    1. YOLOv8有分类的功能,可以将游戏中所有场景进行归类,跑一个场景识别模型;
    2. 目前根据猜想可以训练的场景分类有:庭院、式神录、战斗场景、斗技、逢魔之时等各种场景;(本人尚未有时间实现)

CSharp中的YOLOv8:

YOLOv8的实现是使用YOLOv8.NET(Nuget包)来实现的;

经本人电脑测试,该包的GPU版本一致是报错(dll找不到、dll载入失败等),在CPU环境下使用YOLO会导致处理器占用急剧上升,但也还好,占用利用率差不多处于50%-70%之间(仅单线程测试);

YOLO在脚本软件中,如果是CPU支持,还是尽量少使用模型检测;后续还是会继续研究尝试,开启GPU使用...

关于少用YOLO模型检查,可以做到的:

  • 在探索任务检测目标时的YOLO扫描频次减少、周期间隔增加;
  • 在场景判断时,优先使用大漠插件判断,若没有结果则启用模型检测;

关于CSharp中多线程使用YOLO:

  • 作为静态辅助类(未测试多线程占用表现):

    • 需加锁lock使用;
    • 多个模型切换时,可以缓存对象到本地,再次切换时直接调用缓存对象;
  • 动态实例类(未实现):

    • 我的猜测时无需做加锁处理,因为每个实例对象均互不影响,后期做验证;