Autox.js OCR 进阶 批量识别 区域限定 多模型切换与常见问题
OCR 速度慢、准确率低?优化在这里
PaddleOCR 虽然好用,但手机端跑深度学习模型本身就有资源瓶颈。以下是几个实战中总结的优化方向。
限定识别区域——提速最有效的一招
OCR 引擎对整张屏幕做文字检测和识别非常耗时。如果你的目标只是屏幕下半部分的按钮文字:
// 慢:整张屏幕
let all = paddle.ocr(img);
// 快 3~5 倍:只识别目标区域
let region = [0, device.height * 0.6, device.width, device.height * 0.4];
let partial = paddle.ocr(img, { region: region });
经验值:识别区域越小,速度越快。一张 1080x2400 的屏幕,识别下半部分比整张屏快 3~4 倍。
CPU 线程与性能模式
initOcr 时可以指定性能参数:
paddle.initOcr({
cpuThreadNum: 4, // 线程数:4 或 8 比较合适
cpuPowerMode: 2 // 0=低功耗 1=均衡 2=高性能
});
| 模式 | 功耗 | 速度 | 适合 |
|---|---|---|---|
| 低功耗 | 低 | 慢 | 后台运行、电池紧张时 |
| 均衡 | 中 | 中 | 日常使用 |
| 高性能 | 高 | 快 | 快速识别、批量处理 |
图片预处理:zoom 放大
PaddleOCR 对小号字体的识别准确率一般。一个小技巧是在 OCR 之前先放大图片:
let img = captureScreen();
// 放大 2 倍
let zoomed = images.zoom(img, 2.0);
let texts = paddle.ocr(zoomed);
// 注意:bounds 返回的是放大后的坐标,要除以 zoom 倍数
texts.forEach(t => {
let realBounds = t.bounds.map(p => ({ x: p.x / 2, y: p.y / 2 }));
console.log(t.text, realBounds);
});
zoomed.recycle();
img.recycle();
批量识别循环中的资源管理
在 setInterval 或 while 循环里重复 OCR 时,不要反复 init/release 模型:
// 正确:循环外 init 一次
paddle.initOcr();
setInterval(() => {
let img = captureScreen();
let texts = paddle.ocr(img);
// ...处理...
img.recycle();
// 不要在循环里 initOcr 或 release
}, 2000);
// 脚本结束时才释放
paddle.release();
反复 init/release 会导致模型加载卸载的重复开销,而且可能触发内存碎片。
释放时机
| 时机 | 操作 |
|---|---|
| 脚本结束前 | paddle.release() |
| 长时间(>10 分钟)不用 | paddle.releaseDelayed(300000) 延迟 5 分钟释放 |
| 切换模型之前 | 必须先 release 旧模型 |
常见问题排查
Q1:第一次 OCR 特别慢(5~10 秒)
正常现象。PaddleOCR 模型首次加载需要从磁盘读入、初始化推理引擎。第二次以后会快很多,通常 1~2 秒以内。
Q2:识别出来的文字乱码、缺字
可能原因:
- 语言模型不对:中文页面用了英文模型。检查
lang参数 - 字体太小:用
images.zoom()放大后再 OCR - 背景太复杂:文字和背景对比低,先截图看看清晰度
Q3:OCR 导致脚本卡顿
OCR 是 CPU 密集型操作,会卡主线程。可以用 threads 模块把 OCR 丢到后台线程:
let result;
threads.start(function () {
result = paddle.ocr(captureScreen());
threads.exit(); // 完成后退出线程
});
threads.join(); // 主线程等后台线程完成
// result 里就有识别结果了
Q4:PaddleOCR 模型文件在哪里
默认模型内置在 App 里,解压路径在 /data/data/org.autojs.autoxjs.v7/files/ 下。如果要换自定义模型,把模型文件放到外部存储,然后在 initOcr({ modelPath: "..." }) 里指定。
Q5:v7.2.3 之前的 v2 模型参数
v7.2.3 移除了旧版 v2 模型支持。旧代码里的 paddle.init(["ch_ppocr_mobile_v2.0_rec_infer"]) 写法会报错。需要改成新的 paddle.initOcr() 或 paddle.initOcrWithConfig()。
模型配置检查
如果不确定当前 OCR 引擎的配置:
let config = paddle.getOcrConfig();
console.log("当前配置:" + JSON.stringify(config, null, 2));
这能帮你确认模型路径、线程数、性能模式等参数是否正确。
实战:识别后自动执行操作
console.show();
paddle.initOcr();
const ACTIONS = {
"确认": () => text("确认").findOne(3000)?.click() || console.log("找不到确认按钮"),
"取消": () => back(),
"允许": () => text("允许").findOne(3000)?.click(),
"搜索": () => console.log("需要搜索"),
};
setInterval(() => {
let img = captureScreen();
let results = paddle.ocr(img);
for (let r of results) {
let handler = ACTIONS[r.text];
if (handler) {
console.log("匹配到:" + r.text);
handler();
sleep(500);
break;
}
}
img.recycle();
}, 3000);