当前位置: 首页 > news >正文

pytorch-fastrcnn识别王者荣耀敌方英雄血条

文章目录

    • 前言
    • 效果如下
    • 实现
    • 训练数据获得
    • 训练数据和测试数据yaml文件
    • 训练py
    • 画框文件的修改py
    • 测试py
    • 升级

前言

最近看王者荣耀视频看到了一个别人提供的一个百里自动设计解决方案,使用一个外设放在百里的二技能上,然后拖动外设在屏幕上滑动,当外设检测到有敌方英雄时外设自动松开百里二技能达到自动射击的效果,
我的思路一下就打开了,之前什么指哪打哪,计算电脑上二技能圆坐标和敌方英雄椭圆射击坐标函数映射,都是屁话,直接让二技能射击线进行像雷达一样的扫描就可以了,当检测到敌方英雄时自动松开二技能,这样百里不就可以超神了吗?而且延时更低,射击更快
那么难点在哪里呢?
还是敌方英雄血条的识别上,当然,这个不是问题

效果如下

可以达到每秒60帧的识别效果,这个识别速度已经嘎嘎快了
我在桌面上打开了我打王者荣耀时录下的视频,然后对视频中的英雄进行实时识别
请添加图片描述

实现

fastrcnn不是很新鲜的高深技术,事实上他有模板可用
github上有项目路径
https://github.com/sovit-123/fasterrcnn-pytorch-training-pipeline#Tutorials
我所做的也仅仅是自己使用labelimg标注了1000张图片(过程真是痛苦,一个个拉框,中途吃了三个苹果看了会儿剧才断断续续坚持拉满了1000张),然后用fasterrcnn_mobilenetv3_large_fpn模型,迭代了50次进行了训练
我只是略微修改了下,参照烟雾识别模型,使其符合我自己的图片识别,其中我修改了如下文件,以做参考

对了,这是我所使用模型的生成的权重文件和使用的工程
https://download.csdn.net/download/lidashent/88476823
训练原始图像大小为640x288
如果要测试这个权重,运行inference1.py这个文件,然后使用QtScrcpy连接手机打开游戏,格式大小调节为640,在电脑上可以看到游戏画面和实时识别画面

训练数据获得

使用QtScrcpy连接手机,然后打开这个软件的自动录像功能,然后打了一局游戏,然后将得到的视频中敌人出现的视频片段使用pr进行裁剪得到一个新视频,然后使用python获得每一帧,然后使用labelIMG进行手动画框标注
我标注到1000张就开始训练了,从结果看效果识别很不错,
我其实想使用一种更加省力的方法,就是打开王者荣耀的单机模式,然后使用电脑调试,从内存中获得每位敌方英雄的坐标,对每帧敌方英雄动态标注,这样就不用手动拉框了,而且生成的坐标也更加精准,同时也可以做敌方英雄位置动态预测,但是我偷懒了,想赶紧获得训练数据看看效果,所以这个没做,如果有哪位实现了,分享我下,我去偷师

训练数据和测试数据yaml文件

就是修改了下血条数据存放路径和标签而已

TRAIN_DIR_IMAGES: ./data/blood_pascal_voc/archive/train/images
TRAIN_DIR_LABELS: ./data/blood_pascal_voc/archive/train/annotations
VALID_DIR_IMAGES: ./data/blood_pascal_voc/archive/valid/images
VALID_DIR_LABELS: ./data/blood_pascal_voc/archive/valid/annotations
# Optional test data path. If given, test paths (data) will be used in
# `eval.py`.
# TEST_DIR_IMAGES: 
# TEST_DIR_LABELS: # Class names.
CLASSES: ['__background__','blood'
]# Number of classes (object classes + 1 for background class in Faster RCNN).
NC: 2# Whether to save the predictions of the validation set while training.
SAVE_VALID_PREDICTION_IMAGES: True

训练py

不习惯使用参数化方式训练数据,于是我修改了下train文件直接预设参数进行训练,直接执行train文件
至于模型的微调,你自己看着办吧,我不能保证我微调的模型一定更加合理,你可以直接使用预设的模型

