素质の小屋
首页项目归档照片墙音乐灵境说说杂谈友链关于
封面

suzhiCyolo / cs2 预实战

写作时间:2026-07-23T05:44:00
# yolo
# C++

观前提醒

本文仅用于自身经验分享,无任何教导、引诱、教唆、制作外挂等违法行为。

本声明适用于 suzhiYOLO / suzhiCyolo 等由 su素质(以下简称"作者")发布的开源项目。 在下载、使用或修改本项目代码前,请仔细阅读以下条款。使用即表示您已同意本免责声明全部内容。

1. 项目性质

本项目 仅供学习、研究及技术交流使用,旨在帮助开发者理解:

  • 内存读写与逆向工程原理
  • 深度学习目标检测在游戏场景中的应用
  • Windows / Android 平台下的系统编程与驱动开发

严禁将本项目或其衍生版本用于任何违反法律法规、游戏服务条款或破坏他人合法权益的场景。

2. 使用限制

使用本项目时,您同意并承诺:

  • 不得 将本项目用于任何商业目的(包括但不限于出售、租赁、捆绑收费等);
  • 不得 将本项目用于任何线上/线下游戏的作弊行为,或破坏游戏公平性的活动;
  • 不得 利用本项目侵犯任何第三方的知识产权、隐私权或其他合法权益;
  • 不得 绕过游戏运营商的反作弊系统(Anti-Cheat)进行非法数据修改;
  • 不得 将本项目代码用于恶意软件、勒索病毒、间谍软件等非法开发行为。

3. 免责条款

3.1 无担保声明

本项目以 "按原样"(AS IS) 方式提供,作者不提供任何明示或暗示的担保,包括但不限于:

  • 适销性(Merchantability)
  • 特定用途的适用性(Fitness for a Particular Purpose)
  • 无侵权(Non-infringement)
  • 代码的正确性、稳定性、安全性或兼容性

3.2 风险自负

您理解并同意,使用本项目所产生的一切风险(包括但不限于账号封禁、设备损坏、数据丢失、法律责任、经济损失等)均由您自行承担。作者不对任何直接、间接、偶然、特殊或惩罚性的损害承担责任。

3.3 第三方依赖

本项目可能包含第三方开源库或工具,相关版权及许可条件请参考各自独立的许可文件。作者不对第三方库的安全性、合法性或性能负责。

4. 法律合规声明

  • 用户应自行确认所在国家或地区的法律法规,确保使用本项目的合法性。
  • 若本项目被用于违反游戏运营商服务条款的行为,作者不承担任何连带责任。
  • 作者保留随时修改、更新或停止本项目维护的权利,恕不另行通知。

5. 开源许可证

本项目采用 MIT 许可证(或您实际使用的许可证),具体条款见项目根目录的 LICENSE 文件。 在遵守 MIT 许可的前提下,您有权使用、复制、修改、合并、发布、分发本项目代码,但必须保留原始版权声明和本免责声明。

6. 最终解释权

本免责声明的最终解释权归作者所有。如有任何疑问,可通过项目仓库的 Issue 或作者指定的联系方式进行咨询。

继续观看视为同意上述协议


环境配置

在使用 YOLO 框架前,我们需要先配置基础环境。

Python 环境(3.10+ 推荐):

pip install ultralytics
pip install onnxruntime          # CPU 推理
pip install onnxruntime-directml # GPU 推理(Windows,需要 DirectML 支持)

如果你只是跑 YOLO 训练,装好 ultralytics 就够了。ONNX Runtime 和 DirectML 是后面部署到 C++ overlay 时才需要的。

C++ 编译环境(可选,部署阶段才用):

  • Visual Studio 2022 Build Tools(C++ 桌面开发工作负载)
  • vcpkg 或 NuGet 安装 Microsoft.ML.OnnxRuntime.DirectML

具体内容可自行查询,不再赘述。


YOLO 的基础认知

有了环境,我们就可以来进行数据集的准备了。

不过,在准备前,我们需要了解下 YOLO 的推理机制,方便我们理解。

