Reza2kn commited on
Commit
6d05289
·
verified ·
1 Parent(s): 44f3b90

Release verified Bina 0.2 RizehPizeh 169k checkpoint

Browse files
.gitattributes CHANGED
@@ -40,3 +40,5 @@ checkpoints/eval-00004/best_accuracy.pdparams filter=lfs diff=lfs merge=lfs -tex
40
  checkpoints/eval-00005/best_accuracy.pdparams filter=lfs diff=lfs merge=lfs -text
41
  checkpoints/eval-00006/best_accuracy.pdparams filter=lfs diff=lfs merge=lfs -text
42
  checkpoints/eval-00009/best_accuracy.pdparams filter=lfs diff=lfs merge=lfs -text
 
 
 
40
  checkpoints/eval-00005/best_accuracy.pdparams filter=lfs diff=lfs merge=lfs -text
41
  checkpoints/eval-00006/best_accuracy.pdparams filter=lfs diff=lfs merge=lfs -text
42
  checkpoints/eval-00009/best_accuracy.pdparams filter=lfs diff=lfs merge=lfs -text
43
+ Bina-0.2-RizehPizeh.pdparams filter=lfs diff=lfs merge=lfs -text
44
+ inference/inference.pdiparams filter=lfs diff=lfs merge=lfs -text
Bina-0.2-RizehPizeh.pdparams ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:52d01041e2ea9b4575464392d513893ad81452dc6086bc81a077fe15c7017fca
3
+ size 142364527
LICENSE ADDED
@@ -0,0 +1,201 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Apache License
2
+ Version 2.0, January 2004
3
+ http://www.apache.org/licenses/
4
+
5
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
6
+
7
+ 1. Definitions.
8
+
9
+ "License" shall mean the terms and conditions for use, reproduction,
10
+ and distribution as defined by Sections 1 through 9 of this document.
11
+
12
+ "Licensor" shall mean the copyright owner or entity authorized by
13
+ the copyright owner that is granting the License.
14
+
15
+ "Legal Entity" shall mean the union of the acting entity and all
16
+ other entities that control, are controlled by, or are under common
17
+ control with that entity. For the purposes of this definition,
18
+ "control" means (i) the power, direct or indirect, to cause the
19
+ direction or management of such entity, whether by contract or
20
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
21
+ outstanding shares, or (iii) beneficial ownership of such entity.
22
+
23
+ "You" (or "Your") shall mean an individual or Legal Entity
24
+ exercising permissions granted by this License.
25
+
26
+ "Source" form shall mean the preferred form for making modifications,
27
+ including but not limited to software source code, documentation
28
+ source, and configuration files.
29
+
30
+ "Object" form shall mean any form resulting from mechanical
31
+ transformation or translation of a Source form, including but
32
+ not limited to compiled object code, generated documentation,
33
+ and conversions to other media types.
34
+
35
+ "Work" shall mean the work of authorship, whether in Source or
36
+ Object form, made available under the License, as indicated by a
37
+ copyright notice that is included in or attached to the work
38
+ (an example is provided in the Appendix below).
39
+
40
+ "Derivative Works" shall mean any work, whether in Source or Object
41
+ form, that is based on (or derived from) the Work and for which the
42
+ editorial revisions, annotations, elaborations, or other modifications
43
+ represent, as a whole, an original work of authorship. For the purposes
44
+ of this License, Derivative Works shall not include works that remain
45
+ separable from, or merely link (or bind by name) to the interfaces of,
46
+ the Work and Derivative Works thereof.
47
+
48
+ "Contribution" shall mean any work of authorship, including
49
+ the original version of the Work and any modifications or additions
50
+ to that Work or Derivative Works thereof, that is intentionally
51
+ submitted to Licensor for inclusion in the Work by the copyright owner
52
+ or by an individual or Legal Entity authorized to submit on behalf of
53
+ the copyright owner. For the purposes of this definition, "submitted"
54
+ means any form of electronic, verbal, or written communication sent
55
+ to the Licensor or its representatives, including but not limited to
56
+ communication on electronic mailing lists, source code control systems,
57
+ and issue tracking systems that are managed by, or on behalf of, the
58
+ Licensor for the purpose of discussing and improving the Work, but
59
+ excluding communication that is conspicuously marked or otherwise
60
+ designated in writing by the copyright owner as "Not a Contribution."
61
+
62
+ "Contributor" shall mean Licensor and any individual or Legal Entity
63
+ on behalf of whom a Contribution has been received by Licensor and
64
+ subsequently incorporated within the Work.
65
+
66
+ 2. Grant of Copyright License. Subject to the terms and conditions of
67
+ this License, each Contributor hereby grants to You a perpetual,
68
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
69
+ copyright license to reproduce, prepare Derivative Works of,
70
+ publicly display, publicly perform, sublicense, and distribute the
71
+ Work and such Derivative Works in Source or Object form.
72
+
73
+ 3. Grant of Patent License. Subject to the terms and conditions of
74
+ this License, each Contributor hereby grants to You a perpetual,
75
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
76
+ (except as stated in this section) patent license to make, have made,
77
+ use, offer to sell, sell, import, and otherwise transfer the Work,
78
+ where such license applies only to those patent claims licensable
79
+ by such Contributor that are necessarily infringed by their
80
+ Contribution(s) alone or by combination of their Contribution(s)
81
+ with the Work to which such Contribution(s) was submitted. If You
82
+ institute patent litigation against any entity (including a
83
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
84
+ or a Contribution incorporated within the Work constitutes direct
85
+ or contributory patent infringement, then any patent licenses
86
+ granted to You under this License for that Work shall terminate
87
+ as of the date such litigation is filed.
88
+
89
+ 4. Redistribution. You may reproduce and distribute copies of the
90
+ Work or Derivative Works thereof in any medium, with or without
91
+ modifications, and in Source or Object form, provided that You
92
+ meet the following conditions:
93
+
94
+ (a) You must give any other recipients of the Work or
95
+ Derivative Works a copy of this License; and
96
+
97
+ (b) You must cause any modified files to carry prominent notices
98
+ stating that You changed the files; and
99
+
100
+ (c) You must retain, in the Source form of any Derivative Works
101
+ that You distribute, all copyright, patent, trademark, and
102
+ attribution notices from the Source form of the Work,
103
+ excluding those notices that do not pertain to any part of
104
+ the Derivative Works; and
105
+
106
+ (d) If the Work includes a "NOTICE" text file as part of its
107
+ distribution, then any Derivative Works that You distribute must
108
+ include a readable copy of the attribution notices contained
109
+ within such NOTICE file, excluding those notices that do not
110
+ pertain to any part of the Derivative Works, in at least one
111
+ of the following places: within a NOTICE text file distributed
112
+ as part of the Derivative Works; within the Source form or
113
+ documentation, if provided along with the Derivative Works; or,
114
+ within a display generated by the Derivative Works, if and
115
+ wherever such third-party notices normally appear. The contents
116
+ of the NOTICE file are for informational purposes only and
117
+ do not modify the License. You may add Your own attribution
118
+ notices within Derivative Works that You distribute, alongside
119
+ or as an addendum to the NOTICE text from the Work, provided
120
+ that such additional attribution notices cannot be construed
121
+ as modifying the License.
122
+
123
+ You may add Your own copyright statement to Your modifications and
124
+ may provide additional or different license terms and conditions
125
+ for use, reproduction, or distribution of Your modifications, or
126
+ for any such Derivative Works as a whole, provided Your use,
127
+ reproduction, and distribution of the Work otherwise complies with
128
+ the conditions stated in this License.
129
+
130
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
131
+ any Contribution intentionally submitted for inclusion in the Work
132
+ by You to the Licensor shall be under the terms and conditions of
133
+ this License, without any additional terms or conditions.
134
+ Notwithstanding the above, nothing herein shall supersede or modify
135
+ the terms of any separate license agreement you may have executed
136
+ with Licensor regarding such Contributions.
137
+
138
+ 6. Trademarks. This License does not grant permission to use the trade
139
+ names, trademarks, service marks, or product names of the Licensor,
140
+ except as required for reasonable and customary use in describing the
141
+ origin of the Work and reproducing the content of the NOTICE file.
142
+
143
+ 7. Disclaimer of Warranty. Unless required by applicable law or
144
+ agreed to in writing, Licensor provides the Work (and each
145
+ Contributor provides its Contributions) on an "AS IS" BASIS,
146
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
147
+ implied, including, without limitation, any warranties or conditions
148
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
149
+ PARTICULAR PURPOSE. You are solely responsible for determining the
150
+ appropriateness of using or redistributing the Work and assume any
151
+ risks associated with Your exercise of permissions under this License.
152
+
153
+ 8. Limitation of Liability. In no event and under no legal theory,
154
+ whether in tort (including negligence), contract, or otherwise,
155
+ unless required by applicable law (such as deliberate and grossly
156
+ negligent acts) or agreed to in writing, shall any Contributor be
157
+ liable to You for damages, including any direct, indirect, special,
158
+ incidental, or consequential damages of any character arising as a
159
+ result of this License or out of the use or inability to use the
160
+ Work (including but not limited to damages for loss of goodwill,
161
+ work stoppage, computer failure or malfunction, or any and all
162
+ other commercial damages or losses), even if such Contributor
163
+ has been advised of the possibility of such damages.
164
+
165
+ 9. Accepting Warranty or Additional Liability. While redistributing
166
+ the Work or Derivative Works thereof, You may choose to offer,
167
+ and charge a fee for, acceptance of support, warranty, indemnity,
168
+ or other liability obligations and/or rights consistent with this
169
+ License. However, in accepting such obligations, You may act only
170
+ on Your own behalf and on Your sole responsibility, not on behalf
171
+ of any other Contributor, and only if You agree to indemnify,
172
+ defend, and hold each Contributor harmless for any liability
173
+ incurred by, or claims asserted against, such Contributor by reason
174
+ of your accepting any such warranty or additional liability.
175
+
176
+ END OF TERMS AND CONDITIONS
177
+
178
+ APPENDIX: How to apply the Apache License to your work.
179
+
180
+ To apply the Apache License to your work, attach the following
181
+ boilerplate notice, with the fields enclosed by brackets "[]"
182
+ replaced with your own identifying information. (Don't include
183
+ the brackets!) The text should be enclosed in the appropriate
184
+ comment syntax for the file format. We also recommend that a
185
+ file or class name and description of purpose be included on the
186
+ same "printed page" as the copyright notice for easier
187
+ identification within third-party archives.
188
+
189
+ Copyright (c) 2016 PaddlePaddle Authors. All Rights Reserved.
190
+
191
+ Licensed under the Apache License, Version 2.0 (the "License");
192
+ you may not use this file except in compliance with the License.
193
+ You may obtain a copy of the License at
194
+
195
+ http://www.apache.org/licenses/LICENSE-2.0
196
+
197
+ Unless required by applicable law or agreed to in writing, software
198
+ distributed under the License is distributed on an "AS IS" BASIS,
199
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
200
+ See the License for the specific language governing permissions and
201
+ limitations under the License.
MODEL_PROVENANCE.json ADDED
@@ -0,0 +1,55 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "schema": "bina02.ppocrv6.model-provenance.v1",
3
+ "model_id": "Reza2kn/Bina-0.2-RizehPizeh",
4
+ "release": "0.2.0-169k",
5
+ "base_model": "PaddlePaddle/PP-OCRv6_medium_rec",
6
+ "architecture": "PP-OCRv6 medium recognition, SVTR_LCNet/PPLCNetV4, CTC",
7
+ "paddleocr_commit": "2661c7c0ef5c613e8f93c6e93b2e052399f0f854",
8
+ "dataset_revisions": {
9
+ "Reza2kn/persian-handwriting-pages-3.69m": "d94db7b55cf2d6521f581f10226bb117d2e0acaf",
10
+ "Reza2kn/persian-printed-ocr-3.5m": "41c5c977901bdd153b44816bbb92d7d4699524f9"
11
+ },
12
+ "training_rows": {
13
+ "handwriting": 84500,
14
+ "printed": 84500,
15
+ "total": 169000
16
+ },
17
+ "evaluation_rows": {
18
+ "handwriting": 2048,
19
+ "printed": 2048,
20
+ "total": 4096
21
+ },
22
+ "preprocessing": {
23
+ "input": "content-tight horizontal line crop",
24
+ "image_shape": [
25
+ 3,
26
+ 48,
27
+ 768
28
+ ],
29
+ "padding": false,
30
+ "tall_crop_rotation": "clockwise_90",
31
+ "printed_foreground_trim": true,
32
+ "target_order": "PaddleOCR BaseRecLabelDecode.pred_reverse"
33
+ },
34
+ "training": {
35
+ "batch_size": 16,
36
+ "learning_rate": 0.0003,
37
+ "best_step": 47520,
38
+ "stopped_step": 50160,
39
+ "early_stop": "three evaluations without 0.0005 NED improvement"
40
+ },
41
+ "independent_evaluation": {
42
+ "exact_lines": 3474,
43
+ "exact_line_accuracy": 0.84814453125,
44
+ "mean_normalized_edit_similarity": 0.9880669756561222,
45
+ "handwriting_exact_line_accuracy": 0.8583984375,
46
+ "printed_exact_line_accuracy": 0.837890625,
47
+ "all_transforms_accepted_without_replacement": true
48
+ },
49
+ "sha256": {
50
+ "checkpoint": "52d01041e2ea9b4575464392d513893ad81452dc6086bc81a077fe15c7017fca",
51
+ "inference_graph": "4f0c41b21815a2e2b5765009d3a15efc1a5850032a9c6e6694325ee2",
52
+ "inference_parameters": "4f84e43243e9bb2a6b5617da2a22c071f5ebf2db489c1fb55d7e3dd1e2dc99e3",
53
+ "dictionary": "28fb97acc0feca48f8243d36f8c3ea80efda25c13c29db1c41002900310b6c8e"
54
+ }
55
+ }
PADDLEOCR_COMMIT ADDED
@@ -0,0 +1 @@
 
 
1
+ 2661c7c0ef5c613e8f93c6e93b2e052399f0f854
README.md CHANGED
@@ -1,26 +1,111 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  # Bina 0.2 - RizehPizeh
2
 
