Giter Club home page Giter Club logo

paddleocr4android's Introduction

简介

该库是使用 fastDeploy 部署在安卓端使用 PaddleOCR 的二次封装库。

对于只想体验或者快速上手使用的安卓开发者,该库对其进行了简单的封装,使其可以直接上手使用,而无需关心 PaddleOCR 的实现,亦无需进行繁琐的配置。

基于 fastDeploy 部署

截图:

截图

注意

本库基于 fastDeploy 部署,同时支持 Paddle 原始模型和量化模型(.pdmodel、pdiparams),并且支持 PPOCRv2 和 PPOCRv3。

但是使用本库可能会大幅增加安装包体积,如果对安装包体积敏感,推荐使用 Paddle-Lite 部署,但是使用 Paddle-Lite 部署将只支持 OPT 后的模型(.nb),并且目前尚未支持 PPOCRv3。

使用方法

因为 Paddle 模型比较大,所以没有集成模型到 demo (fastdeploydemo)中,如果想要运行 demo,您需要自行下载模型后放入 ./fastdeploydemo/src/main/assets 中:

截图

将模型放入后运行即可。

如需集成至您自己的项目中,请按下述步骤进行:

1.下载依赖

首先,根据你使用的 Gradle 版本在项目级 build.gradlesettings.gradle 文件添加 jitpack 远程仓库:

allprojects {
	repositories {
		...
		maven { url 'https://jitpack.io' }
	}
}

然后在 Module 级 build.gradle 文件添加依赖:

dependencies {
    implementation 'com.github.equationl.paddleocr4android:fastdeplyocr:v1.2.6'
    
}

2.下载模型

模型下载地址: PP-OCR系列模型列表

当然,你也可以使用自己训练的模型。

需要注意的是,文本检测、文本识别、文本方向分类 模型各有两个文件:*.pdmodel、*.pdiparams

请将下载好的三个模型,六个文件:

xx_cls.pdmodel
xx_cls.pdiparams
xx_det.pdmodel
xx_det.pdiparams
xx_rec.pdmodel
xx_rec.pdiparams

放置到手机任意目录或项目的 assets 目录下。

三个模型分别为:

文件名 模型名称 说明
xx_cls.pdmodel、xx_cls.pdiparams 文本方向分类模型 用于文本方向分类
xx_det.pdmodel、xx_det.pdiparams 检测模型 用于检测文本位置
xx_rec.pdmodel、xx_rec.pdiparams 识别模型 用于识别文本内容

建议测试时直接放到 assets 中,避免放到手机目录中时由于权限问题而无法读取模型

由于模型文件较大,正式使用时请自行实现模型的下载,建议不要直接将模型放在 assets 中打包进安装包

3.加载模型

// 配置
val config = OcrConfig()
//config.labelPath = null


config.modelPath = "models" // 不使用 "/" 开头的路径表示安装包中 assets 目录下的文件,例如当前表示 assets/models/ocr_v2_for_cpu
//config.modelPath = "/sdcard/Android/data/com.equationl.paddleocr4android.app/files/models" // 使用 "/" 表示手机储存路径,测试时请将下载的三个模型放置于该目录下
config.clsModelFileName = "cls" // cls 模型文件名
config.detModelFileName = "det" // det 模型文件名
config.recModelFileName = "rec" // rec 模型文件名

// 运行全部模型
config.runType = RunType.All

// 使用所有核心运行
config.cpuPowerMode = LitePowerMode.LITE_POWER_FULL

// 绘制文本位置
config.isDrwwTextPositionBox = true

// 如果是原始模型,则使用 FP16 精度
config.recRunPrecision = RunPrecision.LiteFp16
config.detRunPrecision = RunPrecision.LiteFp16
config.clsRunPrecision = RunPrecision.LiteFp16

// 如果是量化模型则使用 int8 精度
//config.recRunPrecision = RunPrecision.LiteInt8
//config.detRunPrecision = RunPrecision.LiteInt8
//config.clsRunPrecision = RunPrecision.LiteInt8

// 1.同步初始化
/*ocr.initModelSync(config).fold(
    {
        if (it) {
            Log.i(TAG, "onCreate: init success")
        }
    },
    {
        it.printStackTrace()
    }
)*/

// 2.异步初始化
resultText.text = "开始加载模型"
ocr.initModel(config, object : OcrInitCallback {
    override fun onSuccess() {
        resultText.text = "加载模型成功"
        Log.i(TAG, "onSuccess: 初始化成功")
    }

    override fun onFail(e: Throwable) {
        resultText.text = "加载模型失败: $e"
        Log.e(TAG, "onFail: 初始化失败", e)
    }

})

更多配置请自行查看 OcrConfig.kt

