AimYolo


本文使用YOLOv5-2.0PyTorch,实现了一款基于目标检测算法的射击类游戏瞄准辅助,俗称“AI外挂”。(文中含项目地址及演示视频)


一、前言

本项目出于个人兴趣而写,为demo级别,较为粗糙,优化空间很大。灵感来源于B站up主“林亦LYi”的视频。

  1. 项目地址
    • 已在GitHub开源

  2. 项目结构
  3. 注意事项
    • *本项目旨在激起深度学习、游戏安全等方面爱好者的兴趣,仅供学习交流
    • *切勿用于盈利及违法用途,以及进行任何破坏游戏公平的行为
    • 有封号风险,推荐断网使用
    • 推荐在Anaconda中部署并使用
    • 10系显卡效果明显不如30系(o(╥﹏╥)o)

值得注意的是,AI外挂几年前就已经出现,最初为YouTube上的一位创作者开发,网络上也可以找到一些版本。本项目理论上可以用于CSGO、APEX、PUBG等多种游戏,实际以CSGO为例进行了模型的开发与使用。相对于传统外挂,AI外挂多基于目标检测算法,不会修改游戏的本地内存,也不会上传恶意数据。本文后续有6个部分:开发过程模型开发核心代码项目部署与展示总结参考


二、开发过程

本节分为总体设计屏幕实时捕获鼠标定位与移动代码重构等4个部分

1. 总体设计

项目整体分为8个模块,看图。(づ ̄3 ̄)づ╭❤~

  • 参数获取:继承自YOLO,个性化参数,如指定模型对目标的检测部位(头部、身体等)
  • 屏幕截取:CPU或GPU截图,截图时间尽可能短,可指定屏幕截图区域
  • 预处理:截图数据转为tensor数据类型,与YOLO接口一致
  • 模型推理:图像数据交付核心模型,进行检测
  • 坐标计算:根据模型的推理数据,计算目标位置的坐标
  • 鼠标移动:将鼠标移动至对应坐标,如头部、身体及其中心位置
  • 专用/通用数据集:如CSGO数据集(标注CT,CT_Head,T,T_Head),传统人体识别数据集等
  • 模型训练:由于待检测目标一般较少,且对速度要求较高,选取s版本的模型
  • 整体:整体采用单进程,在While循环中持续检测,并设置信号用于结束进程,后续完善为根据指定键位,更改AI姿态(大概会吧T_T)

2. 屏幕实时捕获

这里并非真正的实时,而是从屏幕截取到模型推理,再到鼠标移动,整个过程的用时很少,宏观感受为实时。废话少说,看图(づ ̄3 ̄)づ╭❤~。

  • CPU截屏:采用mss库进行截屏;也可以采用d3dshot库进行GPU截屏,但其中会涉及numpy和tensor数据的运算速度、显卡的设置问题,不推荐
  • 实时截图与展示:将截取的画面实时展示,便于测试与直观感受,根据参数配置作为可选项

以只因哥打篮球的视频为例,这个部分的效果应该是这样的。(づ ̄3 ̄)づ╭❤~


3. 鼠标定位与移动

关于鼠标的定位与移动,需要高清几个问题,看图(づ ̄3 ̄)づ╭❤~。

  • 鼠标定位

    • 即让鼠标搞清自己的定位
    • step1. 获取鼠标当前位置的坐标/像素
    • step2. 结合YOLO,根据检测框计算坐标
    • step3. 计算欧式距离,移动鼠标
    • 特别注意(部分问题会在核心代码部分解释)
      • 鼠标移动时的绝对距离与相对距离(一般为相对距离,故计算了欧氏距离)
      • 物理距离与分辨率不一致的问题(开启DPI感知)
      • 一些游戏需要关闭原始输入
  • 鼠标移动

    • A. Windows程序鼠标移动机制
      • 如图,传统机制已经满足不了当下大型游戏的需求
    • B. DirectX游戏开发
      • 微软开发的多媒体编程接口,具有更快的响应速度
      • 导致PyAutoGui、Pynput等采用Virtual Key Codes的键鼠控制库失效
    • C. 绕过限制
      • 更先进的Scan Codes和Win32 Sendinput方法,实现游戏内的键鼠快速控制
      • 如图,采用了Ctypes库
      • 在一些老游戏,如CS1.6中,则不用考虑这些

