From e613a5bb3bc49e661a20c4f8877010adeb7862b2 Mon Sep 17 00:00:00 2001 From: TonyJiangWJ Date: Fri, 4 Mar 2022 00:18:46 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96Paddle=E7=9A=84=E5=88=9D?= =?UTF-8?q?=E5=A7=8B=E5=8C=96=E8=BF=87=E7=A8=8B=20=E5=9F=BA=E6=9C=AC?= =?UTF-8?q?=E4=BF=9D=E9=9A=9C=E6=A8=A1=E5=9E=8B=E8=83=BD=E5=A4=9F=E5=88=9D?= =?UTF-8?q?=E5=A7=8B=E5=8C=96=E6=88=90=E5=8A=9F=20=E4=BD=86=E6=98=AF?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E6=96=B9=E5=BC=8F=E4=B8=8D=E5=AE=8C=E7=BE=8E?= =?UTF-8?q?=20=E9=9C=80=E8=A6=81=E5=90=8E=E7=BB=AD=E7=BB=A7=E7=BB=AD?= =?UTF-8?q?=E6=8E=92=E6=9F=A5=E5=8E=9F=E5=9B=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/AndroidManifest.xml | 3 +- .../com/baidu/paddle/lite/ocr/Predictor.java | 41 +++++++++++++++---- .../image/capture/GlobalScreenCapture.java | 5 +++ 3 files changed, 40 insertions(+), 9 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index ac625520..96f29498 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -4,7 +4,8 @@ package="org.autojs.autojs"> - + diff --git a/autojs-aar/paddleocr/src/main/java/com/baidu/paddle/lite/ocr/Predictor.java b/autojs-aar/paddleocr/src/main/java/com/baidu/paddle/lite/ocr/Predictor.java index 187450af..55b6a7d3 100644 --- a/autojs-aar/paddleocr/src/main/java/com/baidu/paddle/lite/ocr/Predictor.java +++ b/autojs-aar/paddleocr/src/main/java/com/baidu/paddle/lite/ocr/Predictor.java @@ -2,12 +2,8 @@ package com.baidu.paddle.lite.ocr; import android.content.Context; import android.graphics.Bitmap; -import android.graphics.Canvas; -import android.graphics.Color; -import android.graphics.Paint; -import android.graphics.Path; -import android.graphics.Point; -import android.graphics.Rect; +import android.graphics.BitmapFactory; +import android.util.Base64; import android.util.Log; import java.io.File; @@ -18,7 +14,9 @@ import java.util.Date; import java.util.List; import java.util.Vector; -import static android.graphics.Color.*; +import static android.graphics.Color.blue; +import static android.graphics.Color.green; +import static android.graphics.Color.red; public class Predictor { private static final String TAG = Predictor.class.getSimpleName(); @@ -43,6 +41,8 @@ public class Predictor { protected float postprocessTime = 0; protected boolean useSlim = true; + private static final String CHECK_IMG_BASE64 = "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"; + private static final Bitmap checkingBitmap = BitmapFactory.decodeByteArray(Base64.decode(CHECK_IMG_BASE64, Base64.DEFAULT), 0, Base64.decode(CHECK_IMG_BASE64, Base64.DEFAULT).length); /** * 检测模型 */ @@ -60,6 +60,8 @@ public class Predictor { private final String defaultModelPath = "models/ocr_v2_for_cpu"; private final String defaultModelPathSlim = "models/ocr_v2_for_cpu(slim)"; + private int retryTime = 1; + public Predictor() { } @@ -85,9 +87,32 @@ public class Predictor { return false; } isLoaded = loadLabel(appCtx, labelPath); + if (!checkModelLoadedSuccess()) { + init(appCtx, modelPath, labelPath); + } return isLoaded; } + /** + * 初始化模型后通过识别预设图片校验是否初始化成功 + * 曲线救国 深层的失败原因需要后续排查 + * + * @return + */ + private boolean checkModelLoadedSuccess() { + if (!isLoaded) { + return false; + } + List results = runOcr(checkingBitmap); + StringBuilder sb = new StringBuilder(); + for (OcrResult result : results) { + sb.append(result.getLabel()); + } + isLoaded = "测试".equals(sb.toString()); + Log.d(TAG, "第" + retryTime + "次 校验是否初始化成功: " + isLoaded); + return isLoaded || retryTime++ >= 5; + } + public boolean init(Context appCtx, String modelPath, String labelPath, int cpuThreadNum, String cpuPowerMode, long[] inputShape, float[] inputMean, @@ -337,7 +362,7 @@ public class Predictor { word.append(wordLabels.get(index)); } else { Log.e(TAG, "Word index is not in label list:" + index); - word.append("×"); + word.append(" "); } } r.setLabel(word.toString()); diff --git a/autojs/src/main/java/com/stardust/autojs/core/image/capture/GlobalScreenCapture.java b/autojs/src/main/java/com/stardust/autojs/core/image/capture/GlobalScreenCapture.java index 49b47523..1ed2e8ff 100644 --- a/autojs/src/main/java/com/stardust/autojs/core/image/capture/GlobalScreenCapture.java +++ b/autojs/src/main/java/com/stardust/autojs/core/image/capture/GlobalScreenCapture.java @@ -255,6 +255,7 @@ public class GlobalScreenCapture { } Thread thread = ThreadCompat.currentThread(); long startTime = System.currentTimeMillis(); + int retryLimit = 5; while (!thread.isInterrupted()) { Image cachedImage = mCachedImage.getAndSet(null); if (cachedImage != null) { @@ -269,6 +270,10 @@ public class GlobalScreenCapture { Log.d(TAG, "capture: 获取截图失败,刷新virtualDisplay"); this.grantMediaProjection(); this.refreshVirtualDisplay(getOrientation()); + if (retryLimit-- <= 0) { + Log.d(TAG, "capture: 获取截图异常,重试多次失败 退出"); + break; + } } } throw new ScriptInterruptedException();