4.开始使用

            // 1.同步识别
/*val bitmap = BitmapFactory.decodeResource(resources, R.drawable.test2)
ocr.runSync(bitmap)

val bitmap2 = BitmapFactory.decodeResource(resources, R.drawable.test3)
ocr.runSync(bitmap2)*/

// 2.异步识别
resultText.text = "开始识别"
val bitmap3 = BitmapFactory.decodeResource(resources, R.drawable.test4)
ocr.run(bitmap3, object : OcrRunCallback {
    override fun onSuccess(result: OcrResult) {
        val simpleText = result.simpleText
        val imgWithBox = result.imgWithBox
        val inferenceTime = result.inferenceTime
        val outputRawResult = result.outputRawResult

        var text = "识别文字=\n$simpleText\n识别时间=$inferenceTime ms\n更多信息=\n"

        outputRawResult.forEachIndexed { index, ocrResultModel ->
            // 文字方向 ocrResultModel.clsLabel 可能为 "0" 或 "180"
            text += "$index: 文字方向:${ocrResultModel.cls_label};文字方向置信度:${ocrResultModel.cls_confidenceL};识别置信度 ${ocrResultModel.confidence};;文字位置:${ocrResultModel.points}\n"
        }

        resultText.text = text
        resultImg.setImageBitmap(imgWithBox)
    }

    override fun onFail(e: Throwable) {
        resultText.text = "识别失败:$e"
        Log.e(TAG, "onFail: 识别失败!", e)
    }

})

5.其他

有任何问题请先尝试 demo 或阅读源码,如果无法解决请提 issue

混淆

如果需要开启混淆,请在你的项目 proguard-rules.pro 中添加:

-keep class com.baidu.paddle.fastdeploy.** { *; }

6.问题解决

更新记录

v1.2.8

本次更新主要是优化了识别结果为空时的返回值:

  • 当识别结果为空时返回 Result.failure(NoResultException())
  • 当检测文本位置为空时 OcrResultModel.points 返回空列表
  • 当识别置信度为空时 OcrResultModel.confidence 返回 -1f
  • 当方向检测为空时 OcrResultModel.cls_labelc 返回 -1
  • 当方向检测置信度为空时 OcrResultModel.cls_confidenceL 返回 -1f

v1.2.7

  • 移除无用依赖

v1.2.6

  • 更改返回结果中 outputRawResult.cls_label 为 "0" 或 "180",分别表示检测到当前文本为 0° 或 180°
  • 返回结果新增一个 rawOCRResult 表示 fastDeploy 返回的原始识别结果
  • 修复运行模式为 RunType.WithDet 时也会检查 cls 模型的错误

paddleocr4android's People

Contributors

equationl avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

paddleocr4android's Issues

v1.2.6 导入包下载不下来

* What went wrong:
Execution failed for task ':app:mergeDebugNativeLibs'.
> Could not resolve all files for configuration ':app:debugRuntimeClasspath'.
   > Failed to transform fastdeplyocr-v1.2.6.aar (com.github.equationl.paddleocr4android:fastdeplyocr:v1.2.6) to match attributes {artifactType=android-jni, org.gradle.category=library, org.gradle.dependency.bundling=external, org.gradle.libraryelements=aar, org.gradle.status=release, org.gradle.usage=java-runtime}.
      > Could not find fastdeplyocr-v1.2.6.aar (com.github.equationl.paddleocr4android:fastdeplyocr:v1.2.6).
        Searched in the following locations:
            https://jitpack.io/com/github/equationl/paddleocr4android/fastdeplyocr/v1.2.6/fastdeplyocr-v1.2.6.aar

为什么我的识别正确率比你的差好远

我直接运行,识别效果和你的差好远,这是什么原因?
Screenshot_2022-10-19-16-10-39-881_com equationl paddleocr4android app
另外,我看paddle ocr现在有v3模型了,但是我下载模型文件运行报错,就是你提到的问题6,我下载了paddle lite2.11 的so文件替换了跑不起来,请问具体要怎么做呢?

ch_ppocr_server_v2.0_rec

你好,我想问一下ch_ppocr_server_v2.0_rec和ch_PP-OCRv3_rec哪个效果更好点。

如果ch_ppocr_server_v2.0_rec更好,请问是否可以配置,我不在乎安装包的大小和速度如何。

仓库文件失效!

您好!您在 jitpack.io 上的仓库 equationl/paddleocr4android 中,v1.1.1 Tag 的文件失效,无法获取,仅 v1.1.1-OpenCL Tag 库文件可用, v1.1.0 不受影响

识别速度在不同线程表现