4. 代码重构

重构了YOLOv5中的detect.py:保留核心模型,更改原有逻辑,添加自定义功能。看图。(づ ̄3 ̄)づ╭❤~

更多细节留给核心代码部分。


三、模型开发

本节分为模型结构数据集模型训练等3个部分。

1. 模型结构

采取的模型结构,看图。具体介绍可参考江佬的博客,该图也源此。(づ ̄3 ̄)づ╭❤~

需要说明的是:

  • 代码版本:YOLOv5-2.0
  • 选取模型:Pretrained YOLOv5s,后续训练时,以此为依托,进行不太严格的fine-tune
  • 任务类型:目标检测

2. 数据集

本小节对使用的数据集进行介绍。

  1. CSGO专用数据集
    数据集项目地址。时间有限,并没有进行数据集的构建,当时,这个项目解决了博主的燃眉之急。值得说明的是,该项目的创作者也附加了一些单纯的检测代码。
  2. 检测类别数:4
    ct, t, t_head, ct_head,即反恐精英,恐怖分子,恐怖分子头部,反恐精英头部。这有利于模型进行目标身体或头部的检测与锁定。
  3. 数据集划分
    图片总数:800张。博主进行主观划分->训练集:700张,验证集:100张。
  4. 数据分布特征
  5. 数据示例
    img_250.jpg的原始图像信息标签信息,以及一些图片的groundtruth如下。(づ ̄3 ̄)づ╭❤~

3. 模型训练

本小节展示了训练过程中产生的数据和预测效果。

  1. 超参数
  2. 训练结果
  3. 预测效果

需要说明的是,模型在预训练(pretrained)的YOLOv5s的权重基础上,进行了不太严格的微调(fine-tune)。图中示例均为模型训练200轮的结果。实际上,模型在训练50轮时,就已经能够初步使用了。


四、核心代码

核心代码集中在z_captureScreen.pyz_ctypesz_detect5.py中。

懒得写了,有空再补,相信以你的聪明才智,一定可以看明白哒,哒哒哒。(づ ̄3 ̄)づ╭❤~


五、项目部署与展示

本节分为项目部署使用游戏内展示等3个部分。

1. 项目部署

  • A. Anaconda(推荐)和 PyTorch 的安装
  • B. 部署 YOLOv5
  • C. 自瞄模块的依赖库,可见项目的requirements.txt,依赖不多,也可根据报错安装

2. 使用

  • 进入项目目录
  • **python z_detect5.py [可选参数]**,例如:
    • python z_detect5.py –view-img –classes 0 1 2 3
    • python z_detect5.py –classes 2
    • python z_detect5.py
  • 上述命令推荐在命令行中运行,在PyCharm中使用,可能出现win32相关库的报错

3. 游戏内展示

CSGO中,注意在游戏内设置中关闭数据原始输入。


六、总结

本节总结了一些问题。

  1. 小目标检测:对于小目标,存在误检,可能检测不到
  2. 鼠标移动:移动速度过快,无法最大程度仿真
  3. 弱点:后台实时运行的脚本 + 不自然的鼠标移动模式
  4. 可能的优化方向:远程外挂;多进程提速;数据集优化(增加人物模型等);硬件性能提升(CPU+GPU)
  5. 三个问题
    • A. 坐标不一致性
      • 监听器和控制器不一致,即屏幕的物理尺寸<分辨率。Python获取的鼠标位置对应屏幕的物理位置,而非对应的分辨率。
      • 解决方案:ctypes库,开启windows提供的DPI感知。
    • B.相对距离
      • 由于FPS类游戏,鼠标位置始终在屏幕中心,需要以目标位置与当前鼠标位置的相对距离,作为移动指标。
    • C.数据输入
      • 对于CSGO等FPS类游戏,游戏内需要关闭数据原始输入。
  6. 写在最后:博主并非专业人员,如有错误,请指正。

参考

懒得写了,有空再补。(づ ̄3 ̄)づ╭❤~(づ ̄3 ̄)づ╭❤~(づ ̄3 ̄)づ╭❤~


文章作者: 好想摸鱼
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 好想摸鱼 !
评论
  目录