大家好,关于“枪枪爆头”!用Python编写了一个使命召唤插件很多朋友都还不太明白,今天小编就来为大家分享关于的知识,希望对各位有所帮助!
前段时间在网上看到了视频《警惕AI外挂!我写了一个枪枪爆头的视觉AI,又亲手“杀死”了它》,引起了我极大的兴趣。
视频中提到,国外有人为《使命召唤》制作了一个AI程序,实现了自动瞄准功能。它与传统的插件不同。该程序不需要使用游戏内存数据,也不向服务器发送作弊指令。它仅使用计算机视觉来分析游戏屏幕、定位敌人并移动十字准线。和人类玩家一模一样,所以是反作弊的。程序无法检测到它。更可怕的是,这个AI程序是全平台通用的。无论是X-box、PS4还是手机,只要拿出屏幕,发送操作,就可以实现“持枪爆头”。
外网的开发者使用的是基于box的目标检测,但在射击游戏等需要定位人体的场景中,其实有比box检测更好的算法。 up主花了几个小时写了一个效果更好、功能更夸张的AI程序。它利用人体关节点检测技术和通过大量现实生活图片训练的视觉AI将视频和图片结合起来。提取游戏中角色的关节信息并给出各部分中心点的精确像素坐标。虽然训练是基于真人图片,但也能定位游戏中角色的人体关节。
可以说,由于这类AI程序的出现,目前FPS游戏的现状就是暴风雨来了,暴风雨来了,非常严重!
接下来我们先介绍一下这个视觉AI自动瞄准的制作思路,然后讲一下这个问题的影响以及如何解决。
1、核心功能设计
一般来说,我们首先需要训练一个用于人体关节点检测的AI视觉模型,然后将游戏画面实时输入到AI视觉模型中,然后反馈游戏角色各部分的像素位置,然后确定瞄准点并将鼠标移动到瞄准点。
拆解需求后,整理核心功能如下:
训练人体关节点检测模型
将视频或图片输入AI视觉模型,输出瞄准点位置。
自动将鼠标移动到相应的瞄准位置
最终想要达到的效果如下图:
2. 核心实施步骤
1.训练人体关节点检测模型
在这一部分中,我计划使用微软亚洲研究院和中国科学技术大学提出的高分辨率网络(HRNet)来检测人体关节点。该模型逐渐添加与高分辨率特征图主网络并行的低分辨率特征图子网络。不同的网络实现了多尺度融合和特征提取,因此在当前通用数据集上取得了很好的效果。
1.1 HRNet代码库安装
按照官方安装说明进行安装非常简单。我使用的是本地源码安装方式。
git clone https://github.com/leoxiaobin/deep-high-resolution-net.pytorch.gitpython -m pip install -e deep-high-resolution-ne.pytorch
1.2 下载人体关键点数据集
首先打开COCO数据集的官方下载链接。
对于Images一栏的绿色框,需要下载三个大文件,分别对应训练集、验证集和测试集:
http://images.cocodataset.org/zips/train2017.zip
http://images.cocodataset.org/zips/val2017.zip
http://images.cocodataset.org/zips/test2017.zip
对于Annotations栏的绿框,需要下载一个注释文件:
http://images.cocodataset.org/annotations/annotations_trainval2017.zip
解压该文件后,可以得到如下目录结构:
其中,person_keypoints_train2017.json和person_keypoints_val2017.json分别对应人体关键点检测对应的训练集和验证集标注。
annotationscaptions_train2017.jsoncaptions_val2017.jsoninstances_train2017.jsoninstances_val2017.jsonperson_keypoints_train2017.json人体关键点检测对应的训练集标注文件person_keypoints_val2017.json人体关键点检测对应的验证集标注文件
在本地代码库的datasets目录下新建coco目录,将上述训练集、验证集和标注文件放在本地代码的coco目录下。
数据集 coco 注释 test2017 train2017 val2017
1.3 环境配置和模型训练
核心训练代码如下:
def train(config, train_loader, model, criteria, optimizationr, epoch, output_dir, tb_log_dir, writer_dict): batch_time=AverageMeter() data_time=AverageMeter() loss=AverageMeter() acc=AverageMeter() # 切换到训练模式model.train () end=time.time() for i, (input, target, target_weight, meta) in enumerate(train_loader): data_time.update(time.time() - end) 输出=model(input) target=target.cuda (non_blocking=True) target_weight=target_weight.cuda(non_blocking=True) if isinstance(outputs, list): loss=criteria(outputs[0], target, target_weight) 对于输出中的输出[1:]: loss +=criteria(output , target, target_weight) else: 输出=输出loss=criteria(output, target, target_weight) optimizationr.zero_grad() loss.backward() optimizationr.step() # 测量准确度并记录损失loss.update(loss.item(), input.size(0)) _, avg_acc, cnt, pred=准确度(output.detach().cpu().numpy(), target.detach().cpu().numpy()) acc.update(avg_acc , cnt) batch_time.update(time.time() - end) end=time.time() if i % config.PRINT_FREQ==0: msg='Epoch: [{0}][{1}/{2}]\ t' \ '时间{batch_time.val:3f}s({batch_time.avg:3f}s)\t' \ '速度{speed:1f}个样本/s\t' \ '数据{data_time.val: 3f} s ({data_time.avg:3f}s)\t' \ '损失{loss.val:5f} ({loss.avg:5f})\t' \ '准确度{acc.val:3f} ({附件avg:3f})'.format( epoch, i, len(train_loader), batch_time=batch_time, speed=input.size(0)/batch_time.val, data_time=data_time, loss=losses, acc=acc) logger.info (msg) writer=writer_dict['writer'] global_steps=writer_dict['train_global_steps'] writer.add_scalar('train_loss', loss.val, global_steps) writer.add_scalar('train_acc', acc.val, global_steps) writer_dict[' train_global_steps']=global_steps + 1 前缀='{}_{}'.format(os.path.join(output_dir, 'train'), i) save_debug_images(config, 输入, 元, 目标, pred*4, 输出,前缀)
训练结果:
2.输入视频或图片,实时反馈瞄准点坐标
2.1 实时读取屏幕
导入pyautoguiimg=pyautogui.screenshot()
在19201080的屏幕上,screenshot()函数耗时100微秒,基本满足实时传入游戏图像的要求。
如果您不需要捕获整个屏幕,则有一个可选的区域参数。可以将拦截区域左上角的XY坐标值、宽度和高度传入拦截中。
im=pyautogui.screenshot(区域=(0, 0, 300,400))
2.2 读取图像反馈坐标
parser.add_argument('--keypoints', help='f:full body 17 个关键点,h:half body 11 个关键点,sh:small half body 6 keypoints')hp=PoseEstimation(config=args.keypoints, device='cuda:0')
您可以选择要检测的人体关节点数量,包括上半身6个关键点、上半身11个关键点、全身17个关键点,然后构建检测器。
人体关节点对应序号:
'keypoints': { 0: '鼻子', 1: '左眼', 2: '右眼', 3: '左耳', 4: '右耳', 5: '左肩', 6: '右肩', 7: '左_elbow', 83336 0 '右肘' , 9: '左手腕', 10: '右手腕', 11: '左臀', 12: '右臀', 13: '左膝', 14: '右膝', 15: '左脚踝', 16: '右脚踝' }
因此,想要自动瞄准头部实现“枪爆头”,只需要反馈0:‘鼻子’的坐标点即可。
代码如下:
位置=hp.detect_head(img_path, detector_person=True, waitKey=0) def detector_head(self, image_path, detector_person=True, waitKey=0): bgr_image=cv2.imread(image_path) kp_points, kp_scores, 框=self.detect_image( bgr_image, threshhold=self.threshhold, detector_person=detect_person) 返回kp_points[0][0]
输出结果:[701.179 493.55]
可以看出,虽然它是根据现实生活中的图片进行训练的,但当给定游戏中的角色时,它也可以定位人体关节。
深度神经网络之所以强大,是因为它们具有一定的演绎和泛化能力。他还可以根据层次线索来分析他以前从未见过的东西,而且结果往往相当准确。而且,游戏场景是对真实场景简化的结果。环境、光影就简单多了。能够分析和理解现实世界的视觉人工智能对于3D 游戏来说是小菜一碟。
3.自动将鼠标移动到对应的坐标点
3.1 移动鼠标
移动到指定位置:
pyautogui.moveTo(100,300,持续时间=1)
将鼠标移动到指定坐标;持续时间的作用是设置运动时间。所有GUI函数都有这个参数,而且都是可选参数。
获取鼠标位置:
print(pyautogui.position()) # 获取当前鼠标位置;输出:点(x=200,y=800)
3.2 控制鼠标点击
点击鼠标:
# 单击鼠标pyautogui.click(10,10) # 单击鼠标指定位置,默认左键为pyautogui.click(10,10,button='left') # 单击左键pyautogui.click(1000 ,300,button='right') # 右键pyautogui.click(1000,300,button='middle') # 点击中间
双击鼠标:
pyautogui.doubleClick(10,10) # 指定位置,双击左键pyautogui.rightClick(10,10) # 指定位置,双击右键pyautogui.middleClick(10,10) # 指定位置,双击中间按钮
点击释放:
pyautogui.mouseDown() # 鼠标按下pyautogui.mouseUp() # 鼠标释放
至此,视觉AI自瞄准程序已经基本设计完成。最终效果可以看这位up主的视频。
【另】警惕AI作弊!我写了一个带有枪声和爆头的视觉AI,然后自己“杀了”它
3. 引发的想法
正如up主所说,视觉AI给FPS游戏带来了这一轮重大危机!
目前此类视觉AI程序面临三种威胁:
准确性
隐蔽性
多功能性
第一个威胁超出了人类的准确度。虽然人脑的高级推演和归纳能力远远优于人工智能,但在低级信息处理速度和准确性方面,人类很难与专门从事某种功能的人工智能相比,例如作为人体关节定位。事实上,只需要几毫秒就能给出人体各部位的中心位置,而且精确到像素。然而,如果你显示同一张图片几毫秒,你可能无法清楚地看到人在哪里,更不用说找到关节了。移动鼠标。
第二个威胁是插件无法检测到的隐秘性。与传统外挂不同,传统外挂需要操作游戏的内存数据或者文件数据来获取游戏世界的信息。让作弊者进行一些普通玩家不可能完成的作弊操作。视觉AI完全独立于游戏数据。和人类一样,它也是通过实时观察屏幕来发送鼠标和键盘命令,所以传统的反外挂程序只能孤军奋战。
第三个威胁是所有平台的普遍性。首先,这个AI视觉模型是通过大量真实照片训练的,但它可以识别游戏中的角色,这意味着它可以征服大多数FPS游戏。 AI操作的游戏和人类操作的游戏在交互上没有区别,因此出现了更大的问题。只要屏幕能连接到这个模型,任何游戏平台都可以捕获,包括电脑、游戏机、手机等。无论你有多封闭,或者你维护的生态系统有多好,在视觉AI面前人人平等。
那么我们如何解决这个问题呢?
up主提到可以通过算法检测游戏异常操作。这也是一个想法,但实施起来还是有一定难度。毕竟,它可以让AI更像人类操作。
我想到了之前很流行的Deepfake。那么我们能否通过对抗性样本来解决这个问题,使得视觉AI识别错误呢?
说了这么多,其实还没有什么好的结论。我只能说,技术的发展是在不断的对抗中进步和规范的。
用户评论
卧槽,太NB了!我玩《使命召唤》就一直靠技术打架,看着别人用外挂还很烦人。如果有了这个Python外挂,以后终于可以试试“枪枪爆头”的感觉了!
有6位网友表示赞同!
这么厉害的技能,感觉这已经不是游戏了,简直是现实模拟器啊!不过话说回来,玩外挂会带来多少游戏的乐趣呢?
有13位网友表示赞同!
说真的,如果每个玩家都在用这种Python写的“枪枪爆头”外挂,那游戏就变得毫无趣味了。反而更像是竞技的“黑幕”。
有6位网友表示赞同!
这代码看起来的确很厉害!可是我想知道这“枪枪爆头”的外挂有没有什么局限性?比如能不能只瞄准敌人的头部?会不会引起游戏的账号封禁?
有13位网友表示赞同!
我玩游戏也是为了娱乐,用Python写外挂就太过于严肃了。不如试试其他休闲小游戏吧!
有14位网友表示赞同!
虽然说“枪枪爆头”很爽,但是真的有必要用这种外挂的方式吗?不觉得这样会让别人失去战斗的乐趣吗?
有12位网友表示赞同!
这个Python外挂确实让人眼前一亮,不过我还是更喜欢公平的游戏环境。毕竟游戏本来就是为了挑战自己和对手啊!
有9位网友表示赞同!
我真的很佩服这种编程能力,能够用编程语言编写出可以操控游戏角色外挂的工具。但这让我也更加担忧,是不是以后越来越多人会选择用外挂的方式来获得游戏的胜利?
有16位网友表示赞同!
“枪枪爆头”的确让人憧憬,但是玩游戏不应该只是追求结果吗?应该注重过程和技巧的磨练才是真正的乐趣吧!
有6位网友表示赞同!
这个Python外挂能不能用来修改其他游戏的设定呢?比如可以调整游戏角色的属性或者增加道具?
有13位网友表示赞同!
如果每个人都用Python写出“枪枪爆头”的外挂,那游戏就变成了一个纯粹的代码竞赛。这实在太无聊了!
有9位网友表示赞同!
我建议你把这个Python外挂开源,让更多的人感受到你的编程技巧!
有10位网友表示赞同!
玩游戏应该保持公平竞争的原则,谁用外挂谁是不道德的行为。而且那些使用外挂的人也失去了真正的胜利体验!
有12位网友表示赞同!
这Python外挂确实很厉害,也许我可以学习一下来练练我的编程能力?但是我不会用来做什么“枪枪爆头”的外挂!
有18位网友表示赞同!
我觉得这个Python代码太令人惊叹了!他把游戏的逻辑进行了完美的改写,让玩家可以体验到“枪枪爆头”的快感。这种技术应用在其他的领域也一定会有非常好的效果吧?
有19位网友表示赞同!
我有点担心这个“枪枪爆头”外挂会对游戏的发展造成负面影响。毕竟它打破了游戏的平衡性和公平性,最终会导致玩家流失的游戏市场!
有7位网友表示赞同!
"枪枪爆头"感觉确实很酷,但我更喜欢用自己的策略和技巧来赢得比赛!用Python外挂的方式去胜利的感觉终究是缺少了一些乐趣和挑战的!
有10位网友表示赞同!