你好作者我想问下关于识别速度为什么差别很大,在HandlerThread里使用 设置的 Process.THREAD_PRIORITY_URGENT_AUDIO 最高权限
在识别空白图片时很快到了有文字图片就变很慢,但是在OnChecke里面又稍微快一点,这个是什么问题导致呢

加载模型的时候报错

加载模型的时候报错E/paddle: onFaildlopen failed: cannot locate symbol "__emutls_get_address" referenced by "/data/app/~~vUQmPS6cgjFaV3KC29OdGQ==/car.bkrc.com.car2022-xjIkcZuxy6z3jSDntEFL7A==/base.apk!/lib/armeabi-v7a/libpaddle_full_api_shared.so"...这是什么问题呢

对于 ”包含 OpenCL 预测库的依赖 "这个问题不大明白。

关于

6.问题解决
提示 Error: This model is not supported, because kernel for 'io_copy' is not supported by Paddle-Lite.
该提示表示您使用的模型需要 OpenCL 预测库支持。解决办法:

使用包含 OpenCL 预测库的依赖。


以上错误的出现 是因为下载的 nb 模型库不对吗,感觉因为默认的那几个模型比较精简,所以导致识别效果一般,我在更换模型文件后就出现了这个错误。

关于模型离线部署加密问题

博主, 请教下您, 我使用该工程 部署到安卓机上后, 想实现对模型文件加密后, 进行预测加载OCR模型, 这块您有了解不

混淆问题

混淆后,初始化的时候直接闪退怎么回事

请教一下,README里演示图用的哪些模型?

请教一下,你README里演示图用的哪些模型?因为我试了所有官方模型组合,用来识别你源码中带的那张图,效果全都没你截图里那么好。最难以置信的是所有det模型都无法像你演示截图里一样把3句话全部完整分成3个部分。

关于测试的图片如何更换问题

请教下博主, 我想更换测试照片, 是在哪块进行更改呢,包括更换图片的名字, 批量读取图片进行识别, 或者 实时访问摄像头参数点击拍照进行识别这块的控制程序;

和OpenCV的版本不兼容

之前我集成过OpenCV的库,在集成paddleocr4android的时候,出现了下面的报错:
`2 files found with path 'lib/arm64-v8a/libc++_shared.so' from inputs:

  • /Users/lee/.gradle/caches/transforms-3/66b319963f01fd390fd0dcf81960c5a1/transformed/jetified-fastdeplyocr-1.2.8/jni/arm64-v8a/libc++_shared.so
  • /Users/lee/.gradle/caches/transforms-3/1e39377269f3187c28605b26bd78a7ad/transformed/jetified-Tiny-OpenCV-4.4.0-4/jni/arm64-v8a/libc++_shared.so
    If you are using jniLibs and CMake IMPORTED targets, see`
    能麻烦看看,有什么好的解决方案么?
image

催更啦

很抱歉打扰一下您,目前Paddle Lite已经更新到了2.12版本,Paddle OCR的模型也更新到了v3,很多像俺这样的安卓程序员不会C++,跪求作者更新!!!

模型初始化时出现问题,OcrInitCallback()没有执行

上一次模型文件复制的问题,我通过手动复制到手机中解决,但是在模型初始化时又出现了新的问题,模型开始识别时,app闪退,报错提示

FATAL EXCEPTION: DefaultDispatcher-worker-3
Process: com.equipmentnameplateocr, PID: 31025
kotlin.UninitializedPropertyAccessException: lateinit property predictor has not been initialized
        at com.equationl.fastdeployocr.OCR.runSync-IoAF18A(OCR.kt:124)
        at com.equationl.fastdeployocr.OCR$run$1.invokeSuspend(OCR.kt:141)
        at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
        at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106)
        at kotlinx.coroutines.internal.LimitedDispatcher.run(LimitedDispatcher.kt:42)
        at kotlinx.coroutines.scheduling.TaskImpl.run(Tasks.kt:95)
        at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:570)
        at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:749)
        at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:677)
        at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:664)
        Suppressed: kotlinx.coroutines.DiagnosticCoroutineContextException: [StandaloneCoroutine{Cancelling}@dd9605a, Dispatchers.IO]

