mirror of
https://github.com/PaddlePaddle/FastDeploy.git
synced 2025-10-05 00:33:03 +08:00
[Android] Support PP-OCRv2 & PP-OCRv3 in Android (#445)
* [Android] Add Android build docs and demo (#26) * [Backend] Add override flag to lite backend * [Docs] Add Android C++ SDK build docs * [Doc] fix android_build_docs typos * Update CMakeLists.txt * Update android.md * [Doc] Add PicoDet Android demo docs * [Doc] Update PicoDet Andorid demo docs * [Doc] Update PaddleClasModel Android demo docs * [Doc] Update fastdeploy android jni docs * [Doc] Update fastdeploy android jni usage docs * [Android] init fastdeploy android jar package * [Backend] support int8 option for lite backend * [Model] add Backend::Lite to paddle model * [Backend] use CopyFromCpu for lite backend. * [Android] package jni srcs and java api into aar * Update infer.cc * Update infer.cc * [Android] Update package build.gradle * [Android] Update android app examples * [Android] update android detection app * [Android] Support PP-OCRv2 & PP-OCRv3 in Android * [Android] bind ORCResult with JNI * [Android] move static class jni method to instance method * [Android] bind VisOcr and VisClassification via JNI * [Android] Add PP-OCRv2 & v3 android demo
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
package="com.baidu.paddle.fastdeploy.app.examples.detection">
|
||||
package="com.baidu.paddle.fastdeploy.app.examples">
|
||||
|
||||
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
|
||||
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
|
||||
@@ -11,18 +11,18 @@
|
||||
<application
|
||||
android:allowBackup="true"
|
||||
android:icon="@mipmap/ic_launcher"
|
||||
android:label="@string/app_name"
|
||||
android:label="@string/ocr_app_name"
|
||||
android:roundIcon="@mipmap/ic_launcher_round"
|
||||
android:supportsRtl="true"
|
||||
android:theme="@style/AppTheme">
|
||||
<activity android:name="com.baidu.paddle.fastdeploy.app.examples.detection.MainActivity">
|
||||
<activity android:name="com.baidu.paddle.fastdeploy.app.examples.ocr.MainActivity">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN"/>
|
||||
<category android:name="android.intent.category.LAUNCHER"/>
|
||||
</intent-filter>
|
||||
</activity>
|
||||
<activity
|
||||
android:name="com.baidu.paddle.fastdeploy.app.examples.detection.SettingsActivity"
|
||||
android:name="com.baidu.paddle.fastdeploy.app.examples.ocr.SettingsActivity"
|
||||
android:label="Settings">
|
||||
</activity>
|
||||
</application>
|
||||
|
94
java/android/app/src/main/assets/labels/en_dict.txt
Normal file
94
java/android/app/src/main/assets/labels/en_dict.txt
Normal file
@@ -0,0 +1,94 @@
|
||||
0
|
||||
1
|
||||
2
|
||||
3
|
||||
4
|
||||
5
|
||||
6
|
||||
7
|
||||
8
|
||||
9
|
||||
:
|
||||
;
|
||||
<
|
||||
=
|
||||
>
|
||||
?
|
||||
@
|
||||
A
|
||||
B
|
||||
C
|
||||
D
|
||||
E
|
||||
F
|
||||
G
|
||||
H
|
||||
I
|
||||
J
|
||||
K
|
||||
L
|
||||
M
|
||||
N
|
||||
O
|
||||
P
|
||||
Q
|
||||
R
|
||||
S
|
||||
T
|
||||
U
|
||||
V
|
||||
W
|
||||
X
|
||||
Y
|
||||
Z
|
||||
[
|
||||
\
|
||||
]
|
||||
^
|
||||
_
|
||||
`
|
||||
a
|
||||
b
|
||||
c
|
||||
d
|
||||
e
|
||||
f
|
||||
g
|
||||
h
|
||||
i
|
||||
j
|
||||
k
|
||||
l
|
||||
m
|
||||
n
|
||||
o
|
||||
p
|
||||
q
|
||||
r
|
||||
s
|
||||
t
|
||||
u
|
||||
v
|
||||
w
|
||||
x
|
||||
y
|
||||
z
|
||||
{
|
||||
|
|
||||
}
|
||||
~
|
||||
!
|
||||
"
|
||||
#
|
||||
$
|
||||
%
|
||||
&
|
||||
'
|
||||
(
|
||||
)
|
||||
*
|
||||
+
|
||||
,
|
||||
-
|
||||
.
|
||||
/
|
6623
java/android/app/src/main/assets/labels/ppocr_keys_v1.txt
Normal file
6623
java/android/app/src/main/assets/labels/ppocr_keys_v1.txt
Normal file
File diff suppressed because it is too large
Load Diff
@@ -24,7 +24,7 @@ import android.widget.TextView;
|
||||
import android.widget.Toast;
|
||||
|
||||
import com.baidu.paddle.fastdeploy.RuntimeOption;
|
||||
import com.baidu.paddle.fastdeploy.app.examples.detection.R;
|
||||
import com.baidu.paddle.fastdeploy.app.examples.R;
|
||||
import com.baidu.paddle.fastdeploy.app.ui.CameraSurfaceView;
|
||||
import com.baidu.paddle.fastdeploy.app.ui.Utils;
|
||||
import com.baidu.paddle.fastdeploy.vision.DetectionResult;
|
||||
|
@@ -9,7 +9,7 @@ import android.preference.ListPreference;
|
||||
import android.preference.PreferenceManager;
|
||||
import android.support.v7.app.ActionBar;
|
||||
|
||||
import com.baidu.paddle.fastdeploy.app.examples.detection.R;
|
||||
import com.baidu.paddle.fastdeploy.app.examples.R;
|
||||
import com.baidu.paddle.fastdeploy.app.ui.AppCompatPreferenceActivity;
|
||||
import com.baidu.paddle.fastdeploy.app.ui.Utils;
|
||||
|
||||
@@ -46,7 +46,8 @@ public class SettingsActivity extends AppCompatPreferenceActivity implements
|
||||
@Override
|
||||
public void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
addPreferencesFromResource(R.xml.settings);
|
||||
// addPreferencesFromResource(R.xml.settings);
|
||||
addPreferencesFromResource(R.xml.detection_settings);
|
||||
ActionBar supportActionBar = getSupportActionBar();
|
||||
if (supportActionBar != null) {
|
||||
supportActionBar.setDisplayHomeAsUpEnabled(true);
|
||||
|
@@ -0,0 +1,289 @@
|
||||
package com.baidu.paddle.fastdeploy.app.examples.ocr;
|
||||
|
||||
|
||||
import android.Manifest;
|
||||
import android.annotation.SuppressLint;
|
||||
import android.app.Activity;
|
||||
import android.app.AlertDialog;
|
||||
import android.content.DialogInterface;
|
||||
import android.content.Intent;
|
||||
import android.content.SharedPreferences;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.graphics.Bitmap;
|
||||
import android.os.Bundle;
|
||||
import android.preference.PreferenceManager;
|
||||
import android.support.annotation.NonNull;
|
||||
import android.support.v4.app.ActivityCompat;
|
||||
import android.support.v4.content.ContextCompat;
|
||||
import android.view.View;
|
||||
import android.view.Window;
|
||||
import android.view.WindowManager;
|
||||
import android.widget.ImageButton;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.TextView;
|
||||
import android.widget.Toast;
|
||||
|
||||
import com.baidu.paddle.fastdeploy.RuntimeOption;
|
||||
import com.baidu.paddle.fastdeploy.app.examples.R;
|
||||
import com.baidu.paddle.fastdeploy.app.ui.CameraSurfaceView;
|
||||
import com.baidu.paddle.fastdeploy.app.ui.Utils;
|
||||
import com.baidu.paddle.fastdeploy.vision.OCRResult;
|
||||
import com.baidu.paddle.fastdeploy.pipeline.PPOCRv2;
|
||||
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.io.File;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.Date;
|
||||
|
||||
public class MainActivity extends Activity implements View.OnClickListener, CameraSurfaceView.OnTextureChangedListener {
|
||||
private static final String TAG = MainActivity.class.getSimpleName();
|
||||
|
||||
CameraSurfaceView svPreview;
|
||||
TextView tvStatus;
|
||||
ImageButton btnSwitch;
|
||||
ImageButton btnShutter;
|
||||
ImageButton btnSettings;
|
||||
ImageView realtimeToggleButton;
|
||||
boolean isRealtimeStatusRunning = false;
|
||||
ImageView backInPreview;
|
||||
|
||||
String savedImagePath = "result.jpg";
|
||||
int lastFrameIndex = 0;
|
||||
long lastFrameTime;
|
||||
|
||||
// Call 'init' and 'release' manually later
|
||||
PPOCRv2 predictor = new PPOCRv2();
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
|
||||
// Fullscreen
|
||||
requestWindowFeature(Window.FEATURE_NO_TITLE);
|
||||
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
|
||||
|
||||
setContentView(R.layout.activity_main);
|
||||
|
||||
// Clear all setting items to avoid app crashing due to the incorrect settings
|
||||
initSettings();
|
||||
|
||||
// Init the camera preview and UI components
|
||||
initView();
|
||||
|
||||
// Check and request CAMERA and WRITE_EXTERNAL_STORAGE permissions
|
||||
if (!checkAllPermissions()) {
|
||||
requestAllPermissions();
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressLint("NonConstantResourceId")
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
switch (v.getId()) {
|
||||
case R.id.btn_switch:
|
||||
svPreview.switchCamera();
|
||||
break;
|
||||
case R.id.btn_shutter:
|
||||
@SuppressLint("SimpleDateFormat")
|
||||
SimpleDateFormat date = new SimpleDateFormat("yyyy_MM_dd_HH_mm_ss");
|
||||
synchronized (this) {
|
||||
savedImagePath = Utils.getDCIMDirectory() + File.separator + date.format(new Date()).toString() + ".png";
|
||||
}
|
||||
Toast.makeText(MainActivity.this, "Save snapshot to " + savedImagePath, Toast.LENGTH_SHORT).show();
|
||||
break;
|
||||
case R.id.btn_settings:
|
||||
startActivity(new Intent(MainActivity.this, SettingsActivity.class));
|
||||
break;
|
||||
case R.id.realtime_toggle_btn:
|
||||
toggleRealtimeStyle();
|
||||
break;
|
||||
case R.id.back_in_preview:
|
||||
finish();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
private void toggleRealtimeStyle() {
|
||||
if (isRealtimeStatusRunning) {
|
||||
isRealtimeStatusRunning = false;
|
||||
realtimeToggleButton.setImageResource(R.drawable.realtime_stop_btn);
|
||||
svPreview.setOnTextureChangedListener(this);
|
||||
tvStatus.setVisibility(View.VISIBLE);
|
||||
} else {
|
||||
isRealtimeStatusRunning = true;
|
||||
realtimeToggleButton.setImageResource(R.drawable.realtime_start_btn);
|
||||
tvStatus.setVisibility(View.GONE);
|
||||
svPreview.setOnTextureChangedListener(new CameraSurfaceView.OnTextureChangedListener() {
|
||||
@Override
|
||||
public boolean onTextureChanged(Bitmap ARGB8888ImageBitmap) {
|
||||
return false;
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onTextureChanged(Bitmap ARGB8888ImageBitmap) {
|
||||
String savedImagePath = "";
|
||||
synchronized (this) {
|
||||
savedImagePath = MainActivity.this.savedImagePath;
|
||||
}
|
||||
boolean modified = false;
|
||||
OCRResult result = predictor.predict(ARGB8888ImageBitmap, savedImagePath);
|
||||
modified = result.initialized();
|
||||
if (!savedImagePath.isEmpty()) {
|
||||
synchronized (this) {
|
||||
MainActivity.this.savedImagePath = "result.jpg";
|
||||
}
|
||||
}
|
||||
lastFrameIndex++;
|
||||
if (lastFrameIndex >= 30) {
|
||||
final int fps = (int) (lastFrameIndex * 1e9 / (System.nanoTime() - lastFrameTime));
|
||||
runOnUiThread(new Runnable() {
|
||||
@SuppressLint("SetTextI18n")
|
||||
public void run() {
|
||||
tvStatus.setText(Integer.toString(fps) + "fps");
|
||||
}
|
||||
});
|
||||
lastFrameIndex = 0;
|
||||
lastFrameTime = System.nanoTime();
|
||||
}
|
||||
return modified;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onResume() {
|
||||
super.onResume();
|
||||
// Reload settings and re-initialize the predictor
|
||||
checkAndUpdateSettings();
|
||||
// Open camera until the permissions have been granted
|
||||
if (!checkAllPermissions()) {
|
||||
svPreview.disableCamera();
|
||||
}
|
||||
svPreview.onResume();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onPause() {
|
||||
super.onPause();
|
||||
svPreview.onPause();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onDestroy() {
|
||||
if (predictor != null) {
|
||||
predictor.release();
|
||||
}
|
||||
super.onDestroy();
|
||||
}
|
||||
|
||||
public void initView() {
|
||||
svPreview = (CameraSurfaceView) findViewById(R.id.sv_preview);
|
||||
svPreview.setOnTextureChangedListener(this);
|
||||
tvStatus = (TextView) findViewById(R.id.tv_status);
|
||||
btnSwitch = (ImageButton) findViewById(R.id.btn_switch);
|
||||
btnSwitch.setOnClickListener(this);
|
||||
btnShutter = (ImageButton) findViewById(R.id.btn_shutter);
|
||||
btnShutter.setOnClickListener(this);
|
||||
btnSettings = (ImageButton) findViewById(R.id.btn_settings);
|
||||
btnSettings.setOnClickListener(this);
|
||||
realtimeToggleButton = findViewById(R.id.realtime_toggle_btn);
|
||||
realtimeToggleButton.setOnClickListener(this);
|
||||
backInPreview = findViewById(R.id.back_in_preview);
|
||||
backInPreview.setOnClickListener(this);
|
||||
}
|
||||
|
||||
@SuppressLint("ApplySharedPref")
|
||||
public void initSettings() {
|
||||
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
|
||||
SharedPreferences.Editor editor = sharedPreferences.edit();
|
||||
editor.clear();
|
||||
editor.commit();
|
||||
SettingsActivity.resetSettings();
|
||||
}
|
||||
|
||||
public void checkAndUpdateSettings() {
|
||||
if (SettingsActivity.checkAndUpdateSettings(this)) {
|
||||
String realModelDir = getCacheDir() + "/" + SettingsActivity.modelDir;
|
||||
// String detModelName = "ch_PP-OCRv2_det_infer";
|
||||
String detModelName = "ch_PP-OCRv3_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-OCRv3_rec_infer";
|
||||
// String recModelName = "ch_PP-OCRv2_rec_infer";
|
||||
String realDetModelDir = realModelDir + "/" + detModelName;
|
||||
String realClsModelDir = realModelDir + "/" + clsModelName;
|
||||
String realRecModelDir = realModelDir + "/" + recModelName;
|
||||
String srcDetModelDir = SettingsActivity.modelDir + "/" + detModelName;
|
||||
String srcClsModelDir = SettingsActivity.modelDir + "/" + clsModelName;
|
||||
String srcRecModelDir = SettingsActivity.modelDir + "/" + recModelName;
|
||||
Utils.copyDirectoryFromAssets(this, srcDetModelDir, realDetModelDir);
|
||||
Utils.copyDirectoryFromAssets(this, srcClsModelDir, realClsModelDir);
|
||||
Utils.copyDirectoryFromAssets(this, srcRecModelDir, realRecModelDir);
|
||||
String realLabelPath = getCacheDir() + "/" + SettingsActivity.labelPath;
|
||||
Utils.copyFileFromAssets(this, SettingsActivity.labelPath, realLabelPath);
|
||||
|
||||
String detModelFile = realDetModelDir + "/" + "inference.pdmodel";
|
||||
String detParamsFile = realDetModelDir + "/" + "inference.pdiparams";
|
||||
String clsModelFile = realClsModelDir + "/" + "inference.pdmodel";
|
||||
String clsParamsFile = realClsModelDir + "/" + "inference.pdiparams";
|
||||
String recModelFile = realRecModelDir + "/" + "inference.pdmodel";
|
||||
String recParamsFile = realRecModelDir + "/" + "inference.pdiparams";
|
||||
String recLabelFilePath = realLabelPath; // ppocr_keys_v1.txt
|
||||
RuntimeOption detOption = new RuntimeOption();
|
||||
RuntimeOption clsOption = new RuntimeOption();
|
||||
RuntimeOption recOption = new RuntimeOption();
|
||||
detOption.setCpuThreadNum(SettingsActivity.cpuThreadNum);
|
||||
clsOption.setCpuThreadNum(SettingsActivity.cpuThreadNum);
|
||||
recOption.setCpuThreadNum(SettingsActivity.cpuThreadNum);
|
||||
detOption.setLitePowerMode(SettingsActivity.cpuPowerMode);
|
||||
clsOption.setLitePowerMode(SettingsActivity.cpuPowerMode);
|
||||
recOption.setLitePowerMode(SettingsActivity.cpuPowerMode);
|
||||
detOption.enableRecordTimeOfRuntime();
|
||||
clsOption.enableRecordTimeOfRuntime();
|
||||
recOption.enableRecordTimeOfRuntime();
|
||||
if (Boolean.parseBoolean(SettingsActivity.enableLiteFp16)) {
|
||||
detOption.enableLiteFp16();
|
||||
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);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
|
||||
@NonNull int[] grantResults) {
|
||||
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
|
||||
if (grantResults[0] != PackageManager.PERMISSION_GRANTED || grantResults[1] != PackageManager.PERMISSION_GRANTED) {
|
||||
new AlertDialog.Builder(MainActivity.this)
|
||||
.setTitle("Permission denied")
|
||||
.setMessage("Click to force quit the app, then open Settings->Apps & notifications->Target " +
|
||||
"App->Permissions to grant all of the permissions.")
|
||||
.setCancelable(false)
|
||||
.setPositiveButton("Exit", new DialogInterface.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(DialogInterface dialog, int which) {
|
||||
MainActivity.this.finish();
|
||||
}
|
||||
}).show();
|
||||
}
|
||||
}
|
||||
|
||||
private void requestAllPermissions() {
|
||||
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,
|
||||
Manifest.permission.CAMERA}, 0);
|
||||
}
|
||||
|
||||
private boolean checkAllPermissions() {
|
||||
return ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED
|
||||
&& ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED;
|
||||
}
|
||||
}
|
@@ -0,0 +1,198 @@
|
||||
package com.baidu.paddle.fastdeploy.app.examples.ocr;
|
||||
|
||||
import android.annotation.SuppressLint;
|
||||
import android.content.Context;
|
||||
import android.content.SharedPreferences;
|
||||
import android.os.Bundle;
|
||||
import android.preference.EditTextPreference;
|
||||
import android.preference.ListPreference;
|
||||
import android.preference.PreferenceManager;
|
||||
import android.support.v7.app.ActionBar;
|
||||
|
||||
import com.baidu.paddle.fastdeploy.app.examples.R;
|
||||
import com.baidu.paddle.fastdeploy.app.ui.AppCompatPreferenceActivity;
|
||||
import com.baidu.paddle.fastdeploy.app.ui.Utils;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class SettingsActivity extends AppCompatPreferenceActivity implements
|
||||
SharedPreferences.OnSharedPreferenceChangeListener {
|
||||
private static final String TAG = SettingsActivity.class.getSimpleName();
|
||||
|
||||
static public int selectedModelIdx = -1;
|
||||
static public String modelDir = "";
|
||||
static public String labelPath = "";
|
||||
static public int cpuThreadNum = 2;
|
||||
static public String cpuPowerMode = "";
|
||||
static public float scoreThreshold = 0.4f;
|
||||
static public String enableLiteFp16 = "true";
|
||||
|
||||
ListPreference lpChoosePreInstalledModel = null;
|
||||
EditTextPreference etModelDir = null;
|
||||
EditTextPreference etLabelPath = null;
|
||||
ListPreference lpCPUThreadNum = null;
|
||||
ListPreference lpCPUPowerMode = null;
|
||||
EditTextPreference etScoreThreshold = null;
|
||||
ListPreference lpEnableLiteFp16 = null;
|
||||
|
||||
List<String> preInstalledModelDirs = null;
|
||||
List<String> preInstalledLabelPaths = null;
|
||||
List<String> preInstalledCPUThreadNums = null;
|
||||
List<String> preInstalledCPUPowerModes = null;
|
||||
List<String> preInstalledScoreThresholds = null;
|
||||
List<String> preInstalledEnableLiteFp16s = null;
|
||||
|
||||
@Override
|
||||
public void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
addPreferencesFromResource(R.xml.ocr_settings);
|
||||
ActionBar supportActionBar = getSupportActionBar();
|
||||
if (supportActionBar != null) {
|
||||
supportActionBar.setDisplayHomeAsUpEnabled(true);
|
||||
}
|
||||
|
||||
// Initialize pre-installed models
|
||||
preInstalledModelDirs = new ArrayList<String>();
|
||||
preInstalledLabelPaths = new ArrayList<String>();
|
||||
preInstalledCPUThreadNums = new ArrayList<String>();
|
||||
preInstalledCPUPowerModes = new ArrayList<String>();
|
||||
preInstalledScoreThresholds = new ArrayList<String>();
|
||||
preInstalledEnableLiteFp16s = new ArrayList<String>();
|
||||
preInstalledModelDirs.add(getString(R.string.OCR_MODEL_DIR_DEFAULT));
|
||||
preInstalledLabelPaths.add(getString(R.string.OCR_REC_LABEL_DEFAULT));
|
||||
preInstalledCPUThreadNums.add(getString(R.string.CPU_THREAD_NUM_DEFAULT));
|
||||
preInstalledCPUPowerModes.add(getString(R.string.CPU_POWER_MODE_DEFAULT));
|
||||
preInstalledScoreThresholds.add(getString(R.string.SCORE_THRESHOLD_DEFAULT));
|
||||
preInstalledEnableLiteFp16s.add(getString(R.string.ENABLE_LITE_FP16_MODE_DEFAULT));
|
||||
|
||||
// Setup UI components
|
||||
lpChoosePreInstalledModel =
|
||||
(ListPreference) findPreference(getString(R.string.CHOOSE_PRE_INSTALLED_MODEL_KEY));
|
||||
String[] preInstalledModelNames = new String[preInstalledModelDirs.size()];
|
||||
for (int i = 0; i < preInstalledModelDirs.size(); i++) {
|
||||
preInstalledModelNames[i] = preInstalledModelDirs.get(i).substring(preInstalledModelDirs.get(i).lastIndexOf("/") + 1);
|
||||
}
|
||||
lpChoosePreInstalledModel.setEntries(preInstalledModelNames);
|
||||
lpChoosePreInstalledModel.setEntryValues(preInstalledModelDirs.toArray(new String[preInstalledModelDirs.size()]));
|
||||
lpCPUThreadNum = (ListPreference) findPreference(getString(R.string.CPU_THREAD_NUM_KEY));
|
||||
lpCPUPowerMode = (ListPreference) findPreference(getString(R.string.CPU_POWER_MODE_KEY));
|
||||
etModelDir = (EditTextPreference) findPreference(getString(R.string.MODEL_DIR_KEY));
|
||||
etModelDir.setTitle("Model dir (SDCard: " + Utils.getSDCardDirectory() + ")");
|
||||
etLabelPath = (EditTextPreference) findPreference(getString(R.string.LABEL_PATH_KEY));
|
||||
etLabelPath.setTitle("Label path (SDCard: " + Utils.getSDCardDirectory() + ")");
|
||||
etScoreThreshold = (EditTextPreference) findPreference(getString(R.string.SCORE_THRESHOLD_KEY));
|
||||
lpEnableLiteFp16 = (ListPreference) findPreference(getString(R.string.ENABLE_LITE_FP16_MODE_KEY));
|
||||
}
|
||||
|
||||
@SuppressLint("ApplySharedPref")
|
||||
private void reloadSettingsAndUpdateUI() {
|
||||
SharedPreferences sharedPreferences = getPreferenceScreen().getSharedPreferences();
|
||||
|
||||
String selected_model_dir = sharedPreferences.getString(getString(R.string.CHOOSE_PRE_INSTALLED_MODEL_KEY),
|
||||
getString(R.string.OCR_MODEL_DIR_DEFAULT));
|
||||
int selected_model_idx = lpChoosePreInstalledModel.findIndexOfValue(selected_model_dir);
|
||||
if (selected_model_idx >= 0 && selected_model_idx < preInstalledModelDirs.size() && selected_model_idx != selectedModelIdx) {
|
||||
SharedPreferences.Editor editor = sharedPreferences.edit();
|
||||
editor.putString(getString(R.string.MODEL_DIR_KEY), preInstalledModelDirs.get(selected_model_idx));
|
||||
editor.putString(getString(R.string.LABEL_PATH_KEY), preInstalledLabelPaths.get(selected_model_idx));
|
||||
editor.putString(getString(R.string.CPU_THREAD_NUM_KEY), preInstalledCPUThreadNums.get(selected_model_idx));
|
||||
editor.putString(getString(R.string.CPU_POWER_MODE_KEY), preInstalledCPUPowerModes.get(selected_model_idx));
|
||||
editor.putString(getString(R.string.SCORE_THRESHOLD_KEY), preInstalledScoreThresholds.get(selected_model_idx));
|
||||
editor.putString(getString(R.string.ENABLE_LITE_FP16_MODE_DEFAULT), preInstalledEnableLiteFp16s.get(selected_model_idx));
|
||||
editor.commit();
|
||||
lpChoosePreInstalledModel.setSummary(selected_model_dir);
|
||||
selectedModelIdx = selected_model_idx;
|
||||
}
|
||||
|
||||
String model_dir = sharedPreferences.getString(getString(R.string.MODEL_DIR_KEY),
|
||||
getString(R.string.OCR_MODEL_DIR_DEFAULT));
|
||||
String label_path = sharedPreferences.getString(getString(R.string.LABEL_PATH_KEY),
|
||||
getString(R.string.OCR_REC_LABEL_DEFAULT));
|
||||
String cpu_thread_num = sharedPreferences.getString(getString(R.string.CPU_THREAD_NUM_KEY),
|
||||
getString(R.string.CPU_THREAD_NUM_DEFAULT));
|
||||
String cpu_power_mode = sharedPreferences.getString(getString(R.string.CPU_POWER_MODE_KEY),
|
||||
getString(R.string.CPU_POWER_MODE_DEFAULT));
|
||||
String score_threshold = sharedPreferences.getString(getString(R.string.SCORE_THRESHOLD_KEY),
|
||||
getString(R.string.SCORE_THRESHOLD_DEFAULT));
|
||||
String enable_lite_fp16 = sharedPreferences.getString(getString(R.string.ENABLE_LITE_FP16_MODE_KEY),
|
||||
getString(R.string.ENABLE_LITE_FP16_MODE_DEFAULT));
|
||||
|
||||
etModelDir.setSummary(model_dir);
|
||||
etLabelPath.setSummary(label_path);
|
||||
lpCPUThreadNum.setValue(cpu_thread_num);
|
||||
lpCPUThreadNum.setSummary(cpu_thread_num);
|
||||
lpCPUPowerMode.setValue(cpu_power_mode);
|
||||
lpCPUPowerMode.setSummary(cpu_power_mode);
|
||||
etScoreThreshold.setSummary(score_threshold);
|
||||
etScoreThreshold.setText(score_threshold);
|
||||
lpEnableLiteFp16.setValue(enable_lite_fp16);
|
||||
lpEnableLiteFp16.setSummary(enable_lite_fp16);
|
||||
|
||||
}
|
||||
|
||||
static boolean checkAndUpdateSettings(Context ctx) {
|
||||
boolean settingsChanged = false;
|
||||
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(ctx);
|
||||
|
||||
String model_dir = sharedPreferences.getString(ctx.getString(R.string.MODEL_DIR_KEY),
|
||||
ctx.getString(R.string.OCR_MODEL_DIR_DEFAULT));
|
||||
settingsChanged |= !modelDir.equalsIgnoreCase(model_dir);
|
||||
modelDir = model_dir;
|
||||
|
||||
String label_path = sharedPreferences.getString(ctx.getString(R.string.LABEL_PATH_KEY),
|
||||
ctx.getString(R.string.OCR_REC_LABEL_DEFAULT));
|
||||
settingsChanged |= !labelPath.equalsIgnoreCase(label_path);
|
||||
labelPath = label_path;
|
||||
|
||||
String cpu_thread_num = sharedPreferences.getString(ctx.getString(R.string.CPU_THREAD_NUM_KEY),
|
||||
ctx.getString(R.string.CPU_THREAD_NUM_DEFAULT));
|
||||
settingsChanged |= cpuThreadNum != Integer.parseInt(cpu_thread_num);
|
||||
cpuThreadNum = Integer.parseInt(cpu_thread_num);
|
||||
|
||||
String cpu_power_mode = sharedPreferences.getString(ctx.getString(R.string.CPU_POWER_MODE_KEY),
|
||||
ctx.getString(R.string.CPU_POWER_MODE_DEFAULT));
|
||||
settingsChanged |= !cpuPowerMode.equalsIgnoreCase(cpu_power_mode);
|
||||
cpuPowerMode = cpu_power_mode;
|
||||
|
||||
String score_threshold = sharedPreferences.getString(ctx.getString(R.string.SCORE_THRESHOLD_KEY),
|
||||
ctx.getString(R.string.SCORE_THRESHOLD_DEFAULT));
|
||||
settingsChanged |= scoreThreshold != Float.parseFloat(score_threshold);
|
||||
scoreThreshold = Float.parseFloat(score_threshold);
|
||||
|
||||
String enable_lite_fp16 = sharedPreferences.getString(ctx.getString(R.string.ENABLE_LITE_FP16_MODE_KEY),
|
||||
ctx.getString(R.string.ENABLE_LITE_FP16_MODE_DEFAULT));
|
||||
settingsChanged |= !enableLiteFp16.equalsIgnoreCase(enable_lite_fp16);
|
||||
enableLiteFp16 = enable_lite_fp16;
|
||||
|
||||
return settingsChanged;
|
||||
}
|
||||
|
||||
static void resetSettings() {
|
||||
selectedModelIdx = -1;
|
||||
modelDir = "";
|
||||
labelPath = "";
|
||||
cpuThreadNum = 2;
|
||||
cpuPowerMode = "";
|
||||
scoreThreshold = 0.4f;
|
||||
enableLiteFp16 = "true";
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onResume() {
|
||||
super.onResume();
|
||||
getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
|
||||
reloadSettingsAndUpdateUI();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onPause() {
|
||||
super.onPause();
|
||||
getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
|
||||
reloadSettingsAndUpdateUI();
|
||||
}
|
||||
}
|
@@ -5,7 +5,7 @@
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:keepScreenOn="true"
|
||||
tools:context="com.baidu.paddle.fastdeploy.app.examples.detection.MainActivity">
|
||||
tools:context="com.baidu.paddle.fastdeploy.app.examples.ocr.MainActivity">
|
||||
|
||||
<RelativeLayout
|
||||
android:layout_width="match_parent"
|
||||
|
@@ -5,7 +5,7 @@
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:keepScreenOn="true"
|
||||
tools:context="com.baidu.paddle.fastdeploy.app.examples.detection.MainActivity">
|
||||
tools:context="com.baidu.paddle.fastdeploy.app.examples.ocr.MainActivity">
|
||||
|
||||
<RelativeLayout
|
||||
android:layout_width="match_parent"
|
||||
|
@@ -1,5 +1,10 @@
|
||||
<resources>
|
||||
<!-- Default App name -->
|
||||
<string name="app_name">FastDeploy PicoDet</string>
|
||||
<!-- Other App name -->
|
||||
<string name="detection_app_name">FastDeploy PicoDet</string>
|
||||
<string name="ocr_app_name">FastDeploy PP-OCRv2</string>
|
||||
<!-- Keys for PreferenceScreen -->
|
||||
<string name="CHOOSE_PRE_INSTALLED_MODEL_KEY">CHOOSE_INSTALLED_MODEL_KEY</string>
|
||||
<string name="MODEL_DIR_KEY">MODEL_DIR_KEY</string>
|
||||
<string name="LABEL_PATH_KEY">LABEL_PATH_KEY</string>
|
||||
@@ -7,13 +12,18 @@
|
||||
<string name="CPU_POWER_MODE_KEY">CPU_POWER_MODE_KEY</string>
|
||||
<string name="SCORE_THRESHOLD_KEY">SCORE_THRESHOLD_KEY</string>
|
||||
<string name="ENABLE_LITE_FP16_MODE_KEY">ENABLE_LITE_FP16_MODE_KEY</string>
|
||||
<string name="MODEL_DIR_DEFAULT">models/picodet_s_320_coco_lcnet</string>
|
||||
<string name="LABEL_PATH_DEFAULT">labels/coco_label_list.txt</string>
|
||||
<!-- Common default values ... -->
|
||||
<string name="CPU_THREAD_NUM_DEFAULT">2</string>
|
||||
<string name="CPU_POWER_MODE_DEFAULT">LITE_POWER_HIGH</string>
|
||||
<string name="SCORE_THRESHOLD_DEFAULT">0.4</string>
|
||||
<string name="ENABLE_LITE_FP16_MODE_DEFAULT">true</string>
|
||||
<!--Other values-->
|
||||
<!-- Default model & Label paths & other values ... -->
|
||||
<string name="MODEL_DIR_DEFAULT">models/picodet_s_320_coco_lcnet</string>
|
||||
<string name="LABEL_PATH_DEFAULT">labels/coco_label_list.txt</string>
|
||||
<!-- PP-OCRv2 & PP-OCRv3 values ... -->
|
||||
<string name="OCR_MODEL_DIR_DEFAULT">models</string>
|
||||
<string name="OCR_REC_LABEL_DEFAULT">labels/ppocr_keys_v1.txt</string>
|
||||
<!-- Other resources values-->
|
||||
<string name="action_bar_take_photo">拍照识别</string>
|
||||
<string name="action_bar_realtime">FD 实时识别</string>
|
||||
<string name="action_bar_back"><</string>
|
||||
|
@@ -0,0 +1,4 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
|
||||
</PreferenceScreen>
|
45
java/android/app/src/main/res/xml/detection_settings.xml
Normal file
45
java/android/app/src/main/res/xml/detection_settings.xml
Normal file
@@ -0,0 +1,45 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<ListPreference
|
||||
android:defaultValue="@string/MODEL_DIR_DEFAULT"
|
||||
android:key="@string/CHOOSE_PRE_INSTALLED_MODEL_KEY"
|
||||
android:negativeButtonText="@null"
|
||||
android:positiveButtonText="@null"
|
||||
android:title="Choose Pre-Installed Models" />
|
||||
<EditTextPreference
|
||||
android:defaultValue="@string/MODEL_DIR_DEFAULT"
|
||||
android:key="@string/MODEL_DIR_KEY"
|
||||
android:title="Model Dir" />
|
||||
<EditTextPreference
|
||||
android:defaultValue="@string/LABEL_PATH_DEFAULT"
|
||||
android:key="@string/LABEL_PATH_KEY"
|
||||
android:title="Label Path" />
|
||||
<ListPreference
|
||||
android:defaultValue="@string/CPU_THREAD_NUM_DEFAULT"
|
||||
android:entries="@array/cpu_thread_num_entries"
|
||||
android:entryValues="@array/cpu_thread_num_values"
|
||||
android:key="@string/CPU_THREAD_NUM_KEY"
|
||||
android:negativeButtonText="@null"
|
||||
android:positiveButtonText="@null"
|
||||
android:title="CPU Thread Num" />
|
||||
<ListPreference
|
||||
android:defaultValue="@string/CPU_POWER_MODE_DEFAULT"
|
||||
android:entries="@array/cpu_power_mode_entries"
|
||||
android:entryValues="@array/cpu_power_mode_values"
|
||||
android:key="@string/CPU_POWER_MODE_KEY"
|
||||
android:negativeButtonText="@null"
|
||||
android:positiveButtonText="@null"
|
||||
android:title="CPU Power Mode" />
|
||||
<EditTextPreference
|
||||
android:key="@string/SCORE_THRESHOLD_KEY"
|
||||
android:defaultValue="@string/SCORE_THRESHOLD_DEFAULT"
|
||||
android:title="Score Threshold: (0.0, 1.0)" />
|
||||
<ListPreference
|
||||
android:defaultValue="@string/ENABLE_LITE_FP16_MODE_DEFAULT"
|
||||
android:entries="@array/enable_lite_fp16_mode_entries"
|
||||
android:entryValues="@array/enable_lite_fp16_mode_values"
|
||||
android:key="@string/ENABLE_LITE_FP16_MODE_KEY"
|
||||
android:negativeButtonText="@null"
|
||||
android:positiveButtonText="@null"
|
||||
android:title="Enable Lite FP16" />
|
||||
</PreferenceScreen>
|
45
java/android/app/src/main/res/xml/ocr_settings.xml
Normal file
45
java/android/app/src/main/res/xml/ocr_settings.xml
Normal file
@@ -0,0 +1,45 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<ListPreference
|
||||
android:defaultValue="@string/MODEL_DIR_DEFAULT"
|
||||
android:key="@string/CHOOSE_PRE_INSTALLED_MODEL_KEY"
|
||||
android:negativeButtonText="@null"
|
||||
android:positiveButtonText="@null"
|
||||
android:title="Choose Pre-Installed Models" />
|
||||
<EditTextPreference
|
||||
android:defaultValue="@string/OCR_MODEL_DIR_DEFAULT"
|
||||
android:key="@string/MODEL_DIR_KEY"
|
||||
android:title="Model Dir" />
|
||||
<EditTextPreference
|
||||
android:defaultValue="@string/OCR_REC_LABEL_DEFAULT"
|
||||
android:key="@string/LABEL_PATH_KEY"
|
||||
android:title="Label Path" />
|
||||
<ListPreference
|
||||
android:defaultValue="@string/CPU_THREAD_NUM_DEFAULT"
|
||||
android:entries="@array/cpu_thread_num_entries"
|
||||
android:entryValues="@array/cpu_thread_num_values"
|
||||
android:key="@string/CPU_THREAD_NUM_KEY"
|
||||
android:negativeButtonText="@null"
|
||||
android:positiveButtonText="@null"
|
||||
android:title="CPU Thread Num" />
|
||||
<ListPreference
|
||||
android:defaultValue="@string/CPU_POWER_MODE_DEFAULT"
|
||||
android:entries="@array/cpu_power_mode_entries"
|
||||
android:entryValues="@array/cpu_power_mode_values"
|
||||
android:key="@string/CPU_POWER_MODE_KEY"
|
||||
android:negativeButtonText="@null"
|
||||
android:positiveButtonText="@null"
|
||||
android:title="CPU Power Mode" />
|
||||
<EditTextPreference
|
||||
android:key="@string/SCORE_THRESHOLD_KEY"
|
||||
android:defaultValue="@string/SCORE_THRESHOLD_DEFAULT"
|
||||
android:title="Score Threshold: (0.0, 1.0)" />
|
||||
<ListPreference
|
||||
android:defaultValue="@string/ENABLE_LITE_FP16_MODE_DEFAULT"
|
||||
android:entries="@array/enable_lite_fp16_mode_entries"
|
||||
android:entryValues="@array/enable_lite_fp16_mode_values"
|
||||
android:key="@string/ENABLE_LITE_FP16_MODE_KEY"
|
||||
android:negativeButtonText="@null"
|
||||
android:positiveButtonText="@null"
|
||||
android:title="Enable Lite FP16" />
|
||||
</PreferenceScreen>
|
Reference in New Issue
Block a user