Giter Club home page Giter Club logo

katacr's Introduction

皇室战争非嵌入式AI

中文 | English

本仓库为我本科设计全部代码,目标是实现一个仅通过移动设备屏幕获取信息并做出决策的智能体,其设计框架如下 架构

生成式目标识别数据集构建方法 生成式数据集流程

制作的图像数据集:GitHub - Clash-Royale-Detection-Dataset 目标识别、图像分类数据集

YOLOv8目标检测

决策模型架构设计 决策模型

离线强化学习策略与8000分AI进行实时对局(12个获胜对局-Bilibili

环境要求

我使用的推理环境:手机系统为鸿蒙、电脑系统为 Ubuntu24.04 LTS,CPU: R9 7940H,GPU: RTX GeForce 4060 Laptop,平均决策用时 120ms,特征融合用时 240ms。

电脑至少需要一块Nvidia显卡,又由于手机视频流输入必须依赖Linux内核中的V4L2,且JAX的GPU版本不支持Windows,因此本项目的验证决策部分只能Linux系统下运行。

依赖包安装

requirements.txt中列举了本项目所用到的Python包,但是由于使用了三种不同的神经网络框架,环境安装建议方法如下:

  1. 安装miniforge,创建环境conda create -n katacr python==3.11

  2. 根据你的显卡驱动所支持的最高版本安装CUDA(使用nvidia-smi查看所支持的最高版本CUDA),建议直接在conda环境中安装cuda

conda activate katacr
conda install -c conda-forge cudatoolkit=11.8 cudnn=8.9  # or cudatoolkit=12.0 cudnn=8.9
  1. 安装神经网络框架:
  • 安装JAX(注意:CUDA11.8的编译版本请使用pip install "jax[cuda11]==0.4.25 -f https://storage.googleapis.com/jax-releases/jax_cuda_releases.html",最新版已经不再支持CUDA11.8)

  • 安装Pytorch 2.2.2

  • 安装PaddlePaddle 2.6.1

  • 执行debug/cuda_avail.py查看神经网络框架是否都已支持GPU

  1. 安装其他依赖包:pip install -r requirements.txt

Scrcpy的安装方法见scrcpy/doc/linux

模型验证

注意:由于我使用的手机屏幕分辨率为 1080x2400 高比宽为 2.22,其他屏幕位置的相对参数均在该分辨率比例下确定,如果需要使用不同的分辨率,请在 constant.py 中修改 split_bbox_params 中的 part{idx}_{ratio},其中 idx=1,2,3 分别表示右上角时间图像位置,中间竞技场和下方手牌区域,可以使用 split_part.py 进行调试,ratio 为你的手机屏幕高比宽比例。

目标识别模型

这里给出最佳性能双目标组合识别器,将模型权重文件放到 KataCR/runs 下,修改代码 combo_detect.py 中的识别视频文件,即可在 KataCR/logs/detection/{start-time} 下看到目标识别出的结果。

模型名称 参数下载 更新时间
YOLOv8 x2 detector1 v0.7.13, detector2 v0.7.13 2024.05.01.

分类模型

这是两个用ResNet实现的模型

模型名称 参数下载 备注
卡牌分类器 CardClassification 仅对2.6速猪卡牌进行分类
圣水分类器 ElixirClassification 仅对圣水数字-1,-2,-3,-4进行分类

决策模型

三种不同决策模型的验证方法不同

连续动作预测模型(有Delay) 离散动作预测模型(无Delay) 连续动作预测全卡牌模型
验证代码 eval.py eval_no_delay.py eval_all_unit.py
模型参数下载 StARformer_3L__step50
DT_4L__step50
StARformer_no_delay_2L__step50 StARformer_3L_pred_cls__step50
总奖励(测试20回合) −4.7±3.1
−5.7±2.5
−7.5±0.8 −5.6±2.1

将模型权重文件放到KataCR/logs/Policy/{model-name}中,模型验证方法如下:

cd KataCR/katacr/policy/offline
python eval.py --load-epoch 3 --eval-num 20 --model-name "StARformer_3L_v0.8_golem_ai_cnn_blocks__nbc128__ep30__step50__0__20240512_181646"
python eval.py --load-epoch 8 --eval-num 20 --model-name "DT_4L_v0.8_golem_ai_cnn_blocks__nbc128__ep20__step50__0__20240519_224135"
python eval_no_delay.py --load-epoch 1 --eval-num 20 --model-name "StARformer_no_delay_2L_v0.8_golem_ai_cnn_blocks__nbc128__ep20__step50__0__20240520_205252"
python eval_all_unit.py --load-epoch 2 --eval-num 20 --model-name "StARformer_3L_pred_cls_v0.8_golem_ai_cnn_blocks__nbc128__ep20__step50__0__20240516_125201"

模型会自动点击屏幕中的几个位置进入训练师对局,当然这几个点位也是相对 2.22 分辨率高宽比设定的,自行对 sar_daemon.py 中的 def _start_new_episode(self) 函数进行修改。

模型训练

YOLOv8

YOLOv8模型的重构内容见yolov8_modify

  • 生成式数据集下载Clash-Royale-Detection-Dataset,修改build_dataset/constant.pypath_dataset参数为本机的数据集路径。
  • 生成式目标识别图像:执行build_dataset/generator.py,即可在KataCR/logs/generation文件夹下看到生成的原图像与带目标识别的图像。
  • YOLOv8训练:由于本任务识别类别数目多达150个,所以我尝试了YOLOv8检测器组合方法,每个识别器分别对不同切片大小的类别进行识别: 切片大小分布图 橙色和绿色虚线分别分割了双和三模型组合所需识别的切片类型,训练不同模型组合方法如下:
    1. 配置多模型参数配置文件yolov8/cfg.py
    2. 执行yolov8/model_setup.py可自动在./katacr/yolov8/detector{i}下生成对应的识别器配置用于模型训练(所需识别的类别,验证集路径)
    3. 配置yolov8/ClashRoyale.yamlname模型名称、deviceGPU设别编号和一些数据增强策略
    4. 训练:执行yolov8/train.py对模型进行训练(本项目的训练曲线图wandb_YOLOv8
    5. 验证:执行yolov8/combo_validator.py对组合模型进行验证
    6. 推理:执行yolov8/combo_detect.py对组合模型进行推理(推理中可以制定目标追踪算法)
  • 决策模型训练:
    1. 离线数据集制作(也可直接从Clash Royale Replay Dataset下载):

    2. 将原始对战视频通过build_dataset/cut_episodes.py通过OCR识别按照回合进行划分

    3. 使用build_dataset/extract_part.py将回合中的竞技场部分单独截取出来

    4. 使用policy/replay_data/offline_data_builder.py进行特征融合制作出离线数据集,制作结果保存于KataCR/logs/offline/{start-time}/文件夹下

    5. 参考train_policy.sh中代码

    CUDA_VISIBLE_DEVICES=$1 \  # 指定GPU编号(只支持单卡训练)
    python katacr/policy/offline/train.py --wandb \  # 启用wandb在线记录
      --total-epochs 20 --batch-size 32 --nominal-batch-size 128 \  # 训练参数配置
     --cnn-mode "cnn_blocks" --name "StARformer_3L_v0.8_golem_ai_interval2" --pred-card-idx --random-interval 2 --n-step 50 \  # 模型参数配置
      --replay-dataset "/data/user/zhihengwu/Coding/dataset/Clash-Royale-Replay-Dataset/golem_ai"  # 数据集参数配置
    (本项目的训练曲线图wandb_ClashRoyale_Policy

代码架构

  • build_dataset/
    • 对视频文件进行预处理(划分episode,逐帧提取,图像不同部分提取)
    • 目标识别数据集搭建工具(辅助标记数据集,数据集版本管理,生成式目标识别,标签转化及识别标签生成,图像切片提取)
  • classification/:用ResNet进行手牌及圣水分类
  • constants:常量存储(卡牌名称及对应圣水花费,目标识别类别名称)
  • detection:自行用JAX复现的YOLOv5模型(后弃用)
  • interact:测试与手机进行实时交互,包括目标识别,文本识别,GUI
  • ocr_text:包括用JAX复现的CRNN(后弃用)和PaddleOCR的接口转化
  • policy
    • env:两种测试环境:
      • VideoEnv:将视频数据集作为输入,仅用于调试模型的输入是否与预测相对应
      • InteractEnv:与手机进行实时交互,使用多进程方式执行感知融合
    • offline:包含了决策模型StARformerDT的训练,验证的功能,并包含三种CNN测试结构ResNet,CSPDarkNet, CNNBlocks
    • perceptron:感知融合:包含了state,action,reward三种特征生成器,并整合到SARBuilder中(感知基于YOLOv8,PaddleOCR,ResNet Classifier
    • replay_data:提取专家视频中的感知特征,制作并测试离线数据集
    • visualization:实时监测手机图像,可视化感知融合特征
  • utils:用于目标检测相关的工具(绘图、坐标转化、图像数据增强),用于视频处理的ffmpeg相关工具
  • yolov8:重构YOLOv8源码,包括数据读取、模型训练、验证、目标检测、跟踪,模型识别类型设置以及参数配置

katacr's People

Contributors

wty-yy avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar

katacr's Issues

求论文正文

作者你好,我最近也开始准备毕设,对你强化学习的具体实现方式很感兴趣,不知能否拜读一下此项目最终形成的论文?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.