识别方案怎么选
写自动化脚本,大部分时间不是花在「怎么点」,而是花在**「怎么让程序认出这个东西」**。
AScript 提供五种识别手段。它们不是互相替代的关系,而是从最快最省到最灵活排成一条梯子。 选错了不是不能用,是会付出不必要的代价——要么慢、要么贵、要么三天两头失效。
一张表看完
| 方案 | 速度 | 费用 | 前期准备 | 抗改版 | 适合什么 |
|---|---|---|---|---|---|
| 找色 | 毫秒级 | 免费 | 取色 | 弱 | 颜色独特且固定的目标 |
| 找图 | 毫秒级 | 免费 | 截模板图 | 弱 | 图标、按钮等有固定图形的目标 |
| 文字识别 | 几十毫秒 | 免费 | 无 | 中 | 有固定文字的按钮和信息 |
| YOLO | 几十毫秒 | 免费(训练另计) | 标注 + 训练 | 强 | 同一类目标的大量实例 |
| AI 万物识别 | 1~3 秒 | 按量计费 | 无 | 最强 | 只能靠语义描述的目标 |
决策顺序
从上往下问,第一个「是」就是答案。
1. 目标有独特且固定的颜色吗?
用找色。这是最快最省的方案,没有之一。
血条、进度条、状态指示灯、纯色按钮——这类目标用找色几毫秒就能定位,用别的方案都是浪费。
from ascript.android.screen import FindColors
FindColors.find("#FF3B30-101010")
2. 目标有固定的图形吗?
用找图。截一张模板图,毫秒级匹配,支持透明 PNG 和多尺度。
图标、头像框、道具图案——只要长相稳定,找图就够了。
3. 目标上有固定的文字吗?
用文字识别。内置 ML Kit 和 PP-OCR V5 双引擎,本地推理、离线可用、不计费。
「确定」「立即购买」「加载完成」这类按钮,OCR 比找图更抗改版——按钮换个颜色换个圆角,文字还在。
4. 是同一类目标的大量实例,且值得投入训练吗?
用 YOLO。端侧推理,几十毫秒,一次识别出画面里所有实例。
游戏里的怪物、地图上的资源点、列表里的商品卡片——同一类东西反复出现,找图要截几十张模板、OCR 认不出图形,YOLO 是最合适的。
代价是要标注数据、训练模型(可用 YOLO 云训练),从标注到可用通常要一到几天。目标类型稳定、脚本要长期跑,这个投入才划算。
5. 以上都不行?
用 AI 万物识别。一句话描述,返回坐标。
到这一步,说明目标没有稳定颜色、没有固定图形、没有固定文字、也不值得单独训练模型——只能靠"它是什么"来描述:
ai.find("那个红色的关闭按钮")
ai.find("列表里价格最低的那一项")
ai.click("底部的立即购买按钮")
这是唯一能理解语义的方案,也是唯一在界面改版后大概率还能用的方案。代价是单次 1~3 秒、按 Token 计费。
常见的选错
用 AI 识别做本该找图的事。 最常见,也最贵。有模板图还调 AI,等于把毫秒级免费操作换成秒级付费操作。AI 识别是兜底,不是默认。
用找图做本该 OCR 的事。 按钮文字不变但样式会调(改色、改圆角、加图标),模板图会频繁失效。有文字就优先 OCR。
为了几个目标去训练 YOLO。 标注加训练至少一天起步。目标少、或者种类经常变,直接用 AI 识别更划算——省下的时间够跑很多次推理了。
在循环里反复调 AI 识别。
每一轮都是一次完整推理和一次计费。能用 rect 缩小范围就缩小,能一次问多个就别分开问,能用快方案先筛一遍更好。
推荐的组合用法
最经济的写法不是选一个,而是「快的先上,认不出来再兜底」:
from ascript.android.screen import Ocr
from ascript.android import plug, action
plug.load("ascript_ai")
import ascript_ai as ai
r = Ocr.find("立即购买") # 毫秒级,免费
if r is None:
r = ai.find("底部的立即购买按钮") # 秒级,计费,但认得出语义
if r:
action.click(r["center_x"], r["center_y"])
Ocr.find() 和 ai.find() 返回结构完全一致(text / rect / center_x / center_y / confidence),
所以后面的代码不用分叉。
这样绝大多数情况走的是免费快路径,只有 OCR 真认不出来时才付费调用 AI—— 既保住了速度和成本,又拿到了改版后的兜底能力。
成本控制
用到 AI 万物识别 时,这三条能显著降低开销:
- 传
rect。 裁剪比降采样保真得多,图更小、更快、更省钱,而且返回的仍是完整屏幕坐标。 - 复用截图。 同一画面要问多件事,自己截一次传
image=,别让每次调用都重新截屏。 - 调低
image_tokens。 大目标用 512 就够,不必默认的 1024。但优先试rect——同样是省 token,裁剪保真,降采样变糊。