def parse_opt():# Construct the argument parser.parser = argparse.ArgumentParser()parser.add_argument('-m', '--model',default='fasterrcnn_resnet50_fpn',help='name of the model')parser.add_argument('--data',default=r"data_configs/bloodLine.yaml",help='path to the data config file')parser.add_argument('-d', '--device',default='cuda',help='computation/training device, default is GPU if GPU present')parser.add_argument('-e', '--epochs',default=50,type=int,help='number of epochs to train for')parser.add_argument('-j', '--workers',default=4,type=int,help='number of workers for data processing/transforms/augmentations')parser.add_argument('-b', '--batch',default=16,type=int,help='batch size to load the data')parser.add_argument('--lr',default=0.001,help='learning rate for the optimizer',type=float)parser.add_argument('-ims', '--imgsz',default=640,type=int,help='image size to feed to the network')parser.add_argument('-n', '--name',default="blood_training4-fasterrcnn_resnet50_fpn",type=str,help='training result dir name in outputs/training/, (default res_#)')parser.add_argument('-vt', '--vis-transformed',dest='vis_transformed',action='store_true',help='visualize transformed images fed to the network')parser.add_argument('--mosaic',default=0.0,type=float,help='probability of applying mosaic, (default, always apply)')parser.add_argument('-uta', '--use-train-aug',dest='use_train_aug',action='store_true',help='whether to use train augmentation, blur, gray, \brightness contrast, color jitter, random gamma \all at once')parser.add_argument('-ca', '--cosine-annealing',dest='cosine_annealing',action='store_true',help='use cosine annealing warm restarts')parser.add_argument('-w', '--weights',default=None,# default=r"outputs/training/blood_training-fasterrcnn_mobilenetv3_large_fpn/best_model.pth",type=str,help='path to model weights if using pretrained weights')parser.add_argument('-r', '--resume-training',dest='resume_training',action='store_true',help='whether to resume training, if true, \loads previous training plots and epochs \and also loads the otpimizer state dictionary')parser.add_argument('-st', '--square-training',dest='square_training',action='store_true',help='Resize images to square shape instead of aspect ratio resizing \for single image training. For mosaic training, this resizes \single images to square shape first then puts them on a \square canvas.')parser.add_argument('--world-size',default=1,type=int,help='number of distributed processes')parser.add_argument('--dist-url',default='env://',type=str,help='url used to set up the distributed training')parser.add_argument('-dw', '--disable-wandb',dest="disable_wandb",action='store_true',default='3',help='whether to use the wandb')parser.add_argument('--sync-bn',dest='sync_bn',help='use sync batch norm',action='store_true')parser.add_argument('--amp',action='store_true',help='use automatic mixed precision')parser.add_argument('--seed',default=0,type=int ,help='golabl seed for training')parser.add_argument('--project-dir',dest='project_dir',default=None,help='save resutls to custom dir instead of `outputs` directory, \--project-dir will be named if not already present',type=str)args = vars(parser.parse_args())return args

画框文件的修改py

