Autox.js 中文文档 下载 App

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:识别出来的文字乱码、缺字

可能原因:

  1. 语言模型不对:中文页面用了英文模型。检查 lang 参数
  2. 字体太小:用 images.zoom() 放大后再 OCR
  3. 背景太复杂:文字和背景对比低,先截图看看清晰度

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);