Skip to content

About

SamAI-AimBot — 基于 ONNX Runtime 的实时目标检测与辅助瞄准系统

Resources

Stars

93 stars

Watchers

0 watching

Forks

Repository files navigation

SamAI-AimBot — 基于 ONNX Runtime 的实时目标检测与辅助瞄准系统

C++ ONNX Runtime DirectML OpenCV ImGui Platform


📑 目录


项目简介

SamAI-AimBot 是一套基于 ONNX Runtime 的 AI 实时目标检测与视觉辅助瞄准系统。它以 DXGI Desktop Duplication 直接从 GPU 显存抓取桌面画面,送入 YOLO 系列 ONNX 模型完成推理,再通过 SendInput 或 KMBox-Net 硬件设备执行鼠标移动,形成「截图 → 推理 → 决策 → 移动」的完整闭环。

全部界面基于 Dear ImGui(DX11 + Win32 后端)实现,参数实时可调并持久化到 INI 配置文件。

🎯 双捕获后端(WIN32 GDI / DXGI)、双推理后端(CUDA / CPU 自动降级)、双移动后端(系统 API / 硬件盒)均可切换。


核心优势

⚡ 双截图后端可选

截图后端 技术 特点 适用场景
DXGI IDXGIOutputDuplication 从 GPU 显存直接复制,只回读屏幕中心区块,CPU 拷贝量最小 追求低延迟的首选方案
WIN32 GDI BitBlt CPU 管线,兼容性最好,无需 D3D11 设备 默认方案/DXGI 不可用时兜底

DXGI 模式的关键优化:

  • 只把屏幕中心的 imgsize × imgsize 区块从桌面帧拷到 staging 纹理,而不是整屏拷贝,显著降低 GPU→CPU 回读量
  • 逐行拷贝时按 staging 纹理的真实 RowPitch 对齐,避免行间距错位
  • 捕获失效自动在线重建:串流启停、显示模式切换(如 Win+P)、设备移除会导致 Duplication 失效,程序检测到 DXGI_ERROR_ACCESS_LOST / DXGI_ERROR_DEVICE_REMOVED 或长时间无新帧后,会自动释放并重建捕获,无需重启进程
  • 重建失败按固定间隔退避重试,覆盖串流切换期间的短暂不可用窗口
┌─────────────┐     ┌─────────────┐     ┌─────────────┐
│  Capture    │ ──▶ │  Inference  │ ──▶ │  Aim + Move │
│  DXGI/GDI   │     │ ONNX Runtime│     │ SendInput/  │
│  裁剪回读   │     │ CUDA / CPU  │     │ KMBox-Net   │
└─────────────┘     └─────────────┘     └─────────────┘

🧠 推理后端自动降级

  • 优先使用 CUDA 执行提供者,加载失败时自动重试 CPU,全程无需人工干预
  • 界面明确显示当前实际生效的后端(backend_active_ep)
  • 两种后端均失败时记录失败原因(backend_last_error)并安全退出,避免用空指针继续推理
  • 支持多模型尺寸(256 / 320 / 416 / 480 / 512 / 640),小尺寸延迟更低、大尺寸精度更高

🎯 移动方式可切换

移动后端 说明
SendInput 系统级 SendInput 注入,零额外硬件
KMBox-Net 通过 UDP 网络协议驱动外置硬件盒,支持加密封包与硬件级轨迹修正

功能特性

🔍 AI 识别

  • YOLO 系列 ONNX 模型实时目标检测
  • CUDA / CPU 双执行提供者,加载失败自动降级
  • 置信度阈值 conf 可调 + IOU iou 去重
  • 类别过滤(enableClassFilter + classFilterIndex)
  • 模型文件运行时切换(mode_llist)
  • 多模型输入尺寸可选(captureSizeTable = { 320, 416, 640, 960 })

🖥️ 屏幕捕获

  • DXGI Desktop Duplication(GPU 显存直接复制)
  • WIN32 GDI BitBlt 后端
  • 界面下拉框实时切换监视方式
  • 捕获失效自动在线重建(串流切换 / 显示模式变更)
  • 分辨率自动获取或手动指定

🎮 瞄准辅助

  • 多热键触发:左 / 右 / 中 / 侧键1 / 侧键2 独立开关
  • 瞄准总开关 aimAssist
  • 三级灵敏度:常规 sens1 / 瞄准 sens2 / 瞄准镜 sens3
  • PID 平滑系数 X_pid_d / Y_pid_d 独立可调
  • 贝塞尔曲线类人移动(isBezier + BezierMouseSmoother.h)
  • 移动频率与延迟控制:steps / delay
  • 瞄准偏移量 head_y、搜索范围 searchRange
  • 平滑度 smooth