因为训练数据少,模型有时只能识别血条,无法区分敌我,因此需要对血条颜色进行区分
所以对于模型最后给出的分类结果,我加了如下限制,在annotations.py文件里我添加了一个画框约束代码
就是检测画框内红色点数,经过实践发现,红色点数低于60就可以判定为非敌方英雄
可根据需要对此行代码进行修改
for j, box in enumerate(draw_boxes):

    def judgePoint(p1,p2,img):# 制定矩形范围(x1, y1), (x2, y2) =p1,p2roi = img[y1+2:y2, x1+15:x2]# 将图像转换为HSV色彩空间hsv = cv2.cvtColor(roi, cv2.COLOR_BGR2HSV)# 设定红色范围lower_red = (0, 50, 50)upper_red = (10, 255, 255)mask1 = cv2.inRange(hsv, lower_red, upper_red)lower_red = (170, 50, 50)upper_red = (180, 255, 255)mask2 = cv2.inRange(hsv, lower_red, upper_red)# 合并两个掩码mask = mask1 + mask2# cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 2)# 计算红色像素数量red_pixels = cv2.countNonZero(mask)return red_pixels# Draw the bounding boxes and write the class name on top of it.for j, box in enumerate(draw_boxes):p1 = (int(box[0]/image.shape[1]*width), int(box[1]/image.shape[0]*height))p2 = (int(box[2]/image.shape[1]*width), int(box[3]/image.shape[0]*height))class_name = pred_classes[j]redCounts=judgePoint(p1,p2,orig_image)# print(redCounts)if redCounts>80:if args['track']:color = colors[classes.index(' '.join(class_name.split(' ')[1:]))]else:color = colors[classes.index(class_name)]cv2.rectangle(orig_image,p1, p2,color=color,thickness=lw,lineType=cv2.LINE_AA)if not args['no_labels']:# For filled rectangle.final_label = class_name + ' ' + str(round(scores[j], 2))w, h = cv2.getTextSize(final_label,cv2.FONT_HERSHEY_SIMPLEX,fontScale=lw / 3,thickness=tf)[0]  # text width, heightw = int(w - (0.20 * w))outside = p1[1] - h >= 3p2 = p1[0] + w, p1[1] - h - 3 if outside else p1[1] + h + 3cv2.rectangle(orig_image,p1,p2,color=color,thickness=-1,lineType=cv2.LINE_AA)cv2.putText(orig_image,final_label,(p1[0], p1[1] - 5 if outside else p1[1] + h + 2),cv2.FONT_HERSHEY_SIMPLEX,fontScale=lw / 3.8,color=(255, 255, 255),thickness=tf,lineType=cv2.LINE_AA)

测试py

我修改其为获得桌面指定区域的动态图像,然后对桌面图像的每一帧进行识别
修改其inference.py文件,然后修改其图片获取方式为桌面图像

x, y = 0, 0width, height = 641, 321while(1):image_name='aa'screenshot = pyautogui.screenshot(region=(x, y, width, height))# 显示截图# 将截图转换为NumPy数组screenshot = np.array(screenshot)orig_image = cv2.cvtColor(screenshot, cv2.COLOR_RGB2BGR)#对每一帧桌面图像进行识别...

对于识别显示,如果发现卡顿,是因为设置的是检测到才显示图像
实际上可以调整为检测到血条显示标识框,不检测到正常显示,可以对推理py显示部分修改为:
将显示部分移出检测判断范围,使其和画框部分代码并列:

        if len(outputs[0]['boxes']) != 0:draw_boxes, pred_classes, scores = convert_detections(outputs, detection_threshold, CLASSES, args)orig_image = inference_annotations(draw_boxes, pred_classes, scores,CLASSES,COLORS, orig_image, image_resized,args)if args['show']:cv2.imshow('Prediction', orig_image)cv2.waitKey(0)if args['mpl_show']:plt.imshow(orig_image[:, :, ::-1])plt.axis('off')plt.show()

升级

其实有更加简单的方案,就是不用fastrcnn识别血条,而是直接识别百里的二技能射击线在敌方英雄上的情况,这样,每当百里二技能射击线在敌方英雄身上,就会自动松开百里二技能,就能直接射击了

相关文章:

pytorch-fastrcnn识别王者荣耀敌方英雄血条

文章目录 前言效果如下实现训练数据获得训练数据和测试数据yaml文件训练py画框文件的修改py测试py升级 前言 最近看王者荣耀视频看到了一个别人提供的一个百里自动设计解决方案,使用一个外设放在百里的二技能上,然后拖动外设在屏幕上滑动,当外设检测到有敌方英雄时外设自动松开…...

阿里云推出通义千问App,提供全方位的协助

🦉 AI新闻 🚀 阿里云推出通义千问App,提供全方位的协助 摘要:阿里云旗下大模型通义千问App登陆各大安卓应用市场,具有超大规模预训练模型,可在创意文案、办公助理、学习助手、趣味生活等方面协助用户。功…...

深入解析 Spring Framework 中 @Autowired 注解的实现原理

关于Autowired注解的作用 Autowired 注解在Spring中的作用是实现依赖注入(Dependency Injection),它用于自动装配(autowiring)Spring Bean 的依赖关系。具体来说, Autowired 注解有以下作用: …...

