diff --git a/src/main/java/com/chinaweal/youfool/reportdetect/common/utils/ResourceExtractor.java b/src/main/java/com/chinaweal/youfool/reportdetect/common/utils/ResourceExtractor.java index f1d5b22..c94c9b8 100644 --- a/src/main/java/com/chinaweal/youfool/reportdetect/common/utils/ResourceExtractor.java +++ b/src/main/java/com/chinaweal/youfool/reportdetect/common/utils/ResourceExtractor.java @@ -306,16 +306,34 @@ public class ResourceExtractor { private void extractOcrModels() throws IOException { Path targetDir = Paths.get(modelsDir); + if (!Files.exists(targetDir) || isDirEmpty(targetDir)) { + Path altDir = Paths.get(resourceDir, "models"); + if (!targetDir.toAbsolutePath().equals(altDir.toAbsolutePath())) { + targetDir = altDir; + } + } - if (Files.exists(targetDir.resolve("pp-ocrv5/det_model/inference.onnx"))) { - log.info("[3/4] OCR模型已存在,跳过"); + Path[] essentialModels = { + targetDir.resolve("pp-ocrv5/PP-OCRv5_server_det_onnx/inference.onnx"), + targetDir.resolve("pp-ocrv5/PP-OCRv5_server_rec_onnx/inference.onnx"), + targetDir.resolve("pp-ocrv5/PP-OCRv5_server_cls_onnx/inference.onnx") + }; + boolean allExist = true; + for (Path model : essentialModels) { + if (!Files.exists(model)) { + allExist = false; + break; + } + } + if (allExist) { + log.info("[3/4] OCR????????"); return; } - log.info("[3/4] 提取OCR模型..."); + log.info("[3/4] ??OCR??..."); Files.createDirectories(targetDir); copyDirectoryFromClasspath("models", targetDir); - log.info(" ✓ 完成"); + log.info(" ??"); } private void copyDirectoryFromClasspath(String resourcePath, Path targetDir) throws IOException { @@ -470,6 +488,16 @@ public class ResourceExtractor { } } + private boolean isDirEmpty(Path dir) throws IOException { + if (!Files.isDirectory(dir)) { + return true; + } + try (java.nio.file.DirectoryStream stream = Files.newDirectoryStream(dir)) { + return !stream.iterator().hasNext(); + } + } + + private void normalizeVenvDir(Path parentDir, Path expectedDir) throws IOException { if (Files.isDirectory(expectedDir)) { return; diff --git a/src/main/java/com/chinaweal/youfool/reportdetect/modules/ocr/engine/FlaskProcessManager.java b/src/main/java/com/chinaweal/youfool/reportdetect/modules/ocr/engine/FlaskProcessManager.java index 601e52b..3cc8f05 100644 --- a/src/main/java/com/chinaweal/youfool/reportdetect/modules/ocr/engine/FlaskProcessManager.java +++ b/src/main/java/com/chinaweal/youfool/reportdetect/modules/ocr/engine/FlaskProcessManager.java @@ -171,6 +171,10 @@ public class FlaskProcessManager implements ApplicationListener stream = Files.newDirectoryStream(dir)) { + return !stream.iterator().hasNext(); + } catch (IOException e) { + return true; + } + } + private Path resolveEmbeddedVenvRoot() { Path venv = Paths.get(resourceDir, "python-runtime/venv-offline"); if (Files.isDirectory(venv)) {