YOLO 的推理结果并不是直接返回"这是敌人"或"这是队友"这样的文字描述, 返回的是一个 检测结果数组(列表),数组中的每一个元素对应一个被检测到的目标。

对于一个目标,YOLO 会返回以下信息:

  • class_id:一个整数,表示这个目标属于哪个类别。比如你训练时定义了 0=敌人、1=队友,那返回的 class_id=0 就代表"敌人"。
  • confidence:0 到 1 之间的浮点数,表示模型认为这个目标有多大概率属于这个类别。例如 0.85 表示模型有 85% 的把握这是一个敌人。
  • bounding box:一组坐标,用在屏幕上把这个目标"框"出来。常见的表示方式有:
    • 中心点坐标 + 宽高:(center_x, center_y, width, height),四个值都在 0~1 之间(相对于图片尺寸的归一化坐标)
    • 左上角 + 右下角坐标:(x1, y1, x2, y2),同样是 0~1 的归一化坐标

了解了个大概,就可以开始数据集的第一步:截图了。

截图工具已放到文章末尾,欢迎自取。


YOLO 数据集准备

首先,不要认为每一步都这么简单,对于新东西,我们保持严谨。

态度很重要。

虽然无非就是:

  • 上游戏
  • 打开工具
  • 选窗口范围
  • 开始截图
  • 打两把,或者盯着队友转两圈
  • 截图结束,下号
  • 标注

但是,角度、距离、分辨率这些同样重要,缺一不可,少一个 YOLO 识别效率都会大打折扣。 而且,一个优秀的模型训练至少需要数以万张的高精度训练数据集,卓越的更是数不胜数。 仅靠双手,如何才能避免误框、多框、少框这个难题?

你觉得我会说:"我没有天赋,我只有坚持…… 加大数据量,一个个手动标注。" 但那是弱者的思维。


AI 标注工具:X-AnyLabeling

开源nb

X-AnyLabeling 提供了一个非常之 nb 克拉斯的东西 —— AI 标注。

工作流程:

  1. 手动标注 10~20 张作为种子数据集
  2. 用这 10~20 张训练一个初始模型(哪怕精度一般也行)
  3. 把这个模型喂回 X-AnyLabeling,让它自动处理文件夹中剩余的图片
  4. 人工修正自动标注的结果,检查漏标、错标、多标

你只需要 10~20 张图,组成一个小数据集喂给一个模型,它就能直接帮你处理文件夹中剩余的图片,并转换为模型可用的数据集格式。

这将极大缩短我们标注、处理数据集的时间。

7月17日的素质 belike : 🤡

当然,工具虽好不要贪多。它虽然可以帮你处理绝大部分数据,但还是需要人工修正。 不然误标注对模型学习的影响也是很大的。


数据集目录与配置

参数说明

参数 含义
path 数据集的总目录,YOLO 会在这里找 train / val 子目录
train / val 训练/验证图片路径,可以是相对路径(如 images/train)、绝对路径或指向 .txt 文件(逐行列出图片路径)
nc 类别数量(Number of Classes),整数
names 类别名称字典,键为类别 ID(从 0 开始),值为名称字符串

目录结构示例

my_data/                     # 这就是 path 指向的目录
├── images/
│   ├── train/               # 训练图片
│   │   ├── img1.jpg
│   │   └── img2.jpg
│   └── val/                 # 验证图片
│       ├── img3.jpg
│       └── img4.jpg
├── labels/
│   ├── train/               # 训练标签,与图片一一对应
│   │   ├── img1.txt
│   │   └── img2.txt
│   └── val/                 # 验证标签
│       ├── img3.txt
│       └── img4.txt
└── my_data.yaml             # 配置文件

my_data.yaml 示例

path: ./my_data       # 数据集根目录
train: images/train   # 训练集图片
val: images/val       # 验证集图片

nc: 2                 # 类别数量
names: ["head", "full"]  # 类别名称,索引对应 class_id

注意:标签文件名必须与图片文件名一一对应(仅后缀不同)。例如 img1.jpg 对应 img1.txt。


标签文件 *.txt 格式

每张图片对应的 .txt 标签文件里,每一行代表一个目标:

