autoX使用Paddle OCR(百度飞浆)初体验,应用没有节点怎么办

Paddle OCR的介绍

特点

Paddle是一种免费的,开源的,轻量级的ocr识别平台,支持中英文识别。
autoX提供了Paddle的ocr识别插件,可以快速的进行图片上的文本识别。

OCR的发展与面临的困难

OCR (Optical Character Recognition) 是一种以自动识别图像中的文本为目标的技术,其研究历史悠久,应用范围广泛,如文件电子化、身份认证、数字金融系统、车牌识别等。

此外,在工厂中,通过自动提取产品的文本信息,可以更方便地管理产品。学生的线下作业或试卷可以通OCR 系统电子化,使师生之间的交流更加高效。OCR 还可以用于标记街景图像的兴趣点 (POI),提高 地图制作效率。丰富的应用场景赋予了 OCR 技术巨大的 商业价值,同时也带来了很多挑战。

图像中的文本大致可分为两类:场景文本和文档文本。

场景文本是指如图所示的自然场景中的文本,它通常会因为一 些因素而发生巨大的变化,如视角缩放、弯曲、混乱、字体、多语言、模糊、光照等。

文档文本在实际应用中更常见。它也有高密度、长文本等问题需要解决。同时,文档图像文本识别往往需要 对结果进行结构化,这就带来了一个新的困难任务。

在实际应用中,需要处理的图像通常是大量的,这使得高计算效率成为设计 OCR 系统的重要标准。 优先选择 CPU 而不是 GPU。

在成本方面,特别是OCR 系统需要在许多场景下的嵌入式设备上运行,比如手机,这就需要考虑模型的大小,而权衡模型大小和性能是困难的。

PaddleOCR的推出

Paddle提出一种实用的超轻量级 OCR 系统,命名为 PP- OCR,该系统由文本检测、检测框校正和文本识别三部分组成。

PP-OCR算法被开发者广泛应用,短短半年时间, 累计Star数量已超过15k ,频频登上Github Trending和Paperswithcode 日榜月榜第一, 称它为 OCR方向目前最火的repo 绝对不为过。

其具有多方面的优势:

在 PaddleOCR 识别中,会依次完成三种任务:检测、方向分类及文本识别;

关于预训练权重,PaddleOCR 官网根据提供权重文件大小分为两类:轻量型和服务器部署;

支持多语言识别,目前能够支持 80 多种语言;

提供有丰富的 OCR 领域相关工具供我们使用,方便我们制作自己的数据集、用于训练;

OCR初体验

autoX的示例代码中,提供了3个案例。
但是代码量比较大,有一些冗余代码,不利于初步接触时的学习和理解。
飞云在这里,编写和测试了一些极简的代码,并提供一个识别和点击的封装。

第一步:请求截图权限,自动处理弹窗


/**
请求截图权限,自动处理提示(一个程序里只允许启动一次)
@version  20191126
@author   飞云<283054503@qq.com> 
@return   Boolean 是否执行成功
*/
function requestScreenshot() {
    let result = false;
    let thread = threads.start(function () {
        let i = 0;
        while (i < 5) {
            clickNodeEx("text", "立即开始");
            i++;
        }
    });
    //请求截图
    if (!requestScreenCapture()) {
        toast("请求截图失败");
    } else {
        result = true;
        thread.interrupt(); 
    };
    return result;
};

第二步:进行ocr识别

let img = captureScreen();
if (img) {
    let start = new Date()
    let result = paddle.ocr(img);
    log('OCR识别耗时:' + (new Date() - start) + 'ms')

    if (result && result.length > 0) {
        for (let i = 0; i < result.length; i++) {
            let ocrResult = result[i]
            log("文本:" + ocrResult.words, "相似度:" + ocrResult.confidence.toFixed(2), "范围:" + ocrResult.bounds, "左边:" + ocrResult.bounds.left, "顶边:" + ocrResult.bounds.top, "右边:" + ocrResult.bounds.right, "底边:" + ocrResult.bounds.bottom)
        }
    }

    // 回收图片
    img.recycle();
} else {
    log("截图失败");
}

