文章目录
移植百度超轻量级中文OCR模型到Android项目的踩坑经历
在这篇博客中,我将分享将百度超轻量级中文OCR模型(Android版)移植到我的自有Android工程中的经历以及遇到的问题。百度的超轻量级OCR模型提供了一种高效的中文文本识别解决方案,但在将其整合到Android项目中时,遇到了一些挑战。下面我将详细记录整个过程,并分享解决这些问题的方法。
百度超轻量级中文OCR模型是基于深度学习框架PyTorch开发的,专为低功耗设备优化,并且适配了移动端的性能需求。作为一款轻量级OCR模型,它可以提供快速且高效的中文文本识别能力。我的目标是将该模型移植到Android项目中,从而在移动应用中实现高效的文本识别。
步骤一:
下载并准备模型
首先,我们需要从百度提供的官方GitHub仓库下载超轻量级OCR模型百度超轻量OCR文字识别
在这个过程中您需要先登录百度智能云的账号然后找到下面图片的位置
## 步骤二:移植OCR模型到Android项目
接下来,开始将模型移植到我的Android项目中,主要需要熟悉整个由百度工程师编写的工程。
工程目录简介
.EasyEdge-Android-SDK
├── app
│ ├── src/main
│ │ ├── assets
│ │ │ ├── demo # demo配置文件夹
│ │ │ │ └── conf.json
│ │ │ ├── infer # 模型资源文件夹
│ │ │ │ ├── model
│ │ │ │ ├── params
│ │ │ │ ├── label_list.txt
│ │ │ │ └── infer_cfg.json
│ │ ├── java/com.baidu.ai.edge/demo
│ │ │ ├── infertest # 通用ARM精简版测试
│ │ │ │ ├── TestInferClassifyTask.java # 图像分类
│ │ │ │ ├── TestInferDetectionTask.java # 物体检测
│ │ │ │ ├── TestInferSegmentTask.java # 实例分割
│ │ │ │ ├── TestInferPoseTask.java # 姿态估计
│ │ │ │ ├── TestInferOcrTask.java # OCR
│ │ │ │ └── MainActivity.java # 精简版启动 Activity
│ │ │ ├── MainActivity.java # Demo APP 启动 Activity
│ │ │ ├── CameraActivity.java # 摄像头UI逻辑
│ │ │ └── ...
│ │ └── ...
│ ├── libs
│ │ ├── armeabi-v7a # v7a的依赖库
│ │ ├── arm64-v8a # v8a的依赖库
│ │ └── easyedge-sdk.jar # jar文件
│ └── ...
├── camera_ui # UI模块,包含相机逻辑
├── README.md
└── ... # 其他 gradle 等工程文件
TestInferOcrTask
这个java类中包含了模型初始化,以及权限的获取,还有蜂窝数据等等只有当获取到手机的所有权限才可运行,这是因为百度官方在编写jar包的时候里面的逻辑导致并且读取文字也必须获取所有权限这同样也是Android权限原因导致。
最终会由一个OCR进行输出。
步骤二:
问题总结
软件闪退
- 主要原因是因为初始化不对没有正确读取到需要被读取的文件需要好好的去检查一下模型位置是否被正确读取。
- 没有正确的给软件赋予权限百度OCR轻量级需要的权限是赋予所有权限包括存储,音频,照片等等,我的建议是权限都给上。
识别结果为空
这个问题我自己的经验是没有正确的输出,说白了就是你找到输出的接口java语句不对,这个是完全本地识别的是公用开源的OCR也是当今开源移动端我认为是最好的OCR识别。我们要有OCR字样的最后将这个获取然后循环输出就可以了。
log日志一直提示权限未赋予
- 这个你需要着重检查你的app目录下的build gradle文件里头的API是多少,我走了很多坑最后去百度写的那个jar文件里头我发现了下面图片中的语句正常的Android12或者Android11这样写是没有问题的但是问题出在我们的工程是Android13以上的sdk,而下面图片中的权限对应的是Android12或者Android11以下的权限编写,而我们的工程版本是Android13谷歌为了保护用户隐私更改了权限的索取所以导致我们会出现报错等原因。
经过我的测试发现如果我将百度的原始工程30的sdk更改为33即便在授予了所有权限也会无法识别并且提出一个报错您的权限未能被正常授予
具体请看下面的图片
步骤三
解决方案
因为Android12与Android13的权限管理是完全不一样的而我们的工程整个的权限要求在Android13以下这个是被强制规定的这个是因为百度工程师在编写jar包的时候在权限获取的时候只针对了Android13以下的进行了适配Android13或者Android13以上的都没有写相应的权限声名。所以导致了我们如果在使用高版本去移植百度ocr依旧还是会有问题。
所以解决方法很简单把你的工程项目由原来的sdk33降低为sdk30下面这个图片是Android13的特性权限索取逻辑又是不一样的。
总结
在将百度超轻量级中文OCR模型移植到Android项目的过程中,我遇到了许多问题,包括整个工程的阅读,以及运行逻辑。最后我发现了就是因为jar包里头的权限已经被写固定了所以百度开源的ocr只能在Android12及以下的版本运行。