class_id x_center y_center width height
  • class_id:类别 ID(整数,从0开始)
  • x_center, y_center, width, height:归一化浮点数(0~1之间)

例如,一张 640x480 的图片里,有一个"敌人"在中心,宽高是 100x100:

class_id = 0
x_center = 320/640 = 0.5
y_center = 240/480 = 0.5
width = 100/640 = 0.15625
height = 100/480 = 0.20833

那么 .txt 文件里就是一行:

0 0.5 0.5 0.15625 0.20833

提示:X-AnyLabeling 导出时会自动生成这个格式的标签文件,不需要手算。


YOLO 的训练

弄完了漫长的数据集,接下来就要喂给初始模型了。

依旧 YOLOv8n,轻量、够用。

训练脚本(Python)

在项目根目录新建 train.py:

from ultralytics import YOLO

# 加载预训练模型
model = YOLO("yolov8n.pt")

# 开始训练
results = model.train(
    data="my_data.yaml",        # 数据集配置文件
    epochs=100,                 # 训练轮数
    imgsz=320,                  # 输入图片尺寸
    batch=8,                    # 批大小
    device=0,                   # GPU ID,CPU 用 device="cpu"
    workers=4,                  # 数据加载线程数
    patience=50,                # 早停轮数
    optimizer="auto",           # 优化器(auto 自动选)
    lr0=0.01,                   # 初始学习率
    momentum=0.937,             # 动量
    weight_decay=0.0005,        # L2 正则化
    warmup_epochs=3,            # 预热轮数
    warmup_momentum=0.8,
    warmup_bias_lr=0.1,
    box=7.5,                    # 边界框损失权重
    cls=0.5,                    # 分类损失权重
    dfl=1.5,                    # 分布焦点损失权重
    hsv_h=0.015,                # 色相增强
    hsv_s=0.7,                  # 饱和度增强
    hsv_v=0.4,                  # 明度增强
    translate=0.1,              # 平移
    scale=0.5,                  # 缩放
    fliplr=0.5,                 # 左右翻转
    mosaic=1.0,                 # Mosaic 增强
    mixup=0.0,                  # Mixup 增强
    project="runs/train",       # 结果保存目录
    name="suzhiyolo_exp",       # 实验名
    exist_ok=True,              # 覆盖同名目录
    amp=True,                   # 混合精度
    plots=True,                 # 生成曲线图
    val=True,                   # 边训练边验证
)

print("✅ 训练完成,模型保存在:", results.save_dir)

参数详解(训练)

核心参数

参数 含义 说明
data 数据集配置文件 YAML 路径,指定了数据位置和类别
model 预训练权重 选 yolov8n.pt 最轻量,显存不够就用它
epochs 训练轮数 配合 patience 早停,不是越多越好
imgsz 输入图片尺寸 320 速度最快,640 精度更高,显存约 4 倍
batch 批大小 受显存限制,6G 推荐 8,12G 可上 16
device 设备 0 表示第一张 GPU,cpu 表示 CPU

优化器参数

参数 含义 说明
lr0 初始学习率 默认 0.01,震荡明显可降到 0.005
momentum 动量 SGD 使用,默认 0.937,加速收敛
weight_decay L2 正则化 防止过拟合,默认 0.0005
optimizer 优化器 auto 自动选(SGD for YOLO),也可指定 AdamW
warmup_epochs 预热轮数 前几轮 lr 从小变大,避免初期震荡

损失权重

参数 含义 说明
box 边界框损失权重 默认 7.5,决定框的位置准不准
cls 分类损失权重 默认 0.5,决定类别判断准不准
dfl 分布焦点损失权重 默认 1.5,影响边框回归的精细度

数据增强(重要)

参数 含义 说明
hsv_h/s/v 色相/饱和度/明度扰动 增强对光照变化的鲁棒性
translate 平移 模拟目标在画面不同位置
scale 缩放 模拟目标远近变化,我开 0.5
fliplr 左右翻转 默认 0.5,对对称场景有用
mosaic 马赛克增强 将 4 张图拼成 1 张,默认 1.0,建议保留
mixup 混合增强 两张图叠加,适合小数据集