测试小米手机桌面截图识别,测试图片如下

file

测试结果如下:

16:52:21.748/V: 开始运行[[remote]test.js]
16:52:24.561/D: 文本::0/ 信度:0.82 范围:Rect(9, 7 - 81, 30) 左边:9 顶边:7 右边:81 底边:30
16:52:24.563/D: 文本:YV:0.0 信度:0.82 范围:Rect(607, 2 - 701, 33) 左边:607 顶边:2 右边:701 底边:33
16:52:24.565/D: 文本:16:52 信度:0.94 范围:Rect(50, 152 - 368, 289) 左边:50 顶边:152 右边:368 底边:289
16:52:24.567/D: 文本:2月14日周二 信度:0.99 范围:Rect(65, 289 - 260, 339) 左边:65 顶边:289 右边:260 底边:339
16:52:24.569/D: 文本:阴×11°C 信度:0.80 范围:Rect(879, 287 - 1017, 339) 左边:879 顶边:287 右边:1017 底边:339
16:52:24.571/D: 文本:mI 信度:0.52 范围:Rect(125, 798 - 195, 847) 左边:125 顶边:798 右边:195 底边:847
16:52:24.573/D: 文本:S 信度:0.10 范围:Rect(354, 764 - 465, 833) 左边:354 顶边:764 右边:465 底边:833
16:52:24.575/D: 文本:应用商店 信度:1.00 范围:Rect(89, 907 - 231, 945) 左边:89 顶边:907 右边:231 底边:945
16:52:24.577/D: 文本:设置 信度:1.00 范围:Rect(376, 904 - 453, 942) 左边:376 顶边:904 右边:453 底边:942
16:52:24.579/D: 文本:抖音 信度:0.97 范围:Rect(629, 904 - 703, 945) 左边:629 顶边:904 右边:703 底边:945
16:52:24.581/D: 文本:切换分身 信度:1.00 范围:Rect(848, 902 - 995, 947) 左边:848 顶边:902 右边:995 底边:947
16:52:24.583/D: 文本:6D 信度:0.21 范围:Rect(0, 1037 - 241, 1173) 左边:0 顶边:1037 右边:241 底边:1173
16:52:24.585/D: 文本:C 信度:0.85 范围:Rect(650, 1097 - 677, 1113) 左边:650 顶边:1097 右边:677 底边:1113
16:52:24.587/D: 文本:3 信度:0.22 范围:Rect(593, 1132 - 648, 1173) 左边:593 顶边:1132 右边:648 底边:1173
16:52:24.589/D: 文本:MCloud 信度:0.94 范围:Rect(89, 1197 - 231, 1235) 左边:89 顶边:1197 右边:231 底边:1235
16:52:24.591/D: 文本:微信 信度:1.00 范围:Rect(373, 1197 - 453, 1237) 左边:373 顶边:1197 右边:453 底边:1237
16:52:24.593/D: 文本:微信 信度:1.00 范围:Rect(626, 1194 - 708, 1242) 左边:626 顶边:1194 右边:708 底边:1242
16:52:24.595/D: 文本:QQ 信度:0.96 范围:Rect(891, 1201 - 952, 1232) 左边:891 顶边:1201 右边:952 底边:1232
16:52:24.597/D: 文本:0 信度:0.59 范围:Rect(142, 1353 - 197, 1377) 左边:142 顶边:1353 右边:197 底边:1377
16:52:24.599/D: 文本:V 信度:0.67 范围:Rect(118, 1408 - 180, 1439) 左边:118 顶边:1408 右边:180 底边:1439
16:52:24.601/D: 文本:快手 信度:1.00 范围:Rect(115, 1482 - 202, 1529) 左边:115 顶边:1482 右边:202 底边:1529
16:52:24.603/D: 文本:Autox.js×v6 信度:0.91 范围:Rect(313, 1482 - 513, 1531) 左边:313 顶边:1482 右边:513 底边:1531
16:52:24.604/D: 文本:AutoJsPro 信度:0.99 范围:Rect(573, 1479 - 754, 1529) 左边:573 顶边:1479 右边:754 底边:1529
16:52:24.607/D: 文本:三 信度:0.28 范围:Rect(298, 2196 - 335, 2237) 左边:298 顶边:2196 右边:335 底边:2237
16:52:24.609/D: 文本:8 信度:0.21 范围:Rect(525, 2204 - 556, 2227) 左边:525 顶边:2204 右边:556 底边:2227
16:52:24.610/D: OCR识别耗时:1580ms
16:52:24.612/V: 
 ------------ 
 [ [remote]test.js ]运行结束,用时2.862000秒

