From 63f60aa35cdf13e095a68026a06a39868c39ad8f Mon Sep 17 00:00:00 2001 From: DefTruth <31974251+DefTruth@users.noreply.github.com> Date: Thu, 1 Dec 2022 11:16:40 +0800 Subject: [PATCH] [Android] Add PP-OCRv3 int8 docs and fix NULL cls result error (#762) * [Android] Update ppseg jni via new api and optimize jni vis funcs * delete local refs * [Android] Add PPTinyPose jni and java api * [Android] Update gradle download tasks info * [Android] Add PPTinyPose Android app example * update app build.gradle * [Android] Add PP-OCRv3 int8 docs and fix NULL cls result error --- .../vision/ocr/PP-OCRv3/android/README.md | 20 +++++++++++++++++++ java/android/app/src/main/AndroidManifest.xml | 4 ++-- .../app/examples/ocr/OcrMainActivity.java | 6 +++--- .../cpp/fastdeploy_jni/vision/results_jni.cc | 9 ++++++--- 4 files changed, 31 insertions(+), 8 deletions(-) diff --git a/examples/vision/ocr/PP-OCRv3/android/README.md b/examples/vision/ocr/PP-OCRv3/android/README.md index 97a6a2e37..0028547a5 100644 --- a/examples/vision/ocr/PP-OCRv3/android/README.md +++ b/examples/vision/ocr/PP-OCRv3/android/README.md @@ -79,6 +79,26 @@ public boolean initialized(); // 检查是否初始化成功 models labels/ppocr_keys_v1.txt ``` +## 使用量化模型 +如果您使用的是量化格式的模型,只需要使用RuntimeOption的enableLiteInt8()接口设置Int8精度推理即可。 +```java +String detModelFile = "ch_ppocrv3_plate_det_quant/inference.pdmodel"; +String detParamsFile = "ch_ppocrv3_plate_det_quant/inference.pdiparams"; +String recModelFile = "ch_ppocrv3_plate_rec_distillation_quant/inference.pdmodel"; +String recParamsFile = "ch_ppocrv3_plate_rec_distillation_quant/inference.pdiparams"; +String recLabelFilePath = "ppocr_keys_v1.txt"; // ppocr_keys_v1.txt +RuntimeOption detOption = new RuntimeOption(); +RuntimeOption recOption = new RuntimeOption(); +// 使用Int8精度进行推理 +detOption.enableLiteInt8(); +recOption.enableLiteInt8(); +// 初始化PP-OCRv3 Pipeline +PPOCRv3 predictor = new PPOCRv3(); +DBDetector detModel = new DBDetector(detModelFile, detParamsFile, detOption); +Recognizer recModel = new Recognizer(recModelFile, recParamsFile, recLabelFilePath, recOption); +predictor.init(detModel, recModel); +``` +在App中使用,可以参考 [OcrMainActivity.java](./app/src/main/java/com/baidu/paddle/fastdeploy/app/examples/ocr/OcrMainActivity.java) 中的用法。 ## 更多参考文档 如果您想知道更多的FastDeploy Java API文档以及如何通过JNI来接入FastDeploy C++ API感兴趣,可以参考以下内容: diff --git a/java/android/app/src/main/AndroidManifest.xml b/java/android/app/src/main/AndroidManifest.xml index 16b6ae5a5..8493c0379 100644 --- a/java/android/app/src/main/AndroidManifest.xml +++ b/java/android/app/src/main/AndroidManifest.xml @@ -15,14 +15,14 @@ android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> - + diff --git a/java/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/examples/ocr/OcrMainActivity.java b/java/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/examples/ocr/OcrMainActivity.java index 5a42ff523..e66d3e9ff 100644 --- a/java/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/examples/ocr/OcrMainActivity.java +++ b/java/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/examples/ocr/OcrMainActivity.java @@ -31,6 +31,7 @@ import android.widget.TextView; import com.baidu.paddle.fastdeploy.RuntimeOption; import com.baidu.paddle.fastdeploy.app.examples.R; import com.baidu.paddle.fastdeploy.pipeline.PPOCRv2; +import com.baidu.paddle.fastdeploy.pipeline.PPOCRv3; import com.baidu.paddle.fastdeploy.ui.Utils; import com.baidu.paddle.fastdeploy.ui.view.CameraSurfaceView; import com.baidu.paddle.fastdeploy.ui.view.ResultListView; @@ -41,6 +42,7 @@ import com.baidu.paddle.fastdeploy.vision.Visualize; import com.baidu.paddle.fastdeploy.vision.ocr.Classifier; import com.baidu.paddle.fastdeploy.vision.ocr.DBDetector; import com.baidu.paddle.fastdeploy.vision.ocr.Recognizer; + import java.math.BigDecimal; import java.util.ArrayList; import java.util.List; @@ -423,9 +425,7 @@ public class OcrMainActivity extends Activity implements View.OnClickListener, C if (OcrSettingsActivity.checkAndUpdateSettings(this)) { String realModelDir = getCacheDir() + "/" + OcrSettingsActivity.modelDir; String detModelName = "ch_PP-OCRv2_det_infer"; - // String detModelName = "ch_ppocr_mobile_v2.0_det_infer"; String clsModelName = "ch_ppocr_mobile_v2.0_cls_infer"; - // String recModelName = "ch_ppocr_mobile_v2.0_rec_infer"; String recModelName = "ch_PP-OCRv2_rec_infer"; String realDetModelDir = realModelDir + "/" + detModelName; String realClsModelDir = realModelDir + "/" + clsModelName; @@ -460,11 +460,11 @@ public class OcrMainActivity extends Activity implements View.OnClickListener, C clsOption.enableLiteFp16(); recOption.enableLiteFp16(); } + DBDetector detModel = new DBDetector(detModelFile, detParamsFile, detOption); Classifier clsModel = new Classifier(clsModelFile, clsParamsFile, clsOption); Recognizer recModel = new Recognizer(recModelFile, recParamsFile, recLabelFilePath, recOption); predictor.init(detModel, clsModel, recModel); - } } diff --git a/java/android/fastdeploy/src/main/cpp/fastdeploy_jni/vision/results_jni.cc b/java/android/fastdeploy/src/main/cpp/fastdeploy_jni/vision/results_jni.cc index 0680a1534..94ab47b92 100644 --- a/java/android/fastdeploy/src/main/cpp/fastdeploy_jni/vision/results_jni.cc +++ b/java/android/fastdeploy/src/main/cpp/fastdeploy_jni/vision/results_jni.cc @@ -842,9 +842,12 @@ bool AllocateOCRResultFromJava( return false; } - const int cls_len = env->GetArrayLength(j_ocr_cls_scores_float_arr); - if (cls_len != env->GetArrayLength(j_ocr_cls_labels_int_arr)) { - return false; + int cls_len = 0; + if ((j_ocr_cls_labels_int_arr != NULL) && (j_ocr_cls_scores_float_arr != NULL)) { + cls_len = env->GetArrayLength(j_ocr_cls_scores_float_arr); + if (cls_len != env->GetArrayLength(j_ocr_cls_labels_int_arr)) { + return false; + } } // Init cxx result