代码如下:

       public void ppocr(String imagePath){
        //String path = mContext.getCacheDir().getPath();
        String path = mContext.getExternalCacheDir() + "/OCRModels/";
        Log.d("debug", "mypath"+path);
        // 手动复制模型文件
        copyAssetFileToDirectory("models/rec.pdiparams",path);
        copyAssetFileToDirectory("models/rec.pdmodel",path);
        copyAssetFileToDirectory("models/ppocr_keys_v1.txt",path);
        ocr = new OCR(mContext);
        OcrConfig config = new OcrConfig();
        
        //config.setModelPath("../../../assets/models");
        config.setModelPath("models");
        config.setClsModelFileName("cls");
        config.setRecModelFileName("rec");
        config.setDetModelFileName("det");
        // 运行全部模型
        config.setRunType(RunType.All);
        // 使用所有核心运行
        config.setCpuPowerMode(LitePowerMode.LITE_POWER_FULL);
        // 绘制文本位置
        config.setDrwwTextPositionBox(true);
        // 如果是原始模型,则使用 FP16 精度
        config.setRecRunPrecision(RunPrecision.LiteFp16);
        config.setDetRunPrecision(RunPrecision.LiteFp16);
        config.setClsRunPrecision(RunPrecision.LiteFp16);
        Log.d("debug", "开始初始化v3");
        //Log.d("debug", "model path"+imagePath);
        ocr.initModel(config, new OcrInitCallback() {
            @Override
            public void onSuccess() {
                Log.d("debug", "onSuccess: 初始化成功");
            }

            @Override
            public void onFail(Throwable e) {
                Log.d("debug", "onFail: 初始化失败", e);
            }
        });

        try {
            Log.d("debug", "v3 imagePath: "+imagePath);
            File file = new File(imagePath);
            if (file.exists()) {
                Bitmap bitmap3 = BitmapFactory.decodeFile(imagePath);
                Log.d("debug", "v3开始识别");
                ocr.run(bitmap3, new OcrRunCallback() {
                    @Override
                    public void onSuccess(OcrResult result) {
                        String simpleText = result.getSimpleText();
                        Bitmap imgWithBox = result.getImgWithBox();
                        long inferenceTime = result.getInferenceTime();
                        ArrayList<OcrResultModel> outputRawResult = result.getOutputRawResult();
                
                        String text = "识别文字=\n" + simpleText + "\n识别时间=" + inferenceTime + " ms\n更多信息=\n";
                        Log.d("debug", "v3结果:"+text);
                    }
                    @Override
                    public void onFail(Throwable e) {
                        Log.d("debug", "onFail: 识别失败!", e);
                    }
                });
            } else {
                //promise.reject("debug", "Image file not found.");
                Log.d("debug", "Image file not found.");
            }
        } catch (Exception e) {
            //promise.reject("debug", e);
            Log.d("debug", "v3失败");
        }

        ocr.releaseModel();
        Log.d("debug", "onSuccess: 模型释放成功v3");
        
    }

怀疑是模型初始化出现问题,因为模型初始化时,OcrInitCallback()似乎并没有执行,没有提示成功或失败的信息

导包之后不能获取到OcrConfig

implementation("com.github.equationl.paddleocr4android:fastdeplyocr:v1.2.8") maven(url = "https://jitpack.io")
这两个都添加了
然而并不能获取到OcrConfig,并且一直到版本v1.1.1也不行

模型文件复制至手机cache文件夹中不完整

当我使用java引用该库时,

` OcrConfig config = new OcrConfig();

    config.setModelPath("models");
    config.setClsModelFileName("cls");
    config.setDetModelFileName("det");
    config.setRecModelFileName("rec");`

使用以上代码初始化时,手机 android/data/应用/cache/OCRModels文件夹中只有cls,det的四个模型文件,rec的两个模型文件未复制至该文件夹中

六个模型文件放于assets/models/中

请求更新至最新的paddleocr2.5

如题,paddleocr已经发布了最新的2.5 release版本,并且paddle light也更新至了2.10,希望可以早日更新上,用之前的2.9 light是不能直接使用最新的2.5的ocr模型的。
万分感谢,这个项目对我帮助非常大!

引入implementation 'com.github.equationl.paddleocr4android:fastdeplyocr:v1.2.5'出错

在运行时报错The minCompileSdk (33) specified in a
dependency's AAR metadata (META-INF/com/android/build/gradle/aar-metadata.properties)
is greater than this module's compileSdkVersion (android-30).
Dependency: androidx.appcompat:appcompat-resources:1.6.1.,上网查了一下是由于我使用的android-30版本与appcompat-resources:1.6.1冲突,需要降级,我把您的库fork一下,修改了build.gradle中的appcompat版本,当我使用与你相同的方法引入时(implementation 'com.github.liudapang000.paddleocr4android:fastdeplyocr:v1.2.5'liudapang000是我的用户名)却提示Could not find com.github.liudapang000.paddleocr4android:fastdeplyocr:v1.2.5.,为什么就无法找到我创建的库,我需要修改什么地方吗?请指导谢谢!

識別結果只能顯示一部分

基於paddle-lite識別:
1.由於頁面限制,一部分識別結果被裁掉了,無法顯示出來,這個怎么解決呢。
2.不知道什麽原因,中文識別的文字,前後兩句話的順序是反的。