训练管理

参数 含义 说明
patience 早停轮数 验证集 mAP 连续 N 轮不提升就停止
project 结果根目录 默认 runs/train
name 实验子目录 每次训练单独存一份,方便对比
exist_ok 覆盖允许 True 则覆盖同名目录,False 则自动加后缀
resume 断点续训 填 True 或具体权重路径
amp 混合精度 开启后显存占用降低约 30%,速度提升
plots 生成曲线图 True 自动生成 loss/mAP 曲线图

训练过程看什么

终端日志重点关注:

Epoch   GPU_mem   box_loss   cls_loss   dfl_loss   mAP50   mAP50-95
  1/100   4.8G      1.25       2.63       1.91     0.12     0.08
 20/100   5.1G      0.92       1.24       1.54     0.43     0.27
 50/100   5.2G      0.73       0.81       1.32     0.61     0.39
100/100   5.2G      0.61       0.58       1.18     0.72     0.48
  • box_loss / cls_loss / dfl_loss 持续下降 → 模型在学
  • mAP50:0.6 以上基本可用,0.7+ 算不错
  • mAP50-95:更严格,0.4~0.5 正常

如果 loss 降但 mAP 不动 → 数据标注有问题或类别不平衡。 如果 mAP 涨到某点后开始下降 → 过拟合,提前停或减 epochs。


导出 ONNX 模型

训练完成后,YOLO 会在 runs/train/suzhiyolo_exp/ 下生成 best.pt。 但 C++ 端不能直接用 .pt 文件,需要导出为 ONNX 格式。

from ultralytics import YOLO

model = YOLO("runs/train/suzhiyolo_exp/best.pt")

model.export(
    format="onnx",
    imgsz=320,
    opset=17,          # ONNX opset 版本,17 兼容性好
    simplify=True,     # 简化模型图,减小体积
)

导出后会在同目录下生成 best.onnx,这就是我们 C++ overlay 要加载的模型文件。


suzhiCyolo:开箱即用的 C++ Overlay

经过上述流程,我们已经得到了一个能识别头部/全身的 YOLO 模型(best.onnx)。

现在,我们需要给它造一副身体 —— 一个 C++ overlay 程序,让模型真正在屏幕上跑起来。

suzhiCyolo 做了什么?

  • 基于 ImGui + DirectX 11 的透明 overlay,实时渲染在游戏窗口上方
  • 加载你训练好的 yolov8n.onnx,通过 ONNX Runtime + DirectML 在 GPU 上推理
  • 支持多种瞄准算法(直接瞄准 / 卡尔曼滤波 / 线性插值)
  • IoU 跟踪器,稳定锁定目标,减少跳帧
  • 动态瞄准范围,距离越近范围越小,避免贴脸甩枪

不想从 0 开始写?没问题,suzhiCyolo 提供开箱即用包,导入你自己的模型即可开始使用。

suzhi

具体用法参考 suzhiCyolo 仓库。


截图建议

截图是数据集质量的根基,这里给几个实用建议:

  • 多地图、多角度:不同地图的光照、背景差异很大,只截一张图训练出来的模型换个地图就瞎
  • 固定分辨率:训练和推理的分辨率要一致,别拿 1920 的截图训练、用 1280 的窗口推理
  • 多姿态:蹲下、站立、跳跃、持枪、不持枪,每种姿态都要覆盖
  • 距离梯度:近处、中距离、远处各截一些,模型才能学会不同距离的识别
  • 数量建议:至少 500 张起步,1000~3000 张效果明显提升,5000+ 趋于稳定

工具

截图工具

123云盘 - 截图工具下载

X-AnyLabeling

GitHub - CVHub520/X-AnyLabeling

suzhiCyolo 源码

GitHub - quanwei91/suzhiCyolo

avatar

su素质`

什么都会一点 什么都不精通

你是第 ... 位访客
本文 ... 人已读

RECOMMENDED

从改内存到看屏幕:一次不务正业的迁移实录

2026-07-17 07:00:00

临时root加载KPM

2026-09-08 15:14:29

坠机

2026-07-26 18:00:00

Table of Contents