From 81231ae486db150b2cdcbe6641057cdb23e26a83 Mon Sep 17 00:00:00 2001 From: Kilian Schuettler Date: Tue, 7 May 2024 15:39:35 +0200 Subject: [PATCH] akra-certificate: change column detector slightly * introduce settings --- .../processor/LayoutParsingPipeline.java | 39 +++++++++++++------ .../processor/LayoutparserSettings.java | 20 ++++++++++ .../docstrum/model/ColumnDetector.java | 5 ++- .../visualization/LayoutGridService.java | 2 +- 4 files changed, 52 insertions(+), 14 deletions(-) create mode 100644 layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/LayoutparserSettings.java diff --git a/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/LayoutParsingPipeline.java b/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/LayoutParsingPipeline.java index 6db3724..357a530 100644 --- a/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/LayoutParsingPipeline.java +++ b/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/LayoutParsingPipeline.java @@ -96,6 +96,7 @@ public class LayoutParsingPipeline { VisualLayoutParsingAdapter visualLayoutParsingAdapter; ClarifyndClassificationService clarifyndClassificationService; GraphicExtractorService graphicExtractorService; + LayoutparserSettings settings; public LayoutParsingFinishedEvent parseLayoutAndSaveFilesToStorage(LayoutParsingRequest layoutParsingRequest) throws IOException { @@ -104,24 +105,32 @@ public class LayoutParsingPipeline { log.info("Starting layout parsing for {}", layoutParsingRequest.identifier()); File originFile = layoutParsingStorageService.getOriginFile(layoutParsingRequest.originFileStorageId()); - File viewerDocumentFile = layoutParsingStorageService.getViewerDocFile(layoutParsingRequest.viewerDocumentStorageId()).orElse(originFile); + File viewerDocumentFile = layoutParsingStorageService.getViewerDocFile(layoutParsingRequest.viewerDocumentStorageId()) + .orElse(originFile); VisualLayoutParsingResponse visualLayoutParsingResponse = new VisualLayoutParsingResponse(); - if (layoutParsingRequest.visualLayoutParsingFileId().isPresent()) { - visualLayoutParsingResponse = layoutParsingStorageService.getVisualLayoutParsingFile(layoutParsingRequest.visualLayoutParsingFileId().get()); + if (layoutParsingRequest.visualLayoutParsingFileId() + .isPresent()) { + visualLayoutParsingResponse = layoutParsingStorageService.getVisualLayoutParsingFile(layoutParsingRequest.visualLayoutParsingFileId() + .get()); } ImageServiceResponse imageServiceResponse = new ImageServiceResponse(); - if (layoutParsingRequest.imagesFileStorageId().isPresent()) { - imageServiceResponse = layoutParsingStorageService.getImagesFile(layoutParsingRequest.imagesFileStorageId().get()); + if (layoutParsingRequest.imagesFileStorageId() + .isPresent()) { + imageServiceResponse = layoutParsingStorageService.getImagesFile(layoutParsingRequest.imagesFileStorageId() + .get()); } TableServiceResponse tableServiceResponse = new TableServiceResponse(); - if (layoutParsingRequest.tablesFileStorageId().isPresent()) { - tableServiceResponse = layoutParsingStorageService.getTablesFile(layoutParsingRequest.tablesFileStorageId().get()); + if (layoutParsingRequest.tablesFileStorageId() + .isPresent()) { + tableServiceResponse = layoutParsingStorageService.getTablesFile(layoutParsingRequest.tablesFileStorageId() + .get()); } - ClassificationDocument classificationDocument = parseLayout(LayoutParsingType.CLARIFYND_PARAGRAPH_DEBUG, + ClassificationDocument classificationDocument = parseLayout(settings.getLayoutParsingTypeOverride() == null // + ? layoutParsingRequest.layoutParsingType() : settings.getLayoutParsingTypeOverride(), originFile, imageServiceResponse, tableServiceResponse, @@ -130,11 +139,17 @@ public class LayoutParsingPipeline { log.info("Building document graph for {}", layoutParsingRequest.identifier()); - Document documentGraph = observeBuildDocumentGraph(LayoutParsingType.CLARIFYND_PARAGRAPH_DEBUG, classificationDocument); + Document documentGraph = observeBuildDocumentGraph(settings.getLayoutParsingTypeOverride() == null // + ? layoutParsingRequest.layoutParsingType() : settings.getLayoutParsingTypeOverride(), classificationDocument); log.info("Creating viewer document for {}", layoutParsingRequest.identifier()); - layoutGridService.addLayoutGrid(viewerDocumentFile, documentGraph, viewerDocumentFile, false, layoutParsingRequest.visualLayoutParsingFileId().isPresent()); + layoutGridService.addLayoutGrid(viewerDocumentFile, + documentGraph, + viewerDocumentFile, + false, + layoutParsingRequest.visualLayoutParsingFileId() + .isPresent()); log.info("Storing resulting files for {}", layoutParsingRequest.identifier()); @@ -224,7 +239,9 @@ public class LayoutParsingPipeline { Map> signatures = visualLayoutParsingAdapter.buildExtractedSignaturesPerPage(visualLayoutParsingResponse); ClassificationDocument classificationDocument = new ClassificationDocument(); - classificationDocument.getVisualizations().setActive(identifier.containsKey("debug")); + if (settings.isDebug() || identifier.containsKey("debug")) { + classificationDocument.getVisualizations().setActive(true); + } List classificationPages = new ArrayList<>(); diff --git a/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/LayoutparserSettings.java b/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/LayoutparserSettings.java new file mode 100644 index 0000000..e64c8bd --- /dev/null +++ b/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/LayoutparserSettings.java @@ -0,0 +1,20 @@ +package com.knecon.fforesight.service.layoutparser.processor; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; + +import com.knecon.fforesight.service.layoutparser.internal.api.queue.LayoutParsingType; + +import lombok.AccessLevel; +import lombok.Data; +import lombok.experimental.FieldDefaults; + +@Data +@Configuration +@ConfigurationProperties("layoutparser") +@FieldDefaults(level = AccessLevel.PRIVATE) +public class LayoutparserSettings { + + boolean debug; + LayoutParsingType layoutParsingTypeOverride; +} diff --git a/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/docstrum/model/ColumnDetector.java b/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/docstrum/model/ColumnDetector.java index de3f2ec..cb8da06 100644 --- a/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/docstrum/model/ColumnDetector.java +++ b/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/docstrum/model/ColumnDetector.java @@ -16,6 +16,7 @@ public class ColumnDetector { final static int globalEndIdx = bins_num; // i chose 7, since thirds seems a likely split for columns, therefore divided by 6 would eliminate those. public static final double DERIVATIVE_ZERO_THRESHOLD = 1e-10; public static final double MINIMUM_THRESHOLD_FOR_COLUMNS = 0.05; + public static final double NEAR_GLOBAL_THRESHOLD = 0.5; double minY; double maxY; double midY; @@ -237,10 +238,10 @@ public class ColumnDetector { List nearGlobalDvMaximaIdx = new LinkedList<>(); List nearGlobalDvMinimaIdx = new LinkedList<>(); for (int i = globalStartIdx; i < globalEndIdx; i++) { - if (derivative[i] <= minDvValue * 0.8) { + if (derivative[i] <= minDvValue * NEAR_GLOBAL_THRESHOLD) { nearGlobalDvMinimaIdx.add(i); } - if (derivative[i] >= maxDvValue * 0.8) { + if (derivative[i] >= maxDvValue * NEAR_GLOBAL_THRESHOLD) { nearGlobalDvMaximaIdx.add(i); } } diff --git a/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/services/visualization/LayoutGridService.java b/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/services/visualization/LayoutGridService.java index e0fe7cd..4cdc5bc 100644 --- a/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/services/visualization/LayoutGridService.java +++ b/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/services/visualization/LayoutGridService.java @@ -68,7 +68,7 @@ public class LayoutGridService { public void addLayoutGrid(File originFile, Document document, File destinationFile, boolean layerVisibilityDefaultValue, boolean writeVisualLayoutParsingGrid) { List allVisualizations; - Visualizations layoutGrid = this.addLayoutGrid(document, true, false); + Visualizations layoutGrid = this.addLayoutGrid(document, layerVisibilityDefaultValue, false); if (writeVisualLayoutParsingGrid) { Visualizations visualLayoutGrid = this.addLayoutGrid(document, layerVisibilityDefaultValue, true); allVisualizations = Stream.concat(Stream.of(layoutGrid, visualLayoutGrid), document.getVisualizations().streamAll())