你可以暂时先在你的混淆配置文件中添加:

          你可以暂时先在你的混淆配置文件中添加:

-keep class com.baidu.paddle.fastdeploy.** { *; }

Originally posted by @equationl in #21 (comment)

已经搞好了,但是又有个新问题。models里面我看有个文件,

ArchivePathEntry: pathPrefix="", path="/assets/models/ppocr_keys_v1.txt"

这个文件有详细的解释吗?我自定义了一个并ocrConfig.setLabelPath设置了他的路径

但是他好像不能使用

image

识别出现了很奇怪的错误

当我载入模型时,都会提示载入成功,但是对同一张图片,有时候会识别不一样的结果,例如我上传了一个社会主义核心价值的图片,第一次开启程序 会识别成其它乱七八糟的文字,但是重新打开程序,第二次可能就正常了,当然,我说的第二次是在举一个例子,有时候要重复开启多次程序才行,只要成功一次,只要不关闭程序不管换什么图片都是正确的。这是什么原因?

关于释放资源

按道理来讲这种有加载资源的过程,那么应该也有释放资源的过程,这个不需要吗,不会造成内存泄漏问题吗

使用v3模型推理时程序崩溃

我使用了官方下载页面中的
ch_PP-OCRv3_rec_slim_infer
加载模型等都正常,识别时看日志det等模型运行也没问题,只是在最后执行推理的时候,就报错并且程序直接崩溃退出,我使用的是最新的
v1.1.1-OpenCL
初始化配置时就只是指定了模型路径,其他并未做什么改动,并且也尝试将isUseOpencl设置成true,但问题一样。
如果使用demo中的v2模型,那是没有问题的,我使用的是小米12,android12,这是崩溃时的日志:
I/OCR_NDK (30583): ocr cpp infer Run start 991008
F/libc (30583): Fatal signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x55be70b922dec4 in tid 31187 (DefaultDispatch), pid 30583 (com.ocrtest.demo)