3
- Persian full-page OCR pipeline based on PP-OCRv6:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4
 
5
- 1. Detect ordered Persian text regions.
6
- 2. Recognize CTC-safe RTL word groups.
7
- 3. Reconstruct lines and complete pages in reading order.
8
 
9
- ## Current training state
 
 
10
 
11
- The initial PP-OCRv6 medium recognizer pilot reached a held-out normalized edit
12
- similarity of `0.1752708888` before its ephemeral Colab runtime reset. No model
13
- checkpoint survived that reset.
14
 
15
- The files under `training-kit/` reproduce data preparation, RTL segmentation,
16
- and evaluation-driven early stopping. Future best checkpoints are uploaded
17
- under `checkpoints/` so runtime resets do not erase training progress.
18
 
19
- ## Data
 
 
 
20
 
21
- - `Reza2kn/persian-handwriting-pages-3.69m`
22
- - `Reza2kn/persian-printed-ocr-3.5m`
23
- - `Reza2kn/visualears-hardword-sentences` for rare-character coverage
24
 
25
- The Persian recognizer uses a character dictionary rather than a language-model
26
- tokenizer.
 
1
+ ---
2
+ license: apache-2.0
3
+ language:
4
+ - fa
5
+ library_name: paddleocr
6
+ pipeline_tag: image-to-text
7
+ base_model: PaddlePaddle/PP-OCRv6_medium_rec
8
+ datasets:
9
+ - Reza2kn/persian-handwriting-pages-3.69m
10
+ - Reza2kn/persian-printed-ocr-3.5m
11
+ tags:
12
+ - ocr
13
+ - persian
14
+ - handwriting
15
+ - printed-text
16
+ - paddlepaddle
17
+ - pp-ocrv6
18
+ ---
19
+
20
  # Bina 0.2 - RizehPizeh
21
 
22
+ Bina 0.2 - RizehPizeh is a compact Persian line-recognition model fine-tuned
23
+ from PP-OCRv6 medium recognition. It recognizes both handwritten and printed
24
+ Persian text using a 161-symbol character dictionary and a CTC decoder.
25
+
26
+ This repository preserves the earlier experimental checkpoints under
27
+ `checkpoints/`. The verified release is at the repository root.
28
+
29
+ ## Verified release
30
+
31
+ | Held-out split | Rows | Exact lines | Exact-line accuracy | Mean normalized edit similarity |
32
+ | --- | ---: | ---: | ---: | ---: |
33
+ | Combined | 4,096 | 3,474 | **84.81%** | **98.81%** |
34
+ | Handwriting | 2,048 | 1,758 | **85.84%** | **98.83%** |
35
+ | Printed | 2,048 | 1,716 | **83.79%** | **98.79%** |
36
+
37
+ Exact-line accuracy is strict: one incorrect character, digit, space, or
38
+ punctuation mark makes the entire line incorrect. The independent evaluator
39
+ accepted all 4,096 transforms without replacement.
40
+
41
+ ## Package contents
42
+
43
+ - `inference/`: exported Paddle inference graph and parameters.
44
+ - `bina_text_recognition.py`: logical-order Persian inference wrapper.
45
+ - `Bina-0.2-RizehPizeh.pdparams`: best training checkpoint.
46
+ - `config.yml`: portable architecture and preprocessing configuration.
47
+ - `persian_arabic_bina02_dict.txt`: 161-symbol character dictionary.
48
+ - `MODEL_PROVENANCE.json`: revisions, counts, metrics, and SHA-256 hashes.
49
+ - `eval-aligned-row-analysis-v2.json`: independent row-level evaluation.
50
+
51
+ ## Inference
52
+
53
+ Install the appropriate PaddlePaddle build for your hardware, then:
54
+
55
+ ```bash
56
+ pip install "paddleocr>=3.3.0,<4"
57
+ git clone https://huggingface.co/Reza2kn/Bina-0.2-RizehPizeh
58
+ cd Bina-0.2-RizehPizeh
59
+ python bina_text_recognition.py path/to/line.jpg --device cpu
60
+ ```
61
+
62
+ Or use it from Python:
63
+
64
+ ```python
65
+ from bina_text_recognition import BinaTextRecognition
66
+
67
+ model = BinaTextRecognition("inference", device="cpu")
68
+ for result in model.predict("line.jpg"):
69
+ print(result["text"], result["score"])
70
+ ```
71
+
72
+ The exported CTC model emits Persian in visual order. Use the included wrapper
73
+ to recover logical reading order while preserving Latin and numeric runs.
74
+
75
+ ## Input contract
76
+
77
+ The recognizer expects a horizontal, content-tight line crop:
78
+
79
+ - Rotate tall detector crops 90 degrees clockwise.
80
+ - Remove excessive printed-image background while retaining a small margin.
81
+ - Resize to `3 x 48 x 768` with `padding: false`.
82
+ - Preserve ZWNJ and Persian digits.
83
+
84
+ For full-page OCR, pair this recognizer with
85
+ [`PaddlePaddle/PP-OCRv6_medium_det_safetensors`](https://huggingface.co/PaddlePaddle/PP-OCRv6_medium_det_safetensors),
86
+ rectify and normalize each detected crop, recognize each line, then reconstruct
87
+ the page in reading order. This repository contains the recognizer, not the
88
+ detector.
89
+
90
+ ## Training
91
 
92
+ The verified release used 169,000 balanced training lines:
 
 
93
 
94
+ - 84,500 teacher-aligned handwriting crops.
95
+ - 84,500 printed line images.
96
+ - 4,096 page-isolated held-out evaluation lines.
97
 
98
+ Training stopped automatically after validation plateaued. The best checkpoint
99
+ was selected around step 47,520. Dataset revisions and preprocessing details
100
+ are pinned in `MODEL_PROVENANCE.json`.
101
 
102
+ ## Limitations
 
 
103
 
104
+ - Persian-focused; other-language performance was not preserved or evaluated.
105
+ - Full-page use requires a separate detector and reading-order reconstruction.
106
+ - The handwriting split is teacher-aligned and may contain residual label noise.
107
+ - Very small isolated symbols and unusually degraded crops remain difficult.
108
 
109
+ ## License
 
 
110
 
111
+ Apache License 2.0. See `LICENSE`.
 
bina_text_recognition.py ADDED
@@ -0,0 +1,87 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ """Logical-order Persian inference for Bina 0.2 - RizehPizeh."""
3
+
4
+ from __future__ import annotations
5
+
6
+ import argparse
7
+ import json
8
+ import re
9
+ from pathlib import Path
10
+ from typing import Any, Iterator
11
+
12
+ from paddleocr import TextRecognition
13
+
14
+
15
+ _LTR_RUN = re.compile(r"[a-zA-Z0-9 :*./%+-]")
16
+
17
+
18
+ def pred_reverse(text: str) -> str:
19
+ """Match PaddleOCR's Arabic-aware BaseRecLabelDecode.pred_reverse."""
20
+ segments: list[str] = []
21
+ current_ltr = ""
22
+ for character in text:
23
+ if _LTR_RUN.search(character):
24
+ current_ltr += character
25
+ continue
26
+ if current_ltr:
27
+ segments.append(current_ltr)
28
+ current_ltr = ""
29
+ segments.append(character)
30
+ if current_ltr:
31
+ segments.append(current_ltr)
32
+ return "".join(reversed(segments))
33
+
34
+
35
+ class BinaTextRecognition:
36
+ """Run the exported Paddle model and return logical-order Persian text."""
37
+
38
+ def __init__(
39
+ self,
40
+ model_dir: str | Path | None = None,
41
+ device: str | None = None,
42
+ ) -> None:
43
+ if model_dir is None:
44
+ model_dir = Path(__file__).resolve().parent / "inference"
45
+ options: dict[str, Any] = {"model_dir": str(model_dir)}
46
+ if device is not None:
47
+ options["device"] = device
48
+ self._model = TextRecognition(**options)
49
+
50
+ def predict(
51
+ self,
52
+ input: str | Path | list[str] | list[Path],
53
+ batch_size: int = 1,
54
+ ) -> Iterator[dict[str, Any]]:
55
+ for result in self._model.predict(input=input, batch_size=batch_size):
56
+ payload = result.json
57
+ if callable(payload):
58
+ payload = payload()
59
+ raw = payload["res"]
60
+ visual_text = str(raw["rec_text"])
61
+ yield {
62
+ "input_path": raw.get("input_path"),
63
+ "text": pred_reverse(visual_text),
64
+ "score": float(raw["rec_score"]),
65
+ "raw_visual_text": visual_text,
66
+ }
67
+
68
+
69
+ def main() -> int:
70
+ parser = argparse.ArgumentParser()
71
+ parser.add_argument("images", nargs="+")
72
+ parser.add_argument(
73
+ "--model-dir",
74
+ default=str(Path(__file__).resolve().parent / "inference"),
75
+ )
76
+ parser.add_argument("--device", default=None)
77
+ parser.add_argument("--batch-size", type=int, default=1)
78
+ args = parser.parse_args()
79
+
80
+ model = BinaTextRecognition(args.model_dir, device=args.device)
81
+ for prediction in model.predict(args.images, batch_size=args.batch_size):
82
+ print(json.dumps(prediction, ensure_ascii=False))
83
+ return 0
84
+
85
+
86
+ if __name__ == "__main__":
87
+ raise SystemExit(main())
config.yml ADDED
@@ -0,0 +1,78 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Global:
2
+ model_name: PP-OCRv6_medium_rec
3
+ debug: false
4
+ use_gpu: true
5
+ epoch_num: 12
6
+ log_smooth_window: 20
7
+ print_batch_step: 20
8
+ save_model_dir: ./output
9
+ save_epoch_step: 1
10
+ eval_batch_step:
11
+ - 0
12
+ - 2640
13
+ cal_metric_during_train: false
14
+ pretrained_model: ./Bina-0.2-RizehPizeh
15
+ checkpoints: null
16
+ save_inference_dir: ./inference
17
+ use_visualdl: false
18
+ infer_img: doc/imgs_words/ch/word_1.jpg
19
+ character_dict_path: ./persian_arabic_bina02_dict.txt
20
+ max_text_length: 128
21
+ infer_mode: false
22
+ use_space_char: true
23
+ distributed: false
24
+ save_res_path: /home/rezo/bina02-ppocr/clean-restart/runs/bina02-169k-cropnorm-cw-bs16-v1/predicts.txt
25
+ d2s_train_image_shape:
26
+ - 3
27
+ - 48
28
+ - 768
29
+ Optimizer:
30
+ name: Adam
31
+ beta1: 0.9
32
+ beta2: 0.999
33
+ lr:
34
+ name: Cosine
35
+ learning_rate: 0.0003
36
+ warmup_epoch: 0
37
+ regularizer:
38
+ name: L2
39
+ factor: 0.0
40
+ Architecture:
41
+ model_type: rec
42
+ algorithm: SVTR_LCNet
43
+ Transform: null
44
+ Backbone:
45
+ name: PPLCNetV4
46
+ model_size: medium
47
+ train_pool_width: 96
48
+ force_pool_width: true
49
+ Head:
50
+ name: MultiHead
51
+ head_list:
52
+ - CTCHead:
53
+ Neck:
54
+ name: lightsvtr
55
+ dims: 192
56
+ depth: 2
57
+ mlp_ratio: 4.0
58
+ local_kernel: 7
59
+ use_guide: false
60
+ Head:
61
+ fc_decay: 1.0e-05
62
+ - NRTRHead:
63
+ nrtr_dim: 512
64
+ max_text_length: 128
65
+ Loss:
66
+ name: MultiLoss
67
+ weight_1: 1.0
68
+ weight_2: 0.0
69
+ loss_config_list:
70
+ - CTCLoss: null
71
+ - NRTRLoss: null
72
+ PostProcess:
73
+ name: CTCLabelDecode
74
+ Metric:
75
+ name: RecMetric
76
+ main_indicator: norm_edit_dis
77
+ ignore_space: false
78
+ profiler_options: null
eval-aligned-row-analysis-v2.json ADDED
The diff for this file is too large to render. See raw diff
 
inference/inference.json ADDED
The diff for this file is too large to render. See raw diff
 
inference/inference.pdiparams ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:4f84e43243e9bb2a6b5617da2a22c071f5ebf2db489c1fb55d7e3dd1e2dc99e3
3
+ size 62146801
inference/inference.yml ADDED
@@ -0,0 +1,205 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Global:
2
+ model_name: PP-OCRv6_medium_rec
3
+ Hpi:
4
+ backend_configs:
5
+ paddle_infer:
6
+ trt_dynamic_shapes: &id001
7
+ x:
8
+ - - 1
9
+ - 3
10
+ - 48
11
+ - 160
12
+ - - 1
13
+ - 3
14
+ - 48
15
+ - 320
16
+ - - 8
17
+ - 3
18
+ - 48
19
+ - 3200
20
+ tensorrt:
21
+ dynamic_shapes: *id001
22
+ PreProcess:
23
+ transform_ops:
24
+ - DecodeImage:
25
+ channel_first: false
26
+ img_mode: BGR
27
+ - MultiLabelEncode:
28
+ gtc_encode: NRTRLabelEncode
29
+ - RecResizeImg:
30
+ image_shape:
31
+ - 3
32
+ - 48
33
+ - 768
34
+ padding: false
35
+ - KeepKeys:
36
+ keep_keys:
37
+ - image
38
+ - label_ctc
39
+ - label_gtc
40
+ - length
41
+ - valid_ratio
42
+ PostProcess:
43
+ name: CTCLabelDecode
44
+ character_dict:
45
+ - '!'
46
+ - '"'
47
+ - '#'
48
+ - '%'
49
+ - '&'
50
+ - ''''
51
+ - (
52
+ - )
53
+ - '*'
54
+ - +
55
+ - ','
56
+ - '-'
57
+ - .
58
+ - /
59
+ - '0'
60
+ - '1'
61
+ - '2'
62
+ - '3'
63
+ - '4'
64
+ - '5'
65
+ - '6'
66
+ - '7'
67
+ - '8'
68
+ - '9'
69
+ - ':'
70
+ - '='
71
+ - '@'
72
+ - A
73
+ - B
74
+ - C
75
+ - D
76
+ - E
77
+ - F
78
+ - G
79
+ - H
80
+ - I
81
+ - J
82
+ - K
83
+ - L
84
+ - M
85
+ - N
86
+ - O
87
+ - P
88
+ - Q
89
+ - R
90
+ - S
91
+ - T
92
+ - U
93
+ - V
94
+ - W
95
+ - X
96
+ - Y
97
+ - Z
98
+ - '['
99
+ - ']'
100
+ - _
101
+ - a
102
+ - b
103
+ - c
104
+ - d
105
+ - e
106
+ - f
107
+ - g
108
+ - h
109
+ - i
110
+ - j
111
+ - k
112
+ - l
113
+ - m
114
+ - n
115
+ - o
116
+ - p
117
+ - q
118
+ - r
119
+ - s
120
+ - t
121
+ - u
122
+ - v
123
+ - w
124
+ - x
125
+ - y
126
+ - z
127
+ - «
128
+ - ­
129
+ - »
130
+ - â
131
+ - ،
132
+ - ؛
133
+ - ؟
134
+ - ء
135
+ - آ
136
+ - أ
137
+ - ؤ
138
+ - إ
139
+ - ئ
140
+ - ا
141
+ - ب
142
+ - ة
143
+ - ت
144
+ - ث
145
+ - ج
146
+ - ح
147
+ - خ
148
+ - د
149
+ - ذ
150
+ - ر
151
+ - ز
152
+ - س
153
+ - ش
154
+ - ص
155
+ - ض
156
+ - ط
157
+ - ظ
158
+ - ع
159
+ - غ
160
+ - ف
161
+ - ق
162
+ - ل
163
+ - م
164
+ - ن
165
+ - ه
166
+ - و
167
+ - ً
168
+ - ٌ
169
+ - ٍ
170
+ - َ
171
+ - ُ
172
+ - ِ
173
+ - ّ
174
+ - ْ
175
+ - ٔ
176
+ - ٪
177
+ - ٫
178
+ - ٬
179
+ - ٰ
180
+ - پ
181
+ - چ
182
+ - ژ
183
+ - ک
184
+ - گ
185
+ - ھ
186
+ - ۀ
187
+ - ی
188
+ - ە
189
+ - ۰
190
+ - ۱
191
+ - ۲
192
+ - ۳
193
+ - ۴
194
+ - ۵
195
+ - ۶
196
+ - ۷
197
+ - ۸
198
+ - ۹
199
+ - ‌
200
+ - –
201
+ - ’
202
+ - “
203
+ - ”
204
+ - •
205
+ - …
latest-checkpoint.json CHANGED
@@ -1,12 +1,30 @@
1
  {
2
- "tag": "eval-00001",
3
- "metric": 0.1309979951383562,
4
- "checkpoint_prefix": "best_accuracy",
 
 
 
 
 
 
 
 
 
 
 
5
  "uploaded": [
6
- "best_accuracy.pdparams",
7
- "best_accuracy.states",
8
- "PP-OCRv6_medium_rec_persian_rtl_ctc_stage.yml",
9
- "persian_arabic_dict.txt"
 
 
 
 
 
 
 
10
  ],
11
- "uploaded_at": "2026-07-24T05:12:43.651035+00:00"
12
- }
 
1
  {
2
+ "schema": "bina02.ppocrv6.release.v1",
3
+ "tag": "release-0.2.0-169k",
4
+ "status": "verified",
5
+ "checkpoint": "Bina-0.2-RizehPizeh.pdparams",
6
+ "inference_dir": "inference",
7
+ "logical_order_wrapper": "bina_text_recognition.py",
8
+ "main_metric": "mean_normalized_edit_similarity",
9
+ "metric": 0.9880669756561222,
10
+ "exact_line_accuracy": 0.84814453125,
11
+ "exact_lines": 3474,
12
+ "evaluation_rows": 4096,
13
+ "training_rows": 169000,
14
+ "best_training_step": 47520,
15
+ "controlled_early_stop": true,
16
  "uploaded": [
17
+ "Bina-0.2-RizehPizeh.pdparams",
18
+ "config.yml",
19
+ "persian_arabic_bina02_dict.txt",
20
+ "inference/inference.json",
21
+ "inference/inference.pdiparams",
22
+ "inference/inference.yml",
23
+ "bina_text_recognition.py",
24
+ "eval-aligned-row-analysis-v2.json",
25
+ "training-result.json",
26
+ "normalization-report.json",
27
+ "MODEL_PROVENANCE.json"
28
  ],
29
+ "uploaded_at": "2026-07-25T00:00:00Z"
30
+ }
normalization-report.json ADDED
@@ -0,0 +1,30 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "schema": "bina02.ppocrv6.crop-normalization.v1",
3
+ "created_at": "2026-07-25T07:06:43.871995+00:00",
4
+ "input_dir": "/home/rezo/bina02-ppocr/clean-restart/datasets/bina02-169k-eval4096-raw-v1-r1",
5
+ "input_contract_sha256": "412fef4f20487f05c1f95ea031f5efb56ed4700be919e1b09fa1f7516c18656c",
6
+ "output_dir": "/home/rezo/bina02-ppocr/clean-restart/datasets/bina02-169k-eval4096-cropnorm-cw-v1",
7
+ "tall_rotation": {
8
+ "threshold_height_over_width": 1.5,
9
+ "direction": "clockwise_90",
10
+ "selected_by_visual_persian_orientation_gate": true
11
+ },
12
+ "printed_foreground_trim": {
13
+ "background_estimator": "median_border_color",
14
+ "adaptive_border_noise_threshold": true,
15
+ "padding": "25_percent_of_detected_text_height_minimum_3px"
16
+ },
17
+ "source_counts": {
18
+ "eval_handwriting": 2048,
19
+ "eval_printed": 2048,
20
+ "train_handwriting": 84500,
21
+ "train_printed": 84500
22
+ },
23
+ "transformation_counts": {
24
+ "changed": 75556,
25
+ "rotated_tall": 1025,
26
+ "trimmed_printed": 74533,
27
+ "unchanged": 97540
28
+ },
29
+ "audit_rows": 160
30
+ }
persian_arabic_bina02_dict.txt ADDED
@@ -0,0 +1,161 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ !
2
+ "
3
+ #
4
+ %
5
+ &
6
+ '
7
+ (
8
+ )
9
+ *
10
+ +
11
+ ,
12
+ -
13
+ .
14
+ /
15
+ 0
16
+ 1
17
+ 2
18
+ 3
19
+ 4
20
+ 5
21
+ 6
22
+ 7
23
+ 8
24
+ 9
25
+ :
26
+ =
27
+ @
28
+ A
29
+ B
30
+ C
31
+ D
32
+ E
33
+ F
34
+ G
35
+ H
36
+ I
37
+ J
38
+ K
39
+ L
40
+ M
41
+ N
42
+ O
43
+ P
44
+ Q
45
+ R
46
+ S
47
+ T
48
+ U
49
+ V
50
+ W
51
+ X
52
+ Y
53
+ Z
54
+ [
55
+ ]
56
+ _
57
+ a
58
+ b
59
+ c
60
+ d
61
+ e
62
+ f
63
+ g
64
+ h
65
+ i
66
+ j
67
+ k
68
+ l
69
+ m
70
+ n
71
+ o
72
+ p
73
+ q
74
+ r
75
+ s
76
+ t
77
+ u
78
+ v
79
+ w
80
+ x
81
+ y
82
+ z
83
+ «
84
+ ­
85
+ »
86
+ â
87
+ ،
88
+ ؛
89
+ ؟
90
+ ء
91
+ آ
92
+ أ
93
+ ؤ
94
+ إ
95
+ ئ
96
+ ا
97
+ ب
98
+ ة
99
+ ت
100
+ ث
101
+ ج
102
+ ح
103
+ خ
104
+ د
105
+ ذ
106
+ ر
107
+ ز
108
+ س
109
+ ش
110
+ ص
111
+ ض
112
+ ط
113
+ ظ
114
+ ع
115
+ غ
116
+ ف
117
+ ق
118
+ ل
119
+ م
120
+ ن
121
+ ه
122
+ و
123
+ ً
124
+ ٌ
125
+ ٍ
126
+ َ
127
+ ُ
128
+ ِ
129
+ ّ
130
+ ْ
131
+ ٔ
132
+ ٪
133
+ ٫
134
+ ٬
135
+ ٰ
136
+ پ
137
+ چ
138
+ ژ
139
+ ک
140
+ گ
141
+ ھ
142
+ ۀ
143
+ ی
144
+ ە
145
+ ۰
146
+ ۱
147
+ ۲
148
+ ۳
149
+ ۴
150
+ ۵
151
+ ۶
152
+ ۷
153
+ ۸
154
+ ۹
155
+
156
+
157
+
158
+
159
+
160
+
161
+
requirements.txt ADDED
@@ -0,0 +1 @@
 
 
1
+ paddleocr>=3.3.0,<4
training-result.json ADDED
@@ -0,0 +1,242 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "schema": "bina02.ppocrv6.training-result.v1",
3
+ "finished_at": "2026-07-25T11:04:58.586455+00:00",
4
+ "return_code": -9,
5
+ "successful": true,
6
+ "controlled_early_stop": true,
7
+ "early_stop_reason": "eval plateau: 3 evaluations without 0.0005 improvement",
8
+ "best_accuracy": 0.8481445291793347,
9
+ "best_norm_edit_dis": 0.9880669756852556,
10
+ "best_checkpoint": "/home/rezo/bina02-ppocr/clean-restart/runs/bina02-169k-cropnorm-cw-bs16-v1/best_accuracy.pdparams",
11
+ "evaluations": [
12
+ {
13
+ "index": 1,
14
+ "global_step": 2640,
15
+ "accuracy": 0.5881347641891241,
16
+ "norm_edit_dis": 0.9612002209876604,
17
+ "best_norm_edit_dis": 0.9612002209876604,
18
+ "improved": true,
19
+ "non_improvements": 0,
20
+ "drop_from_previous_best": 0.0,
21
+ "divergence_streak": 0,
22
+ "observed_at": "2026-07-25T07:20:11.257717+00:00"
23
+ },
24
+ {
25
+ "index": 2,
26
+ "global_step": 5280,
27
+ "accuracy": 0.6464843734216691,
28
+ "norm_edit_dis": 0.9677480993345097,
29
+ "best_norm_edit_dis": 0.9677480993345097,
30
+ "improved": true,
31
+ "non_improvements": 0,
32
+ "drop_from_previous_best": 0.0,
33
+ "divergence_streak": 0,
34
+ "observed_at": "2026-07-25T07:32:37.242234+00:00"
35
+ },
36
+ {
37
+ "index": 3,
38
+ "global_step": 7920,
39
+ "accuracy": 0.6882324201947451,
40
+ "norm_edit_dis": 0.973724844070093,
41
+ "best_norm_edit_dis": 0.973724844070093,
42
+ "improved": true,
43
+ "non_improvements": 0,
44
+ "drop_from_previous_best": 0.0,
45
+ "divergence_streak": 0,
46
+ "observed_at": "2026-07-25T07:45:13.603325+00:00"
47
+ },
48
+ {
49
+ "index": 4,
50
+ "global_step": 10560,
51
+ "accuracy": 0.7138671857571602,
52
+ "norm_edit_dis": 0.9761125351838771,
53
+ "best_norm_edit_dis": 0.9761125351838771,
54
+ "improved": true,
55
+ "non_improvements": 0,
56
+ "drop_from_previous_best": 0.0,
57
+ "divergence_streak": 0,
58
+ "observed_at": "2026-07-25T07:57:47.703518+00:00"
59
+ },
60
+ {
61
+ "index": 5,
62
+ "global_step": 13200,
63
+ "accuracy": 0.7299804669678212,
64
+ "norm_edit_dis": 0.9779608426028906,
65
+ "best_norm_edit_dis": 0.9779608426028906,
66
+ "improved": true,
67
+ "non_improvements": 0,
68
+ "drop_from_previous_best": 0.0,
69
+ "divergence_streak": 0,
70
+ "observed_at": "2026-07-25T08:10:16.679644+00:00"
71
+ },
72
+ {
73
+ "index": 6,
74
+ "global_step": 15840,
75
+ "accuracy": 0.7290039044702054,
76
+ "norm_edit_dis": 0.979855846795511,
77
+ "best_norm_edit_dis": 0.979855846795511,
78
+ "improved": true,
79
+ "non_improvements": 0,
80
+ "drop_from_previous_best": 0.0,
81
+ "divergence_streak": 0,
82
+ "observed_at": "2026-07-25T08:22:48.532289+00:00"
83
+ },
84
+ {
85
+ "index": 7,
86
+ "global_step": 18480,
87
+ "accuracy": 0.7653808575063944,
88
+ "norm_edit_dis": 0.979829669506852,
89
+ "best_norm_edit_dis": 0.979855846795511,
90
+ "improved": false,
91
+ "non_improvements": 1,
92
+ "drop_from_previous_best": 2.6177288658946196e-05,
93
+ "divergence_streak": 0,
94
+ "observed_at": "2026-07-25T08:37:32.427923+00:00"
95
+ },
96
+ {
97
+ "index": 8,
98
+ "global_step": 21120,
99
+ "accuracy": 0.7753906231069565,
100
+ "norm_edit_dis": 0.9814539673948058,
101
+ "best_norm_edit_dis": 0.9814539673948058,
102
+ "improved": true,
103
+ "non_improvements": 0,
104
+ "drop_from_previous_best": 0.0,
105
+ "divergence_streak": 0,
106
+ "observed_at": "2026-07-25T08:51:23.080452+00:00"
107
+ },
108
+ {
109
+ "index": 9,
110
+ "global_step": 23760,
111
+ "accuracy": 0.7587890606474877,
112
+ "norm_edit_dis": 0.981071337637594,
113
+ "best_norm_edit_dis": 0.9814539673948058,
114
+ "improved": false,
115
+ "non_improvements": 1,
116
+ "drop_from_previous_best": 0.00038262975721181647,
117
+ "divergence_streak": 0,
118
+ "observed_at": "2026-07-25T09:04:03.720626+00:00"
119
+ },
120
+ {
121
+ "index": 10,
122
+ "global_step": 26400,
123
+ "accuracy": 0.7915039043176175,
124
+ "norm_edit_dis": 0.983208850446246,
125
+ "best_norm_edit_dis": 0.983208850446246,
126
+ "improved": true,
127
+ "non_improvements": 0,
128
+ "drop_from_previous_best": 0.0,
129
+ "divergence_streak": 0,
130
+ "observed_at": "2026-07-25T09:16:30.813483+00:00"
131
+ },
132
+ {
133
+ "index": 11,
134
+ "global_step": 29040,
135
+ "accuracy": 0.8000488261717559,
136
+ "norm_edit_dis": 0.9850307471722586,
137
+ "best_norm_edit_dis": 0.9850307471722586,
138
+ "improved": true,
139
+ "non_improvements": 0,
140
+ "drop_from_previous_best": 0.0,
141
+ "divergence_streak": 0,
142
+ "observed_at": "2026-07-25T09:28:59.631125+00:00"
143
+ },
144
+ {
145
+ "index": 12,
146
+ "global_step": 31680,
147
+ "accuracy": 0.8083496074014903,
148
+ "norm_edit_dis": 0.9836650837985914,
149
+ "best_norm_edit_dis": 0.9850307471722586,
150
+ "improved": false,
151
+ "non_improvements": 1,
152
+ "drop_from_previous_best": 0.0013656633736671697,
153
+ "divergence_streak": 0,
154
+ "observed_at": "2026-07-25T09:41:29.039156+00:00"
155
+ },
156
+ {
157
+ "index": 13,
158
+ "global_step": 34320,
159
+ "accuracy": 0.7922363261908293,
160
+ "norm_edit_dis": 0.98275246046674,
161
+ "best_norm_edit_dis": 0.9850307471722586,
162
+ "improved": false,
163
+ "non_improvements": 2,
164
+ "drop_from_previous_best": 0.0022782867055185507,
165
+ "divergence_streak": 0,
166
+ "observed_at": "2026-07-25T09:53:58.505024+00:00"
167
+ },
168
+ {
169
+ "index": 14,
170
+ "global_step": 36960,
171
+ "accuracy": 0.8330078104662896,
172
+ "norm_edit_dis": 0.9868847268274252,
173
+ "best_norm_edit_dis": 0.9868847268274252,
174
+ "improved": true,
175
+ "non_improvements": 0,
176
+ "drop_from_previous_best": 0.0,
177
+ "divergence_streak": 0,
178
+ "observed_at": "2026-07-25T10:06:26.926320+00:00"
179
+ },
180
+ {
181
+ "index": 15,
182
+ "global_step": 39600,
183
+ "accuracy": 0.8295898417246342,
184
+ "norm_edit_dis": 0.9864037791447516,
185
+ "best_norm_edit_dis": 0.9868847268274252,
186
+ "improved": false,
187
+ "non_improvements": 1,
188
+ "drop_from_previous_best": 0.00048094768267359367,
189
+ "divergence_streak": 0,
190
+ "observed_at": "2026-07-25T10:18:36.971893+00:00"
191
+ },
192
+ {
193
+ "index": 16,
194
+ "global_step": 42240,
195
+ "accuracy": 0.8410644510716201,
196
+ "norm_edit_dis": 0.9879572095741785,
197
+ "best_norm_edit_dis": 0.9879572095741785,
198
+ "improved": true,
199
+ "non_improvements": 0,
200
+ "drop_from_previous_best": 0.0,
201
+ "divergence_streak": 0,
202
+ "observed_at": "2026-07-25T10:30:11.294311+00:00"
203
+ },
204
+ {
205
+ "index": 17,
206
+ "global_step": 44880,
207
+ "accuracy": 0.8378906229543687,
208
+ "norm_edit_dis": 0.9864775757778249,
209
+ "best_norm_edit_dis": 0.9879572095741785,
210
+ "improved": false,
211
+ "non_improvements": 1,
212
+ "drop_from_previous_best": 0.00147963379635363,
213
+ "divergence_streak": 0,
214
+ "observed_at": "2026-07-25T10:41:48.087810+00:00"
215
+ },
216
+ {
217
+ "index": 18,
218
+ "global_step": 47520,
219
+ "accuracy": 0.8481445291793347,
220
+ "norm_edit_dis": 0.9880669756852556,
221
+ "best_norm_edit_dis": 0.9880669756852556,
222
+ "improved": false,
223
+ "non_improvements": 2,
224
+ "drop_from_previous_best": 0.0,
225
+ "divergence_streak": 0,
226
+ "observed_at": "2026-07-25T10:53:22.398897+00:00"
227
+ },
228
+ {
229
+ "index": 19,
230
+ "global_step": 50160,
231
+ "accuracy": 0.8452148416864873,
232
+ "norm_edit_dis": 0.9871606702893853,
233
+ "best_norm_edit_dis": 0.9880669756852556,
234
+ "improved": false,
235
+ "non_improvements": 3,
236
+ "drop_from_previous_best": 0.0009063053958703327,
237
+ "divergence_streak": 0,
238
+ "observed_at": "2026-07-25T11:04:58.349735+00:00"
239
+ }
240
+ ],
241
+ "log": "/home/rezo/bina02-ppocr/clean-restart/runs/bina02-169k-cropnorm-cw-bs16-v1/train.log"
242
+ }