💥 压枪补偿

  • 压枪开关 compensationEnabled
  • 补偿强度 compensation 与累积模式 compensationAccumulate
  • 子弹休眠 compensationSleepMs、峰值 compensationMax、下压像素 compensationDownPx

📟 KMBox-Net 硬件支持

  • UDP 网络通信 + 加密封包(my_enc)
  • 硬件级鼠标移动 / 按键 / 滚轮 / 键盘注入
  • 硬件轨迹修正(traceType 选择方式 + traceValue 平滑度)
  • 物理鼠标键盘状态监听线程(kmNet_monitor)
  • IP / Port / UUID 界面可配置并持久化
  • 自瞄间隔延迟 kmBoxDelay 防抖

🎛️ ImGui 控制面板

  • DirectX 11 渲染的控制面板
  • 监视方式、分辨率、模型、灵敏度、压枪、热键集中配置
  • 模型加载失败原因实时显示
  • KMBox-Net 连接状态提示
  • 配置保存 / 加载(INI 格式)

📺 实时监视画面

  • 开关 monitorEnabled 后用 OpenCV 窗口显示 AI 视野
  • 检测结果框实时叠加显示
  • 捕获中断期间保持上一帧,不产生空帧崩溃

架构设计

                          ┌──────────────────────┐
                          │    ImGui UI 线程      │
                          │  (DX11 控制面板渲染)   │
                          └──────────┬───────────┘
                                     │ Sun 单例参数读写
                          ┌──────────▼───────────┐
                          │      主线程           │
                          │  - 自瞄决策           │
                          │  - 压枪补偿           │
                          │  - 鼠标移动执行        │
                          └──────────┬───────────┘
                                     │
              ┌──────────────────────┼──────────────────────┐
              │                      │                      │
   ┌──────────▼──────────┐ ┌────────▼────────┐ ┌──────────▼──────────┐
   │   捕获线程           │ │   推理线程       │ │  移动后端            │
   │  (g_aiThread)       │ │  (ONNX Runtime) │ │                     │
   │  DXGI / WIN32       │ │  CUDA / CPU     │ │  SendInput          │
   │  → 裁剪帧缓冲        │ │  → Box[] 后处理  │ │  KMBox-Net (UDP)    │
   └─────────────────────┘ └─────────────────┘ └─────────────────────┘

线程模型

线程 职责
主线程 全局鼠标钩子 MouseHookProc 捕获热键、压枪补偿计算、移动指令下发
推理线程 g_aiThread 循环抓帧 → 推理 → 后处理,按 captureMethod 分派到 bitmainDxgi / bitmainWin32
输入线程 g_ShooterThread 按键注入与移动执行
KMBox 监听线程 kmNet_monitor 接收硬件盒上报的物理键鼠状态

捕获状态机(DXGI 模式)

DXGI 捕获采用三态返回,取代原先「超时也当作成功」的处理方式:

状态 含义 处理
新帧 成功取到桌面帧 刷新双缓冲,推进帧序号
无新帧 桌面无变化(超时) 保持上一帧,不刷新缓冲
捕获失效 ACCESS_LOST / 设备移除 / 长期无帧 释放资源并触发在线重建

该设计同时解决了两个问题:串流中断时不再抛出 0xC000000D 异常;串流建立后监控画面会自动恢复刷新,不会停留在旧帧。


依赖库一览

库 版本 / 文件 用途
ONNX Runtime lib/onnxruntime.lib(头文件在 dml/) 模型推理,支持 CUDA / CPU 执行提供者
OpenCV lib/opencv_world490.lib / .dll(4.9.0) 图像处理、监视窗口显示(cv::imshow)
Dear ImGui imgui/(DX11 + Win32 后端) 控制面板 UI
Direct3D 11 / DXGI 系统组件 DXGI 捕获、ImGui 渲染
Winsock2 ws2_32.lib KMBox-Net UDP 通信
Windows Multimedia winmm.lib 多媒体计时

编译指南

环境要求

  • Windows 10 / 11(x64)
  • Visual Studio 2022(含 C++ 桌面开发工作负载)
  • Windows SDK 10.0
  • 显卡驱动支持 CUDA(若使用 GPU 推理)

编译步骤

  1. 用 Visual Studio 打开 SamAI.sln
  2. 选择配置 x64 | Debug 或 x64 | Release
  3. 确认 lib/ 目录下已存在 onnxruntime.lib、opencv_world490.lib、opencv_world490.dll
  4. 生成解决方案

关键配置说明

配置项 值 说明
平台配置 x64(Debug / Release) 需 x64 才能使用 DML / CUDA 相关能力
C++ 语言标准 stdcpp17
子系统 Console 控制台窗口承载日志输出
执行级别 RequireAdministrator 必须以管理员权限运行,否则钩子与注入可能失效
附加包含目录 $(ProjectDir)、$(ProjectDir)dml
附加库目录 $(ProjectDir)lib

运行时目录要求

