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