wakeeys / PaddleOCR-Android

An android demo based on photo clipping and PaddleOCR for text recognition , and the deployment of PaddleOCR in Android as an independent module is explained in detail.
2 stars 0 forks source link

基于PaddleOCR的拍照裁剪&文本识别的android-demo

项目简介

摘要

PaddleOCR 因其开源、高效以及卓越的识别效果,广泛应用于各种 OCR(Optical Character Recognition)场景。同时,PaddleOCR-Lite 凭借其轻量化和小巧的优势,成为移动端 OCR 识别的理想选择。

然而,对于初学者而言,官方文档在模型的移动端部署的说明较为分散且复杂,主要集中在演示(demo)和模型开源上。此外,Paddle官方建议在官方演示基础上进行修改,而不是作为一个独立模块直接引入现有项目中,这使得将 PaddleOCR 直接应用于现有的安卓项目中变得更加困难。

为了降低这一难度,本项目参考了 PaddleOCRPaddle-lite-demo 中的示例,对各文件进行了详细解释,帮助用户将 PaddleOCR 模块无缝集成到已有项目中。总之,以下是本项目的特点所在:

效果展示

Initialization Selection Cropping
Initialization Selection Cropping
Result1 Result2
Result Result2

参考链接

参考PaddleOCR, demo位于deploy/android-demo下 \( E_2^5 \)

参考Paddle-lite-demo, demo位于ocr/android

PaddleOCR的导入和配置

本项目使用PaddleOCRPaddle-lite-demo两个demo中的部分代码完成移动端的PaddleOCR部署和文本的识别功能。

依照上述额外添加的项目文件描述,本项目在PaddleOCR中下载和复制了OpenCV文件夹、PaddleLite文件夹、cpp文件夹和java中除ApiService.javaMainActivity.javaResultActivity.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下模型的名称。

Cropper库的安装与实现

本项目使用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()));
}

附加:服务器端使用python模型

ResultActivity.java中,项目实现了在android端调用服务器端的python模型,其功能体现在UploadImageTaskonPostExecute两个函数中。在使用中需要修改onPostExecute函数中的服务器URL,并将onCreate函数中第87行// new UploadImageTask().execute(croppedImageUri);进行解注释。

在 python 文件夹使用flask实现服务器端程序,并调用model.py实现文本识别。