程序运行目录下需能访问:

  • lib/opencv_world490.dll(OpenCV 动态库)
  • onnx/(模型文件目录)
  • 可写入的 INI 配置文件

模型准备

  1. 将 .onnx 模型文件放入项目根目录的 onnx/ 文件夹
  2. 在界面「模型选择」下拉框中选取所需模型
  3. 输入尺寸选择原则:
输入尺寸 特点 建议场景
256 / 320 延迟最低,显存占用小 追求响应速度
416 / 480 / 512 速度与精度均衡 通用场景
640 精度最高,延迟相对较大 小目标、远距离目标

onnx/ 目录下常见命名包含尺寸标记(如 *_256、*_320、*_416、*_512、*_640),同一模型的多个尺寸版本可分别放入并切换对比。

  1. 模型输入尺寸需与显存、屏幕分辨率综合权衡;截取区域大小由 captureSizeTable 决定

支持的 YOLO 版本

推理后处理会按输出张量形状自动识别模型格式,无需手动指定版本:

YOLO 版本 输出布局 头部特征 说明
YOLOv5 / v7 [1, N, 5+C] 含 objectness 通道 行 = 候选框;列 = [cx, cy, w, h, objectness, class...],按类别逐个判定
YOLOv8 / v11 [1, C, N] 无 objectness 通道 转置布局,前置 4 通道为 cx, cy, w, h,其后为各类别分数,每个候选取最优类别
端到端 / 角点格式 [N, 6] [x1, y1, x2, y2, score, cls] 模型已内置 NMS,每行即一个检测框,通过采样多数表决识别

判定逻辑位于 dml/module2.h 的 postProcess():先对前若干行采样做角点格式多数表决,再以 out1 >= out2 区分 [1, N, 5+C] 与 [1, C, N] 两类布局。


使用说明

快速开始

  1. 以管理员身份运行 SamAI.exe
  2. 在 ImGui 面板中选择「监视方式」:WIN32(默认)或 DXGI
  3. 设置屏幕分辨率:
    • 勾选自动分辨率,由 GetSystemMetrics 读取当前屏幕
    • 或取消勾选后手动输入宽 / 高
    • 也可直接选择预设(1080p / 2K / 1600p / 4K)
  4. 选择 AI 模型 文件
  5. 配置 KMBox-Net(若使用硬件盒):
    • 在 IP / Port / UUID 输入框填入设备参数(示例格式:192.168.x.x / <Port> / <UUID>)
    • 点击「连接 KMBox-Net」,状态提示变为「已连接」
  6. 调整灵敏度、置信度、压枪等参数
  7. 勾选瞄准热键后点击开始,程序进入 AI 循环

参数调优建议

目标 调整项
响应更快 降低模型输入尺寸;减小 delay;提高灵敏度
移动更平滑 提高 smooth;启用贝塞尔曲线;增大 steps
减少误检 提高 conf;启用类别过滤并指定 classFilterIndex
压枪更稳 调整 compensationSleepMs 与 compensationMax
硬件轨迹更自然 设置 traceType 轨迹方式,调整 traceValue 平滑度(0 为关闭)

DXGI 模式注意事项

  • 串流软件启停、切换显示模式、独占全屏切换都会使 Desktop Duplication 失效;程序会自动重建捕获,期间监控画面保持上一帧,恢复后自动继续刷新
  • 若长时间无法取到新帧(如桌面完全静止),程序会按阈值判定捕获僵死并主动重建
  • 切换到 DXGI 模式必须在点击开始之前完成(模式在启动 AI 时读取)

配置持久化

  • 所有参数通过 ini.h 的 SaveConfigToIni / LoadConfigFromIni 读写 [Config] 段
  • 包含监视方式 captureMethod、截图尺寸 captureSizeIndex、模型选择 mode_llist、移动方式 move_llist、轨迹方式 traceType、KMBox-Net 连接参数等
  • 修改后保存配置,下次启动自动恢复

配置参数

以下参数定义于 sun.h 的 Sun 单例(Sun::Get()):

识别与截图

参数 类型 默认值 说明
captureMethod int 0 监视方式:0=WIN32,1=DXGI
captureSizeIndex int 0 截图尺寸表索引
captureSizeTable[4] int[4] {320,416,640,960} 可选截图尺寸
conf float 0.4 置信度阈值
iou float 0.25 NMS IOU 阈值
mode_llist int 0 模型选择索引
enableClassFilter bool false 启用类别过滤
classFilterIndex float 0 过滤的类别 ID
autoResolution bool true 自动获取屏幕分辨率
inputWidthText / inputHeightText char[5] 空 手动指定宽 / 高
screenRes int 0 分辨率预设索引(0=1080p,1=2K,2=4K)

瞄准与移动

