Files
climperor/README.md
T
voson 1d0428b4a3 Add hash routing and Dota 2 logo to relations preview.
- New web/relations/router.js (parseHash/serializeHash/installRouter):
  top tabs, hero + detail sub-tab, item, patch version, tag filters and
  search query all sync to URL (#/heroes/axe/core, ?tags=...&q=...);
  pushState for discrete picks, replaceState for debounced search.
- export_relations_site.py copies router.js so static export deep-links.
- Header shows dota2_logo.png + title, served via /ui-icon/ whitelist.
- fetch_dota2_logo.py fetches the transparent emblem asset.
- Docs: CHANGELOG / README / DESIGN / AGENTS updated.
2026-07-27 13:09:14 +08:00

6.2 KiB
Raw Blame History

上分帝(Climperor

Dota 2 天梯选将识别:从选人 / 决策时间截图中识别双方 10 个英雄。

本地、离线、秒级;模板来自 Steam CDN 官方头像。GSI 只负责触发时机,阵容靠视觉读顶栏。

设计背景见 DESIGN.md;协作约定见 AGENTS.md;变更记录见 CHANGELOG.md

原理

决策时间截图(PNG)
  → 按相对坐标裁出 10 个头像格(分辨率无关)
  → 缩放到统一尺寸;天梯局自动屏蔽段位条/勋章遮挡区
  → 与 CDN 模板做归一化相关匹配(TM_CCOEFF_NORMED
  → Top-1 分数 + Top1Top2 分差双阈值 → hero_key 或 null

皮肤差异靠会话策略处理(选人阶段多帧确认,决策阶段禁止改判),不堆皮肤模板。

安装

pip install -r requirements.txt
python fetch_cdn_templates.py   # 一次性:data/heroes.json(含基础属性/血蓝)+ templates/cdn/
# 可选:从选将笔记 xlsx 导入定性克制/搭档
# python import_relations_xlsx.py path\to\dota2.xlsx

克制 / 被克制 / 搭档(游戏外)

python fetch_hero_portraits.py  # 官网竖版头像 → assets/hero_portraits/
python fetch_hero_items.py      # OpenDota 热度 + Valve 中文名 + Steam 图标 → data/hero_items.json
python fetch_item_shop.py       # 官网商店 11 列目录 → data/item_shop.json
python fetch_items_meta.py      # 装备描述 + 机制标签 → data/items_meta.json
python fetch_hero_abilities.py  # 英雄技能 / 驱散汇总 → data/hero_abilities.json
python fetch_ability_videos.py  # 官网技能演示 webm(限速)→ assets/ability_videos/
python item_fears.py            # 规则推导「怕的装备」→ data/hero_item_fears.json
python fetch_patches.py        # 近一年版本日志 + 详情 → data/patches.json(版本页)
python serve_relations.py       # 只读预览 http://127.0.0.1:8765(改 JSON 后刷新)

预览页带 Hash 路由#/heroes/axe/core#/items/black_king_bar#/patches/7.41#/patches = 最新);英雄页的定位标签筛选与搜索框也进 URL(?tags=核心&q=axe)。刷新保状态、可分享 / 深度链接、浏览器前进后退还原。python export_relations_site.py 导出的静态站点同样支持深度链接(可部署 GitHub Pages)。

仿局内选将四列网格(图标来自 dota2.com/heroes 竖版裁切):点英雄高亮克制 / 被克制 / 搭档,下方显示定位,并以标签页切换 技能(可点选魔晶/神杖升级与天赋树)、核心装备被克装备版本变更(该英雄近一年各版本改动)。 英雄页上方网格固定高度;点选技能 / 核心装备 / 被克装备后,详情显示在下方(装备含合成,非弹窗)。

顶部另有 物品 页:对齐 官网商店物品11 列竖排(基础分类 5 列 + 合成分类 6 列),点选后详情显示在右侧(含合成组件)。目录来自 data/item_shop.jsonpython fetch_item_shop.py)。 顶部另有 版本 页:默认展示最新版本完整改动(综合 / 物品 / 中立物品 / 英雄),下拉切换近一年其它版本;数据来自 data/patches.jsonpython fetch_patches.py,近一年窗口可用 --days / --since 调)。 数据在 data/relations.json(英雄关系,不用胜率);选将 Top-3 推荐读同一份文件。热门装备来自 OpenDota 统计;被克装备由描述标签 + 规则推导(可改 data/item_tag_overrides.json 后重跑 fetch_items_meta.pyitem_fears.py)。尚无对局内出装推荐

快速开始(GSI 自动跟踪)

python gsi_setup.py             # 写入 Dota GSI 配置
# Steam → Dota 2 → 属性 → 启动项加上 -gamestateintegration,重启游戏
python gsi_watch.py

进入英雄选择后自动跟踪;定位匹配下会按本局分路 + 敌方/己方关系在英雄网格左上角标出 Top 3 青色名次方标(需 data/relations.json)。凑齐 10 人或超时后写出 results/draft_<时间戳>.json(该目录已 gitignore)。 会话截图按对局落在 samples/raw/<matchid>/;默认同时把每包 GSI JSON 追加到同目录 gsi.jsonl--no-dump-gsi 可关)。

主菜单收不到 GSI 是正常的:客户端第一次载入对局后才开始推送。看到 [gsi] connected 才算链路通。

手动流程

截图

python capture.py                # 单张 → samples/raw/
python capture.py --loop 300 3   # 每 3 秒一张,持续 300 秒

GSI 跟踪时自动写入 samples/raw/<matchid>/draft_*.png(含 milestone / best)。 需无边框窗口或窗口模式(独占全屏可能黑帧)。

标定 ROI(一次性)

python autocalibrate.py samples/raw/<matchid>/<某帧>.png
# 失败时退路:python calibrate.py samples/raw/<matchid>/<某帧>.png

识别 / 评测

python recognize.py samples/raw/<matchid>/<>.png
python recognize.py samples/raw/<matchid>/<>.png --sheet
python recognize.py samples/raw/<matchid>/<>.png --truth hero1,...,hero10
python evaluate.py              # 按 samples/labels.json 批量评测

辅助脚本:roles.py(位置字)、grid.py(禁用名单)、modes.py(模式字)。

截图要求

  • PNG、原始分辨率(勿经聊天工具压缩)
  • 顶栏 10 个英雄完整可见
  • 优先选人阶段默认脸帧(全员选完后顶栏才会换皮肤;GSI 无「皮肤已加载」信号)

已知限制

  • 宽高比差异大(如 21:9)时可能需重标定
  • 客户端改网格排序后 grid.pyok=False,不会瞎报禁用名单
  • 新英雄上线后重跑 fetch_cdn_templates.py;版本更新后重跑 fetch_patches.py
  • 位置文字模板取自简体中文客户端
  • 决策界面 3D 模型挡住顶栏时单帧会很弱,依赖会话多帧回填
  • 普通玩家 GSI 只有自己的英雄 id,不能代替读顶栏

相关项目

成熟后可移植到 dota2-hex 或独立发布。合规边界:只使用屏幕可见信息,不读内存、不注入。