跳到主要内容

识别方案怎么选

写自动化脚本,大部分时间不是花在「怎么点」,而是花在**「怎么让程序认出这个东西」**。

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 万物识别 时,这三条能显著降低开销:

  1. rect 裁剪比降采样保真得多,图更小、更快、更省钱,而且返回的仍是完整屏幕坐标。
  2. 复用截图。 同一画面要问多件事,自己截一次传 image=,别让每次调用都重新截屏。
  3. 调低 image_tokens 大目标用 512 就够,不必默认的 1024。但优先试 rect——同样是省 token,裁剪保真,降采样变糊。