参数 类型 默认值 说明
aimAssist bool false 瞄准总开关
leftButton / rightButton / middleButton bool false 左 / 右 / 中键触发
sideButton1 / sideButton2 bool false 侧键触发
sens1 / sens2 / sens3 float 0.0 常规 / 瞄准 / 瞄准镜灵敏度
X_pid_d / Y_pid_d float 0.0 X / Y 轴 PID 平滑系数
head_y float 0.235 瞄准偏移量
searchRange float 320.0 搜索范围
smooth float 1.0 移动平滑度
isBezier bool false 启用贝塞尔曲线移动
steps int 3 准星移动频率
delay int 3 频率间隔延迟(毫秒)
tracking_mode int 1 目标跟踪方式

压枪补偿

参数 类型 默认值 说明
compensationEnabled bool false 压枪开关
compensation int 0 压枪模式
compensationAccumulate bool false 压枪累积
compensationSleepMs float 15.0 子弹休眠(毫秒)
compensationMax float 50.0 压枪峰值
compensationDownPx float 6.0 下压像素

KMBox-Net 与后端

参数 类型 默认值 说明
move_llist int 0 移动方式索引
traceType int 0 硬件轨迹修正方式
traceValue float 16.0 轨迹平滑度(0=关闭)
kmBoxDelay int 10 自瞄间隔延迟(毫秒)防抖
net_ip / net_port / net_uuid char[20] 空 KMBox-Net 连接参数
netConnected bool false 是否连接硬件盒
backend_ep int 0 推理后端偏好:0=CUDA,1=CPU
backend_active_ep int 0 实际生效后端(自动降级时与偏好不同)
backend_load_failed bool false 模型加载是否失败
backend_last_error char[256] 空 最近一次后端失败的可读原因
version double 3.7 版本号

项目结构

SamAI/
├── SamAI.sln                      # 解决方案文件
├── SamAI.vcxproj                  # 项目文件(x64,stdcpp17,Console 子系统)
├── main.cpp                       # 主流程:自瞄决策、压枪、线程编排、鼠标钩子
├── sun.h                          # 全局配置单例 Sun(Sun::Get())
├── ini.h                          # INI 配置持久化(Save/LoadConfigFromIni)
├── BezierMouseSmoother.h          # 贝塞尔曲线平滑移动
│
├── dml/                           # ONNX Runtime 推理封装
│   ├── module.cpp                 # IDML 类:模型加载、执行提供者、Detect 推理
│   ├── module2.h                  # 推理辅助实现
│   └── onnxruntime_*.h            # ONNX Runtime C/C++ API 头文件
│
├── dxgi/                          # DXGI Desktop Duplication 捕获
│   ├── DuplicationManager.cpp/h   # 捕获管理、裁剪回读、三态状态机、在线重建
│   └── DXGIConsoleApplication.cpp/h # 抓帧与双缓冲封装
│
├── bit/                           # WIN32(GDI) 截图后端
│   └── bit.h
│
├── mouse/                         # 鼠标注入
│   ├── sendinput.cpp
│   └── mouse.h
│
├── NetConfig/                     # KMBox-Net 硬件通信
│   ├── kmboxNet.cpp/h             # UDP 协议、命令接口、状态监听线程
│   ├── my_enc.cpp/h               # 加密封包
│   ├── HidTable.h                 # HID 键码映射表
│   └── …
│
├── imgui/                         # Dear ImGui 界面
│   ├── imgui_main.cpp             # 控制面板与 DX11 渲染
│   ├── imgui_impl_dx11.cpp        # DX11 渲染后端
│   ├── imgui_impl_win32.cpp       # Win32 平台后端
│   └── imgui*.cpp/h               # ImGui 核心
│
├── nother/                        # 辅助功能
│   ├── another.cpp
│   └── another.h
│
├── onnx/                          # 模型文件目录(.onnx)
├── lib/                           # 第三方静态/动态库
│   ├── onnxruntime.lib
│   ├── opencv_world490.lib
│   └── opencv_world490.dll
│
├── opencv2/                       # OpenCV 头文件
├── fonts/                         # 界面字体资源
├── pic/                           # 图片资源(背景图等)
└── .github/                       # 仓库配置

📮 反馈与联系

如果在使用过程中遇到 BUG,或对性能有 改进意见,欢迎通过邮件联系:

📧 邮箱:jinbin25@proton.me

反馈时建议附上:问题现象描述、复现步骤,以及必要的日志信息,便于快速定位问题。


免责声明

本项目仅用于计算机视觉与 Windows 图形捕获技术的学习与研究,包括 DXGI Desktop Duplication API、ONNX Runtime 推理管线、Win32 输入注入机制及 ImGui 界面开发。请在符合当地法律法规与软件服务条款的前提下使用。

About

SamAI-AimBot — 基于 ONNX Runtime 的实时目标检测与辅助瞄准系统

Resources

Stars

93 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages