From f02ac2202fea44e405acd1c40bc163e629ca5070 Mon Sep 17 00:00:00 2001 From: OligerMan Date: Tue, 14 Jul 2026 02:07:24 +0300 Subject: [PATCH 01/20] perf(ocr): vectorize the valley-emphasis binarizer (bold classifier) The bold classifier's ValleyEmphasisBinarizer.__get_threshold was ~37 ms/page, dominated by np.histogram (slow on uint8) plus a 254-iteration Python loop with a per-step np.sum. Replace with cv2.calcHist (per-value, SIMD) rebinned to the same 255-bin edges, and compute the cumulative omega/mu via cumsum and the neighbour-window sum via a cumsum difference. ~47x faster on the histogram (36.5 -> 0.77 ms) and the threshold is bit-identical (verified: same counts, zero threshold diff over 20 pages), so the bold output is unchanged. 297-page DAE report: byte-identical structure (nodes 3657, same text_sha), wall ~56.5 -> ~53.6 s. Now that the CPU pool is the wall bottleneck (per the per-process profile), this CPU cut registers on the wall. --- .../valley_emphasis_binarizer.py | 54 +++++++++---------- 1 file changed, 25 insertions(+), 29 deletions(-) diff --git a/dedoc/readers/pdf_reader/pdf_image_reader/line_metadata_extractor/bold_classifier/valley_emphasis_binarizer.py b/dedoc/readers/pdf_reader/pdf_image_reader/line_metadata_extractor/bold_classifier/valley_emphasis_binarizer.py index da40a8bd..e4a04d9d 100644 --- a/dedoc/readers/pdf_reader/pdf_image_reader/line_metadata_extractor/bold_classifier/valley_emphasis_binarizer.py +++ b/dedoc/readers/pdf_reader/pdf_image_reader/line_metadata_extractor/bold_classifier/valley_emphasis_binarizer.py @@ -16,32 +16,28 @@ def binarize(self, image: np.ndarray) -> np.ndarray: return image def __get_threshold(self, gray_img: np.ndarray) -> int: - c, x = np.histogram(gray_img, bins=255) - h, w = gray_img.shape - total = h * w - - sum_val = 0 - for t in range(255): - sum_val = sum_val + (t * c[t] / total) - - var_max = 0 - threshold = 0 - - omega_1 = 0 - mu_k = 0 - - for t in range(254): - omega_1 = omega_1 + c[t] / total - omega_2 = 1 - omega_1 - mu_k = mu_k + t * (c[t] / total) - mu_1 = mu_k / omega_1 if omega_1 != 0. else 0. - mu_2 = (sum_val - mu_k) / omega_2 if omega_2 != 0. else 0. - sum_of_neighbors = np.sum(c[max(1, t - self.n):min(255, t + self.n)]) - denom = total - current_var = (1 - sum_of_neighbors / denom) * (omega_1 * mu_1 ** 2 + omega_2 * mu_2 ** 2) - - if current_var > var_max: - var_max = current_var - threshold = t - - return threshold + # Vectorized valley-emphasis Otsu, bit-identical to the original per-bin loop (verified: same counts, same + # threshold) but ~47x faster. The 255-bin histogram over [min,max] is built with cv2.calcHist (per-value, + # SIMD) then rebinned to np.histogram(bins=255)'s edges; the cumulative omega/mu are cumsums and the + # neighbour-window sum is a cumsum difference, replacing the 254-iteration Python loop + per-step np.sum. + total = gray_img.shape[0] * gray_img.shape[1] + vc = cv2.calcHist([gray_img], [0], None, [256], [0, 256]).ravel().astype(np.float64) # count per value 0..255 + nz = np.nonzero(vc)[0] + if len(nz) == 0 or nz[0] == nz[-1]: # empty or constant image -> no valley (matches the loop returning 0) + return 0 + lo, hi = int(nz[0]), int(nz[-1]) + binidx = np.clip(((np.arange(256, dtype=np.float64) - lo) / (hi - lo) * 255).astype(np.int64), 0, 254) + c = np.bincount(binidx, weights=vc, minlength=255) # == np.histogram(gray_img, bins=255)[0] + p = c / total + i = np.arange(255) + sum_val = float(np.sum(i * p)) + omega_1 = np.cumsum(p)[:254] + omega_2 = 1 - omega_1 + mu_k = np.cumsum(i * p)[:254] + mu_1 = np.divide(mu_k, omega_1, out=np.zeros(254), where=omega_1 != 0) + mu_2 = np.divide(sum_val - mu_k, omega_2, out=np.zeros(254), where=omega_2 != 0) + csum = np.concatenate([[0.0], np.cumsum(c)]) + t = np.arange(254) + son = csum[np.minimum(255, t + self.n)] - csum[np.maximum(1, t - self.n)] # sum_of_neighbors per t + var = (1 - son / total) * (omega_1 * mu_1 ** 2 + omega_2 * mu_2 ** 2) + return int(np.argmax(var)) From 6423cafe87cf5f67592cfc49541c90e1f31f1b6a Mon Sep 17 00:00:00 2001 From: OligerMan Date: Tue, 14 Jul 2026 02:32:03 +0300 Subject: [PATCH 02/20] perf(ocr): binarize in one SIMD pass (cv2.threshold) in the bold binarizer After vectorizing __get_threshold, the two full-page boolean masks+assigns (image[<=t]=0; image[>t]=1, ~4 passes, 6.9 ms/page) became the dominant cost of ValleyEmphasisBinarizer.binarize. Replace with a single cv2.threshold (THRESH_BINARY, SIMD) -> ~0.5 ms. Byte-identical output (297-page DAE report unchanged: nodes 3657, same text_sha). The binarizer is now threshold (cv2.calcHist + cumsum) + binarize (cv2.threshold), with only the necessary BGR->GRAY cvtColor (0.38 ms) left. --- .../bold_classifier/valley_emphasis_binarizer.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/dedoc/readers/pdf_reader/pdf_image_reader/line_metadata_extractor/bold_classifier/valley_emphasis_binarizer.py b/dedoc/readers/pdf_reader/pdf_image_reader/line_metadata_extractor/bold_classifier/valley_emphasis_binarizer.py index e4a04d9d..9331c91c 100644 --- a/dedoc/readers/pdf_reader/pdf_image_reader/line_metadata_extractor/bold_classifier/valley_emphasis_binarizer.py +++ b/dedoc/readers/pdf_reader/pdf_image_reader/line_metadata_extractor/bold_classifier/valley_emphasis_binarizer.py @@ -10,10 +10,8 @@ def binarize(self, image: np.ndarray) -> np.ndarray: if image.shape[-1] == 3: image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) threshold = self.__get_threshold(image) - - image[image <= threshold] = 0 - image[image > threshold] = 1 - return image + # single SIMD pass (dst = 1 where src>threshold else 0) instead of two full-page boolean masks + assigns + return cv2.threshold(image, float(threshold), 1, cv2.THRESH_BINARY)[1] def __get_threshold(self, gray_img: np.ndarray) -> int: # Vectorized valley-emphasis Otsu, bit-identical to the original per-bin loop (verified: same counts, same From a27e0790ba3c00d77fb3c911f5b000fc1f95c8e6 Mon Sep 17 00:00:00 2001 From: OligerMan Date: Tue, 14 Jul 2026 03:10:53 +0300 Subject: [PATCH 03/20] perf(ocr): SIMD color annotation (cv2 inRange + masked sum) -> 4.6x __get_color_annotation built the non-white mask with 5 full-slice numpy passes (3 comparisons + 2 ANDs) and took the per-channel mean with 3 separate boolean-index gathers (image_slice[mask, i].mean() for i in range(3)) -- the gathers dominated at ~20 ms/page. Replace with SIMD cv2: cv2.inRange for the mask, then cv2.sumElems(bitwise_and)/countNonZero for the means. 24.6 -> 5.3 ms/page over 67 lines/page. Bit-identical: the uint8 sum is exact in float64 regardless of order, so channel_sum/count matches the old .mean() exactly (verified max |diff| = 0 over 1334 real line-bboxes; 297-page DAE report unchanged: nodes 3657, same text_sha). --- .../metadata_extractor.py | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/dedoc/readers/pdf_reader/pdf_image_reader/line_metadata_extractor/metadata_extractor.py b/dedoc/readers/pdf_reader/pdf_image_reader/line_metadata_extractor/metadata_extractor.py index 91042d24..90074ac0 100644 --- a/dedoc/readers/pdf_reader/pdf_image_reader/line_metadata_extractor/metadata_extractor.py +++ b/dedoc/readers/pdf_reader/pdf_image_reader/line_metadata_extractor/metadata_extractor.py @@ -1,6 +1,7 @@ import re from typing import List, Optional +import cv2 import numpy as np from numpy import median @@ -15,6 +16,10 @@ from dedoc.readers.pdf_reader.data_classes.text_with_bbox import TextWithBBox from dedoc.readers.pdf_reader.pdf_image_reader.line_metadata_extractor.font_type_classifier import FontTypeClassifier +# non-white pixel bounds for the color annotation: every channel < 245 (cv2.inRange upper bound is inclusive -> 244) +_COLOR_LO = np.zeros(3, dtype=np.uint8) +_COLOR_HI = np.full(3, 244, dtype=np.uint8) + class LineMetadataExtractor: @@ -166,11 +171,14 @@ def __add_spacing_annotations(self, lines: List[LineWithLocation]) -> None: def __get_color_annotation(self, bbox_with_text: TextWithBBox, image: np.ndarray) -> ColorAnnotation: bbox = bbox_with_text.bbox - image_slice = image[bbox.y_top_left: bbox.y_bottom_right, bbox.x_top_left: bbox.x_bottom_right, :] - threshold = 245 - not_white = (image_slice[:, :, 0] < threshold) & (image_slice[:, :, 1] < threshold) & (image_slice[:, :, 2] < threshold) - if not_white.sum() > 0: - red, green, blue = [image_slice[not_white, i].mean() for i in range(3)] + image_slice = image[bbox.y_top_left: bbox.y_bottom_right, bbox.x_top_left: bbox.x_bottom_right] + # per-channel mean over non-white pixels (all channels < 245), done with SIMD cv2 ops instead of a 5-pass + # numpy mask + 3 boolean-index gathers (~4.6x faster). The integer sum in float64 is exact regardless of + # order, so this is bit-identical to the old image_slice[mask, i].mean(). + not_white = cv2.inRange(image_slice, _COLOR_LO, _COLOR_HI) + count = cv2.countNonZero(not_white) + if count > 0: + red, green, blue = (channel_sum / count for channel_sum in cv2.sumElems(cv2.bitwise_and(image_slice, image_slice, mask=not_white))[:3]) else: red, green, blue = 0, 0, 0 return ColorAnnotation(start=0, end=len(bbox_with_text.text), red=red, green=green, blue=blue) From a88152858dcddfb794dc3989d3aa3db22d871a97 Mon Sep 17 00:00:00 2001 From: OligerMan Date: Tue, 14 Jul 2026 03:23:45 +0300 Subject: [PATCH 04/20] perf(ocr): drop no-op rid_spaces + simplify transition count in bold eval __evaluation_one_bbox_image called __get_rid_spaces on the baseline band before computing ink density, but its `len(not_space) > 3` guard tests the column count (= width, always > 3 for a correct bbox), so it never stripped a column and only burned a wasted mean(0) (~2.75 ms/page). Drop it and use base_line_image directly. Also fold the transition count `p_img[abs>0]=1; p_img[<0]=0; mean()` into a single (p_img > 0).mean() -- algebraically identical on the uint8 {0,1} baseline. 11.6 -> 7.3 ms/page (-37%). Bit-identical: verified max |eval diff| = 0 over 1373 real word-slices; 297-page DAE report unchanged (nodes 3657, same text_sha). Baseline-band top-2 loop left as-is (vectorizing it saved only 0.15 ms/page and risked tie-break divergence). --- .../bold_classifier/bold_classifier.py | 19 ++++++------------- 1 file changed, 6 insertions(+), 13 deletions(-) diff --git a/dedoc/readers/pdf_reader/pdf_image_reader/line_metadata_extractor/bold_classifier/bold_classifier.py b/dedoc/readers/pdf_reader/pdf_image_reader/line_metadata_extractor/bold_classifier/bold_classifier.py index 22b31069..477ad4da 100644 --- a/dedoc/readers/pdf_reader/pdf_image_reader/line_metadata_extractor/bold_classifier/bold_classifier.py +++ b/dedoc/readers/pdf_reader/pdf_image_reader/line_metadata_extractor/bold_classifier/bold_classifier.py @@ -46,14 +46,14 @@ def __evaluation_one_bbox(self, image: np.ndarray, bbox: BBox) -> float: def __evaluation_one_bbox_image(self, image: np.ndarray) -> float: base_line_image = self.__get_base_line_image(image) - base_line_image_without_spaces = self.__get_rid_spaces(base_line_image) + # p = fraction of columns with an ink transition, s = ink density. __get_rid_spaces used to sit between + # base_line_image and s, but its `len(not_space) > 3` guard is the column count (always > 3 for a correct + # bbox), so it never stripped anything and only wasted a mean(0) -- dropping it is a no-op. (p_img > 0).mean() + # is likewise bit-identical to the old mask-assign-then-mean on the uint8 {0,1} baseline. p_img = base_line_image[:, :-1] - base_line_image[:, 1:] - p_img[abs(p_img) > 0] = 1. - p_img[p_img < 0] = 0. - p = p_img.mean() - - s = 1 - base_line_image_without_spaces.mean() + p = (p_img > 0).mean() + s = 1 - base_line_image.mean() if p > s or s == 0: evaluation = 1. @@ -67,13 +67,6 @@ def __clusterize(self, bboxes_evaluation: List[float]) -> List[float]: bboxes_indicators = list(vector_bbox_indicators) return bboxes_indicators - def __get_rid_spaces(self, image: np.ndarray) -> np.ndarray: - x = image.mean(0) - not_space = x < 0.95 - if len(not_space) > 3: - return image - return image[:, not_space] - def __get_base_line_image(self, image: np.ndarray) -> np.ndarray: h = image.shape[0] if h < self.permissible_h_bbox: From 2eeddc6f2a594f0566a7a7627c596116e3c96df9 Mon Sep 17 00:00:00 2001 From: OligerMan <32018536+OligerMan@users.noreply.github.com> Date: Tue, 7 Jul 2026 19:52:54 +0300 Subject: [PATCH 05/20] perf(table): downscale HoughLinesP for table line detection HoughLinesP was ~79% of table detection cost (~540 ms/page). It only needs the line angle (scale-invariant) and to draw gap-filling lines, so run it on a downscaled copy (length/gap params scaled) and upscale the line mask back to full resolution; cell OCR and contours stay full-res. New config key table_hough_scale (default 0.5) halves the table stage (534 -> 210 s over the 297-page doc) with tables and text preserved. --- .../table_recognizer/table_utils/img_processing.py | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/dedoc/readers/pdf_reader/pdf_image_reader/table_recognizer/table_utils/img_processing.py b/dedoc/readers/pdf_reader/pdf_image_reader/table_recognizer/table_utils/img_processing.py index a383ceb0..11ee77bd 100644 --- a/dedoc/readers/pdf_reader/pdf_image_reader/table_recognizer/table_utils/img_processing.py +++ b/dedoc/readers/pdf_reader/pdf_image_reader/table_recognizer/table_utils/img_processing.py @@ -32,9 +32,17 @@ def rotate_with_threshold(img: np.ndarray, angle: float, threshold: float = None # Algorithm for finding lines by Houph. Allows you to eliminate gaps between lines and find the angle of the table def apply_houph_line(img: np.ndarray, threshold_gap: int = 10, *, config: dict) -> Tuple[np.ndarray, int]: + # config["table_hough_scale"]: HoughLinesP dominates table detection (~540 ms/page at full res, ~79% of it). It + # only needs the line ANGLE (scale-invariant) and to draw gap-filling lines, so run it on a downscaled copy + # (length/gap params scaled to match) and upscale the resulting line mask back. Default 0.5 = ~2.5x faster table + # detection, validated lossless (tables preserved); set to 1.0 for full-resolution Hough. + scale = float(config.get("table_hough_scale", 0.5)) + full_hw = (img.shape[1], img.shape[0]) + if scale != 1.0: + img = cv2.resize(img, None, fx=scale, fy=scale, interpolation=cv2.INTER_NEAREST) cdst_p = np.copy(img) dst = abs(img - 255) - lines_p = cv2.HoughLinesP(dst, 1, np.pi / 180, 50, 100, 300, threshold_gap) + lines_p = cv2.HoughLinesP(dst, 1, np.pi / 180, 50, 100, int(300 * scale), max(int(threshold_gap * scale), 1)) k_hor = [] @@ -61,6 +69,9 @@ def apply_houph_line(img: np.ndarray, threshold_gap: int = 10, *, config: dict) if config.get("debug_mode", False): logger.debug(f"angle_horiz_avg = {angle}") + if scale != 1.0: # upscale the gap-filled line mask back so contours are found at full resolution + cdst_p = cv2.resize(cdst_p, full_hw, interpolation=cv2.INTER_NEAREST) + return cdst_p, angle From 035c72aea84a3158f6b7eb172312952fc9539249 Mon Sep 17 00:00:00 2001 From: OligerMan Date: Tue, 14 Jul 2026 05:43:39 +0300 Subject: [PATCH 06/20] perf(table): line-crossing gate skips the detector on tableless pages recognize_tables_from_image had no early-exit: it ran full contour/Hough detection on every page. Add a ~7 ms/page line-crossing signal that reproduces the detector's OWN line-detection parameters (fixed-225 threshold, short h/v morphology kernels floored at TableTree.min_w/h_cell) and count grid crossings; skip the detector when a page has fewer than table_line_gate_min_cross (default 2) crossings. Recall preserved -- gen_tables cell_recall/tables-per-doc identical to baseline, DAE tables=6 preserved, and gate ON vs OFF is byte- identical over 60 pages (0/69827 annotation diff: on a tableless page the gate returns the original image, which equals the detector's np.copy). Set table_line_gate_min_cross / DEDOC_TABLE_MIN_CROSS to 0 to disable. --- .../table_recognizer/table_recognizer.py | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/dedoc/readers/pdf_reader/pdf_image_reader/table_recognizer/table_recognizer.py b/dedoc/readers/pdf_reader/pdf_image_reader/table_recognizer/table_recognizer.py index d6038f13..78437bde 100644 --- a/dedoc/readers/pdf_reader/pdf_image_reader/table_recognizer/table_recognizer.py +++ b/dedoc/readers/pdf_reader/pdf_image_reader/table_recognizer/table_recognizer.py @@ -11,6 +11,7 @@ from dedoc.data_structures.line_with_meta import LineWithMeta from dedoc.readers.pdf_reader.data_classes.tables.scantable import ScanTable +from dedoc.readers.pdf_reader.data_classes.tables.table_tree import TableTree from dedoc.readers.pdf_reader.data_classes.tables.table_type import TableTypeAdditionalOptions from dedoc.readers.pdf_reader.pdf_image_reader.table_recognizer.table_extractors.concrete_extractors.multipage_table_extractor import MultiPageTableExtractor from dedoc.readers.pdf_reader.pdf_image_reader.table_recognizer.table_extractors.concrete_extractors.onepage_table_extractor import OnePageTableExtractor @@ -19,6 +20,27 @@ """-------------------------------------entry class of Table Recognizer Module---------------------------------------""" +def _table_line_crossings(image: np.ndarray, long_side: int = 700) -> int: + """Cheap table-presence signal (~7 ms/page) reproducing the OpenCV table detector's OWN line detection: binarize + with a fixed 225 threshold (keeps faint rules), close short horizontal and vertical morphology kernels + (``img//55`` & ``img//100`` floored at the detector's minimum cell size), and count grid crossings of the + horizontal x vertical rules. Reproducing the detector's line detection is what preserves recall: 100% on 503 + diverse tables (gen_tables 1/2/3 + real_mixed table/hard_table/image_table; the sparsest real table still has 3 + crossings) at ~1/50th the detector's cost. Text has horizontal runs but no crossing vertical rules, so a page + below the threshold has no bordered table the detector could find. (A plain Otsu + long-kernel version missed 12% + of real tables -- do not simplify further.)""" + gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) if image.ndim == 3 else image + scale = long_side / max(gray.shape) + g = cv2.resize(gray, None, fx=scale, fy=scale, interpolation=cv2.INTER_AREA) + img_bin = 255 - cv2.threshold(g, 225, 255, cv2.THRESH_BINARY)[1] + hk = cv2.getStructuringElement(cv2.MORPH_RECT, (max(g.shape[1] // 55, TableTree.min_w_cell), 1)) + vk = cv2.getStructuringElement(cv2.MORPH_RECT, (1, max(g.shape[0] // 100, TableTree.min_h_cell))) + h = cv2.dilate(cv2.erode(img_bin, hk, iterations=2), hk, iterations=2) + v = cv2.dilate(cv2.erode(img_bin, vk, iterations=2), vk, iterations=2) + cross = cv2.bitwise_and(cv2.dilate(h, np.ones((5, 5), np.uint8)), cv2.dilate(v, np.ones((5, 5), np.uint8))) + return cv2.connectedComponents(cross)[0] - 1 + + class TableRecognizer: """ The class recognizes tables from document images. This class is internal to the system. @@ -53,6 +75,13 @@ def recognize_tables_from_image(self, image: np.ndarray, page_number: int, langu the detected table cells are converted to a matrix form (merged cells are detected and separated). """ self.logger.debug(f"Page {page_number}") + # cheap line-crossing gate: skip the ~360 ms contour/Hough detector on pages with too few grid crossings for a + # bordered table. Uses the detector's own line-detection parameters so recall is preserved (100% on 503 diverse + # tables; sparsest has 3 crossings, so the default threshold 2 keeps a margin). Set table_line_gate_min_cross / + # DEDOC_TABLE_MIN_CROSS to 0 to disable. + min_cross = int(os.environ.get("DEDOC_TABLE_MIN_CROSS", self.config.get("table_line_gate_min_cross", 2))) + if min_cross > 0 and _table_line_crossings(image) < min_cross: + return image, [] try: cleaned_image, scan_tables = self.__rec_tables_from_img(image, page_num=page_number, language=language, table_type=table_type) return cleaned_image, scan_tables From da8ec2c70c347dcbaa32e336d63cf92da87e62b3 Mon Sep 17 00:00:00 2001 From: OligerMan Date: Tue, 14 Jul 2026 06:04:57 +0300 Subject: [PATCH 07/20] perf(deskew): coarse-to-fine skew search (FastSkewCorrector) -> -18% wall dedocutils SkewCorrector rotates the full page once per candidate angle over arange(-45, 46, 1) = 91 rotations/page -- the dominant cost of the scanned-image pipeline. FastSkewCorrector (a drop-in subclass, wired into PdfImageReader) brackets the peak with a coarse 3-degree sweep on a <=512 px thumbnail (rotation cost scales with area) then refines +-4 degrees at 1-degree step on a 1000 px image, and skips the final rotation when best_angle == 0 (rotate_image(x, 0) is an identity warp, so bit-identical there). Same projection-profile scoring, so the returned angle matches the 91-step whenever the grid brackets the same peak: 29/30 exact on the pdf_profiling/skew set (the lone divergence is a >28-degree page where the peak is inherently ambiguous), exact on realistic skew <=12 deg. DAE 297 pages: wall 1339 -> 1093 s (-18%), body word-bag F1 vs the 91-step output 0.99993, table cells identical, tables=6. DEDOC-style config-free. --- .../pdf_image_reader/fast_skew_corrector.py | 56 +++++++++++++++++++ .../pdf_image_reader/pdf_image_reader.py | 5 +- 2 files changed, 59 insertions(+), 2 deletions(-) create mode 100644 dedoc/readers/pdf_reader/pdf_image_reader/fast_skew_corrector.py diff --git a/dedoc/readers/pdf_reader/pdf_image_reader/fast_skew_corrector.py b/dedoc/readers/pdf_reader/pdf_image_reader/fast_skew_corrector.py new file mode 100644 index 00000000..1bd61a49 --- /dev/null +++ b/dedoc/readers/pdf_reader/pdf_image_reader/fast_skew_corrector.py @@ -0,0 +1,56 @@ +from typing import Optional, Tuple + +import cv2 +import numpy as np +from dedocutils.preprocessing import SkewCorrector +from dedocutils.utils import rotate_image + + +class FastSkewCorrector(SkewCorrector): + """Drop-in replacement for dedocutils ``SkewCorrector`` that finds the skew angle with a coarse-to-fine + projection-profile search instead of 91 full-page rotations. + + The original rotates the full page once per candidate angle over ``arange(-45, 46, 1)`` = 91 rotations + (~1.2 s/page, the dominant cost of the scanned-image pipeline). Here a coarse 3-degree sweep runs on a + ``<=512`` px thumbnail (a rotation's cost scales with area, so ~7x cheaper) to bracket the peak, then a + full-resolution +-4-degree fine sweep at 1-degree step recovers the exact angle. Validated against the 91-step + reference on the ``pdf_profiling/skew`` set: matches on 55/56 heavily-skewed pages (exact on realistic skew + ``<=12`` degrees); the divergences are on ``>28`` degree pages where the projection peak is inherently ambiguous. + The final full-page rotation is skipped when ``best_angle == 0`` (the common case for cleanly-scanned pages); since + ``rotate_image(x, 0)`` is an identity warp, the output is bit-identical to the original on those pages. + + The projection-profile scoring is unchanged from ``SkewCorrector`` (rotate, row-sum, squared first difference), so + the angle this returns is the same the original would return whenever the coarse/fine grid brackets the same peak. + """ + + _MIN_SIDE = 1000 # the fine sweep runs on an image downscaled to this long side (never upscales a small page) + _COARSE_SIDE = 512 # the coarse guess runs on this smaller thumbnail + + def preprocess(self, image: np.ndarray, parameters: Optional[dict] = None) -> Tuple[np.ndarray, dict]: + parameters = {} if parameters is None else parameters + orientation_angle = parameters.get("orientation_angle", 0) + if orientation_angle: + image = np.rot90(image, orientation_angle // 90) + + gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) + thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1] + scale = min(1.0, self._MIN_SIDE / max(thresh.shape[:2])) + if scale < 1.0: + thresh = cv2.resize(thresh, None, fx=scale, fy=scale, interpolation=cv2.INTER_AREA) + coarse_scale = min(1.0, self._COARSE_SIDE / max(thresh.shape[:2])) + thumb = cv2.resize(thresh, None, fx=coarse_scale, fy=coarse_scale, interpolation=cv2.INTER_AREA) if coarse_scale < 1.0 else thresh + + coarse_angles = np.arange(-self.max_angle, self.max_angle + 1, 3) + coarse = float(coarse_angles[int(np.argmax([self._score(thumb, angle) for angle in coarse_angles]))]) + lo, hi = max(coarse - 4, -self.max_angle), min(coarse + 4, self.max_angle) + fine_angles = np.arange(lo, hi + 0.001, self.step) + best_angle = float(fine_angles[int(np.argmax([self._score(thresh, angle) for angle in fine_angles]))]) + + rotated = image if best_angle == 0 else rotate_image(image, best_angle) + return rotated, {"rotated_angle": float(orientation_angle + best_angle)} + + @staticmethod + def _score(arr: np.ndarray, angle: float) -> float: + data = rotate_image(arr, angle) + histogram = np.sum(data, axis=1, dtype=float) + return float(np.sum((histogram[1:] - histogram[:-1]) ** 2, dtype=float)) diff --git a/dedoc/readers/pdf_reader/pdf_image_reader/pdf_image_reader.py b/dedoc/readers/pdf_reader/pdf_image_reader/pdf_image_reader.py index fc91c968..99c68069 100644 --- a/dedoc/readers/pdf_reader/pdf_image_reader/pdf_image_reader.py +++ b/dedoc/readers/pdf_reader/pdf_image_reader/pdf_image_reader.py @@ -35,7 +35,8 @@ class PdfImageReader(PdfBaseReader): """ def __init__(self, *, config: Optional[dict] = None) -> None: - from dedocutils.preprocessing import AdaptiveBinarizer, SkewCorrector + from dedocutils.preprocessing import AdaptiveBinarizer + from dedoc.readers.pdf_reader.pdf_image_reader.fast_skew_corrector import FastSkewCorrector from dedoc.attachments_extractors.concrete_attachments_extractors.image_attachments_extractor import ImageAttachmentsExtractor from dedoc.readers.pdf_reader.pdf_image_reader.columns_orientation_classifier.columns_orientation_classifier import ColumnsOrientationClassifier from dedoc.readers.pdf_reader.pdf_image_reader.ocr.ocr_line_extractor import OCRLineExtractor @@ -49,7 +50,7 @@ def __init__(self, *, config: Optional[dict] = None) -> None: recognized_extensions=recognized_extensions.pdf_like_format.union(recognized_extensions.image_like_format).union(supported_image_extensions), recognized_mimes=recognized_mimes.pdf_like_format.union(recognized_mimes.image_like_format) ) - self.skew_corrector = SkewCorrector() + self.skew_corrector = FastSkewCorrector() self.column_orientation_classifier = ColumnsOrientationClassifier(on_gpu=self.config.get("on_gpu", False), checkpoint_path=os.path.join(get_config()["resources_path"], "scan_orientation_efficient_net_b0.pth"), From 02a34e5212975bc0a9f1ce9e96df83de66c4b3e7 Mon Sep 17 00:00:00 2001 From: OligerMan Date: Tue, 14 Jul 2026 06:27:13 +0300 Subject: [PATCH 08/20] perf(render): opt-in pypdfium2 rendering (DEDOC_RENDER=pdfium) In-process PDFium rendering is ~7% faster end-to-end than pdf2image/pdftoppm (no poppler subprocess, no per-batch PDF re-parse; document cached in memory, 2x2 erode to thicken glyphs). Added as _split_pdfium with a dispatcher and a pdf2image fallback. Kept OPT-IN (default DEDOC_RENDER=pdftoppm) because on master's Tesseract path it is NOT quality-neutral: PDFium's thinner glyph anti-aliasing shifts Tesseract's output even with the erode (which was tuned for the hybrid recognizer), measured -0.38% gen_texts word-bag F1 and 0.988 body word-bag F1 vs poppler on the 297-page DAE report. The default path (_split_pdftoppm) is the original code, byte-identical to before. --- dedoc/readers/pdf_reader/pdf_base_reader.py | 43 +++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/dedoc/readers/pdf_reader/pdf_base_reader.py b/dedoc/readers/pdf_reader/pdf_base_reader.py index 1a71900b..eda6f3bc 100644 --- a/dedoc/readers/pdf_reader/pdf_base_reader.py +++ b/dedoc/readers/pdf_reader/pdf_base_reader.py @@ -256,6 +256,49 @@ def _split_pdf2image(self, path: str, page_from: int, page_to: int) -> Iterator[ if page_from >= page_to: return + import os + # In-process pypdfium2 (PDFium) rendering is ~7% faster end-to-end than pdf2image/pdftoppm (which spawns a + # poppler subprocess and re-parses the PDF per batch), but is OPT-IN (DEDOC_RENDER=pdfium): on master's + # Tesseract path it is NOT quality-neutral -- PDFium's thinner glyph anti-aliasing shifts Tesseract's output + # even with the 2x2 erode (that erode was tuned for the hybrid recognizer), costing ~0.4% word-bag F1 on + # gen_texts and ~1% body-text similarity vs poppler. The default stays pdftoppm (byte-identical to before). + if os.environ.get("DEDOC_RENDER", "pdftoppm") == "pdfium": + try: + yield from self._split_pdfium(path, page_from, page_to) + return + except Exception as error: + self.logger.warning(f"pypdfium2 render failed ({error}); falling back to pdf2image") + yield from self._split_pdftoppm(path, page_from, page_to) + + def _split_pdfium(self, path: str, page_from: int, page_to: int) -> Iterator[ndarray]: + """Render pages with pypdfium2 at 200 DPI -> BGR (same resolution/convention as pdf2image, so downstream stages + are unchanged). PDFium's anti-aliasing renders glyphs ~1 px thinner than Poppler (costs ~3.8% word-bag F1 on + short text); a 2x2 erode thickens them back to Poppler weight and recovers it (~1 ms/page).""" + import os + import math + import cv2 + import numpy as np + import pypdfium2 as pdfium + from dedoc.utils.pdf_utils import get_pdf_page_count + + page_count = get_pdf_page_count(path) + page_count = math.inf if page_count is None else page_count + last = int(min(page_to, page_count)) + kernel = np.ones((2, 2), np.uint8) + with open(path, "rb") as content: # load from bytes: a path makes PDFium hold a Windows lock on the file + pdf = pdfium.PdfDocument(content.read()) + try: + for page_index in range(page_from, last): + bitmap = pdf[page_index].render(scale=200 / 72) # 200 DPI, matching pdf2image's default + arr = bitmap.to_numpy() + arr = arr[:, :, :3] if (arr.ndim == 3 and arr.shape[2] == 4) else arr + image = np.ascontiguousarray(arr[:, :, ::-1]) # RGB -> BGR + self.logger.info(f"Rendered page {page_index + 1} of {page_count} file {os.path.basename(path)} (pypdfium2)") + yield cv2.erode(image, kernel, iterations=1) + finally: + pdf.close() + + def _split_pdftoppm(self, path: str, page_from: int, page_to: int) -> Iterator[ndarray]: import cv2 import math import os From 88b54cbbae3bff384a06053621b61d8dcd379121 Mon Sep 17 00:00:00 2001 From: OligerMan Date: Tue, 14 Jul 2026 06:28:56 +0300 Subject: [PATCH 09/20] docs: CPU-optimizations report (per-fix speed + quality, cumulative) Report for feature/cpu-optimizations: 4 default fixes (metadata, HoughLinesP, table-gate, deskew) = -28.0% on the 297-page DAE report, all bit-identical or quality-validated; opt-in pdfium render (-7.5% more but degrades Tesseract OCR). --- CPU_OPTIMIZATIONS_REPORT.md | 95 +++++++++++++++++++++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 CPU_OPTIMIZATIONS_REPORT.md diff --git a/CPU_OPTIMIZATIONS_REPORT.md b/CPU_OPTIMIZATIONS_REPORT.md new file mode 100644 index 00000000..59db29db --- /dev/null +++ b/CPU_OPTIMIZATIONS_REPORT.md @@ -0,0 +1,95 @@ +# CPU-only speedups for the scanned-PDF pipeline + +Branch **`feature/cpu-optimizations`** (from `master` @ `187baf5`, v2.7). A series of *isolated, CPU-only* fixes to +the existing `PdfImageReader` pipeline — no architecture rework, no multiprocessing changes, no GPU. Each fix is +either **bit-identical** to master or **quality-validated as non-degraded** (proven with tests). The fixes were +mined commit-by-commit from the experimental `feature/staged-gpu-pdf-pipeline` branch (which proved the gains) and +re-applied / re-implemented against master's real code paths. + +## Headline + +On the **DAE (India) Annual Report 2020-21** (297 pages, scanned, image pipeline, `n_jobs=1`, `lang=eng`, single +launch — the slow current pipeline): + +| configuration | wall | vs master | +|---|---|---| +| master baseline | **1517.0 s** | — | +| **+ all 4 default fixes** (metadata, HoughLinesP, table-gate, deskew) | **1092.9 s** | **−28.0%**, quality-preserving | +| + opt-in pdfium render (`DEDOC_RENDER=pdfium`) | 1011.4 s | −33.3%, but **degrades OCR on Tesseract** (see below) | + +Output is preserved: **tables = 6** at every step; body-text word-bag F1 vs the baseline stays **≥ 0.99993** through +the deskew step. + +## Method + +- **Speed**: full 297-page run through master's `PdfImageReader` (Tesseract OCR, poppler render, CPU orientation), + `n_jobs=1`, single launch. Fixes applied cumulatively; each row's Δ is vs the previous row. +- **Quality**, per fix, using the constraint *bit-identical OR non-degraded (proven)*: + - `text_sha` + `anno_sha` (SHA of every extracted line + every annotation) for bit-identical claims. + - Diff-vs-baseline **word-bag F1** (order-independent) of body text + table cells on the full doc. + - Re-run **word-bag F1 on the labelled `pdf_profiling` set**: `gen_tables` cell-recall (table fixes), `gen_texts` + OCR F1 (render), and `skew` angle vs the 91-step reference (deskew). + +## Results (cumulative) + +| # | fix | commit | wall | Δ | cum. vs master | quality verdict | +|---|---|---|---|---|---|---| +| 1 | metadata: vectorized valley binarizer + cv2.threshold, SIMD color annotation, drop no-op `rid_spaces` | `6041b60 8ebfa0d 69375bf f0c530f` | *(folded into #2)* | ~−17 s (isolated) | — | **bit-identical**: `text_sha` + `anno_sha` match over 40 pages (45 749 annotations) | +| 2 | HoughLinesP downscale (`table_hough_scale=0.5`) | `0ef5461` | 1360.5 s | **−156.5 s** (incl. metadata) | −10.3% | gen_tables cell-recall **0.6066 → 0.6066** (identical), tables=6, body F1 **0.99996** | +| 3 | table line-crossing gate (skip detector on tableless pages) | `faf4b23` | 1339.3 s | **−21.2 s** | −11.7% | gen_tables recall identical; gate ON vs OFF **byte-identical over 60 pages** (0/69 827 anno diff); tables=6 | +| 4 | deskew coarse-to-fine (`FastSkewCorrector`) | `9443a86` | 1092.9 s | **−246.4 s** | **−28.0%** | skew angle **29/30 exact** vs 91-step; body F1 **0.99993**, cells identical, tables=6 | +| 5 | pdfium render + erode — **OPT-IN, not default** | `799dd03` | 1011.4 s | −81.5 s | −33.3% | ⚠️ **degrades**: gen_texts F1 **0.9212 → 0.9177** (−0.38%), body F1 0.988 | + +## Per-fix notes + +**1. Metadata (binarizer / color / bold).** Vectorized the bold classifier's valley-emphasis Otsu (`cv2.calcHist` + +cumsum), replaced its two-pass binarization with `cv2.threshold`, replaced the color-annotation's 5-pass numpy mask + +3 boolean-index gathers with `cv2.inRange` + `cv2.sumElems/countNonZero`, and dropped `__get_rid_spaces` (a proven +no-op — its `len(not_space) > 3` guard is the column count, always true). All bit-identical: over 40 pages both the +extracted text **and** every annotation (`anno_sha = eabddd30…`, 45 749 annotations) match master exactly. Per-page +CPU saving ~59 ms; below single-run noise on the full wall, so folded into run #2. + +**2. HoughLinesP downscale.** `HoughLinesP` (line detection for bordered tables) runs on a 0.5× copy — it only needs +the line angle (scale-invariant) and gap-filling mask. On the labelled `gen_tables` set the cell-recall is *identical* +to full-res; on the DAE body text is 99.996% identical. The DAE table **cells** are segmented slightly more finely +(+8%, cell F1 0.84) but with no labelled-recall loss and tables=6 preserved. + +**3. Table line-crossing gate.** A ~7 ms/page signal (built from the *detector's own* line params — fixed-225 +threshold, short h/v kernels floored at `TableTree.min_w/h_cell`) counts grid crossings and skips the ~360 ms +detector when a page has < 2 (config `table_line_gate_min_cross`). Recall preserved (gen_tables identical, tables=6). +Proven a no-op on tableless pages: gate ON vs OFF is byte-identical over 60 pages (the gate returns the original +image, which equals the detector's `np.copy` when it finds nothing). A residual full-doc `anno_sha` nuance on a late +page touches only bold/color metadata — text, cells and table count are identical. Modest win here (−1.6%) because +the Hough downscale (#2) already cut most of the detector cost. + +**4. Deskew coarse-to-fine — the biggest win.** `dedocutils.SkewCorrector` rotates the full page 91 times per page +(one per candidate angle) — the dominant CPU cost of the scanned-image pipeline. `FastSkewCorrector` (a drop-in +subclass wired into `PdfImageReader`) brackets the peak with a coarse 3° sweep on a ≤512 px thumbnail, refines ±4° at +1° on a 1000 px image, and skips the final rotation when the angle is 0 (`rotate_image(x,0)` is an identity warp). +Same projection-profile scoring → **29/30 exact** vs the 91-step on the adversarial skew set (the lone divergence is a +>28° page where the peak is inherently ambiguous), exact on realistic skew ≤12°. DAE body text **99.993%** identical, +cells identical. + +**5. pdfium render — OPT-IN, excluded from the default.** In-process PDFium rendering is ~7% faster end-to-end than +`pdf2image`/`pdftoppm` (no poppler subprocess, no per-batch re-parse). But on **master's Tesseract path** it is *not* +quality-neutral: PDFium's glyph anti-aliasing is ~1 px thinner, and even with a 2×2 erode (which was tuned for the +*hybrid* recognizer on the experimental branch, not Tesseract) it shifts Tesseract's output — measured **−0.38% +gen_texts F1** and **0.988 body-text F1** on the DAE (below the 99.5% bar). Per the no-degradation constraint it is +kept **opt-in** via `DEDOC_RENDER=pdfium`; the default (`_split_pdftoppm`) is the original poppler code, +byte-identical to before. Re-tuning the erode for Tesseract could make it quality-neutral — open follow-up. + +## What was deliberately **not** ported + +GPU/hybrid OCR (DBNet + PP-OCRv5 + TensorRT), the 2-GPU-worker parallelism, shared-memory transport, lazy-import RAM +trims, and orientation/layout NN batching — all excluded as GPU-oriented, multiprocessing, or architecture changes, +per scope. OCR itself (Tesseract, 31% of runtime) is untouched — speeding it up means swapping the engine (out of +scope). + +## Merge-readiness + +The **4 default fixes (`6041b60`…`9443a86`) are ready to merge to main**: CPU-only, isolated, each bit-identical or +quality-validated non-degraded, −28% on the 297-page benchmark, tables and text preserved. The **render fix +(`799dd03`) is opt-in** and should stay opt-in until the erode is re-tuned for Tesseract (or left as a documented +speed/quality knob). + +All commits authored `OligerMan `. Raw run log: `scratchpad/RESULTS.log`. From 1b4759d7ec048b75ea84e467bd7f47584cad557d Mon Sep 17 00:00:00 2001 From: OligerMan Date: Tue, 14 Jul 2026 15:03:41 +0300 Subject: [PATCH 10/20] perf(pdf-auto): reuse the text-layer detection extraction for small docs auto_tabby ran the tabby Java subprocess twice per document: once in TxtLayerDetector.__classify_all_pages (first 8 pages, no tables) to feed the text-layer classifier, then again in PdfAutoReader.__parse_document for the real extraction. __parse_document already reuses a detection-provided document (TxtLayerResult.document), but __classify_all_pages never populated it. When the whole document fits inside the 8-page detection window, extract it once with the full parameters (all pages + tables, exactly __parse_document's own read) and pass it through for reuse -- eliminating the second JVM startup + re-extraction. Bit-identical output (verified: identical node/table counts and text SHA on prospectus/VVP_6_tables/short_lines/example), ~2x faster on small text-layer documents (5.93->3.36 s, 2.77->1.36 s, ...). Documents larger than the detection window keep the cheap 8-page detection and are unchanged. --- .../pdf_auto_reader/txtlayer_detector.py | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/dedoc/readers/pdf_reader/pdf_auto_reader/txtlayer_detector.py b/dedoc/readers/pdf_reader/pdf_auto_reader/txtlayer_detector.py index 383623f6..b99326b9 100644 --- a/dedoc/readers/pdf_reader/pdf_auto_reader/txtlayer_detector.py +++ b/dedoc/readers/pdf_reader/pdf_auto_reader/txtlayer_detector.py @@ -56,21 +56,32 @@ def __classify_all_pages( Separately handle the first page (it's common that only first page doesn't have a textual layer). """ parameters_copy = deepcopy(parameters) - parameters_copy["pages"] = "1:8" # two batches for pdf_txtlayer_reader - parameters_copy["need_pdf_table_analysis"] = "false" + # When the whole document already fits inside the 8-page detection window, extract it once with the *full* + # parameters (all pages + tables, matching __parse_document's own read) and hand the result to + # __parse_document via TxtLayerResult.document -- this avoids launching a second tabby/Java subprocess to + # re-extract the same pages, ~halving the wall for small text-layer documents (common in prod). Larger + # documents keep the cheap first-8-pages-only, no-tables detection. + page_count = get_pdf_page_count(path) + reusable = page_count is not None and page_count <= 8 and start == 1 and end is None + if reusable: + parameters_copy["pages"] = "1:" # exactly __parse_document's slice for a whole-document request; tables kept on + else: + parameters_copy["pages"] = "1:8" # two batches for pdf_txtlayer_reader + parameters_copy["need_pdf_table_analysis"] = "false" document = self.pdf_reader.read(path, parameters=parameters_copy) + reuse_document = document if reusable else None is_correct = txtlayer_classifier.predict([document.lines])[0] if not is_correct: return [TxtLayerResult(correct=False, start=start, end=end)] if start > 1: # no need to classify correctness of the first page - return [TxtLayerResult(correct=True, start=start, end=end)] + return [TxtLayerResult(correct=True, start=start, end=end, document=reuse_document)] first_page_lines = [line for line in document.lines if line.metadata.page_id == 0] first_page_correct = txtlayer_classifier.predict([first_page_lines])[0] if first_page_correct: - return [TxtLayerResult(correct=True, start=start, end=end)] + return [TxtLayerResult(correct=True, start=start, end=end, document=reuse_document)] else: return [TxtLayerResult(correct=False, start=start, end=start), TxtLayerResult(correct=True, start=start + 1, end=end)] From a1ddcf84a43c4872ba631b215e15c3c38c4593d1 Mon Sep 17 00:00:00 2001 From: OligerMan Date: Tue, 14 Jul 2026 15:58:43 +0300 Subject: [PATCH 11/20] perf(tabby): parallel page-range chunking of the tabby extraction The tabby JAR is invoked as a single java subprocess that uses only ~2.25 of 16 cores (measured: 26 s CPU over 11.6 s wall on the 145-page riscv spec), so a large document leaves the machine mostly idle. Split the page range into contiguous chunks run as concurrent tabby subprocesses (the jar already accepts -sp/-ep) and merge. This is bit-identical: tabby numbers pages absolutely and its per-page output is page-local (verified 145/145 pages byte-identical to the single call), so merging is just concatenating the per-chunk `pages` lists; multi-page tables spanning a chunk boundary are still assembled downstream by convert_to_multipages_tables from the page fragments. riscv 145 pages: full parse 14.15 -> 11.30 s (-20%), identical reader output (node/table counts + text/cell SHA); the tabby extraction step alone goes ~11.6 -> ~6.4 s. Each chunk JVM runs -XX:+UseSerialGC -Xmx1024m to keep N concurrent processes from saturating memory bandwidth with parallel GC threads. Default: documents >= 40 pages split into 2-4 chunks (min 20 pages/chunk, cap 4); smaller docs, the GOST-frame path and open-ended ranges keep the single call. Tunables: tabby_parallel_chunks / DEDOC_TABBY_CHUNKS (cap, 1 disables), tabby_parallel_min_pages_per_chunk, DEDOC_TABBY_JVM_ARGS. Also fixes the data.json read to specify encoding=utf-8 (RU-locale Windows cp1251 bug). --- .../pdf_txtlayer_reader/pdf_tabby_reader.py | 67 +++++++++++++++++-- 1 file changed, 60 insertions(+), 7 deletions(-) diff --git a/dedoc/readers/pdf_reader/pdf_txtlayer_reader/pdf_tabby_reader.py b/dedoc/readers/pdf_reader/pdf_txtlayer_reader/pdf_tabby_reader.py index 17536940..c7b499f2 100644 --- a/dedoc/readers/pdf_reader/pdf_txtlayer_reader/pdf_tabby_reader.py +++ b/dedoc/readers/pdf_reader/pdf_txtlayer_reader/pdf_tabby_reader.py @@ -355,11 +355,12 @@ def __run(self, start_page: int = None, end_page: int = None, remove_frame: bool = False, - gost_json_path: str = "" + gost_json_path: str = "", + jvm_args: Optional[List[str]] = None ) -> bytes: import subprocess - args = ["java"] + ["-jar", self.__jar_path(), "-i", path, "-tmp", f"{tmp_dir}/"] + args = ["java"] + (jvm_args or []) + ["-jar", self.__jar_path(), "-i", path, "-tmp", f"{tmp_dir}/"] if remove_frame: args += ["-rf", gost_json_path] if start_page is not None and end_page is not None: @@ -384,12 +385,64 @@ def __process_pdf(self, import json import os - self.__run(path=path, start_page=start_page, end_page=end_page, tmp_dir=tmp_dir, remove_frame=remove_frame, gost_json_path=gost_json_path) - - with open(os.path.join(tmp_dir, "data.json"), "r") as response: - document = json.load(response) + n_chunks = self.__parallel_chunk_count(start_page, end_page, remove_frame) + if n_chunks > 1: + return self.__process_pdf_parallel(path, tmp_dir, start_page, end_page, gost_json_path, remove_frame, n_chunks) - return document + self.__run(path=path, start_page=start_page, end_page=end_page, tmp_dir=tmp_dir, remove_frame=remove_frame, gost_json_path=gost_json_path) + with open(os.path.join(tmp_dir, "data.json"), "r", encoding="utf-8") as response: # encoding= : data.json is UTF-8, avoids cp1251 breakage on RU-locale Windows + return json.load(response) + + def __parallel_chunk_count(self, start_page: Optional[int], end_page: Optional[int], remove_frame: bool) -> int: + """How many parallel tabby subprocesses to split this page range into. The tabby JAR uses only ~2 of the + machine's cores, so a large document is faster split into contiguous page ranges run concurrently (validated + bit-identical: tabby's per-page output is page-local and page numbers are absolute, so merging = concatenating + the ``pages`` lists). Small documents keep a single call (N JVM startups would cost more than the saving); + the GOST-frame path and open-ended ranges also stay single. Tunables: tabby_parallel_chunks / + DEDOC_TABBY_CHUNKS (cap, default 4; set 1 to disable), tabby_parallel_min_pages_per_chunk (default 20).""" + import os + if remove_frame or start_page is None or end_page is None: + return 1 + max_chunks = int(os.environ.get("DEDOC_TABBY_CHUNKS", self.config.get("tabby_parallel_chunks", 4))) + min_per_chunk = int(os.environ.get("DEDOC_TABBY_MIN_PAGES_PER_CHUNK", self.config.get("tabby_parallel_min_pages_per_chunk", 20))) + pages = end_page - start_page + 1 + return max(1, min(max_chunks, pages // max(min_per_chunk, 1))) + + def __process_pdf_parallel(self, path: str, tmp_dir: str, start_page: int, end_page: int, gost_json_path: str, + remove_frame: bool, n_chunks: int) -> dict: + import json + import math + import os + from concurrent.futures import ThreadPoolExecutor + + per_chunk = math.ceil((end_page - start_page + 1) / n_chunks) + ranges, page = [], start_page + while page <= end_page: + ranges.append((page, min(page + per_chunk - 1, end_page))) + page = ranges[-1][1] + 1 + self.logger.info(f"Reading PDF in {len(ranges)} parallel tabby chunks: {ranges}") + # bound each JVM's GC (SerialGC + small heap) so N concurrent tabby processes do not saturate memory bandwidth + # with parallel GC threads -- measured to cut inter-JVM contention. Override via DEDOC_TABBY_JVM_ARGS. + jvm_args = os.environ.get("DEDOC_TABBY_JVM_ARGS", "-XX:+UseSerialGC -Xmx1024m").split() + + def run_chunk(indexed_range: tuple) -> dict: + index, (chunk_start, chunk_end) = indexed_range + chunk_tmp = os.path.join(tmp_dir, f"chunk_{index}") + os.makedirs(chunk_tmp, exist_ok=True) + self.__run(path=path, start_page=chunk_start, end_page=chunk_end, tmp_dir=chunk_tmp, + remove_frame=remove_frame, gost_json_path=gost_json_path, jvm_args=jvm_args) + with open(os.path.join(chunk_tmp, "data.json"), "r", encoding="utf-8") as response: + return json.load(response) + + with ThreadPoolExecutor(max_workers=len(ranges)) as executor: + documents = list(executor.map(run_chunk, enumerate(ranges))) + + # merge: page numbers are absolute and the ranges are contiguous & disjoint, so concatenating the per-chunk + # ``pages`` lists in range order reproduces the single-call output exactly (multi-page tables spanning a chunk + # boundary are still assembled downstream by TableRecognizer.convert_to_multipages_tables from page fragments) + merged = documents[0] + merged["pages"] = [page for document in documents for page in document.get("pages", [])] + return merged def _process_one_page(self, image: ndarray, From 40511f2bd696edae1c083b46841c3cafe72ecfd6 Mon Sep 17 00:00:00 2001 From: OligerMan Date: Tue, 14 Jul 2026 16:16:26 +0300 Subject: [PATCH 12/20] perf(annotations): build BBoxAnnotation JSON without the json encoder BBoxAnnotation.__init__ called json.dumps(bbox.to_relative_dict(...)) on every construction -- once per line bounding box, tens of thousands of times per document (46919 on the 145-page riscv spec, where the json encoder was the single largest post-processing cost, ~0.57 s). Build the fixed 6-key JSON string directly with an f-string instead: Python's str(float) equals repr and json's float encoding, and int str equals json's, so the output is byte-identical to json.dumps (verified over 122820 bbox values). Micro-benchmark: the whole new constructor (3.02 us) is faster than the old json.dumps call alone (4.78 us). --- .../concrete_annotations/bbox_annotation.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/dedoc/data_structures/concrete_annotations/bbox_annotation.py b/dedoc/data_structures/concrete_annotations/bbox_annotation.py index 303c9eb0..3b3ba7ab 100644 --- a/dedoc/data_structures/concrete_annotations/bbox_annotation.py +++ b/dedoc/data_structures/concrete_annotations/bbox_annotation.py @@ -19,12 +19,17 @@ def __init__(self, start: int, end: int, value: BBox, page_width: int, page_heig :param page_width: width of original image with this bbox :param page_height: height of original image with this bbox """ - import json - if not isinstance(value, BBox): raise ValueError("the value of bounding box annotation should be instance of BBox") - super().__init__(start=start, end=end, name=BBoxAnnotation.name, value=json.dumps(value.to_relative_dict(page_width, page_height)), is_mergeable=False) + # Build the JSON string directly instead of json.dumps(to_relative_dict(...)): this runs once per line-bbox + # (tens of thousands per document) and the json encoder dominated post-processing. str(float) equals repr and + # json's float encoding, and int str equals json's, so the result is byte-identical to the old json.dumps + # (verified over 120k+ bbox values), just without the encoder overhead. + x, y = value.x_top_left / page_width, value.y_top_left / page_height + w, h = value.width / page_width, value.height / page_height + value_json = f'{{"x_top_left": {x}, "y_top_left": {y}, "width": {w}, "height": {h}, "page_width": {page_width}, "page_height": {page_height}}}' + super().__init__(start=start, end=end, name=BBoxAnnotation.name, value=value_json, is_mergeable=False) @staticmethod def get_bbox_from_value(value: str) -> Tuple[BBox, int, int]: From e59296b4c0fde4dfb2aa22d8847e8343eb5df906 Mon Sep 17 00:00:00 2001 From: OligerMan Date: Wed, 15 Jul 2026 18:41:34 +0300 Subject: [PATCH 13/20] perf(tabby-jar): parallel ruling detection + allocation-free pixel scan + compact JSON Rebuild the tabby table-extraction engine (ispras_tbl_extr.jar) with CPU optimizations. Engine time on a 145-page document drops ~11.8s -> ~3.7s; end-to-end auto_tabby through dedoc ~13.9s -> ~7.4s (~1.9x). - ruling extraction: the per-page ruling detection (a pixel scan of the rendered page) now runs across all available cores; the page render itself stays serialized, so the result does not depend on scheduling order - ruling scan: read the pixel band value directly instead of allocating an int[] for every pixel -- billions of short-lived allocations on a large document - text extraction: drop a per-character list that was built for every glyph and never read by anything - JSON output: build and serialize each page in parallel and emit compact JSON instead of a single pretty-printed pass; data.json shrinks ~45%, which also speeds up the json.load on the Python side The first three keep data.json byte-identical to the previous jar. Compact JSON changes the bytes but not the parsed content (data.json is consumed with json.load, which is whitespace-insensitive): verified parse-identical across all of tests/data/pdf_with_text_layer, and dedoc's final output (structure, tables, annotations) verified identical end-to-end. --- .../tabbypdf/jars/ispras_tbl_extr.jar | Bin 165055 -> 138357 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/dedoc/readers/pdf_reader/pdf_txtlayer_reader/tabbypdf/jars/ispras_tbl_extr.jar b/dedoc/readers/pdf_reader/pdf_txtlayer_reader/tabbypdf/jars/ispras_tbl_extr.jar index 54ffe61ea84e652adbbf0061662bd5c3717612d9..a8ae1cc947b5edb224b60f427b489e79efd6a976 100644 GIT binary patch literal 138357 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%0A$)z~x_`~FE6k6lH;xxdRnqUOU`5{_ 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

7V{gX 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 sc()!IMyyWwB?!bf4^W*pm< Date: Wed, 15 Jul 2026 18:41:45 +0300 Subject: [PATCH 14/20] perf(tables): share line objects in Cell.copy_from instead of deep-copying Cell splitting (CellSplitter._merge_close_borders / __split_one_cell) copies a cell per cell and per split sub-cell only to rewrite its geometry and flags -- it never touches the line contents. The lines (text + annotations) are by far the heaviest part of a cell, so deep-copying them was pure overhead. Share the line objects (each copy still gets its own list, so list-level edits stay independent) and deep-copy only the small geometry (bbox, contour_coord), which the splitter and Cell.shift do mutate. -0.21s on a 145-page document (auto_tabby, warm). Verified: dedoc's final output (structure + tables + annotations) is identical on the tabby path (riscv-spec-v2.2, VVP_6_tables, VVP_global_table, big_table_with_merged_cells, Document635) and on the image-reader path (three scanned table images compared against the previous deepcopy behaviour). --- .../readers/pdf_reader/data_classes/tables/cell.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/dedoc/readers/pdf_reader/data_classes/tables/cell.py b/dedoc/readers/pdf_reader/data_classes/tables/cell.py index d83e2b6c..fb946b51 100644 --- a/dedoc/readers/pdf_reader/data_classes/tables/cell.py +++ b/dedoc/readers/pdf_reader/data_classes/tables/cell.py @@ -11,10 +11,15 @@ class Cell(CellWithMeta): @staticmethod def copy_from(cell: "Cell", bbox: Optional[BBox] = None) -> "Cell": - copy_cell = copy.deepcopy(cell) - if bbox: - copy_cell.bbox = bbox - + # Cell splitting only rewrites geometry/flags, never the line contents -- and the lines (text + annotations) are + # by far the heaviest part of a cell. Share the line objects instead of deep-copying them (each copy still gets + # its own list so list-level edits stay independent), and deep-copy only the small geometry (bbox, + # contour_coord) so it remains independent. This is ~10x cheaper than deep-copying the whole cell. + copy_cell = copy.copy(cell) + if cell.lines is not None: + copy_cell.lines = list(cell.lines) + copy_cell.bbox = bbox if bbox is not None else copy.deepcopy(cell.bbox) + copy_cell.contour_coord = copy.deepcopy(cell.contour_coord) return copy_cell def shift(self, shift_x: int, shift_y: int, image_width: int, image_height: int) -> None: From a355dd57335ab3559c06584dd0b5c5f0e8429329 Mon Sep 17 00:00:00 2001 From: OligerMan Date: Wed, 15 Jul 2026 18:41:46 +0300 Subject: [PATCH 15/20] perf(pdf-auto): reuse the textual layer detection extraction for the remaining pages The textual layer detection already runs a complete tabby extraction of the first 8 pages -- the tabby reader ignores need_pdf_table_analysis, so tables are extracted too -- and then threw that extraction away, leaving the subsequent full read to extract those pages a second time. Hand tabby's raw per-page output over (TxtLayerResult.detected_pages) so PdfTabbyReader extracts only the pages the detection did not cover. The pages are merged at the raw ``pages`` level, *before* the per-page processing, which is what keeps cross-page merging intact: this is the same invariant __process_pdf_parallel already relies on (absolute page numbers, contiguous disjoint ranges). Splitting the work into separate reads per page range instead tears paragraphs that span the boundary, so it is not done that way. Restricted to auto_tabby (under "auto" the remaining pages are read by pdf_txtlayer_reader, which cannot consume tabby's pages), to reads starting at page 1, and to runs without attachments (extracted image files live in the detection read's temporary directory, which is gone by then). Measured (auto_tabby, warm): article (25p) 7.78s -> 6.03s (-23%), riscv-spec-v2.2 (145p) ~-0.2s; the gain scales with the content density of the first 8 pages. Verified identical dedoc output (structure + tables + annotations) on multipage (the 8/9 boundary case), with_changed_header_footer, mongolo, article, riscv-spec-v2.2, and on example.pdf as an unaffected control. --- .../pdf_auto_reader/pdf_auto_reader.py | 4 ++ .../pdf_auto_reader/txtlayer_detector.py | 23 ++++++++- .../pdf_auto_reader/txtlayer_result.py | 6 +++ .../pdf_txtlayer_reader/pdf_tabby_reader.py | 49 +++++++++++++++---- 4 files changed, 71 insertions(+), 11 deletions(-) diff --git a/dedoc/readers/pdf_reader/pdf_auto_reader/pdf_auto_reader.py b/dedoc/readers/pdf_reader/pdf_auto_reader/pdf_auto_reader.py index d69f6c71..ca738487 100644 --- a/dedoc/readers/pdf_reader/pdf_auto_reader/pdf_auto_reader.py +++ b/dedoc/readers/pdf_reader/pdf_auto_reader/pdf_auto_reader.py @@ -88,6 +88,10 @@ def __parse_document(self, txtlayer_result: TxtLayerResult, parameters: dict, pa copy_parameters = copy.deepcopy(parameters) copy_parameters["pages"] = f"{txtlayer_result.start}:{end}" + if txtlayer_result.detected_pages: + # Hand tabby's already-extracted leading pages back to the reader so it only extracts the rest. Set after + # the deepcopy on purpose: this is a large structure and must not be copied. + copy_parameters["__tabby_raw_pages_in"] = dict(pages=txtlayer_result.detected_pages, last_page=txtlayer_result.detected_last_page) result = reader.read(file_path=path, parameters=copy_parameters) return result diff --git a/dedoc/readers/pdf_reader/pdf_auto_reader/txtlayer_detector.py b/dedoc/readers/pdf_reader/pdf_auto_reader/txtlayer_detector.py index b99326b9..8a3d6a9c 100644 --- a/dedoc/readers/pdf_reader/pdf_auto_reader/txtlayer_detector.py +++ b/dedoc/readers/pdf_reader/pdf_auto_reader/txtlayer_detector.py @@ -11,7 +11,7 @@ from dedoc.readers.pdf_reader.pdf_auto_reader.txtlayer_classifier.abstract_txtlayer_classifier import AbstractTxtlayerClassifier from dedoc.readers.pdf_reader.pdf_auto_reader.txtlayer_result import TxtLayerResult from dedoc.readers.pdf_reader.pdf_txtlayer_reader.pdf_tabby_reader import PdfTabbyReader -from dedoc.utils.parameter_utils import get_bool_parameter, get_param_page_slice +from dedoc.utils.parameter_utils import get_bool_parameter, get_param_page_slice, get_param_pdf_with_txt_layer, get_param_with_attachments from dedoc.utils.pdf_utils import get_pdf_page_count @@ -63,14 +63,31 @@ def __classify_all_pages( # documents keep the cheap first-8-pages-only, no-tables detection. page_count = get_pdf_page_count(path) reusable = page_count is not None and page_count <= 8 and start == 1 and end is None + # For longer documents the detection window cannot replace the whole read, but its extraction is still not + # wasted: tabby's raw per-page output is handed to PdfTabbyReader, which then extracts only the pages the + # detection did not cover. This is free -- the tabby reader ignores need_pdf_table_analysis, so this read + # already produces a complete extraction of those pages, which used to be thrown away. Restricted to: + # * auto_tabby -- under "auto" the document is read by pdf_txtlayer_reader, which cannot consume tabby's pages; + # * runs without attachments -- extracted image files live in this read's temporary directory, which is gone + # by the time the second read would reference them. + pages_reusable = ( + not reusable + and start == 1 + and get_param_pdf_with_txt_layer(parameters) == "auto_tabby" + and not get_param_with_attachments(parameters) + ) + detected_pages = [] if pages_reusable else None if reusable: parameters_copy["pages"] = "1:" # exactly __parse_document's slice for a whole-document request; tables kept on else: parameters_copy["pages"] = "1:8" # two batches for pdf_txtlayer_reader parameters_copy["need_pdf_table_analysis"] = "false" + if pages_reusable: + parameters_copy["__tabby_raw_pages_out"] = detected_pages document = self.pdf_reader.read(path, parameters=parameters_copy) reuse_document = document if reusable else None + detected_last_page = len(detected_pages) if detected_pages else 0 is_correct = txtlayer_classifier.predict([document.lines])[0] if not is_correct: return [TxtLayerResult(correct=False, start=start, end=end)] @@ -81,8 +98,10 @@ def __classify_all_pages( first_page_lines = [line for line in document.lines if line.metadata.page_id == 0] first_page_correct = txtlayer_classifier.predict([first_page_lines])[0] if first_page_correct: - return [TxtLayerResult(correct=True, start=start, end=end, document=reuse_document)] + return [TxtLayerResult(correct=True, start=start, end=end, document=reuse_document, + detected_pages=detected_pages, detected_last_page=detected_last_page)] else: + # the leading pages are not read as one chunk here, so the detection extraction cannot be reused as-is return [TxtLayerResult(correct=False, start=start, end=start), TxtLayerResult(correct=True, start=start + 1, end=end)] def __classify_each_page( diff --git a/dedoc/readers/pdf_reader/pdf_auto_reader/txtlayer_result.py b/dedoc/readers/pdf_reader/pdf_auto_reader/txtlayer_result.py index aedca869..587ad0fb 100644 --- a/dedoc/readers/pdf_reader/pdf_auto_reader/txtlayer_result.py +++ b/dedoc/readers/pdf_reader/pdf_auto_reader/txtlayer_result.py @@ -12,8 +12,14 @@ class TxtLayerResult: - start - start page of the document chunk (numeration starts with 1) - end - end page of the document chunk (numeration starts with 1, end included) - document - UnstructuredDocument of document pages[start:end] + - detected_pages - tabby's raw per-page output already produced while detecting the textual layer, covering pages + [1:detected_last_page]. Handed back to :class:`PdfTabbyReader` so that it extracts only the remaining pages + instead of extracting these a second time. + - detected_last_page - last page (numeration starts with 1, included) covered by detected_pages """ correct: bool start: int end: Optional[int] document: Optional[UnstructuredDocument] = None + detected_pages: Optional[list] = None + detected_last_page: int = 0 diff --git a/dedoc/readers/pdf_reader/pdf_txtlayer_reader/pdf_tabby_reader.py b/dedoc/readers/pdf_reader/pdf_txtlayer_reader/pdf_tabby_reader.py index c7b499f2..c76e2988 100644 --- a/dedoc/readers/pdf_reader/pdf_txtlayer_reader/pdf_tabby_reader.py +++ b/dedoc/readers/pdf_reader/pdf_txtlayer_reader/pdf_tabby_reader.py @@ -122,15 +122,13 @@ def __extract(self, path: str, parameters: dict, warnings: List[str], tmp_dir: s first_tabby_page = first_page + 1 if first_page is not None else 1 last_tabby_page = page_count if (last_page is None) or (last_page is not None and last_page > page_count) else last_page last_tabby_page = None if last_tabby_page == math.inf else last_tabby_page - self.logger.info(f"Reading PDF pages from {first_tabby_page} to {last_tabby_page}") - document = self.__process_pdf(path=path, - start_page=first_tabby_page, - end_page=last_tabby_page, - tmp_dir=tmp_dir, - gost_json_path=gost_json_path, - remove_frame=remove_gost_frame) - - pages = document.get("pages", []) + pages = self.__get_raw_pages(path=path, parameters=parameters, tmp_dir=tmp_dir, first_tabby_page=first_tabby_page, + last_tabby_page=last_tabby_page, gost_json_path=gost_json_path, remove_frame=remove_gost_frame) + + pages_out = parameters.get("__tabby_raw_pages_out") + if pages_out is not None: # let the caller (textual layer detection) keep this extraction for a later read + pages_out.extend(pages) + lines = [] for page in pages: page_lines = self.__get_lines_with_location(page, file_hash) @@ -375,6 +373,39 @@ def __run(self, except subprocess.CalledProcessError as e: raise TabbyPdfError(e.stderr.decode(encoding)) + def __get_raw_pages(self, path: str, parameters: dict, tmp_dir: str, first_tabby_page: int, last_tabby_page: Optional[int], + gost_json_path: str, remove_frame: bool) -> List[dict]: + """Tabby's raw per-page output for the requested page range. + + When the textual layer detection already extracted the leading pages and handed them over + (``__tabby_raw_pages_in``), those pages are reused and only the remaining ones are extracted -- the detection + read produces a complete extraction of them anyway, so re-extracting was pure duplicate work. + + Page numbers are absolute and the ranges are contiguous & disjoint, so concatenating the ``pages`` lists + reproduces a single-call extraction exactly (the same invariant :meth:`__process_pdf_parallel` relies on). + The concatenation happens *before* the per-page processing in :meth:`__extract`, which is what keeps cross-page + merging (paragraphs/lines spanning the boundary) intact -- handing whole parsed documents over per page range + instead would break it. + """ + cached = parameters.get("__tabby_raw_pages_in") + cached_pages = cached.get("pages") if cached else None + + if cached_pages and first_tabby_page == 1 and not remove_frame: + cached_last = cached["last_page"] + if last_tabby_page is not None and last_tabby_page <= cached_last: + return cached_pages[:last_tabby_page] + + self.logger.info(f"Reading PDF pages from {cached_last + 1} to {last_tabby_page} " + f"(pages 1-{cached_last} reused from the textual layer detection)") + document = self.__process_pdf(path=path, start_page=cached_last + 1, end_page=last_tabby_page, tmp_dir=tmp_dir, + gost_json_path=gost_json_path, remove_frame=remove_frame) + return cached_pages + document.get("pages", []) + + self.logger.info(f"Reading PDF pages from {first_tabby_page} to {last_tabby_page}") + document = self.__process_pdf(path=path, start_page=first_tabby_page, end_page=last_tabby_page, tmp_dir=tmp_dir, + gost_json_path=gost_json_path, remove_frame=remove_frame) + return document.get("pages", []) + def __process_pdf(self, path: str, tmp_dir: str, From 1d9fa061b3d2f7f17fd25030706f2207ef08e153 Mon Sep 17 00:00:00 2001 From: OligerMan Date: Wed, 15 Jul 2026 18:54:19 +0300 Subject: [PATCH 16/20] perf(tabby): drop the parallel page-range chunking of the tabby extraction The chunking existed to work around the old jar using only ~2 of the machine's cores: splitting a large document into contiguous page ranges and running several tabby JVMs concurrently was a net win back then. The rebuilt jar parallelizes internally across all cores, so those extra JVMs now only contend with it -- measured on a 145-page document, auto_tabby warm: 8.25s with the default 4 chunks vs 7.36s with chunking off. Reverts the machinery added in 9be9f63 (__parallel_chunk_count, __process_pdf_parallel, __run's jvm_args) together with its tunables (tabby_parallel_chunks, tabby_parallel_min_pages_per_chunk, DEDOC_TABBY_CHUNKS, DEDOC_TABBY_MIN_PAGES_PER_CHUNK, DEDOC_TABBY_JVM_ARGS), restoring the single-call extraction. The raw-pages reuse from the textual layer detection is unaffected: it merges the ``pages`` lists on the same invariant the chunking relied on (page-local output, absolute page numbers). Output verified identical (dedoc's final structure, tables and annotations) on the 145-page document. --- .../pdf_txtlayer_reader/pdf_tabby_reader.py | 70 ++----------------- 1 file changed, 7 insertions(+), 63 deletions(-) diff --git a/dedoc/readers/pdf_reader/pdf_txtlayer_reader/pdf_tabby_reader.py b/dedoc/readers/pdf_reader/pdf_txtlayer_reader/pdf_tabby_reader.py index c76e2988..503ab7a4 100644 --- a/dedoc/readers/pdf_reader/pdf_txtlayer_reader/pdf_tabby_reader.py +++ b/dedoc/readers/pdf_reader/pdf_txtlayer_reader/pdf_tabby_reader.py @@ -353,12 +353,11 @@ def __run(self, start_page: int = None, end_page: int = None, remove_frame: bool = False, - gost_json_path: str = "", - jvm_args: Optional[List[str]] = None + gost_json_path: str = "" ) -> bytes: import subprocess - args = ["java"] + (jvm_args or []) + ["-jar", self.__jar_path(), "-i", path, "-tmp", f"{tmp_dir}/"] + args = ["java"] + ["-jar", self.__jar_path(), "-i", path, "-tmp", f"{tmp_dir}/"] if remove_frame: args += ["-rf", gost_json_path] if start_page is not None and end_page is not None: @@ -381,11 +380,11 @@ def __get_raw_pages(self, path: str, parameters: dict, tmp_dir: str, first_tabby (``__tabby_raw_pages_in``), those pages are reused and only the remaining ones are extracted -- the detection read produces a complete extraction of them anyway, so re-extracting was pure duplicate work. - Page numbers are absolute and the ranges are contiguous & disjoint, so concatenating the ``pages`` lists - reproduces a single-call extraction exactly (the same invariant :meth:`__process_pdf_parallel` relies on). - The concatenation happens *before* the per-page processing in :meth:`__extract`, which is what keeps cross-page - merging (paragraphs/lines spanning the boundary) intact -- handing whole parsed documents over per page range - instead would break it. + Tabby's per-page output is page-local and page numbers are absolute, and the ranges here are contiguous and + disjoint, so concatenating the ``pages`` lists reproduces a single-call extraction exactly. The concatenation + happens *before* the per-page processing in :meth:`__extract`, which is what keeps cross-page merging + (paragraphs/lines spanning the boundary) intact -- handing whole parsed documents over per page range instead + would break it. """ cached = parameters.get("__tabby_raw_pages_in") cached_pages = cached.get("pages") if cached else None @@ -416,65 +415,10 @@ def __process_pdf(self, import json import os - n_chunks = self.__parallel_chunk_count(start_page, end_page, remove_frame) - if n_chunks > 1: - return self.__process_pdf_parallel(path, tmp_dir, start_page, end_page, gost_json_path, remove_frame, n_chunks) - self.__run(path=path, start_page=start_page, end_page=end_page, tmp_dir=tmp_dir, remove_frame=remove_frame, gost_json_path=gost_json_path) with open(os.path.join(tmp_dir, "data.json"), "r", encoding="utf-8") as response: # encoding= : data.json is UTF-8, avoids cp1251 breakage on RU-locale Windows return json.load(response) - def __parallel_chunk_count(self, start_page: Optional[int], end_page: Optional[int], remove_frame: bool) -> int: - """How many parallel tabby subprocesses to split this page range into. The tabby JAR uses only ~2 of the - machine's cores, so a large document is faster split into contiguous page ranges run concurrently (validated - bit-identical: tabby's per-page output is page-local and page numbers are absolute, so merging = concatenating - the ``pages`` lists). Small documents keep a single call (N JVM startups would cost more than the saving); - the GOST-frame path and open-ended ranges also stay single. Tunables: tabby_parallel_chunks / - DEDOC_TABBY_CHUNKS (cap, default 4; set 1 to disable), tabby_parallel_min_pages_per_chunk (default 20).""" - import os - if remove_frame or start_page is None or end_page is None: - return 1 - max_chunks = int(os.environ.get("DEDOC_TABBY_CHUNKS", self.config.get("tabby_parallel_chunks", 4))) - min_per_chunk = int(os.environ.get("DEDOC_TABBY_MIN_PAGES_PER_CHUNK", self.config.get("tabby_parallel_min_pages_per_chunk", 20))) - pages = end_page - start_page + 1 - return max(1, min(max_chunks, pages // max(min_per_chunk, 1))) - - def __process_pdf_parallel(self, path: str, tmp_dir: str, start_page: int, end_page: int, gost_json_path: str, - remove_frame: bool, n_chunks: int) -> dict: - import json - import math - import os - from concurrent.futures import ThreadPoolExecutor - - per_chunk = math.ceil((end_page - start_page + 1) / n_chunks) - ranges, page = [], start_page - while page <= end_page: - ranges.append((page, min(page + per_chunk - 1, end_page))) - page = ranges[-1][1] + 1 - self.logger.info(f"Reading PDF in {len(ranges)} parallel tabby chunks: {ranges}") - # bound each JVM's GC (SerialGC + small heap) so N concurrent tabby processes do not saturate memory bandwidth - # with parallel GC threads -- measured to cut inter-JVM contention. Override via DEDOC_TABBY_JVM_ARGS. - jvm_args = os.environ.get("DEDOC_TABBY_JVM_ARGS", "-XX:+UseSerialGC -Xmx1024m").split() - - def run_chunk(indexed_range: tuple) -> dict: - index, (chunk_start, chunk_end) = indexed_range - chunk_tmp = os.path.join(tmp_dir, f"chunk_{index}") - os.makedirs(chunk_tmp, exist_ok=True) - self.__run(path=path, start_page=chunk_start, end_page=chunk_end, tmp_dir=chunk_tmp, - remove_frame=remove_frame, gost_json_path=gost_json_path, jvm_args=jvm_args) - with open(os.path.join(chunk_tmp, "data.json"), "r", encoding="utf-8") as response: - return json.load(response) - - with ThreadPoolExecutor(max_workers=len(ranges)) as executor: - documents = list(executor.map(run_chunk, enumerate(ranges))) - - # merge: page numbers are absolute and the ranges are contiguous & disjoint, so concatenating the per-chunk - # ``pages`` lists in range order reproduces the single-call output exactly (multi-page tables spanning a chunk - # boundary are still assembled downstream by TableRecognizer.convert_to_multipages_tables from page fragments) - merged = documents[0] - merged["pages"] = [page for document in documents for page in document.get("pages", [])] - return merged - def _process_one_page(self, image: ndarray, parameters: ParametersForParseDoc, From 221f27a1393340cdb7e45b8b5e97032dac91ad94 Mon Sep 17 00:00:00 2001 From: OligerMan Date: Thu, 16 Jul 2026 17:45:33 +0300 Subject: [PATCH 17/20] docs: drop CPU_OPTIMIZATIONS_REPORT.md Internal working report, not needed in the pull request. --- CPU_OPTIMIZATIONS_REPORT.md | 95 ------------------------------------- 1 file changed, 95 deletions(-) delete mode 100644 CPU_OPTIMIZATIONS_REPORT.md diff --git a/CPU_OPTIMIZATIONS_REPORT.md b/CPU_OPTIMIZATIONS_REPORT.md deleted file mode 100644 index 59db29db..00000000 --- a/CPU_OPTIMIZATIONS_REPORT.md +++ /dev/null @@ -1,95 +0,0 @@ -# CPU-only speedups for the scanned-PDF pipeline - -Branch **`feature/cpu-optimizations`** (from `master` @ `187baf5`, v2.7). A series of *isolated, CPU-only* fixes to -the existing `PdfImageReader` pipeline — no architecture rework, no multiprocessing changes, no GPU. Each fix is -either **bit-identical** to master or **quality-validated as non-degraded** (proven with tests). The fixes were -mined commit-by-commit from the experimental `feature/staged-gpu-pdf-pipeline` branch (which proved the gains) and -re-applied / re-implemented against master's real code paths. - -## Headline - -On the **DAE (India) Annual Report 2020-21** (297 pages, scanned, image pipeline, `n_jobs=1`, `lang=eng`, single -launch — the slow current pipeline): - -| configuration | wall | vs master | -|---|---|---| -| master baseline | **1517.0 s** | — | -| **+ all 4 default fixes** (metadata, HoughLinesP, table-gate, deskew) | **1092.9 s** | **−28.0%**, quality-preserving | -| + opt-in pdfium render (`DEDOC_RENDER=pdfium`) | 1011.4 s | −33.3%, but **degrades OCR on Tesseract** (see below) | - -Output is preserved: **tables = 6** at every step; body-text word-bag F1 vs the baseline stays **≥ 0.99993** through -the deskew step. - -## Method - -- **Speed**: full 297-page run through master's `PdfImageReader` (Tesseract OCR, poppler render, CPU orientation), - `n_jobs=1`, single launch. Fixes applied cumulatively; each row's Δ is vs the previous row. -- **Quality**, per fix, using the constraint *bit-identical OR non-degraded (proven)*: - - `text_sha` + `anno_sha` (SHA of every extracted line + every annotation) for bit-identical claims. - - Diff-vs-baseline **word-bag F1** (order-independent) of body text + table cells on the full doc. - - Re-run **word-bag F1 on the labelled `pdf_profiling` set**: `gen_tables` cell-recall (table fixes), `gen_texts` - OCR F1 (render), and `skew` angle vs the 91-step reference (deskew). - -## Results (cumulative) - -| # | fix | commit | wall | Δ | cum. vs master | quality verdict | -|---|---|---|---|---|---|---| -| 1 | metadata: vectorized valley binarizer + cv2.threshold, SIMD color annotation, drop no-op `rid_spaces` | `6041b60 8ebfa0d 69375bf f0c530f` | *(folded into #2)* | ~−17 s (isolated) | — | **bit-identical**: `text_sha` + `anno_sha` match over 40 pages (45 749 annotations) | -| 2 | HoughLinesP downscale (`table_hough_scale=0.5`) | `0ef5461` | 1360.5 s | **−156.5 s** (incl. metadata) | −10.3% | gen_tables cell-recall **0.6066 → 0.6066** (identical), tables=6, body F1 **0.99996** | -| 3 | table line-crossing gate (skip detector on tableless pages) | `faf4b23` | 1339.3 s | **−21.2 s** | −11.7% | gen_tables recall identical; gate ON vs OFF **byte-identical over 60 pages** (0/69 827 anno diff); tables=6 | -| 4 | deskew coarse-to-fine (`FastSkewCorrector`) | `9443a86` | 1092.9 s | **−246.4 s** | **−28.0%** | skew angle **29/30 exact** vs 91-step; body F1 **0.99993**, cells identical, tables=6 | -| 5 | pdfium render + erode — **OPT-IN, not default** | `799dd03` | 1011.4 s | −81.5 s | −33.3% | ⚠️ **degrades**: gen_texts F1 **0.9212 → 0.9177** (−0.38%), body F1 0.988 | - -## Per-fix notes - -**1. Metadata (binarizer / color / bold).** Vectorized the bold classifier's valley-emphasis Otsu (`cv2.calcHist` + -cumsum), replaced its two-pass binarization with `cv2.threshold`, replaced the color-annotation's 5-pass numpy mask + -3 boolean-index gathers with `cv2.inRange` + `cv2.sumElems/countNonZero`, and dropped `__get_rid_spaces` (a proven -no-op — its `len(not_space) > 3` guard is the column count, always true). All bit-identical: over 40 pages both the -extracted text **and** every annotation (`anno_sha = eabddd30…`, 45 749 annotations) match master exactly. Per-page -CPU saving ~59 ms; below single-run noise on the full wall, so folded into run #2. - -**2. HoughLinesP downscale.** `HoughLinesP` (line detection for bordered tables) runs on a 0.5× copy — it only needs -the line angle (scale-invariant) and gap-filling mask. On the labelled `gen_tables` set the cell-recall is *identical* -to full-res; on the DAE body text is 99.996% identical. The DAE table **cells** are segmented slightly more finely -(+8%, cell F1 0.84) but with no labelled-recall loss and tables=6 preserved. - -**3. Table line-crossing gate.** A ~7 ms/page signal (built from the *detector's own* line params — fixed-225 -threshold, short h/v kernels floored at `TableTree.min_w/h_cell`) counts grid crossings and skips the ~360 ms -detector when a page has < 2 (config `table_line_gate_min_cross`). Recall preserved (gen_tables identical, tables=6). -Proven a no-op on tableless pages: gate ON vs OFF is byte-identical over 60 pages (the gate returns the original -image, which equals the detector's `np.copy` when it finds nothing). A residual full-doc `anno_sha` nuance on a late -page touches only bold/color metadata — text, cells and table count are identical. Modest win here (−1.6%) because -the Hough downscale (#2) already cut most of the detector cost. - -**4. Deskew coarse-to-fine — the biggest win.** `dedocutils.SkewCorrector` rotates the full page 91 times per page -(one per candidate angle) — the dominant CPU cost of the scanned-image pipeline. `FastSkewCorrector` (a drop-in -subclass wired into `PdfImageReader`) brackets the peak with a coarse 3° sweep on a ≤512 px thumbnail, refines ±4° at -1° on a 1000 px image, and skips the final rotation when the angle is 0 (`rotate_image(x,0)` is an identity warp). -Same projection-profile scoring → **29/30 exact** vs the 91-step on the adversarial skew set (the lone divergence is a ->28° page where the peak is inherently ambiguous), exact on realistic skew ≤12°. DAE body text **99.993%** identical, -cells identical. - -**5. pdfium render — OPT-IN, excluded from the default.** In-process PDFium rendering is ~7% faster end-to-end than -`pdf2image`/`pdftoppm` (no poppler subprocess, no per-batch re-parse). But on **master's Tesseract path** it is *not* -quality-neutral: PDFium's glyph anti-aliasing is ~1 px thinner, and even with a 2×2 erode (which was tuned for the -*hybrid* recognizer on the experimental branch, not Tesseract) it shifts Tesseract's output — measured **−0.38% -gen_texts F1** and **0.988 body-text F1** on the DAE (below the 99.5% bar). Per the no-degradation constraint it is -kept **opt-in** via `DEDOC_RENDER=pdfium`; the default (`_split_pdftoppm`) is the original poppler code, -byte-identical to before. Re-tuning the erode for Tesseract could make it quality-neutral — open follow-up. - -## What was deliberately **not** ported - -GPU/hybrid OCR (DBNet + PP-OCRv5 + TensorRT), the 2-GPU-worker parallelism, shared-memory transport, lazy-import RAM -trims, and orientation/layout NN batching — all excluded as GPU-oriented, multiprocessing, or architecture changes, -per scope. OCR itself (Tesseract, 31% of runtime) is untouched — speeding it up means swapping the engine (out of -scope). - -## Merge-readiness - -The **4 default fixes (`6041b60`…`9443a86`) are ready to merge to main**: CPU-only, isolated, each bit-identical or -quality-validated non-degraded, −28% on the 297-page benchmark, tables and text preserved. The **render fix -(`799dd03`) is opt-in** and should stay opt-in until the erode is re-tuned for Tesseract (or left as a documented -speed/quality knob). - -All commits authored `OligerMan `. Raw run log: `scratchpad/RESULTS.log`. From d91fda2ba5c7fbf09c8f18546c5d092b63406f76 Mon Sep 17 00:00:00 2001 From: Nasty Date: Fri, 31 Jul 2026 13:03:16 +0300 Subject: [PATCH 18/20] fix lint --- .github/workflows/docs.yaml | 5 +++++ .../pdf_auto_reader/txtlayer_detector.py | 18 +++++++++++++----- .../pdf_txtlayer_reader/pdf_tabby_reader.py | 2 +- 3 files changed, 19 insertions(+), 6 deletions(-) diff --git a/.github/workflows/docs.yaml b/.github/workflows/docs.yaml index fccf205d..eaa267e9 100644 --- a/.github/workflows/docs.yaml +++ b/.github/workflows/docs.yaml @@ -16,6 +16,11 @@ jobs: uses: actions/setup-python@v2 with: python-version: '3.10' + - name: Set up JDK + uses: actions/setup-java@v4 + with: + distribution: 'temurin' + java-version: '25' - name: Install dependencies run: | diff --git a/dedoc/readers/pdf_reader/pdf_auto_reader/txtlayer_detector.py b/dedoc/readers/pdf_reader/pdf_auto_reader/txtlayer_detector.py index 8a3d6a9c..adc9c398 100644 --- a/dedoc/readers/pdf_reader/pdf_auto_reader/txtlayer_detector.py +++ b/dedoc/readers/pdf_reader/pdf_auto_reader/txtlayer_detector.py @@ -72,9 +72,9 @@ def __classify_all_pages( # by the time the second read would reference them. pages_reusable = ( not reusable - and start == 1 - and get_param_pdf_with_txt_layer(parameters) == "auto_tabby" - and not get_param_with_attachments(parameters) + and start == 1 # noqa W503 + and get_param_pdf_with_txt_layer(parameters) == "auto_tabby" # noqa W503 + and not get_param_with_attachments(parameters) # noqa W503 ) detected_pages = [] if pages_reusable else None if reusable: @@ -98,8 +98,16 @@ def __classify_all_pages( first_page_lines = [line for line in document.lines if line.metadata.page_id == 0] first_page_correct = txtlayer_classifier.predict([first_page_lines])[0] if first_page_correct: - return [TxtLayerResult(correct=True, start=start, end=end, document=reuse_document, - detected_pages=detected_pages, detected_last_page=detected_last_page)] + return [ + TxtLayerResult( + correct=True, + start=start, + end=end, + document=reuse_document, + detected_pages=detected_pages, + detected_last_page=detected_last_page + ) + ] else: # the leading pages are not read as one chunk here, so the detection extraction cannot be reused as-is return [TxtLayerResult(correct=False, start=start, end=start), TxtLayerResult(correct=True, start=start + 1, end=end)] diff --git a/dedoc/readers/pdf_reader/pdf_txtlayer_reader/pdf_tabby_reader.py b/dedoc/readers/pdf_reader/pdf_txtlayer_reader/pdf_tabby_reader.py index 503ab7a4..18af0334 100644 --- a/dedoc/readers/pdf_reader/pdf_txtlayer_reader/pdf_tabby_reader.py +++ b/dedoc/readers/pdf_reader/pdf_txtlayer_reader/pdf_tabby_reader.py @@ -416,7 +416,7 @@ def __process_pdf(self, import os self.__run(path=path, start_page=start_page, end_page=end_page, tmp_dir=tmp_dir, remove_frame=remove_frame, gost_json_path=gost_json_path) - with open(os.path.join(tmp_dir, "data.json"), "r", encoding="utf-8") as response: # encoding= : data.json is UTF-8, avoids cp1251 breakage on RU-locale Windows + with open(os.path.join(tmp_dir, "data.json"), "r", encoding="utf-8") as response: return json.load(response) def _process_one_page(self, From b0d845d30d6859c41baf3911dc841082dd163470 Mon Sep 17 00:00:00 2001 From: nastyboget Date: Mon, 3 Aug 2026 16:20:51 +0300 Subject: [PATCH 19/20] fix some table tests --- .../table_recognizer/table_utils/img_processing.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dedoc/readers/pdf_reader/pdf_image_reader/table_recognizer/table_utils/img_processing.py b/dedoc/readers/pdf_reader/pdf_image_reader/table_recognizer/table_utils/img_processing.py index 11ee77bd..da7dfae2 100644 --- a/dedoc/readers/pdf_reader/pdf_image_reader/table_recognizer/table_utils/img_processing.py +++ b/dedoc/readers/pdf_reader/pdf_image_reader/table_recognizer/table_utils/img_processing.py @@ -42,7 +42,7 @@ def apply_houph_line(img: np.ndarray, threshold_gap: int = 10, *, config: dict) img = cv2.resize(img, None, fx=scale, fy=scale, interpolation=cv2.INTER_NEAREST) cdst_p = np.copy(img) dst = abs(img - 255) - lines_p = cv2.HoughLinesP(dst, 1, np.pi / 180, 50, 100, int(300 * scale), max(int(threshold_gap * scale), 1)) + lines_p = cv2.HoughLinesP(dst, 1, np.pi / 180, 50, 100, 300, threshold_gap) k_hor = [] @@ -70,7 +70,7 @@ def apply_houph_line(img: np.ndarray, threshold_gap: int = 10, *, config: dict) logger.debug(f"angle_horiz_avg = {angle}") if scale != 1.0: # upscale the gap-filled line mask back so contours are found at full resolution - cdst_p = cv2.resize(cdst_p, full_hw, interpolation=cv2.INTER_NEAREST) + cdst_p = cv2.resize(cdst_p, full_hw, interpolation=cv2.INTER_CUBIC) return cdst_p, angle From 57b3ccaf2987ef181a0a6e7e3e1ac07f960f7971 Mon Sep 17 00:00:00 2001 From: nastyboget Date: Tue, 4 Aug 2026 11:02:06 +0300 Subject: [PATCH 20/20] move fast skew corrector to dedoc-utils --- .../pdf_image_reader/fast_skew_corrector.py | 56 ------------------- .../pdf_image_reader/pdf_image_reader.py | 5 +- requirements.txt | 2 +- 3 files changed, 3 insertions(+), 60 deletions(-) delete mode 100644 dedoc/readers/pdf_reader/pdf_image_reader/fast_skew_corrector.py diff --git a/dedoc/readers/pdf_reader/pdf_image_reader/fast_skew_corrector.py b/dedoc/readers/pdf_reader/pdf_image_reader/fast_skew_corrector.py deleted file mode 100644 index 1bd61a49..00000000 --- a/dedoc/readers/pdf_reader/pdf_image_reader/fast_skew_corrector.py +++ /dev/null @@ -1,56 +0,0 @@ -from typing import Optional, Tuple - -import cv2 -import numpy as np -from dedocutils.preprocessing import SkewCorrector -from dedocutils.utils import rotate_image - - -class FastSkewCorrector(SkewCorrector): - """Drop-in replacement for dedocutils ``SkewCorrector`` that finds the skew angle with a coarse-to-fine - projection-profile search instead of 91 full-page rotations. - - The original rotates the full page once per candidate angle over ``arange(-45, 46, 1)`` = 91 rotations - (~1.2 s/page, the dominant cost of the scanned-image pipeline). Here a coarse 3-degree sweep runs on a - ``<=512`` px thumbnail (a rotation's cost scales with area, so ~7x cheaper) to bracket the peak, then a - full-resolution +-4-degree fine sweep at 1-degree step recovers the exact angle. Validated against the 91-step - reference on the ``pdf_profiling/skew`` set: matches on 55/56 heavily-skewed pages (exact on realistic skew - ``<=12`` degrees); the divergences are on ``>28`` degree pages where the projection peak is inherently ambiguous. - The final full-page rotation is skipped when ``best_angle == 0`` (the common case for cleanly-scanned pages); since - ``rotate_image(x, 0)`` is an identity warp, the output is bit-identical to the original on those pages. - - The projection-profile scoring is unchanged from ``SkewCorrector`` (rotate, row-sum, squared first difference), so - the angle this returns is the same the original would return whenever the coarse/fine grid brackets the same peak. - """ - - _MIN_SIDE = 1000 # the fine sweep runs on an image downscaled to this long side (never upscales a small page) - _COARSE_SIDE = 512 # the coarse guess runs on this smaller thumbnail - - def preprocess(self, image: np.ndarray, parameters: Optional[dict] = None) -> Tuple[np.ndarray, dict]: - parameters = {} if parameters is None else parameters - orientation_angle = parameters.get("orientation_angle", 0) - if orientation_angle: - image = np.rot90(image, orientation_angle // 90) - - gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) - thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1] - scale = min(1.0, self._MIN_SIDE / max(thresh.shape[:2])) - if scale < 1.0: - thresh = cv2.resize(thresh, None, fx=scale, fy=scale, interpolation=cv2.INTER_AREA) - coarse_scale = min(1.0, self._COARSE_SIDE / max(thresh.shape[:2])) - thumb = cv2.resize(thresh, None, fx=coarse_scale, fy=coarse_scale, interpolation=cv2.INTER_AREA) if coarse_scale < 1.0 else thresh - - coarse_angles = np.arange(-self.max_angle, self.max_angle + 1, 3) - coarse = float(coarse_angles[int(np.argmax([self._score(thumb, angle) for angle in coarse_angles]))]) - lo, hi = max(coarse - 4, -self.max_angle), min(coarse + 4, self.max_angle) - fine_angles = np.arange(lo, hi + 0.001, self.step) - best_angle = float(fine_angles[int(np.argmax([self._score(thresh, angle) for angle in fine_angles]))]) - - rotated = image if best_angle == 0 else rotate_image(image, best_angle) - return rotated, {"rotated_angle": float(orientation_angle + best_angle)} - - @staticmethod - def _score(arr: np.ndarray, angle: float) -> float: - data = rotate_image(arr, angle) - histogram = np.sum(data, axis=1, dtype=float) - return float(np.sum((histogram[1:] - histogram[:-1]) ** 2, dtype=float)) diff --git a/dedoc/readers/pdf_reader/pdf_image_reader/pdf_image_reader.py b/dedoc/readers/pdf_reader/pdf_image_reader/pdf_image_reader.py index 99c68069..fc91c968 100644 --- a/dedoc/readers/pdf_reader/pdf_image_reader/pdf_image_reader.py +++ b/dedoc/readers/pdf_reader/pdf_image_reader/pdf_image_reader.py @@ -35,8 +35,7 @@ class PdfImageReader(PdfBaseReader): """ def __init__(self, *, config: Optional[dict] = None) -> None: - from dedocutils.preprocessing import AdaptiveBinarizer - from dedoc.readers.pdf_reader.pdf_image_reader.fast_skew_corrector import FastSkewCorrector + from dedocutils.preprocessing import AdaptiveBinarizer, SkewCorrector from dedoc.attachments_extractors.concrete_attachments_extractors.image_attachments_extractor import ImageAttachmentsExtractor from dedoc.readers.pdf_reader.pdf_image_reader.columns_orientation_classifier.columns_orientation_classifier import ColumnsOrientationClassifier from dedoc.readers.pdf_reader.pdf_image_reader.ocr.ocr_line_extractor import OCRLineExtractor @@ -50,7 +49,7 @@ def __init__(self, *, config: Optional[dict] = None) -> None: recognized_extensions=recognized_extensions.pdf_like_format.union(recognized_extensions.image_like_format).union(supported_image_extensions), recognized_mimes=recognized_mimes.pdf_like_format.union(recognized_mimes.image_like_format) ) - self.skew_corrector = FastSkewCorrector() + self.skew_corrector = SkewCorrector() self.column_orientation_classifier = ColumnsOrientationClassifier(on_gpu=self.config.get("on_gpu", False), checkpoint_path=os.path.join(get_config()["resources_path"], "scan_orientation_efficient_net_b0.pth"), diff --git a/requirements.txt b/requirements.txt index 9403265b..989846b7 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,7 +1,7 @@ beautifulsoup4>=4.10.0,<=4.12.3 charset-normalizer>=2.0.12,<=3.2.0 Cython>=0.29.28,<=3.0.2 -dedoc-utils==0.3.8 +dedoc-utils==0.3.10 fastapi>=0.77.0,<1.0 fontTools>=4.0,<5.0 huggingface-hub>=0.14.1,<1.0