本项目整体的架构是通过obs进行屏幕捕捉和推流,然后使用微调后的yolov8进行图像识别。视角的移动使用pydirectinput实现,使用pid进行移动控制。
具体实现上,使用三个线程,分别负责键盘输入监听、屏幕捕捉识别、鼠标移动控制。主要是因为使用pydirectinput包实现鼠标移动会有较高的延迟,如果放在一个线程里面实现,会出现严重的掉帧情况。所以我是用了三个线程加上相关的同步互斥机制,实现了高帧率的输出
dataset文件夹下面是全部的数据集,data文件夹下面是全部标记好的数据集,由于前后改过一些数据集,所以会有很多个。数据集标注是用label-stutdio实现的。
runs文件夹下面是训练后的模型权重
有关aimbot的实现放在了aimbot文件夹下,main.py可以看做一个驱动,调用了这个aimbot包
preprocess.ipynb对处理好的数据集进行划分
train.ipynb进行模型的微调
requirements.txt里面包含了所有需要的依赖,但是由于各种环境的问题,不一定能够在老师这里完全配好)
待完成的地方:
- 探索更加高效的pid调参
- 使用鼠标驱动作为鼠标移动的输入,理论上可以减少控制延迟,增加控制效果
- 使用OpenCV或者相关的包进行屏幕捕捉,减少使用成本
待完成的地方可能在今晚就能够实现。
完成第三点,使用了基于mss的方案进行屏幕捕捉。但是,只使用mss进行替换会导致帧率的降低,所以我又拉了一个线程专门处理使用mss进行屏幕捕捉,在model线程里面只需要获取最后的结果就好了。
使用体验上,使用obs推流的帧率略高于mss,约高3到4帧;使用mss的延迟会更低一些,推测是因为推流会导致延迟。不过这两者的性能瓶颈应该在gpu的处理上面,理由主要是观察到,当鼠标切到桌面上的时候,aimbot的gpu占用高于游戏,帧率能到60左右;当鼠标进入游戏,系统将资源更多的调度给游戏,gpu占用降低,两个方法均在30帧左右。
使用哪一种方式进行屏幕捕捉会显示在窗口的标题上
修改aimbot/config.py中的参数,如果是窗口模式运行,则需要将屏幕的准星和屏幕捕捉部分的中心点对齐。准星设置最好不要扩散,便于识别
运行根目录下的main.py。
按键说明:
P : 开启或关闭自瞄 O : 结束aimbot F12 : 开启或关闭锁头 F11 : 切换屏幕捕捉方式