Build fingerprint: 'Xiaomi/cupid/cupid:12/SKQ1.211006.001/V13.0.25.0.SLCCNXM:user/release-keys'
Revision: '0'
ABI: 'arm64'
Timestamp: 2022-05-22 20:42:57.253922415+0800
Process uptime: 0s
Cmdline: com.ocrtest.demo
pid: 30583, tid: 31187, name: DefaultDispatch >>> com.ocrtest.demo <<<
uid: 10392
tagged_addr_ctrl: 0000000000000001
signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x55be70b922dec4
x0 00000000d2801168 x1 0055be70b922dec4 x2 0000006ed9956700 x3 0055be70b922dec3
x4 0000006eea9a4d48 x5 0000006eea9a4cb8 x6 0000006edfc752e0 x7 0000006edfc75000
x8 0000000000000000 x9 0000000000000001 x10 0000000000004001 x11 0000000000000000
x12 0000000000000000 x13 ffffffffffffffff x14 0000000000000001 x15 0001000000000000
x16 00000071449c8170 x17 00000071676654d0 x18 00000000000000a5 x19 0000006ed9957010
x20 0000006ed9956c50 x21 0000000000000000 x22 0000006ed9957010 x23 0000006ed9957960
x24 0000006ed9957a50 x25 0000006ed9959000 x26 00000000000000ad x27 0000006ed9959000
x28 0000006ed9957cf0 x29 0000006ed9956730
lr 0000006eea70d160 sp 0000006ed9956730 pc 0000006eea70d174 pst 0000000080001000
backtrace:
#00 pc 0000000000489174 /data/app/~~PjHS3M3WEerJ2md1d08IoQ==/com.ocrtest.demo-v75QKxqHGKtITD4LhLIUmw==/lib/arm64/libpaddle_light_api_shared.so (BuildId: f9edc7993c1c57d2d4608783d535ae69214fc6fe)
#1 pc 000000000048a11c /data/app/~~PjHS3M3WEerJ2md1d08IoQ==/com.ocrtest.demo-v75QKxqHGKtITD4LhLIUmw==/lib/arm64/libpaddle_light_api_shared.so (BuildId: f9edc7993c1c57d2d4608783d535ae69214fc6fe)
#2 pc 000000000040ed58 /data/app/~~PjHS3M3WEerJ2md1d08IoQ==/com.ocrtest.demo-v75QKxqHGKtITD4LhLIUmw==/lib/arm64/libpaddle_light_api_shared.so (__cxa_throw+112) (BuildId: f9edc7993c1c57d2d4608783d535ae69214fc6fe)
#3 pc 0000000000318838 /data/app/~~PjHS3M3WEerJ2md1d08IoQ==/com.ocrtest.demo-v75QKxqHGKtITD4LhLIUmw==/lib/arm64/libpaddle_light_api_shared.so (BuildId: f9edc7993c1c57d2d4608783d535ae69214fc6fe)
#4 pc 0000000000315bfc /data/app/~~PjHS3M3WEerJ2md1d08IoQ==/com.ocrtest.demo-v75QKxqHGKtITD4LhLIUmw==/lib/arm64/libpaddle_light_api_shared.so (BuildId: f9edc7993c1c57d2d4608783d535ae69214fc6fe)
#5 pc 0000000000374074 /data/app/~~PjHS3M3WEerJ2md1d08IoQ==/com.ocrtest.demo-v75QKxqHGKtITD4LhLIUmw==/lib/arm64/libpaddle_light_api_shared.so (BuildId: f9edc7993c1c57d2d4608783d535ae69214fc6fe)
#6 pc 00000000003b62c0 /data/app/~~PjHS3M3WEerJ2md1d08IoQ==/com.ocrtest.demo-v75QKxqHGKtITD4LhLIUmw==/lib/arm64/libpaddle_light_api_shared.so (BuildId: f9edc7993c1c57d2d4608783d535ae69214fc6fe)
#7 pc 00000000003b6204 /data/app/~~PjHS3M3WEerJ2md1d08IoQ==/com.ocrtest.demo-v75QKxqHGKtITD4LhLIUmw==/lib/arm64/libpaddle_light_api_shared.so (paddle::lite::RuntimeProgram::Run()+52) (BuildId: f9edc7993c1c57d2d4608783d535ae69214fc6fe)
#8 pc 00000000003c3b4c /data/app/~~PjHS3M3WEerJ2md1d08IoQ==/com.ocrtest.demo-v75QKxqHGKtITD4LhLIUmw==/lib/arm64/libpaddle_light_api_shared.so (BuildId: f9edc7993c1c57d2d4608783d535ae69214fc6fe)
#9 pc 0000000000090d9c /data/app/~~PjHS3M3WEerJ2md1d08IoQ==/com.ocrtest.demo-v75QKxqHGKtITD4LhLIUmw==/lib/arm64/libNative.so (BuildId: 52d427e8dc2b4e2dde4e0369486bdeb3728a1984)
#10 pc 000000000008e3bc /data/app/~~PjHS3M3WEerJ2md1d08IoQ==/com.ocrtest.demo-v75QKxqHGKtITD4LhLIUmw==/lib/arm64/libNative.so (BuildId: 52d427e8dc2b4e2dde4e0369486bdeb3728a1984)
#11 pc 000000000008d184 /data/app/~~PjHS3M3WEerJ2md1d08IoQ==/com.ocrtest.demo-v75QKxqHGKtITD4LhLIUmw==/lib/arm64/libNative.so (BuildId: 52d427e8dc2b4e2dde4e0369486bdeb3728a1984)
#12 pc 000000000007a52c /data/app/~~PjHS3M3WEerJ2md1d08IoQ==/com.ocrtest.demo-v75QKxqHGKtITD4LhLIUmw==/lib/arm64/libNative.so (Java_com_equationl_paddleocr4android_Util_paddle_OCRPredictorNative_forward+156) (BuildId: 52d427e8dc2b4e2dde4e0369486bdeb3728a1984)
#13 pc 0000000000222244 /apex/com.android.art/lib64/libart.so (art_quick_generic_jni_trampoline+148) (BuildId: 824f7ca55f9cdc7b2f2fa3478577b69e)
#14 pc 000000000021329c /apex/com.android.art/lib64/libart.so (nterp_helper+7468) (BuildId: 824f7ca55f9cdc7b2f2fa3478577b69e)
#15 pc 000000000031a60e [anon:dalvik-classes.dex extracted in memory from /data/app/~~PjHS3M3WEerJ2md1d08IoQ==/com.ocrtest.demo-v75QKxqHGKtITD4LhLIUmw==/base.apk]
#16 pc 0000000000212bc8 /apex/com.android.art/lib64/libart.so (nterp_helper+5720) (BuildId: 824f7ca55f9cdc7b2f2fa3478577b69e)
#17 pc 000000000031ade0 [anon:dalvik-classes.dex extracted in memory from /data/app/~~PjHS3M3WEerJ2md1d08IoQ==/com.ocrtest.demo-v75QKxqHGKtITD4LhLIUmw==/base.apk]
#18 pc 00000000002124c4 /apex/com.android.art/lib64/libart.so (nterp_helper+3924) (BuildId: 824f7ca55f9cdc7b2f2fa3478577b69e)
#19 pc 00000000003194e6 [anon:dalvik-classes.dex extracted in memory from /data/app/~~PjHS3M3WEerJ2md1d08IoQ==/com.ocrtest.demo-v75QKxqHGKtITD4LhLIUmw==/base.apk]
#20 pc 00000000002124c4 /apex/com.android.art/lib64/libart.so (nterp_helper+3924) (BuildId: 824f7ca55f9cdc7b2f2fa3478577b69e)
#21 pc 000000000031958e [anon:dalvik-classes.dex extracted in memory from /data/app/~~PjHS3M3WEerJ2md1d08IoQ==/com.ocrtest.demo-v75QKxqHGKtITD4LhLIUmw==/base.apk]
#22 pc 00000000002124c4 /apex/com.android.art/lib64/libart.so (nterp_helper+3924) (BuildId: 824f7ca55f9cdc7b2f2fa3478577b69e)
#23 pc 00000000003192c2 [anon:dalvik-classes.dex extracted in memory from /data/app/~~PjHS3M3WEerJ2md1d08IoQ==/com.ocrtest.demo-v75QKxqHGKtITD4LhLIUmw==/base.apk]
#24 pc 00000000002124c4 /apex/com.android.art/lib64/libart.so (nterp_helper+3924) (BuildId: 824f7ca55f9cdc7b2f2fa3478577b69e)
#25 pc 000000000011832e [anon:dalvik-classes3.dex extracted in memory from /data/app/~~PjHS3M3WEerJ2md1d08IoQ==/com.ocrtest.demo-v75QKxqHGKtITD4LhLIUmw==/base.apk!classes3.dex]
#26 pc 0000000000213390 /apex/com.android.art/lib64/libart.so (nterp_helper+7712) (BuildId: 824f7ca55f9cdc7b2f2fa3478577b69e)
#27 pc 00000000001556fa [anon:dalvik-classes3.dex extracted in memory from /data/app/~~PjHS3M3WEerJ2md1d08IoQ==/com.ocrtest.demo-v75QKxqHGKtITD4LhLIUmw==/base.apk!classes3.dex]
#28 pc 00000000002124c4 /apex/com.android.art/lib64/libart.so (nterp_helper+3924) (BuildId: 824f7ca55f9cdc7b2f2fa3478577b69e)
#29 pc 00000000001902aa [anon:dalvik-classes3.dex extracted in memory from /data/app/~~PjHS3M3WEerJ2md1d08IoQ==/com.ocrtest.demo-v75QKxqHGKtITD4LhLIUmw==/base.apk!classes3.dex]
#30 pc 00000000002124c4 /apex/com.android.art/lib64/libart.so (nterp_helper+3924) (BuildId: 824f7ca55f9cdc7b2f2fa3478577b69e)
#31 pc 000000000018f026 [anon:dalvik-classes3.dex extracted in memory from /data/app/~~PjHS3M3WEerJ2md1d08IoQ==/com.ocrtest.demo-v75QKxqHGKtITD4LhLIUmw==/base.apk!classes3.dex]
#32 pc 00000000002124c4 /apex/com.android.art/lib64/libart.so (nterp_helper+3924) (BuildId: 824f7ca55f9cdc7b2f2fa3478577b69e)
#33 pc 000000000018f154 [anon:dalvik-classes3.dex extracted in memory from /data/app/~~PjHS3M3WEerJ2md1d08IoQ==/com.ocrtest.demo-v75QKxqHGKtITD4LhLIUmw==/base.apk!classes3.dex]
#34 pc 00000000002124c4 /apex/com.android.art/lib64/libart.so (nterp_helper+3924) (BuildId: 824f7ca55f9cdc7b2f2fa3478577b69e)
#35 pc 000000000018f104 [anon:dalvik-classes3.dex extracted in memory from /data/app/~~PjHS3M3WEerJ2md1d08IoQ==/com.ocrtest.demo-v75QKxqHGKtITD4LhLIUmw==/base.apk!classes3.dex]
#36 pc 0000000000218964 /apex/com.android.art/lib64/libart.so (art_quick_invoke_stub+548) (BuildId: 824f7ca55f9cdc7b2f2fa3478577b69e)
#37 pc 0000000000285ff0 /apex/com.android.art/lib64/libart.so (art::ArtMethod::Invoke(art::Thread*, unsigned int*, unsigned int, art::JValue*, char const*)+192) (BuildId: 824f7ca55f9cdc7b2f2fa3478577b69e)
#38 pc 000000000062dec0 /apex/com.android.art/lib64/libart.so (art::JValue art::InvokeVirtualOrInterfaceWithJValuesart::ArtMethod*(art::ScopedObjectAccessAlreadyRunnable const&, _jobject*, art::ArtMethod*, jvalue const*)+464) (BuildId: 824f7ca55f9cdc7b2f2fa3478577b69e)
#39 pc 000000000067dd9c /apex/com.android.art/lib64/libart.so (art::Thread::CreateCallback(void*)+1188) (BuildId: 824f7ca55f9cdc7b2f2fa3478577b69e)
#40 pc 00000000000f0d34 /apex/com.android.runtime/lib64/bionic/libc.so (__pthread_start(void*)+264) (BuildId: d15a6afaad4d7e44de8683bcf906a6bd)
#41 pc 000000000008d57c /apex/com.android.runtime/lib64/bionic/libc.so (__start_thread+68) (BuildId: d15a6afaad4d7e44de8683bcf906a6bd)

