PaddleOCR 因其开源、高效以及卓越的识别效果,广泛应用于各种 OCR(Optical Character Recognition)场景。同时,PaddleOCR-Lite 凭借其轻量化和小巧的优势,成为移动端 OCR 识别的理想选择。
然而,对于初学者而言,官方文档在模型的移动端部署的说明较为分散且复杂,主要集中在演示(demo)和模型开源上。此外,Paddle官方建议在官方演示基础上进行修改,而不是作为一个独立模块直接引入现有项目中,这使得将 PaddleOCR 直接应用于现有的安卓项目中变得更加困难。
为了降低这一难度,本项目参考了 PaddleOCR和Paddle-lite-demo 中的示例,对各文件进行了详细解释,帮助用户将 PaddleOCR 模块无缝集成到已有项目中。总之,以下是本项目的特点所在:
集成 PaddleOCR 文本识别模型: 项目使用了 PaddleOCR 的文本识别模型,并结合 Android-Image-Cropper 库,实现了PaddleOCR在 Android 端的部署和高效的文本识别功能。
多样化的显示内容: 考虑到识别图片中中会存在数学公式、表格等复杂内容,因此,PaddleOCR 使用了 markwon库中,实现了在textView中使用markdwon格式显示数学公式、表格、图片等。
简化的部署过程: 通过提供清晰的文件说明和代码示例,本项目帮助开发者轻松将 PaddleOCR 作为较为独立的模块部署到现有的 Android 项目中。
支持服务器端部署: 除了移动端的实现外,项目还包含在服务器端使用 Python 版本的 PaddleOCR 模型的代码,为未来的服务器端功能扩展和交互提供了便利。
Initialization | Selection | Cropping |
---|---|---|
Result1 | Result2 |
---|---|
参考PaddleOCR, demo位于
deploy/android-demo
下 \( E_2^5 \)参考Paddle-lite-demo, demo位于
ocr/android
中
本项目使用PaddleOCR和Paddle-lite-demo两个demo中的部分代码完成移动端的PaddleOCR部署和文本的识别功能。
ApiService.java
、MainActivity.java
和ResultActivity.java
实现了android端的应用功能。此外,由于是将PaddleOCR导入已有项目,因此只从PaddleOCR复制了剩下的五个java文件用于文本的检测和识别。依照上述额外添加的项目文件描述,本项目在PaddleOCR中下载和复制了OpenCV文件夹、PaddleLite文件夹、cpp文件夹和java中除ApiService.java
、MainActivity.java
和ResultActivity.java
的文件; 在Paddle-lite-demo中下载了assets
文件夹。
cpp文件修改: 由于android端通过JNI实现调用cpp文件,从而完成文本检测和识别,因此,对 cpp 文件夹中native.cpp
需要将各函数修改成本项目的名称,从而与OCRPredictorNative.java
中函数相对应。
extern "C" JNIEXPORT jlong JNICALL
Java_com_example_questionextractionmodule_OCRPredictorNative_init{***}
模型名称修改: 模型名称位于Predictor.java
中第90行,分别将检测、分类和识别模型的名称换成assets/models
下模型的名称。
loadModelAndRunInference
函数实现了模型初始化,其中需要传入模型路径、标签路径等参数,这个在ResultActivity.java
中的全局变量里进行修改。runModel
函数实现了对模型调用完成文本检测和识别。其中outputImage
是带有检测框的识别图片,resultText
是识别后的完整输出,包含了坐标、分类结果、识别文本等,res
则使用正则化过滤,只包含识别文本。onRunModel()
函数中可以修改要调用的模型从而完成相应的功能。本项目使用Android-Image-Cropper库,并使用方法三进行图片裁剪。由于Android-Image-Cropper的文档也没有给出详细的实现方案,因此在下面罗列几个比较重要但简便的实现方法完成图片裁剪。
在AndroidManifest.xml
文件中添加CropImageActivity
<activity
android:name="com.canhub.cropper.CropImageActivity"
android:theme="@style/Base.Theme.AppCompat"
/>
dependencies {
implementation("com.vanniktech:android-image-cropper:4.6.0")
}
在MainActivity.java
中添加startCrop
函数后,对其调用即可完成对图片的裁剪。
private void startCrop(Uri uri) {
cropImage.launch(new CropImageContractOptions(uri, new CropImageOptions()));
}
在ResultActivity.java
中,项目实现了在android端调用服务器端的python模型,其功能体现在UploadImageTask
和onPostExecute
两个函数中。在使用中需要修改onPostExecute
函数中的服务器URL,并将onCreate
函数中第87行// new UploadImageTask().execute(croppedImageUri);
进行解注释。
在 python 文件夹使用flask实现服务器端程序,并调用model.py
实现文本识别。