电脑数据文件恢复工具easyrecovery14中文版

当不小心将回收站的文件删除了怎么办?想找回但是不知道怎么找回需要的数据文件?别担心今天小编就为大家介绍一款非常专业的电脑数据文件恢复工具,easyrecovery14是由Ontrack专为电脑用户推出的一款专业的数据恢复软件,这款软件功能…...

Android NDK开发详解之Application.mk探秘

Android NDK开发详解之Application.mk探秘 概览变量APP_ASFLAGSAPP_ASMFLAGSAPP_BUILD_SCRIPTAPP_CFLAGSAPP_CLANG_TIDYAPP_CLANG_TIDY_FLAGSAPP_CONLYFLAGSAPP_CPPFLAGSAPP_CXXFLAGSAPP_DEBUGAPP_LDFLAGSAPP_MANIFESTAPP_MODULESAPP_OPTIMAPP_PLATFORMAPP_PROJECT_PATHAPP_STL…...

(草履虫都可以看懂的)PyQt子窗口向主窗口传递参数,主窗口接收子窗口信号、参数。

子窗口向主窗口发射信号。 只需要插入两行代码 class CodeSettingWindow(Ui_CodeSetting, QMainWindow):_signal pyqtSignal(int, int, int) # 这个信号要放在class之下,———init————函数上def __init__(self):# self.Win_X, self.Win_Y, self.CodeNum表示…...

Golang Web3钱包开发指南

简介 以太坊(Ethereum)是目前最受欢迎的区块链平台之一,它提供了智能合约功能和去中心化应用(DApps)的开发能力。在以太坊生态系统中,Web3钱包扮演着关键角色,允许用户管理账户和密钥、发送交易…...

Vue使用 IndexDB vue操作IndexDB数据库 Vue操作IndexDB数据库

Vue使用 IndexDB vue操作IndexDB数据库 Vue操作IndexDB数据库 Vue使用 IndexDB vue操作IndexDB数据库 Vue操作IndexDB数据库安装 IndexDB类库引入 localForage测试 新增数据、获取数据 Vue使用 IndexDB vue操作IndexDB数据库 Vue操作IndexDB数据库 大部分场景使用 LocalStore都…...

CentOS 安装 Hadoop Local (Standalone) Mode 单机模式

CentOS 安装 Hadoop Local (Standalone) Mode 单机模式 Hadoop Local (Standalone) Mode 单机模式 1. 修改yum源 并升级内核和软件 curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repoyum clean allyum makecacheyum -y update2. 安…...

jenkins工具系列 —— 删除Jenkins JOB后清理workspace

文章目录 问题现象分析解决思路脚本实现问题现象分析 Jenkins使用过程中,占用空间最大的两个位置: 1 、workspace: 工作空间,可以随便删除,删除后再次构建时间可能会比较长,因为要重新获取一些资源。 2 、job: 存放的是项目的配置、构建结果、日志等。不建议手动删除,…...

超越人眼,好用的OCR软件推荐

OCR技术(Optical Character Recognition)是一种将图像或扫描的文字转化为可编辑、搜索、存储、分享的文本的技术。OCR技术除了能够将纸质文档数字化,还可以将手写文本、印刷文本、数码照片中的文字等转化为电子文本。 以下是几个比较知名的O…...

Go语言开发网站

引言 随着互联网的迅速发展,网站已经成为人们获取各种信息和服务的主要途径。而开发一个高性能、可扩展的网站是一项挑战。Go语言作为一门现代化的编程语言,具有强大的并发能力和高效的性能,逐渐成为网站开发的首选语言之一。本文将介绍如何…...

第18章_MySQL8其它新特性

第18章_MySQL8其它新特性 讲师:尚硅谷-宋红康(江湖人称:康师傅) 官网:http://www.atguigu.com 1. MySQL8新特性概述 MySQL从5.7版本直接跳跃发布了8.0版本,可见这是一个令人兴奋的里程碑版本。MySQL 8版…...