问个奇葩问题,clone了你代码,然后我想在androidTest自动化里面调用paddle ocr识别图片信息,发现不行?但是我看日志有运行的

代码目录结构这样子:
image

ExampleInstrumentedTest

@RunWith(AndroidJUnit4::class)
class ExampleInstrumentedTest {
    val TAG = "cfr"

    @Test
    fun useAppContext() {
        // Context of the app under test.
        val appContext = InstrumentationRegistry.getInstrumentation().targetContext
//        assertEquals("com.equationl.paddleocr4android", appContext.packageName)
        Log.i(TAG, "useAppContext: 测试成功")
        val ocr = OCR(appContext)
        val config = OcrConfig()
        config.labelPath = null

        config.modelPath = "models/ch_PP-OCRv2" // 不使用 "/" 开头的路径表示安装包中 assets 目录下的文件,例如当前表示 assets/models/ocr_v2_for_cpu
        //config.modelPath = "/sdcard/Android/data/com.equationl.paddleocr4android.app/files/models" // 使用 "/" 表示手机储存路径,测试时请将下载的三个模型放置于该目录下
        config.clsModelFilename = "cls.nb" // cls 模型文件名
        config.detModelFilename = "det_db.nb" // det 模型文件名
        config.recModelFilename = "rec_crnn.nb" // rec 模型文件名

        // 运行全部模型
        // 请根据需要配置,三项全开识别率最高;如果只开识别几乎无法正确识别,至少需要搭配检测或分类其中之一
        // 也可单独运行 检测模型 获取文本位置
        config.isRunDet = true
        config.isRunCls = true
        config.isRunRec = true

        // 使用所有核心运行
        config.cpuPowerMode = CpuPowerMode.LITE_POWER_FULL

        // 绘制文本位置
        config.isDrwwTextPositionBox = true

        // 1.同步初始化
        ocr.initModelSync(config).fold(
            {
                if (it) {
                    Log.i(TAG, "onCreate: init success")
                }
            },
            {
                it.printStackTrace()
            }
        )

        val file = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM)
        val imageFile = File(file,"/Camera/test4.png")
        Log.i(TAG, "识别图片信息:" + imageFile.absolutePath)
        val bitmap = BitmapFactory.decodeFile(imageFile.absolutePath)
        ocr.getPredictor().setInputImage(bitmap)
        ocr.runModel()
//        ocr.runSync(bitmap)
        Log.i(TAG, "识别信息:" + ocr.getPredictor().wordLabels + ",耗时:" + ocr.getPredictor().inferenceTime())
    }

}