可以看到,识别中文的准确度,还是不错的。

封装ocr识别和点击函数

根据上述的测试代码,封装一个公共函数。


log(clickCharEx_paddle("应用", true,0, true));

/**
OCR识图并点击(paddle)
@version  20230214
@author   飞云<283054503@qq.com> 
*/
function clickCharEx_paddle(content, isDimFind, index, isClick, offsetX, offsetY, milliSecond) {
    // 该函数的参数解释,见本文附件

    if (!milliSecond) { milliSecond = 1000 };
    if (!index) { index = 0 };
    if (!offsetX) { offsetX = 0 };
    if (!offsetY) { offsetY = 0 };
    let result = false;

    let img = captureScreen();
    if (img) {
        // let start = new Date();
        let res = paddle.ocr(img);
        // log('OCR识别耗时:' + (new Date() - start) + 'ms');
        if (res && res.length > 0) {
            for (let i = 0; i < res.length; i++) {
                let ocrResult = res[i];
                // log(ocrResult);

                if (isDimFind && ocrResult.words.indexOf(content) != -1) {
                    // log("模糊找到");
                    result = true;
                } else if (content === ocrResult.words) {
                    // log("精确找到");
                    result = true;
                } else {

                }

                if (result) {
                    if (isClick) {
                        click(ocrResult.bounds.left + parseInt((ocrResult.bounds.right - ocrResult.bounds.left) / 2) + offsetX, ocrResult.bounds.top + parseInt((ocrResult.bounds.bottom - ocrResult.bounds.top) / 2) + offsetY);
                    }

                    break;
                }
            }
        }

        img.recycle();  // 回收图片
    } else {
        // log("截图失败");
    }

    if (result) {
        sleep(milliSecond);
    };
    return result;
};

ocr识别应用场景

autoX的强项,是节点识别。
如果应用能用节点操作,就优先使用节点操作。
ocr识别的准确度,和速度,都比节点要逊色。
但是有一些app,比如游戏等,由于界面不是xml绘制的,不存在节点。
操作这些应用的自动化测试,就需要借助ocr识别来进行了。

完整代码

关于本文的完整js代码,可以购买文章的附件。
代码中,提供了重要位置的注释,以及ocr识别函数的标准化参数释义,供初学者学习。

1. 官方交流QQ群,添加多个不批。建议使用安卓手机或电脑申请。
飞云脚本圈: 586333520飞云脚本圈
Auto.js学习交流③群:286635606
Auto.js学习交流②群:712194666(满员)
IOS免越狱自动化测试群:691997586
2. 盗版,破解有损他人权益和违法作为,请各位会员支持正版。
3. 本站部分资源来源于用户上传和网络搜集,如有侵权请提供版权证明并联系站长删除。
4.如未特别申明,本站的技术性文章均为原创,未经授权,禁止转载/搬运等侵权行为。
5.全站所有付费服务均为虚拟商品,购买后自动发货。售出后概不接受任何理由的退、换。注册即为接受此条款。
6.如果站内内容侵犯了您的权益,请联系站长删除。
飞云脚本 » autoX使用Paddle OCR(百度飞浆)初体验,应用没有节点怎么办

企业级大数据智能营销管理系统

了解详情