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

news2024/11/19 17:45:35

文章目录

    • 前言
    • 效果如下
    • 实现
    • 训练数据获得
    • 训练数据和测试数据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,p2
        roi = 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, height
                w = int(w - (0.20 * w))
                outside = p1[1] - h >= 3
                p2 = p1[0] + w, p1[1] - h - 3 if outside else p1[1] + h + 3
                cv2.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, 0
    width, height = 641, 321
    while(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)
        #对每一帧桌面图像进行识别
        ...

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1138117.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

为什么企业都在建立指标体系,有什么用途?

什么是指标体系 指标是指企业从不同角度梳理日常业务活动,把积累的庞大数据提炼成不同的业务指标,然后反过来用指标来指代具体的业务活动。 指标体系则是把这些从不同部门、业务、人员中提炼出的业务指标融合汇总到一起,形成一个指标系统&a…

JavaScript进阶知识汇总~

JavaScript 进阶 给大家推荐一个实用面试题库 1、前端面试题库 (面试必备) 推荐:★★★★★ 地址:web前端面试题库 1.原型链入门 1) 构造函数 当我们自定义一个函数时(箭头函数与生成器函数除外),这个函…

PyQt5写一个Python代码执行器

# Author : 小红牛 # 微信公众号:WdPython import sys from PyQt5.QtWidgets import QApplication, QLabel, QLineEdit, QPushButton, QVBoxLayout, QWidgetdef execute_code():# 获取输入的代码code code_input.text()# 执行代码exec(code)# 创建应用程序和窗口 a…

数智化推送助力用户精准分层,MobPush是如何实现用户价值变现的

随着移动设备普及,移动应用市场日益趋于饱和,传统的拉新促活、提升APP渗透率,利用庞大的用户流量带来的广告收入、第三方合作等方式实现价值变现的路径已越来越窄,拉新促活成本的高企不下进一步限制了这种价值增长方式的可行性。因…

Rookit系列二【文件隐藏】【支持Win7 x32/x64 ~ Win10 x32/x64平台的NTFS文件系统】

文章目录 前言探究代码演示 前言 文件隐藏的方法有很多,这里分享的是一种通过内核文件重定向的方式动态规避检测的方法。举例:假设有一个安全软件A,A要扫描文件B,B是我们想要隐藏的文件。那么我们在内核中将A打开文件B的操作重定…

Qt 实现侧边栏滑出菜单效果

1.效果图 2.实现原理 这里做了两个widget,一个是 展示底图widget,一个是 展示动画widget。 这两个widget需要重合。动画widget需要设置属性叠加到底图widget上面,设置如下属性: setWindowFlags(Qt::FramelessWindowHint | Qt::…

2023/10/26MySQL学习

事务 询问当前是什么提交方式 1代表默认提交,0代表手动提交 将事务设为手动提交 将事务设置为手动提交后,mysql语句只会执行,但不会对原本表中数据进行更改, 只有执行以下两个语句之一,才会继续进行 commit完成原本操作,更改数据 rollback取消原来事务,不会进行任何更改 如…

【嵌入式Linux】编译应用和ko内核模块Makefile使用记录

文章目录 一、常用的语法1.1 , :, , ?的区别1.2 命名模式:target-objs 和 target-y 的区别 二、编译KO2.1 难度0:一个.c文件编译成一个.ko文件2.1.1 改进一下Makefile使得编译命令只需要make就可以 2.2 难度1:多个.c,.h文件编译成一个.ko文件…

在Java中使用FileReader.read()进行读取文件时,为什么乱码?两个方法解决

public class FileReader_ {public static void main(String[] args) {}Testpublic void m1() {String filePath "e:\\hello.txt";FileReader fileReader null;try {fileReader new FileReader(filePath);//循环读取 使用readwhile (fileReader.read()!-1){System…

使用dlib,OpenCV和Python进行人脸识别—人眼瞌睡识别

前期文章我们分享了如何使用python与dlib来进行人脸识别,以及来进行人脸部分的识别, 如下图,dlib人脸数据把人脸分成了68个数据点,从图片可以看出,人脸识别主要是识别:人眉,人眼,人鼻,人嘴以及人脸下颚边框,每个人脸的部位都有不同的数据标签从1-68 当我们识别出人脸…

伦敦银现货白银走势如何应对

伦敦银是国际现货白银交易的别称,它每天的价格走势受到全球投资者广泛的关注,也是全球各个白银市场的价格指标。白银投资者要了解伦敦银走势的特点,才能更好地进行分析,实现自己的所预期的收益。 整体来说,伦敦银价格的…

Java工具库——Hutool的50个常用方法

爱一辈子也好,恨一辈子也罢,终究是要让你记我一辈子… 工具库介绍 Hutool-All(或简称Hutool)是一个功能强大的Java编程工具库,旨在简化Java应用程序的开发。它提供了大量的工具类和方法,涵盖了各种常见任务…

创建个人github.io主页(基础版)//吐槽:很多国内教程已经失效了

一、就跟着官网教程来很快就好了 官方文档的教程 GitHub Pages | Websites for you and your projects, hosted directly from your GitHub repository. Just edit, push, and your changes are live. // 简单跑通为例,第一个链接直接能行了,如果不想…

数据泄露高达7 TB ,这家医疗巨头数据库无任何密码保护

该数据库由Redcliffe Labs拥有,Redcliffe Labs是一家位于北方邦诺伊达的印度医疗公司。 网络安全研究员杰里迈亚-福勒(Jeremiah Fowler)发现了一个无密码保护的数据库,其中包含 1200 多万条记录。这些数据包括敏感的患者数据&…

本地存储 sessionStoragelocalStorage

随着互联网的快速发展,基于网页的应用越来越普遍,同时也变的越来越复杂,为了满足各种各样的需求,会经常性在本地存储大量的数据,HTML5规范提出了相关解决方案。 本地存储特性 数据存储在用户浏览器中 设置、读取方便、…

自监督学习应用

1 自监督学习 自监督学习主要是利用辅助任务(pretext)从大规模的无监督数据中挖掘自身的监督信息,通过这种构造的监督信息对网络进行训练,从而可以学习到对下游任务有价值的表征。(也就是说自监督学习的监督信息不是人…

涨幅25%,2023全球电动车销量将飙升至2000万辆 | 百能云芯

近日,工研院在「眺望2024产业发展趋势研讨会」上发布消息,预测随着全球晶片短缺的逐渐缓解,以及俄乌地区供应链产能向其他国家的部分转移,全球汽车市场在疫情的影响下逐渐回暖。根据工研院的数据,2023年全球汽车销量预…

DSP_控制程序框架有感

本文仅代表个人观点,若有不同意见,请评论区讨论或私信留言。 中心思想: 基于DSP的控制程序可分为两个部分,① 对实时性要求高的部分,②对实时性要求不高的部分。 ① 对实时性要求高的程序,建议采用中断处理…

Ubuntu22.04本地部署PaddleSpeech实验代码(GPU版)

前言 之前做了一个Ubuntu18.04.6本地部署PaddleSpeech实验代码(CPU版)的相关项目,因为是CPU版的,合成/训练等方面的耗时真的是非常感人,有了之前的经验,又部署了一个GPU版的,说实话虽然时间用的…

CVE-2022-22963 Spring Cloud Function SpEL命令注入

一、简介 Spring Cloud Function 是基于 Spring Boot的函数计算框架。该项目致力于促进函数为主的开发单元,它抽象出所有传输细节和基础架构,并提供一个通用的模型,用于在各种平台上部署基于函数的软件。在Spring Cloud Function相关版本&am…