我运行后,看日志模型那些都是加载成功的,但是输出word都是xxx

2024-03-22 17:14:12.244 17380-17411 Predictor               com.equationl.paddleocr4android.app  E  Word index is not in label list:1616
2024-03-22 17:14:12.244 17380-17411 Predictor               com.equationl.paddleocr4android.app  E  Word index is not in label list:4105
2024-03-22 17:14:12.244 17380-17411 Predictor               com.equationl.paddleocr4android.app  I  [stat] Inference Time: 401.0 ;Box Size 5
2024-03-22 17:14:12.244 17380-17411 Predictor               com.equationl.paddleocr4android.app  I  ×××××××××××××××××
2024-03-22 17:14:12.244 17380-17411 Predictor               com.equationl.paddleocr4android.app  I  ××××××××××
2024-03-22 17:14:12.244 17380-17411 Predictor               com.equationl.paddleocr4android.app  I  ×××××××××××××××
2024-03-22 17:14:12.244 17380-17411 Predictor               com.equationl.paddleocr4android.app  I  ××××××××××××××××××××
2024-03-22 17:14:12.244 17380-17411 Predictor               com.equationl.paddleocr4android.app  I  ××××××××××××××
2024-03-22 17:14:12.244 17380-17411 OpenGLRenderer          com.equationl.paddleocr4android.app  D  Skia GL Pipeline
2024-03-22 17:14:12.245 17380-17411 cfr                     com.equationl.paddleocr4android.app  I  识别信息:[],耗时:401.0

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.