添加PaddleOCR功能

This commit is contained in:
TonyJiangWJ
2023-08-06 23:58:21 +08:00
parent 49e9961a86
commit 61f7c13262
65 changed files with 16875 additions and 1 deletions

View File

@@ -40,6 +40,7 @@ import org.autojs.autojs.runtime.api.Floaty;
import org.autojs.autojs.runtime.api.Images;
import org.autojs.autojs.runtime.api.Media;
import org.autojs.autojs.runtime.api.MlKitOCR;
import org.autojs.autojs.runtime.api.PaddleOCR;
import org.autojs.autojs.runtime.api.Plugins;
import org.autojs.autojs.runtime.api.ProcessShell;
import org.autojs.autojs.runtime.api.ScreenMetrics;
@@ -243,6 +244,9 @@ public class ScriptRuntime {
@ScriptVariable
public final MlKitOCR mlKitOCR;
@ScriptVariable
public final PaddleOCR paddleOCR;
private static WeakReference<Context> applicationContext;
private final Map<String, Object> mProperties = new ConcurrentHashMap<>();
private AbstractShell mRootShell;
@@ -278,6 +282,7 @@ public class ScriptRuntime {
plugins = new Plugins(context, this);
mlKitOCR = new MlKitOCR();
paddleOCR = new PaddleOCR();
}
public void init() {
@@ -554,6 +559,7 @@ public class ScriptRuntime {
ignoresException(this::recycleShell);
ignoresException(images::releaseScreenCapturer);
ignoresException(mlKitOCR::release);
ignoresException(paddleOCR::release);
ignoresException(sensors::unregisterAll);
ignoresException(timers::recycle);
ignoresException(ui::recycle);

View File

@@ -0,0 +1,85 @@
package org.autojs.autojs.runtime.api;
import android.graphics.Bitmap;
import android.os.Looper;
import android.util.Log;
import com.baidu.paddle.lite.ocr.OcrResult;
import com.baidu.paddle.lite.ocr.Predictor;
import org.autojs.autojs.app.GlobalAppContext;
import org.autojs.autojs.concurrent.VolatileDispose;
import org.autojs.autojs.core.image.ImageWrapper;
import java.util.Collections;
import java.util.List;
/**
* @author TonyJiangWJ
* @since 2023-08-06
*/
public class PaddleOCR {
private final Predictor mPredictor = new Predictor();
public synchronized boolean init(boolean useSlim) {
if (!mPredictor.isLoaded || useSlim != mPredictor.isUseSlim()) {
if (Looper.getMainLooper() == Looper.myLooper()) {
VolatileDispose<Boolean> result = new VolatileDispose<>();
new Thread(() -> {
result.setAndNotify(mPredictor.init(GlobalAppContext.get(), useSlim));
}).start();
return result.blockedGet();
} else {
return mPredictor.init(GlobalAppContext.get(), useSlim);
}
}
return mPredictor.isLoaded;
}
public void release() {
mPredictor.releaseModel();
}
public List<OcrResult> detect(ImageWrapper image, int cpuThreadNum, boolean useSlim) {
if (image == null) {
return Collections.emptyList();
}
Bitmap bitmap = image.getBitmap();
if (bitmap.isRecycled()) {
return Collections.emptyList();
}
if (mPredictor.cpuThreadNum != cpuThreadNum) {
mPredictor.releaseModel();
mPredictor.cpuThreadNum = cpuThreadNum;
}
init(useSlim);
return mPredictor.runOcr(bitmap);
}
public List<OcrResult> detect(ImageWrapper image, int cpuThreadNum) {
return detect(image, cpuThreadNum, true);
}
public List<OcrResult> detect(ImageWrapper image) {
return detect(image, 4, true);
}
public String[] recognizeText(ImageWrapper image, int cpuThreadNum, boolean useSlim) {
List<OcrResult> words_result = detect(image, cpuThreadNum, useSlim);
Collections.sort(words_result);
String[] outputResult = new String[words_result.size()];
for (int i = 0; i < words_result.size(); i++) {
outputResult[i] = words_result.get(i).getLabel();
// show LOG in Logcat panel
Log.i("outputResult", outputResult[i]);
}
return outputResult;
}
public String[] recognizeText(ImageWrapper image, int cpuThreadNum) {
return recognizeText(image, cpuThreadNum, true);
}
public String[] recognizeText(ImageWrapper image) {
return recognizeText(image, 4, true);
}
}