Python爬虫实战(六)——使用代理IP批量下载高清小姐姐图片(附上完整源码)

文章目录 一、爬取目标二、实现效果三、准备工作四、代理IP4.1 代理IP是什么?4.2 代理IP的好处?4.3 获取代理IP4.4 Python获取代理IP 五、代理实战5.1 导入模块5.2 设置翻页5.3 获取图片链接5.4 下载图片5.5 调用主函数5.6 完整源码5.7 免费代理不够用怎…...

【操作系统】考研真题攻克与重点知识点剖析 - 第 1 篇:操作系统概述

前言 本文基础知识部分来自于b站:分享笔记的好人儿的思维导图与王道考研课程,感谢大佬的开源精神,习题来自老师划的重点以及考研真题。此前我尝试了完全使用Python或是结合大语言模型对考研真题进行数据清洗与可视化分析,本人技术…...

Mac删除照片快捷键ctrl加什么 Mac电脑如何批量删除照片

Mac电脑是很多人喜欢使用的电脑,它有着优美的设计、高效的性能和丰富的功能。如果你的Mac电脑上存储了很多不需要的照片,那么你可能会想要删除它们,以节省空间和提高速度。那么,Mac删除照片快捷键ctrl加什么呢?Mac电脑…...

数据安全认证:保护您的数据安全的关键步骤

随着信息技术的飞速发展,数据安全问题日益凸显。数据泄露、网络攻击等事件频发,给企业和个人带来极大的损失。因此,数据安全认证成为保护数据安全的重要措施。本文将探讨数据安全认证的重要性、认证流程和相关标准,以期帮助读者更…...

表白墙/留言墙 —— 初级SpringBoot项目,练手项目前后端开发(带完整源码) 全方位全步骤手把手教学

🧸欢迎来到dream_ready的博客,📜相信你对这篇博客也感兴趣o (ˉ▽ˉ;) 用户登录前后端开发(一个简单完整的小项目)——SpringBoot与session验证(带前后端源码)全方位全流程超详细教程 目录 项目前端页面展…...

【海德教育】报考建筑八大员需要满足下列条件:

1 、初级(具备以下条塌氏件之一) ( 1 )本专业或相关专业中专以上学历竖陆。 ( 2 )从事本职业工作 2 年以上。 2 、中级(具备以下条件之一) ( 1 )本专业或相关专业大专以上学历。 ( 2 )连续从事本职业工作 4 年以上。 ( 3 )取得余衫顷本职业初级证书,从事本职业工作 …...

酷开科技,让家庭更有温度!

生活中总有一些瞬间,会让我们感到无比温暖和幸福。一个拥抱、一句问候、一杯热茶,都能让我们感受到家庭的温馨和关爱。酷开科技也用自己的方式为我们带来了独属于科技的温暖,通过全新的体验将消费者带进一个充满惊喜的世界,让消费…...

网络六边形受到攻击

大家读完觉得有帮助记得关注和点赞!!! 抽象 现代智能交通系统 (ITS) 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 (…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)

说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...

连锁超市冷库节能解决方案:如何实现超市降本增效

在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...

Python实现prophet 理论及参数优化

文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...

让AI看见世界:MCP协议与服务器的工作原理

让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...

项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)

Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败,具体原因是客户端发送了密码认证请求,但Redis服务器未设置密码 1.为Redis设置密码(匹配客户端配置) 步骤: 1).修…...

大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计

随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如Llama2-7B处理100K token时需50GB内存&a…...

视觉slam十四讲实践部分记录——ch2、ch3

ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...

mac 安装homebrew (nvm 及git)

mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用: 方法一:使用 Homebrew 安装 Git(推荐) 步骤如下:打开终端(Terminal.app) 1.安装 Homebrew…...

uniapp 集成腾讯云 IM 富媒体消息(地理位置/文件)

UniApp 集成腾讯云 IM 富媒体消息全攻略(地理位置/文件) 一、功能实现原理 腾讯云 IM 通过 消息扩展机制 支持富媒体类型,核心实现方式: 标准消息类型:直接使用 SDK 内置类型(文件、图片等)自…...