From e0838087a1aeef8d9f9b67235ba2e2f15124c899 Mon Sep 17 00:00:00 2001 From: Benjamin Kiessling Date: Thu, 22 Feb 2024 10:18:04 +0100 Subject: [PATCH 01/76] Fix regression in segtrain --- kraken/lib/train.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/kraken/lib/train.py b/kraken/lib/train.py index fa7dd5450..1ba45eb00 100644 --- a/kraken/lib/train.py +++ b/kraken/lib/train.py @@ -839,8 +839,7 @@ def __init__(self, train_set.add(page) if evaluation_data: - val_set = BaselineSet(evaluation_data, - line_width=self.hparams.hyper_params['line_width'], + val_set = BaselineSet(line_width=self.hparams.hyper_params['line_width'], im_transforms=transforms, augmentation=False, valid_baselines=valid_baselines, From 2ff205549becb0d49a04918a7a4ca587438182b5 Mon Sep 17 00:00:00 2001 From: Benjamin Kiessling Date: Fri, 1 Mar 2024 19:38:26 +0100 Subject: [PATCH 02/76] Avoid duplicate ids in alto line/region typology --- kraken/templates/alto | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/kraken/templates/alto b/kraken/templates/alto index 9d648b1e9..f018d2f5b 100644 --- a/kraken/templates/alto +++ b/kraken/templates/alto @@ -3,7 +3,7 @@ 'postprocessing': 'postOperation'} %} {%+ macro render_line(page, line) +%} - + {% if line.boundary %} @@ -72,10 +72,10 @@ {% for type, label in page.line_types %} - + {% endfor %} {% for label in page.region_types %} - + {% endfor %} {% if page.line_orders|length() > 0 %} @@ -107,7 +107,7 @@ {% if loop.previtem and loop.previtem.type == 'line' %} {% endif %} - + From e4b02515479860af708359a9194e123cb9b40203 Mon Sep 17 00:00:00 2001 From: Benjamin Kiessling Date: Fri, 1 Mar 2024 20:06:08 +0100 Subject: [PATCH 03/76] Slight template improvements * fix regression in line type attribution * retain region/line identifiers from records --- kraken/serialization.py | 2 +- kraken/templates/alto | 4 ++-- kraken/templates/pagexml | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/kraken/serialization.py b/kraken/serialization.py index fb2b8ef69..cb335a71b 100644 --- a/kraken/serialization.py +++ b/kraken/serialization.py @@ -163,7 +163,7 @@ def serialize(results: 'Segmentation', # set field to indicate the availability of baseline segmentation in # addition to bounding boxes - line = {'index': idx, + line = {'id': record.id, 'bbox': max_bbox([record.boundary]) if record.type == 'baselines' else record.bbox, 'cuts': record.cuts, 'confidences': record.confidences, diff --git a/kraken/templates/alto b/kraken/templates/alto index f018d2f5b..b3ab3fc4b 100644 --- a/kraken/templates/alto +++ b/kraken/templates/alto @@ -3,7 +3,7 @@ 'postprocessing': 'postOperation'} %} {%+ macro render_line(page, line) +%} - + {% if line.boundary %} @@ -107,7 +107,7 @@ {% if loop.previtem and loop.previtem.type == 'line' %} {% endif %} - + diff --git a/kraken/templates/pagexml b/kraken/templates/pagexml index 6274eaf64..daea1ac00 100644 --- a/kraken/templates/pagexml +++ b/kraken/templates/pagexml @@ -1,5 +1,5 @@ {%+ macro render_line(line) +%} - + {% if line.boundary %} {% endif %} @@ -38,7 +38,7 @@ {% if loop.previtem and loop.previtem.type == 'line' %} {% endif %} - + {%- for line in entity.lines -%} {{ render_line(line) }} From 291a0e87765e6bab06a56eccb7164706d1530d9e Mon Sep 17 00:00:00 2001 From: Benjamin Kiessling Date: Fri, 1 Mar 2024 20:32:36 +0100 Subject: [PATCH 04/76] more slight template tweaks --- kraken/templates/alto | 2 +- kraken/templates/hocr | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/kraken/templates/alto b/kraken/templates/alto index b3ab3fc4b..ceed78733 100644 --- a/kraken/templates/alto +++ b/kraken/templates/alto @@ -107,7 +107,7 @@ {% if loop.previtem and loop.previtem.type == 'line' %} {% endif %} - + diff --git a/kraken/templates/hocr b/kraken/templates/hocr index 110632f37..81b31c480 100644 --- a/kraken/templates/hocr +++ b/kraken/templates/hocr @@ -1,5 +1,5 @@ {% macro render_line(line) -%} - + {% for segment in line.recognition %} {{ segment.text }} {% endfor -%} @@ -20,7 +20,7 @@
{% for entity in page.entities -%} {% if entity.type == "region" -%} -
+
{% for line in entity.lines -%} {{ render_line(line) }} {% endfor %} From 369dd60aa41a78988da3753ebe0dfbf04e155650 Mon Sep 17 00:00:00 2001 From: Benjamin Kiessling Date: Mon, 4 Mar 2024 13:53:37 +0100 Subject: [PATCH 05/76] change identifiers in records tests fail for some weird reason with uuids --- tests/resources/bl_records.json | 2 +- tests/resources/records.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/resources/bl_records.json b/tests/resources/bl_records.json index b6505886e..8c8ecb083 100644 --- a/tests/resources/bl_records.json +++ b/tests/resources/bl_records.json @@ -1 +1 @@ -{"lines": [{"prediction": "238", "cuts": [[39, 39], [65, 65], [96, 96]], "confidences": [0.9999942779541016, 0.9999815225601196, 0.9999997615814209], "line": {"boundary": [[1364, 228], [1366, 191], [1382, 177], [1444, 177], [1473, 202], [1479, 226], [1452, 241], [1380, 239], [1368, 231]], "baseline": [[1366, 230], [1440, 230], [1480, 227]], "id": "214dff1d-3871-4604-8438-18c0ae332b0d", "type": "baselines"}}, {"prediction": "\u0648\u0644\u0627 \u064a\u0639\u062a\u0646\u064a \u0628\u0642\u0636\u0627\u0621 \u062d\u0627\u062c\u0629 \u0645\u0636\u0637\u0631 \u0645\u0644\u0647\u0648\u0641\u060c \u0641\u0627\u0655\u0646\u0647 \u0645\u0646 \u0627\u0644\u0642\u0627\u0633\u064a\u0629 \u0642\u0644\u0648\u0628\u0647\u0645\u060c \u0627\u0644\u0645\u0639\u0631\u0636\u064a\u0646 \u0639\u0646", "cuts": [[1291, 1291], [1266, 1273], [1254, 1260], [1235, 1241], [1223, 1223], [1204, 1210], [1192, 1192], [1179, 1179], [1167, 1167], [1136, 1136], [1124, 1124], [1111, 1111], [1086, 1086], [1055, 1061], [1043, 1043], [1018, 1024], [999, 999], [981, 981], [956, 962], [937, 937], [913, 919], [900, 900], [875, 881], [838, 838], [819, 819], [795, 801], [782, 782], [770, 770], [751, 751], [732, 732], [714, 714], [670, 670], [646, 658], [639, 639], [627, 633], [621, 621], [615, 615], [602, 602], [577, 584], [565, 565], [540, 540], [515, 521], [503, 509], [497, 497], [484, 484], [459, 466], [447, 447], [428, 428], [410, 410], [385, 391], [379, 379], [360, 360], [348, 348], [329, 329], [310, 310], [286, 292], [273, 273], [248, 255], [242, 242], [230, 230], [211, 211], [192, 192], [174, 174], [149, 155], [118, 118], [99, 106], [68, 75], [56, 56], [31, 31]], "confidences": [0.9918296933174133, 0.9999946355819702, 0.9999945163726807, 0.9999985694885254, 0.9999771118164062, 0.9999879598617554, 0.9987093210220337, 0.9987457990646362, 0.9997931122779846, 0.999688982963562, 0.9999251365661621, 0.587072491645813, 0.9999754428863525, 0.99989914894104, 0.9920154809951782, 0.9999525547027588, 0.9999878406524658, 0.9997779726982117, 0.9999771118164062, 0.9966135621070862, 0.9999631643295288, 0.9998565912246704, 0.9999505281448364, 0.9981879591941833, 0.8379210829734802, 0.9999366998672485, 0.9966161847114563, 0.9895930290222168, 0.9999837875366211, 0.9999969005584717, 0.8669806122779846, 0.974852979183197, 0.9999998807907104, 0.9999897480010986, 0.9999994039535522, 0.9228501319885254, 0.9999959468841553, 0.9999970197677612, 0.9999334812164307, 0.9997324347496033, 0.9999984502792358, 0.9917014241218567, 0.9999793767929077, 1.0, 0.9999970197677612, 0.9935858845710754, 0.9999581575393677, 0.8294568061828613, 0.9999990463256836, 0.9999179840087891, 0.9999973773956299, 0.9964264035224915, 0.9883396625518799, 0.7585844993591309, 0.962102472782135, 0.8603035807609558, 0.9998493194580078, 0.9999865293502808, 0.9999082088470459, 0.9998868703842163, 0.999321699142456, 0.9835970997810364, 0.8893908262252808, 0.9999939203262329, 0.9998082518577576, 0.9999799728393555, 0.9999867677688599, 0.5397316217422485, 0.8847019076347351], "line": {"boundary": [[167, 337], [177, 290], [216, 288], [233, 302], [255, 288], [278, 300], [309, 282], [329, 300], [356, 296], [387, 276], [415, 294], [452, 300], [465, 292], [487, 298], [508, 278], [534, 278], [547, 288], [567, 278], [590, 298], [614, 278], [651, 276], [680, 298], [693, 292], [736, 302], [769, 280], [797, 282], [814, 298], [840, 296], [865, 280], [890, 298], [914, 278], [951, 292], [984, 265], [996, 265], [1021, 288], [1056, 280], [1072, 292], [1097, 282], [1113, 296], [1132, 280], [1179, 306], [1204, 282], [1228, 294], [1265, 284], [1298, 311], [1331, 290], [1362, 296], [1428, 280], [1491, 335], [1463, 335], [1446, 350], [1401, 335], [1380, 350], [1347, 341], [1313, 362], [1288, 345], [1270, 350], [1259, 341], [1212, 339], [1189, 346], [1171, 331], [1093, 348], [1066, 335], [1003, 339], [978, 362], [941, 337], [910, 348], [853, 352], [808, 327], [783, 346], [732, 327], [701, 350], [682, 350], [664, 335], [602, 335], [569, 346], [547, 327], [499, 348], [458, 343], [440, 358], [405, 333], [345, 335], [327, 348], [292, 337], [245, 350], [226, 335], [171, 348]], "baseline": [[169, 339], [269, 335], [304, 329], [1288, 329], [1368, 331], [1389, 335], [1492, 337]], "id": "f8a7011f-22a0-4aa6-b9e8-dbf130eec847", "type": "baselines"}}, {"prediction": "\u0631\u0628\u0647\u0645\u060c \u0642\u0644\u0628\u0647 \u0628\u0639\u064a\u062f \u0645\u0646 \u0627\u0644\u0627\u0653\u062e\u0631\u0629\u060c \u0645\u062a\u0639\u0644\u0642 \u0628\u0627\u0644\u062f\u0646\u064a\u0627\u060c\u0639\u0644\u0645\u0647 \u062f\u0643\u0627\u0646\u0647\u060c \u0648\u064a\u062a\u0627\u0654\u0643\u0644 \u0648\u064a\u0631\u062a\u0632\u0642\u060c \u0648\u0644\u0627 \u064a\u0639\u0627\u0645\u0644", "cuts": [[1302, 1302], [1280, 1280], [1269, 1269], [1241, 1241], [1224, 1224], [1201, 1207], [1190, 1190], [1179, 1179], [1168, 1168], [1151, 1151], [1134, 1140], [1123, 1123], [1106, 1106], [1089, 1095], [1078, 1078], [1050, 1055], [1039, 1039], [1016, 1016], [988, 994], [982, 982], [966, 971], [954, 960], [949, 949], [926, 926], [909, 909], [893, 893], [876, 876], [853, 859], [842, 842], [831, 831], [808, 808], [797, 797], [780, 780], [747, 758], [741, 741], [730, 730], [719, 719], [702, 702], [685, 685], [674, 674], [662, 662], [646, 646], [629, 629], [612, 612], [589, 589], [573, 573], [550, 556], [539, 539], [522, 522], [500, 505], [494, 494], [477, 477], [460, 466], [443, 449], [432, 432], [415, 415], [404, 404], [393, 393], [382, 387], [376, 376], [354, 359], [320, 331], [314, 314], [292, 292], [281, 281], [264, 264], [253, 253], [230, 230], [196, 202], [180, 185], [168, 174], [146, 152], [135, 140], [112, 118], [107, 107], [84, 90], [73, 73], [56, 56], [39, 45]], "confidences": [0.999483585357666, 0.9989271759986877, 0.9999568462371826, 0.9999847412109375, 0.9999631643295288, 0.9999524354934692, 0.9999338388442993, 0.9999792575836182, 0.9999816417694092, 0.9999970197677612, 0.9998041987419128, 0.9913369417190552, 0.9999105930328369, 0.9999866485595703, 0.9997265934944153, 0.9998457431793213, 0.9999898672103882, 0.9658181667327881, 0.9998805522918701, 0.9999202489852905, 0.9999966621398926, 0.9999680519104004, 0.6977024078369141, 0.681415855884552, 0.9998468160629272, 0.999790370464325, 0.998950719833374, 0.9989398121833801, 0.9998928308486938, 0.9993798732757568, 0.9988120794296265, 0.9999618530273438, 0.978205144405365, 0.9999402761459351, 0.9968582391738892, 0.9899797439575195, 0.9999998807907104, 0.9918898940086365, 1.0, 0.6370328664779663, 0.9123554229736328, 0.9965428709983826, 0.9990838766098022, 0.6425076127052307, 0.999977707862854, 0.9999984502792358, 0.9999998807907104, 0.9999978542327881, 0.5949130058288574, 0.9999992847442627, 0.998330295085907, 0.863884687423706, 0.9997449517250061, 0.9999986886978149, 0.9999614953994751, 0.9998691082000732, 0.9999910593032837, 0.7401690483093262, 0.9997996687889099, 0.999140739440918, 0.9999452829360962, 0.9999958276748657, 0.9999629259109497, 0.999981164932251, 0.9999955892562866, 0.9999098777770996, 0.9996079802513123, 0.8690406680107117, 0.9999758005142212, 0.9999970197677612, 0.9999972581863403, 0.999855637550354, 0.9997760653495789, 0.9999991655349731, 0.9998064637184143, 0.9998438358306885, 0.8385894894599915, 0.9975091218948364, 0.9999769926071167], "line": {"boundary": [[161, 405], [165, 380], [189, 358], [206, 364], [224, 356], [257, 372], [276, 354], [298, 352], [335, 378], [384, 356], [393, 366], [413, 360], [432, 376], [467, 372], [477, 380], [516, 345], [528, 345], [571, 374], [600, 380], [639, 345], [670, 345], [713, 374], [754, 356], [787, 372], [805, 358], [844, 368], [875, 356], [904, 382], [941, 356], [961, 372], [982, 368], [1007, 382], [1029, 364], [1060, 378], [1087, 354], [1113, 350], [1150, 378], [1165, 372], [1204, 383], [1222, 368], [1284, 383], [1325, 358], [1384, 382], [1452, 380], [1465, 391], [1471, 415], [1440, 428], [1403, 424], [1385, 440], [1352, 413], [1317, 426], [1294, 413], [1274, 426], [1257, 419], [1231, 426], [1204, 409], [1169, 430], [1091, 409], [1044, 428], [1009, 407], [941, 415], [923, 426], [902, 419], [885, 424], [871, 413], [814, 424], [799, 411], [771, 422], [705, 405], [686, 415], [600, 407], [580, 422], [528, 411], [504, 428], [489, 428], [471, 415], [458, 422], [384, 424], [337, 405], [315, 422], [274, 405], [255, 421], [218, 409], [191, 426], [165, 419]], "baseline": [[163, 407], [1251, 407], [1325, 409], [1378, 417], [1473, 417]], "id": "625a33bb-09c9-4b52-a700-b196e8fd21dc", "type": "baselines"}}, {"prediction": "\u0627\u0644\u0644\u0647 \u0628\u0639\u0644\u0645\u0647 \u0627\u0655\u0644\u0627 \u0642\u0644\u064a\u0644\u0627\u060c \u064a\u0633\u0643\u062a \u0639\u0646 \u0627\u0644\u062d\u0642 \u062e\u0634\u064a\u0629 \u0633\u0642\u0648\u0637 \u0645\u0646\u0632\u0644\u062a\u0647\u060c \u0648\u064a\u0645\u0627\u0644\u064a\u0654 \u0639\u0644\u0649 \u0627\u0644\u0628\u0627\u0637\u0644 \u0637\u0644\u0628\u0627", "cuts": [[1285, 1285], [1274, 1280], [1263, 1263], [1258, 1258], [1236, 1241], [1230, 1230], [1214, 1214], [1198, 1198], [1181, 1181], [1159, 1165], [1143, 1148], [1137, 1137], [1126, 1132], [1116, 1121], [1105, 1110], [1088, 1094], [1077, 1077], [1066, 1066], [1050, 1050], [1034, 1039], [1023, 1028], [1006, 1006], [990, 995], [979, 979], [957, 962], [935, 935], [897, 897], [869, 875], [853, 853], [831, 831], [804, 809], [798, 798], [787, 787], [760, 760], [744, 744], [711, 716], [694, 694], [667, 667], [645, 645], [629, 629], [612, 618], [596, 602], [574, 574], [558, 558], [525, 525], [498, 503], [487, 492], [476, 476], [459, 465], [443, 448], [432, 432], [421, 421], [399, 405], [383, 388], [377, 377], [355, 355], [339, 339], [323, 323], [312, 312], [295, 295], [279, 284], [262, 268], [252, 252], [230, 230], [213, 213], [180, 186], [175, 175], [164, 170], [153, 153], [137, 142], [120, 120], [104, 104], [66, 71], [49, 55], [38, 38], [22, 22], [11, 16]], "confidences": [0.6223369240760803, 0.999977707862854, 0.9996325969696045, 0.9976205229759216, 0.9999915361404419, 0.9999442100524902, 0.9999935626983643, 0.9986664056777954, 0.9931642413139343, 0.999994158744812, 0.99997878074646, 0.9995927214622498, 0.9999953508377075, 0.9999521970748901, 0.9999961853027344, 0.9999990463256836, 0.9987659454345703, 0.9996764659881592, 0.9999899864196777, 0.9999946355819702, 0.9998693466186523, 0.9999508857727051, 0.9999494552612305, 0.9999960660934448, 0.9999898672103882, 0.9999620914459229, 0.9999936819076538, 0.9995738863945007, 0.9997065663337708, 0.9967997074127197, 0.9996978044509888, 0.9999291896820068, 0.9937999844551086, 0.7420834898948669, 0.9566183090209961, 0.9999990463256836, 0.9998831748962402, 0.9999995231628418, 0.8633337020874023, 0.9998383522033691, 1.0, 0.9999995231628418, 0.9999997615814209, 1.0, 0.9999963045120239, 0.9999927282333374, 0.9999871253967285, 0.9999827146530151, 0.9999991655349731, 0.9999961853027344, 0.9995644688606262, 0.9999992847442627, 0.9997718930244446, 0.999894380569458, 1.0, 0.9999994039535522, 0.9999990463256836, 0.9999983310699463, 1.0, 0.9998666048049927, 1.0, 0.9999922513961792, 0.9998834133148193, 0.9998831748962402, 0.9995386600494385, 0.9999641180038452, 0.9991496801376343, 0.9994356036186218, 0.9781442284584045, 0.9928722381591797, 0.9813116192817688, 0.9999994039535522, 0.9999991655349731, 0.999995231628418, 0.9999226331710815, 0.9999967813491821, 0.9934727549552917], "line": {"boundary": [[175, 477], [181, 422], [191, 432], [216, 430], [241, 454], [265, 432], [315, 438], [335, 430], [364, 456], [395, 432], [432, 458], [471, 432], [508, 456], [551, 458], [586, 448], [604, 432], [649, 450], [688, 432], [711, 454], [731, 438], [768, 454], [793, 434], [816, 450], [836, 440], [846, 450], [863, 442], [877, 454], [902, 430], [931, 450], [957, 436], [980, 454], [1000, 456], [1019, 446], [1037, 456], [1111, 434], [1134, 456], [1187, 426], [1212, 444], [1220, 436], [1251, 444], [1286, 436], [1315, 456], [1339, 456], [1356, 438], [1399, 458], [1424, 438], [1450, 440], [1467, 456], [1473, 481], [1440, 497], [1413, 495], [1393, 508], [1376, 497], [1319, 493], [1288, 506], [1257, 485], [1218, 504], [1165, 491], [1134, 502], [1122, 493], [1050, 495], [1031, 485], [996, 508], [978, 508], [961, 493], [931, 493], [906, 512], [867, 487], [807, 504], [783, 485], [732, 493], [721, 504], [666, 485], [621, 504], [555, 487], [538, 502], [481, 491], [450, 508], [421, 489], [378, 504], [356, 502], [341, 489], [313, 500], [298, 487], [261, 506], [245, 504], [226, 487], [179, 497]], "baseline": [[177, 479], [298, 477], [360, 485], [403, 487], [508, 487], [573, 483], [795, 483], [818, 487], [1475, 483]], "id": "3182e755-7ae8-4ba6-843e-b9c6556619d2", "type": "baselines"}}, {"prediction": "\u0644\u0644\u0631\u0641\u0639\u0629\u060c \u0641\u0645\u0627 \u0627\u0654\u0628\u0639\u062f \u0647\u0630\u0627 \u0639\u0646 \u0627\u0644\u0644\u0647 \u0648\u0639\u0646 \u0637\u0631\u064a\u0642\u0647\u060c \u0639\u0644\u0645\u0647 \u062d\u062c\u0629 \u0639\u0644\u064a\u0647.", "cuts": [[917, 917], [901, 901], [890, 890], [868, 868], [852, 852], [836, 836], [820, 820], [799, 804], [793, 793], [772, 772], [756, 756], [740, 745], [734, 734], [724, 729], [718, 718], [708, 708], [686, 691], [665, 670], [649, 654], [633, 633], [611, 611], [595, 600], [584, 584], [557, 557], [536, 536], [525, 531], [520, 520], [504, 504], [493, 499], [477, 482], [466, 472], [445, 445], [418, 423], [391, 397], [375, 375], [359, 359], [343, 343], [327, 327], [311, 311], [295, 295], [273, 279], [263, 263], [247, 247], [225, 225], [209, 209], [188, 193], [166, 166], [139, 139], [118, 118], [97, 102], [86, 86], [64, 70], [54, 54], [43, 43], [21, 27]], "confidences": [0.9995940327644348, 0.9446550607681274, 0.9981995820999146, 0.9999864101409912, 0.6075229644775391, 0.99992835521698, 0.9997560381889343, 0.9999634027481079, 0.9998078942298889, 0.9999945163726807, 0.9999508857727051, 0.9999924898147583, 0.9999949932098389, 0.9999926090240479, 0.9998032450675964, 0.9999107122421265, 0.9999817609786987, 0.9998050332069397, 0.9999833106994629, 0.9495548605918884, 0.9993699193000793, 0.9999070167541504, 0.9915083646774292, 0.999798595905304, 0.9999779462814331, 0.9999381303787231, 0.9971952438354492, 0.9972888231277466, 0.9999881982803345, 0.9999971389770508, 0.9995827078819275, 0.9999994039535522, 0.999994158744812, 0.9999692440032959, 0.9996156692504883, 0.5591697096824646, 0.9999910593032837, 0.9997571110725403, 0.8518497347831726, 0.9999833106994629, 0.9999939203262329, 0.9998816251754761, 0.9999935626983643, 0.9927089214324951, 0.9999922513961792, 0.996820330619812, 0.9999880790710449, 0.9995105266571045, 0.9999866485595703, 0.9999912977218628, 0.9999923706054688, 0.9999964237213135, 0.9993194341659546, 0.999998927116394, 0.9977816939353943], "line": {"boundary": [[547, 549], [551, 536], [600, 508], [629, 526], [649, 510], [680, 530], [703, 526], [723, 534], [773, 512], [814, 534], [853, 514], [883, 530], [908, 510], [933, 536], [945, 524], [1013, 532], [1035, 510], [1097, 534], [1165, 514], [1200, 537], [1214, 524], [1231, 532], [1265, 506], [1302, 530], [1321, 518], [1339, 534], [1358, 518], [1382, 530], [1391, 520], [1415, 528], [1424, 518], [1448, 516], [1465, 534], [1471, 559], [1417, 596], [1389, 575], [1337, 567], [1319, 575], [1274, 567], [1245, 582], [1233, 573], [1146, 573], [1128, 563], [1093, 586], [1076, 586], [1060, 571], [1021, 567], [998, 580], [974, 569], [957, 584], [939, 584], [918, 567], [888, 584], [814, 561], [803, 569], [742, 569], [725, 559], [666, 575], [635, 559], [592, 578], [549, 563]], "baseline": [[549, 551], [582, 557], [807, 555], [966, 565], [1473, 561]], "id": "8b76a51e-29ae-48ee-9ab9-b0761c9061d2", "type": "baselines"}}, {"prediction": "\u0648\u0645\u062a\u0649 \u0631\u0627\u0654\u064a\u062a\u0645 \u0627\u0644\u0639\u0627\u0644\u0645 \u0642\u0644\u064a\u0644 \u0627\u0644\u0648\u0631\u0639 \u0641\u064a \u0643\u0644\u0627\u0645\u0647 \u060c \u064a\u062a\u0643\u0644\u0645 \u0645\u062c\u0627\u0632\u0641\u0629\u060c \u0648\u064a\u0643\u0630\u0628 \u0627\u0654\u062d\u064a\u0627\u0646\u0627\u060c", "cuts": [[1223, 1223], [1201, 1201], [1190, 1190], [1173, 1173], [1129, 1140], [1118, 1118], [1101, 1107], [1096, 1096], [1090, 1090], [1079, 1079], [1062, 1062], [1029, 1040], [1024, 1024], [1013, 1018], [996, 996], [979, 979], [968, 968], [946, 952], [919, 924], [908, 908], [891, 891], [880, 880], [863, 869], [830, 836], [819, 825], [808, 813], [797, 802], [775, 775], [747, 747], [714, 719], [703, 703], [692, 692], [647, 659], [636, 636], [614, 614], [603, 609], [587, 587], [570, 570], [559, 559], [553, 553], [526, 531], [515, 515], [504, 504], [481, 481], [465, 465], [443, 448], [415, 421], [404, 404], [376, 376], [354, 360], [343, 343], [326, 326], [310, 310], [293, 293], [266, 271], [255, 255], [238, 238], [216, 216], [199, 199], [160, 166], [122, 127], [116, 116], [105, 111], [89, 89], [72, 72], [61, 61], [50, 50], [39, 39], [28, 28]], "confidences": [0.9989548921585083, 0.9999619722366333, 0.9992412328720093, 0.9541407823562622, 0.9999735355377197, 0.9940637946128845, 0.999988317489624, 0.9999865293502808, 0.9999904632568359, 0.550645649433136, 0.9999978542327881, 0.9999892711639404, 0.9996963739395142, 0.9999991655349731, 0.5165660977363586, 0.999988317489624, 0.9995940327644348, 0.9999626874923706, 0.9998881816864014, 0.9940359592437744, 0.9996926784515381, 0.9999793767929077, 0.9998898506164551, 0.9998297691345215, 0.9897773861885071, 0.9994788765907288, 0.9995355606079102, 0.9969993829727173, 0.9985607266426086, 0.9999980926513672, 0.9996448755264282, 0.9874195456504822, 0.9999774694442749, 0.9867774844169617, 0.9744981527328491, 0.9999960660934448, 0.9999808073043823, 0.9993176460266113, 0.9999256134033203, 0.9999924898147583, 0.9999164342880249, 0.9999569654464722, 0.9999525547027588, 0.9997047781944275, 0.9999884366989136, 0.9999561309814453, 0.9999027252197266, 0.999967098236084, 0.9966025352478027, 0.9999691247940063, 0.9973816275596619, 0.9003818035125732, 0.9999942779541016, 0.9996612071990967, 0.9999988079071045, 0.9940271377563477, 0.9999754428863525, 0.9999979734420776, 0.9999998807907104, 0.9994766116142273, 0.9999978542327881, 0.9999990463256836, 0.9999949932098389, 0.9999971389770508, 0.8546275496482849, 0.9999696016311646, 0.9999052286148071, 0.9918268918991089, 0.5608442425727844], "line": {"boundary": [[161, 631], [163, 592], [185, 573], [230, 604], [257, 580], [309, 610], [341, 586], [380, 584], [423, 615], [456, 588], [508, 588], [524, 604], [559, 604], [575, 619], [612, 586], [649, 586], [682, 619], [697, 606], [729, 606], [742, 594], [793, 592], [822, 619], [853, 592], [877, 612], [896, 600], [927, 610], [949, 590], [962, 590], [990, 613], [1013, 592], [1023, 598], [1039, 588], [1060, 592], [1083, 613], [1113, 588], [1140, 602], [1163, 588], [1196, 615], [1251, 582], [1294, 621], [1309, 619], [1327, 602], [1360, 612], [1378, 608], [1389, 619], [1395, 647], [1366, 660], [1341, 649], [1321, 662], [1302, 662], [1282, 647], [1270, 658], [1226, 652], [1200, 670], [1175, 647], [1120, 645], [1087, 668], [1062, 645], [1009, 666], [970, 645], [894, 672], [867, 649], [832, 670], [799, 643], [748, 651], [688, 641], [670, 656], [647, 645], [615, 645], [586, 666], [561, 641], [483, 654], [426, 633], [397, 654], [331, 643], [311, 656], [280, 631], [228, 654], [165, 637]], "baseline": [[163, 633], [651, 633], [674, 637], [729, 637], [818, 643], [857, 641], [890, 647], [912, 647], [931, 652], [968, 643], [1011, 641], [1245, 641], [1300, 647], [1345, 645], [1397, 649]], "id": "686e1fad-8441-4e7f-87de-30b56113fbae", "type": "baselines"}}, {"prediction": "\u0648\u064a\u0633\u062a\u0639\u0645\u0644 \u0627\u0644\u0647\u0632\u0644 \u0648\u0627\u0644\u0644\u0639\u0628\u060c \u0648\u064a\u0630\u0643\u0631 \u0627\u0644\u0645\u0631\u062f\u0627\u0646\u060c \u0648\u064a\u0645\u064a\u0644 \u0627\u0655\u0644\u064a\u0647\u0645\u060c \u0627\u0654\u0648 \u0631\u0627\u0654\u064a\u062a\u0645\u0648\u0647 \u0642\u0644\u064a\u0644 \u0627\u0644\u0648\u0631\u0639 \u0641\u064a", "cuts": [[1298, 1298], [1283, 1283], [1267, 1267], [1246, 1246], [1229, 1229], [1208, 1208], [1187, 1192], [1155, 1160], [1149, 1149], [1139, 1139], [1117, 1123], [1107, 1107], [1085, 1091], [1053, 1058], [1042, 1042], [1026, 1026], [1016, 1016], [1000, 1000], [984, 984], [952, 957], [925, 925], [903, 909], [893, 893], [877, 877], [861, 861], [839, 839], [818, 818], [797, 802], [786, 791], [775, 780], [759, 759], [738, 743], [722, 722], [706, 711], [695, 695], [668, 668], [647, 658], [641, 641], [620, 620], [604, 604], [588, 588], [572, 577], [545, 545], [535, 540], [524, 529], [519, 519], [508, 508], [492, 492], [470, 470], [449, 454], [433, 438], [428, 428], [417, 422], [412, 412], [385, 390], [369, 374], [353, 358], [347, 347], [342, 342], [331, 331], [315, 315], [299, 299], [278, 278], [257, 262], [246, 246], [235, 235], [219, 219], [203, 208], [176, 182], [166, 171], [155, 160], [144, 144], [123, 123], [96, 96], [70, 75], [59, 59], [43, 48]], "confidences": [0.9960930943489075, 0.9970471262931824, 0.9999514818191528, 0.9999713897705078, 0.9975488781929016, 0.9999634027481079, 0.9999896287918091, 0.9999924898147583, 0.9999784231185913, 0.9999960660934448, 0.9997754693031311, 0.9999520778656006, 0.9999797344207764, 0.9999464750289917, 0.999251663684845, 0.9999938011169434, 0.9999744892120361, 0.9904490113258362, 0.6805958151817322, 0.9993933439254761, 0.8523104190826416, 0.9999516010284424, 0.9954115748405457, 0.9966720342636108, 0.9986212253570557, 0.9991599321365356, 0.9994064569473267, 0.9998964071273804, 0.999936580657959, 0.9998494386672974, 0.9968574047088623, 0.9996702671051025, 0.999824583530426, 0.9998010993003845, 0.9999998807907104, 0.9999876022338867, 0.9999998807907104, 0.9999998807907104, 0.9999731779098511, 0.9999935626983643, 0.9999995231628418, 0.9998869895935059, 0.9999819993972778, 0.9999923706054688, 0.9999994039535522, 0.9997376799583435, 0.9999179840087891, 0.999994158744812, 0.9999123811721802, 0.9999874830245972, 1.0, 0.9014513492584229, 0.9999948740005493, 0.9999997615814209, 0.9999998807907104, 0.9998629093170166, 0.9677855372428894, 0.9999980926513672, 0.9946457147598267, 0.9999970197677612, 0.972520649433136, 0.999996542930603, 0.9999895095825195, 0.9999986886978149, 0.9621902108192444, 0.9999395608901978, 0.9999432563781738, 0.9999014139175415, 0.9999983310699463, 0.999998927116394, 0.999935507774353, 0.9999979734420776, 0.9999970197677612, 0.9999983310699463, 0.9999921321868896, 0.9999868869781494, 0.9999967813491821], "line": {"boundary": [[155, 727], [159, 701], [198, 666], [222, 680], [239, 672], [270, 682], [300, 660], [327, 682], [346, 664], [391, 664], [413, 682], [434, 686], [471, 676], [493, 656], [530, 684], [567, 656], [592, 680], [615, 688], [656, 664], [674, 666], [693, 684], [717, 668], [736, 686], [785, 682], [795, 690], [822, 670], [851, 668], [886, 690], [916, 666], [935, 670], [951, 686], [968, 672], [1005, 666], [1027, 686], [1052, 691], [1060, 684], [1103, 691], [1136, 666], [1169, 670], [1194, 690], [1220, 668], [1255, 682], [1280, 666], [1306, 686], [1325, 670], [1352, 690], [1376, 680], [1403, 691], [1446, 686], [1456, 719], [1442, 736], [1366, 725], [1345, 727], [1325, 742], [1311, 742], [1290, 725], [1233, 738], [1198, 723], [1177, 736], [1155, 725], [1120, 723], [1087, 736], [1056, 719], [1029, 734], [980, 723], [962, 736], [947, 736], [931, 723], [914, 723], [869, 736], [853, 723], [824, 727], [797, 719], [779, 732], [742, 725], [703, 740], [684, 728], [623, 728], [608, 742], [578, 719], [547, 732], [528, 725], [481, 732], [469, 723], [436, 732], [407, 717], [348, 736], [304, 721], [245, 744], [216, 727], [179, 736], [161, 727]], "baseline": [[157, 728], [187, 727], [270, 730], [313, 721], [403, 719], [460, 713], [526, 721], [900, 719], [1457, 721]], "id": "9328cfe4-3094-4550-8d35-93480796fc10", "type": "baselines"}}, {"prediction": "\u0627\u0644\u0645\u0627\u0654\u0643\u0644 \u0648\u0627\u0644\u0645\u0634\u0631\u0628\u060c \u0648\u0627\u0644\u0645\u062f\u062e\u0644 \u0648\u0627\u0644\u0645\u062e\u0631\u062c\u060c \u0644\u0627 \u064a\u0628\u0627\u0644\u064a \u0645\u0627 \u0627\u0654\u0643\u0644 \u062d\u0644\u0627\u0644\u0627 \u0643\u0627\u0646 \u0627\u0654\u0648 \u062d\u0631\u0627\u0645\u0627\u060c", "cuts": [[1298, 1304], [1291, 1291], [1273, 1273], [1254, 1260], [1248, 1248], [1242, 1242], [1217, 1223], [1180, 1192], [1173, 1173], [1155, 1155], [1142, 1142], [1124, 1124], [1105, 1105], [1080, 1080], [1049, 1049], [1018, 1018], [993, 1000], [987, 987], [969, 969], [956, 956], [937, 937], [919, 919], [888, 888], [869, 869], [826, 838], [820, 820], [795, 801], [788, 788], [770, 770], [739, 739], [720, 720], [695, 695], [671, 671], [646, 658], [633, 639], [621, 627], [596, 608], [590, 590], [577, 577], [565, 565], [553, 553], [540, 540], [503, 509], [490, 490], [472, 478], [453, 459], [441, 447], [435, 435], [428, 428], [404, 410], [366, 379], [348, 348], [329, 329], [310, 323], [298, 298], [286, 292], [255, 267], [248, 248], [224, 230], [211, 211], [180, 186], [174, 174], [168, 168], [155, 155], [124, 130], [106, 106], [87, 87], [68, 68], [56, 56], [37, 43], [25, 25]], "confidences": [0.9999150037765503, 0.9998385906219482, 0.999996542930603, 0.9999994039535522, 0.9999864101409912, 0.9999818801879883, 0.9999929666519165, 0.999998927116394, 0.9999581575393677, 0.9999958276748657, 0.9999880790710449, 0.9997920393943787, 0.9999971389770508, 0.9999898672103882, 0.9999960660934448, 0.9710601568222046, 0.996277391910553, 0.9998601675033569, 0.922956645488739, 0.9978814721107483, 0.999930739402771, 0.9997755885124207, 0.9413175582885742, 0.9998894929885864, 0.9993183612823486, 0.999767005443573, 0.9998904466629028, 0.6034071445465088, 0.9915944933891296, 0.999853253364563, 0.9953317046165466, 0.9986577033996582, 0.9640184640884399, 0.9999998807907104, 0.9999990463256836, 0.9999948740005493, 0.9999983310699463, 0.9997009038925171, 0.9999697208404541, 0.9999998807907104, 0.9997711777687073, 0.9742012023925781, 0.9999996423721313, 0.9999728202819824, 0.9999784231185913, 0.9999963045120239, 0.9999946355819702, 0.9767754077911377, 0.9991446733474731, 0.9999916553497314, 0.9999847412109375, 0.9995253086090088, 0.9999663829803467, 0.9999977350234985, 0.9770731925964355, 0.9999951124191284, 0.9999915361404419, 0.9999960660934448, 0.9701045751571655, 0.9999648332595825, 0.9999688863754272, 0.9998500347137451, 0.9999626874923706, 0.9992308616638184, 0.9999960660934448, 0.9513243436813354, 0.9999858140945435, 0.9998613595962524, 0.9998170733451843, 0.9996731281280518, 0.9003341794013977], "line": {"boundary": [[159, 783], [163, 748], [191, 732], [218, 740], [237, 758], [274, 766], [313, 730], [341, 750], [401, 744], [417, 730], [432, 730], [458, 746], [475, 742], [522, 769], [553, 742], [567, 746], [588, 732], [606, 748], [621, 742], [660, 775], [697, 742], [738, 762], [758, 744], [781, 740], [808, 760], [859, 766], [879, 748], [906, 764], [929, 742], [941, 742], [980, 771], [1013, 746], [1025, 756], [1068, 754], [1076, 762], [1103, 744], [1146, 773], [1161, 762], [1191, 771], [1212, 762], [1224, 769], [1243, 752], [1265, 764], [1292, 746], [1335, 775], [1362, 750], [1374, 754], [1401, 738], [1419, 754], [1430, 746], [1446, 750], [1465, 767], [1471, 793], [1448, 805], [1389, 803], [1360, 822], [1345, 820], [1329, 805], [1311, 816], [1288, 805], [1189, 816], [1152, 795], [1124, 814], [1101, 803], [1035, 799], [1007, 820], [994, 820], [974, 803], [947, 810], [935, 801], [885, 799], [857, 822], [834, 822], [797, 791], [779, 803], [758, 791], [738, 808], [721, 810], [707, 801], [676, 822], [643, 795], [617, 799], [606, 789], [569, 799], [551, 814], [534, 814], [510, 793], [460, 803], [403, 789], [389, 799], [350, 803], [329, 789], [294, 808], [265, 791], [222, 810], [204, 797], [171, 797], [163, 789]], "baseline": [[161, 785], [216, 791], [935, 789], [959, 795], [1472, 795]], "id": "e04b91bb-5bd9-4ec4-af42-6ae24b8437f2", "type": "baselines"}}, {"prediction": "\u0641\u0627\u062a\u0647\u0645\u0648\u0647 \u0639\u0644\u0649 \u0639\u0644\u0645\u0647 \u0648\u0639\u0644\u0649 \u062f\u064a\u0646\u0647\u060c \u0648\u0644\u0627 \u062a\u0642\u0644\u062f\u0648\u0647 \u0627\u0654\u0645\u0648\u0631\u0643\u0645\u060c \u0648\u0627\u062d\u0630\u0631\u0648\u0647 \u0627\u0654\u0646 \u064a\u0633\u0644\u0628\u0643\u0645 \u062f\u064a\u0646\u0643\u0645\u060c", "cuts": [[1304, 1304], [1293, 1293], [1283, 1283], [1266, 1266], [1245, 1245], [1228, 1228], [1207, 1207], [1185, 1191], [1169, 1169], [1147, 1147], [1131, 1131], [1099, 1104], [1082, 1082], [1066, 1066], [1044, 1044], [1028, 1028], [1001, 1012], [996, 996], [969, 969], [947, 947], [936, 936], [898, 904], [887, 887], [871, 871], [860, 860], [850, 850], [828, 828], [806, 812], [795, 801], [774, 779], [763, 768], [741, 747], [731, 731], [720, 720], [703, 703], [687, 687], [666, 666], [644, 644], [622, 628], [617, 617], [606, 612], [601, 601], [584, 584], [563, 563], [541, 541], [514, 514], [498, 498], [476, 482], [465, 465], [449, 449], [422, 422], [406, 406], [384, 384], [363, 363], [341, 341], [325, 330], [314, 319], [308, 308], [298, 298], [265, 276], [260, 260], [244, 244], [216, 216], [206, 206], [184, 184], [157, 162], [135, 141], [124, 124], [108, 108], [97, 97], [76, 76], [54, 54], [32, 32]], "confidences": [0.9997382760047913, 0.9998076558113098, 0.9998169541358948, 0.9999723434448242, 0.9999963045120239, 0.9998815059661865, 0.9978761672973633, 0.9999692440032959, 0.9999940395355225, 0.9997928738594055, 0.9998121857643127, 0.9998834133148193, 0.9999972581863403, 0.9986358284950256, 0.9999672174453735, 0.9999685287475586, 0.9999872446060181, 0.9996137022972107, 0.9999386072158813, 0.9998291730880737, 0.9996570348739624, 0.9997431635856628, 0.9989522695541382, 0.9978705644607544, 0.6706600189208984, 0.727662205696106, 0.9994146823883057, 0.9998109936714172, 0.9988961219787598, 0.9999992847442627, 0.9999957084655762, 0.9998549222946167, 0.7824696898460388, 0.9987309575080872, 0.9999728202819824, 0.9999747276306152, 0.9984544515609741, 0.9999949932098389, 0.9999949932098389, 0.9999567270278931, 0.9999990463256836, 0.9999997615814209, 1.0, 0.999970555305481, 0.9995998740196228, 0.9863488674163818, 0.9999908208847046, 0.9998534917831421, 0.989995002746582, 0.999998927116394, 0.9999957084655762, 0.9997010827064514, 0.9999995231628418, 0.9993435740470886, 0.9999997615814209, 0.9204366207122803, 0.9999145269393921, 0.9971621036529541, 0.9998090863227844, 0.9999971389770508, 0.9999977350234985, 0.999993085861206, 0.999996542930603, 0.9999635219573975, 0.9999977350234985, 0.9999561309814453, 0.9999858140945435, 0.9998942613601685, 0.9999914169311523, 0.9876537919044495, 0.9992417097091675, 0.9999997615814209, 0.9282093048095703], "line": {"boundary": [[152, 853], [171, 834], [189, 840], [228, 812], [284, 845], [329, 816], [413, 834], [446, 810], [489, 838], [516, 840], [545, 818], [563, 834], [588, 822], [619, 843], [633, 834], [649, 842], [666, 826], [688, 822], [713, 842], [754, 812], [789, 840], [832, 822], [881, 830], [920, 820], [951, 845], [962, 836], [1001, 832], [1027, 834], [1046, 851], [1081, 822], [1146, 845], [1163, 834], [1179, 840], [1204, 822], [1247, 853], [1282, 822], [1323, 847], [1335, 840], [1391, 845], [1409, 832], [1440, 828], [1462, 845], [1467, 869], [1401, 894], [1382, 881], [1348, 894], [1321, 871], [1269, 894], [1253, 894], [1226, 875], [1183, 881], [1152, 873], [1128, 890], [1095, 879], [1056, 894], [1033, 877], [1003, 888], [955, 871], [935, 888], [922, 888], [888, 867], [869, 879], [812, 879], [795, 888], [764, 869], [715, 890], [674, 877], [645, 898], [619, 875], [600, 888], [571, 871], [493, 886], [465, 869], [434, 881], [415, 875], [401, 884], [372, 877], [356, 886], [323, 875], [296, 896], [267, 875], [251, 884], [214, 875], [187, 896], [153, 867]], "baseline": [[153, 855], [228, 869], [1237, 867], [1269, 871], [1290, 867], [1309, 871], [1469, 871]], "id": "769b1e46-2664-49b4-b5ce-3849db9d0eb2", "type": "baselines"}}, {"prediction": "\u0628\u062a\u0647\u0648\u064a\u0646\u0647 \u0644\u0644\u0627\u0654\u0633\u064a\u0627\u0621 \u0627\u0644\u0635\u063a\u064a\u0631\u0629 \u0645\u0646 \u0627\u0644\u062d\u0631\u0627\u0645 \u0648\u0627\u0644\u0634\u0628\u0647\u0627\u062a\u060c \u064a\u0633\u0631\u0642 \u0628\u0630\u0644\u0643 \u0639\u0642\u0648\u0644\u0643\u0645\u060c \u0641\u064a\u0633\u062a\u062f\u0631\u062c\u0643\u0645", "cuts": [[1297, 1297], [1286, 1286], [1275, 1275], [1253, 1253], [1237, 1237], [1220, 1226], [1209, 1209], [1188, 1193], [1182, 1182], [1160, 1166], [1149, 1155], [1138, 1144], [1133, 1133], [1111, 1111], [1095, 1095], [1084, 1084], [1062, 1067], [1056, 1056], [1045, 1045], [1023, 1023], [991, 991], [974, 974], [958, 963], [941, 941], [919, 925], [914, 914], [887, 887], [859, 870], [854, 854], [843, 843], [815, 815], [799, 799], [783, 783], [766, 766], [744, 750], [739, 739], [717, 722], [706, 711], [690, 690], [668, 668], [651, 651], [629, 635], [607, 607], [580, 580], [558, 569], [553, 553], [536, 536], [509, 514], [493, 493], [454, 465], [449, 449], [438, 438], [416, 416], [405, 405], [356, 361], [345, 345], [328, 328], [306, 306], [290, 290], [268, 268], [246, 246], [224, 224], [203, 213], [197, 197], [186, 186], [164, 164], [148, 148], [131, 131], [109, 109], [82, 82], [55, 55], [27, 33]], "confidences": [0.9998189806938171, 0.9999316930770874, 0.9999616146087646, 0.9999963045120239, 0.9904739260673523, 0.9999723434448242, 0.9971580505371094, 0.9988645315170288, 0.9999966621398926, 0.9999974966049194, 0.9999973773956299, 0.9999791383743286, 0.9999858140945435, 0.9999887943267822, 0.5477295517921448, 0.9999678134918213, 0.9999643564224243, 0.8171812295913696, 0.9827367067337036, 0.9935495257377625, 0.9999936819076538, 0.999975323677063, 0.9999910593032837, 0.998406708240509, 0.9999222755432129, 0.9998999834060669, 0.9343510866165161, 0.9997228980064392, 0.7628433108329773, 0.6818570494651794, 0.950019121170044, 0.6418173313140869, 0.9943951368331909, 0.9706724882125854, 0.9999768733978271, 0.9994531273841858, 0.9995731711387634, 0.9997699856758118, 0.9988842606544495, 0.9997255206108093, 0.9999997615814209, 0.9999980926513672, 0.999735414981842, 0.9235820770263672, 0.9999998807907104, 0.9999927282333374, 0.9976077079772949, 0.9999990463256836, 0.8485846519470215, 0.9999995231628418, 0.9999078512191772, 0.9999904632568359, 0.999980092048645, 0.9999996423721313, 0.9956209063529968, 0.9999990463256836, 0.9995309114456177, 0.9999940395355225, 0.9999079704284668, 1.0, 0.9180242419242859, 0.9995797276496887, 0.9999831914901733, 0.9998835325241089, 0.9994398951530457, 0.988334059715271, 0.9999781847000122, 0.9999990463256836, 0.8295435309410095, 0.9995015859603882, 0.9999979734420776, 0.9999895095825195], "line": {"boundary": [[159, 947], [163, 923], [210, 894], [247, 920], [276, 906], [317, 920], [337, 902], [362, 916], [389, 918], [430, 892], [456, 908], [479, 900], [510, 920], [549, 896], [586, 896], [610, 918], [643, 898], [670, 921], [762, 912], [775, 900], [812, 921], [853, 898], [898, 925], [923, 902], [947, 918], [990, 898], [1019, 920], [1066, 920], [1087, 906], [1111, 921], [1136, 902], [1155, 920], [1183, 900], [1200, 902], [1218, 918], [1235, 902], [1259, 916], [1282, 896], [1298, 896], [1327, 900], [1347, 918], [1372, 912], [1391, 923], [1434, 912], [1473, 953], [1446, 970], [1428, 964], [1395, 972], [1343, 953], [1302, 962], [1276, 957], [1261, 968], [1216, 953], [1138, 957], [1099, 974], [1072, 953], [1037, 974], [1003, 957], [962, 957], [949, 970], [906, 980], [888, 964], [867, 968], [853, 957], [793, 968], [777, 957], [721, 953], [699, 966], [674, 957], [645, 968], [615, 957], [600, 966], [580, 955], [528, 957], [506, 945], [450, 968], [419, 953], [382, 976], [356, 953], [335, 966], [313, 957], [276, 955], [251, 966], [200, 955], [177, 976], [163, 974]], "baseline": [[161, 949], [241, 945], [664, 945], [705, 949], [729, 945], [822, 955], [923, 951], [1087, 951], [1107, 955], [1214, 945], [1362, 955], [1475, 954]], "id": "771803aa-5b21-4917-91a9-866b9583ac64", "type": "baselines"}}, {"prediction": "\u0645\u0646 \u062d\u064a\u062b \u0644\u0627 \u062a\u0639\u0644\u0645\u0648\u0646.", "cuts": [[343, 343], [316, 321], [294, 298], [276, 276], [258, 258], [230, 230], [199, 203], [185, 190], [172, 181], [158, 163], [149, 149], [136, 136], [118, 118], [95, 99], [77, 81], [54, 59], [32, 32]], "confidences": [0.9013516902923584, 0.9993886947631836, 0.9999945163726807, 0.9106606841087341, 0.9922044277191162, 0.9999985694885254, 0.999998927116394, 0.9999998807907104, 0.9999948740005493, 0.9999319314956665, 0.9999568462371826, 0.9999945163726807, 0.5355215072631836, 0.9999971389770508, 0.9999983310699463, 0.9999912977218628, 0.9786094427108765], "line": {"boundary": [[1109, 1025], [1146, 980], [1173, 997], [1189, 997], [1210, 976], [1231, 988], [1294, 976], [1309, 992], [1333, 984], [1348, 999], [1364, 992], [1395, 1007], [1409, 994], [1424, 1001], [1444, 997], [1473, 1027], [1454, 1029], [1411, 1056], [1380, 1031], [1347, 1046], [1300, 1029], [1274, 1036], [1263, 1025], [1241, 1036], [1191, 1036], [1171, 1050], [1118, 1025]], "baseline": [[1111, 1027], [1274, 1023], [1366, 1033], [1475, 1029]], "id": "fee112e6-da9c-4f6a-8aac-52b284d831d2", "type": "baselines"}}, {"prediction": "\u0648\u0645\u062a\u0649 \u0631\u0627\u0654\u064a\u062a\u0645 \u0627\u0644\u0639\u0627\u0644\u0645 \u064a\u0642\u0628\u0644 \u0627\u0644\u0647\u062f\u064a\u0629 \u0645\u0646 \u0627\u0644\u0645\u0633\u062a\u0641\u062a\u064a \u0648\u064a\u0641\u062a\u064a\u0647 \u0639\u0644\u0649 \u063a\u0631\u0636\u0647\u060c \u0648\u064a\u062f\u062e\u0644 \u0641\u064a", "cuts": [[1225, 1225], [1201, 1207], [1189, 1189], [1172, 1172], [1136, 1148], [1130, 1130], [1112, 1118], [1106, 1106], [1100, 1100], [1088, 1088], [1064, 1070], [1041, 1047], [1029, 1035], [1023, 1023], [1011, 1011], [993, 993], [981, 981], [957, 963], [934, 940], [928, 928], [916, 916], [898, 898], [880, 886], [850, 856], [838, 844], [827, 833], [815, 815], [797, 797], [779, 779], [761, 761], [737, 743], [726, 731], [702, 702], [678, 684], [666, 672], [654, 660], [636, 642], [613, 618], [595, 595], [583, 583], [565, 565], [553, 553], [517, 523], [505, 505], [488, 488], [476, 476], [458, 458], [446, 446], [434, 434], [410, 416], [393, 393], [375, 375], [363, 363], [327, 333], [309, 309], [291, 291], [268, 268], [238, 238], [220, 220], [196, 202], [184, 184], [167, 167], [155, 155], [125, 131], [101, 107], [59, 71], [54, 54], [36, 42]], "confidences": [0.9998977184295654, 0.9992066025733948, 0.9999544620513916, 0.9999667406082153, 0.9999969005584717, 0.9999951124191284, 0.9999479055404663, 0.8893346190452576, 0.9999771118164062, 0.9999749660491943, 0.9999734163284302, 0.9999407529830933, 0.9999978542327881, 0.888961911201477, 0.999985933303833, 0.9997301697731018, 0.9997461438179016, 0.9999942779541016, 0.9999889135360718, 0.9999947547912598, 0.7681607007980347, 0.9985297918319702, 0.9992446899414062, 0.9999771118164062, 0.9999252557754517, 0.9995318651199341, 0.9955322742462158, 0.9999263286590576, 0.9855678081512451, 0.8572127223014832, 0.9958655834197998, 0.9997792840003967, 0.8732478022575378, 0.9998902082443237, 0.9997214674949646, 0.9999871253967285, 0.999970555305481, 0.9999971389770508, 0.9999786615371704, 0.9999481439590454, 0.9997740387916565, 0.8626158833503723, 0.9999806880950928, 0.9998955726623535, 0.9999974966049194, 0.9999513626098633, 0.9972359538078308, 0.9995180368423462, 0.9999905824661255, 1.0, 0.9999990463256836, 0.9999991655349731, 0.9999984502792358, 0.9999990463256836, 0.9999250173568726, 0.9994828701019287, 0.9996166229248047, 0.995541512966156, 0.9999992847442627, 0.999984860420227, 0.9904344081878662, 0.9992062449455261, 0.9999986886978149, 0.9761358499526978, 0.999893069267273, 0.9999963045120239, 0.9997863173484802, 0.9999911785125732], "line": {"boundary": [[159, 1103], [163, 1081], [196, 1052], [224, 1072], [249, 1050], [348, 1073], [382, 1062], [393, 1070], [409, 1056], [432, 1068], [458, 1052], [487, 1079], [518, 1050], [561, 1075], [573, 1064], [623, 1052], [641, 1070], [684, 1081], [727, 1052], [760, 1073], [773, 1073], [799, 1050], [834, 1072], [849, 1066], [859, 1073], [883, 1070], [908, 1052], [927, 1066], [955, 1066], [980, 1050], [1007, 1072], [1027, 1052], [1040, 1060], [1056, 1056], [1089, 1083], [1120, 1054], [1150, 1066], [1173, 1054], [1204, 1079], [1245, 1048], [1257, 1048], [1296, 1085], [1321, 1068], [1370, 1072], [1395, 1105], [1364, 1126], [1339, 1114], [1317, 1128], [1298, 1128], [1282, 1114], [1269, 1124], [1228, 1118], [1210, 1134], [1179, 1111], [1126, 1111], [1093, 1134], [1079, 1120], [1052, 1114], [1019, 1128], [990, 1109], [953, 1122], [939, 1111], [912, 1120], [892, 1101], [853, 1124], [838, 1124], [818, 1107], [721, 1109], [692, 1134], [662, 1111], [643, 1120], [612, 1109], [584, 1120], [565, 1101], [502, 1124], [485, 1122], [465, 1103], [428, 1122], [411, 1109], [360, 1107], [350, 1099], [325, 1118], [276, 1103], [239, 1126], [214, 1109], [177, 1130], [163, 1116]], "baseline": [[161, 1105], [214, 1111], [276, 1105], [296, 1099], [421, 1103], [906, 1101], [1005, 1111], [1093, 1111], [1113, 1107], [1165, 1105], [1206, 1111], [1397, 1107]], "id": "dcda2e78-1bb5-46b5-8d9c-e59695916a0b", "type": "baselines"}}, {"prediction": "\u0627\u0644\u062a\u0627\u0654\u0648\u064a\u0644\u0627\u062a \u0648\u0627\u0644\u0634\u0628\u0647\u0627\u062a \u060c \u0643\u0645\u0633\u0627\u0654\u0644\u0629 \u0627\u0644\u0627\u0633\u062a\u062d\u0644\u0627\u0644\u060c \u0648\u0645\u0633\u0627\u0654\u0644\u0629 \u0627\u0644\u0631\u0628\u0627 \u0648\u0627\u0644\u0645\u0639\u0627\u0645\u0644\u0629\u060c \u0648\u0644\u0627 \u062a\u062c\u062f\u0648\u0646\u0647", "cuts": [[1293, 1298], [1284, 1289], [1274, 1274], [1260, 1265], [1255, 1255], [1245, 1245], [1231, 1231], [1212, 1216], [1202, 1207], [1168, 1168], [1130, 1140], [1120, 1120], [1101, 1106], [1091, 1096], [1077, 1077], [1053, 1053], [1039, 1039], [1019, 1024], [995, 995], [976, 976], [971, 971], [942, 947], [928, 928], [904, 904], [880, 885], [861, 865], [856, 856], [851, 851], [837, 837], [808, 813], [798, 803], [784, 789], [774, 779], [755, 755], [731, 731], [702, 702], [683, 688], [673, 678], [659, 659], [630, 630], [601, 611], [591, 591], [572, 572], [548, 553], [529, 529], [519, 524], [514, 514], [505, 505], [476, 481], [466, 466], [457, 457], [442, 442], [428, 428], [409, 414], [389, 394], [380, 380], [361, 361], [351, 351], [332, 332], [308, 308], [293, 298], [279, 284], [264, 264], [250, 250], [231, 236], [207, 212], [197, 197], [173, 178], [159, 168], [130, 139], [125, 125], [101, 101], [82, 82], [58, 58], [38, 38], [24, 24]], "confidences": [0.9996144771575928, 0.9999929666519165, 0.9999830722808838, 0.9999926090240479, 0.999995231628418, 0.9467358589172363, 0.999972939491272, 0.9995086193084717, 0.9998672008514404, 0.9942428469657898, 0.9999955892562866, 0.9999592304229736, 0.9999781847000122, 0.999994158744812, 0.9999866485595703, 0.999920129776001, 0.9999884366989136, 0.9986990690231323, 0.9997000694274902, 0.9911819696426392, 0.978091299533844, 0.999427855014801, 0.9999485015869141, 0.7997534275054932, 0.9999580383300781, 0.999704897403717, 0.520932137966156, 0.9891839027404785, 0.9960983991622925, 0.999637246131897, 0.9975180625915527, 0.9990247488021851, 0.9999979734420776, 0.7142682075500488, 0.9256128668785095, 1.0, 0.9999996423721313, 0.9998838901519775, 0.9999998807907104, 0.9960355162620544, 0.9999982118606567, 0.999958872795105, 0.9999998807907104, 1.0, 0.9999998807907104, 0.999992847442627, 0.9999973773956299, 0.9999991655349731, 0.9975195527076721, 0.9820659756660461, 0.9999998807907104, 0.9999421834945679, 0.9999996423721313, 0.9999991655349731, 0.9999985694885254, 0.6958007216453552, 0.9832131266593933, 0.9999997615814209, 0.9999964237213135, 0.9855285286903381, 0.9999996423721313, 0.9993840456008911, 0.9999988079071045, 0.9999823570251465, 0.9999992847442627, 0.9999185800552368, 0.9999986886978149, 0.9999874830245972, 0.9999970197677612, 0.9999932050704956, 0.9994638562202454, 0.9987408518791199, 0.999816358089447, 0.9999561309814453, 0.9999673366546631, 0.9998775720596313], "line": {"boundary": [[159, 1165], [163, 1146], [185, 1132], [210, 1146], [224, 1136], [253, 1146], [267, 1134], [286, 1138], [315, 1126], [327, 1126], [360, 1155], [389, 1130], [405, 1128], [426, 1138], [442, 1128], [467, 1148], [502, 1128], [536, 1150], [559, 1130], [578, 1146], [598, 1128], [629, 1142], [676, 1122], [707, 1151], [746, 1148], [758, 1157], [799, 1130], [836, 1132], [861, 1150], [875, 1140], [892, 1148], [912, 1130], [949, 1132], [962, 1144], [1001, 1122], [1042, 1153], [1081, 1132], [1105, 1151], [1150, 1144], [1163, 1132], [1200, 1151], [1241, 1130], [1286, 1161], [1309, 1144], [1360, 1134], [1378, 1148], [1405, 1124], [1450, 1142], [1467, 1179], [1444, 1190], [1405, 1190], [1387, 1202], [1290, 1183], [1269, 1200], [1239, 1188], [1193, 1200], [1163, 1187], [1111, 1188], [1099, 1179], [1056, 1190], [984, 1188], [961, 1179], [931, 1190], [910, 1185], [799, 1192], [762, 1179], [736, 1198], [713, 1187], [656, 1188], [623, 1179], [588, 1200], [567, 1196], [547, 1179], [526, 1196], [499, 1187], [401, 1187], [366, 1177], [345, 1194], [329, 1194], [296, 1175], [253, 1192], [220, 1185], [191, 1194], [163, 1179]], "baseline": [[161, 1167], [191, 1173], [306, 1177], [469, 1177], [493, 1181], [1469, 1181]], "id": "530f6c70-c51e-4d3c-b027-f256d70e5e3f", "type": "baselines"}}, {"prediction": "\u0645\u062a\u0639\u0641\u0641\u0627 \u0641\u064a \u0645\u0639\u064a\u0634\u062a\u0647\u060c \u062a\u0631\u0648\u0646\u0647 \u0637\u0627\u0645\u0639\u0627 \u0641\u064a \u0627\u0654\u0645\u0648\u0627\u0644 \u0627\u0644\u0646\u0627\u0633\u060c \u064a\u062f\u0627\u062e\u0644 \u0627\u0644\u0642\u0636\u0627\u0629 \u0644\u064a\u0648\u0644\u0648\u0647 \u0627\u0644\u0648\u0644\u0627\u064a\u0627\u062a\u060c", "cuts": [[1294, 1294], [1276, 1276], [1264, 1264], [1246, 1246], [1228, 1228], [1210, 1216], [1192, 1198], [1186, 1186], [1168, 1168], [1131, 1137], [1125, 1125], [1101, 1101], [1089, 1089], [1071, 1071], [1047, 1047], [1035, 1035], [1017, 1017], [999, 1005], [987, 987], [975, 975], [957, 957], [939, 939], [921, 921], [897, 903], [879, 879], [861, 867], [849, 849], [831, 831], [812, 818], [794, 800], [788, 788], [770, 770], [740, 740], [728, 734], [722, 722], [710, 710], [698, 698], [680, 680], [668, 668], [638, 638], [626, 632], [614, 620], [602, 602], [590, 596], [572, 572], [536, 536], [512, 518], [506, 506], [487, 494], [469, 475], [451, 451], [433, 433], [397, 403], [391, 391], [379, 379], [367, 367], [343, 343], [313, 313], [301, 301], [277, 289], [271, 271], [259, 259], [241, 247], [229, 229], [211, 211], [193, 193], [175, 181], [163, 169], [150, 157], [138, 138], [114, 120], [102, 108], [90, 90], [72, 78], [48, 48], [24, 24]], "confidences": [0.9999475479125977, 0.9999927282333374, 0.999996542930603, 0.9999957084655762, 0.999872088432312, 0.9999810457229614, 0.9999687671661377, 0.9999939203262329, 0.9999991655349731, 0.9942613840103149, 0.9999487400054932, 0.9999334812164307, 0.9999005794525146, 0.9999839067459106, 0.9999810457229614, 0.989007830619812, 0.9996200799942017, 0.9999685287475586, 0.6469784379005432, 0.6665834188461304, 0.7252474427223206, 0.9857919216156006, 0.9997385144233704, 0.9999765157699585, 0.9963619112968445, 0.9994021654129028, 0.9998681545257568, 0.9810250401496887, 0.9838308095932007, 0.9998787641525269, 0.9988665580749512, 0.9999058246612549, 0.6534377336502075, 0.9997734427452087, 0.631395697593689, 0.9998962879180908, 0.9999980926513672, 0.9978647828102112, 0.9999958276748657, 0.9721218943595886, 0.9996869564056396, 0.9999868869781494, 0.9235882759094238, 0.9999985694885254, 0.9997712969779968, 0.826903223991394, 0.999829888343811, 0.9994933605194092, 0.9999945163726807, 0.9999911785125732, 0.9996364116668701, 0.9999428987503052, 0.9976553916931152, 0.9999971389770508, 0.71103435754776, 0.9999946355819702, 0.9999889135360718, 0.9995948672294617, 0.9999077320098877, 0.9999817609786987, 0.9998291730880737, 0.999971866607666, 0.9999986886978149, 0.9999973773956299, 0.9999977350234985, 0.9933046698570251, 0.9999994039535522, 0.9999998807907104, 0.9999985694885254, 0.9998321533203125, 0.9999990463256836, 0.9999988079071045, 0.9999668598175049, 0.9999896287918091, 0.9999967813491821, 0.9679267406463623], "line": {"boundary": [[159, 1249], [167, 1220], [245, 1204], [267, 1204], [282, 1216], [300, 1204], [331, 1224], [348, 1224], [370, 1204], [391, 1220], [411, 1204], [432, 1216], [460, 1208], [473, 1220], [530, 1206], [555, 1226], [577, 1208], [590, 1216], [656, 1210], [697, 1235], [732, 1210], [762, 1206], [789, 1224], [816, 1208], [840, 1224], [867, 1200], [906, 1227], [961, 1194], [992, 1222], [1023, 1210], [1050, 1233], [1076, 1216], [1109, 1231], [1128, 1216], [1154, 1229], [1214, 1216], [1233, 1231], [1272, 1229], [1286, 1243], [1350, 1198], [1362, 1198], [1409, 1227], [1430, 1224], [1477, 1257], [1458, 1257], [1430, 1272], [1356, 1270], [1345, 1263], [1309, 1292], [1272, 1266], [1222, 1280], [1212, 1270], [1146, 1261], [1124, 1280], [1109, 1282], [1081, 1278], [1048, 1257], [1029, 1268], [959, 1268], [947, 1259], [916, 1288], [904, 1288], [877, 1265], [824, 1278], [783, 1261], [729, 1263], [707, 1280], [688, 1280], [668, 1263], [643, 1274], [598, 1261], [563, 1282], [538, 1263], [477, 1266], [430, 1257], [409, 1274], [345, 1276], [319, 1257], [270, 1276], [257, 1265], [230, 1272], [214, 1261], [163, 1259]], "baseline": [[161, 1251], [272, 1255], [292, 1259], [1424, 1257], [1478, 1258]], "id": "78d4ba39-b9a2-42e6-b87c-1914573b9df8", "type": "baselines"}}, {"prediction": "\u0645\u0639 \u0634\u0631\u0647\u0647 \u0639\u0644\u0649 \u0627\u0644\u062f\u0646\u064a\u0627\u060c \u0648\u0642\u0644\u0629 \u0648\u0631\u0639\u0647 \u0648\u0645\u0628\u0627\u0644\u0627\u062a\u0647 \u0628\u0627\u0644\u062d\u0644\u0627\u0644 \u0648\u0627\u0644\u062d\u0631\u0627\u0645\u060c \u0641\u0627\u062a\u0647\u0645\u0648\u0647 \u0639\u0644\u0649 \u0639\u0644\u0645\u0647", "cuts": [[1287, 1287], [1265, 1265], [1232, 1237], [1221, 1221], [1193, 1199], [1172, 1172], [1155, 1155], [1128, 1133], [1111, 1111], [1095, 1095], [1078, 1078], [1046, 1051], [1035, 1040], [1024, 1024], [1007, 1013], [991, 991], [980, 980], [964, 969], [953, 953], [931, 936], [920, 920], [898, 898], [881, 887], [870, 870], [843, 849], [832, 832], [810, 816], [788, 788], [772, 772], [745, 750], [734, 734], [712, 712], [695, 695], [684, 684], [668, 673], [657, 662], [646, 646], [630, 630], [602, 613], [597, 597], [586, 586], [575, 575], [547, 547], [526, 531], [515, 520], [498, 498], [460, 471], [449, 454], [432, 438], [422, 427], [400, 400], [378, 383], [361, 361], [345, 345], [328, 328], [307, 312], [296, 296], [285, 285], [274, 274], [257, 257], [235, 235], [219, 219], [197, 197], [170, 175], [159, 159], [137, 137], [126, 126], [82, 93], [71, 71], [55, 55], [33, 38], [22, 22]], "confidences": [0.9999666213989258, 0.9999809265136719, 0.9999946355819702, 0.9999746084213257, 0.9999938011169434, 0.9999914169311523, 0.9090831279754639, 0.9998230338096619, 0.9976154565811157, 0.9993928670883179, 0.9999699592590332, 0.9991900324821472, 0.9999030828475952, 0.999919056892395, 0.9999741315841675, 0.983220100402832, 0.9999629259109497, 0.9999812841415405, 0.6795229315757751, 0.9999853372573853, 0.9986742734909058, 0.9999790191650391, 0.9995899796485901, 0.9987137317657471, 0.9991518259048462, 0.9978784322738647, 0.9999507665634155, 0.9689961075782776, 0.9987661838531494, 0.9999948740005493, 0.581307590007782, 0.9999948740005493, 0.9670306444168091, 0.9999184608459473, 0.9983538389205933, 0.9998610019683838, 0.9507318735122681, 0.9808312058448792, 0.9999997615814209, 0.9999678134918213, 0.9999990463256836, 0.9445680975914001, 0.9999923706054688, 0.9999840259552002, 0.9999967813491821, 0.9999991655349731, 0.9999967813491821, 0.9999933242797852, 0.9997896552085876, 0.9999817609786987, 0.9999405145645142, 0.9997538924217224, 0.9999948740005493, 0.9972209930419922, 0.9999998807907104, 0.9999997615814209, 0.9762755036354065, 0.9999904632568359, 0.9999934434890747, 1.0, 0.9999963045120239, 0.9913928508758545, 0.9357872009277344, 0.9999316930770874, 1.0, 0.9693567752838135, 0.9998525381088257, 0.9999986886978149, 0.9999988079071045, 0.9999994039535522, 0.9999954700469971, 0.9990108013153076], "line": {"boundary": [[167, 1327], [171, 1296], [189, 1300], [208, 1282], [255, 1313], [292, 1282], [335, 1307], [348, 1300], [403, 1305], [436, 1284], [473, 1303], [497, 1300], [512, 1286], [538, 1303], [555, 1302], [582, 1284], [621, 1309], [651, 1284], [686, 1288], [705, 1303], [731, 1286], [766, 1313], [803, 1286], [840, 1288], [859, 1305], [896, 1305], [904, 1313], [941, 1300], [998, 1307], [1017, 1290], [1033, 1288], [1058, 1290], [1091, 1313], [1116, 1290], [1161, 1298], [1177, 1288], [1218, 1313], [1251, 1288], [1290, 1311], [1302, 1302], [1339, 1303], [1376, 1280], [1407, 1307], [1446, 1307], [1463, 1335], [1430, 1370], [1405, 1368], [1380, 1344], [1347, 1360], [1323, 1360], [1288, 1335], [1233, 1362], [1216, 1362], [1196, 1346], [1148, 1348], [1126, 1358], [1095, 1339], [1068, 1358], [1007, 1339], [986, 1356], [953, 1356], [908, 1339], [886, 1356], [844, 1356], [832, 1344], [775, 1341], [744, 1356], [732, 1344], [637, 1346], [625, 1339], [598, 1354], [555, 1341], [536, 1356], [516, 1352], [504, 1362], [465, 1337], [454, 1344], [428, 1342], [419, 1352], [387, 1342], [366, 1356], [331, 1331], [276, 1356], [261, 1354], [241, 1337], [202, 1344], [169, 1339]], "baseline": [[169, 1329], [200, 1327], [249, 1333], [461, 1333], [500, 1337], [1335, 1335], [1378, 1337], [1397, 1341], [1465, 1337]], "id": "6089b007-2e7f-4f07-bfee-d5c9445abfa6", "type": "baselines"}}, {"prediction": "\u0648\u062f\u064a\u0646\u0647.", "cuts": [[103, 106], [84, 84], [68, 68], [53, 53], [42, 42], [27, 27]], "confidences": [0.9999996423721313, 0.9999984502792358, 0.9997429251670837, 0.9999673366546631, 0.99901282787323, 0.9717188477516174], "line": {"boundary": [[1343, 1411], [1350, 1391], [1387, 1374], [1444, 1383], [1483, 1415], [1462, 1415], [1432, 1438], [1345, 1418]], "baseline": [[1345, 1413], [1419, 1413], [1484, 1417]], "id": "0bfd6754-4a7c-4b17-b17a-e51aae0c8044", "type": "baselines"}}, {"prediction": "\u0648\u0645\u062a\u0649 \u0631\u0627\u0654\u064a\u062a\u0645 \u0639\u0627\u0644\u0645\u0627 \u0641\u064a \u0639\u0642\u0644\u0647 \u0633\u062e\u0627\u0641\u0629\u060c \u0648\u0641\u064a \u0646\u0638\u0631\u0647 \u0642\u0635\u0648\u0631\u060c \u064a\u0636\u0639 \u0627\u0644\u0627\u0654\u0634\u064a\u0627\u0621 - \u063a\u0627\u0644\u0628\u0627- \u0641\u064a", "cuts": [[1207, 1207], [1188, 1188], [1169, 1176], [1157, 1157], [1126, 1132], [1120, 1120], [1101, 1101], [1095, 1095], [1089, 1089], [1076, 1076], [1057, 1057], [1033, 1045], [1026, 1026], [1008, 1008], [995, 995], [977, 977], [958, 964], [939, 945], [933, 933], [914, 921], [890, 896], [871, 871], [852, 852], [840, 840], [821, 821], [802, 809], [790, 790], [753, 753], [734, 740], [722, 722], [709, 709], [690, 690], [672, 678], [666, 666], [647, 647], [628, 628], [597, 603], [591, 591], [566, 566], [547, 554], [535, 535], [510, 516], [504, 504], [485, 485], [454, 454], [435, 435], [417, 417], [398, 404], [392, 392], [367, 373], [330, 330], [311, 317], [305, 305], [286, 292], [280, 280], [268, 274], [261, 261], [236, 236], [218, 224], [205, 212], [187, 193], [174, 174], [156, 162], [143, 143], [124, 124], [112, 112], [100, 100], [87, 93], [68, 68], [50, 56], [37, 37], [25, 25]], "confidences": [0.9859687089920044, 0.9289069175720215, 0.9999728202819824, 0.9997435212135315, 0.9999949932098389, 0.9999815225601196, 0.999997615814209, 0.9999803304672241, 0.9999959468841553, 0.7412486672401428, 0.9978557229042053, 0.9999803304672241, 0.9999420642852783, 0.9999202489852905, 0.999981164932251, 0.9999773502349854, 0.9999395608901978, 0.9999784231185913, 0.9947001934051514, 0.9998576641082764, 0.9994139671325684, 0.9998432397842407, 0.9999716281890869, 0.9998818635940552, 0.6902597546577454, 0.999955415725708, 0.9993599057197571, 0.9993149042129517, 0.9999468326568604, 0.9852787256240845, 0.9907258749008179, 0.9999005794525146, 0.997058629989624, 0.9781426191329956, 0.8489178419113159, 0.8708791732788086, 0.9999767541885376, 0.9941668510437012, 0.966301441192627, 0.9999921321868896, 0.9917047023773193, 0.9999977350234985, 0.999850869178772, 0.589336633682251, 0.9973306655883789, 0.9999990463256836, 0.9893065094947815, 0.999998927116394, 0.9999986886978149, 0.9999996423721313, 0.999987006187439, 0.9929701685905457, 0.9999936819076538, 0.9999984502792358, 0.9898472428321838, 0.9999828338623047, 0.9971639513969421, 0.965297281742096, 0.9999982118606567, 0.9999784231185913, 0.9949177503585815, 0.9999829530715942, 0.9999810457229614, 0.9888534545898438, 0.9037330150604248, 0.9999834299087524, 0.9911187291145325, 0.9999808073043823, 0.9999874830245972, 0.9999430179595947, 0.9984645843505859, 0.9996715784072876], "line": {"boundary": [[173, 1489], [177, 1456], [192, 1440], [214, 1452], [253, 1422], [269, 1436], [300, 1438], [321, 1456], [352, 1457], [376, 1440], [399, 1452], [430, 1430], [467, 1442], [485, 1459], [508, 1459], [524, 1444], [557, 1463], [567, 1456], [631, 1463], [658, 1442], [695, 1459], [727, 1438], [750, 1444], [771, 1463], [795, 1442], [834, 1461], [861, 1442], [896, 1442], [914, 1444], [933, 1463], [964, 1463], [988, 1442], [1000, 1442], [1039, 1456], [1054, 1471], [1113, 1428], [1140, 1448], [1155, 1442], [1187, 1456], [1200, 1469], [1257, 1434], [1296, 1471], [1321, 1454], [1370, 1459], [1393, 1496], [1360, 1512], [1337, 1500], [1313, 1516], [1284, 1506], [1231, 1506], [1216, 1524], [1183, 1500], [1130, 1502], [1107, 1495], [1077, 1522], [1060, 1520], [1039, 1498], [978, 1500], [964, 1493], [927, 1500], [838, 1493], [787, 1520], [775, 1520], [752, 1496], [697, 1512], [676, 1495], [625, 1502], [614, 1512], [578, 1508], [567, 1496], [547, 1508], [532, 1502], [508, 1522], [487, 1522], [461, 1498], [423, 1495], [387, 1506], [374, 1493], [319, 1483], [263, 1506], [235, 1487], [214, 1489], [187, 1516], [175, 1516]], "baseline": [[175, 1491], [370, 1483], [403, 1487], [483, 1489], [502, 1493], [1216, 1491], [1276, 1496], [1339, 1495], [1395, 1498]], "id": "61bdb5af-8737-49d8-b20f-e600b41759f7", "type": "baselines"}}, {"prediction": "\u063a\u064a\u0631 \u0645\u0648\u0627\u0636\u0639\u0647\u0627\u060c \u0641\u0627\u062a\u0647\u0645\u0648\u0647 \u0639\u0644\u0649 \u0627\u0633\u062a\u0646\u0628\u0627\u0637\u0647 \u0648\u0639\u0644\u0645\u0647 \u0648\u0631\u0627\u0654\u064a\u0647\u060c \u0648\u0644\u0627 \u062a\u0642\u0644\u062f\u0648\u0647", "cuts": [[967, 967], [946, 946], [929, 935], [908, 913], [902, 902], [886, 886], [865, 870], [848, 848], [816, 816], [794, 794], [778, 778], [767, 767], [746, 751], [740, 740], [724, 729], [713, 713], [697, 697], [675, 675], [659, 659], [638, 638], [621, 627], [605, 605], [589, 589], [573, 573], [540, 546], [535, 535], [519, 519], [497, 497], [481, 481], [470, 475], [459, 465], [438, 438], [421, 421], [400, 405], [389, 394], [367, 367], [351, 351], [330, 330], [313, 313], [292, 297], [281, 281], [265, 265], [243, 249], [238, 238], [232, 232], [222, 222], [200, 205], [184, 189], [178, 178], [151, 157], [140, 146], [124, 130], [119, 119], [103, 103], [86, 86], [70, 70], [49, 49], [27, 27]], "confidences": [0.9998652935028076, 0.5277007222175598, 0.9999955892562866, 0.9999880790710449, 0.9999693632125854, 0.9982054233551025, 0.9999960660934448, 0.8161394596099854, 0.9999929666519165, 0.9999971389770508, 0.9999768733978271, 0.9989445805549622, 0.9983943104743958, 0.835041344165802, 0.9998206496238708, 0.9999831914901733, 0.9942564368247986, 0.999908447265625, 0.9996181726455688, 0.5019206404685974, 0.9998630285263062, 0.9985489249229431, 0.9094343781471252, 0.9999619722366333, 0.999971866607666, 0.9999991655349731, 0.9999998807907104, 0.9989573955535889, 0.9999986886978149, 0.9999964237213135, 0.9999872446060181, 0.916301965713501, 0.9883456230163574, 0.9999982118606567, 0.9999991655349731, 0.9999978542327881, 0.6548713445663452, 0.936079204082489, 0.9999892711639404, 0.9997774958610535, 0.9999997615814209, 0.9538446664810181, 0.9998297691345215, 0.9999701976776123, 0.9999457597732544, 0.9999912977218628, 0.9999996423721313, 0.999927282333374, 0.9924691319465637, 0.9999955892562866, 0.9999499320983887, 0.9999344348907471, 0.993513286113739, 0.999993085861206, 0.9991191029548645, 0.9999837875366211, 0.9999768733978271, 0.9998847246170044], "line": {"boundary": [[481, 1563], [489, 1533], [522, 1532], [547, 1506], [561, 1506], [571, 1516], [580, 1508], [600, 1518], [631, 1516], [658, 1539], [684, 1533], [707, 1510], [744, 1537], [766, 1539], [785, 1530], [795, 1537], [814, 1518], [875, 1541], [898, 1518], [933, 1520], [980, 1539], [1005, 1520], [1027, 1541], [1052, 1518], [1093, 1541], [1157, 1541], [1189, 1522], [1208, 1522], [1226, 1537], [1249, 1522], [1263, 1535], [1298, 1541], [1335, 1524], [1354, 1541], [1374, 1539], [1391, 1553], [1432, 1526], [1465, 1565], [1417, 1592], [1387, 1594], [1370, 1578], [1352, 1596], [1321, 1578], [1280, 1578], [1257, 1588], [1222, 1571], [1187, 1576], [1175, 1588], [1142, 1578], [1115, 1590], [1089, 1569], [1039, 1592], [1021, 1590], [1005, 1574], [957, 1576], [939, 1588], [922, 1572], [879, 1571], [865, 1584], [847, 1586], [834, 1574], [768, 1571], [754, 1584], [731, 1588], [662, 1571], [641, 1588], [600, 1565], [557, 1584], [534, 1574], [506, 1584], [483, 1572]], "baseline": [[483, 1565], [651, 1565], [779, 1571], [1362, 1569], [1417, 1576], [1466, 1567]], "id": "69b7c31f-5408-4dd0-85d6-75e1e8d434fb", "type": "baselines"}}, {"prediction": "\u0648\u0645\u062a\u0649 \u0631\u0627\u0654\u064a\u062a\u0645 \u0627\u0644\u0639\u0627\u0644\u0645 \u0644\u0627 \u064a\u062a\u0645\u0645 \u0635\u0644\u0627\u062a\u0647 \u0627\u0644\u0645\u0641\u0631\u0648\u0636\u0629 \u060c \u0648\u0644\u0627 \u064a\u0637\u0645\u064a\u0654\u0646 \u0641\u064a \u0631\u0643\u0648\u0639\u0647\u0627", "cuts": [[1209, 1209], [1187, 1187], [1176, 1176], [1159, 1159], [1109, 1115], [1098, 1098], [1081, 1087], [1076, 1076], [1070, 1070], [1059, 1059], [1042, 1042], [1004, 1015], [998, 998], [987, 993], [970, 970], [954, 954], [943, 943], [920, 920], [887, 893], [871, 876], [859, 865], [826, 837], [821, 821], [804, 804], [787, 793], [765, 765], [726, 737], [710, 710], [676, 682], [665, 671], [649, 649], [638, 638], [604, 610], [593, 599], [582, 582], [566, 566], [549, 549], [532, 532], [510, 510], [482, 488], [455, 455], [444, 444], [438, 438], [399, 410], [394, 394], [366, 372], [355, 360], [322, 333], [316, 316], [288, 294], [272, 272], [255, 255], [250, 250], [233, 238], [194, 205], [183, 183], [172, 172], [122, 133], [111, 111], [94, 94], [72, 72], [50, 50], [28, 28], [11, 11]], "confidences": [0.999711811542511, 0.9999942779541016, 0.9999964237213135, 0.9999276399612427, 0.9999908208847046, 0.9999871253967285, 0.9998900890350342, 0.9831660985946655, 0.9998063445091248, 0.999962329864502, 0.9997965693473816, 0.9999898672103882, 0.99998939037323, 0.9999788999557495, 0.9994357228279114, 0.9999730587005615, 0.7908631563186646, 0.9956527948379517, 0.9997575879096985, 0.9996732473373413, 0.9956046342849731, 0.999534010887146, 0.9465213418006897, 0.9551798105239868, 0.9997909665107727, 0.974587619304657, 0.9998075366020203, 0.999998927116394, 0.9999898672103882, 0.9993416666984558, 0.9999842643737793, 0.999870777130127, 0.9998094439506531, 0.9999909400939941, 0.9999817609786987, 0.9999905824661255, 0.7308676242828369, 0.9999252557754517, 0.9999912977218628, 0.9999830722808838, 0.9993329644203186, 0.9937452077865601, 0.9980292916297913, 0.9999990463256836, 0.9999905824661255, 0.9998887777328491, 0.9999932050704956, 0.9999985694885254, 0.9999996423721313, 0.9999998807907104, 0.9999985694885254, 0.8817663788795471, 0.9893107414245605, 0.9999843835830688, 0.9999984502792358, 0.9999974966049194, 0.9999927282333374, 0.9999198913574219, 0.9998809099197388, 0.9999985694885254, 0.9999926090240479, 0.9989744424819946, 0.9999724626541138, 0.7024262547492981], "line": {"boundary": [[169, 1647], [173, 1594], [185, 1606], [210, 1604], [222, 1613], [259, 1594], [296, 1629], [335, 1596], [370, 1621], [403, 1602], [424, 1608], [442, 1592], [481, 1615], [508, 1592], [532, 1592], [571, 1625], [602, 1596], [617, 1596], [629, 1608], [647, 1602], [678, 1617], [701, 1598], [723, 1610], [744, 1596], [777, 1621], [799, 1604], [838, 1600], [857, 1617], [877, 1611], [900, 1633], [959, 1598], [992, 1613], [1009, 1598], [1037, 1598], [1066, 1625], [1093, 1596], [1122, 1610], [1146, 1596], [1185, 1623], [1241, 1590], [1284, 1631], [1329, 1606], [1354, 1617], [1368, 1613], [1407, 1648], [1382, 1650], [1360, 1666], [1333, 1654], [1309, 1670], [1272, 1652], [1253, 1666], [1212, 1660], [1193, 1676], [1163, 1650], [1101, 1652], [1070, 1676], [1040, 1648], [1021, 1658], [998, 1647], [978, 1664], [933, 1664], [920, 1678], [885, 1650], [822, 1658], [779, 1647], [705, 1654], [686, 1668], [582, 1647], [543, 1662], [506, 1647], [491, 1647], [475, 1660], [415, 1650], [397, 1666], [380, 1666], [354, 1647], [327, 1672], [315, 1672], [288, 1647], [265, 1660], [247, 1650], [230, 1662], [200, 1650], [185, 1660], [173, 1654]], "baseline": [[171, 1648], [1204, 1647], [1249, 1648], [1270, 1654], [1408, 1650]], "id": "37eead36-ae8c-47ea-aa4b-69190b7cf186", "type": "baselines"}}, {"prediction": "\u0648\u0633\u062c\u0648\u062f\u0647\u0627\u060c \u0648\u0644\u0627 \u064a\u062d\u0636\u0631 \u0645\u0639 \u0642\u0631\u0627\u0621\u062a\u0647 \u0641\u064a\u0647\u0627 \u0628\u0627\u0644\u062e\u0634\u0648\u0639 \u0648\u0627\u0644\u062d\u0636\u0648\u0631\u060c \u0648\u0627\u0644\u062a\u062f\u0628\u0631 \u0648\u0627\u0644\u062a\u0631\u062a\u064a\u0644", "cuts": [[1292, 1292], [1267, 1267], [1231, 1231], [1213, 1213], [1194, 1194], [1170, 1170], [1152, 1158], [1139, 1139], [1109, 1121], [1097, 1103], [1072, 1079], [1060, 1066], [1030, 1042], [1024, 1024], [999, 999], [975, 975], [944, 944], [908, 914], [896, 896], [877, 877], [841, 847], [829, 829], [817, 817], [798, 798], [786, 786], [768, 768], [756, 756], [725, 731], [713, 713], [701, 701], [689, 689], [670, 670], [640, 652], [634, 634], [622, 622], [609, 609], [585, 585], [561, 561], [536, 536], [512, 512], [475, 481], [469, 469], [451, 451], [439, 439], [414, 414], [390, 390], [360, 360], [335, 335], [317, 317], [286, 293], [274, 274], [256, 262], [250, 250], [238, 238], [225, 225], [201, 201], [189, 189], [152, 165], [146, 146], [128, 128], [116, 122], [104, 104], [91, 91], [79, 79], [61, 61], [49, 49]], "confidences": [0.9998243451118469, 0.9999920129776001, 0.9999985694885254, 0.9999624490737915, 0.9999974966049194, 0.9999874830245972, 0.9999926090240479, 0.9999836683273315, 0.999990701675415, 0.9999855756759644, 0.99998939037323, 0.9999979734420776, 0.9996892213821411, 0.9999874830245972, 0.9997640252113342, 0.9999427795410156, 0.9993060827255249, 0.9446314573287964, 0.7036338448524475, 0.9967960715293884, 0.9986769556999207, 0.9841193556785583, 0.9994528889656067, 0.9409279823303223, 0.9999997615814209, 0.9999942779541016, 0.9934862852096558, 0.9999960660934448, 0.9999674558639526, 0.9067964553833008, 0.9972527623176575, 0.999915599822998, 0.9999898672103882, 0.9999929666519165, 0.9999849796295166, 0.9999780654907227, 0.9999867677688599, 0.999346911907196, 0.9999964237213135, 0.9825494289398193, 0.9995606541633606, 0.9960000514984131, 0.9999972581863403, 0.9731088280677795, 0.9996663331985474, 0.5042705535888672, 1.0, 0.9998852014541626, 0.9999935626983643, 0.9747305512428284, 0.7328495383262634, 0.9999992847442627, 0.9982652068138123, 0.9998162388801575, 1.0, 0.9999856948852539, 0.8613400459289551, 0.9995511174201965, 0.9720507264137268, 0.9999809265136719, 0.9999556541442871, 0.9989655017852783, 0.9860791563987732, 0.9992793202400208, 0.9793171882629395, 0.9999933242797852], "line": {"boundary": [[161, 1732], [165, 1686], [194, 1670], [237, 1684], [270, 1670], [319, 1707], [387, 1670], [409, 1674], [442, 1699], [461, 1686], [514, 1693], [532, 1678], [561, 1687], [588, 1670], [633, 1701], [656, 1684], [678, 1695], [701, 1680], [740, 1684], [752, 1674], [764, 1674], [787, 1695], [810, 1676], [830, 1689], [861, 1678], [885, 1699], [908, 1682], [945, 1678], [955, 1687], [980, 1678], [1003, 1699], [1046, 1693], [1070, 1713], [1115, 1682], [1175, 1695], [1200, 1674], [1226, 1674], [1261, 1703], [1296, 1676], [1348, 1695], [1440, 1693], [1469, 1726], [1456, 1726], [1432, 1746], [1389, 1734], [1347, 1748], [1321, 1732], [1280, 1732], [1270, 1725], [1233, 1744], [1193, 1725], [1171, 1742], [1142, 1730], [1074, 1748], [1060, 1736], [1033, 1758], [1007, 1754], [982, 1730], [949, 1748], [927, 1730], [904, 1734], [886, 1725], [851, 1744], [822, 1742], [803, 1725], [779, 1744], [760, 1730], [703, 1732], [668, 1756], [653, 1754], [627, 1730], [612, 1740], [584, 1728], [518, 1730], [489, 1742], [438, 1725], [411, 1740], [395, 1728], [364, 1728], [352, 1740], [325, 1742], [306, 1726], [286, 1740], [253, 1728], [228, 1744], [216, 1736], [179, 1744], [165, 1732]], "baseline": [[163, 1734], [214, 1732], [255, 1725], [364, 1726], [397, 1723], [419, 1723], [438, 1726], [1419, 1725], [1471, 1728]], "id": "10b8b309-9cbe-4e14-8758-f6d22c56c47e", "type": "baselines"}}, {"prediction": "\u0641\u0627\u062a\u0647\u0645\u0648\u0647 \u0628\u0642\u0633\u0627\u0648\u0629 \u0627\u0644\u0642\u0644\u0628\u060c \u0648\u0628\u0639\u062f\u0647 \u0639\u0646 \u0627\u0644\u0631\u0628 \u0639\u0632 \u0648\u062c\u0644.", "cuts": [[683, 683], [668, 673], [659, 659], [644, 644], [620, 620], [601, 606], [582, 582], [563, 567], [558, 558], [543, 543], [524, 524], [500, 500], [490, 490], [466, 466], [452, 452], [442, 447], [433, 433], [418, 418], [399, 404], [375, 375], [346, 346], [327, 332], [317, 322], [298, 303], [284, 284], [269, 269], [245, 245], [226, 231], [212, 212], [188, 192], [163, 168], [159, 159], [149, 149], [135, 135], [106, 106], [72, 77], [63, 63], [53, 58], [48, 48], [43, 43], [38, 38], [29, 34], [19, 19]], "confidences": [0.9739862084388733, 0.9999884366989136, 0.9997276663780212, 0.9999849796295166, 0.9990725517272949, 0.9999985694885254, 0.9983306527137756, 0.9980822801589966, 0.9998204112052917, 0.997825026512146, 0.9833168387413025, 0.9999716281890869, 0.999618411064148, 0.9978547692298889, 0.6419629454612732, 0.9951518774032593, 0.9999998807907104, 1.0, 0.9999918937683105, 0.9991405010223389, 0.9999971389770508, 1.0, 1.0, 0.9999991655349731, 0.9999963045120239, 0.9999998807907104, 0.9999983310699463, 0.999997615814209, 0.9999990463256836, 0.9999960660934448, 0.9999496936798096, 0.9999961853027344, 0.9999966621398926, 0.9999440908432007, 0.9999513626098633, 0.9999853372573853, 0.9999990463256836, 0.9999951124191284, 0.9946951270103455, 0.9999998807907104, 0.9999974966049194, 0.9999954700469971, 0.9960901141166687], "line": {"boundary": [[764, 1799], [766, 1769], [783, 1752], [812, 1746], [849, 1775], [879, 1767], [898, 1750], [929, 1769], [974, 1765], [986, 1773], [1025, 1762], [1048, 1771], [1103, 1767], [1122, 1777], [1150, 1752], [1189, 1752], [1233, 1767], [1253, 1754], [1272, 1773], [1288, 1758], [1304, 1758], [1321, 1775], [1384, 1775], [1426, 1756], [1463, 1783], [1469, 1802], [1415, 1810], [1401, 1822], [1368, 1812], [1354, 1824], [1327, 1812], [1306, 1822], [1292, 1810], [1253, 1810], [1231, 1822], [1206, 1806], [1146, 1810], [1130, 1824], [1093, 1806], [1072, 1820], [1048, 1820], [1035, 1808], [994, 1810], [980, 1802], [935, 1826], [912, 1808], [886, 1822], [851, 1822], [830, 1804], [785, 1812], [766, 1806]], "baseline": [[766, 1801], [846, 1801], [867, 1804], [1470, 1804]], "id": "80fb2329-0ad1-464c-b2b3-93a36d431628", "type": "baselines"}}, {"prediction": "\u0648\u0645\u062a\u0649 \u0648\u062c\u062f\u062a\u0645 \u0627\u0644\u0639\u0627\u0644\u0645 \u0644\u0627 \u0645\u0639\u0627\u0645\u0644\u0629 \u0644\u0647 \u0645\u0639 \u0631\u0628\u0647 \u0639\u0632 \u0648\u062c\u0644 \u060c \u062a\u0638\u0647\u0631 \u0639\u0644\u064a\u0647 \u0628\u0647\u062c\u062a\u0647\u0627 \u0648\u0627\u0654\u0646\u0648\u0627\u0631\u0647\u0627", "cuts": [[1236, 1236], [1214, 1214], [1197, 1197], [1186, 1186], [1142, 1153], [1131, 1136], [1103, 1103], [1086, 1086], [1064, 1064], [1042, 1042], [1014, 1020], [1009, 1009], [998, 998], [981, 981], [964, 964], [953, 953], [931, 937], [898, 909], [887, 892], [876, 881], [853, 859], [842, 842], [820, 820], [804, 809], [792, 792], [770, 770], [759, 759], [732, 743], [726, 726], [709, 709], [682, 687], [671, 671], [648, 648], [621, 626], [610, 610], [593, 593], [576, 576], [554, 560], [543, 543], [532, 538], [526, 526], [521, 521], [515, 515], [504, 510], [499, 499], [493, 493], [471, 477], [460, 460], [438, 443], [421, 421], [399, 405], [371, 377], [355, 355], [338, 338], [327, 327], [310, 310], [283, 288], [277, 277], [260, 260], [233, 233], [211, 211], [200, 200], [177, 183], [155, 166], [150, 150], [133, 133], [122, 127], [116, 116], [105, 105], [83, 89], [72, 72], [50, 50], [33, 33]], "confidences": [0.9999624490737915, 0.9999873638153076, 0.9999958276748657, 0.9999871253967285, 0.9999827146530151, 0.9999901056289673, 0.999958872795105, 0.519729733467102, 0.9999949932098389, 0.990899920463562, 0.9998747110366821, 0.9999719858169556, 0.9997586607933044, 0.9992938041687012, 0.9987748265266418, 0.9998395442962646, 0.9999606609344482, 0.9999958276748657, 0.999937891960144, 0.9987975358963013, 0.9998902082443237, 0.9642751216888428, 0.9995637536048889, 0.9999383687973022, 0.9973805546760559, 0.9987190961837769, 0.524466335773468, 0.9997130036354065, 0.9221267104148865, 0.9419159293174744, 0.9999997615814209, 0.9999914169311523, 0.9996623992919922, 0.999992847442627, 0.9999985694885254, 0.999937891960144, 0.9998610019683838, 0.9999767541885376, 0.9999998807907104, 0.8760433197021484, 0.9968647360801697, 0.9999954700469971, 0.999546229839325, 0.9998810291290283, 0.656394362449646, 0.9994986057281494, 0.9998539686203003, 0.9695175290107727, 0.9999977350234985, 0.9999958276748657, 0.9999986886978149, 0.9999974966049194, 0.9999914169311523, 0.9999973773956299, 0.9956705570220947, 0.9975166320800781, 0.9996503591537476, 0.9999966621398926, 0.9999432563781738, 0.9999326467514038, 0.960350751876831, 0.9999790191650391, 0.9999817609786987, 0.9995361566543579, 0.9995700716972351, 0.9970190525054932, 0.9999990463256836, 0.9999368190765381, 0.7645747065544128, 0.9985374212265015, 0.9979060888290405, 0.9999816417694092, 0.990431010723114], "line": {"boundary": [[144, 1867], [146, 1841], [161, 1828], [196, 1843], [214, 1828], [233, 1838], [263, 1816], [290, 1841], [315, 1826], [329, 1840], [399, 1840], [423, 1853], [473, 1828], [516, 1861], [559, 1828], [598, 1832], [614, 1845], [658, 1822], [693, 1845], [713, 1840], [746, 1847], [758, 1859], [775, 1845], [808, 1845], [820, 1855], [849, 1828], [871, 1840], [900, 1828], [920, 1838], [935, 1828], [957, 1847], [978, 1847], [1000, 1828], [1021, 1826], [1052, 1851], [1079, 1828], [1107, 1841], [1132, 1830], [1161, 1855], [1193, 1836], [1249, 1851], [1265, 1845], [1286, 1863], [1327, 1840], [1368, 1847], [1407, 1882], [1376, 1886], [1364, 1898], [1347, 1898], [1337, 1888], [1298, 1904], [1276, 1886], [1261, 1900], [1189, 1890], [1165, 1910], [1142, 1888], [1087, 1886], [1052, 1908], [1031, 1886], [1007, 1888], [994, 1877], [961, 1890], [898, 1890], [869, 1875], [853, 1888], [826, 1880], [781, 1910], [752, 1888], [717, 1896], [690, 1875], [668, 1888], [635, 1888], [606, 1873], [584, 1888], [524, 1900], [499, 1880], [460, 1896], [432, 1880], [409, 1894], [376, 1884], [329, 1894], [302, 1875], [276, 1894], [253, 1884], [237, 1896], [196, 1894], [148, 1869]], "baseline": [[146, 1869], [194, 1875], [323, 1873], [345, 1878], [499, 1882], [555, 1880], [590, 1873], [859, 1875], [900, 1871], [923, 1877], [1037, 1878], [1056, 1882], [1276, 1880], [1354, 1888], [1408, 1884]], "id": "54799679-1ac4-47fe-934f-83b31f13faa8", "type": "baselines"}}, {"prediction": "\u0648\u0633\u0643\u064a\u0646\u062a\u0647\u0627\u060c \u0645\u0646 \u062a\u0644\u0627\u0648\u0629 \u0648\u0635\u064a\u0627\u0645 \u0648\u0642\u064a\u0627\u0645\u060c \u0641\u0627\u0639\u0644\u0645\u0648\u0627 \u0627\u0654\u0646\u0647 \u0642\u0644\u064a\u0644 \u0627\u0644\u0646\u0635\u064a\u0628 \u0645\u0646 \u062b\u0645\u0631\u0629 \u0627\u0644\u0639\u0644\u0645 \u0627\u0655\u0630 \u062b\u0645\u0631\u0629", "cuts": [[1298, 1298], [1273, 1278], [1243, 1243], [1228, 1228], [1213, 1213], [1203, 1203], [1188, 1188], [1173, 1173], [1158, 1158], [1138, 1143], [1128, 1133], [1108, 1108], [1082, 1087], [1072, 1072], [1057, 1062], [1047, 1052], [1027, 1027], [1007, 1007], [987, 992], [977, 977], [947, 947], [922, 922], [907, 907], [892, 892], [872, 877], [862, 862], [842, 842], [827, 827], [817, 822], [797, 802], [782, 782], [762, 767], [757, 757], [742, 742], [727, 727], [707, 707], [687, 687], [667, 672], [651, 651], [636, 641], [626, 631], [621, 621], [616, 616], [601, 601], [581, 586], [571, 571], [556, 561], [546, 546], [531, 536], [501, 506], [491, 496], [481, 486], [471, 471], [451, 451], [426, 426], [396, 401], [366, 371], [356, 356], [331, 331], [306, 311], [296, 301], [281, 281], [261, 261], [246, 246], [226, 231], [216, 221], [205, 210], [190, 190], [175, 175], [150, 155], [135, 135], [125, 130], [115, 120], [110, 110], [90, 95], [80, 80], [65, 65], [45, 45], [30, 30]], "confidences": [0.9999417066574097, 0.9999945163726807, 0.9999974966049194, 0.999985933303833, 0.9999626874923706, 0.99998939037323, 0.9999910593032837, 0.9999959468841553, 0.756621778011322, 0.9993665814399719, 0.9999896287918091, 0.9500626921653748, 0.9996504783630371, 0.9999996423721313, 0.9999978542327881, 0.9999961853027344, 0.9998416900634766, 0.9999421834945679, 0.9999947547912598, 0.9550725221633911, 0.999901294708252, 0.999994158744812, 0.99993896484375, 0.9998705387115479, 0.9994296431541443, 0.9963602423667908, 0.9768261909484863, 0.9845020174980164, 0.9991129040718079, 0.9998034834861755, 0.9999189376831055, 0.9999998807907104, 0.9999986886978149, 0.9999935626983643, 0.9999996423721313, 0.9999974966049194, 0.999970555305481, 0.9999955892562866, 0.9999997615814209, 1.0, 0.9998965263366699, 0.9999996423721313, 0.9999357461929321, 0.7053399085998535, 0.9999959468841553, 0.9999908208847046, 0.9990590214729309, 0.9999946355819702, 0.9999847412109375, 0.9993951320648193, 0.9999172687530518, 0.9937519431114197, 0.9999966621398926, 0.9998257756233215, 0.514997661113739, 0.9999998807907104, 0.9999972581863403, 0.9961175918579102, 0.996932864189148, 0.9999979734420776, 0.9999998807907104, 0.9999791383743286, 0.9999998807907104, 0.9914675951004028, 0.9999983310699463, 0.9999983310699463, 0.9999997615814209, 0.9999996423721313, 0.9999963045120239, 0.9999997615814209, 0.9999983310699463, 0.9999831914901733, 1.0, 0.9999969005584717, 0.999922513961792, 0.6258425116539001, 0.9992828965187073, 0.9999939203262329, 0.9998599290847778], "line": {"boundary": [[152, 1951], [155, 1912], [163, 1906], [192, 1923], [214, 1904], [255, 1904], [288, 1923], [311, 1902], [329, 1912], [354, 1902], [368, 1912], [387, 1908], [409, 1925], [440, 1904], [460, 1921], [520, 1919], [543, 1929], [575, 1927], [617, 1904], [635, 1906], [653, 1921], [670, 1906], [684, 1912], [695, 1904], [734, 1919], [762, 1898], [795, 1908], [814, 1925], [840, 1906], [859, 1917], [873, 1908], [896, 1908], [914, 1923], [931, 1923], [955, 1906], [984, 1908], [1015, 1929], [1040, 1908], [1070, 1929], [1085, 1921], [1122, 1925], [1140, 1912], [1159, 1921], [1194, 1908], [1230, 1925], [1278, 1929], [1306, 1908], [1327, 1921], [1393, 1906], [1417, 1927], [1438, 1925], [1471, 1953], [1434, 1976], [1387, 1964], [1368, 1976], [1343, 1966], [1319, 1976], [1278, 1958], [1253, 1978], [1230, 1980], [1212, 1964], [1150, 1974], [1128, 1960], [1115, 1974], [1085, 1964], [1056, 1976], [1042, 1970], [1029, 1984], [1005, 1970], [951, 1972], [933, 1984], [902, 1958], [826, 1962], [795, 1976], [775, 1958], [742, 1962], [727, 1955], [658, 1980], [631, 1960], [534, 1974], [506, 1955], [463, 1976], [440, 1958], [387, 1972], [368, 1955], [313, 1960], [284, 1980], [233, 1955], [185, 1972], [155, 1955]], "baseline": [[153, 1953], [830, 1951], [916, 1953], [941, 1962], [961, 1958], [1419, 1960], [1473, 1955]], "id": "209f5fd7-70ce-4f0f-85ab-dadef361c176", "type": "baselines"}}, {"prediction": "\u0627\u0644\u0639\u0644\u0645 \u0627\u0644\u0645\u0639\u0627\u0645\u0644\u0629 \u060c \u0648\u0642\u0644\u064a\u0644 \u0627\u0644\u0646\u0635\u064a\u0628 \u0645\u0646 \u0627\u0644\u0645\u062d\u0628\u0629 \u0648\u0627\u0644\u062e\u0634\u064a\u0629\u060c \u0648( \u0627\u0655\u0646\u0645\u0627 \u064a\u062e\u0634\u0649 \u0627\u0644\u0644\u0647 \u0645\u0646 \u0639\u0628\u0627\u062f\u0648", "cuts": [[1303, 1303], [1290, 1290], [1272, 1272], [1260, 1260], [1235, 1235], [1211, 1217], [1198, 1204], [1186, 1192], [1168, 1168], [1149, 1149], [1131, 1137], [1118, 1118], [1106, 1106], [1088, 1088], [1081, 1081], [1075, 1075], [1051, 1057], [1038, 1038], [1014, 1014], [1002, 1002], [989, 989], [977, 977], [940, 946], [928, 934], [916, 922], [903, 903], [885, 885], [860, 860], [836, 836], [793, 799], [780, 780], [756, 762], [725, 731], [719, 719], [707, 713], [688, 688], [664, 664], [645, 645], [633, 633], [602, 608], [590, 596], [571, 578], [559, 565], [535, 535], [516, 516], [492, 492], [479, 479], [461, 461], [436, 442], [424, 424], [399, 399], [381, 381], [369, 375], [363, 363], [356, 356], [338, 338], [326, 326], [313, 320], [301, 301], [289, 289], [270, 270], [246, 252], [221, 227], [215, 215], [203, 209], [191, 191], [178, 184], [160, 166], [154, 154], [135, 135], [104, 111], [92, 92], [80, 80], [61, 61], [49, 49], [37, 37]], "confidences": [0.9999939203262329, 0.9962407350540161, 0.6148149967193604, 0.9995049238204956, 0.9999679327011108, 0.9998955726623535, 0.9999966621398926, 0.9999812841415405, 0.9999535083770752, 0.9999920129776001, 0.9999990463256836, 0.9946582913398743, 0.7702367901802063, 0.9436891078948975, 0.9403108358383179, 0.874081015586853, 0.9999908208847046, 0.9999887943267822, 0.999915599822998, 0.9999622106552124, 0.9999816417694092, 0.9999862909317017, 0.9991334080696106, 0.9935688972473145, 0.9999759197235107, 0.9654875993728638, 0.9996823072433472, 0.9990022778511047, 0.564159095287323, 0.9998770952224731, 0.9986807703971863, 0.9983581900596619, 0.9994006156921387, 0.9421390295028687, 0.9977754950523376, 0.9938074946403503, 0.9999985694885254, 0.9493253231048584, 0.9998681545257568, 0.9999979734420776, 0.9999966621398926, 0.9997482895851135, 0.9999991655349731, 0.9999998807907104, 0.9024093747138977, 0.8440074920654297, 0.9990659356117249, 0.9999818801879883, 0.98737633228302, 0.9999896287918091, 0.9998379945755005, 0.9999996423721313, 0.9999951124191284, 0.9999514818191528, 0.9996600151062012, 0.971716046333313, 0.9997962117195129, 0.999996542930603, 0.9999830722808838, 0.9999959468841553, 0.9999998807907104, 0.999964714050293, 0.9999979734420776, 0.5567030906677246, 0.999757707118988, 0.8596031069755554, 0.998282790184021, 0.7934605479240417, 0.9993875026702881, 0.9990580677986145, 0.9998717308044434, 0.9960359930992126, 0.998126208782196, 0.9995434880256653, 0.5599195957183838, 0.99636310338974], "line": {"boundary": [[152, 2046], [165, 2009], [218, 1982], [247, 2005], [269, 1986], [300, 2005], [331, 1984], [358, 1982], [378, 1999], [401, 1982], [440, 1980], [458, 1993], [483, 1982], [512, 1995], [530, 1986], [555, 2009], [582, 2019], [610, 1993], [637, 2003], [647, 1995], [686, 1999], [701, 1990], [740, 2013], [771, 1995], [789, 2011], [816, 2015], [851, 1993], [879, 2015], [894, 2007], [927, 2009], [939, 2019], [947, 2011], [966, 2019], [1011, 2017], [1050, 1992], [1089, 2017], [1109, 1999], [1124, 2003], [1138, 1995], [1157, 1997], [1191, 2025], [1222, 1997], [1237, 1995], [1255, 2005], [1270, 1997], [1300, 2015], [1329, 1993], [1362, 2019], [1391, 1995], [1409, 2005], [1430, 1995], [1463, 2021], [1469, 2040], [1438, 2056], [1395, 2056], [1378, 2071], [1347, 2054], [1230, 2058], [1196, 2048], [1171, 2068], [1144, 2058], [1093, 2071], [1072, 2052], [966, 2066], [939, 2044], [898, 2070], [865, 2052], [799, 2052], [777, 2066], [750, 2044], [725, 2064], [680, 2050], [623, 2062], [584, 2044], [567, 2060], [541, 2060], [528, 2071], [497, 2066], [483, 2054], [436, 2058], [424, 2050], [389, 2062], [368, 2060], [356, 2048], [309, 2048], [294, 2060], [259, 2058], [251, 2050], [228, 2060], [202, 2050], [187, 2058], [155, 2054]], "baseline": [[153, 2048], [491, 2048], [604, 2042], [816, 2042], [883, 2046], [1470, 2042]], "id": "d2a24751-e15b-4046-a50f-1b6734287128", "type": "baselines"}}, {"prediction": "\u0627\u0644\u0639\u0644\u0645\u0648\u0627).", "cuts": [[358, 365], [352, 352], [338, 338], [325, 325], [311, 311], [291, 291], [270, 277], [250, 250], [34, 41]], "confidences": [0.9943757057189941, 0.7291178107261658, 0.9799628257751465, 0.7520625591278076, 0.6908395886421204, 0.9932884573936462, 0.9999109506607056, 0.48956286907196045, 0.997548520565033], "line": {"boundary": [[1099, 2132], [1101, 2107], [1132, 2075], [1212, 2099], [1228, 2081], [1245, 2089], [1280, 2077], [1309, 2097], [1352, 2064], [1378, 2079], [1446, 2077], [1465, 2097], [1471, 2126], [1442, 2144], [1384, 2146], [1343, 2165], [1327, 2165], [1304, 2144], [1284, 2153], [1247, 2140], [1208, 2157], [1193, 2144], [1134, 2149], [1107, 2132]], "baseline": [[1101, 2134], [1473, 2128]], "id": "c9a4534a-dd8f-43bc-b94d-b6ffba2f07f9", "type": "baselines"}}], "regions": {"text": [{"id": "e85748f7-d261-4906-9d1d-9dc0074c03e1", "boundary": [[0, 0], [1655, 0], [1655, 2339], [0, 2339]], "imagename": null, "tags": null}]}} +{"lines": [{"prediction": "238", "cuts": [[39, 39], [65, 65], [96, 96]], "confidences": [0.9999942779541016, 0.9999815225601196, 0.9999997615814209], "line": {"boundary": [[1364, 228], [1366, 191], [1382, 177], [1444, 177], [1473, 202], [1479, 226], [1452, 241], [1380, 239], [1368, 231]], "baseline": [[1366, 230], [1440, 230], [1480, 227]], "id": "line_0", "type": "baselines"}}, {"prediction": "\u0648\u0644\u0627 \u064a\u0639\u062a\u0646\u064a \u0628\u0642\u0636\u0627\u0621 \u062d\u0627\u062c\u0629 \u0645\u0636\u0637\u0631 \u0645\u0644\u0647\u0648\u0641\u060c \u0641\u0627\u0655\u0646\u0647 \u0645\u0646 \u0627\u0644\u0642\u0627\u0633\u064a\u0629 \u0642\u0644\u0648\u0628\u0647\u0645\u060c \u0627\u0644\u0645\u0639\u0631\u0636\u064a\u0646 \u0639\u0646", "cuts": [[1291, 1291], [1266, 1273], [1254, 1260], [1235, 1241], [1223, 1223], [1204, 1210], [1192, 1192], [1179, 1179], [1167, 1167], [1136, 1136], [1124, 1124], [1111, 1111], [1086, 1086], [1055, 1061], [1043, 1043], [1018, 1024], [999, 999], [981, 981], [956, 962], [937, 937], [913, 919], [900, 900], [875, 881], [838, 838], [819, 819], [795, 801], [782, 782], [770, 770], [751, 751], [732, 732], [714, 714], [670, 670], [646, 658], [639, 639], [627, 633], [621, 621], [615, 615], [602, 602], [577, 584], [565, 565], [540, 540], [515, 521], [503, 509], [497, 497], [484, 484], [459, 466], [447, 447], [428, 428], [410, 410], [385, 391], [379, 379], [360, 360], [348, 348], [329, 329], [310, 310], [286, 292], [273, 273], [248, 255], [242, 242], [230, 230], [211, 211], [192, 192], [174, 174], [149, 155], [118, 118], [99, 106], [68, 75], [56, 56], [31, 31]], "confidences": [0.9918296933174133, 0.9999946355819702, 0.9999945163726807, 0.9999985694885254, 0.9999771118164062, 0.9999879598617554, 0.9987093210220337, 0.9987457990646362, 0.9997931122779846, 0.999688982963562, 0.9999251365661621, 0.587072491645813, 0.9999754428863525, 0.99989914894104, 0.9920154809951782, 0.9999525547027588, 0.9999878406524658, 0.9997779726982117, 0.9999771118164062, 0.9966135621070862, 0.9999631643295288, 0.9998565912246704, 0.9999505281448364, 0.9981879591941833, 0.8379210829734802, 0.9999366998672485, 0.9966161847114563, 0.9895930290222168, 0.9999837875366211, 0.9999969005584717, 0.8669806122779846, 0.974852979183197, 0.9999998807907104, 0.9999897480010986, 0.9999994039535522, 0.9228501319885254, 0.9999959468841553, 0.9999970197677612, 0.9999334812164307, 0.9997324347496033, 0.9999984502792358, 0.9917014241218567, 0.9999793767929077, 1.0, 0.9999970197677612, 0.9935858845710754, 0.9999581575393677, 0.8294568061828613, 0.9999990463256836, 0.9999179840087891, 0.9999973773956299, 0.9964264035224915, 0.9883396625518799, 0.7585844993591309, 0.962102472782135, 0.8603035807609558, 0.9998493194580078, 0.9999865293502808, 0.9999082088470459, 0.9998868703842163, 0.999321699142456, 0.9835970997810364, 0.8893908262252808, 0.9999939203262329, 0.9998082518577576, 0.9999799728393555, 0.9999867677688599, 0.5397316217422485, 0.8847019076347351], "line": {"boundary": [[167, 337], [177, 290], [216, 288], [233, 302], [255, 288], [278, 300], [309, 282], [329, 300], [356, 296], [387, 276], [415, 294], [452, 300], [465, 292], [487, 298], [508, 278], [534, 278], [547, 288], [567, 278], [590, 298], [614, 278], [651, 276], [680, 298], [693, 292], [736, 302], [769, 280], [797, 282], [814, 298], [840, 296], [865, 280], [890, 298], [914, 278], [951, 292], [984, 265], [996, 265], [1021, 288], [1056, 280], [1072, 292], [1097, 282], [1113, 296], [1132, 280], [1179, 306], [1204, 282], [1228, 294], [1265, 284], [1298, 311], [1331, 290], [1362, 296], [1428, 280], [1491, 335], [1463, 335], [1446, 350], [1401, 335], [1380, 350], [1347, 341], [1313, 362], [1288, 345], [1270, 350], [1259, 341], [1212, 339], [1189, 346], [1171, 331], [1093, 348], [1066, 335], [1003, 339], [978, 362], [941, 337], [910, 348], [853, 352], [808, 327], [783, 346], [732, 327], [701, 350], [682, 350], [664, 335], [602, 335], [569, 346], [547, 327], [499, 348], [458, 343], [440, 358], [405, 333], [345, 335], [327, 348], [292, 337], [245, 350], [226, 335], [171, 348]], "baseline": [[169, 339], [269, 335], [304, 329], [1288, 329], [1368, 331], [1389, 335], [1492, 337]], "id": "line_1", "type": "baselines"}}, {"prediction": "\u0631\u0628\u0647\u0645\u060c \u0642\u0644\u0628\u0647 \u0628\u0639\u064a\u062f \u0645\u0646 \u0627\u0644\u0627\u0653\u062e\u0631\u0629\u060c \u0645\u062a\u0639\u0644\u0642 \u0628\u0627\u0644\u062f\u0646\u064a\u0627\u060c\u0639\u0644\u0645\u0647 \u062f\u0643\u0627\u0646\u0647\u060c \u0648\u064a\u062a\u0627\u0654\u0643\u0644 \u0648\u064a\u0631\u062a\u0632\u0642\u060c \u0648\u0644\u0627 \u064a\u0639\u0627\u0645\u0644", "cuts": [[1302, 1302], [1280, 1280], [1269, 1269], [1241, 1241], [1224, 1224], [1201, 1207], [1190, 1190], [1179, 1179], [1168, 1168], [1151, 1151], [1134, 1140], [1123, 1123], [1106, 1106], [1089, 1095], [1078, 1078], [1050, 1055], [1039, 1039], [1016, 1016], [988, 994], [982, 982], [966, 971], [954, 960], [949, 949], [926, 926], [909, 909], [893, 893], [876, 876], [853, 859], [842, 842], [831, 831], [808, 808], [797, 797], [780, 780], [747, 758], [741, 741], [730, 730], [719, 719], [702, 702], [685, 685], [674, 674], [662, 662], [646, 646], [629, 629], [612, 612], [589, 589], [573, 573], [550, 556], [539, 539], [522, 522], [500, 505], [494, 494], [477, 477], [460, 466], [443, 449], [432, 432], [415, 415], [404, 404], [393, 393], [382, 387], [376, 376], [354, 359], [320, 331], [314, 314], [292, 292], [281, 281], [264, 264], [253, 253], [230, 230], [196, 202], [180, 185], [168, 174], [146, 152], [135, 140], [112, 118], [107, 107], [84, 90], [73, 73], [56, 56], [39, 45]], "confidences": [0.999483585357666, 0.9989271759986877, 0.9999568462371826, 0.9999847412109375, 0.9999631643295288, 0.9999524354934692, 0.9999338388442993, 0.9999792575836182, 0.9999816417694092, 0.9999970197677612, 0.9998041987419128, 0.9913369417190552, 0.9999105930328369, 0.9999866485595703, 0.9997265934944153, 0.9998457431793213, 0.9999898672103882, 0.9658181667327881, 0.9998805522918701, 0.9999202489852905, 0.9999966621398926, 0.9999680519104004, 0.6977024078369141, 0.681415855884552, 0.9998468160629272, 0.999790370464325, 0.998950719833374, 0.9989398121833801, 0.9998928308486938, 0.9993798732757568, 0.9988120794296265, 0.9999618530273438, 0.978205144405365, 0.9999402761459351, 0.9968582391738892, 0.9899797439575195, 0.9999998807907104, 0.9918898940086365, 1.0, 0.6370328664779663, 0.9123554229736328, 0.9965428709983826, 0.9990838766098022, 0.6425076127052307, 0.999977707862854, 0.9999984502792358, 0.9999998807907104, 0.9999978542327881, 0.5949130058288574, 0.9999992847442627, 0.998330295085907, 0.863884687423706, 0.9997449517250061, 0.9999986886978149, 0.9999614953994751, 0.9998691082000732, 0.9999910593032837, 0.7401690483093262, 0.9997996687889099, 0.999140739440918, 0.9999452829360962, 0.9999958276748657, 0.9999629259109497, 0.999981164932251, 0.9999955892562866, 0.9999098777770996, 0.9996079802513123, 0.8690406680107117, 0.9999758005142212, 0.9999970197677612, 0.9999972581863403, 0.999855637550354, 0.9997760653495789, 0.9999991655349731, 0.9998064637184143, 0.9998438358306885, 0.8385894894599915, 0.9975091218948364, 0.9999769926071167], "line": {"boundary": [[161, 405], [165, 380], [189, 358], [206, 364], [224, 356], [257, 372], [276, 354], [298, 352], [335, 378], [384, 356], [393, 366], [413, 360], [432, 376], [467, 372], [477, 380], [516, 345], [528, 345], [571, 374], [600, 380], [639, 345], [670, 345], [713, 374], [754, 356], [787, 372], [805, 358], [844, 368], [875, 356], [904, 382], [941, 356], [961, 372], [982, 368], [1007, 382], [1029, 364], [1060, 378], [1087, 354], [1113, 350], [1150, 378], [1165, 372], [1204, 383], [1222, 368], [1284, 383], [1325, 358], [1384, 382], [1452, 380], [1465, 391], [1471, 415], [1440, 428], [1403, 424], [1385, 440], [1352, 413], [1317, 426], [1294, 413], [1274, 426], [1257, 419], [1231, 426], [1204, 409], [1169, 430], [1091, 409], [1044, 428], [1009, 407], [941, 415], [923, 426], [902, 419], [885, 424], [871, 413], [814, 424], [799, 411], [771, 422], [705, 405], [686, 415], [600, 407], [580, 422], [528, 411], [504, 428], [489, 428], [471, 415], [458, 422], [384, 424], [337, 405], [315, 422], [274, 405], [255, 421], [218, 409], [191, 426], [165, 419]], "baseline": [[163, 407], [1251, 407], [1325, 409], [1378, 417], [1473, 417]], "id": "line_2", "type": "baselines"}}, {"prediction": "\u0627\u0644\u0644\u0647 \u0628\u0639\u0644\u0645\u0647 \u0627\u0655\u0644\u0627 \u0642\u0644\u064a\u0644\u0627\u060c \u064a\u0633\u0643\u062a \u0639\u0646 \u0627\u0644\u062d\u0642 \u062e\u0634\u064a\u0629 \u0633\u0642\u0648\u0637 \u0645\u0646\u0632\u0644\u062a\u0647\u060c \u0648\u064a\u0645\u0627\u0644\u064a\u0654 \u0639\u0644\u0649 \u0627\u0644\u0628\u0627\u0637\u0644 \u0637\u0644\u0628\u0627", "cuts": [[1285, 1285], [1274, 1280], [1263, 1263], [1258, 1258], [1236, 1241], [1230, 1230], [1214, 1214], [1198, 1198], [1181, 1181], [1159, 1165], [1143, 1148], [1137, 1137], [1126, 1132], [1116, 1121], [1105, 1110], [1088, 1094], [1077, 1077], [1066, 1066], [1050, 1050], [1034, 1039], [1023, 1028], [1006, 1006], [990, 995], [979, 979], [957, 962], [935, 935], [897, 897], [869, 875], [853, 853], [831, 831], [804, 809], [798, 798], [787, 787], [760, 760], [744, 744], [711, 716], [694, 694], [667, 667], [645, 645], [629, 629], [612, 618], [596, 602], [574, 574], [558, 558], [525, 525], [498, 503], [487, 492], [476, 476], [459, 465], [443, 448], [432, 432], [421, 421], [399, 405], [383, 388], [377, 377], [355, 355], [339, 339], [323, 323], [312, 312], [295, 295], [279, 284], [262, 268], [252, 252], [230, 230], [213, 213], [180, 186], [175, 175], [164, 170], [153, 153], [137, 142], [120, 120], [104, 104], [66, 71], [49, 55], [38, 38], [22, 22], [11, 16]], "confidences": [0.6223369240760803, 0.999977707862854, 0.9996325969696045, 0.9976205229759216, 0.9999915361404419, 0.9999442100524902, 0.9999935626983643, 0.9986664056777954, 0.9931642413139343, 0.999994158744812, 0.99997878074646, 0.9995927214622498, 0.9999953508377075, 0.9999521970748901, 0.9999961853027344, 0.9999990463256836, 0.9987659454345703, 0.9996764659881592, 0.9999899864196777, 0.9999946355819702, 0.9998693466186523, 0.9999508857727051, 0.9999494552612305, 0.9999960660934448, 0.9999898672103882, 0.9999620914459229, 0.9999936819076538, 0.9995738863945007, 0.9997065663337708, 0.9967997074127197, 0.9996978044509888, 0.9999291896820068, 0.9937999844551086, 0.7420834898948669, 0.9566183090209961, 0.9999990463256836, 0.9998831748962402, 0.9999995231628418, 0.8633337020874023, 0.9998383522033691, 1.0, 0.9999995231628418, 0.9999997615814209, 1.0, 0.9999963045120239, 0.9999927282333374, 0.9999871253967285, 0.9999827146530151, 0.9999991655349731, 0.9999961853027344, 0.9995644688606262, 0.9999992847442627, 0.9997718930244446, 0.999894380569458, 1.0, 0.9999994039535522, 0.9999990463256836, 0.9999983310699463, 1.0, 0.9998666048049927, 1.0, 0.9999922513961792, 0.9998834133148193, 0.9998831748962402, 0.9995386600494385, 0.9999641180038452, 0.9991496801376343, 0.9994356036186218, 0.9781442284584045, 0.9928722381591797, 0.9813116192817688, 0.9999994039535522, 0.9999991655349731, 0.999995231628418, 0.9999226331710815, 0.9999967813491821, 0.9934727549552917], "line": {"boundary": [[175, 477], [181, 422], [191, 432], [216, 430], [241, 454], [265, 432], [315, 438], [335, 430], [364, 456], [395, 432], [432, 458], [471, 432], [508, 456], [551, 458], [586, 448], [604, 432], [649, 450], [688, 432], [711, 454], [731, 438], [768, 454], [793, 434], [816, 450], [836, 440], [846, 450], [863, 442], [877, 454], [902, 430], [931, 450], [957, 436], [980, 454], [1000, 456], [1019, 446], [1037, 456], [1111, 434], [1134, 456], [1187, 426], [1212, 444], [1220, 436], [1251, 444], [1286, 436], [1315, 456], [1339, 456], [1356, 438], [1399, 458], [1424, 438], [1450, 440], [1467, 456], [1473, 481], [1440, 497], [1413, 495], [1393, 508], [1376, 497], [1319, 493], [1288, 506], [1257, 485], [1218, 504], [1165, 491], [1134, 502], [1122, 493], [1050, 495], [1031, 485], [996, 508], [978, 508], [961, 493], [931, 493], [906, 512], [867, 487], [807, 504], [783, 485], [732, 493], [721, 504], [666, 485], [621, 504], [555, 487], [538, 502], [481, 491], [450, 508], [421, 489], [378, 504], [356, 502], [341, 489], [313, 500], [298, 487], [261, 506], [245, 504], [226, 487], [179, 497]], "baseline": [[177, 479], [298, 477], [360, 485], [403, 487], [508, 487], [573, 483], [795, 483], [818, 487], [1475, 483]], "id": "line_3", "type": "baselines"}}, {"prediction": "\u0644\u0644\u0631\u0641\u0639\u0629\u060c \u0641\u0645\u0627 \u0627\u0654\u0628\u0639\u062f \u0647\u0630\u0627 \u0639\u0646 \u0627\u0644\u0644\u0647 \u0648\u0639\u0646 \u0637\u0631\u064a\u0642\u0647\u060c \u0639\u0644\u0645\u0647 \u062d\u062c\u0629 \u0639\u0644\u064a\u0647.", "cuts": [[917, 917], [901, 901], [890, 890], [868, 868], [852, 852], [836, 836], [820, 820], [799, 804], [793, 793], [772, 772], [756, 756], [740, 745], [734, 734], [724, 729], [718, 718], [708, 708], [686, 691], [665, 670], [649, 654], [633, 633], [611, 611], [595, 600], [584, 584], [557, 557], [536, 536], [525, 531], [520, 520], [504, 504], [493, 499], [477, 482], [466, 472], [445, 445], [418, 423], [391, 397], [375, 375], [359, 359], [343, 343], [327, 327], [311, 311], [295, 295], [273, 279], [263, 263], [247, 247], [225, 225], [209, 209], [188, 193], [166, 166], [139, 139], [118, 118], [97, 102], [86, 86], [64, 70], [54, 54], [43, 43], [21, 27]], "confidences": [0.9995940327644348, 0.9446550607681274, 0.9981995820999146, 0.9999864101409912, 0.6075229644775391, 0.99992835521698, 0.9997560381889343, 0.9999634027481079, 0.9998078942298889, 0.9999945163726807, 0.9999508857727051, 0.9999924898147583, 0.9999949932098389, 0.9999926090240479, 0.9998032450675964, 0.9999107122421265, 0.9999817609786987, 0.9998050332069397, 0.9999833106994629, 0.9495548605918884, 0.9993699193000793, 0.9999070167541504, 0.9915083646774292, 0.999798595905304, 0.9999779462814331, 0.9999381303787231, 0.9971952438354492, 0.9972888231277466, 0.9999881982803345, 0.9999971389770508, 0.9995827078819275, 0.9999994039535522, 0.999994158744812, 0.9999692440032959, 0.9996156692504883, 0.5591697096824646, 0.9999910593032837, 0.9997571110725403, 0.8518497347831726, 0.9999833106994629, 0.9999939203262329, 0.9998816251754761, 0.9999935626983643, 0.9927089214324951, 0.9999922513961792, 0.996820330619812, 0.9999880790710449, 0.9995105266571045, 0.9999866485595703, 0.9999912977218628, 0.9999923706054688, 0.9999964237213135, 0.9993194341659546, 0.999998927116394, 0.9977816939353943], "line": {"boundary": [[547, 549], [551, 536], [600, 508], [629, 526], [649, 510], [680, 530], [703, 526], [723, 534], [773, 512], [814, 534], [853, 514], [883, 530], [908, 510], [933, 536], [945, 524], [1013, 532], [1035, 510], [1097, 534], [1165, 514], [1200, 537], [1214, 524], [1231, 532], [1265, 506], [1302, 530], [1321, 518], [1339, 534], [1358, 518], [1382, 530], [1391, 520], [1415, 528], [1424, 518], [1448, 516], [1465, 534], [1471, 559], [1417, 596], [1389, 575], [1337, 567], [1319, 575], [1274, 567], [1245, 582], [1233, 573], [1146, 573], [1128, 563], [1093, 586], [1076, 586], [1060, 571], [1021, 567], [998, 580], [974, 569], [957, 584], [939, 584], [918, 567], [888, 584], [814, 561], [803, 569], [742, 569], [725, 559], [666, 575], [635, 559], [592, 578], [549, 563]], "baseline": [[549, 551], [582, 557], [807, 555], [966, 565], [1473, 561]], "id": "line_4", "type": "baselines"}}, {"prediction": "\u0648\u0645\u062a\u0649 \u0631\u0627\u0654\u064a\u062a\u0645 \u0627\u0644\u0639\u0627\u0644\u0645 \u0642\u0644\u064a\u0644 \u0627\u0644\u0648\u0631\u0639 \u0641\u064a \u0643\u0644\u0627\u0645\u0647 \u060c \u064a\u062a\u0643\u0644\u0645 \u0645\u062c\u0627\u0632\u0641\u0629\u060c \u0648\u064a\u0643\u0630\u0628 \u0627\u0654\u062d\u064a\u0627\u0646\u0627\u060c", "cuts": [[1223, 1223], [1201, 1201], [1190, 1190], [1173, 1173], [1129, 1140], [1118, 1118], [1101, 1107], [1096, 1096], [1090, 1090], [1079, 1079], [1062, 1062], [1029, 1040], [1024, 1024], [1013, 1018], [996, 996], [979, 979], [968, 968], [946, 952], [919, 924], [908, 908], [891, 891], [880, 880], [863, 869], [830, 836], [819, 825], [808, 813], [797, 802], [775, 775], [747, 747], [714, 719], [703, 703], [692, 692], [647, 659], [636, 636], [614, 614], [603, 609], [587, 587], [570, 570], [559, 559], [553, 553], [526, 531], [515, 515], [504, 504], [481, 481], [465, 465], [443, 448], [415, 421], [404, 404], [376, 376], [354, 360], [343, 343], [326, 326], [310, 310], [293, 293], [266, 271], [255, 255], [238, 238], [216, 216], [199, 199], [160, 166], [122, 127], [116, 116], [105, 111], [89, 89], [72, 72], [61, 61], [50, 50], [39, 39], [28, 28]], "confidences": [0.9989548921585083, 0.9999619722366333, 0.9992412328720093, 0.9541407823562622, 0.9999735355377197, 0.9940637946128845, 0.999988317489624, 0.9999865293502808, 0.9999904632568359, 0.550645649433136, 0.9999978542327881, 0.9999892711639404, 0.9996963739395142, 0.9999991655349731, 0.5165660977363586, 0.999988317489624, 0.9995940327644348, 0.9999626874923706, 0.9998881816864014, 0.9940359592437744, 0.9996926784515381, 0.9999793767929077, 0.9998898506164551, 0.9998297691345215, 0.9897773861885071, 0.9994788765907288, 0.9995355606079102, 0.9969993829727173, 0.9985607266426086, 0.9999980926513672, 0.9996448755264282, 0.9874195456504822, 0.9999774694442749, 0.9867774844169617, 0.9744981527328491, 0.9999960660934448, 0.9999808073043823, 0.9993176460266113, 0.9999256134033203, 0.9999924898147583, 0.9999164342880249, 0.9999569654464722, 0.9999525547027588, 0.9997047781944275, 0.9999884366989136, 0.9999561309814453, 0.9999027252197266, 0.999967098236084, 0.9966025352478027, 0.9999691247940063, 0.9973816275596619, 0.9003818035125732, 0.9999942779541016, 0.9996612071990967, 0.9999988079071045, 0.9940271377563477, 0.9999754428863525, 0.9999979734420776, 0.9999998807907104, 0.9994766116142273, 0.9999978542327881, 0.9999990463256836, 0.9999949932098389, 0.9999971389770508, 0.8546275496482849, 0.9999696016311646, 0.9999052286148071, 0.9918268918991089, 0.5608442425727844], "line": {"boundary": [[161, 631], [163, 592], [185, 573], [230, 604], [257, 580], [309, 610], [341, 586], [380, 584], [423, 615], [456, 588], [508, 588], [524, 604], [559, 604], [575, 619], [612, 586], [649, 586], [682, 619], [697, 606], [729, 606], [742, 594], [793, 592], [822, 619], [853, 592], [877, 612], [896, 600], [927, 610], [949, 590], [962, 590], [990, 613], [1013, 592], [1023, 598], [1039, 588], [1060, 592], [1083, 613], [1113, 588], [1140, 602], [1163, 588], [1196, 615], [1251, 582], [1294, 621], [1309, 619], [1327, 602], [1360, 612], [1378, 608], [1389, 619], [1395, 647], [1366, 660], [1341, 649], [1321, 662], [1302, 662], [1282, 647], [1270, 658], [1226, 652], [1200, 670], [1175, 647], [1120, 645], [1087, 668], [1062, 645], [1009, 666], [970, 645], [894, 672], [867, 649], [832, 670], [799, 643], [748, 651], [688, 641], [670, 656], [647, 645], [615, 645], [586, 666], [561, 641], [483, 654], [426, 633], [397, 654], [331, 643], [311, 656], [280, 631], [228, 654], [165, 637]], "baseline": [[163, 633], [651, 633], [674, 637], [729, 637], [818, 643], [857, 641], [890, 647], [912, 647], [931, 652], [968, 643], [1011, 641], [1245, 641], [1300, 647], [1345, 645], [1397, 649]], "id": "line_5", "type": "baselines"}}, {"prediction": "\u0648\u064a\u0633\u062a\u0639\u0645\u0644 \u0627\u0644\u0647\u0632\u0644 \u0648\u0627\u0644\u0644\u0639\u0628\u060c \u0648\u064a\u0630\u0643\u0631 \u0627\u0644\u0645\u0631\u062f\u0627\u0646\u060c \u0648\u064a\u0645\u064a\u0644 \u0627\u0655\u0644\u064a\u0647\u0645\u060c \u0627\u0654\u0648 \u0631\u0627\u0654\u064a\u062a\u0645\u0648\u0647 \u0642\u0644\u064a\u0644 \u0627\u0644\u0648\u0631\u0639 \u0641\u064a", "cuts": [[1298, 1298], [1283, 1283], [1267, 1267], [1246, 1246], [1229, 1229], [1208, 1208], [1187, 1192], [1155, 1160], [1149, 1149], [1139, 1139], [1117, 1123], [1107, 1107], [1085, 1091], [1053, 1058], [1042, 1042], [1026, 1026], [1016, 1016], [1000, 1000], [984, 984], [952, 957], [925, 925], [903, 909], [893, 893], [877, 877], [861, 861], [839, 839], [818, 818], [797, 802], [786, 791], [775, 780], [759, 759], [738, 743], [722, 722], [706, 711], [695, 695], [668, 668], [647, 658], [641, 641], [620, 620], [604, 604], [588, 588], [572, 577], [545, 545], [535, 540], [524, 529], [519, 519], [508, 508], [492, 492], [470, 470], [449, 454], [433, 438], [428, 428], [417, 422], [412, 412], [385, 390], [369, 374], [353, 358], [347, 347], [342, 342], [331, 331], [315, 315], [299, 299], [278, 278], [257, 262], [246, 246], [235, 235], [219, 219], [203, 208], [176, 182], [166, 171], [155, 160], [144, 144], [123, 123], [96, 96], [70, 75], [59, 59], [43, 48]], "confidences": [0.9960930943489075, 0.9970471262931824, 0.9999514818191528, 0.9999713897705078, 0.9975488781929016, 0.9999634027481079, 0.9999896287918091, 0.9999924898147583, 0.9999784231185913, 0.9999960660934448, 0.9997754693031311, 0.9999520778656006, 0.9999797344207764, 0.9999464750289917, 0.999251663684845, 0.9999938011169434, 0.9999744892120361, 0.9904490113258362, 0.6805958151817322, 0.9993933439254761, 0.8523104190826416, 0.9999516010284424, 0.9954115748405457, 0.9966720342636108, 0.9986212253570557, 0.9991599321365356, 0.9994064569473267, 0.9998964071273804, 0.999936580657959, 0.9998494386672974, 0.9968574047088623, 0.9996702671051025, 0.999824583530426, 0.9998010993003845, 0.9999998807907104, 0.9999876022338867, 0.9999998807907104, 0.9999998807907104, 0.9999731779098511, 0.9999935626983643, 0.9999995231628418, 0.9998869895935059, 0.9999819993972778, 0.9999923706054688, 0.9999994039535522, 0.9997376799583435, 0.9999179840087891, 0.999994158744812, 0.9999123811721802, 0.9999874830245972, 1.0, 0.9014513492584229, 0.9999948740005493, 0.9999997615814209, 0.9999998807907104, 0.9998629093170166, 0.9677855372428894, 0.9999980926513672, 0.9946457147598267, 0.9999970197677612, 0.972520649433136, 0.999996542930603, 0.9999895095825195, 0.9999986886978149, 0.9621902108192444, 0.9999395608901978, 0.9999432563781738, 0.9999014139175415, 0.9999983310699463, 0.999998927116394, 0.999935507774353, 0.9999979734420776, 0.9999970197677612, 0.9999983310699463, 0.9999921321868896, 0.9999868869781494, 0.9999967813491821], "line": {"boundary": [[155, 727], [159, 701], [198, 666], [222, 680], [239, 672], [270, 682], [300, 660], [327, 682], [346, 664], [391, 664], [413, 682], [434, 686], [471, 676], [493, 656], [530, 684], [567, 656], [592, 680], [615, 688], [656, 664], [674, 666], [693, 684], [717, 668], [736, 686], [785, 682], [795, 690], [822, 670], [851, 668], [886, 690], [916, 666], [935, 670], [951, 686], [968, 672], [1005, 666], [1027, 686], [1052, 691], [1060, 684], [1103, 691], [1136, 666], [1169, 670], [1194, 690], [1220, 668], [1255, 682], [1280, 666], [1306, 686], [1325, 670], [1352, 690], [1376, 680], [1403, 691], [1446, 686], [1456, 719], [1442, 736], [1366, 725], [1345, 727], [1325, 742], [1311, 742], [1290, 725], [1233, 738], [1198, 723], [1177, 736], [1155, 725], [1120, 723], [1087, 736], [1056, 719], [1029, 734], [980, 723], [962, 736], [947, 736], [931, 723], [914, 723], [869, 736], [853, 723], [824, 727], [797, 719], [779, 732], [742, 725], [703, 740], [684, 728], [623, 728], [608, 742], [578, 719], [547, 732], [528, 725], [481, 732], [469, 723], [436, 732], [407, 717], [348, 736], [304, 721], [245, 744], [216, 727], [179, 736], [161, 727]], "baseline": [[157, 728], [187, 727], [270, 730], [313, 721], [403, 719], [460, 713], [526, 721], [900, 719], [1457, 721]], "id": "line_6", "type": "baselines"}}, {"prediction": "\u0627\u0644\u0645\u0627\u0654\u0643\u0644 \u0648\u0627\u0644\u0645\u0634\u0631\u0628\u060c \u0648\u0627\u0644\u0645\u062f\u062e\u0644 \u0648\u0627\u0644\u0645\u062e\u0631\u062c\u060c \u0644\u0627 \u064a\u0628\u0627\u0644\u064a \u0645\u0627 \u0627\u0654\u0643\u0644 \u062d\u0644\u0627\u0644\u0627 \u0643\u0627\u0646 \u0627\u0654\u0648 \u062d\u0631\u0627\u0645\u0627\u060c", "cuts": [[1298, 1304], [1291, 1291], [1273, 1273], [1254, 1260], [1248, 1248], [1242, 1242], [1217, 1223], [1180, 1192], [1173, 1173], [1155, 1155], [1142, 1142], [1124, 1124], [1105, 1105], [1080, 1080], [1049, 1049], [1018, 1018], [993, 1000], [987, 987], [969, 969], [956, 956], [937, 937], [919, 919], [888, 888], [869, 869], [826, 838], [820, 820], [795, 801], [788, 788], [770, 770], [739, 739], [720, 720], [695, 695], [671, 671], [646, 658], [633, 639], [621, 627], [596, 608], [590, 590], [577, 577], [565, 565], [553, 553], [540, 540], [503, 509], [490, 490], [472, 478], [453, 459], [441, 447], [435, 435], [428, 428], [404, 410], [366, 379], [348, 348], [329, 329], [310, 323], [298, 298], [286, 292], [255, 267], [248, 248], [224, 230], [211, 211], [180, 186], [174, 174], [168, 168], [155, 155], [124, 130], [106, 106], [87, 87], [68, 68], [56, 56], [37, 43], [25, 25]], "confidences": [0.9999150037765503, 0.9998385906219482, 0.999996542930603, 0.9999994039535522, 0.9999864101409912, 0.9999818801879883, 0.9999929666519165, 0.999998927116394, 0.9999581575393677, 0.9999958276748657, 0.9999880790710449, 0.9997920393943787, 0.9999971389770508, 0.9999898672103882, 0.9999960660934448, 0.9710601568222046, 0.996277391910553, 0.9998601675033569, 0.922956645488739, 0.9978814721107483, 0.999930739402771, 0.9997755885124207, 0.9413175582885742, 0.9998894929885864, 0.9993183612823486, 0.999767005443573, 0.9998904466629028, 0.6034071445465088, 0.9915944933891296, 0.999853253364563, 0.9953317046165466, 0.9986577033996582, 0.9640184640884399, 0.9999998807907104, 0.9999990463256836, 0.9999948740005493, 0.9999983310699463, 0.9997009038925171, 0.9999697208404541, 0.9999998807907104, 0.9997711777687073, 0.9742012023925781, 0.9999996423721313, 0.9999728202819824, 0.9999784231185913, 0.9999963045120239, 0.9999946355819702, 0.9767754077911377, 0.9991446733474731, 0.9999916553497314, 0.9999847412109375, 0.9995253086090088, 0.9999663829803467, 0.9999977350234985, 0.9770731925964355, 0.9999951124191284, 0.9999915361404419, 0.9999960660934448, 0.9701045751571655, 0.9999648332595825, 0.9999688863754272, 0.9998500347137451, 0.9999626874923706, 0.9992308616638184, 0.9999960660934448, 0.9513243436813354, 0.9999858140945435, 0.9998613595962524, 0.9998170733451843, 0.9996731281280518, 0.9003341794013977], "line": {"boundary": [[159, 783], [163, 748], [191, 732], [218, 740], [237, 758], [274, 766], [313, 730], [341, 750], [401, 744], [417, 730], [432, 730], [458, 746], [475, 742], [522, 769], [553, 742], [567, 746], [588, 732], [606, 748], [621, 742], [660, 775], [697, 742], [738, 762], [758, 744], [781, 740], [808, 760], [859, 766], [879, 748], [906, 764], [929, 742], [941, 742], [980, 771], [1013, 746], [1025, 756], [1068, 754], [1076, 762], [1103, 744], [1146, 773], [1161, 762], [1191, 771], [1212, 762], [1224, 769], [1243, 752], [1265, 764], [1292, 746], [1335, 775], [1362, 750], [1374, 754], [1401, 738], [1419, 754], [1430, 746], [1446, 750], [1465, 767], [1471, 793], [1448, 805], [1389, 803], [1360, 822], [1345, 820], [1329, 805], [1311, 816], [1288, 805], [1189, 816], [1152, 795], [1124, 814], [1101, 803], [1035, 799], [1007, 820], [994, 820], [974, 803], [947, 810], [935, 801], [885, 799], [857, 822], [834, 822], [797, 791], [779, 803], [758, 791], [738, 808], [721, 810], [707, 801], [676, 822], [643, 795], [617, 799], [606, 789], [569, 799], [551, 814], [534, 814], [510, 793], [460, 803], [403, 789], [389, 799], [350, 803], [329, 789], [294, 808], [265, 791], [222, 810], [204, 797], [171, 797], [163, 789]], "baseline": [[161, 785], [216, 791], [935, 789], [959, 795], [1472, 795]], "id": "line_7", "type": "baselines"}}, {"prediction": "\u0641\u0627\u062a\u0647\u0645\u0648\u0647 \u0639\u0644\u0649 \u0639\u0644\u0645\u0647 \u0648\u0639\u0644\u0649 \u062f\u064a\u0646\u0647\u060c \u0648\u0644\u0627 \u062a\u0642\u0644\u062f\u0648\u0647 \u0627\u0654\u0645\u0648\u0631\u0643\u0645\u060c \u0648\u0627\u062d\u0630\u0631\u0648\u0647 \u0627\u0654\u0646 \u064a\u0633\u0644\u0628\u0643\u0645 \u062f\u064a\u0646\u0643\u0645\u060c", "cuts": [[1304, 1304], [1293, 1293], [1283, 1283], [1266, 1266], [1245, 1245], [1228, 1228], [1207, 1207], [1185, 1191], [1169, 1169], [1147, 1147], [1131, 1131], [1099, 1104], [1082, 1082], [1066, 1066], [1044, 1044], [1028, 1028], [1001, 1012], [996, 996], [969, 969], [947, 947], [936, 936], [898, 904], [887, 887], [871, 871], [860, 860], [850, 850], [828, 828], [806, 812], [795, 801], [774, 779], [763, 768], [741, 747], [731, 731], [720, 720], [703, 703], [687, 687], [666, 666], [644, 644], [622, 628], [617, 617], [606, 612], [601, 601], [584, 584], [563, 563], [541, 541], [514, 514], [498, 498], [476, 482], [465, 465], [449, 449], [422, 422], [406, 406], [384, 384], [363, 363], [341, 341], [325, 330], [314, 319], [308, 308], [298, 298], [265, 276], [260, 260], [244, 244], [216, 216], [206, 206], [184, 184], [157, 162], [135, 141], [124, 124], [108, 108], [97, 97], [76, 76], [54, 54], [32, 32]], "confidences": [0.9997382760047913, 0.9998076558113098, 0.9998169541358948, 0.9999723434448242, 0.9999963045120239, 0.9998815059661865, 0.9978761672973633, 0.9999692440032959, 0.9999940395355225, 0.9997928738594055, 0.9998121857643127, 0.9998834133148193, 0.9999972581863403, 0.9986358284950256, 0.9999672174453735, 0.9999685287475586, 0.9999872446060181, 0.9996137022972107, 0.9999386072158813, 0.9998291730880737, 0.9996570348739624, 0.9997431635856628, 0.9989522695541382, 0.9978705644607544, 0.6706600189208984, 0.727662205696106, 0.9994146823883057, 0.9998109936714172, 0.9988961219787598, 0.9999992847442627, 0.9999957084655762, 0.9998549222946167, 0.7824696898460388, 0.9987309575080872, 0.9999728202819824, 0.9999747276306152, 0.9984544515609741, 0.9999949932098389, 0.9999949932098389, 0.9999567270278931, 0.9999990463256836, 0.9999997615814209, 1.0, 0.999970555305481, 0.9995998740196228, 0.9863488674163818, 0.9999908208847046, 0.9998534917831421, 0.989995002746582, 0.999998927116394, 0.9999957084655762, 0.9997010827064514, 0.9999995231628418, 0.9993435740470886, 0.9999997615814209, 0.9204366207122803, 0.9999145269393921, 0.9971621036529541, 0.9998090863227844, 0.9999971389770508, 0.9999977350234985, 0.999993085861206, 0.999996542930603, 0.9999635219573975, 0.9999977350234985, 0.9999561309814453, 0.9999858140945435, 0.9998942613601685, 0.9999914169311523, 0.9876537919044495, 0.9992417097091675, 0.9999997615814209, 0.9282093048095703], "line": {"boundary": [[152, 853], [171, 834], [189, 840], [228, 812], [284, 845], [329, 816], [413, 834], [446, 810], [489, 838], [516, 840], [545, 818], [563, 834], [588, 822], [619, 843], [633, 834], [649, 842], [666, 826], [688, 822], [713, 842], [754, 812], [789, 840], [832, 822], [881, 830], [920, 820], [951, 845], [962, 836], [1001, 832], [1027, 834], [1046, 851], [1081, 822], [1146, 845], [1163, 834], [1179, 840], [1204, 822], [1247, 853], [1282, 822], [1323, 847], [1335, 840], [1391, 845], [1409, 832], [1440, 828], [1462, 845], [1467, 869], [1401, 894], [1382, 881], [1348, 894], [1321, 871], [1269, 894], [1253, 894], [1226, 875], [1183, 881], [1152, 873], [1128, 890], [1095, 879], [1056, 894], [1033, 877], [1003, 888], [955, 871], [935, 888], [922, 888], [888, 867], [869, 879], [812, 879], [795, 888], [764, 869], [715, 890], [674, 877], [645, 898], [619, 875], [600, 888], [571, 871], [493, 886], [465, 869], [434, 881], [415, 875], [401, 884], [372, 877], [356, 886], [323, 875], [296, 896], [267, 875], [251, 884], [214, 875], [187, 896], [153, 867]], "baseline": [[153, 855], [228, 869], [1237, 867], [1269, 871], [1290, 867], [1309, 871], [1469, 871]], "id": "line_8", "type": "baselines"}}, {"prediction": "\u0628\u062a\u0647\u0648\u064a\u0646\u0647 \u0644\u0644\u0627\u0654\u0633\u064a\u0627\u0621 \u0627\u0644\u0635\u063a\u064a\u0631\u0629 \u0645\u0646 \u0627\u0644\u062d\u0631\u0627\u0645 \u0648\u0627\u0644\u0634\u0628\u0647\u0627\u062a\u060c \u064a\u0633\u0631\u0642 \u0628\u0630\u0644\u0643 \u0639\u0642\u0648\u0644\u0643\u0645\u060c \u0641\u064a\u0633\u062a\u062f\u0631\u062c\u0643\u0645", "cuts": [[1297, 1297], [1286, 1286], [1275, 1275], [1253, 1253], [1237, 1237], [1220, 1226], [1209, 1209], [1188, 1193], [1182, 1182], [1160, 1166], [1149, 1155], [1138, 1144], [1133, 1133], [1111, 1111], [1095, 1095], [1084, 1084], [1062, 1067], [1056, 1056], [1045, 1045], [1023, 1023], [991, 991], [974, 974], [958, 963], [941, 941], [919, 925], [914, 914], [887, 887], [859, 870], [854, 854], [843, 843], [815, 815], [799, 799], [783, 783], [766, 766], [744, 750], [739, 739], [717, 722], [706, 711], [690, 690], [668, 668], [651, 651], [629, 635], [607, 607], [580, 580], [558, 569], [553, 553], [536, 536], [509, 514], [493, 493], [454, 465], [449, 449], [438, 438], [416, 416], [405, 405], [356, 361], [345, 345], [328, 328], [306, 306], [290, 290], [268, 268], [246, 246], [224, 224], [203, 213], [197, 197], [186, 186], [164, 164], [148, 148], [131, 131], [109, 109], [82, 82], [55, 55], [27, 33]], "confidences": [0.9998189806938171, 0.9999316930770874, 0.9999616146087646, 0.9999963045120239, 0.9904739260673523, 0.9999723434448242, 0.9971580505371094, 0.9988645315170288, 0.9999966621398926, 0.9999974966049194, 0.9999973773956299, 0.9999791383743286, 0.9999858140945435, 0.9999887943267822, 0.5477295517921448, 0.9999678134918213, 0.9999643564224243, 0.8171812295913696, 0.9827367067337036, 0.9935495257377625, 0.9999936819076538, 0.999975323677063, 0.9999910593032837, 0.998406708240509, 0.9999222755432129, 0.9998999834060669, 0.9343510866165161, 0.9997228980064392, 0.7628433108329773, 0.6818570494651794, 0.950019121170044, 0.6418173313140869, 0.9943951368331909, 0.9706724882125854, 0.9999768733978271, 0.9994531273841858, 0.9995731711387634, 0.9997699856758118, 0.9988842606544495, 0.9997255206108093, 0.9999997615814209, 0.9999980926513672, 0.999735414981842, 0.9235820770263672, 0.9999998807907104, 0.9999927282333374, 0.9976077079772949, 0.9999990463256836, 0.8485846519470215, 0.9999995231628418, 0.9999078512191772, 0.9999904632568359, 0.999980092048645, 0.9999996423721313, 0.9956209063529968, 0.9999990463256836, 0.9995309114456177, 0.9999940395355225, 0.9999079704284668, 1.0, 0.9180242419242859, 0.9995797276496887, 0.9999831914901733, 0.9998835325241089, 0.9994398951530457, 0.988334059715271, 0.9999781847000122, 0.9999990463256836, 0.8295435309410095, 0.9995015859603882, 0.9999979734420776, 0.9999895095825195], "line": {"boundary": [[159, 947], [163, 923], [210, 894], [247, 920], [276, 906], [317, 920], [337, 902], [362, 916], [389, 918], [430, 892], [456, 908], [479, 900], [510, 920], [549, 896], [586, 896], [610, 918], [643, 898], [670, 921], [762, 912], [775, 900], [812, 921], [853, 898], [898, 925], [923, 902], [947, 918], [990, 898], [1019, 920], [1066, 920], [1087, 906], [1111, 921], [1136, 902], [1155, 920], [1183, 900], [1200, 902], [1218, 918], [1235, 902], [1259, 916], [1282, 896], [1298, 896], [1327, 900], [1347, 918], [1372, 912], [1391, 923], [1434, 912], [1473, 953], [1446, 970], [1428, 964], [1395, 972], [1343, 953], [1302, 962], [1276, 957], [1261, 968], [1216, 953], [1138, 957], [1099, 974], [1072, 953], [1037, 974], [1003, 957], [962, 957], [949, 970], [906, 980], [888, 964], [867, 968], [853, 957], [793, 968], [777, 957], [721, 953], [699, 966], [674, 957], [645, 968], [615, 957], [600, 966], [580, 955], [528, 957], [506, 945], [450, 968], [419, 953], [382, 976], [356, 953], [335, 966], [313, 957], [276, 955], [251, 966], [200, 955], [177, 976], [163, 974]], "baseline": [[161, 949], [241, 945], [664, 945], [705, 949], [729, 945], [822, 955], [923, 951], [1087, 951], [1107, 955], [1214, 945], [1362, 955], [1475, 954]], "id": "line_9", "type": "baselines"}}, {"prediction": "\u0645\u0646 \u062d\u064a\u062b \u0644\u0627 \u062a\u0639\u0644\u0645\u0648\u0646.", "cuts": [[343, 343], [316, 321], [294, 298], [276, 276], [258, 258], [230, 230], [199, 203], [185, 190], [172, 181], [158, 163], [149, 149], [136, 136], [118, 118], [95, 99], [77, 81], [54, 59], [32, 32]], "confidences": [0.9013516902923584, 0.9993886947631836, 0.9999945163726807, 0.9106606841087341, 0.9922044277191162, 0.9999985694885254, 0.999998927116394, 0.9999998807907104, 0.9999948740005493, 0.9999319314956665, 0.9999568462371826, 0.9999945163726807, 0.5355215072631836, 0.9999971389770508, 0.9999983310699463, 0.9999912977218628, 0.9786094427108765], "line": {"boundary": [[1109, 1025], [1146, 980], [1173, 997], [1189, 997], [1210, 976], [1231, 988], [1294, 976], [1309, 992], [1333, 984], [1348, 999], [1364, 992], [1395, 1007], [1409, 994], [1424, 1001], [1444, 997], [1473, 1027], [1454, 1029], [1411, 1056], [1380, 1031], [1347, 1046], [1300, 1029], [1274, 1036], [1263, 1025], [1241, 1036], [1191, 1036], [1171, 1050], [1118, 1025]], "baseline": [[1111, 1027], [1274, 1023], [1366, 1033], [1475, 1029]], "id": "line_10", "type": "baselines"}}, {"prediction": "\u0648\u0645\u062a\u0649 \u0631\u0627\u0654\u064a\u062a\u0645 \u0627\u0644\u0639\u0627\u0644\u0645 \u064a\u0642\u0628\u0644 \u0627\u0644\u0647\u062f\u064a\u0629 \u0645\u0646 \u0627\u0644\u0645\u0633\u062a\u0641\u062a\u064a \u0648\u064a\u0641\u062a\u064a\u0647 \u0639\u0644\u0649 \u063a\u0631\u0636\u0647\u060c \u0648\u064a\u062f\u062e\u0644 \u0641\u064a", "cuts": [[1225, 1225], [1201, 1207], [1189, 1189], [1172, 1172], [1136, 1148], [1130, 1130], [1112, 1118], [1106, 1106], [1100, 1100], [1088, 1088], [1064, 1070], [1041, 1047], [1029, 1035], [1023, 1023], [1011, 1011], [993, 993], [981, 981], [957, 963], [934, 940], [928, 928], [916, 916], [898, 898], [880, 886], [850, 856], [838, 844], [827, 833], [815, 815], [797, 797], [779, 779], [761, 761], [737, 743], [726, 731], [702, 702], [678, 684], [666, 672], [654, 660], [636, 642], [613, 618], [595, 595], [583, 583], [565, 565], [553, 553], [517, 523], [505, 505], [488, 488], [476, 476], [458, 458], [446, 446], [434, 434], [410, 416], [393, 393], [375, 375], [363, 363], [327, 333], [309, 309], [291, 291], [268, 268], [238, 238], [220, 220], [196, 202], [184, 184], [167, 167], [155, 155], [125, 131], [101, 107], [59, 71], [54, 54], [36, 42]], "confidences": [0.9998977184295654, 0.9992066025733948, 0.9999544620513916, 0.9999667406082153, 0.9999969005584717, 0.9999951124191284, 0.9999479055404663, 0.8893346190452576, 0.9999771118164062, 0.9999749660491943, 0.9999734163284302, 0.9999407529830933, 0.9999978542327881, 0.888961911201477, 0.999985933303833, 0.9997301697731018, 0.9997461438179016, 0.9999942779541016, 0.9999889135360718, 0.9999947547912598, 0.7681607007980347, 0.9985297918319702, 0.9992446899414062, 0.9999771118164062, 0.9999252557754517, 0.9995318651199341, 0.9955322742462158, 0.9999263286590576, 0.9855678081512451, 0.8572127223014832, 0.9958655834197998, 0.9997792840003967, 0.8732478022575378, 0.9998902082443237, 0.9997214674949646, 0.9999871253967285, 0.999970555305481, 0.9999971389770508, 0.9999786615371704, 0.9999481439590454, 0.9997740387916565, 0.8626158833503723, 0.9999806880950928, 0.9998955726623535, 0.9999974966049194, 0.9999513626098633, 0.9972359538078308, 0.9995180368423462, 0.9999905824661255, 1.0, 0.9999990463256836, 0.9999991655349731, 0.9999984502792358, 0.9999990463256836, 0.9999250173568726, 0.9994828701019287, 0.9996166229248047, 0.995541512966156, 0.9999992847442627, 0.999984860420227, 0.9904344081878662, 0.9992062449455261, 0.9999986886978149, 0.9761358499526978, 0.999893069267273, 0.9999963045120239, 0.9997863173484802, 0.9999911785125732], "line": {"boundary": [[159, 1103], [163, 1081], [196, 1052], [224, 1072], [249, 1050], [348, 1073], [382, 1062], [393, 1070], [409, 1056], [432, 1068], [458, 1052], [487, 1079], [518, 1050], [561, 1075], [573, 1064], [623, 1052], [641, 1070], [684, 1081], [727, 1052], [760, 1073], [773, 1073], [799, 1050], [834, 1072], [849, 1066], [859, 1073], [883, 1070], [908, 1052], [927, 1066], [955, 1066], [980, 1050], [1007, 1072], [1027, 1052], [1040, 1060], [1056, 1056], [1089, 1083], [1120, 1054], [1150, 1066], [1173, 1054], [1204, 1079], [1245, 1048], [1257, 1048], [1296, 1085], [1321, 1068], [1370, 1072], [1395, 1105], [1364, 1126], [1339, 1114], [1317, 1128], [1298, 1128], [1282, 1114], [1269, 1124], [1228, 1118], [1210, 1134], [1179, 1111], [1126, 1111], [1093, 1134], [1079, 1120], [1052, 1114], [1019, 1128], [990, 1109], [953, 1122], [939, 1111], [912, 1120], [892, 1101], [853, 1124], [838, 1124], [818, 1107], [721, 1109], [692, 1134], [662, 1111], [643, 1120], [612, 1109], [584, 1120], [565, 1101], [502, 1124], [485, 1122], [465, 1103], [428, 1122], [411, 1109], [360, 1107], [350, 1099], [325, 1118], [276, 1103], [239, 1126], [214, 1109], [177, 1130], [163, 1116]], "baseline": [[161, 1105], [214, 1111], [276, 1105], [296, 1099], [421, 1103], [906, 1101], [1005, 1111], [1093, 1111], [1113, 1107], [1165, 1105], [1206, 1111], [1397, 1107]], "id": "line_11", "type": "baselines"}}, {"prediction": "\u0627\u0644\u062a\u0627\u0654\u0648\u064a\u0644\u0627\u062a \u0648\u0627\u0644\u0634\u0628\u0647\u0627\u062a \u060c \u0643\u0645\u0633\u0627\u0654\u0644\u0629 \u0627\u0644\u0627\u0633\u062a\u062d\u0644\u0627\u0644\u060c \u0648\u0645\u0633\u0627\u0654\u0644\u0629 \u0627\u0644\u0631\u0628\u0627 \u0648\u0627\u0644\u0645\u0639\u0627\u0645\u0644\u0629\u060c \u0648\u0644\u0627 \u062a\u062c\u062f\u0648\u0646\u0647", "cuts": [[1293, 1298], [1284, 1289], [1274, 1274], [1260, 1265], [1255, 1255], [1245, 1245], [1231, 1231], [1212, 1216], [1202, 1207], [1168, 1168], [1130, 1140], [1120, 1120], [1101, 1106], [1091, 1096], [1077, 1077], [1053, 1053], [1039, 1039], [1019, 1024], [995, 995], [976, 976], [971, 971], [942, 947], [928, 928], [904, 904], [880, 885], [861, 865], [856, 856], [851, 851], [837, 837], [808, 813], [798, 803], [784, 789], [774, 779], [755, 755], [731, 731], [702, 702], [683, 688], [673, 678], [659, 659], [630, 630], [601, 611], [591, 591], [572, 572], [548, 553], [529, 529], [519, 524], [514, 514], [505, 505], [476, 481], [466, 466], [457, 457], [442, 442], [428, 428], [409, 414], [389, 394], [380, 380], [361, 361], [351, 351], [332, 332], [308, 308], [293, 298], [279, 284], [264, 264], [250, 250], [231, 236], [207, 212], [197, 197], [173, 178], [159, 168], [130, 139], [125, 125], [101, 101], [82, 82], [58, 58], [38, 38], [24, 24]], "confidences": [0.9996144771575928, 0.9999929666519165, 0.9999830722808838, 0.9999926090240479, 0.999995231628418, 0.9467358589172363, 0.999972939491272, 0.9995086193084717, 0.9998672008514404, 0.9942428469657898, 0.9999955892562866, 0.9999592304229736, 0.9999781847000122, 0.999994158744812, 0.9999866485595703, 0.999920129776001, 0.9999884366989136, 0.9986990690231323, 0.9997000694274902, 0.9911819696426392, 0.978091299533844, 0.999427855014801, 0.9999485015869141, 0.7997534275054932, 0.9999580383300781, 0.999704897403717, 0.520932137966156, 0.9891839027404785, 0.9960983991622925, 0.999637246131897, 0.9975180625915527, 0.9990247488021851, 0.9999979734420776, 0.7142682075500488, 0.9256128668785095, 1.0, 0.9999996423721313, 0.9998838901519775, 0.9999998807907104, 0.9960355162620544, 0.9999982118606567, 0.999958872795105, 0.9999998807907104, 1.0, 0.9999998807907104, 0.999992847442627, 0.9999973773956299, 0.9999991655349731, 0.9975195527076721, 0.9820659756660461, 0.9999998807907104, 0.9999421834945679, 0.9999996423721313, 0.9999991655349731, 0.9999985694885254, 0.6958007216453552, 0.9832131266593933, 0.9999997615814209, 0.9999964237213135, 0.9855285286903381, 0.9999996423721313, 0.9993840456008911, 0.9999988079071045, 0.9999823570251465, 0.9999992847442627, 0.9999185800552368, 0.9999986886978149, 0.9999874830245972, 0.9999970197677612, 0.9999932050704956, 0.9994638562202454, 0.9987408518791199, 0.999816358089447, 0.9999561309814453, 0.9999673366546631, 0.9998775720596313], "line": {"boundary": [[159, 1165], [163, 1146], [185, 1132], [210, 1146], [224, 1136], [253, 1146], [267, 1134], [286, 1138], [315, 1126], [327, 1126], [360, 1155], [389, 1130], [405, 1128], [426, 1138], [442, 1128], [467, 1148], [502, 1128], [536, 1150], [559, 1130], [578, 1146], [598, 1128], [629, 1142], [676, 1122], [707, 1151], [746, 1148], [758, 1157], [799, 1130], [836, 1132], [861, 1150], [875, 1140], [892, 1148], [912, 1130], [949, 1132], [962, 1144], [1001, 1122], [1042, 1153], [1081, 1132], [1105, 1151], [1150, 1144], [1163, 1132], [1200, 1151], [1241, 1130], [1286, 1161], [1309, 1144], [1360, 1134], [1378, 1148], [1405, 1124], [1450, 1142], [1467, 1179], [1444, 1190], [1405, 1190], [1387, 1202], [1290, 1183], [1269, 1200], [1239, 1188], [1193, 1200], [1163, 1187], [1111, 1188], [1099, 1179], [1056, 1190], [984, 1188], [961, 1179], [931, 1190], [910, 1185], [799, 1192], [762, 1179], [736, 1198], [713, 1187], [656, 1188], [623, 1179], [588, 1200], [567, 1196], [547, 1179], [526, 1196], [499, 1187], [401, 1187], [366, 1177], [345, 1194], [329, 1194], [296, 1175], [253, 1192], [220, 1185], [191, 1194], [163, 1179]], "baseline": [[161, 1167], [191, 1173], [306, 1177], [469, 1177], [493, 1181], [1469, 1181]], "id": "line_12", "type": "baselines"}}, {"prediction": "\u0645\u062a\u0639\u0641\u0641\u0627 \u0641\u064a \u0645\u0639\u064a\u0634\u062a\u0647\u060c \u062a\u0631\u0648\u0646\u0647 \u0637\u0627\u0645\u0639\u0627 \u0641\u064a \u0627\u0654\u0645\u0648\u0627\u0644 \u0627\u0644\u0646\u0627\u0633\u060c \u064a\u062f\u0627\u062e\u0644 \u0627\u0644\u0642\u0636\u0627\u0629 \u0644\u064a\u0648\u0644\u0648\u0647 \u0627\u0644\u0648\u0644\u0627\u064a\u0627\u062a\u060c", "cuts": [[1294, 1294], [1276, 1276], [1264, 1264], [1246, 1246], [1228, 1228], [1210, 1216], [1192, 1198], [1186, 1186], [1168, 1168], [1131, 1137], [1125, 1125], [1101, 1101], [1089, 1089], [1071, 1071], [1047, 1047], [1035, 1035], [1017, 1017], [999, 1005], [987, 987], [975, 975], [957, 957], [939, 939], [921, 921], [897, 903], [879, 879], [861, 867], [849, 849], [831, 831], [812, 818], [794, 800], [788, 788], [770, 770], [740, 740], [728, 734], [722, 722], [710, 710], [698, 698], [680, 680], [668, 668], [638, 638], [626, 632], [614, 620], [602, 602], [590, 596], [572, 572], [536, 536], [512, 518], [506, 506], [487, 494], [469, 475], [451, 451], [433, 433], [397, 403], [391, 391], [379, 379], [367, 367], [343, 343], [313, 313], [301, 301], [277, 289], [271, 271], [259, 259], [241, 247], [229, 229], [211, 211], [193, 193], [175, 181], [163, 169], [150, 157], [138, 138], [114, 120], [102, 108], [90, 90], [72, 78], [48, 48], [24, 24]], "confidences": [0.9999475479125977, 0.9999927282333374, 0.999996542930603, 0.9999957084655762, 0.999872088432312, 0.9999810457229614, 0.9999687671661377, 0.9999939203262329, 0.9999991655349731, 0.9942613840103149, 0.9999487400054932, 0.9999334812164307, 0.9999005794525146, 0.9999839067459106, 0.9999810457229614, 0.989007830619812, 0.9996200799942017, 0.9999685287475586, 0.6469784379005432, 0.6665834188461304, 0.7252474427223206, 0.9857919216156006, 0.9997385144233704, 0.9999765157699585, 0.9963619112968445, 0.9994021654129028, 0.9998681545257568, 0.9810250401496887, 0.9838308095932007, 0.9998787641525269, 0.9988665580749512, 0.9999058246612549, 0.6534377336502075, 0.9997734427452087, 0.631395697593689, 0.9998962879180908, 0.9999980926513672, 0.9978647828102112, 0.9999958276748657, 0.9721218943595886, 0.9996869564056396, 0.9999868869781494, 0.9235882759094238, 0.9999985694885254, 0.9997712969779968, 0.826903223991394, 0.999829888343811, 0.9994933605194092, 0.9999945163726807, 0.9999911785125732, 0.9996364116668701, 0.9999428987503052, 0.9976553916931152, 0.9999971389770508, 0.71103435754776, 0.9999946355819702, 0.9999889135360718, 0.9995948672294617, 0.9999077320098877, 0.9999817609786987, 0.9998291730880737, 0.999971866607666, 0.9999986886978149, 0.9999973773956299, 0.9999977350234985, 0.9933046698570251, 0.9999994039535522, 0.9999998807907104, 0.9999985694885254, 0.9998321533203125, 0.9999990463256836, 0.9999988079071045, 0.9999668598175049, 0.9999896287918091, 0.9999967813491821, 0.9679267406463623], "line": {"boundary": [[159, 1249], [167, 1220], [245, 1204], [267, 1204], [282, 1216], [300, 1204], [331, 1224], [348, 1224], [370, 1204], [391, 1220], [411, 1204], [432, 1216], [460, 1208], [473, 1220], [530, 1206], [555, 1226], [577, 1208], [590, 1216], [656, 1210], [697, 1235], [732, 1210], [762, 1206], [789, 1224], [816, 1208], [840, 1224], [867, 1200], [906, 1227], [961, 1194], [992, 1222], [1023, 1210], [1050, 1233], [1076, 1216], [1109, 1231], [1128, 1216], [1154, 1229], [1214, 1216], [1233, 1231], [1272, 1229], [1286, 1243], [1350, 1198], [1362, 1198], [1409, 1227], [1430, 1224], [1477, 1257], [1458, 1257], [1430, 1272], [1356, 1270], [1345, 1263], [1309, 1292], [1272, 1266], [1222, 1280], [1212, 1270], [1146, 1261], [1124, 1280], [1109, 1282], [1081, 1278], [1048, 1257], [1029, 1268], [959, 1268], [947, 1259], [916, 1288], [904, 1288], [877, 1265], [824, 1278], [783, 1261], [729, 1263], [707, 1280], [688, 1280], [668, 1263], [643, 1274], [598, 1261], [563, 1282], [538, 1263], [477, 1266], [430, 1257], [409, 1274], [345, 1276], [319, 1257], [270, 1276], [257, 1265], [230, 1272], [214, 1261], [163, 1259]], "baseline": [[161, 1251], [272, 1255], [292, 1259], [1424, 1257], [1478, 1258]], "id": "line_13", "type": "baselines"}}, {"prediction": "\u0645\u0639 \u0634\u0631\u0647\u0647 \u0639\u0644\u0649 \u0627\u0644\u062f\u0646\u064a\u0627\u060c \u0648\u0642\u0644\u0629 \u0648\u0631\u0639\u0647 \u0648\u0645\u0628\u0627\u0644\u0627\u062a\u0647 \u0628\u0627\u0644\u062d\u0644\u0627\u0644 \u0648\u0627\u0644\u062d\u0631\u0627\u0645\u060c \u0641\u0627\u062a\u0647\u0645\u0648\u0647 \u0639\u0644\u0649 \u0639\u0644\u0645\u0647", "cuts": [[1287, 1287], [1265, 1265], [1232, 1237], [1221, 1221], [1193, 1199], [1172, 1172], [1155, 1155], [1128, 1133], [1111, 1111], [1095, 1095], [1078, 1078], [1046, 1051], [1035, 1040], [1024, 1024], [1007, 1013], [991, 991], [980, 980], [964, 969], [953, 953], [931, 936], [920, 920], [898, 898], [881, 887], [870, 870], [843, 849], [832, 832], [810, 816], [788, 788], [772, 772], [745, 750], [734, 734], [712, 712], [695, 695], [684, 684], [668, 673], [657, 662], [646, 646], [630, 630], [602, 613], [597, 597], [586, 586], [575, 575], [547, 547], [526, 531], [515, 520], [498, 498], [460, 471], [449, 454], [432, 438], [422, 427], [400, 400], [378, 383], [361, 361], [345, 345], [328, 328], [307, 312], [296, 296], [285, 285], [274, 274], [257, 257], [235, 235], [219, 219], [197, 197], [170, 175], [159, 159], [137, 137], [126, 126], [82, 93], [71, 71], [55, 55], [33, 38], [22, 22]], "confidences": [0.9999666213989258, 0.9999809265136719, 0.9999946355819702, 0.9999746084213257, 0.9999938011169434, 0.9999914169311523, 0.9090831279754639, 0.9998230338096619, 0.9976154565811157, 0.9993928670883179, 0.9999699592590332, 0.9991900324821472, 0.9999030828475952, 0.999919056892395, 0.9999741315841675, 0.983220100402832, 0.9999629259109497, 0.9999812841415405, 0.6795229315757751, 0.9999853372573853, 0.9986742734909058, 0.9999790191650391, 0.9995899796485901, 0.9987137317657471, 0.9991518259048462, 0.9978784322738647, 0.9999507665634155, 0.9689961075782776, 0.9987661838531494, 0.9999948740005493, 0.581307590007782, 0.9999948740005493, 0.9670306444168091, 0.9999184608459473, 0.9983538389205933, 0.9998610019683838, 0.9507318735122681, 0.9808312058448792, 0.9999997615814209, 0.9999678134918213, 0.9999990463256836, 0.9445680975914001, 0.9999923706054688, 0.9999840259552002, 0.9999967813491821, 0.9999991655349731, 0.9999967813491821, 0.9999933242797852, 0.9997896552085876, 0.9999817609786987, 0.9999405145645142, 0.9997538924217224, 0.9999948740005493, 0.9972209930419922, 0.9999998807907104, 0.9999997615814209, 0.9762755036354065, 0.9999904632568359, 0.9999934434890747, 1.0, 0.9999963045120239, 0.9913928508758545, 0.9357872009277344, 0.9999316930770874, 1.0, 0.9693567752838135, 0.9998525381088257, 0.9999986886978149, 0.9999988079071045, 0.9999994039535522, 0.9999954700469971, 0.9990108013153076], "line": {"boundary": [[167, 1327], [171, 1296], [189, 1300], [208, 1282], [255, 1313], [292, 1282], [335, 1307], [348, 1300], [403, 1305], [436, 1284], [473, 1303], [497, 1300], [512, 1286], [538, 1303], [555, 1302], [582, 1284], [621, 1309], [651, 1284], [686, 1288], [705, 1303], [731, 1286], [766, 1313], [803, 1286], [840, 1288], [859, 1305], [896, 1305], [904, 1313], [941, 1300], [998, 1307], [1017, 1290], [1033, 1288], [1058, 1290], [1091, 1313], [1116, 1290], [1161, 1298], [1177, 1288], [1218, 1313], [1251, 1288], [1290, 1311], [1302, 1302], [1339, 1303], [1376, 1280], [1407, 1307], [1446, 1307], [1463, 1335], [1430, 1370], [1405, 1368], [1380, 1344], [1347, 1360], [1323, 1360], [1288, 1335], [1233, 1362], [1216, 1362], [1196, 1346], [1148, 1348], [1126, 1358], [1095, 1339], [1068, 1358], [1007, 1339], [986, 1356], [953, 1356], [908, 1339], [886, 1356], [844, 1356], [832, 1344], [775, 1341], [744, 1356], [732, 1344], [637, 1346], [625, 1339], [598, 1354], [555, 1341], [536, 1356], [516, 1352], [504, 1362], [465, 1337], [454, 1344], [428, 1342], [419, 1352], [387, 1342], [366, 1356], [331, 1331], [276, 1356], [261, 1354], [241, 1337], [202, 1344], [169, 1339]], "baseline": [[169, 1329], [200, 1327], [249, 1333], [461, 1333], [500, 1337], [1335, 1335], [1378, 1337], [1397, 1341], [1465, 1337]], "id": "line_14", "type": "baselines"}}, {"prediction": "\u0648\u062f\u064a\u0646\u0647.", "cuts": [[103, 106], [84, 84], [68, 68], [53, 53], [42, 42], [27, 27]], "confidences": [0.9999996423721313, 0.9999984502792358, 0.9997429251670837, 0.9999673366546631, 0.99901282787323, 0.9717188477516174], "line": {"boundary": [[1343, 1411], [1350, 1391], [1387, 1374], [1444, 1383], [1483, 1415], [1462, 1415], [1432, 1438], [1345, 1418]], "baseline": [[1345, 1413], [1419, 1413], [1484, 1417]], "id": "line_15", "type": "baselines"}}, {"prediction": "\u0648\u0645\u062a\u0649 \u0631\u0627\u0654\u064a\u062a\u0645 \u0639\u0627\u0644\u0645\u0627 \u0641\u064a \u0639\u0642\u0644\u0647 \u0633\u062e\u0627\u0641\u0629\u060c \u0648\u0641\u064a \u0646\u0638\u0631\u0647 \u0642\u0635\u0648\u0631\u060c \u064a\u0636\u0639 \u0627\u0644\u0627\u0654\u0634\u064a\u0627\u0621 - \u063a\u0627\u0644\u0628\u0627- \u0641\u064a", "cuts": [[1207, 1207], [1188, 1188], [1169, 1176], [1157, 1157], [1126, 1132], [1120, 1120], [1101, 1101], [1095, 1095], [1089, 1089], [1076, 1076], [1057, 1057], [1033, 1045], [1026, 1026], [1008, 1008], [995, 995], [977, 977], [958, 964], [939, 945], [933, 933], [914, 921], [890, 896], [871, 871], [852, 852], [840, 840], [821, 821], [802, 809], [790, 790], [753, 753], [734, 740], [722, 722], [709, 709], [690, 690], [672, 678], [666, 666], [647, 647], [628, 628], [597, 603], [591, 591], [566, 566], [547, 554], [535, 535], [510, 516], [504, 504], [485, 485], [454, 454], [435, 435], [417, 417], [398, 404], [392, 392], [367, 373], [330, 330], [311, 317], [305, 305], [286, 292], [280, 280], [268, 274], [261, 261], [236, 236], [218, 224], [205, 212], [187, 193], [174, 174], [156, 162], [143, 143], [124, 124], [112, 112], [100, 100], [87, 93], [68, 68], [50, 56], [37, 37], [25, 25]], "confidences": [0.9859687089920044, 0.9289069175720215, 0.9999728202819824, 0.9997435212135315, 0.9999949932098389, 0.9999815225601196, 0.999997615814209, 0.9999803304672241, 0.9999959468841553, 0.7412486672401428, 0.9978557229042053, 0.9999803304672241, 0.9999420642852783, 0.9999202489852905, 0.999981164932251, 0.9999773502349854, 0.9999395608901978, 0.9999784231185913, 0.9947001934051514, 0.9998576641082764, 0.9994139671325684, 0.9998432397842407, 0.9999716281890869, 0.9998818635940552, 0.6902597546577454, 0.999955415725708, 0.9993599057197571, 0.9993149042129517, 0.9999468326568604, 0.9852787256240845, 0.9907258749008179, 0.9999005794525146, 0.997058629989624, 0.9781426191329956, 0.8489178419113159, 0.8708791732788086, 0.9999767541885376, 0.9941668510437012, 0.966301441192627, 0.9999921321868896, 0.9917047023773193, 0.9999977350234985, 0.999850869178772, 0.589336633682251, 0.9973306655883789, 0.9999990463256836, 0.9893065094947815, 0.999998927116394, 0.9999986886978149, 0.9999996423721313, 0.999987006187439, 0.9929701685905457, 0.9999936819076538, 0.9999984502792358, 0.9898472428321838, 0.9999828338623047, 0.9971639513969421, 0.965297281742096, 0.9999982118606567, 0.9999784231185913, 0.9949177503585815, 0.9999829530715942, 0.9999810457229614, 0.9888534545898438, 0.9037330150604248, 0.9999834299087524, 0.9911187291145325, 0.9999808073043823, 0.9999874830245972, 0.9999430179595947, 0.9984645843505859, 0.9996715784072876], "line": {"boundary": [[173, 1489], [177, 1456], [192, 1440], [214, 1452], [253, 1422], [269, 1436], [300, 1438], [321, 1456], [352, 1457], [376, 1440], [399, 1452], [430, 1430], [467, 1442], [485, 1459], [508, 1459], [524, 1444], [557, 1463], [567, 1456], [631, 1463], [658, 1442], [695, 1459], [727, 1438], [750, 1444], [771, 1463], [795, 1442], [834, 1461], [861, 1442], [896, 1442], [914, 1444], [933, 1463], [964, 1463], [988, 1442], [1000, 1442], [1039, 1456], [1054, 1471], [1113, 1428], [1140, 1448], [1155, 1442], [1187, 1456], [1200, 1469], [1257, 1434], [1296, 1471], [1321, 1454], [1370, 1459], [1393, 1496], [1360, 1512], [1337, 1500], [1313, 1516], [1284, 1506], [1231, 1506], [1216, 1524], [1183, 1500], [1130, 1502], [1107, 1495], [1077, 1522], [1060, 1520], [1039, 1498], [978, 1500], [964, 1493], [927, 1500], [838, 1493], [787, 1520], [775, 1520], [752, 1496], [697, 1512], [676, 1495], [625, 1502], [614, 1512], [578, 1508], [567, 1496], [547, 1508], [532, 1502], [508, 1522], [487, 1522], [461, 1498], [423, 1495], [387, 1506], [374, 1493], [319, 1483], [263, 1506], [235, 1487], [214, 1489], [187, 1516], [175, 1516]], "baseline": [[175, 1491], [370, 1483], [403, 1487], [483, 1489], [502, 1493], [1216, 1491], [1276, 1496], [1339, 1495], [1395, 1498]], "id": "line_16", "type": "baselines"}}, {"prediction": "\u063a\u064a\u0631 \u0645\u0648\u0627\u0636\u0639\u0647\u0627\u060c \u0641\u0627\u062a\u0647\u0645\u0648\u0647 \u0639\u0644\u0649 \u0627\u0633\u062a\u0646\u0628\u0627\u0637\u0647 \u0648\u0639\u0644\u0645\u0647 \u0648\u0631\u0627\u0654\u064a\u0647\u060c \u0648\u0644\u0627 \u062a\u0642\u0644\u062f\u0648\u0647", "cuts": [[967, 967], [946, 946], [929, 935], [908, 913], [902, 902], [886, 886], [865, 870], [848, 848], [816, 816], [794, 794], [778, 778], [767, 767], [746, 751], [740, 740], [724, 729], [713, 713], [697, 697], [675, 675], [659, 659], [638, 638], [621, 627], [605, 605], [589, 589], [573, 573], [540, 546], [535, 535], [519, 519], [497, 497], [481, 481], [470, 475], [459, 465], [438, 438], [421, 421], [400, 405], [389, 394], [367, 367], [351, 351], [330, 330], [313, 313], [292, 297], [281, 281], [265, 265], [243, 249], [238, 238], [232, 232], [222, 222], [200, 205], [184, 189], [178, 178], [151, 157], [140, 146], [124, 130], [119, 119], [103, 103], [86, 86], [70, 70], [49, 49], [27, 27]], "confidences": [0.9998652935028076, 0.5277007222175598, 0.9999955892562866, 0.9999880790710449, 0.9999693632125854, 0.9982054233551025, 0.9999960660934448, 0.8161394596099854, 0.9999929666519165, 0.9999971389770508, 0.9999768733978271, 0.9989445805549622, 0.9983943104743958, 0.835041344165802, 0.9998206496238708, 0.9999831914901733, 0.9942564368247986, 0.999908447265625, 0.9996181726455688, 0.5019206404685974, 0.9998630285263062, 0.9985489249229431, 0.9094343781471252, 0.9999619722366333, 0.999971866607666, 0.9999991655349731, 0.9999998807907104, 0.9989573955535889, 0.9999986886978149, 0.9999964237213135, 0.9999872446060181, 0.916301965713501, 0.9883456230163574, 0.9999982118606567, 0.9999991655349731, 0.9999978542327881, 0.6548713445663452, 0.936079204082489, 0.9999892711639404, 0.9997774958610535, 0.9999997615814209, 0.9538446664810181, 0.9998297691345215, 0.9999701976776123, 0.9999457597732544, 0.9999912977218628, 0.9999996423721313, 0.999927282333374, 0.9924691319465637, 0.9999955892562866, 0.9999499320983887, 0.9999344348907471, 0.993513286113739, 0.999993085861206, 0.9991191029548645, 0.9999837875366211, 0.9999768733978271, 0.9998847246170044], "line": {"boundary": [[481, 1563], [489, 1533], [522, 1532], [547, 1506], [561, 1506], [571, 1516], [580, 1508], [600, 1518], [631, 1516], [658, 1539], [684, 1533], [707, 1510], [744, 1537], [766, 1539], [785, 1530], [795, 1537], [814, 1518], [875, 1541], [898, 1518], [933, 1520], [980, 1539], [1005, 1520], [1027, 1541], [1052, 1518], [1093, 1541], [1157, 1541], [1189, 1522], [1208, 1522], [1226, 1537], [1249, 1522], [1263, 1535], [1298, 1541], [1335, 1524], [1354, 1541], [1374, 1539], [1391, 1553], [1432, 1526], [1465, 1565], [1417, 1592], [1387, 1594], [1370, 1578], [1352, 1596], [1321, 1578], [1280, 1578], [1257, 1588], [1222, 1571], [1187, 1576], [1175, 1588], [1142, 1578], [1115, 1590], [1089, 1569], [1039, 1592], [1021, 1590], [1005, 1574], [957, 1576], [939, 1588], [922, 1572], [879, 1571], [865, 1584], [847, 1586], [834, 1574], [768, 1571], [754, 1584], [731, 1588], [662, 1571], [641, 1588], [600, 1565], [557, 1584], [534, 1574], [506, 1584], [483, 1572]], "baseline": [[483, 1565], [651, 1565], [779, 1571], [1362, 1569], [1417, 1576], [1466, 1567]], "id": "line_17", "type": "baselines"}}, {"prediction": "\u0648\u0645\u062a\u0649 \u0631\u0627\u0654\u064a\u062a\u0645 \u0627\u0644\u0639\u0627\u0644\u0645 \u0644\u0627 \u064a\u062a\u0645\u0645 \u0635\u0644\u0627\u062a\u0647 \u0627\u0644\u0645\u0641\u0631\u0648\u0636\u0629 \u060c \u0648\u0644\u0627 \u064a\u0637\u0645\u064a\u0654\u0646 \u0641\u064a \u0631\u0643\u0648\u0639\u0647\u0627", "cuts": [[1209, 1209], [1187, 1187], [1176, 1176], [1159, 1159], [1109, 1115], [1098, 1098], [1081, 1087], [1076, 1076], [1070, 1070], [1059, 1059], [1042, 1042], [1004, 1015], [998, 998], [987, 993], [970, 970], [954, 954], [943, 943], [920, 920], [887, 893], [871, 876], [859, 865], [826, 837], [821, 821], [804, 804], [787, 793], [765, 765], [726, 737], [710, 710], [676, 682], [665, 671], [649, 649], [638, 638], [604, 610], [593, 599], [582, 582], [566, 566], [549, 549], [532, 532], [510, 510], [482, 488], [455, 455], [444, 444], [438, 438], [399, 410], [394, 394], [366, 372], [355, 360], [322, 333], [316, 316], [288, 294], [272, 272], [255, 255], [250, 250], [233, 238], [194, 205], [183, 183], [172, 172], [122, 133], [111, 111], [94, 94], [72, 72], [50, 50], [28, 28], [11, 11]], "confidences": [0.999711811542511, 0.9999942779541016, 0.9999964237213135, 0.9999276399612427, 0.9999908208847046, 0.9999871253967285, 0.9998900890350342, 0.9831660985946655, 0.9998063445091248, 0.999962329864502, 0.9997965693473816, 0.9999898672103882, 0.99998939037323, 0.9999788999557495, 0.9994357228279114, 0.9999730587005615, 0.7908631563186646, 0.9956527948379517, 0.9997575879096985, 0.9996732473373413, 0.9956046342849731, 0.999534010887146, 0.9465213418006897, 0.9551798105239868, 0.9997909665107727, 0.974587619304657, 0.9998075366020203, 0.999998927116394, 0.9999898672103882, 0.9993416666984558, 0.9999842643737793, 0.999870777130127, 0.9998094439506531, 0.9999909400939941, 0.9999817609786987, 0.9999905824661255, 0.7308676242828369, 0.9999252557754517, 0.9999912977218628, 0.9999830722808838, 0.9993329644203186, 0.9937452077865601, 0.9980292916297913, 0.9999990463256836, 0.9999905824661255, 0.9998887777328491, 0.9999932050704956, 0.9999985694885254, 0.9999996423721313, 0.9999998807907104, 0.9999985694885254, 0.8817663788795471, 0.9893107414245605, 0.9999843835830688, 0.9999984502792358, 0.9999974966049194, 0.9999927282333374, 0.9999198913574219, 0.9998809099197388, 0.9999985694885254, 0.9999926090240479, 0.9989744424819946, 0.9999724626541138, 0.7024262547492981], "line": {"boundary": [[169, 1647], [173, 1594], [185, 1606], [210, 1604], [222, 1613], [259, 1594], [296, 1629], [335, 1596], [370, 1621], [403, 1602], [424, 1608], [442, 1592], [481, 1615], [508, 1592], [532, 1592], [571, 1625], [602, 1596], [617, 1596], [629, 1608], [647, 1602], [678, 1617], [701, 1598], [723, 1610], [744, 1596], [777, 1621], [799, 1604], [838, 1600], [857, 1617], [877, 1611], [900, 1633], [959, 1598], [992, 1613], [1009, 1598], [1037, 1598], [1066, 1625], [1093, 1596], [1122, 1610], [1146, 1596], [1185, 1623], [1241, 1590], [1284, 1631], [1329, 1606], [1354, 1617], [1368, 1613], [1407, 1648], [1382, 1650], [1360, 1666], [1333, 1654], [1309, 1670], [1272, 1652], [1253, 1666], [1212, 1660], [1193, 1676], [1163, 1650], [1101, 1652], [1070, 1676], [1040, 1648], [1021, 1658], [998, 1647], [978, 1664], [933, 1664], [920, 1678], [885, 1650], [822, 1658], [779, 1647], [705, 1654], [686, 1668], [582, 1647], [543, 1662], [506, 1647], [491, 1647], [475, 1660], [415, 1650], [397, 1666], [380, 1666], [354, 1647], [327, 1672], [315, 1672], [288, 1647], [265, 1660], [247, 1650], [230, 1662], [200, 1650], [185, 1660], [173, 1654]], "baseline": [[171, 1648], [1204, 1647], [1249, 1648], [1270, 1654], [1408, 1650]], "id": "line_18", "type": "baselines"}}, {"prediction": "\u0648\u0633\u062c\u0648\u062f\u0647\u0627\u060c \u0648\u0644\u0627 \u064a\u062d\u0636\u0631 \u0645\u0639 \u0642\u0631\u0627\u0621\u062a\u0647 \u0641\u064a\u0647\u0627 \u0628\u0627\u0644\u062e\u0634\u0648\u0639 \u0648\u0627\u0644\u062d\u0636\u0648\u0631\u060c \u0648\u0627\u0644\u062a\u062f\u0628\u0631 \u0648\u0627\u0644\u062a\u0631\u062a\u064a\u0644", "cuts": [[1292, 1292], [1267, 1267], [1231, 1231], [1213, 1213], [1194, 1194], [1170, 1170], [1152, 1158], [1139, 1139], [1109, 1121], [1097, 1103], [1072, 1079], [1060, 1066], [1030, 1042], [1024, 1024], [999, 999], [975, 975], [944, 944], [908, 914], [896, 896], [877, 877], [841, 847], [829, 829], [817, 817], [798, 798], [786, 786], [768, 768], [756, 756], [725, 731], [713, 713], [701, 701], [689, 689], [670, 670], [640, 652], [634, 634], [622, 622], [609, 609], [585, 585], [561, 561], [536, 536], [512, 512], [475, 481], [469, 469], [451, 451], [439, 439], [414, 414], [390, 390], [360, 360], [335, 335], [317, 317], [286, 293], [274, 274], [256, 262], [250, 250], [238, 238], [225, 225], [201, 201], [189, 189], [152, 165], [146, 146], [128, 128], [116, 122], [104, 104], [91, 91], [79, 79], [61, 61], [49, 49]], "confidences": [0.9998243451118469, 0.9999920129776001, 0.9999985694885254, 0.9999624490737915, 0.9999974966049194, 0.9999874830245972, 0.9999926090240479, 0.9999836683273315, 0.999990701675415, 0.9999855756759644, 0.99998939037323, 0.9999979734420776, 0.9996892213821411, 0.9999874830245972, 0.9997640252113342, 0.9999427795410156, 0.9993060827255249, 0.9446314573287964, 0.7036338448524475, 0.9967960715293884, 0.9986769556999207, 0.9841193556785583, 0.9994528889656067, 0.9409279823303223, 0.9999997615814209, 0.9999942779541016, 0.9934862852096558, 0.9999960660934448, 0.9999674558639526, 0.9067964553833008, 0.9972527623176575, 0.999915599822998, 0.9999898672103882, 0.9999929666519165, 0.9999849796295166, 0.9999780654907227, 0.9999867677688599, 0.999346911907196, 0.9999964237213135, 0.9825494289398193, 0.9995606541633606, 0.9960000514984131, 0.9999972581863403, 0.9731088280677795, 0.9996663331985474, 0.5042705535888672, 1.0, 0.9998852014541626, 0.9999935626983643, 0.9747305512428284, 0.7328495383262634, 0.9999992847442627, 0.9982652068138123, 0.9998162388801575, 1.0, 0.9999856948852539, 0.8613400459289551, 0.9995511174201965, 0.9720507264137268, 0.9999809265136719, 0.9999556541442871, 0.9989655017852783, 0.9860791563987732, 0.9992793202400208, 0.9793171882629395, 0.9999933242797852], "line": {"boundary": [[161, 1732], [165, 1686], [194, 1670], [237, 1684], [270, 1670], [319, 1707], [387, 1670], [409, 1674], [442, 1699], [461, 1686], [514, 1693], [532, 1678], [561, 1687], [588, 1670], [633, 1701], [656, 1684], [678, 1695], [701, 1680], [740, 1684], [752, 1674], [764, 1674], [787, 1695], [810, 1676], [830, 1689], [861, 1678], [885, 1699], [908, 1682], [945, 1678], [955, 1687], [980, 1678], [1003, 1699], [1046, 1693], [1070, 1713], [1115, 1682], [1175, 1695], [1200, 1674], [1226, 1674], [1261, 1703], [1296, 1676], [1348, 1695], [1440, 1693], [1469, 1726], [1456, 1726], [1432, 1746], [1389, 1734], [1347, 1748], [1321, 1732], [1280, 1732], [1270, 1725], [1233, 1744], [1193, 1725], [1171, 1742], [1142, 1730], [1074, 1748], [1060, 1736], [1033, 1758], [1007, 1754], [982, 1730], [949, 1748], [927, 1730], [904, 1734], [886, 1725], [851, 1744], [822, 1742], [803, 1725], [779, 1744], [760, 1730], [703, 1732], [668, 1756], [653, 1754], [627, 1730], [612, 1740], [584, 1728], [518, 1730], [489, 1742], [438, 1725], [411, 1740], [395, 1728], [364, 1728], [352, 1740], [325, 1742], [306, 1726], [286, 1740], [253, 1728], [228, 1744], [216, 1736], [179, 1744], [165, 1732]], "baseline": [[163, 1734], [214, 1732], [255, 1725], [364, 1726], [397, 1723], [419, 1723], [438, 1726], [1419, 1725], [1471, 1728]], "id": "line_19", "type": "baselines"}}, {"prediction": "\u0641\u0627\u062a\u0647\u0645\u0648\u0647 \u0628\u0642\u0633\u0627\u0648\u0629 \u0627\u0644\u0642\u0644\u0628\u060c \u0648\u0628\u0639\u062f\u0647 \u0639\u0646 \u0627\u0644\u0631\u0628 \u0639\u0632 \u0648\u062c\u0644.", "cuts": [[683, 683], [668, 673], [659, 659], [644, 644], [620, 620], [601, 606], [582, 582], [563, 567], [558, 558], [543, 543], [524, 524], [500, 500], [490, 490], [466, 466], [452, 452], [442, 447], [433, 433], [418, 418], [399, 404], [375, 375], [346, 346], [327, 332], [317, 322], [298, 303], [284, 284], [269, 269], [245, 245], [226, 231], [212, 212], [188, 192], [163, 168], [159, 159], [149, 149], [135, 135], [106, 106], [72, 77], [63, 63], [53, 58], [48, 48], [43, 43], [38, 38], [29, 34], [19, 19]], "confidences": [0.9739862084388733, 0.9999884366989136, 0.9997276663780212, 0.9999849796295166, 0.9990725517272949, 0.9999985694885254, 0.9983306527137756, 0.9980822801589966, 0.9998204112052917, 0.997825026512146, 0.9833168387413025, 0.9999716281890869, 0.999618411064148, 0.9978547692298889, 0.6419629454612732, 0.9951518774032593, 0.9999998807907104, 1.0, 0.9999918937683105, 0.9991405010223389, 0.9999971389770508, 1.0, 1.0, 0.9999991655349731, 0.9999963045120239, 0.9999998807907104, 0.9999983310699463, 0.999997615814209, 0.9999990463256836, 0.9999960660934448, 0.9999496936798096, 0.9999961853027344, 0.9999966621398926, 0.9999440908432007, 0.9999513626098633, 0.9999853372573853, 0.9999990463256836, 0.9999951124191284, 0.9946951270103455, 0.9999998807907104, 0.9999974966049194, 0.9999954700469971, 0.9960901141166687], "line": {"boundary": [[764, 1799], [766, 1769], [783, 1752], [812, 1746], [849, 1775], [879, 1767], [898, 1750], [929, 1769], [974, 1765], [986, 1773], [1025, 1762], [1048, 1771], [1103, 1767], [1122, 1777], [1150, 1752], [1189, 1752], [1233, 1767], [1253, 1754], [1272, 1773], [1288, 1758], [1304, 1758], [1321, 1775], [1384, 1775], [1426, 1756], [1463, 1783], [1469, 1802], [1415, 1810], [1401, 1822], [1368, 1812], [1354, 1824], [1327, 1812], [1306, 1822], [1292, 1810], [1253, 1810], [1231, 1822], [1206, 1806], [1146, 1810], [1130, 1824], [1093, 1806], [1072, 1820], [1048, 1820], [1035, 1808], [994, 1810], [980, 1802], [935, 1826], [912, 1808], [886, 1822], [851, 1822], [830, 1804], [785, 1812], [766, 1806]], "baseline": [[766, 1801], [846, 1801], [867, 1804], [1470, 1804]], "id": "line_20", "type": "baselines"}}, {"prediction": "\u0648\u0645\u062a\u0649 \u0648\u062c\u062f\u062a\u0645 \u0627\u0644\u0639\u0627\u0644\u0645 \u0644\u0627 \u0645\u0639\u0627\u0645\u0644\u0629 \u0644\u0647 \u0645\u0639 \u0631\u0628\u0647 \u0639\u0632 \u0648\u062c\u0644 \u060c \u062a\u0638\u0647\u0631 \u0639\u0644\u064a\u0647 \u0628\u0647\u062c\u062a\u0647\u0627 \u0648\u0627\u0654\u0646\u0648\u0627\u0631\u0647\u0627", "cuts": [[1236, 1236], [1214, 1214], [1197, 1197], [1186, 1186], [1142, 1153], [1131, 1136], [1103, 1103], [1086, 1086], [1064, 1064], [1042, 1042], [1014, 1020], [1009, 1009], [998, 998], [981, 981], [964, 964], [953, 953], [931, 937], [898, 909], [887, 892], [876, 881], [853, 859], [842, 842], [820, 820], [804, 809], [792, 792], [770, 770], [759, 759], [732, 743], [726, 726], [709, 709], [682, 687], [671, 671], [648, 648], [621, 626], [610, 610], [593, 593], [576, 576], [554, 560], [543, 543], [532, 538], [526, 526], [521, 521], [515, 515], [504, 510], [499, 499], [493, 493], [471, 477], [460, 460], [438, 443], [421, 421], [399, 405], [371, 377], [355, 355], [338, 338], [327, 327], [310, 310], [283, 288], [277, 277], [260, 260], [233, 233], [211, 211], [200, 200], [177, 183], [155, 166], [150, 150], [133, 133], [122, 127], [116, 116], [105, 105], [83, 89], [72, 72], [50, 50], [33, 33]], "confidences": [0.9999624490737915, 0.9999873638153076, 0.9999958276748657, 0.9999871253967285, 0.9999827146530151, 0.9999901056289673, 0.999958872795105, 0.519729733467102, 0.9999949932098389, 0.990899920463562, 0.9998747110366821, 0.9999719858169556, 0.9997586607933044, 0.9992938041687012, 0.9987748265266418, 0.9998395442962646, 0.9999606609344482, 0.9999958276748657, 0.999937891960144, 0.9987975358963013, 0.9998902082443237, 0.9642751216888428, 0.9995637536048889, 0.9999383687973022, 0.9973805546760559, 0.9987190961837769, 0.524466335773468, 0.9997130036354065, 0.9221267104148865, 0.9419159293174744, 0.9999997615814209, 0.9999914169311523, 0.9996623992919922, 0.999992847442627, 0.9999985694885254, 0.999937891960144, 0.9998610019683838, 0.9999767541885376, 0.9999998807907104, 0.8760433197021484, 0.9968647360801697, 0.9999954700469971, 0.999546229839325, 0.9998810291290283, 0.656394362449646, 0.9994986057281494, 0.9998539686203003, 0.9695175290107727, 0.9999977350234985, 0.9999958276748657, 0.9999986886978149, 0.9999974966049194, 0.9999914169311523, 0.9999973773956299, 0.9956705570220947, 0.9975166320800781, 0.9996503591537476, 0.9999966621398926, 0.9999432563781738, 0.9999326467514038, 0.960350751876831, 0.9999790191650391, 0.9999817609786987, 0.9995361566543579, 0.9995700716972351, 0.9970190525054932, 0.9999990463256836, 0.9999368190765381, 0.7645747065544128, 0.9985374212265015, 0.9979060888290405, 0.9999816417694092, 0.990431010723114], "line": {"boundary": [[144, 1867], [146, 1841], [161, 1828], [196, 1843], [214, 1828], [233, 1838], [263, 1816], [290, 1841], [315, 1826], [329, 1840], [399, 1840], [423, 1853], [473, 1828], [516, 1861], [559, 1828], [598, 1832], [614, 1845], [658, 1822], [693, 1845], [713, 1840], [746, 1847], [758, 1859], [775, 1845], [808, 1845], [820, 1855], [849, 1828], [871, 1840], [900, 1828], [920, 1838], [935, 1828], [957, 1847], [978, 1847], [1000, 1828], [1021, 1826], [1052, 1851], [1079, 1828], [1107, 1841], [1132, 1830], [1161, 1855], [1193, 1836], [1249, 1851], [1265, 1845], [1286, 1863], [1327, 1840], [1368, 1847], [1407, 1882], [1376, 1886], [1364, 1898], [1347, 1898], [1337, 1888], [1298, 1904], [1276, 1886], [1261, 1900], [1189, 1890], [1165, 1910], [1142, 1888], [1087, 1886], [1052, 1908], [1031, 1886], [1007, 1888], [994, 1877], [961, 1890], [898, 1890], [869, 1875], [853, 1888], [826, 1880], [781, 1910], [752, 1888], [717, 1896], [690, 1875], [668, 1888], [635, 1888], [606, 1873], [584, 1888], [524, 1900], [499, 1880], [460, 1896], [432, 1880], [409, 1894], [376, 1884], [329, 1894], [302, 1875], [276, 1894], [253, 1884], [237, 1896], [196, 1894], [148, 1869]], "baseline": [[146, 1869], [194, 1875], [323, 1873], [345, 1878], [499, 1882], [555, 1880], [590, 1873], [859, 1875], [900, 1871], [923, 1877], [1037, 1878], [1056, 1882], [1276, 1880], [1354, 1888], [1408, 1884]], "id": "line_21", "type": "baselines"}}, {"prediction": "\u0648\u0633\u0643\u064a\u0646\u062a\u0647\u0627\u060c \u0645\u0646 \u062a\u0644\u0627\u0648\u0629 \u0648\u0635\u064a\u0627\u0645 \u0648\u0642\u064a\u0627\u0645\u060c \u0641\u0627\u0639\u0644\u0645\u0648\u0627 \u0627\u0654\u0646\u0647 \u0642\u0644\u064a\u0644 \u0627\u0644\u0646\u0635\u064a\u0628 \u0645\u0646 \u062b\u0645\u0631\u0629 \u0627\u0644\u0639\u0644\u0645 \u0627\u0655\u0630 \u062b\u0645\u0631\u0629", "cuts": [[1298, 1298], [1273, 1278], [1243, 1243], [1228, 1228], [1213, 1213], [1203, 1203], [1188, 1188], [1173, 1173], [1158, 1158], [1138, 1143], [1128, 1133], [1108, 1108], [1082, 1087], [1072, 1072], [1057, 1062], [1047, 1052], [1027, 1027], [1007, 1007], [987, 992], [977, 977], [947, 947], [922, 922], [907, 907], [892, 892], [872, 877], [862, 862], [842, 842], [827, 827], [817, 822], [797, 802], [782, 782], [762, 767], [757, 757], [742, 742], [727, 727], [707, 707], [687, 687], [667, 672], [651, 651], [636, 641], [626, 631], [621, 621], [616, 616], [601, 601], [581, 586], [571, 571], [556, 561], [546, 546], [531, 536], [501, 506], [491, 496], [481, 486], [471, 471], [451, 451], [426, 426], [396, 401], [366, 371], [356, 356], [331, 331], [306, 311], [296, 301], [281, 281], [261, 261], [246, 246], [226, 231], [216, 221], [205, 210], [190, 190], [175, 175], [150, 155], [135, 135], [125, 130], [115, 120], [110, 110], [90, 95], [80, 80], [65, 65], [45, 45], [30, 30]], "confidences": [0.9999417066574097, 0.9999945163726807, 0.9999974966049194, 0.999985933303833, 0.9999626874923706, 0.99998939037323, 0.9999910593032837, 0.9999959468841553, 0.756621778011322, 0.9993665814399719, 0.9999896287918091, 0.9500626921653748, 0.9996504783630371, 0.9999996423721313, 0.9999978542327881, 0.9999961853027344, 0.9998416900634766, 0.9999421834945679, 0.9999947547912598, 0.9550725221633911, 0.999901294708252, 0.999994158744812, 0.99993896484375, 0.9998705387115479, 0.9994296431541443, 0.9963602423667908, 0.9768261909484863, 0.9845020174980164, 0.9991129040718079, 0.9998034834861755, 0.9999189376831055, 0.9999998807907104, 0.9999986886978149, 0.9999935626983643, 0.9999996423721313, 0.9999974966049194, 0.999970555305481, 0.9999955892562866, 0.9999997615814209, 1.0, 0.9998965263366699, 0.9999996423721313, 0.9999357461929321, 0.7053399085998535, 0.9999959468841553, 0.9999908208847046, 0.9990590214729309, 0.9999946355819702, 0.9999847412109375, 0.9993951320648193, 0.9999172687530518, 0.9937519431114197, 0.9999966621398926, 0.9998257756233215, 0.514997661113739, 0.9999998807907104, 0.9999972581863403, 0.9961175918579102, 0.996932864189148, 0.9999979734420776, 0.9999998807907104, 0.9999791383743286, 0.9999998807907104, 0.9914675951004028, 0.9999983310699463, 0.9999983310699463, 0.9999997615814209, 0.9999996423721313, 0.9999963045120239, 0.9999997615814209, 0.9999983310699463, 0.9999831914901733, 1.0, 0.9999969005584717, 0.999922513961792, 0.6258425116539001, 0.9992828965187073, 0.9999939203262329, 0.9998599290847778], "line": {"boundary": [[152, 1951], [155, 1912], [163, 1906], [192, 1923], [214, 1904], [255, 1904], [288, 1923], [311, 1902], [329, 1912], [354, 1902], [368, 1912], [387, 1908], [409, 1925], [440, 1904], [460, 1921], [520, 1919], [543, 1929], [575, 1927], [617, 1904], [635, 1906], [653, 1921], [670, 1906], [684, 1912], [695, 1904], [734, 1919], [762, 1898], [795, 1908], [814, 1925], [840, 1906], [859, 1917], [873, 1908], [896, 1908], [914, 1923], [931, 1923], [955, 1906], [984, 1908], [1015, 1929], [1040, 1908], [1070, 1929], [1085, 1921], [1122, 1925], [1140, 1912], [1159, 1921], [1194, 1908], [1230, 1925], [1278, 1929], [1306, 1908], [1327, 1921], [1393, 1906], [1417, 1927], [1438, 1925], [1471, 1953], [1434, 1976], [1387, 1964], [1368, 1976], [1343, 1966], [1319, 1976], [1278, 1958], [1253, 1978], [1230, 1980], [1212, 1964], [1150, 1974], [1128, 1960], [1115, 1974], [1085, 1964], [1056, 1976], [1042, 1970], [1029, 1984], [1005, 1970], [951, 1972], [933, 1984], [902, 1958], [826, 1962], [795, 1976], [775, 1958], [742, 1962], [727, 1955], [658, 1980], [631, 1960], [534, 1974], [506, 1955], [463, 1976], [440, 1958], [387, 1972], [368, 1955], [313, 1960], [284, 1980], [233, 1955], [185, 1972], [155, 1955]], "baseline": [[153, 1953], [830, 1951], [916, 1953], [941, 1962], [961, 1958], [1419, 1960], [1473, 1955]], "id": "line_22", "type": "baselines"}}, {"prediction": "\u0627\u0644\u0639\u0644\u0645 \u0627\u0644\u0645\u0639\u0627\u0645\u0644\u0629 \u060c \u0648\u0642\u0644\u064a\u0644 \u0627\u0644\u0646\u0635\u064a\u0628 \u0645\u0646 \u0627\u0644\u0645\u062d\u0628\u0629 \u0648\u0627\u0644\u062e\u0634\u064a\u0629\u060c \u0648( \u0627\u0655\u0646\u0645\u0627 \u064a\u062e\u0634\u0649 \u0627\u0644\u0644\u0647 \u0645\u0646 \u0639\u0628\u0627\u062f\u0648", "cuts": [[1303, 1303], [1290, 1290], [1272, 1272], [1260, 1260], [1235, 1235], [1211, 1217], [1198, 1204], [1186, 1192], [1168, 1168], [1149, 1149], [1131, 1137], [1118, 1118], [1106, 1106], [1088, 1088], [1081, 1081], [1075, 1075], [1051, 1057], [1038, 1038], [1014, 1014], [1002, 1002], [989, 989], [977, 977], [940, 946], [928, 934], [916, 922], [903, 903], [885, 885], [860, 860], [836, 836], [793, 799], [780, 780], [756, 762], [725, 731], [719, 719], [707, 713], [688, 688], [664, 664], [645, 645], [633, 633], [602, 608], [590, 596], [571, 578], [559, 565], [535, 535], [516, 516], [492, 492], [479, 479], [461, 461], [436, 442], [424, 424], [399, 399], [381, 381], [369, 375], [363, 363], [356, 356], [338, 338], [326, 326], [313, 320], [301, 301], [289, 289], [270, 270], [246, 252], [221, 227], [215, 215], [203, 209], [191, 191], [178, 184], [160, 166], [154, 154], [135, 135], [104, 111], [92, 92], [80, 80], [61, 61], [49, 49], [37, 37]], "confidences": [0.9999939203262329, 0.9962407350540161, 0.6148149967193604, 0.9995049238204956, 0.9999679327011108, 0.9998955726623535, 0.9999966621398926, 0.9999812841415405, 0.9999535083770752, 0.9999920129776001, 0.9999990463256836, 0.9946582913398743, 0.7702367901802063, 0.9436891078948975, 0.9403108358383179, 0.874081015586853, 0.9999908208847046, 0.9999887943267822, 0.999915599822998, 0.9999622106552124, 0.9999816417694092, 0.9999862909317017, 0.9991334080696106, 0.9935688972473145, 0.9999759197235107, 0.9654875993728638, 0.9996823072433472, 0.9990022778511047, 0.564159095287323, 0.9998770952224731, 0.9986807703971863, 0.9983581900596619, 0.9994006156921387, 0.9421390295028687, 0.9977754950523376, 0.9938074946403503, 0.9999985694885254, 0.9493253231048584, 0.9998681545257568, 0.9999979734420776, 0.9999966621398926, 0.9997482895851135, 0.9999991655349731, 0.9999998807907104, 0.9024093747138977, 0.8440074920654297, 0.9990659356117249, 0.9999818801879883, 0.98737633228302, 0.9999896287918091, 0.9998379945755005, 0.9999996423721313, 0.9999951124191284, 0.9999514818191528, 0.9996600151062012, 0.971716046333313, 0.9997962117195129, 0.999996542930603, 0.9999830722808838, 0.9999959468841553, 0.9999998807907104, 0.999964714050293, 0.9999979734420776, 0.5567030906677246, 0.999757707118988, 0.8596031069755554, 0.998282790184021, 0.7934605479240417, 0.9993875026702881, 0.9990580677986145, 0.9998717308044434, 0.9960359930992126, 0.998126208782196, 0.9995434880256653, 0.5599195957183838, 0.99636310338974], "line": {"boundary": [[152, 2046], [165, 2009], [218, 1982], [247, 2005], [269, 1986], [300, 2005], [331, 1984], [358, 1982], [378, 1999], [401, 1982], [440, 1980], [458, 1993], [483, 1982], [512, 1995], [530, 1986], [555, 2009], [582, 2019], [610, 1993], [637, 2003], [647, 1995], [686, 1999], [701, 1990], [740, 2013], [771, 1995], [789, 2011], [816, 2015], [851, 1993], [879, 2015], [894, 2007], [927, 2009], [939, 2019], [947, 2011], [966, 2019], [1011, 2017], [1050, 1992], [1089, 2017], [1109, 1999], [1124, 2003], [1138, 1995], [1157, 1997], [1191, 2025], [1222, 1997], [1237, 1995], [1255, 2005], [1270, 1997], [1300, 2015], [1329, 1993], [1362, 2019], [1391, 1995], [1409, 2005], [1430, 1995], [1463, 2021], [1469, 2040], [1438, 2056], [1395, 2056], [1378, 2071], [1347, 2054], [1230, 2058], [1196, 2048], [1171, 2068], [1144, 2058], [1093, 2071], [1072, 2052], [966, 2066], [939, 2044], [898, 2070], [865, 2052], [799, 2052], [777, 2066], [750, 2044], [725, 2064], [680, 2050], [623, 2062], [584, 2044], [567, 2060], [541, 2060], [528, 2071], [497, 2066], [483, 2054], [436, 2058], [424, 2050], [389, 2062], [368, 2060], [356, 2048], [309, 2048], [294, 2060], [259, 2058], [251, 2050], [228, 2060], [202, 2050], [187, 2058], [155, 2054]], "baseline": [[153, 2048], [491, 2048], [604, 2042], [816, 2042], [883, 2046], [1470, 2042]], "id": "line_23", "type": "baselines"}}, {"prediction": "\u0627\u0644\u0639\u0644\u0645\u0648\u0627).", "cuts": [[358, 365], [352, 352], [338, 338], [325, 325], [311, 311], [291, 291], [270, 277], [250, 250], [34, 41]], "confidences": [0.9943757057189941, 0.7291178107261658, 0.9799628257751465, 0.7520625591278076, 0.6908395886421204, 0.9932884573936462, 0.9999109506607056, 0.48956286907196045, 0.997548520565033], "line": {"boundary": [[1099, 2132], [1101, 2107], [1132, 2075], [1212, 2099], [1228, 2081], [1245, 2089], [1280, 2077], [1309, 2097], [1352, 2064], [1378, 2079], [1446, 2077], [1465, 2097], [1471, 2126], [1442, 2144], [1384, 2146], [1343, 2165], [1327, 2165], [1304, 2144], [1284, 2153], [1247, 2140], [1208, 2157], [1193, 2144], [1134, 2149], [1107, 2132]], "baseline": [[1101, 2134], [1473, 2128]], "id": "line_24", "type": "baselines"}}], "regions": {"text": [{"id": "region_0", "boundary": [[0, 0], [1655, 0], [1655, 2339], [0, 2339]], "imagename": null, "tags": null}]}} \ No newline at end of file diff --git a/tests/resources/records.json b/tests/resources/records.json index cf735d14b..c084b2f23 100644 --- a/tests/resources/records.json +++ b/tests/resources/records.json @@ -1 +1 @@ -[{"prediction": "\u0645\u0627\u0644\u0633\u0644\u0627 \u0647\u064a\u0644\u0639 \u0647\u062a\u0627\u0632\u062c\u0639\u0645 \u064a\u0641", "cuts": [[[1437, 119], [1437, 256], [1449, 256], [1449, 119]], [[1484, 119], [1484, 256], [1496, 256], [1496, 119]], [[1508, 119], [1508, 256], [1520, 256], [1520, 119]], [[1568, 119], [1568, 256], [1568, 256], [1568, 119]], [[1603, 119], [1603, 256], [1603, 256], [1603, 119]], [[1615, 119], [1615, 256], [1627, 256], [1627, 119]], [[1639, 119], [1639, 256], [1639, 256], [1639, 119]], [[1663, 119], [1663, 256], [1674, 256], [1674, 119]], [[1698, 119], [1698, 256], [1698, 256], [1698, 119]], [[1722, 119], [1722, 256], [1734, 256], [1734, 119]], [[1746, 119], [1746, 256], [1758, 256], [1758, 119]], [[1793, 119], [1793, 256], [1805, 256], [1805, 119]], [[1817, 119], [1817, 256], [1829, 256], [1829, 119]], [[1853, 119], [1853, 256], [1853, 256], [1853, 119]], [[1876, 119], [1876, 256], [1888, 256], [1888, 119]], [[1924, 119], [1924, 256], [1936, 256], [1936, 119]], [[1959, 119], [1959, 256], [1971, 256], [1971, 119]], [[2007, 119], [2007, 256], [2019, 256], [2019, 119]], [[2054, 119], [2054, 256], [2054, 256], [2054, 119]], [[2078, 119], [2078, 256], [2090, 256], [2090, 119]], [[2149, 119], [2149, 256], [2149, 256], [2149, 119]], [[2161, 119], [2161, 256], [2173, 256], [2173, 119]]], "confidences": [0.9999573230743408, 0.8209527730941772, 0.9964040517807007, 0.667267382144928, 0.9973480701446533, 0.9998679161071777, 0.9999040365219116, 0.999890923500061, 0.8255242109298706, 0.9995707869529724, 0.9976646900177002, 0.9889178276062012, 0.9869346618652344, 0.9966957569122314, 0.9958117008209229, 0.980436384677887, 0.9956343770027161, 0.9984177350997925, 0.762851893901825, 0.9997056126594543, 0.9977449178695679, 0.9985793828964233], "line": {"id": "45b2dd04-e945-4788-92b2-83a9ed26092d", "bbox": [1437, 119, 2185, 256], "type": "bbox"}}, {"prediction": "(294)", "cuts": [[[2838, 119], [2838, 265], [2838, 265], [2838, 119]], [[2904, 119], [2904, 265], [2904, 265], [2904, 119]], [[2954, 119], [2954, 265], [2954, 265], [2954, 119]], [[3019, 119], [3019, 265], [3019, 265], [3019, 119]], [[3069, 119], [3069, 265], [3085, 265], [3085, 119]]], "confidences": [0.5292237997055054, 0.9998055100440979, 0.9602159857749939, 0.9988068342208862, 0.994594395160675], "line": {"id": "def66cf7-3d4d-41f2-9d7b-b5009f125834", "bbox": [2821, 119, 3119, 265], "type": "bbox"}}, {"prediction": "\u0627\u0630\u0643\u0648 \u0627\u0630\u0643\u062a\u0642\u0648 \u0641 \u0646\u064a\u0646\u0645\u0654\u0648\u0645\u0644\u0627 \u0631\u064a\u0645\u0654\u0627 \u0627\u0647\u0628 \u0647\u0645\u0631\u0643\u0627 \u0649\u062a\u0644\u0627 \u0629\u0639\u0627\u0631\u062f\u0644\u0627 \u0647\u064a\u0644\u0627 \u0644\u0645\u062d \u062f\u0642\u0648 \u0629\u0646\u0633 \u0644\u0643 \u064a\u0641", "cuts": [[[358, 365], [358, 542], [358, 542], [358, 365]], [[402, 365], [402, 542], [402, 542], [402, 365]], [[460, 365], [460, 542], [474, 542], [474, 365]], [[648, 365], [648, 542], [663, 542], [663, 365]], [[677, 365], [677, 542], [706, 542], [706, 365]], [[735, 365], [735, 542], [750, 542], [750, 365]], [[779, 365], [779, 542], [779, 542], [779, 365]], [[852, 365], [852, 542], [852, 542], [852, 365]], [[939, 365], [939, 542], [939, 542], [939, 365]], [[997, 365], [997, 542], [997, 542], [997, 365]], [[1055, 365], [1055, 542], [1055, 542], [1055, 365]], [[1069, 365], [1069, 542], [1084, 542], [1084, 365]], [[1127, 365], [1127, 542], [1142, 542], [1142, 365]], [[1171, 365], [1171, 542], [1171, 542], [1171, 365]], [[1200, 365], [1200, 542], [1215, 542], [1215, 365]], [[1229, 365], [1229, 542], [1244, 542], [1244, 365]], [[1273, 365], [1273, 542], [1273, 542], [1273, 365]], [[1302, 365], [1302, 542], [1302, 542], [1302, 365]], [[1345, 365], [1345, 542], [1345, 542], [1345, 365]], [[1360, 365], [1360, 542], [1360, 542], [1360, 365]], [[1374, 365], [1374, 542], [1374, 542], [1374, 365]], [[1389, 365], [1389, 542], [1403, 542], [1403, 365]], [[1418, 365], [1418, 542], [1432, 542], [1432, 365]], [[1447, 365], [1447, 542], [1447, 542], [1447, 365]], [[1490, 365], [1490, 542], [1490, 542], [1490, 365]], [[1505, 365], [1505, 542], [1519, 542], [1519, 365]], [[1548, 365], [1548, 542], [1548, 542], [1548, 365]], [[1578, 365], [1578, 542], [1578, 542], [1578, 365]], [[1592, 365], [1592, 542], [1592, 542], [1592, 365]], [[1607, 365], [1607, 542], [1621, 542], [1621, 365]], [[1650, 365], [1650, 542], [1650, 542], [1650, 365]], [[1665, 365], [1665, 542], [1679, 542], [1679, 365]], [[1694, 365], [1694, 542], [1708, 542], [1708, 365]], [[1723, 365], [1723, 542], [1737, 542], [1737, 365]], [[1766, 365], [1766, 542], [1766, 542], [1766, 365]], [[1810, 365], [1810, 542], [1810, 542], [1810, 365]], [[1853, 365], [1853, 542], [1868, 542], [1868, 365]], [[1882, 365], [1882, 542], [1882, 542], [1882, 365]], [[1955, 365], [1955, 542], [1969, 542], [1969, 365]], [[1984, 365], [1984, 542], [1999, 542], [1999, 365]], [[2057, 365], [2057, 542], [2057, 542], [2057, 365]], [[2071, 365], [2071, 542], [2071, 542], [2071, 365]], [[2086, 365], [2086, 542], [2100, 542], [2100, 365]], [[2115, 365], [2115, 542], [2115, 542], [2115, 365]], [[2129, 365], [2129, 542], [2144, 542], [2144, 365]], [[2173, 365], [2173, 542], [2173, 542], [2173, 365]], [[2202, 365], [2202, 542], [2202, 542], [2202, 365]], [[2245, 365], [2245, 542], [2260, 542], [2260, 365]], [[2303, 365], [2303, 542], [2303, 542], [2303, 365]], [[2332, 365], [2332, 542], [2347, 542], [2347, 365]], [[2361, 365], [2361, 542], [2361, 542], [2361, 365]], [[2376, 365], [2376, 542], [2391, 542], [2391, 365]], [[2405, 365], [2405, 542], [2420, 542], [2420, 365]], [[2434, 365], [2434, 542], [2449, 542], [2449, 365]], [[2478, 365], [2478, 542], [2478, 542], [2478, 365]], [[2492, 365], [2492, 542], [2507, 542], [2507, 365]], [[2521, 365], [2521, 542], [2521, 542], [2521, 365]], [[2536, 365], [2536, 542], [2550, 542], [2550, 365]], [[2594, 365], [2594, 542], [2594, 542], [2594, 365]], [[2623, 365], [2623, 542], [2623, 542], [2623, 365]], [[2637, 365], [2637, 542], [2652, 542], [2652, 365]], [[2681, 365], [2681, 542], [2695, 542], [2695, 365]], [[2724, 365], [2724, 542], [2724, 542], [2724, 365]], [[2753, 365], [2753, 542], [2753, 542], [2753, 365]], [[2812, 365], [2812, 542], [2812, 542], [2812, 365]], [[2841, 365], [2841, 542], [2855, 542], [2855, 365]], [[2870, 365], [2870, 542], [2870, 542], [2870, 365]], [[2899, 365], [2899, 542], [2899, 542], [2899, 365]], [[2942, 365], [2942, 542], [2957, 542], [2957, 365]], [[2986, 365], [2986, 542], [3000, 542], [3000, 365]], [[3058, 365], [3058, 542], [3058, 542], [3058, 365]], [[3073, 365], [3073, 542], [3073, 542], [3073, 365]], [[3116, 365], [3116, 542], [3131, 542], [3131, 365]], [[3145, 365], [3145, 542], [3145, 542], [3145, 365]], [[3160, 365], [3160, 542], [3174, 542], [3174, 365]]], "confidences": [0.9912043213844299, 0.9701831340789795, 0.9999876022338867, 0.9710670113563538, 0.9999645948410034, 0.9999040365219116, 0.9999904632568359, 0.9276049733161926, 0.9949396848678589, 0.9172694683074951, 0.9944435954093933, 0.9998708963394165, 0.9994745850563049, 0.9999909400939941, 0.9929296374320984, 0.9996275901794434, 0.9654240012168884, 0.9978482723236084, 0.8331916928291321, 0.9914954900741577, 0.9862202405929565, 0.9967150688171387, 0.9994681477546692, 0.9422079920768738, 0.9996860027313232, 0.9978721141815186, 0.590356171131134, 0.9853919148445129, 0.9949153661727905, 0.9330083131790161, 0.902510941028595, 0.9991570711135864, 0.9937306642532349, 0.9962736368179321, 0.9969527721405029, 0.9955304265022278, 0.9975927472114563, 0.931627094745636, 0.9910709857940674, 0.994668185710907, 0.9977930784225464, 0.9947988986968994, 0.99834144115448, 0.9974583983421326, 0.9996436834335327, 0.9992924928665161, 0.9981145858764648, 0.9989506006240845, 0.9970920085906982, 0.9896613359451294, 0.6772571206092834, 0.9618531465530396, 0.9992746710777283, 0.998647153377533, 0.834701657295227, 0.9992173910140991, 0.9594298601150513, 0.9998399019241333, 0.9885919690132141, 0.9965444207191467, 0.9950836896896362, 0.8906474709510803, 0.8982319831848145, 0.520612359046936, 0.9998024106025696, 0.9991157650947571, 0.9997696280479431, 0.9865208864212036, 0.9990457892417908, 0.9984292387962341, 0.8027671575546265, 0.9970871806144714, 0.9498249292373657, 0.9898852109909058, 0.9846636056900024], "line": {"id": "b242cdcb-5ce1-4582-a71d-58c9ad54da92", "bbox": [358, 365, 3189, 542], "type": "bbox"}}, {"prediction": "\u0646\u0627\u0643 \u0646\u0627\u0641 \u0644\u0627\u062d\u0644\u0627 \u0647\u0630\u0647 \u0646\u0639 \u0646\u063a\u0634\u0643\u0627\u0644 \u0644\u0627\u0642\u0648 \u0627\u062f\u062f\u0634 \u064b\u0627\u0640\u0628\u0646\u063a \u0628\u0636\u063a\u0648 \u0643\u0644\u0630\u0644 \u062f\u064a\u0634\u0631\u0644\u0627 \u0637\u0627\u0634\u062a\u0633\u0627\u0641", "cuts": [[[364, 534], [364, 695], [377, 695], [377, 534]], [[405, 534], [405, 695], [405, 695], [405, 534]], [[419, 534], [419, 695], [419, 695], [419, 534]], [[460, 534], [460, 695], [487, 695], [487, 534]], [[514, 534], [514, 695], [528, 695], [528, 534]], [[555, 534], [555, 695], [555, 695], [555, 534]], [[569, 534], [569, 695], [583, 695], [583, 534]], [[610, 534], [610, 695], [624, 695], [624, 534]], [[665, 534], [665, 695], [665, 695], [665, 534]], [[679, 534], [679, 695], [692, 695], [692, 534]], [[720, 534], [720, 695], [720, 695], [720, 534]], [[733, 534], [733, 695], [747, 695], [747, 534]], [[774, 534], [774, 695], [788, 695], [788, 534]], [[802, 534], [802, 695], [816, 695], [816, 534]], [[829, 534], [829, 695], [843, 695], [843, 534]], [[884, 534], [884, 695], [884, 695], [884, 534]], [[911, 534], [911, 695], [925, 695], [925, 534]], [[952, 534], [952, 695], [966, 695], [966, 534]], [[1007, 534], [1007, 695], [1007, 695], [1007, 534]], [[1048, 534], [1048, 695], [1048, 695], [1048, 534]], [[1089, 534], [1089, 695], [1103, 695], [1103, 534]], [[1144, 534], [1144, 695], [1144, 695], [1144, 534]], [[1185, 534], [1185, 695], [1185, 695], [1185, 534]], [[1240, 534], [1240, 695], [1240, 695], [1240, 534]], [[1295, 534], [1295, 695], [1295, 695], [1295, 534]], [[1363, 534], [1363, 695], [1377, 695], [1377, 534]], [[1391, 534], [1391, 695], [1404, 695], [1404, 534]], [[1418, 534], [1418, 695], [1432, 695], [1432, 534]], [[1473, 534], [1473, 695], [1486, 695], [1486, 534]], [[1500, 534], [1500, 695], [1500, 695], [1500, 534]], [[1514, 534], [1514, 695], [1514, 695], [1514, 534]], [[1568, 534], [1568, 695], [1582, 695], [1582, 534]], [[1596, 534], [1596, 695], [1623, 695], [1623, 534]], [[1651, 534], [1651, 695], [1664, 695], [1664, 534]], [[1692, 534], [1692, 695], [1705, 695], [1705, 534]], [[1760, 534], [1760, 695], [1774, 695], [1774, 534]], [[1815, 534], [1815, 695], [1829, 695], [1829, 534]], [[1842, 534], [1842, 695], [1856, 695], [1856, 534]], [[1870, 534], [1870, 695], [1870, 695], [1870, 534]], [[1883, 534], [1883, 695], [1883, 695], [1883, 534]], [[1924, 534], [1924, 695], [1952, 695], [1952, 534]], [[2034, 534], [2034, 695], [2034, 695], [2034, 534]], [[2075, 534], [2075, 695], [2075, 695], [2075, 534]], [[2130, 534], [2130, 695], [2143, 695], [2143, 534]], [[2171, 534], [2171, 695], [2185, 695], [2185, 534]], [[2226, 534], [2226, 695], [2226, 695], [2226, 534]], [[2308, 534], [2308, 695], [2308, 695], [2308, 534]], [[2363, 534], [2363, 695], [2363, 695], [2363, 534]], [[2431, 534], [2431, 695], [2431, 695], [2431, 534]], [[2458, 534], [2458, 695], [2472, 695], [2472, 534]], [[2527, 534], [2527, 695], [2527, 695], [2527, 534]], [[2582, 534], [2582, 695], [2582, 695], [2582, 534]], [[2609, 534], [2609, 695], [2623, 695], [2623, 534]], [[2650, 534], [2650, 695], [2650, 695], [2650, 534]], [[2664, 534], [2664, 695], [2677, 695], [2677, 534]], [[2705, 534], [2705, 695], [2705, 695], [2705, 534]], [[2732, 534], [2732, 695], [2746, 695], [2746, 534]], [[2787, 534], [2787, 695], [2787, 695], [2787, 534]], [[2828, 534], [2828, 695], [2828, 695], [2828, 534]], [[2842, 534], [2842, 695], [2855, 695], [2855, 534]], [[2869, 534], [2869, 695], [2869, 695], [2869, 534]], [[2883, 534], [2883, 695], [2896, 695], [2896, 534]], [[2938, 534], [2938, 695], [2938, 695], [2938, 534]], [[2992, 534], [2992, 695], [2992, 695], [2992, 534]], [[3033, 534], [3033, 695], [3033, 695], [3033, 534]], [[3061, 534], [3061, 695], [3074, 695], [3074, 534]], [[3102, 534], [3102, 695], [3129, 695], [3129, 534]], [[3143, 534], [3143, 695], [3157, 695], [3157, 534]], [[3170, 534], [3170, 695], [3170, 695], [3170, 534]]], "confidences": [0.9985698461532593, 0.9999438524246216, 0.9994581341743469, 0.9928075075149536, 0.9999692440032959, 0.9775535464286804, 0.9994893074035645, 0.9992764592170715, 0.9999681711196899, 0.999976634979248, 0.5837891101837158, 0.9994819760322571, 0.9999487400054932, 0.6378462314605713, 0.9995593428611755, 0.9997476935386658, 0.9998375177383423, 0.9999092817306519, 0.9706422686576843, 0.9981306195259094, 0.999731719493866, 0.9984344840049744, 0.9999045133590698, 0.9998281002044678, 0.9965876340866089, 0.9981406927108765, 0.9998824596405029, 0.9994693398475647, 0.9985535740852356, 0.9371808171272278, 0.9999727010726929, 0.9998328685760498, 0.9986041188240051, 0.9998788833618164, 0.9969847798347473, 0.9979107975959778, 0.9678859114646912, 0.9965589642524719, 0.9958305954933167, 0.856151819229126, 0.9174501299858093, 0.977839469909668, 0.9722991585731506, 0.999629020690918, 0.9988741278648376, 0.5952739119529724, 0.8313284516334534, 0.6637697815895081, 0.9957481026649475, 0.9997797608375549, 0.99960857629776, 0.6831809282302856, 0.9987292885780334, 0.9998849630355835, 0.9514357447624207, 0.9951800107955933, 0.9758328795433044, 0.9967122077941895, 0.7513812184333801, 0.9999700784683228, 0.9964326620101929, 0.9970759153366089, 0.9622002243995667, 0.7601332068443298, 0.9990935325622559, 0.9990278482437134, 0.9987155199050903, 0.9829656481742859, 0.6010854244232178], "line": {"id": "38c5c359-ee24-49b1-916a-232a74148c17", "bbox": [350, 534, 3184, 695], "type": "bbox"}}, {"prediction": "\u0647\u064a\u062f\u064a \u0646\u064a\u0628 \u0644\u062b\u0645 \u0627\u0644\u0641 \u0646\u064a\u0637\u0642\u064a \u0646\u0628 \u0649\u0644\u0639 \u0631\u0627\u0636\u062d\u0627\u0628 \u062a\u0642\u0648\u0644\u0627 \u064a\u0641 \u0630\u0641\u0646\u0627\u0648 \u0647\u0633\u0641\u0646 \u062a\u0642\u0647\u0632\u0654\u0627 \u0644\u0648\u0642\u062a \u0627\u0645\u0643 \u0645\u0627\u0644\u0627", "cuts": [[[349, 703], [349, 875], [362, 875], [362, 703]], [[389, 703], [389, 875], [389, 875], [389, 703]], [[428, 703], [428, 875], [441, 875], [441, 703]], [[455, 703], [455, 875], [468, 875], [468, 703]], [[481, 703], [481, 875], [494, 875], [494, 703]], [[534, 703], [534, 875], [547, 875], [547, 703]], [[560, 703], [560, 875], [560, 875], [560, 703]], [[586, 703], [586, 875], [586, 875], [586, 703]], [[613, 703], [613, 875], [626, 875], [626, 703]], [[666, 703], [666, 875], [679, 875], [679, 703]], [[705, 703], [705, 875], [705, 875], [705, 703]], [[731, 703], [731, 875], [731, 875], [731, 703]], [[758, 703], [758, 875], [771, 875], [771, 703]], [[797, 703], [797, 875], [797, 875], [797, 703]], [[837, 703], [837, 875], [837, 875], [837, 703]], [[863, 703], [863, 875], [863, 875], [863, 703]], [[890, 703], [890, 875], [903, 875], [903, 703]], [[956, 703], [956, 875], [956, 875], [956, 703]], [[982, 703], [982, 875], [982, 875], [982, 703]], [[1008, 703], [1008, 875], [1022, 875], [1022, 703]], [[1074, 703], [1074, 875], [1074, 875], [1074, 703]], [[1101, 703], [1101, 875], [1101, 875], [1101, 703]], [[1127, 703], [1127, 875], [1140, 875], [1140, 703]], [[1180, 703], [1180, 875], [1193, 875], [1193, 703]], [[1206, 703], [1206, 875], [1219, 875], [1219, 703]], [[1233, 703], [1233, 875], [1246, 875], [1246, 703]], [[1312, 703], [1312, 875], [1312, 875], [1312, 703]], [[1325, 703], [1325, 875], [1338, 875], [1338, 703]], [[1351, 703], [1351, 875], [1351, 875], [1351, 703]], [[1391, 703], [1391, 875], [1404, 875], [1404, 703]], [[1444, 703], [1444, 875], [1444, 875], [1444, 703]], [[1470, 703], [1470, 875], [1483, 875], [1483, 703]], [[1509, 703], [1509, 875], [1523, 875], [1523, 703]], [[1575, 703], [1575, 875], [1589, 875], [1589, 703]], [[1628, 703], [1628, 875], [1641, 875], [1641, 703]], [[1655, 703], [1655, 875], [1655, 875], [1655, 703]], [[1681, 703], [1681, 875], [1694, 875], [1694, 703]], [[1747, 703], [1747, 875], [1747, 875], [1747, 703]], [[1800, 703], [1800, 875], [1800, 875], [1800, 703]], [[1839, 703], [1839, 875], [1852, 875], [1852, 703]], [[1865, 703], [1865, 875], [1879, 875], [1879, 703]], [[1892, 703], [1892, 875], [1905, 875], [1905, 703]], [[1918, 703], [1918, 875], [1918, 875], [1918, 703]], [[1958, 703], [1958, 875], [1958, 875], [1958, 703]], [[1971, 703], [1971, 875], [1971, 875], [1971, 703]], [[1997, 703], [1997, 875], [2011, 875], [2011, 703]], [[2050, 703], [2050, 875], [2050, 875], [2050, 703]], [[2090, 703], [2090, 875], [2090, 875], [2090, 703]], [[2116, 703], [2116, 875], [2116, 875], [2116, 703]], [[2156, 703], [2156, 875], [2156, 875], [2156, 703]], [[2195, 703], [2195, 875], [2208, 875], [2208, 703]], [[2222, 703], [2222, 875], [2235, 875], [2235, 703]], [[2261, 703], [2261, 875], [2261, 875], [2261, 703]], [[2301, 703], [2301, 875], [2327, 875], [2327, 703]], [[2353, 703], [2353, 875], [2367, 875], [2367, 703]], [[2380, 703], [2380, 875], [2393, 875], [2393, 703]], [[2406, 703], [2406, 875], [2419, 875], [2419, 703]], [[2472, 703], [2472, 875], [2472, 875], [2472, 703]], [[2538, 703], [2538, 875], [2538, 875], [2538, 703]], [[2564, 703], [2564, 875], [2578, 875], [2578, 703]], [[2617, 703], [2617, 875], [2630, 875], [2630, 703]], [[2643, 703], [2643, 875], [2657, 875], [2657, 703]], [[2670, 703], [2670, 875], [2670, 875], [2670, 703]], [[2683, 703], [2683, 875], [2696, 875], [2696, 703]], [[2749, 703], [2749, 875], [2749, 875], [2749, 703]], [[2789, 703], [2789, 875], [2789, 875], [2789, 703]], [[2828, 703], [2828, 875], [2828, 875], [2828, 703]], [[2854, 703], [2854, 875], [2854, 875], [2854, 703]], [[2881, 703], [2881, 875], [2894, 875], [2894, 703]], [[2907, 703], [2907, 875], [2907, 875], [2907, 703]], [[2920, 703], [2920, 875], [2934, 875], [2934, 703]], [[2947, 703], [2947, 875], [2947, 875], [2947, 703]], [[2973, 703], [2973, 875], [2986, 875], [2986, 703]], [[3065, 703], [3065, 875], [3065, 875], [3065, 703]], [[3105, 703], [3105, 875], [3118, 875], [3118, 703]], [[3131, 703], [3131, 875], [3145, 875], [3145, 703]], [[3158, 703], [3158, 875], [3171, 875], [3171, 703]]], "confidences": [0.9978576302528381, 0.9365259408950806, 0.9993323683738708, 0.9999881982803345, 0.995057225227356, 0.9951127171516418, 0.9600062966346741, 0.9987906813621521, 0.9990148544311523, 0.9999818801879883, 0.979132354259491, 0.9896356463432312, 0.9996901750564575, 0.9994376301765442, 0.9832384586334229, 0.9919760823249817, 0.9994718432426453, 0.99887615442276, 0.9999384880065918, 0.9999126195907593, 0.9968804121017456, 0.9998698234558105, 0.9996697902679443, 0.9999111890792847, 0.999935507774353, 0.9999529123306274, 0.9985625147819519, 0.9987615346908569, 0.9998716115951538, 0.9999983310699463, 0.9997947812080383, 0.9999533891677856, 0.9956774115562439, 0.9921483993530273, 0.9991742968559265, 0.8690173625946045, 0.9889227151870728, 0.990256130695343, 0.9499505758285522, 0.9942019581794739, 0.992321789264679, 0.9953250885009766, 0.9952391386032104, 0.9987290501594543, 0.9708223342895508, 0.9829660654067993, 0.998319685459137, 0.9980186223983765, 0.9733465313911438, 0.9576543569564819, 0.9972822666168213, 0.9974729418754578, 0.9998486042022705, 0.9998704195022583, 0.9851626753807068, 0.999782145023346, 0.9982467889785767, 0.5265796780586243, 0.9982032775878906, 0.9953908920288086, 0.9945998191833496, 0.9988899827003479, 0.932214617729187, 0.9992570281028748, 0.9942938685417175, 0.9976638555526733, 0.8540834784507751, 0.999862551689148, 0.999956488609314, 0.5673943161964417, 0.9989564418792725, 0.996831476688385, 0.9993277788162231, 0.9955874681472778, 0.995591402053833, 0.9929797053337097, 0.9888700246810913], "line": {"id": "a0cfd45b-cfc3-4068-ac25-417781cf2437", "bbox": [349, 703, 3171, 875], "type": "bbox"}}, {"prediction": "\u0645\u0648\u062a\u062e\u0645 \u0637\u0641\u0633 \u064a\u0641 \u0649\u062f\u0646\u0639 \u0646\u064a\u0646\u0645\u0654\u0648\u0645\u0644\u0627 \u0631\u064a\u0645\u0654\u0627\u064a \u0649\u0647 \u0644\u0627\u0642 \u0627\u0647\u0628 \u0643\u062a\u0648\u0633\u0643 \u0649\u062a\u0644\u0627 \u0629\u0639\u0631\u0627\u062f\u0644\u0627 \u0644\u0639\u0641 \u0627\u0645 \u0647\u0644 \u0644\u0627\u0642", "cuts": [[[347, 875], [347, 1045], [360, 1045], [360, 875]], [[414, 875], [414, 1045], [414, 1045], [414, 875]], [[454, 875], [454, 1045], [467, 1045], [467, 875]], [[480, 875], [480, 1045], [480, 1045], [480, 875]], [[494, 875], [494, 1045], [494, 1045], [494, 875]], [[534, 875], [534, 1045], [534, 1045], [534, 875]], [[574, 875], [574, 1045], [574, 1045], [574, 875]], [[641, 875], [641, 1045], [641, 1045], [641, 875]], [[681, 875], [681, 1045], [694, 1045], [694, 875]], [[721, 875], [721, 1045], [721, 1045], [721, 875]], [[761, 875], [761, 1045], [761, 1045], [761, 875]], [[774, 875], [774, 1045], [774, 1045], [774, 875]], [[801, 875], [801, 1045], [814, 1045], [814, 875]], [[854, 875], [854, 1045], [854, 1045], [854, 875]], [[921, 875], [921, 1045], [921, 1045], [921, 875]], [[948, 875], [948, 1045], [948, 1045], [948, 875]], [[974, 875], [974, 1045], [974, 1045], [974, 875]], [[1014, 875], [1014, 1045], [1028, 1045], [1028, 875]], [[1054, 875], [1054, 1045], [1068, 1045], [1068, 875]], [[1081, 875], [1081, 1045], [1094, 1045], [1094, 875]], [[1121, 875], [1121, 1045], [1121, 1045], [1121, 875]], [[1148, 875], [1148, 1045], [1161, 1045], [1161, 875]], [[1201, 875], [1201, 1045], [1201, 1045], [1201, 875]], [[1214, 875], [1214, 1045], [1214, 1045], [1214, 875]], [[1228, 875], [1228, 1045], [1228, 1045], [1228, 875]], [[1241, 875], [1241, 1045], [1255, 1045], [1255, 875]], [[1268, 875], [1268, 1045], [1281, 1045], [1281, 875]], [[1295, 875], [1295, 1045], [1295, 1045], [1295, 875]], [[1335, 875], [1335, 1045], [1348, 1045], [1348, 875]], [[1361, 875], [1361, 1045], [1361, 1045], [1361, 875]], [[1388, 875], [1388, 1045], [1401, 1045], [1401, 875]], [[1415, 875], [1415, 1045], [1428, 1045], [1428, 875]], [[1441, 875], [1441, 1045], [1468, 1045], [1468, 875]], [[1481, 875], [1481, 1045], [1495, 1045], [1495, 875]], [[1508, 875], [1508, 1045], [1535, 1045], [1535, 875]], [[1602, 875], [1602, 1045], [1602, 1045], [1602, 875]], [[1615, 875], [1615, 1045], [1628, 1045], [1628, 875]], [[1655, 875], [1655, 1045], [1682, 1045], [1682, 875]], [[1735, 875], [1735, 1045], [1735, 1045], [1735, 875]], [[1748, 875], [1748, 1045], [1748, 1045], [1748, 875]], [[1775, 875], [1775, 1045], [1775, 1045], [1775, 875]], [[1802, 875], [1802, 1045], [1802, 1045], [1802, 875]], [[1828, 875], [1828, 1045], [1828, 1045], [1828, 875]], [[1882, 875], [1882, 1045], [1895, 1045], [1895, 875]], [[1922, 875], [1922, 1045], [1922, 1045], [1922, 875]], [[1948, 875], [1948, 1045], [1962, 1045], [1962, 875]], [[2015, 875], [2015, 1045], [2029, 1045], [2029, 875]], [[2082, 875], [2082, 1045], [2082, 1045], [2082, 875]], [[2122, 875], [2122, 1045], [2135, 1045], [2135, 875]], [[2175, 875], [2175, 1045], [2189, 1045], [2189, 875]], [[2242, 875], [2242, 1045], [2242, 1045], [2242, 875]], [[2295, 875], [2295, 1045], [2295, 1045], [2295, 875]], [[2336, 875], [2336, 1045], [2336, 1045], [2336, 875]], [[2349, 875], [2349, 1045], [2349, 1045], [2349, 875]], [[2362, 875], [2362, 1045], [2376, 1045], [2376, 875]], [[2389, 875], [2389, 1045], [2389, 1045], [2389, 875]], [[2402, 875], [2402, 1045], [2416, 1045], [2416, 875]], [[2429, 875], [2429, 1045], [2442, 1045], [2442, 875]], [[2456, 875], [2456, 1045], [2469, 1045], [2469, 875]], [[2522, 875], [2522, 1045], [2536, 1045], [2536, 875]], [[2549, 875], [2549, 1045], [2562, 1045], [2562, 875]], [[2589, 875], [2589, 1045], [2602, 1045], [2602, 875]], [[2629, 875], [2629, 1045], [2629, 1045], [2629, 875]], [[2642, 875], [2642, 1045], [2656, 1045], [2656, 875]], [[2669, 875], [2669, 1045], [2669, 1045], [2669, 875]], [[2776, 875], [2776, 1045], [2776, 1045], [2776, 875]], [[2803, 875], [2803, 1045], [2803, 1045], [2803, 875]], [[2843, 875], [2843, 1045], [2843, 1045], [2843, 875]], [[2869, 875], [2869, 1045], [2869, 1045], [2869, 875]], [[2896, 875], [2896, 1045], [2896, 1045], [2896, 875]], [[2923, 875], [2923, 1045], [2923, 1045], [2923, 875]], [[2963, 875], [2963, 1045], [2963, 1045], [2963, 875]], [[2989, 875], [2989, 1045], [2989, 1045], [2989, 875]], [[3016, 875], [3016, 1045], [3030, 1045], [3030, 875]], [[3043, 875], [3043, 1045], [3056, 1045], [3056, 875]], [[3123, 875], [3123, 1045], [3123, 1045], [3123, 875]], [[3136, 875], [3136, 1045], [3150, 1045], [3150, 875]], [[3163, 875], [3163, 1045], [3163, 1045], [3163, 875]]], "confidences": [0.9999685287475586, 0.7677904963493347, 0.9990272521972656, 0.9999896287918091, 0.9995161294937134, 0.9926141500473022, 0.9854110479354858, 0.9970456957817078, 0.9999581575393677, 0.9979928731918335, 0.9991545677185059, 0.9992891550064087, 0.9991033673286438, 0.9999771118164062, 0.9999916553497314, 0.6514611840248108, 0.7720828652381897, 0.9889744520187378, 0.9997015595436096, 0.9999628067016602, 0.8422739505767822, 0.9995865225791931, 0.9994408488273621, 0.9979164004325867, 0.9996676445007324, 0.9994599223136902, 0.9910250902175903, 0.9999783039093018, 0.9963022470474243, 0.6243562698364258, 0.9998552799224854, 0.9986860156059265, 0.999666690826416, 0.66583651304245, 0.9677010178565979, 0.9999728202819824, 0.9999947547912598, 0.9995187520980835, 0.9917859435081482, 0.9952231049537659, 0.988452136516571, 0.9948959946632385, 0.997393012046814, 0.984053909778595, 0.9514071345329285, 0.9919347763061523, 0.9954736828804016, 0.535146176815033, 0.9996613264083862, 0.9889037013053894, 0.9973983764648438, 0.7873133420944214, 0.814349353313446, 0.9971019625663757, 0.9976648092269897, 0.9264478087425232, 0.9916608929634094, 0.9994589686393738, 0.9972610473632812, 0.9991005659103394, 0.999413013458252, 0.9994602799415588, 0.9613319039344788, 0.9990511536598206, 0.9996521472930908, 0.7384001612663269, 0.9942810535430908, 0.9455984234809875, 0.9997734427452087, 0.9952616691589355, 0.9989475607872009, 0.9959900975227356, 0.9930391907691956, 0.9999250173568726, 0.998917818069458, 0.6285094618797302, 0.8354631662368774, 0.9813341498374939], "line": {"id": "fc8c2130-6470-4ef8-b1b9-d226bc5b64cd", "bbox": [347, 875, 3203, 1045], "type": "bbox"}}, {"prediction": "\u0627\u0647\u062a\u0644\u0628\u0642\u0648 \u0627\u0647\u0628 \u0627\u0643\u0631\u0628\u062a \u0627\u0647\u064a\u0644\u0627 \u062a\u0631\u0638\u0646\u0648 \u0637\u0641\u0633\u0644\u0627 \u062a\u062d\u062a\u0641\u0648 \u062a\u062d\u0628\u0635\u0654\u0627 \u0627\u0644\u0641 \u0627\u0647\u0628 \u062a\u0638\u0641\u062a\u062d\u0627 \u062f\u0642 \u0628\u064a\u0637 \u0647\u064a\u0641\u0648", "cuts": [[[349, 1045], [349, 1187], [362, 1187], [362, 1045]], [[375, 1045], [375, 1187], [375, 1187], [375, 1045]], [[425, 1045], [425, 1187], [425, 1187], [425, 1045]], [[451, 1045], [451, 1187], [451, 1187], [451, 1045]], [[476, 1045], [476, 1187], [476, 1187], [476, 1045]], [[502, 1045], [502, 1187], [502, 1187], [502, 1045]], [[552, 1045], [552, 1187], [565, 1187], [565, 1045]], [[578, 1045], [578, 1187], [603, 1187], [603, 1045]], [[629, 1045], [629, 1187], [641, 1187], [641, 1045]], [[692, 1045], [692, 1187], [705, 1187], [705, 1045]], [[730, 1045], [730, 1187], [730, 1187], [730, 1045]], [[756, 1045], [756, 1187], [756, 1187], [756, 1045]], [[781, 1045], [781, 1187], [781, 1187], [781, 1045]], [[794, 1045], [794, 1187], [794, 1187], [794, 1045]], [[857, 1045], [857, 1187], [857, 1187], [857, 1045]], [[870, 1045], [870, 1187], [870, 1187], [870, 1045]], [[896, 1045], [896, 1187], [896, 1187], [896, 1045]], [[921, 1045], [921, 1187], [934, 1187], [934, 1045]], [[959, 1045], [959, 1187], [972, 1187], [972, 1045]], [[984, 1045], [984, 1187], [984, 1187], [984, 1045]], [[1023, 1045], [1023, 1187], [1023, 1187], [1023, 1045]], [[1048, 1045], [1048, 1187], [1048, 1187], [1048, 1045]], [[1061, 1045], [1061, 1187], [1073, 1187], [1073, 1045]], [[1086, 1045], [1086, 1187], [1086, 1187], [1086, 1045]], [[1137, 1045], [1137, 1187], [1137, 1187], [1137, 1045]], [[1213, 1045], [1213, 1187], [1213, 1187], [1213, 1045]], [[1239, 1045], [1239, 1187], [1239, 1187], [1239, 1045]], [[1289, 1045], [1289, 1187], [1289, 1187], [1289, 1045]], [[1340, 1045], [1340, 1187], [1340, 1187], [1340, 1045]], [[1366, 1045], [1366, 1187], [1378, 1187], [1378, 1045]], [[1417, 1045], [1417, 1187], [1417, 1187], [1417, 1045]], [[1480, 1045], [1480, 1187], [1480, 1187], [1480, 1045]], [[1518, 1045], [1518, 1187], [1531, 1187], [1531, 1045]], [[1556, 1045], [1556, 1187], [1556, 1187], [1556, 1045]], [[1569, 1045], [1569, 1187], [1582, 1187], [1582, 1045]], [[1594, 1045], [1594, 1187], [1607, 1187], [1607, 1045]], [[1645, 1045], [1645, 1187], [1645, 1187], [1645, 1045]], [[1709, 1045], [1709, 1187], [1709, 1187], [1709, 1045]], [[1760, 1045], [1760, 1187], [1760, 1187], [1760, 1045]], [[1785, 1045], [1785, 1187], [1785, 1187], [1785, 1045]], [[1836, 1045], [1836, 1187], [1836, 1187], [1836, 1045]], [[1861, 1045], [1861, 1187], [1874, 1187], [1874, 1045]], [[1925, 1045], [1925, 1187], [1925, 1187], [1925, 1045]], [[1988, 1045], [1988, 1187], [1988, 1187], [1988, 1045]], [[2039, 1045], [2039, 1187], [2039, 1187], [2039, 1045]], [[2090, 1045], [2090, 1187], [2090, 1187], [2090, 1045]], [[2128, 1045], [2128, 1187], [2128, 1187], [2128, 1045]], [[2141, 1045], [2141, 1187], [2154, 1187], [2154, 1045]], [[2166, 1045], [2166, 1187], [2179, 1187], [2179, 1045]], [[2204, 1045], [2204, 1187], [2204, 1187], [2204, 1045]], [[2243, 1045], [2243, 1187], [2243, 1187], [2243, 1045]], [[2268, 1045], [2268, 1187], [2268, 1187], [2268, 1045]], [[2293, 1045], [2293, 1187], [2306, 1187], [2306, 1045]], [[2319, 1045], [2319, 1187], [2331, 1187], [2331, 1045]], [[2344, 1045], [2344, 1187], [2357, 1187], [2357, 1045]], [[2370, 1045], [2370, 1187], [2370, 1187], [2370, 1045]], [[2395, 1045], [2395, 1187], [2408, 1187], [2408, 1045]], [[2471, 1045], [2471, 1187], [2471, 1187], [2471, 1045]], [[2522, 1045], [2522, 1187], [2522, 1187], [2522, 1045]], [[2586, 1045], [2586, 1187], [2586, 1187], [2586, 1045]], [[2611, 1045], [2611, 1187], [2611, 1187], [2611, 1045]], [[2649, 1045], [2649, 1187], [2649, 1187], [2649, 1045]], [[2700, 1045], [2700, 1187], [2713, 1187], [2713, 1045]], [[2725, 1045], [2725, 1187], [2725, 1187], [2725, 1045]], [[2764, 1045], [2764, 1187], [2776, 1187], [2776, 1045]], [[2789, 1045], [2789, 1187], [2802, 1187], [2802, 1045]], [[2827, 1045], [2827, 1187], [2827, 1187], [2827, 1045]], [[2865, 1045], [2865, 1187], [2878, 1187], [2878, 1045]], [[2929, 1045], [2929, 1187], [2929, 1187], [2929, 1045]], [[2967, 1045], [2967, 1187], [2967, 1187], [2967, 1045]], [[3005, 1045], [3005, 1187], [3030, 1187], [3030, 1045]], [[3056, 1045], [3056, 1187], [3056, 1187], [3056, 1045]], [[3094, 1045], [3094, 1187], [3094, 1187], [3094, 1045]], [[3119, 1045], [3119, 1187], [3119, 1187], [3119, 1045]], [[3170, 1045], [3170, 1187], [3170, 1187], [3170, 1045]]], "confidences": [0.9951897859573364, 0.9994397759437561, 0.9996225833892822, 0.9996881484985352, 0.9991863369941711, 0.522216796875, 0.9999700784683228, 0.9999351501464844, 0.9608615040779114, 0.9998836517333984, 0.9998319149017334, 0.9999574422836304, 0.9995219707489014, 0.9832330346107483, 0.9993361830711365, 0.9289281964302063, 0.9628921747207642, 0.9998667240142822, 0.9999779462814331, 0.9990992546081543, 0.9141392707824707, 0.9998242259025574, 0.9967435002326965, 0.9999244213104248, 0.9998732805252075, 0.9988711476325989, 0.9987514019012451, 0.9988617897033691, 0.6241702437400818, 0.979806125164032, 0.9399409294128418, 0.9999160766601562, 0.9905988574028015, 0.9990541338920593, 0.9999421834945679, 0.960566520690918, 0.9946881532669067, 0.9999477863311768, 0.833644688129425, 0.9959911704063416, 0.9991551637649536, 0.9996606111526489, 0.9877347350120544, 0.9679129123687744, 0.9596376419067383, 0.986365795135498, 0.9459453225135803, 0.9946697354316711, 0.9895763397216797, 0.9849644303321838, 0.903245210647583, 0.7387762665748596, 0.9958617687225342, 0.9985413551330566, 0.9970884919166565, 0.6466483473777771, 0.9444775581359863, 0.8205862045288086, 0.9942649006843567, 0.984862744808197, 0.9972048401832581, 0.8482417464256287, 0.9919762015342712, 0.9672141671180725, 0.9989006519317627, 0.9998776912689209, 0.9994097948074341, 0.9945313334465027, 0.9889154434204102, 0.9952592253684998, 0.999559223651886, 0.99980229139328, 0.9894945025444031, 0.7909385561943054, 0.9917729496955872], "line": {"id": "355dd1af-317b-4282-b778-48a722db18de", "bbox": [349, 1045, 3183, 1187], "type": "bbox"}}, {"prediction": "\u0645\u0639\u0646 \u0644\u0627\u0642 \u0629\u0639\u0627\u0633\u0644\u0627 \u0627\u0640\u0647\u0631\u0636\u062d\u0627 \u0644\u0627\u0642\u0641 \u0643\u0644\u0630 \u0644\u062b\u0645 \u062a\u0639\u0646\u0635 \u062a\u064a\u0633\u0645\u0654\u0627 \u0627\u0644\u0643\u0648 \u0627\u0647\u0639\u0636\u0648\u0645 \u0649\u0644\u0627 \u0627\u0647\u062f\u062f\u0631\u0648", "cuts": [[[342, 1217], [342, 1386], [354, 1386], [354, 1217]], [[404, 1217], [404, 1386], [404, 1386], [404, 1217]], [[428, 1217], [428, 1386], [428, 1386], [428, 1217]], [[453, 1217], [453, 1386], [465, 1386], [465, 1217]], [[527, 1217], [527, 1386], [527, 1386], [527, 1217]], [[539, 1217], [539, 1386], [539, 1386], [539, 1217]], [[564, 1217], [564, 1386], [564, 1386], [564, 1217]], [[589, 1217], [589, 1386], [613, 1386], [613, 1217]], [[638, 1217], [638, 1386], [650, 1386], [650, 1217]], [[675, 1217], [675, 1386], [675, 1386], [675, 1217]], [[712, 1217], [712, 1386], [724, 1386], [724, 1217]], [[761, 1217], [761, 1386], [774, 1386], [774, 1217]], [[786, 1217], [786, 1386], [798, 1386], [798, 1217]], [[811, 1217], [811, 1386], [823, 1386], [823, 1217]], [[835, 1217], [835, 1386], [835, 1386], [835, 1217]], [[860, 1217], [860, 1386], [872, 1386], [872, 1217]], [[909, 1217], [909, 1386], [922, 1386], [922, 1217]], [[1020, 1217], [1020, 1386], [1020, 1386], [1020, 1217]], [[1082, 1217], [1082, 1386], [1082, 1386], [1082, 1217]], [[1119, 1217], [1119, 1386], [1131, 1386], [1131, 1217]], [[1181, 1217], [1181, 1386], [1193, 1386], [1193, 1217]], [[1242, 1217], [1242, 1386], [1255, 1386], [1255, 1217]], [[1267, 1217], [1267, 1386], [1267, 1386], [1267, 1217]], [[1329, 1217], [1329, 1386], [1341, 1386], [1341, 1217]], [[1353, 1217], [1353, 1386], [1366, 1386], [1366, 1217]], [[1390, 1217], [1390, 1386], [1390, 1386], [1390, 1217]], [[1427, 1217], [1427, 1386], [1427, 1386], [1427, 1217]], [[1452, 1217], [1452, 1386], [1452, 1386], [1452, 1217]], [[1501, 1217], [1501, 1386], [1501, 1386], [1501, 1217]], [[1551, 1217], [1551, 1386], [1563, 1386], [1563, 1217]], [[1575, 1217], [1575, 1386], [1588, 1386], [1588, 1217]], [[1612, 1217], [1612, 1386], [1625, 1386], [1625, 1217]], [[1686, 1217], [1686, 1386], [1699, 1386], [1699, 1217]], [[1711, 1217], [1711, 1386], [1723, 1386], [1723, 1217]], [[1736, 1217], [1736, 1386], [1748, 1386], [1748, 1217]], [[1773, 1217], [1773, 1386], [1785, 1386], [1785, 1217]], [[1822, 1217], [1822, 1386], [1835, 1386], [1835, 1217]], [[1884, 1217], [1884, 1386], [1884, 1386], [1884, 1217]], [[1921, 1217], [1921, 1386], [1933, 1386], [1933, 1217]], [[1970, 1217], [1970, 1386], [1983, 1386], [1983, 1217]], [[2007, 1217], [2007, 1386], [2020, 1386], [2020, 1217]], [[2069, 1217], [2069, 1386], [2069, 1386], [2069, 1217]], [[2118, 1217], [2118, 1386], [2118, 1386], [2118, 1217]], [[2155, 1217], [2155, 1386], [2168, 1386], [2168, 1217]], [[2192, 1217], [2192, 1386], [2205, 1386], [2205, 1217]], [[2217, 1217], [2217, 1386], [2229, 1386], [2229, 1217]], [[2242, 1217], [2242, 1386], [2254, 1386], [2254, 1217]], [[2266, 1217], [2266, 1386], [2279, 1386], [2279, 1217]], [[2316, 1217], [2316, 1386], [2328, 1386], [2328, 1217]], [[2353, 1217], [2353, 1386], [2365, 1386], [2365, 1217]], [[2377, 1217], [2377, 1386], [2377, 1386], [2377, 1217]], [[2439, 1217], [2439, 1386], [2439, 1386], [2439, 1217]], [[2464, 1217], [2464, 1386], [2476, 1386], [2476, 1217]], [[2501, 1217], [2501, 1386], [2501, 1386], [2501, 1217]], [[2525, 1217], [2525, 1386], [2525, 1386], [2525, 1217]], [[2575, 1217], [2575, 1386], [2575, 1386], [2575, 1217]], [[2624, 1217], [2624, 1386], [2624, 1386], [2624, 1217]], [[2698, 1217], [2698, 1386], [2698, 1386], [2698, 1217]], [[2735, 1217], [2735, 1386], [2735, 1386], [2735, 1217]], [[2760, 1217], [2760, 1386], [2772, 1386], [2772, 1217]], [[2821, 1217], [2821, 1386], [2821, 1386], [2821, 1217]], [[2834, 1217], [2834, 1386], [2834, 1386], [2834, 1217]], [[2858, 1217], [2858, 1386], [2858, 1386], [2858, 1217]], [[2871, 1217], [2871, 1386], [2895, 1386], [2895, 1217]], [[2932, 1217], [2932, 1386], [2932, 1386], [2932, 1217]], [[2957, 1217], [2957, 1386], [2957, 1386], [2957, 1217]], [[3019, 1217], [3019, 1386], [3019, 1386], [3019, 1217]], [[3056, 1217], [3056, 1386], [3056, 1386], [3056, 1217]], [[3105, 1217], [3105, 1386], [3105, 1386], [3105, 1217]], [[3154, 1217], [3154, 1386], [3167, 1386], [3167, 1217]]], "confidences": [0.9998668432235718, 0.9939495325088501, 0.9999988079071045, 0.9995810389518738, 0.9973961114883423, 0.9925320744514465, 0.9987910389900208, 0.9998966455459595, 0.9999004602432251, 0.981810450553894, 0.99687659740448, 0.9998045563697815, 0.9998052716255188, 0.9931424856185913, 0.9988383650779724, 0.9999014139175415, 0.8104275465011597, 0.9999496936798096, 0.9994741082191467, 0.9992212057113647, 0.9998238682746887, 0.9998308420181274, 0.9993120431900024, 0.998877227306366, 0.999991774559021, 0.9525014758110046, 0.9995104074478149, 0.9983181953430176, 0.9150962829589844, 0.9546083807945251, 0.9991251826286316, 0.9999608993530273, 0.9821158647537231, 0.9985532164573669, 0.9999796152114868, 0.9997883439064026, 0.9903550148010254, 0.9928650856018066, 0.9961369633674622, 0.9909413456916809, 0.9947617650032043, 0.9631214737892151, 0.9943027496337891, 0.9706187844276428, 0.998685896396637, 0.9429393410682678, 0.9975836277008057, 0.9990416169166565, 0.9978206157684326, 0.9992419481277466, 0.9985764026641846, 0.9849389791488647, 0.9799551367759705, 0.9954046010971069, 0.9584742784500122, 0.9991908669471741, 0.994751513004303, 0.9992371797561646, 0.8995857834815979, 0.99809330701828, 0.999932050704956, 0.8690654039382935, 0.5987728834152222, 0.9988412261009216, 0.6917583346366882, 0.9999560117721558, 0.904447615146637, 0.9634166955947876, 0.9973717927932739, 0.9989099502563477], "line": {"id": "309303ba-7ddf-4f08-bb5f-8487c14139dc", "bbox": [342, 1217, 3179, 1386], "type": "bbox"}}, {"prediction": "\u0630\u0640\u062e\u0646 \u0649\u0631\u0627\u062f \u0646\u0645 \u0646\u0627\u0644\u0641\u0644\u0627 \u062a\u064a\u0628\u0644\u0627 \u0649\u0644\u0627 \u0636\u0645\u0627 \u0647\u0644 \u0644\u0627\u0642\u0641 \u0647\u0645\u062f\u062e \u0636\u0639\u0628 \u0649\u0639\u062f\u062a\u0633\u0627\u0642 \u0646\u064a\u0646\u0645\u0654\u0648\u0645\u0644\u0627 \u0631\u064a\u0645\u0654\u0627\u0627\u064a", "cuts": [[[363, 1386], [363, 1518], [363, 1518], [363, 1386]], [[413, 1386], [413, 1518], [426, 1518], [426, 1386]], [[514, 1386], [514, 1518], [514, 1518], [514, 1386]], [[551, 1386], [551, 1518], [551, 1518], [551, 1386]], [[564, 1386], [564, 1518], [589, 1518], [589, 1386]], [[652, 1386], [652, 1518], [652, 1518], [652, 1386]], [[702, 1386], [702, 1518], [715, 1518], [715, 1386]], [[740, 1386], [740, 1518], [752, 1518], [752, 1386]], [[765, 1386], [765, 1518], [777, 1518], [777, 1386]], [[802, 1386], [802, 1518], [815, 1518], [815, 1386]], [[865, 1386], [865, 1518], [865, 1518], [865, 1386]], [[903, 1386], [903, 1518], [903, 1518], [903, 1386]], [[928, 1386], [928, 1518], [940, 1518], [940, 1386]], [[991, 1386], [991, 1518], [991, 1518], [991, 1386]], [[1041, 1386], [1041, 1518], [1053, 1518], [1053, 1386]], [[1066, 1386], [1066, 1518], [1078, 1518], [1078, 1386]], [[1116, 1386], [1116, 1518], [1116, 1518], [1116, 1386]], [[1141, 1386], [1141, 1518], [1141, 1518], [1141, 1386]], [[1154, 1386], [1154, 1518], [1166, 1518], [1166, 1386]], [[1179, 1386], [1179, 1518], [1191, 1518], [1191, 1386]], [[1229, 1386], [1229, 1518], [1229, 1518], [1229, 1386]], [[1279, 1386], [1279, 1518], [1279, 1518], [1279, 1386]], [[1304, 1386], [1304, 1518], [1304, 1518], [1304, 1386]], [[1329, 1386], [1329, 1518], [1342, 1518], [1342, 1386]], [[1354, 1386], [1354, 1518], [1354, 1518], [1354, 1386]], [[1367, 1386], [1367, 1518], [1380, 1518], [1380, 1386]], [[1417, 1386], [1417, 1518], [1417, 1518], [1417, 1386]], [[1430, 1386], [1430, 1518], [1442, 1518], [1442, 1386]], [[1455, 1386], [1455, 1518], [1467, 1518], [1467, 1386]], [[1480, 1386], [1480, 1518], [1480, 1518], [1480, 1386]], [[1568, 1386], [1568, 1518], [1568, 1518], [1568, 1386]], [[1618, 1386], [1618, 1518], [1631, 1518], [1631, 1386]], [[1668, 1386], [1668, 1518], [1668, 1518], [1668, 1386]], [[1681, 1386], [1681, 1518], [1693, 1518], [1693, 1386]], [[1731, 1386], [1731, 1518], [1743, 1518], [1743, 1386]], [[1769, 1386], [1769, 1518], [1769, 1518], [1769, 1386]], [[1781, 1386], [1781, 1518], [1794, 1518], [1794, 1386]], [[1844, 1386], [1844, 1518], [1844, 1518], [1844, 1386]], [[1869, 1386], [1869, 1518], [1869, 1518], [1869, 1386]], [[1907, 1386], [1907, 1518], [1907, 1518], [1907, 1386]], [[1932, 1386], [1932, 1518], [1932, 1518], [1932, 1386]], [[1957, 1386], [1957, 1518], [1969, 1518], [1969, 1386]], [[1982, 1386], [1982, 1518], [1994, 1518], [1994, 1386]], [[2032, 1386], [2032, 1518], [2032, 1518], [2032, 1386]], [[2082, 1386], [2082, 1518], [2082, 1518], [2082, 1386]], [[2120, 1386], [2120, 1518], [2132, 1518], [2132, 1386]], [[2158, 1386], [2158, 1518], [2170, 1518], [2170, 1386]], [[2245, 1386], [2245, 1518], [2258, 1518], [2258, 1386]], [[2296, 1386], [2296, 1518], [2308, 1518], [2308, 1386]], [[2333, 1386], [2333, 1518], [2333, 1518], [2333, 1386]], [[2358, 1386], [2358, 1518], [2371, 1518], [2371, 1386]], [[2421, 1386], [2421, 1518], [2434, 1518], [2434, 1386]], [[2459, 1386], [2459, 1518], [2459, 1518], [2459, 1386]], [[2521, 1386], [2521, 1518], [2521, 1518], [2521, 1386]], [[2546, 1386], [2546, 1518], [2546, 1518], [2546, 1386]], [[2597, 1386], [2597, 1518], [2597, 1518], [2597, 1386]], [[2622, 1386], [2622, 1518], [2634, 1518], [2634, 1386]], [[2647, 1386], [2647, 1518], [2647, 1518], [2647, 1386]], [[2672, 1386], [2672, 1518], [2697, 1518], [2697, 1386]], [[2735, 1386], [2735, 1518], [2747, 1518], [2747, 1386]], [[2772, 1386], [2772, 1518], [2772, 1518], [2772, 1386]], [[2797, 1386], [2797, 1518], [2810, 1518], [2810, 1386]], [[2835, 1386], [2835, 1518], [2835, 1518], [2835, 1386]], [[2873, 1386], [2873, 1518], [2873, 1518], [2873, 1386]], [[2885, 1386], [2885, 1518], [2898, 1518], [2898, 1386]], [[2910, 1386], [2910, 1518], [2910, 1518], [2910, 1386]], [[2923, 1386], [2923, 1518], [2923, 1518], [2923, 1386]], [[2948, 1386], [2948, 1518], [2961, 1518], [2961, 1386]], [[2973, 1386], [2973, 1518], [2973, 1518], [2973, 1386]], [[3011, 1386], [3011, 1518], [3023, 1518], [3023, 1386]], [[3036, 1386], [3036, 1518], [3036, 1518], [3036, 1386]], [[3073, 1386], [3073, 1518], [3073, 1518], [3073, 1386]], [[3099, 1386], [3099, 1518], [3099, 1518], [3099, 1386]], [[3111, 1386], [3111, 1518], [3111, 1518], [3111, 1386]], [[3136, 1386], [3136, 1518], [3149, 1518], [3149, 1386]], [[3161, 1386], [3161, 1518], [3161, 1518], [3161, 1386]]], "confidences": [0.9999401569366455, 0.9998226761817932, 0.9994499087333679, 0.9997947812080383, 0.9999337196350098, 0.9999203681945801, 0.9999982118606567, 0.9687603116035461, 0.9988839030265808, 0.998324453830719, 0.9755439758300781, 0.9999986886978149, 0.9999879598617554, 0.9918851852416992, 0.8710991144180298, 0.9998831748962402, 0.9799282550811768, 0.9640147686004639, 0.9995965361595154, 0.9998983144760132, 0.9994907379150391, 0.9999008178710938, 0.9999949932098389, 0.9999257326126099, 0.9849360585212708, 0.9992073178291321, 0.9999591112136841, 0.9999978542327881, 0.9979308843612671, 0.9989111423492432, 0.9988147020339966, 0.999931812286377, 0.9295510649681091, 0.9994879961013794, 0.92276930809021, 0.9905250668525696, 0.9945216178894043, 0.997312605381012, 0.9944058656692505, 0.7167887091636658, 0.9777094125747681, 0.9938310384750366, 0.9831866025924683, 0.9466024041175842, 0.9909795522689819, 0.9944062232971191, 0.9905561804771423, 0.9995214939117432, 0.9992606043815613, 0.9838502407073975, 0.9978698492050171, 0.9995675683021545, 0.9971568584442139, 0.9990284442901611, 0.9905042052268982, 0.9607644081115723, 0.9984911680221558, 0.7474943399429321, 0.9998549222946167, 0.9999047517776489, 0.9814210534095764, 0.9995946288108826, 0.999559223651886, 0.9958802461624146, 0.9985283613204956, 0.9995490908622742, 0.9966185092926025, 0.9981649518013, 0.8663971424102783, 0.9913069605827332, 0.9690742492675781, 0.9696444869041443, 0.9100111126899719, 0.9691933393478394, 0.9827510714530945, 0.9762600064277649], "line": {"id": "418e5e37-02e7-45d7-8862-21caf565b075", "bbox": [338, 1386, 3174, 1518], "type": "bbox"}}, {"prediction": "\u062b\u0628\u0644\u064a \u0645\u0644\u0641 \u0647\u0645\u062a\u062e\u0628 \u0647\u064a\u0641 \u0649\u0630\u0644\u0627 \u0637\u0641\u0633\u0644\u0627\u0628 \u0649\u0646\u0654\u064a\u062c\u0644 \u0641\u0627\u0644\u0641\u0644\u0627 \u0642\u0648\u062f\u0646\u0635\u0644\u0627 \u062d\u062a\u0641\u0627 \u0645\u062b \u0647\u062d\u062a\u0641\u0627\u0648 \u064a\u0641\u0632\u0627\u062e \u0646\u0645 \u0647\u062d\u0627\u062a\u0641\u0645", "cuts": [[[361, 1567], [361, 1720], [361, 1720], [361, 1567]], [[413, 1567], [413, 1720], [413, 1720], [413, 1567]], [[439, 1567], [439, 1720], [439, 1720], [439, 1567]], [[465, 1567], [465, 1720], [465, 1720], [465, 1567]], [[491, 1567], [491, 1720], [504, 1720], [504, 1567]], [[517, 1567], [517, 1720], [530, 1720], [530, 1567]], [[543, 1567], [543, 1720], [543, 1720], [543, 1567]], [[556, 1567], [556, 1720], [569, 1720], [569, 1567]], [[582, 1567], [582, 1720], [595, 1720], [595, 1567]], [[621, 1567], [621, 1720], [621, 1720], [621, 1567]], [[660, 1567], [660, 1720], [660, 1720], [660, 1567]], [[699, 1567], [699, 1720], [699, 1720], [699, 1567]], [[725, 1567], [725, 1720], [725, 1720], [725, 1567]], [[764, 1567], [764, 1720], [764, 1720], [764, 1567]], [[777, 1567], [777, 1720], [790, 1720], [790, 1567]], [[816, 1567], [816, 1720], [816, 1720], [816, 1567]], [[855, 1567], [855, 1720], [855, 1720], [855, 1567]], [[881, 1567], [881, 1720], [881, 1720], [881, 1567]], [[907, 1567], [907, 1720], [920, 1720], [920, 1567]], [[972, 1567], [972, 1720], [972, 1720], [972, 1567]], [[1024, 1567], [1024, 1720], [1024, 1720], [1024, 1567]], [[1051, 1567], [1051, 1720], [1051, 1720], [1051, 1567]], [[1077, 1567], [1077, 1720], [1077, 1720], [1077, 1567]], [[1090, 1567], [1090, 1720], [1103, 1720], [1103, 1567]], [[1142, 1567], [1142, 1720], [1155, 1720], [1155, 1567]], [[1207, 1567], [1207, 1720], [1207, 1720], [1207, 1567]], [[1259, 1567], [1259, 1720], [1272, 1720], [1272, 1567]], [[1298, 1567], [1298, 1720], [1311, 1720], [1311, 1567]], [[1324, 1567], [1324, 1720], [1337, 1720], [1337, 1567]], [[1350, 1567], [1350, 1720], [1350, 1720], [1350, 1567]], [[1363, 1567], [1363, 1720], [1376, 1720], [1376, 1567]], [[1415, 1567], [1415, 1720], [1415, 1720], [1415, 1567]], [[1428, 1567], [1428, 1720], [1441, 1720], [1441, 1567]], [[1454, 1567], [1454, 1720], [1454, 1720], [1454, 1567]], [[1467, 1567], [1467, 1720], [1467, 1720], [1467, 1567]], [[1493, 1567], [1493, 1720], [1506, 1720], [1506, 1567]], [[1519, 1567], [1519, 1720], [1519, 1720], [1519, 1567]], [[1545, 1567], [1545, 1720], [1558, 1720], [1558, 1567]], [[1597, 1567], [1597, 1720], [1597, 1720], [1597, 1567]], [[1636, 1567], [1636, 1720], [1662, 1720], [1662, 1567]], [[1675, 1567], [1675, 1720], [1675, 1720], [1675, 1567]], [[1714, 1567], [1714, 1720], [1714, 1720], [1714, 1567]], [[1740, 1567], [1740, 1720], [1740, 1720], [1740, 1567]], [[1753, 1567], [1753, 1720], [1753, 1720], [1753, 1567]], [[1766, 1567], [1766, 1720], [1779, 1720], [1779, 1567]], [[1831, 1567], [1831, 1720], [1831, 1720], [1831, 1567]], [[1883, 1567], [1883, 1720], [1883, 1720], [1883, 1567]], [[1935, 1567], [1935, 1720], [1935, 1720], [1935, 1567]], [[1961, 1567], [1961, 1720], [1961, 1720], [1961, 1567]], [[2013, 1567], [2013, 1720], [2013, 1720], [2013, 1567]], [[2052, 1567], [2052, 1720], [2052, 1720], [2052, 1567]], [[2065, 1567], [2065, 1720], [2078, 1720], [2078, 1567]], [[2091, 1567], [2091, 1720], [2104, 1720], [2104, 1567]], [[2130, 1567], [2130, 1720], [2130, 1720], [2130, 1567]], [[2182, 1567], [2182, 1720], [2182, 1720], [2182, 1567]], [[2208, 1567], [2208, 1720], [2208, 1720], [2208, 1567]], [[2234, 1567], [2234, 1720], [2247, 1720], [2247, 1567]], [[2260, 1567], [2260, 1720], [2260, 1720], [2260, 1567]], [[2286, 1567], [2286, 1720], [2299, 1720], [2299, 1567]], [[2338, 1567], [2338, 1720], [2338, 1720], [2338, 1567]], [[2364, 1567], [2364, 1720], [2377, 1720], [2377, 1567]], [[2390, 1567], [2390, 1720], [2390, 1720], [2390, 1567]], [[2429, 1567], [2429, 1720], [2429, 1720], [2429, 1567]], [[2482, 1567], [2482, 1720], [2482, 1720], [2482, 1567]], [[2508, 1567], [2508, 1720], [2508, 1720], [2508, 1567]], [[2534, 1567], [2534, 1720], [2534, 1720], [2534, 1567]], [[2586, 1567], [2586, 1720], [2586, 1720], [2586, 1567]], [[2612, 1567], [2612, 1720], [2625, 1720], [2625, 1567]], [[2651, 1567], [2651, 1720], [2651, 1720], [2651, 1567]], [[2664, 1567], [2664, 1720], [2664, 1720], [2664, 1567]], [[2716, 1567], [2716, 1720], [2716, 1720], [2716, 1567]], [[2742, 1567], [2742, 1720], [2742, 1720], [2742, 1567]], [[2768, 1567], [2768, 1720], [2781, 1720], [2781, 1567]], [[2807, 1567], [2807, 1720], [2820, 1720], [2820, 1567]], [[2859, 1567], [2859, 1720], [2859, 1720], [2859, 1567]], [[2898, 1567], [2898, 1720], [2898, 1720], [2898, 1567]], [[2924, 1567], [2924, 1720], [2937, 1720], [2937, 1567]], [[2963, 1567], [2963, 1720], [2963, 1720], [2963, 1567]], [[3002, 1567], [3002, 1720], [3002, 1720], [3002, 1567]], [[3054, 1567], [3054, 1720], [3054, 1720], [3054, 1567]], [[3080, 1567], [3080, 1720], [3080, 1720], [3080, 1567]], [[3119, 1567], [3119, 1720], [3119, 1720], [3119, 1567]], [[3145, 1567], [3145, 1720], [3158, 1720], [3158, 1567]]], "confidences": [0.9997847676277161, 0.8071998953819275, 0.9448097944259644, 0.5688155293464661, 0.9998739957809448, 0.9982267022132874, 0.9191160798072815, 0.9526958465576172, 0.999830961227417, 0.9999995231628418, 0.9993177652359009, 0.7347162365913391, 0.9999439716339111, 0.9998359680175781, 0.9999669790267944, 0.9836472868919373, 0.7263768315315247, 0.9997736811637878, 0.977462887763977, 0.9863080382347107, 0.9985411167144775, 0.9811128377914429, 0.8683425784111023, 0.9999358654022217, 0.9999024868011475, 0.9963384866714478, 0.9992992877960205, 0.9999573230743408, 0.9997846484184265, 0.9697093963623047, 0.9807730913162231, 0.9946768283843994, 0.9997909665107727, 0.9734904170036316, 0.9997913241386414, 0.998504638671875, 0.9990155696868896, 0.9989411234855652, 0.54173743724823, 0.9961016178131104, 0.9981348514556885, 0.9947880506515503, 0.9791303277015686, 0.9969891905784607, 0.9995549321174622, 0.8724766969680786, 0.9847140908241272, 0.9845319390296936, 0.9821130037307739, 0.9790477156639099, 0.838432252407074, 0.8714025616645813, 0.9906243681907654, 0.9986967444419861, 0.9988054037094116, 0.9993483424186707, 0.9957486987113953, 0.8649066090583801, 0.9977350234985352, 0.9995262622833252, 0.9965477585792542, 0.9975600242614746, 0.8291054368019104, 0.9957834482192993, 0.9864495396614075, 0.9921678900718689, 0.9627065658569336, 0.9999135732650757, 0.95207279920578, 0.9991065859794617, 0.9793131947517395, 0.8521793484687805, 0.9974838495254517, 0.9999358654022217, 0.9997324347496033, 0.9997784495353699, 0.9984983205795288, 0.9993114471435547, 0.8725327849388123, 0.9996665716171265, 0.9979007244110107, 0.9954906105995178, 0.9731282591819763], "line": {"id": "54a56c8d-b064-49ff-bda6-5fc0cd5ecec7", "bbox": [335, 1567, 3171, 1720], "type": "bbox"}}, {"prediction": "\u0647\u0640\u062d\u062a\u0641\u0648 \u0647\u0645\u062a\u062e \u0631\u0633\u0643\u0628 \u0631\u0645\u0654\u0627\u0641 \u062f\u064a\u0634\u0631\u0644\u0627 \u0649\u062f\u064a \u0646\u064a\u0628 \u0639\u0636\u0648\u0641 \u0627\u0645\u0648\u062a\u062d\u0645 \u0637\u0641\u0633\u0644\u0627\u0628 \u0621\u0627\u062c \u0646\u0627 \u0645\u0627\u0644\u063a\u0644\u0627", "cuts": [[[332, 1721], [332, 1880], [345, 1880], [345, 1721]], [[384, 1721], [384, 1880], [397, 1880], [397, 1721]], [[501, 1721], [501, 1880], [514, 1880], [514, 1721]], [[553, 1721], [553, 1880], [553, 1880], [553, 1721]], [[579, 1721], [579, 1880], [579, 1880], [579, 1721]], [[631, 1721], [631, 1880], [644, 1880], [644, 1721]], [[657, 1721], [657, 1880], [683, 1880], [683, 1721]], [[709, 1721], [709, 1880], [709, 1880], [709, 1721]], [[748, 1721], [748, 1880], [748, 1880], [748, 1721]], [[787, 1721], [787, 1880], [787, 1880], [787, 1721]], [[826, 1721], [826, 1880], [826, 1880], [826, 1721]], [[865, 1721], [865, 1880], [878, 1880], [878, 1721]], [[917, 1721], [917, 1880], [917, 1880], [917, 1721]], [[956, 1721], [956, 1880], [969, 1880], [969, 1721]], [[1021, 1721], [1021, 1880], [1021, 1880], [1021, 1721]], [[1100, 1721], [1100, 1880], [1100, 1880], [1100, 1721]], [[1126, 1721], [1126, 1880], [1139, 1880], [1139, 1721]], [[1178, 1721], [1178, 1880], [1191, 1880], [1191, 1721]], [[1217, 1721], [1217, 1880], [1217, 1880], [1217, 1721]], [[1243, 1721], [1243, 1880], [1243, 1880], [1243, 1721]], [[1256, 1721], [1256, 1880], [1269, 1880], [1269, 1721]], [[1282, 1721], [1282, 1880], [1282, 1880], [1282, 1721]], [[1308, 1721], [1308, 1880], [1321, 1880], [1321, 1721]], [[1373, 1721], [1373, 1880], [1386, 1880], [1386, 1721]], [[1412, 1721], [1412, 1880], [1412, 1880], [1412, 1721]], [[1451, 1721], [1451, 1880], [1464, 1880], [1464, 1721]], [[1503, 1721], [1503, 1880], [1503, 1880], [1503, 1721]], [[1516, 1721], [1516, 1880], [1529, 1880], [1529, 1721]], [[1542, 1721], [1542, 1880], [1555, 1880], [1555, 1721]], [[1568, 1721], [1568, 1880], [1568, 1880], [1568, 1721]], [[1659, 1721], [1659, 1880], [1659, 1880], [1659, 1721]], [[1711, 1721], [1711, 1880], [1724, 1880], [1724, 1721]], [[1776, 1721], [1776, 1880], [1776, 1880], [1776, 1721]], [[1802, 1721], [1802, 1880], [1815, 1880], [1815, 1721]], [[1841, 1721], [1841, 1880], [1854, 1880], [1854, 1721]], [[1867, 1721], [1867, 1880], [1867, 1880], [1867, 1721]], [[1893, 1721], [1893, 1880], [1893, 1880], [1893, 1721]], [[1919, 1721], [1919, 1880], [1932, 1880], [1932, 1721]], [[1997, 1721], [1997, 1880], [1997, 1880], [1997, 1721]], [[2062, 1721], [2062, 1880], [2062, 1880], [2062, 1721]], [[2127, 1721], [2127, 1880], [2140, 1880], [2140, 1721]], [[2166, 1721], [2166, 1880], [2166, 1880], [2166, 1721]], [[2192, 1721], [2192, 1880], [2205, 1880], [2205, 1721]], [[2244, 1721], [2244, 1880], [2257, 1880], [2257, 1721]], [[2270, 1721], [2270, 1880], [2283, 1880], [2283, 1721]], [[2322, 1721], [2322, 1880], [2335, 1880], [2335, 1721]], [[2361, 1721], [2361, 1880], [2361, 1880], [2361, 1721]], [[2400, 1721], [2400, 1880], [2400, 1880], [2400, 1721]], [[2413, 1721], [2413, 1880], [2413, 1880], [2413, 1721]], [[2452, 1721], [2452, 1880], [2452, 1880], [2452, 1721]], [[2492, 1721], [2492, 1880], [2505, 1880], [2505, 1721]], [[2557, 1721], [2557, 1880], [2557, 1880], [2557, 1721]], [[2609, 1721], [2609, 1880], [2622, 1880], [2622, 1721]], [[2648, 1721], [2648, 1880], [2648, 1880], [2648, 1721]], [[2661, 1721], [2661, 1880], [2674, 1880], [2674, 1721]], [[2687, 1721], [2687, 1880], [2700, 1880], [2700, 1721]], [[2713, 1721], [2713, 1880], [2726, 1880], [2726, 1721]], [[2765, 1721], [2765, 1880], [2765, 1880], [2765, 1721]], [[2791, 1721], [2791, 1880], [2804, 1880], [2804, 1721]], [[2817, 1721], [2817, 1880], [2830, 1880], [2830, 1721]], [[2869, 1721], [2869, 1880], [2882, 1880], [2882, 1721]], [[2908, 1721], [2908, 1880], [2921, 1880], [2921, 1721]], [[2947, 1721], [2947, 1880], [2960, 1880], [2960, 1721]], [[2973, 1721], [2973, 1880], [2986, 1880], [2986, 1721]], [[2999, 1721], [2999, 1880], [3012, 1880], [3012, 1721]], [[3038, 1721], [3038, 1880], [3064, 1880], [3064, 1721]], [[3077, 1721], [3077, 1880], [3077, 1880], [3077, 1721]], [[3103, 1721], [3103, 1880], [3116, 1880], [3116, 1721]], [[3142, 1721], [3142, 1880], [3142, 1880], [3142, 1721]], [[3155, 1721], [3155, 1880], [3168, 1880], [3168, 1721]]], "confidences": [0.9992807507514954, 0.9998190999031067, 0.9999728202819824, 0.9843649864196777, 0.9963064193725586, 0.9997701048851013, 0.9999123811721802, 0.9973879456520081, 0.999208390712738, 0.9719638824462891, 0.9987868666648865, 0.9970434308052063, 0.9997827410697937, 0.9999145269393921, 0.9791185259819031, 0.9905698299407959, 0.9965567588806152, 0.9983978867530823, 0.9999661445617676, 0.9999735355377197, 0.9999608993530273, 0.9998136162757874, 0.9998812675476074, 0.9741519093513489, 0.9999430179595947, 0.9712876081466675, 0.9996782541275024, 0.9999500513076782, 0.9999716281890869, 0.9999657869338989, 0.9887442588806152, 0.9972917437553406, 0.9999973773956299, 0.997856080532074, 0.9842910766601562, 0.9882177710533142, 0.9942337870597839, 0.9974427223205566, 0.8417571187019348, 0.96481853723526, 0.9993478655815125, 0.9817719459533691, 0.8848896622657776, 0.9665166735649109, 0.9880167245864868, 0.9940158128738403, 0.9972080588340759, 0.9924798011779785, 0.999430239200592, 0.9886217713356018, 0.9994122982025146, 0.9545918107032776, 0.9984832406044006, 0.9997020363807678, 0.9989163875579834, 0.9997730851173401, 0.9998658895492554, 0.9669737815856934, 0.9264388084411621, 0.9989351630210876, 0.9926611185073853, 0.9998636245727539, 0.9986826777458191, 0.9965075850486755, 0.9996894598007202, 0.9975529313087463, 0.9992383718490601, 0.9993176460266113, 0.9744951128959656, 0.9796627163887024], "line": {"id": "f4d8e81c-2263-4b82-8a7f-4ee5afe0205b", "bbox": [332, 1721, 3207, 1880], "type": "bbox"}}, {"prediction": "\u0647\u0628\u0636\u063a \u0646\u0645 \u062f\u064a\u0634\u0631\u0644\u0627 \u0646\u0643\u0633\u0641 \u0628\u064a\u0637\u0644\u0627 \u064a\u0641 \u0629\u0646\u0648\u0641\u062f\u0645 \u0629\u064a\u0648\u0637\u0645 \u0627\u0647\u0644\u0627\u062d \u0647\u064a\u0641 \u0629\u0639\u0627\u0631\u062f\u0644\u0627 \u0649\u0644\u0627 \u0631\u0638\u0646 \u062d\u062a\u0641 \u0627\u0644\u0646", "cuts": [[[331, 1906], [331, 2053], [331, 2053], [331, 1906]], [[370, 1906], [370, 2053], [370, 2053], [370, 1906]], [[409, 1906], [409, 2053], [409, 2053], [409, 1906]], [[473, 1906], [473, 2053], [473, 2053], [473, 1906]], [[512, 1906], [512, 2053], [525, 2053], [525, 1906]], [[563, 1906], [563, 2053], [563, 2053], [563, 1906]], [[602, 1906], [602, 2053], [602, 2053], [602, 1906]], [[628, 1906], [628, 2053], [641, 2053], [641, 1906]], [[679, 1906], [679, 2053], [679, 2053], [679, 1906]], [[705, 1906], [705, 2053], [705, 2053], [705, 1906]], [[757, 1906], [757, 2053], [757, 2053], [757, 1906]], [[795, 1906], [795, 2053], [808, 2053], [808, 1906]], [[821, 1906], [821, 2053], [821, 2053], [821, 1906]], [[834, 1906], [834, 2053], [847, 2053], [847, 1906]], [[860, 1906], [860, 2053], [873, 2053], [873, 1906]], [[924, 1906], [924, 2053], [937, 2053], [937, 1906]], [[976, 1906], [976, 2053], [976, 2053], [976, 1906]], [[1156, 1906], [1156, 2053], [1156, 2053], [1156, 1906]], [[1182, 1906], [1182, 2053], [1195, 2053], [1195, 1906]], [[1221, 1906], [1221, 2053], [1233, 2053], [1233, 1906]], [[1272, 1906], [1272, 2053], [1272, 2053], [1272, 1906]], [[1337, 1906], [1337, 2053], [1337, 2053], [1337, 1906]], [[1362, 1906], [1362, 2053], [1362, 2053], [1362, 1906]], [[1401, 1906], [1401, 2053], [1414, 2053], [1414, 1906]], [[1427, 1906], [1427, 2053], [1427, 2053], [1427, 1906]], [[1440, 1906], [1440, 2053], [1453, 2053], [1453, 1906]], [[1504, 1906], [1504, 2053], [1504, 2053], [1504, 1906]], [[1517, 1906], [1517, 2053], [1530, 2053], [1530, 1906]], [[1556, 1906], [1556, 2053], [1569, 2053], [1569, 1906]], [[1581, 1906], [1581, 2053], [1594, 2053], [1594, 1906]], [[1620, 1906], [1620, 2053], [1620, 2053], [1620, 1906]], [[1659, 1906], [1659, 2053], [1672, 2053], [1672, 1906]], [[1697, 1906], [1697, 2053], [1697, 2053], [1697, 1906]], [[1736, 1906], [1736, 2053], [1749, 2053], [1749, 1906]], [[1775, 1906], [1775, 2053], [1775, 2053], [1775, 1906]], [[1801, 1906], [1801, 2053], [1813, 2053], [1813, 1906]], [[1839, 1906], [1839, 2053], [1839, 2053], [1839, 1906]], [[1865, 1906], [1865, 2053], [1865, 2053], [1865, 1906]], [[1917, 1906], [1917, 2053], [1917, 2053], [1917, 1906]], [[1955, 1906], [1955, 2053], [1955, 2053], [1955, 1906]], [[2007, 1906], [2007, 2053], [2007, 2053], [2007, 1906]], [[2033, 1906], [2033, 2053], [2045, 2053], [2045, 1906]], [[2071, 1906], [2071, 2053], [2071, 2053], [2071, 1906]], [[2097, 1906], [2097, 2053], [2097, 2053], [2097, 1906]], [[2110, 1906], [2110, 2053], [2123, 2053], [2123, 1906]], [[2136, 1906], [2136, 2053], [2149, 2053], [2149, 1906]], [[2174, 1906], [2174, 2053], [2174, 2053], [2174, 1906]], [[2226, 1906], [2226, 2053], [2239, 2053], [2239, 1906]], [[2265, 1906], [2265, 2053], [2265, 2053], [2265, 1906]], [[2290, 1906], [2290, 2053], [2303, 2053], [2303, 1906]], [[2329, 1906], [2329, 2053], [2329, 2053], [2329, 1906]], [[2355, 1906], [2355, 2053], [2368, 2053], [2368, 1906]], [[2393, 1906], [2393, 2053], [2393, 2053], [2393, 1906]], [[2419, 1906], [2419, 2053], [2419, 2053], [2419, 1906]], [[2458, 1906], [2458, 2053], [2471, 2053], [2471, 1906]], [[2509, 1906], [2509, 2053], [2509, 2053], [2509, 1906]], [[2548, 1906], [2548, 2053], [2548, 2053], [2548, 1906]], [[2574, 1906], [2574, 2053], [2587, 2053], [2587, 1906]], [[2600, 1906], [2600, 2053], [2613, 2053], [2613, 1906]], [[2625, 1906], [2625, 2053], [2625, 2053], [2625, 1906]], [[2677, 1906], [2677, 2053], [2677, 2053], [2677, 1906]], [[2690, 1906], [2690, 2053], [2690, 2053], [2690, 1906]], [[2716, 1906], [2716, 2053], [2716, 2053], [2716, 1906]], [[2729, 1906], [2729, 2053], [2741, 2053], [2741, 1906]], [[2780, 1906], [2780, 2053], [2780, 2053], [2780, 1906]], [[2806, 1906], [2806, 2053], [2819, 2053], [2819, 1906]], [[2857, 1906], [2857, 2053], [2857, 2053], [2857, 1906]], [[2870, 1906], [2870, 2053], [2896, 2053], [2896, 1906]], [[2922, 1906], [2922, 2053], [2935, 2053], [2935, 1906]], [[2973, 1906], [2973, 2053], [2973, 2053], [2973, 1906]], [[2999, 1906], [2999, 2053], [2999, 2053], [2999, 1906]], [[3025, 1906], [3025, 2053], [3025, 2053], [3025, 1906]], [[3051, 1906], [3051, 2053], [3051, 2053], [3051, 1906]], [[3128, 1906], [3128, 2053], [3141, 2053], [3141, 1906]], [[3167, 1906], [3167, 2053], [3167, 2053], [3167, 1906]]], "confidences": [0.9159960746765137, 0.9976181387901306, 0.9996975660324097, 0.9877948760986328, 0.9998071789741516, 0.9193847179412842, 0.9977598190307617, 0.9999691247940063, 0.5213192105293274, 0.9998345375061035, 0.9993784427642822, 0.9995831847190857, 0.999843955039978, 0.9999074935913086, 0.6370336413383484, 0.9995335340499878, 0.9989326596260071, 0.9860919117927551, 0.999936580657959, 0.9919663667678833, 0.9993558526039124, 0.9862826466560364, 0.8228899836540222, 0.9858511090278625, 0.9946306943893433, 0.9999549388885498, 0.999767005443573, 0.9996095299720764, 0.9999788999557495, 0.9988093376159668, 0.5167495608329773, 0.9999475479125977, 0.9990980625152588, 0.9999123811721802, 0.6137158870697021, 0.9979343414306641, 0.9267524480819702, 0.7948201894760132, 0.9545791745185852, 0.9082372188568115, 0.9680109024047852, 0.995181143283844, 0.9705617427825928, 0.8799518942832947, 0.9786372184753418, 0.9424921274185181, 0.605963408946991, 0.9994131326675415, 0.9984038472175598, 0.9985394477844238, 0.9992857575416565, 0.9990177154541016, 0.9961357116699219, 0.9946891069412231, 0.9922365546226501, 0.9932458996772766, 0.9726880788803101, 0.9994227886199951, 0.9991672039031982, 0.9998785257339478, 0.999698281288147, 0.9973363280296326, 0.9942309856414795, 0.9929460883140564, 0.8134588599205017, 0.9999004602432251, 0.9500336647033691, 0.999967098236084, 0.9991039633750916, 0.9984264373779297, 0.8896018266677856, 0.7239580750465393, 0.9947216510772705, 0.9903062582015991, 0.8236287832260132], "line": {"id": "1cd9447c-d76c-448d-b261-db779a35a0d2", "bbox": [331, 1906, 3167, 2053], "type": "bbox"}}, {"prediction": "\u0627\u0647\u062f\u0639\u0628 \u0643\u064a\u0644\u0639 \u0642\u062f\u0635\u0627 \u0646\u0644\u0641 \u0627\u062f\u0634\u0627\u0631 \u0641\u0631\u0635\u0646\u0627\u0648 \u0627\u0647\u0646\u0627\u0643\u0645 \u0649\u0644\u0627 \u0627\u0647\u062f\u062f\u0631\u0627 \u0646\u064a\u0637\u0642\u064a \u0646\u0628 \u0649\u0644\u0639\u0644 \u0644\u0627\u0642 \u0645\u0654\u064a", "cuts": [[[334, 2060], [334, 2231], [334, 2231], [334, 2060]], [[360, 2060], [360, 2231], [360, 2231], [360, 2060]], [[425, 2060], [425, 2231], [425, 2231], [425, 2060]], [[451, 2060], [451, 2231], [451, 2231], [451, 2060]], [[477, 2060], [477, 2231], [490, 2231], [490, 2060]], [[503, 2060], [503, 2231], [516, 2231], [516, 2060]], [[569, 2060], [569, 2231], [569, 2231], [569, 2060]], [[621, 2060], [621, 2231], [634, 2231], [634, 2060]], [[647, 2060], [647, 2231], [647, 2231], [647, 2060]], [[673, 2060], [673, 2231], [686, 2231], [686, 2060]], [[712, 2060], [712, 2231], [738, 2231], [738, 2060]], [[803, 2060], [803, 2231], [803, 2231], [803, 2060]], [[842, 2060], [842, 2231], [855, 2231], [855, 2060]], [[894, 2060], [894, 2231], [907, 2231], [907, 2060]], [[946, 2060], [946, 2231], [959, 2231], [959, 2060]], [[972, 2060], [972, 2231], [972, 2231], [972, 2060]], [[1024, 2060], [1024, 2231], [1024, 2231], [1024, 2060]], [[1051, 2060], [1051, 2231], [1064, 2231], [1064, 2060]], [[1077, 2060], [1077, 2231], [1077, 2231], [1077, 2060]], [[1103, 2060], [1103, 2231], [1129, 2231], [1129, 2060]], [[1168, 2060], [1168, 2231], [1181, 2231], [1181, 2060]], [[1220, 2060], [1220, 2231], [1220, 2231], [1220, 2060]], [[1272, 2060], [1272, 2231], [1272, 2231], [1272, 2060]], [[1298, 2060], [1298, 2231], [1311, 2231], [1311, 2060]], [[1350, 2060], [1350, 2231], [1350, 2231], [1350, 2060]], [[1376, 2060], [1376, 2231], [1389, 2231], [1389, 2060]], [[1480, 2060], [1480, 2231], [1480, 2231], [1480, 2060]], [[1520, 2060], [1520, 2231], [1533, 2231], [1533, 2060]], [[1585, 2060], [1585, 2231], [1585, 2231], [1585, 2060]], [[1624, 2060], [1624, 2231], [1624, 2231], [1624, 2060]], [[1650, 2060], [1650, 2231], [1663, 2231], [1663, 2060]], [[1702, 2060], [1702, 2231], [1715, 2231], [1715, 2060]], [[1728, 2060], [1728, 2231], [1754, 2231], [1754, 2060]], [[1767, 2060], [1767, 2231], [1780, 2231], [1780, 2060]], [[1832, 2060], [1832, 2231], [1845, 2231], [1845, 2060]], [[1858, 2060], [1858, 2231], [1871, 2231], [1871, 2060]], [[1884, 2060], [1884, 2231], [1884, 2231], [1884, 2060]], [[1897, 2060], [1897, 2231], [1910, 2231], [1910, 2060]], [[1962, 2060], [1962, 2231], [1962, 2231], [1962, 2060]], [[1989, 2060], [1989, 2231], [2002, 2231], [2002, 2060]], [[2067, 2060], [2067, 2231], [2067, 2231], [2067, 2060]], [[2080, 2060], [2080, 2231], [2080, 2231], [2080, 2060]], [[2106, 2060], [2106, 2231], [2106, 2231], [2106, 2060]], [[2119, 2060], [2119, 2231], [2132, 2231], [2132, 2060]], [[2158, 2060], [2158, 2231], [2158, 2231], [2158, 2060]], [[2184, 2060], [2184, 2231], [2184, 2231], [2184, 2060]], [[2236, 2060], [2236, 2231], [2236, 2231], [2236, 2060]], [[2262, 2060], [2262, 2231], [2275, 2231], [2275, 2060]], [[2314, 2060], [2314, 2231], [2327, 2231], [2327, 2060]], [[2353, 2060], [2353, 2231], [2353, 2231], [2353, 2060]], [[2379, 2060], [2379, 2231], [2392, 2231], [2392, 2060]], [[2431, 2060], [2431, 2231], [2444, 2231], [2444, 2060]], [[2457, 2060], [2457, 2231], [2471, 2231], [2471, 2060]], [[2497, 2060], [2497, 2231], [2497, 2231], [2497, 2060]], [[2549, 2060], [2549, 2231], [2562, 2231], [2562, 2060]], [[2588, 2060], [2588, 2231], [2588, 2231], [2588, 2060]], [[2614, 2060], [2614, 2231], [2627, 2231], [2627, 2060]], [[2679, 2060], [2679, 2231], [2679, 2231], [2679, 2060]], [[2705, 2060], [2705, 2231], [2705, 2231], [2705, 2060]], [[2731, 2060], [2731, 2231], [2744, 2231], [2744, 2060]], [[2848, 2060], [2848, 2231], [2848, 2231], [2848, 2060]], [[2861, 2060], [2861, 2231], [2861, 2231], [2861, 2060]], [[2887, 2060], [2887, 2231], [2887, 2231], [2887, 2060]], [[2913, 2060], [2913, 2231], [2926, 2231], [2926, 2060]], [[2939, 2060], [2939, 2231], [2953, 2231], [2953, 2060]], [[3005, 2060], [3005, 2231], [3005, 2231], [3005, 2060]], [[3018, 2060], [3018, 2231], [3031, 2231], [3031, 2060]], [[3044, 2060], [3044, 2231], [3044, 2231], [3044, 2060]], [[3070, 2060], [3070, 2231], [3083, 2231], [3083, 2060]], [[3096, 2060], [3096, 2231], [3109, 2231], [3109, 2060]], [[3135, 2060], [3135, 2231], [3135, 2231], [3135, 2060]], [[3148, 2060], [3148, 2231], [3148, 2231], [3148, 2060]]], "confidences": [0.9586123824119568, 0.9986465573310852, 0.9566709995269775, 0.9922924041748047, 0.999371349811554, 0.999819815158844, 0.9982818365097046, 0.9999407529830933, 0.9542492032051086, 0.9999266862869263, 0.9977983236312866, 0.9082127213478088, 0.9984015822410583, 0.9999021291732788, 0.9999748468399048, 0.9999212026596069, 0.9956596493721008, 0.9997978806495667, 0.9995704293251038, 0.9999994039535522, 0.9999769926071167, 0.5398281216621399, 0.9999560117721558, 0.9999827146530151, 0.678408682346344, 0.999976634979248, 0.9999359846115112, 0.9980989098548889, 0.9837391376495361, 0.8357751369476318, 0.9999740123748779, 0.9798765182495117, 0.9975171089172363, 0.99134761095047, 0.9869094491004944, 0.8972664475440979, 0.9946538209915161, 0.9883899688720703, 0.9977121353149414, 0.9916154742240906, 0.9904273748397827, 0.9942137598991394, 0.9822350144386292, 0.9995124340057373, 0.6970008015632629, 0.9945922493934631, 0.9990953207015991, 0.9915691018104553, 0.9982545971870422, 0.9470371603965759, 0.9988258481025696, 0.9982693195343018, 0.9856593608856201, 0.9323335886001587, 0.9999984502792358, 0.9984018206596375, 0.9993857145309448, 0.9998714923858643, 0.6906755566596985, 0.9985949397087097, 0.994672954082489, 0.9955617189407349, 0.9956024885177612, 0.9990137815475464, 0.9867492318153381, 0.9986513257026672, 0.9989423155784607, 0.6353587508201599, 0.996551513671875, 0.9758750200271606, 0.8564420342445374, 0.5611870884895325], "line": {"id": "6cc9b689-db87-48a8-9782-5edff5a1fdaa", "bbox": [334, 2060, 3161, 2231], "type": "bbox"}}, {"prediction": "\u0648\u062d\" \u0628\u0631\u0636\u0641 \u0637\u0648\u0633 \u0641\u0644\u0627 \u0647\u0628 \u0649\u0639\u0627\u0633\u0644\u0627 \u0628\u0631\u0636\u0628 \u0645\u062f\u0642\u062a\u0648 \u0629\u064a\u0646\u0633 \u0629\u0632\u064a\u0627\u062c\u0628 \u0639\u0628\u062a\u064a \u0646\u0627 \u0631\u0645\u0654\u0627\u0648\u064b \u0627\u064a\u0639\u0627\u0633", "cuts": [[[354, 2227], [354, 2386], [354, 2386], [354, 2227]], [[393, 2227], [393, 2386], [406, 2386], [406, 2227]], [[459, 2227], [459, 2386], [459, 2386], [459, 2227]], [[472, 2227], [472, 2386], [486, 2386], [486, 2227]], [[551, 2227], [551, 2386], [551, 2386], [551, 2227]], [[617, 2227], [617, 2386], [631, 2386], [631, 2227]], [[670, 2227], [670, 2386], [670, 2386], [670, 2227]], [[710, 2227], [710, 2386], [710, 2386], [710, 2227]], [[736, 2227], [736, 2386], [763, 2386], [763, 2227]], [[815, 2227], [815, 2386], [815, 2386], [815, 2227]], [[881, 2227], [881, 2386], [881, 2386], [881, 2227]], [[921, 2227], [921, 2386], [934, 2386], [934, 2227]], [[961, 2227], [961, 2386], [987, 2386], [987, 2227]], [[1079, 2227], [1079, 2386], [1093, 2386], [1093, 2227]], [[1106, 2227], [1106, 2386], [1119, 2386], [1119, 2227]], [[1132, 2227], [1132, 2386], [1132, 2386], [1132, 2227]], [[1145, 2227], [1145, 2386], [1159, 2386], [1159, 2227]], [[1198, 2227], [1198, 2386], [1198, 2386], [1198, 2227]], [[1225, 2227], [1225, 2386], [1225, 2386], [1225, 2227]], [[1251, 2227], [1251, 2386], [1264, 2386], [1264, 2227]], [[1304, 2227], [1304, 2386], [1304, 2386], [1304, 2227]], [[1330, 2227], [1330, 2386], [1343, 2386], [1343, 2227]], [[1383, 2227], [1383, 2386], [1383, 2386], [1383, 2227]], [[1409, 2227], [1409, 2386], [1423, 2386], [1423, 2227]], [[1449, 2227], [1449, 2386], [1462, 2386], [1462, 2227]], [[1475, 2227], [1475, 2386], [1475, 2386], [1475, 2227]], [[1489, 2227], [1489, 2386], [1502, 2386], [1502, 2227]], [[1581, 2227], [1581, 2386], [1581, 2386], [1581, 2227]], [[1634, 2227], [1634, 2386], [1647, 2386], [1647, 2227]], [[1687, 2227], [1687, 2386], [1687, 2386], [1687, 2227]], [[1726, 2227], [1726, 2386], [1739, 2386], [1739, 2227]], [[1753, 2227], [1753, 2386], [1766, 2386], [1766, 2227]], [[1805, 2227], [1805, 2386], [1819, 2386], [1819, 2227]], [[1871, 2227], [1871, 2386], [1871, 2386], [1871, 2227]], [[1898, 2227], [1898, 2386], [1911, 2386], [1911, 2227]], [[1937, 2227], [1937, 2386], [1937, 2386], [1937, 2227]], [[1990, 2227], [1990, 2386], [1990, 2386], [1990, 2227]], [[2017, 2227], [2017, 2386], [2030, 2386], [2030, 2227]], [[2069, 2227], [2069, 2386], [2069, 2386], [2069, 2227]], [[2096, 2227], [2096, 2386], [2096, 2386], [2096, 2227]], [[2122, 2227], [2122, 2386], [2135, 2386], [2135, 2227]], [[2162, 2227], [2162, 2386], [2175, 2386], [2175, 2227]], [[2201, 2227], [2201, 2386], [2215, 2386], [2215, 2227]], [[2267, 2227], [2267, 2386], [2267, 2386], [2267, 2227]], [[2307, 2227], [2307, 2386], [2307, 2386], [2307, 2227]], [[2333, 2227], [2333, 2386], [2333, 2386], [2333, 2227]], [[2373, 2227], [2373, 2386], [2373, 2386], [2373, 2227]], [[2399, 2227], [2399, 2386], [2413, 2386], [2413, 2227]], [[2426, 2227], [2426, 2386], [2439, 2386], [2439, 2227]], [[2452, 2227], [2452, 2386], [2465, 2386], [2465, 2227]], [[2492, 2227], [2492, 2386], [2505, 2386], [2505, 2227]], [[2545, 2227], [2545, 2386], [2545, 2386], [2545, 2227]], [[2571, 2227], [2571, 2386], [2571, 2386], [2571, 2227]], [[2597, 2227], [2597, 2386], [2597, 2386], [2597, 2227]], [[2624, 2227], [2624, 2386], [2637, 2386], [2637, 2227]], [[2690, 2227], [2690, 2386], [2703, 2386], [2703, 2227]], [[2729, 2227], [2729, 2386], [2729, 2386], [2729, 2227]], [[2756, 2227], [2756, 2386], [2756, 2386], [2756, 2227]], [[2795, 2227], [2795, 2386], [2795, 2386], [2795, 2227]], [[2822, 2227], [2822, 2386], [2835, 2386], [2835, 2227]], [[2861, 2227], [2861, 2386], [2861, 2386], [2861, 2227]], [[2875, 2227], [2875, 2386], [2875, 2386], [2875, 2227]], [[2927, 2227], [2927, 2386], [2927, 2386], [2927, 2227]], [[2941, 2227], [2941, 2386], [2941, 2386], [2941, 2227]], [[2954, 2227], [2954, 2386], [2967, 2386], [2967, 2227]], [[2993, 2227], [2993, 2386], [3006, 2386], [3006, 2227]], [[3033, 2227], [3033, 2386], [3033, 2386], [3033, 2227]], [[3046, 2227], [3046, 2386], [3059, 2386], [3059, 2227]], [[3099, 2227], [3099, 2386], [3099, 2386], [3099, 2227]], [[3138, 2227], [3138, 2386], [3152, 2386], [3152, 2227]]], "confidences": [0.9823002219200134, 0.9972136616706848, 0.9999020099639893, 0.9994245767593384, 0.9984127283096313, 0.9963169097900391, 0.9989890456199646, 0.8085134625434875, 0.9999579191207886, 0.9999361038208008, 0.9942615032196045, 0.9278876185417175, 0.9998903274536133, 0.999955415725708, 0.9999262094497681, 0.9999407529830933, 0.9999767541885376, 0.9984294772148132, 0.8924553990364075, 0.9984814524650574, 0.9999494552612305, 0.9997356534004211, 0.9999189376831055, 0.9939833283424377, 0.9999998807907104, 0.9999184608459473, 0.9999300241470337, 0.573874831199646, 0.9986876845359802, 0.9068862199783325, 0.9941669702529907, 0.999953031539917, 0.997863233089447, 0.7316004037857056, 0.9987077713012695, 0.9907311797142029, 0.9943513870239258, 0.9962025284767151, 0.9970322847366333, 0.9568605422973633, 0.9899909496307373, 0.8733225464820862, 0.9993151426315308, 0.7688072919845581, 0.9994139671325684, 0.9989153146743774, 0.5057005286216736, 0.9989703893661499, 0.9991733431816101, 0.9928190112113953, 0.9984594583511353, 0.7554934024810791, 0.9958826303482056, 0.9795031547546387, 0.9996199607849121, 0.9911338686943054, 0.9956367611885071, 0.9094319939613342, 0.9807215929031372, 0.9925562739372253, 0.8968151211738586, 0.7551785707473755, 0.9919329285621643, 0.9729509353637695, 0.9989374279975891, 0.9944745898246765, 0.9989200830459595, 0.9993528723716736, 0.9896401166915894, 0.9964278340339661], "line": {"id": "a43b40bb-088e-4263-80ad-eacd02545773", "bbox": [327, 2227, 3165, 2386], "type": "bbox"}}, {"prediction": ". \u0643\u0644\u0630 \u064a\u0641 \u062a\u0627\u0645\u0641 \u0637\u0648\u0633 \u0629\u0627\u0645\u0633\u0645\u062e", "cuts": [[[2264, 2402], [2264, 2531], [2264, 2531], [2264, 2402]], [[2302, 2402], [2302, 2531], [2302, 2531], [2302, 2402]], [[2340, 2402], [2340, 2531], [2353, 2531], [2353, 2402]], [[2391, 2402], [2391, 2531], [2403, 2531], [2403, 2402]], [[2416, 2402], [2416, 2531], [2429, 2531], [2429, 2402]], [[2454, 2402], [2454, 2531], [2467, 2531], [2467, 2402]], [[2492, 2402], [2492, 2531], [2492, 2531], [2492, 2402]], [[2505, 2402], [2505, 2531], [2505, 2531], [2505, 2402]], [[2543, 2402], [2543, 2531], [2543, 2531], [2543, 2402]], [[2594, 2402], [2594, 2531], [2594, 2531], [2594, 2402]], [[2632, 2402], [2632, 2531], [2632, 2531], [2632, 2402]], [[2644, 2402], [2644, 2531], [2657, 2531], [2657, 2402]], [[2695, 2402], [2695, 2531], [2695, 2531], [2695, 2402]], [[2720, 2402], [2720, 2531], [2733, 2531], [2733, 2402]], [[2771, 2402], [2771, 2531], [2771, 2531], [2771, 2402]], [[2847, 2402], [2847, 2531], [2847, 2531], [2847, 2402]], [[2898, 2402], [2898, 2531], [2898, 2531], [2898, 2402]], [[2936, 2402], [2936, 2531], [2936, 2531], [2936, 2402]], [[2961, 2402], [2961, 2531], [2961, 2531], [2961, 2402]], [[3012, 2402], [3012, 2531], [3012, 2531], [3012, 2402]], [[3025, 2402], [3025, 2531], [3037, 2531], [3037, 2402]], [[3075, 2402], [3075, 2531], [3088, 2531], [3088, 2402]], [[3101, 2402], [3101, 2531], [3101, 2531], [3101, 2402]], [[3126, 2402], [3126, 2531], [3139, 2531], [3139, 2402]]], "confidences": [0.9456377625465393, 0.9999704360961914, 0.9999499320983887, 0.9995260238647461, 0.9999178647994995, 0.9999415874481201, 0.9920778870582581, 0.9997991919517517, 0.9995096921920776, 0.999977707862854, 0.8690007925033569, 0.9649189710617065, 0.9999690055847168, 0.9999949932098389, 0.9907584190368652, 0.9840313196182251, 0.9416587948799133, 0.998769223690033, 0.9915293455123901, 0.967819094657898, 0.9989644289016724, 0.9990310668945312, 0.9262909889221191, 0.9966443777084351], "line": {"id": "c8d2000e-5c3d-4401-adc6-7597ab2ef2b7", "bbox": [2264, 2402, 3164, 2531], "type": "bbox"}}, {"prediction": "\u062d\u0633\u0645 \u064a\u0641 \u0627\u0646\u0628\u0627\u062d\u0654\u0627 \u0646\u064a\u0628 \u0629\u064a\u0627\u0648\u0631\u0644\u0627 \u062a\u0641\u0644\u062a\u062e\u0627 \u0644\u0627\u0642 \u0644\u0636\u0635\u0641\u0644\u0627 \u0646\u0628 \u062f\u0645\u062d \u0646\u0639 \u0644\u064a\u0639\u0627\u0645\u0633\u0627 \u0646\u0628 \u062f\u0645\u0639\u0645 \u0649\u0648\u0631\u0648", "cuts": [[[331, 2564], [331, 2740], [344, 2740], [344, 2564]], [[398, 2564], [398, 2740], [398, 2740], [398, 2564]], [[439, 2564], [439, 2740], [452, 2740], [452, 2564]], [[466, 2564], [466, 2740], [479, 2740], [479, 2564]], [[520, 2564], [520, 2740], [520, 2740], [520, 2564]], [[533, 2564], [533, 2740], [533, 2740], [533, 2564]], [[560, 2564], [560, 2740], [560, 2740], [560, 2564]], [[587, 2564], [587, 2740], [587, 2740], [587, 2564]], [[614, 2564], [614, 2740], [614, 2740], [614, 2564]], [[628, 2564], [628, 2740], [641, 2740], [641, 2564]], [[668, 2564], [668, 2740], [668, 2740], [668, 2564]], [[695, 2564], [695, 2740], [709, 2740], [709, 2564]], [[763, 2564], [763, 2740], [763, 2740], [763, 2564]], [[776, 2564], [776, 2740], [790, 2740], [790, 2564]], [[803, 2564], [803, 2740], [803, 2740], [803, 2564]], [[844, 2564], [844, 2740], [857, 2740], [857, 2564]], [[871, 2564], [871, 2740], [884, 2740], [884, 2564]], [[898, 2564], [898, 2740], [898, 2740], [898, 2564]], [[925, 2564], [925, 2740], [938, 2740], [938, 2564]], [[979, 2564], [979, 2740], [979, 2740], [979, 2564]], [[1006, 2564], [1006, 2740], [1006, 2740], [1006, 2564]], [[1046, 2564], [1046, 2740], [1046, 2740], [1046, 2564]], [[1100, 2564], [1100, 2740], [1100, 2740], [1100, 2564]], [[1141, 2564], [1141, 2740], [1141, 2740], [1141, 2564]], [[1154, 2564], [1154, 2740], [1168, 2740], [1168, 2564]], [[1181, 2564], [1181, 2740], [1181, 2740], [1181, 2564]], [[1195, 2564], [1195, 2740], [1208, 2740], [1208, 2564]], [[1249, 2564], [1249, 2740], [1249, 2740], [1249, 2564]], [[1316, 2564], [1316, 2740], [1316, 2740], [1316, 2564]], [[1343, 2564], [1343, 2740], [1343, 2740], [1343, 2564]], [[1370, 2564], [1370, 2740], [1384, 2740], [1384, 2564]], [[1411, 2564], [1411, 2740], [1424, 2740], [1424, 2564]], [[1465, 2564], [1465, 2740], [1478, 2740], [1478, 2564]], [[1492, 2564], [1492, 2740], [1492, 2740], [1492, 2564]], [[1546, 2564], [1546, 2740], [1559, 2740], [1559, 2564]], [[1573, 2564], [1573, 2740], [1573, 2740], [1573, 2564]], [[1586, 2564], [1586, 2740], [1586, 2740], [1586, 2564]], [[1613, 2564], [1613, 2740], [1627, 2740], [1627, 2564]], [[1667, 2564], [1667, 2740], [1681, 2740], [1681, 2564]], [[1721, 2564], [1721, 2740], [1721, 2740], [1721, 2564]], [[1735, 2564], [1735, 2740], [1735, 2740], [1735, 2564]], [[1775, 2564], [1775, 2740], [1789, 2740], [1789, 2564]], [[1802, 2564], [1802, 2740], [1816, 2740], [1816, 2564]], [[1829, 2564], [1829, 2740], [1829, 2740], [1829, 2564]], [[1843, 2564], [1843, 2740], [1856, 2740], [1856, 2564]], [[1897, 2564], [1897, 2740], [1897, 2740], [1897, 2564]], [[1924, 2564], [1924, 2740], [1924, 2740], [1924, 2564]], [[1951, 2564], [1951, 2740], [1964, 2740], [1964, 2564]], [[2005, 2564], [2005, 2740], [2005, 2740], [2005, 2564]], [[2032, 2564], [2032, 2740], [2045, 2740], [2045, 2564]], [[2059, 2564], [2059, 2740], [2059, 2740], [2059, 2564]], [[2086, 2564], [2086, 2740], [2086, 2740], [2086, 2564]], [[2113, 2564], [2113, 2740], [2113, 2740], [2113, 2564]], [[2153, 2564], [2153, 2740], [2153, 2740], [2153, 2564]], [[2194, 2564], [2194, 2740], [2207, 2740], [2207, 2564]], [[2248, 2564], [2248, 2740], [2248, 2740], [2248, 2564]], [[2275, 2564], [2275, 2740], [2288, 2740], [2288, 2564]], [[2302, 2564], [2302, 2740], [2315, 2740], [2315, 2564]], [[2356, 2564], [2356, 2740], [2356, 2740], [2356, 2564]], [[2369, 2564], [2369, 2740], [2383, 2740], [2383, 2564]], [[2410, 2564], [2410, 2740], [2423, 2740], [2423, 2564]], [[2450, 2564], [2450, 2740], [2450, 2740], [2450, 2564]], [[2464, 2564], [2464, 2740], [2477, 2740], [2477, 2564]], [[2504, 2564], [2504, 2740], [2518, 2740], [2518, 2564]], [[2545, 2564], [2545, 2740], [2545, 2740], [2545, 2564]], [[2572, 2564], [2572, 2740], [2572, 2740], [2572, 2564]], [[2612, 2564], [2612, 2740], [2612, 2740], [2612, 2564]], [[2639, 2564], [2639, 2740], [2653, 2740], [2653, 2564]], [[2666, 2564], [2666, 2740], [2666, 2740], [2666, 2564]], [[2680, 2564], [2680, 2740], [2680, 2740], [2680, 2564]], [[2707, 2564], [2707, 2740], [2720, 2740], [2720, 2564]], [[2761, 2564], [2761, 2740], [2761, 2740], [2761, 2564]], [[2828, 2564], [2828, 2740], [2828, 2740], [2828, 2564]], [[2869, 2564], [2869, 2740], [2882, 2740], [2882, 2564]], [[2923, 2564], [2923, 2740], [2936, 2740], [2936, 2564]]], "confidences": [0.9999998807907104, 0.9929130673408508, 0.9938241243362427, 0.9778679609298706, 0.9086365699768066, 0.654657781124115, 0.9912302494049072, 0.9998319149017334, 0.9415075182914734, 0.9910994172096252, 0.8468749523162842, 0.991156816482544, 0.9946617484092712, 0.9841130375862122, 0.5371823906898499, 0.9606072902679443, 0.9999836683273315, 0.982523500919342, 0.9999951124191284, 0.9997585415840149, 0.9992431402206421, 0.9998185038566589, 0.8639128804206848, 0.999992847442627, 0.9997803568840027, 0.9999289512634277, 0.9999123811721802, 0.8764679431915283, 0.99874347448349, 0.7210342288017273, 0.9998082518577576, 0.9998107552528381, 0.9988790154457092, 0.9528904557228088, 0.9895849823951721, 0.989848792552948, 0.9913495779037476, 0.9971917271614075, 0.9919770359992981, 0.9953035116195679, 0.9654654860496521, 0.956558108329773, 0.968718945980072, 0.9891232848167419, 0.9995982050895691, 0.5353143811225891, 0.9994182586669922, 0.9978064894676208, 0.9980046153068542, 0.9997578263282776, 0.9991948008537292, 0.999717652797699, 0.999285876750946, 0.9232087731361389, 0.9976062774658203, 0.9995843768119812, 0.9938365817070007, 0.998508870601654, 0.8162130117416382, 0.9771808385848999, 0.9998940229415894, 0.9971707463264465, 0.9978471994400024, 0.9858810901641846, 0.938630223274231, 0.9977301955223083, 0.9997122883796692, 0.99797123670578, 0.5294272303581238, 0.9924471378326416, 0.9994334578514099, 0.9998548030853271, 0.999200165271759, 0.9990027546882629, 0.9875484704971313], "line": {"id": "b994b599-c779-44fd-a687-82f7c6ed4464", "bbox": [317, 2564, 2950, 2740], "type": "bbox"}}, {"prediction": "\u0639\u0628\u0627\u0640\u0635\u0654\u0627\u0644\u0627 \u0649\u0644\u0627 \u0646\u064a\u0628\u0639\u0643\u0644\u0627 \u0646\u0645 \u0645\u0654\u0627 \u0646\u064a\u0628\u0639\u0643\u0644\u0627 \u0649\u0644\u0627 \u0639\u0628\u0627\u0635\u0654\u0627\u0644\u0627 \u0646\u0645 \u0648\u0645\u0654\u0627 \u0621\u0648\u0636\u0648\u0644\u0627 \u0641 \u0646\u064a\u0644\u062c\u0631\u0644\u0627", "cuts": [[[335, 2733], [335, 2890], [335, 2890], [335, 2733]], [[396, 2733], [396, 2890], [396, 2890], [396, 2733]], [[442, 2733], [442, 2890], [442, 2890], [442, 2733]], [[488, 2733], [488, 2890], [519, 2890], [519, 2733]], [[611, 2733], [611, 2890], [611, 2890], [611, 2733]], [[657, 2733], [657, 2890], [657, 2890], [657, 2733]], [[673, 2733], [673, 2890], [673, 2890], [673, 2733]], [[688, 2733], [688, 2890], [704, 2890], [704, 2733]], [[719, 2733], [719, 2890], [734, 2890], [734, 2733]], [[750, 2733], [750, 2890], [750, 2890], [750, 2733]], [[796, 2733], [796, 2890], [796, 2890], [796, 2733]], [[811, 2733], [811, 2890], [827, 2890], [827, 2733]], [[842, 2733], [842, 2890], [842, 2890], [842, 2733]], [[857, 2733], [857, 2890], [873, 2890], [873, 2733]], [[904, 2733], [904, 2890], [904, 2890], [904, 2733]], [[934, 2733], [934, 2890], [934, 2890], [934, 2733]], [[965, 2733], [965, 2890], [965, 2890], [965, 2733]], [[996, 2733], [996, 2890], [996, 2890], [996, 2733]], [[1057, 2733], [1057, 2890], [1057, 2890], [1057, 2733]], [[1119, 2733], [1119, 2890], [1134, 2890], [1134, 2733]], [[1150, 2733], [1150, 2890], [1150, 2890], [1150, 2733]], [[1165, 2733], [1165, 2890], [1180, 2890], [1180, 2733]], [[1288, 2733], [1288, 2890], [1303, 2890], [1303, 2733]], [[1380, 2733], [1380, 2890], [1380, 2890], [1380, 2733]], [[1411, 2733], [1411, 2890], [1426, 2890], [1426, 2733]], [[1442, 2733], [1442, 2890], [1457, 2890], [1457, 2733]], [[1473, 2733], [1473, 2890], [1473, 2890], [1473, 2733]], [[1488, 2733], [1488, 2890], [1503, 2890], [1503, 2733]], [[1519, 2733], [1519, 2890], [1534, 2890], [1534, 2733]], [[1565, 2733], [1565, 2890], [1565, 2890], [1565, 2733]], [[1580, 2733], [1580, 2890], [1596, 2890], [1596, 2733]], [[1626, 2733], [1626, 2890], [1626, 2890], [1626, 2733]], [[1657, 2733], [1657, 2890], [1657, 2890], [1657, 2733]], [[1703, 2733], [1703, 2890], [1719, 2890], [1719, 2733]], [[1780, 2733], [1780, 2890], [1780, 2890], [1780, 2733]], [[1796, 2733], [1796, 2890], [1796, 2890], [1796, 2733]], [[1811, 2733], [1811, 2890], [1826, 2890], [1826, 2733]], [[1857, 2733], [1857, 2890], [1872, 2890], [1872, 2733]], [[1888, 2733], [1888, 2890], [1888, 2890], [1888, 2733]], [[1903, 2733], [1903, 2890], [1919, 2890], [1919, 2733]], [[1934, 2733], [1934, 2890], [1934, 2890], [1934, 2733]], [[1965, 2733], [1965, 2890], [1965, 2890], [1965, 2733]], [[2042, 2733], [2042, 2890], [2042, 2890], [2042, 2733]], [[2072, 2733], [2072, 2890], [2072, 2890], [2072, 2733]], [[2118, 2733], [2118, 2890], [2134, 2890], [2134, 2733]], [[2165, 2733], [2165, 2890], [2180, 2890], [2180, 2733]], [[2195, 2733], [2195, 2890], [2195, 2890], [2195, 2733]], [[2211, 2733], [2211, 2890], [2211, 2890], [2211, 2733]], [[2226, 2733], [2226, 2890], [2241, 2890], [2241, 2733]], [[2257, 2733], [2257, 2890], [2272, 2890], [2272, 2733]], [[2318, 2733], [2318, 2890], [2318, 2890], [2318, 2733]], [[2349, 2733], [2349, 2890], [2349, 2890], [2349, 2733]], [[2380, 2733], [2380, 2890], [2395, 2890], [2395, 2733]], [[2426, 2733], [2426, 2890], [2441, 2890], [2441, 2733]], [[2472, 2733], [2472, 2890], [2472, 2890], [2472, 2733]], [[2503, 2733], [2503, 2890], [2503, 2890], [2503, 2733]], [[2518, 2733], [2518, 2890], [2534, 2890], [2534, 2733]], [[2549, 2733], [2549, 2890], [2549, 2890], [2549, 2733]], [[2580, 2733], [2580, 2890], [2580, 2890], [2580, 2733]], [[2626, 2733], [2626, 2890], [2641, 2890], [2641, 2733]], [[2687, 2733], [2687, 2890], [2687, 2890], [2687, 2733]], [[2749, 2733], [2749, 2890], [2749, 2890], [2749, 2733]], [[2780, 2733], [2780, 2890], [2780, 2890], [2780, 2733]], [[2795, 2733], [2795, 2890], [2811, 2890], [2811, 2733]], [[2826, 2733], [2826, 2890], [2826, 2890], [2826, 2733]], [[2872, 2733], [2872, 2890], [2887, 2890], [2887, 2733]], [[2918, 2733], [2918, 2890], [2918, 2890], [2918, 2733]], [[2949, 2733], [2949, 2890], [2949, 2890], [2949, 2733]], [[2980, 2733], [2980, 2890], [2980, 2890], [2980, 2733]], [[3010, 2733], [3010, 2890], [3010, 2890], [3010, 2733]], [[3041, 2733], [3041, 2890], [3041, 2890], [3041, 2733]], [[3103, 2733], [3103, 2890], [3103, 2890], [3103, 2733]], [[3118, 2733], [3118, 2890], [3133, 2890], [3133, 2733]], [[3149, 2733], [3149, 2890], [3149, 2890], [3149, 2733]]], "confidences": [0.9999692440032959, 0.7431797385215759, 0.9892282485961914, 0.9999510049819946, 0.9351767897605896, 0.9993116855621338, 0.9982556700706482, 0.9992502331733704, 0.9992731213569641, 0.9999591112136841, 0.9965296387672424, 0.9999610185623169, 0.9995737671852112, 0.9993835687637329, 0.987348198890686, 0.7714233994483948, 0.9989540576934814, 0.9985584616661072, 0.9998059868812561, 0.9927629828453064, 0.9998949766159058, 0.9996819496154785, 0.9967392086982727, 0.999603807926178, 0.9831695556640625, 0.9224259257316589, 0.9802579283714294, 0.9334492683410645, 0.9981402158737183, 0.9999240636825562, 0.986011266708374, 0.9975579977035522, 0.9953357577323914, 0.9803675413131714, 0.9984625577926636, 0.9977602958679199, 0.9838416576385498, 0.9906837940216064, 0.9881343245506287, 0.9841576814651489, 0.9998107552528381, 0.9991499185562134, 0.9434433579444885, 0.9854111671447754, 0.8520838618278503, 0.9964721202850342, 0.9900435209274292, 0.9503771066665649, 0.9993019104003906, 0.9988412261009216, 0.99639892578125, 0.8105504512786865, 0.9876804351806641, 0.9993699193000793, 0.921359121799469, 0.9604810476303101, 0.995456337928772, 0.9368835687637329, 0.9467335343360901, 0.9949937462806702, 0.999894380569458, 0.9988865256309509, 0.9930035471916199, 0.9975302815437317, 0.9954912066459656, 0.824739933013916, 0.9803107380867004, 0.98244708776474, 0.9932101368904114, 0.9977071285247803, 0.5027340054512024, 0.9766203165054321, 0.9856435060501099, 0.9869322180747986], "line": {"id": "c990a4e6-7864-4f81-95fd-21d5e2521022", "bbox": [319, 2733, 3149, 2890], "type": "bbox"}}, {"prediction": "\u062f\u0642 \u0627\u0646\u0628\u0627\u062d\u0635\u0654\u0627 \u0646\u0627 \u0643\u0627\u062f\u0641 \u062a\u0644\u0639\u062c \u0645\u0627\u0644\u0633\u0644\u0627 \u0647\u064a\u0644\u0639 \u0649\u0633\u0648\u0645 \u0646\u0633\u062d\u0644\u0627 \u064a\u0627 \u0649\u0644\u0627 \u0646\u064a\u0637\u0642\u064a \u0646\u0628 \u0649\u0644\u0639 \u0628\u062a\u0643\u0641", "cuts": [[[330, 2903], [330, 3080], [343, 3080], [343, 2903]], [[407, 2903], [407, 3080], [407, 3080], [407, 2903]], [[433, 2903], [433, 3080], [446, 3080], [446, 2903]], [[459, 2903], [459, 3080], [472, 3080], [472, 2903]], [[485, 2903], [485, 3080], [497, 3080], [497, 2903]], [[510, 2903], [510, 3080], [510, 3080], [510, 2903]], [[549, 2903], [549, 3080], [549, 3080], [549, 2903]], [[575, 2903], [575, 3080], [588, 3080], [588, 2903]], [[613, 2903], [613, 3080], [613, 3080], [613, 2903]], [[639, 2903], [639, 3080], [652, 3080], [652, 2903]], [[665, 2903], [665, 3080], [665, 3080], [665, 2903]], [[678, 2903], [678, 3080], [691, 3080], [691, 2903]], [[716, 2903], [716, 3080], [729, 3080], [729, 2903]], [[768, 2903], [768, 3080], [768, 3080], [768, 2903]], [[781, 2903], [781, 3080], [807, 3080], [807, 2903]], [[845, 2903], [845, 3080], [845, 3080], [845, 2903]], [[897, 2903], [897, 3080], [897, 3080], [897, 2903]], [[935, 2903], [935, 3080], [948, 3080], [948, 2903]], [[974, 2903], [974, 3080], [974, 3080], [974, 2903]], [[1000, 2903], [1000, 3080], [1013, 3080], [1013, 2903]], [[1051, 2903], [1051, 3080], [1051, 3080], [1051, 2903]], [[1103, 2903], [1103, 3080], [1116, 3080], [1116, 2903]], [[1142, 2903], [1142, 3080], [1142, 3080], [1142, 2903]], [[1180, 2903], [1180, 3080], [1193, 3080], [1193, 2903]], [[1232, 2903], [1232, 3080], [1245, 3080], [1245, 2903]], [[1283, 2903], [1283, 3080], [1296, 3080], [1296, 2903]], [[1335, 2903], [1335, 3080], [1348, 3080], [1348, 2903]], [[1360, 2903], [1360, 3080], [1373, 3080], [1373, 2903]], [[1412, 2903], [1412, 3080], [1425, 3080], [1425, 2903]], [[1438, 2903], [1438, 3080], [1451, 3080], [1451, 2903]], [[1464, 2903], [1464, 3080], [1464, 3080], [1464, 2903]], [[1476, 2903], [1476, 3080], [1489, 3080], [1489, 2903]], [[1502, 2903], [1502, 3080], [1515, 3080], [1515, 2903]], [[1541, 2903], [1541, 3080], [1554, 3080], [1554, 2903]], [[1567, 2903], [1567, 3080], [1579, 3080], [1579, 2903]], [[1592, 2903], [1592, 3080], [1605, 3080], [1605, 2903]], [[1644, 2903], [1644, 3080], [1657, 3080], [1657, 2903]], [[1708, 2903], [1708, 3080], [1708, 3080], [1708, 2903]], [[1747, 2903], [1747, 3080], [1747, 3080], [1747, 2903]], [[1798, 2903], [1798, 3080], [1811, 3080], [1811, 2903]], [[1837, 2903], [1837, 3080], [1837, 3080], [1837, 2903]], [[1863, 2903], [1863, 3080], [1876, 3080], [1876, 2903]], [[1927, 2903], [1927, 3080], [1927, 3080], [1927, 2903]], [[1966, 2903], [1966, 3080], [1979, 3080], [1979, 2903]], [[2017, 2903], [2017, 3080], [2017, 3080], [2017, 2903]], [[2030, 2903], [2030, 3080], [2043, 3080], [2043, 2903]], [[2069, 2903], [2069, 3080], [2082, 3080], [2082, 2903]], [[2095, 2903], [2095, 3080], [2108, 3080], [2108, 2903]], [[2146, 2903], [2146, 3080], [2146, 3080], [2146, 2903]], [[2198, 2903], [2198, 3080], [2211, 3080], [2211, 2903]], [[2223, 2903], [2223, 3080], [2223, 3080], [2223, 2903]], [[2262, 2903], [2262, 3080], [2262, 3080], [2262, 2903]], [[2275, 2903], [2275, 3080], [2288, 3080], [2288, 2903]], [[2301, 2903], [2301, 3080], [2314, 3080], [2314, 2903]], [[2326, 2903], [2326, 3080], [2339, 3080], [2339, 2903]], [[2365, 2903], [2365, 3080], [2378, 3080], [2378, 2903]], [[2404, 2903], [2404, 3080], [2404, 3080], [2404, 2903]], [[2430, 2903], [2430, 3080], [2430, 3080], [2430, 2903]], [[2494, 2903], [2494, 3080], [2494, 3080], [2494, 2903]], [[2520, 2903], [2520, 3080], [2520, 3080], [2520, 2903]], [[2545, 2903], [2545, 3080], [2558, 3080], [2558, 2903]], [[2623, 2903], [2623, 3080], [2623, 3080], [2623, 2903]], [[2649, 2903], [2649, 3080], [2649, 3080], [2649, 2903]], [[2674, 2903], [2674, 3080], [2687, 3080], [2687, 2903]], [[2752, 2903], [2752, 3080], [2752, 3080], [2752, 2903]], [[2764, 2903], [2764, 3080], [2777, 3080], [2777, 2903]], [[2790, 2903], [2790, 3080], [2803, 3080], [2803, 2903]], [[2829, 2903], [2829, 3080], [2842, 3080], [2842, 2903]], [[2893, 2903], [2893, 3080], [2893, 3080], [2893, 2903]], [[2945, 2903], [2945, 3080], [2945, 3080], [2945, 2903]], [[2983, 2903], [2983, 3080], [2983, 3080], [2983, 2903]], [[3138, 2903], [3138, 3080], [3138, 3080], [3138, 2903]]], "confidences": [0.9998844861984253, 0.7102985382080078, 0.9393450021743774, 0.9997884631156921, 0.999976634979248, 0.9990993738174438, 0.9997594952583313, 0.9806336760520935, 0.9991434812545776, 0.999870777130127, 0.999963641166687, 0.9986358284950256, 0.9997819066047668, 0.9902760982513428, 0.9999171495437622, 0.870272159576416, 0.9959033131599426, 0.9999700784683228, 0.9983206391334534, 0.9999897480010986, 0.9983596205711365, 0.9999958276748657, 0.7078837156295776, 0.9993500113487244, 0.9999644756317139, 0.9912440776824951, 0.9898048639297485, 0.9963675737380981, 0.9999985694885254, 0.9996073842048645, 0.9969272017478943, 0.9999234676361084, 0.9996798038482666, 0.9999964237213135, 0.9991588592529297, 0.9990678429603577, 0.9999243021011353, 0.9791718125343323, 0.8421644568443298, 0.9974477291107178, 0.7698737978935242, 0.9559314250946045, 0.9906162619590759, 0.9658488631248474, 0.9968318343162537, 0.9971415400505066, 0.9973932504653931, 0.99928218126297, 0.9969269633293152, 0.9991139769554138, 0.994012176990509, 0.880149781703949, 0.9992927312850952, 0.9991368651390076, 0.9945836663246155, 0.9022614359855652, 0.9830822944641113, 0.9845501780509949, 0.9880629777908325, 0.9992579817771912, 0.9978712797164917, 0.9982649683952332, 0.996843695640564, 0.9984459280967712, 0.9971120357513428, 0.9952387809753418, 0.9999581575393677, 0.9986611604690552, 0.9999819993972778, 0.9977983832359314, 0.5938760638237, 0.49053633213043213], "line": {"id": "e8c7a301-87be-4cbb-b4cd-ca098110a82c", "bbox": [317, 2903, 3151, 3080], "type": "bbox"}}, {"prediction": "\u0646\u0655\u0627 \u062a\u0644\u0639\u0641 \u0647\u064a\u0644\u0639 \u0649\u0644\u0645\u0639 \u0646\u0648\u0643\u064a \u0627\u0645 \u0643\u0637\u062e\u0628 \u0649\u0644\u0627 \u0628\u062a\u0643\u062a \u0646\u0654\u0627 \u062a\u064a\u0654\u0627\u0631 \u0646\u0627\u0641 \u0646\u064a\u0644\u062c\u0631\u0644\u0627 \u062d\u0633\u0645 \u064a\u0641 \u0627\u0648\u0641\u0644\u062a\u062e\u0627", "cuts": [[[328, 3067], [328, 3246], [342, 3246], [342, 3067]], [[357, 3067], [357, 3246], [357, 3246], [357, 3067]], [[371, 3067], [371, 3246], [386, 3246], [386, 3067]], [[400, 3067], [400, 3246], [400, 3246], [400, 3067]], [[444, 3067], [444, 3246], [444, 3246], [444, 3067]], [[502, 3067], [502, 3246], [502, 3246], [502, 3067]], [[531, 3067], [531, 3246], [531, 3246], [531, 3067]], [[560, 3067], [560, 3246], [560, 3246], [560, 3067]], [[589, 3067], [589, 3246], [589, 3246], [589, 3067]], [[604, 3067], [604, 3246], [618, 3246], [618, 3067]], [[647, 3067], [647, 3246], [647, 3246], [647, 3067]], [[676, 3067], [676, 3246], [676, 3246], [676, 3067]], [[691, 3067], [691, 3246], [705, 3246], [705, 3067]], [[735, 3067], [735, 3246], [749, 3246], [749, 3067]], [[822, 3067], [822, 3246], [822, 3246], [822, 3067]], [[836, 3067], [836, 3246], [836, 3246], [836, 3067]], [[851, 3067], [851, 3246], [851, 3246], [851, 3067]], [[880, 3067], [880, 3246], [880, 3246], [880, 3067]], [[923, 3067], [923, 3246], [938, 3246], [938, 3067]], [[967, 3067], [967, 3246], [967, 3246], [967, 3067]], [[1025, 3067], [1025, 3246], [1025, 3246], [1025, 3067]], [[1054, 3067], [1054, 3246], [1054, 3246], [1054, 3067]], [[1098, 3067], [1098, 3246], [1098, 3246], [1098, 3067]], [[1127, 3067], [1127, 3246], [1141, 3246], [1141, 3067]], [[1170, 3067], [1170, 3246], [1185, 3246], [1185, 3067]], [[1200, 3067], [1200, 3246], [1214, 3246], [1214, 3067]], [[1243, 3067], [1243, 3246], [1243, 3246], [1243, 3067]], [[1301, 3067], [1301, 3246], [1301, 3246], [1301, 3067]], [[1359, 3067], [1359, 3246], [1359, 3246], [1359, 3067]], [[1403, 3067], [1403, 3246], [1403, 3246], [1403, 3067]], [[1432, 3067], [1432, 3246], [1432, 3246], [1432, 3067]], [[1461, 3067], [1461, 3246], [1476, 3246], [1476, 3067]], [[1548, 3067], [1548, 3246], [1548, 3246], [1548, 3067]], [[1563, 3067], [1563, 3246], [1563, 3246], [1563, 3067]], [[1577, 3067], [1577, 3246], [1592, 3246], [1592, 3067]], [[1606, 3067], [1606, 3246], [1621, 3246], [1621, 3067]], [[1665, 3067], [1665, 3246], [1665, 3246], [1665, 3067]], [[1723, 3067], [1723, 3246], [1723, 3246], [1723, 3067]], [[1781, 3067], [1781, 3246], [1781, 3246], [1781, 3067]], [[1839, 3067], [1839, 3246], [1839, 3246], [1839, 3067]], [[1868, 3067], [1868, 3246], [1883, 3246], [1883, 3067]], [[1926, 3067], [1926, 3246], [1941, 3246], [1941, 3067]], [[1970, 3067], [1970, 3246], [1970, 3246], [1970, 3067]], [[1984, 3067], [1984, 3246], [1984, 3246], [1984, 3067]], [[1999, 3067], [1999, 3246], [2013, 3246], [2013, 3067]], [[2057, 3067], [2057, 3246], [2057, 3246], [2057, 3067]], [[2115, 3067], [2115, 3246], [2115, 3246], [2115, 3067]], [[2130, 3067], [2130, 3246], [2144, 3246], [2144, 3067]], [[2159, 3067], [2159, 3246], [2159, 3246], [2159, 3067]], [[2202, 3067], [2202, 3246], [2202, 3246], [2202, 3067]], [[2231, 3067], [2231, 3246], [2231, 3246], [2231, 3067]], [[2260, 3067], [2260, 3246], [2275, 3246], [2275, 3067]], [[2304, 3067], [2304, 3246], [2304, 3246], [2304, 3067]], [[2319, 3067], [2319, 3246], [2319, 3246], [2319, 3067]], [[2348, 3067], [2348, 3246], [2362, 3246], [2362, 3067]], [[2391, 3067], [2391, 3246], [2391, 3246], [2391, 3067]], [[2420, 3067], [2420, 3246], [2420, 3246], [2420, 3067]], [[2449, 3067], [2449, 3246], [2449, 3246], [2449, 3067]], [[2478, 3067], [2478, 3246], [2493, 3246], [2493, 3067]], [[2537, 3067], [2537, 3246], [2551, 3246], [2551, 3067]], [[2566, 3067], [2566, 3246], [2566, 3246], [2566, 3067]], [[2580, 3067], [2580, 3246], [2595, 3246], [2595, 3067]], [[2609, 3067], [2609, 3246], [2624, 3246], [2624, 3067]], [[2653, 3067], [2653, 3246], [2653, 3246], [2653, 3067]], [[2711, 3067], [2711, 3246], [2711, 3246], [2711, 3067]], [[2755, 3067], [2755, 3246], [2755, 3246], [2755, 3067]], [[2769, 3067], [2769, 3246], [2784, 3246], [2784, 3067]], [[2827, 3067], [2827, 3246], [2827, 3246], [2827, 3067]], [[2842, 3067], [2842, 3246], [2842, 3246], [2842, 3067]], [[2871, 3067], [2871, 3246], [2871, 3246], [2871, 3067]], [[2900, 3067], [2900, 3246], [2900, 3246], [2900, 3067]], [[2943, 3067], [2943, 3246], [2958, 3246], [2958, 3067]], [[2987, 3067], [2987, 3246], [3002, 3246], [3002, 3067]], [[3016, 3067], [3016, 3246], [3016, 3246], [3016, 3067]], [[3045, 3067], [3045, 3246], [3045, 3246], [3045, 3067]], [[3089, 3067], [3089, 3246], [3089, 3246], [3089, 3067]], [[3132, 3067], [3132, 3246], [3147, 3246], [3147, 3067]]], "confidences": [0.9998571872711182, 0.9720284938812256, 0.9996850490570068, 0.9983483552932739, 0.9983503818511963, 0.9421389102935791, 0.9757440090179443, 0.9998825788497925, 0.995537281036377, 0.9998735189437866, 0.979082465171814, 0.9991683959960938, 0.8312473297119141, 0.9998272061347961, 0.9998739957809448, 0.9941480159759521, 0.6946954131126404, 0.9902309775352478, 0.99941086769104, 0.9953650236129761, 0.9976621866226196, 0.9999786615371704, 0.6234442591667175, 0.9998052716255188, 0.9999556541442871, 0.9997043013572693, 0.9890322089195251, 0.9971346855163574, 0.9940102100372314, 0.9995328187942505, 0.999966025352478, 0.7640908360481262, 0.4993588328361511, 0.9998918771743774, 0.9999830722808838, 0.9678281545639038, 0.9903719425201416, 0.9858986139297485, 0.6294997930526733, 0.971433699131012, 0.9831180572509766, 0.9937307834625244, 0.9823363423347473, 0.9849645495414734, 0.9930417537689209, 0.9968459010124207, 0.9991890788078308, 0.9997627139091492, 0.9964436888694763, 0.8590208292007446, 0.9995020627975464, 0.9917978048324585, 0.9393941760063171, 0.9994710087776184, 0.9996200799942017, 0.6683350205421448, 0.7901033759117126, 0.9907926917076111, 0.9704153537750244, 0.9975791573524475, 0.999360978603363, 0.9991258978843689, 0.9997497200965881, 0.8905563354492188, 0.9997245669364929, 0.9991188645362854, 0.9998225569725037, 0.9893819093704224, 0.997583270072937, 0.9980733394622803, 0.9992850422859192, 0.9999197721481323, 0.9919565916061401, 0.9748324751853943, 0.8973613381385803, 0.9983094930648804, 0.9631760120391846], "line": {"id": "e5df36d3-31b0-4a3c-ba0c-0a3f00af668b", "bbox": [313, 3067, 3147, 3246], "type": "bbox"}}, {"prediction": "\u0621\u0648\u0636\u0648\u0644\u0627 \u064a\u0641 \u0641\u0627\u0644\u062a\u062e\u0655\u0627\u0644\u0627 \u0646\u0645 \u062a\u0631\u0643\u0630 \u0627\u0645 \u062a\u0645\u0647\u0641 \u060c \u0639. \u0646\u0633\u062d\u0644\u0627 \u0648\u0628\u0654\u0627 \u0647\u064a\u0644\u0627 \u0628\u062a\u0643\u0642 \u0649\u0644\u0627\u0639\u062a \u0647\u062a\u0627 \u0621\u0627\u0634", "cuts": [[[318, 3226], [318, 3412], [318, 3412], [318, 3226]], [[375, 3226], [375, 3412], [375, 3412], [375, 3226]], [[418, 3226], [418, 3412], [418, 3412], [418, 3226]], [[489, 3226], [489, 3412], [503, 3412], [503, 3226]], [[517, 3226], [517, 3412], [517, 3412], [517, 3226]], [[546, 3226], [546, 3412], [546, 3412], [546, 3226]], [[560, 3226], [560, 3412], [574, 3412], [574, 3226]], [[603, 3226], [603, 3412], [603, 3412], [603, 3226]], [[617, 3226], [617, 3412], [617, 3412], [617, 3226]], [[646, 3226], [646, 3412], [660, 3412], [660, 3226]], [[745, 3226], [745, 3412], [745, 3412], [745, 3226]], [[774, 3226], [774, 3412], [788, 3412], [788, 3226]], [[802, 3226], [802, 3412], [802, 3412], [802, 3226]], [[831, 3226], [831, 3412], [831, 3412], [831, 3226]], [[873, 3226], [873, 3412], [888, 3412], [888, 3226]], [[930, 3226], [930, 3412], [930, 3412], [930, 3226]], [[945, 3226], [945, 3412], [945, 3412], [945, 3226]], [[959, 3226], [959, 3412], [973, 3412], [973, 3226]], [[987, 3226], [987, 3412], [1001, 3412], [1001, 3226]], [[1016, 3226], [1016, 3412], [1030, 3412], [1030, 3226]], [[1101, 3226], [1101, 3412], [1101, 3412], [1101, 3226]], [[1130, 3226], [1130, 3412], [1144, 3412], [1144, 3226]], [[1172, 3226], [1172, 3412], [1172, 3412], [1172, 3226]], [[1215, 3226], [1215, 3412], [1215, 3412], [1215, 3226]], [[1286, 3226], [1286, 3412], [1286, 3412], [1286, 3226]], [[1315, 3226], [1315, 3412], [1315, 3412], [1315, 3226]], [[1386, 3226], [1386, 3412], [1386, 3412], [1386, 3226]], [[1414, 3226], [1414, 3412], [1443, 3412], [1443, 3226]], [[1471, 3226], [1471, 3412], [1471, 3412], [1471, 3226]], [[1500, 3226], [1500, 3412], [1500, 3412], [1500, 3226]], [[1528, 3226], [1528, 3412], [1542, 3412], [1542, 3226]], [[1585, 3226], [1585, 3412], [1585, 3412], [1585, 3226]], [[1642, 3226], [1642, 3412], [1642, 3412], [1642, 3226]], [[1685, 3226], [1685, 3412], [1685, 3412], [1685, 3226]], [[1727, 3226], [1727, 3412], [1727, 3412], [1727, 3226]], [[1756, 3226], [1756, 3412], [1770, 3412], [1770, 3226]], [[1799, 3226], [1799, 3412], [1799, 3412], [1799, 3226]], [[1827, 3226], [1827, 3412], [1827, 3412], [1827, 3226]], [[1870, 3226], [1870, 3412], [1870, 3412], [1870, 3226]], [[1941, 3226], [1941, 3412], [1941, 3412], [1941, 3226]], [[1969, 3226], [1969, 3412], [1984, 3412], [1984, 3226]], [[2026, 3226], [2026, 3412], [2026, 3412], [2026, 3226]], [[2069, 3226], [2069, 3412], [2083, 3412], [2083, 3226]], [[2112, 3226], [2112, 3412], [2112, 3412], [2112, 3226]], [[2126, 3226], [2126, 3412], [2140, 3412], [2140, 3226]], [[2169, 3226], [2169, 3412], [2183, 3412], [2183, 3226]], [[2197, 3226], [2197, 3412], [2211, 3412], [2211, 3226]], [[2240, 3226], [2240, 3412], [2254, 3412], [2254, 3226]], [[2268, 3226], [2268, 3412], [2268, 3412], [2268, 3226]], [[2297, 3226], [2297, 3412], [2297, 3412], [2297, 3226]], [[2311, 3226], [2311, 3412], [2311, 3412], [2311, 3226]], [[2339, 3226], [2339, 3412], [2354, 3412], [2354, 3226]], [[2382, 3226], [2382, 3412], [2382, 3412], [2382, 3226]], [[2411, 3226], [2411, 3412], [2411, 3412], [2411, 3226]], [[2439, 3226], [2439, 3412], [2439, 3412], [2439, 3226]], [[2453, 3226], [2453, 3412], [2468, 3412], [2468, 3226]], [[2482, 3226], [2482, 3412], [2482, 3412], [2482, 3226]], [[2539, 3226], [2539, 3412], [2539, 3412], [2539, 3226]], [[2596, 3226], [2596, 3412], [2596, 3412], [2596, 3226]], [[2638, 3226], [2638, 3412], [2638, 3412], [2638, 3226]], [[2681, 3226], [2681, 3412], [2681, 3412], [2681, 3226]], [[2710, 3226], [2710, 3412], [2724, 3412], [2724, 3226]], [[2766, 3226], [2766, 3412], [2766, 3412], [2766, 3226]], [[2781, 3226], [2781, 3412], [2781, 3412], [2781, 3226]], [[2795, 3226], [2795, 3412], [2809, 3412], [2809, 3226]], [[2823, 3226], [2823, 3412], [2838, 3412], [2838, 3226]], [[2866, 3226], [2866, 3412], [2866, 3412], [2866, 3226]], [[2880, 3226], [2880, 3412], [2895, 3412], [2895, 3226]], [[2923, 3226], [2923, 3412], [2923, 3412], [2923, 3226]], [[2952, 3226], [2952, 3412], [2952, 3412], [2952, 3226]], [[2994, 3226], [2994, 3412], [2994, 3412], [2994, 3226]], [[3008, 3226], [3008, 3412], [3023, 3412], [3023, 3226]], [[3051, 3226], [3051, 3412], [3051, 3412], [3051, 3226]], [[3080, 3226], [3080, 3412], [3094, 3412], [3094, 3226]], [[3137, 3226], [3137, 3412], [3137, 3412], [3137, 3226]]], "confidences": [0.9989814162254333, 0.9999122619628906, 0.9998594522476196, 0.9999371767044067, 0.9949018955230713, 0.8918391466140747, 0.9331813454627991, 0.9998503923416138, 0.999738872051239, 0.9999352693557739, 0.9999396800994873, 0.9997422099113464, 0.9998968839645386, 0.999890923500061, 0.9986469149589539, 0.9979827404022217, 0.9983227849006653, 0.9980936646461487, 0.9998340606689453, 0.9999415874481201, 0.9813975095748901, 0.9996932744979858, 0.9956713914871216, 0.9996687173843384, 0.9994198083877563, 0.732080340385437, 0.840719997882843, 0.9999840259552002, 0.9996098875999451, 0.9923226237297058, 0.9988951086997986, 0.5162858963012695, 0.5562438368797302, 0.799801766872406, 0.9747372269630432, 0.9793431758880615, 0.9933470487594604, 0.9947622418403625, 0.9987406134605408, 0.9820605516433716, 0.9616630673408508, 0.9937961101531982, 0.9977521300315857, 0.996338963508606, 0.9950332641601562, 0.8663762807846069, 0.9994631409645081, 0.9986950755119324, 0.8317818641662598, 0.9994366765022278, 0.9611929655075073, 0.9998297691345215, 0.9822288751602173, 0.9975958466529846, 0.9939688444137573, 0.9993873834609985, 0.998565137386322, 0.9918579459190369, 0.9916180968284607, 0.9998064637184143, 0.8910688161849976, 0.9938943982124329, 0.9996296167373657, 0.9683365821838379, 0.8659057021141052, 0.999840497970581, 0.9998772144317627, 0.9978265166282654, 0.9994264841079712, 0.9970901012420654, 0.9989050626754761, 0.9994168281555176, 0.9968239068984985, 0.9972999691963196, 0.8729744553565979], "line": {"id": "3bb7ac42-61d6-4a41-8c37-8b6403c24061", "bbox": [318, 3226, 3151, 3412], "type": "bbox"}}, {"prediction": "\u0644\u063a\u062a\u0648 \u0627\u0654\u064a\u0627\u0644\u062b \u0643\u0647\u062c\u0648 \u0644\u0633\u063a\u062a\u0648 \u0627\u062b\u0627\u0644\u062b \u0642\u0634\u0646\u062a\u0633\u062a\u0648 \u0627\u0627\u0644\u062b \u0636\u0645\u0636\u0645\u062a \u0646\u0654\u0627 \u0643\u0644\u0630 \u064a\u0641 \u0647\u0628\u0643\u0631\u0645\u0653\u0627 \u0649\u0630\u0644\u0627\u0648", "cuts": [[[340, 3404], [340, 3582], [369, 3582], [369, 3404]], [[398, 3404], [398, 3582], [398, 3582], [398, 3404]], [[441, 3404], [441, 3582], [441, 3582], [441, 3404]], [[484, 3404], [484, 3582], [498, 3582], [498, 3404]], [[513, 3404], [513, 3582], [527, 3582], [527, 3404]], [[556, 3404], [556, 3582], [556, 3582], [556, 3404]], [[570, 3404], [570, 3582], [570, 3582], [570, 3404]], [[585, 3404], [585, 3582], [585, 3582], [585, 3404]], [[613, 3404], [613, 3582], [628, 3582], [628, 3404]], [[642, 3404], [642, 3582], [642, 3582], [642, 3404]], [[671, 3404], [671, 3582], [671, 3582], [671, 3404]], [[700, 3404], [700, 3582], [714, 3582], [714, 3404]], [[757, 3404], [757, 3582], [757, 3582], [757, 3404]], [[800, 3404], [800, 3582], [815, 3582], [815, 3404]], [[844, 3404], [844, 3582], [858, 3582], [858, 3404]], [[930, 3404], [930, 3582], [930, 3582], [930, 3404]], [[959, 3404], [959, 3582], [973, 3582], [973, 3404]], [[1016, 3404], [1016, 3582], [1031, 3582], [1031, 3404]], [[1059, 3404], [1059, 3582], [1074, 3582], [1074, 3404]], [[1117, 3404], [1117, 3582], [1117, 3582], [1117, 3404]], [[1146, 3404], [1146, 3582], [1160, 3582], [1160, 3404]], [[1203, 3404], [1203, 3582], [1203, 3582], [1203, 3404]], [[1232, 3404], [1232, 3582], [1246, 3582], [1246, 3404]], [[1261, 3404], [1261, 3582], [1275, 3582], [1275, 3404]], [[1290, 3404], [1290, 3582], [1290, 3582], [1290, 3404]], [[1318, 3404], [1318, 3582], [1333, 3582], [1333, 3404]], [[1347, 3404], [1347, 3582], [1362, 3582], [1362, 3404]], [[1376, 3404], [1376, 3582], [1390, 3582], [1390, 3404]], [[1405, 3404], [1405, 3582], [1419, 3582], [1419, 3404]], [[1462, 3404], [1462, 3582], [1462, 3582], [1462, 3404]], [[1520, 3404], [1520, 3582], [1520, 3582], [1520, 3404]], [[1549, 3404], [1549, 3582], [1549, 3582], [1549, 3404]], [[1577, 3404], [1577, 3582], [1577, 3582], [1577, 3404]], [[1621, 3404], [1621, 3582], [1635, 3582], [1635, 3404]], [[1664, 3404], [1664, 3582], [1664, 3582], [1664, 3404]], [[1707, 3404], [1707, 3582], [1721, 3582], [1721, 3404]], [[1736, 3404], [1736, 3582], [1764, 3582], [1764, 3404]], [[1779, 3404], [1779, 3582], [1793, 3582], [1793, 3404]], [[1836, 3404], [1836, 3582], [1851, 3582], [1851, 3404]], [[1880, 3404], [1880, 3582], [1880, 3582], [1880, 3404]], [[1908, 3404], [1908, 3582], [1908, 3582], [1908, 3404]], [[1923, 3404], [1923, 3582], [1937, 3582], [1937, 3404]], [[2009, 3404], [2009, 3582], [2009, 3582], [2009, 3404]], [[2067, 3404], [2067, 3582], [2067, 3582], [2067, 3404]], [[2124, 3404], [2124, 3582], [2124, 3582], [2124, 3404]], [[2182, 3404], [2182, 3582], [2182, 3582], [2182, 3404]], [[2211, 3404], [2211, 3582], [2211, 3582], [2211, 3404]], [[2239, 3404], [2239, 3582], [2254, 3582], [2254, 3404]], [[2282, 3404], [2282, 3582], [2282, 3582], [2282, 3404]], [[2311, 3404], [2311, 3582], [2311, 3582], [2311, 3404]], [[2326, 3404], [2326, 3582], [2326, 3582], [2326, 3404]], [[2340, 3404], [2340, 3582], [2354, 3582], [2354, 3404]], [[2398, 3404], [2398, 3582], [2398, 3582], [2398, 3404]], [[2455, 3404], [2455, 3582], [2455, 3582], [2455, 3404]], [[2484, 3404], [2484, 3582], [2484, 3582], [2484, 3404]], [[2513, 3404], [2513, 3582], [2513, 3582], [2513, 3404]], [[2556, 3404], [2556, 3582], [2556, 3582], [2556, 3404]], [[2570, 3404], [2570, 3582], [2570, 3582], [2570, 3404]], [[2599, 3404], [2599, 3582], [2613, 3582], [2613, 3404]], [[2628, 3404], [2628, 3582], [2628, 3582], [2628, 3404]], [[2657, 3404], [2657, 3582], [2657, 3582], [2657, 3404]], [[2714, 3404], [2714, 3582], [2714, 3582], [2714, 3404]], [[2772, 3404], [2772, 3582], [2786, 3582], [2786, 3404]], [[2800, 3404], [2800, 3582], [2815, 3582], [2815, 3404]], [[2858, 3404], [2858, 3582], [2858, 3582], [2858, 3404]], [[2872, 3404], [2872, 3582], [2887, 3582], [2887, 3404]], [[2901, 3404], [2901, 3582], [2916, 3582], [2916, 3404]], [[2988, 3404], [2988, 3582], [2988, 3582], [2988, 3404]], [[3031, 3404], [3031, 3582], [3031, 3582], [3031, 3404]], [[3059, 3404], [3059, 3582], [3074, 3582], [3074, 3404]], [[3088, 3404], [3088, 3582], [3088, 3582], [3088, 3404]], [[3131, 3404], [3131, 3582], [3131, 3582], [3131, 3404]]], "confidences": [0.9967783093452454, 0.9999089241027832, 0.6990695595741272, 0.9999850988388062, 0.9994284510612488, 0.9905351996421814, 0.9979711174964905, 0.9925774931907654, 0.9997119307518005, 0.9998630285263062, 0.9991826415061951, 0.9995831847190857, 0.8739675283432007, 0.9986891150474548, 0.9998999834060669, 0.712096631526947, 0.9542328119277954, 0.9998071789741516, 0.9994687438011169, 0.9119349718093872, 0.9997267127037048, 0.9990538954734802, 0.9999830722808838, 0.9995676875114441, 0.9998180270195007, 0.9542503952980042, 0.9904987215995789, 0.9882673621177673, 0.9979777932167053, 0.9933269023895264, 0.9998037219047546, 0.9610075354576111, 0.9995414018630981, 0.9869469404220581, 0.9698469638824463, 0.9878268837928772, 0.9939728379249573, 0.8041937947273254, 0.9983476400375366, 0.792262077331543, 0.9819558262825012, 0.9396706223487854, 0.997104823589325, 0.9705645442008972, 0.9958399534225464, 0.9978986978530884, 0.8801516890525818, 0.9995551705360413, 0.9966424703598022, 0.9960938096046448, 0.9987300038337708, 0.9998194575309753, 0.563930094242096, 0.9453648328781128, 0.9340890049934387, 0.5644081830978394, 0.9911462664604187, 0.9987581968307495, 0.8091545701026917, 0.9992177486419678, 0.9971036314964294, 0.999757707118988, 0.999749481678009, 0.9985652565956116, 0.9988590478897095, 0.9889073371887207, 0.9370191693305969, 0.9869567155838013, 0.5738163590431213, 0.9979482293128967, 0.9877589344978333, 0.9431320428848267], "line": {"id": "35baa9ea-e0c2-4349-8f5f-e1faa768e791", "bbox": [311, 3404, 3146, 3582], "type": "bbox"}}, {"prediction": "\u0631\u0647\u0627\u0638 \u062d\u0633\u0645\u062a\u0648 \u0647\u0644\u0643 \u0643\u0633\u0654\u0627\u0631 \u062d\u0633\u0645\u062a\u0648 \u0646\u064a\u0642\u0641\u0631\u0645\u0644\u0627 \u0649\u0644\u0627 \u0643\u0639\u0628\u0627\u0635\u0654\u0627 \u0646\u0645 \u0643\u062f\u064a \u0644\u0633\u063a\u062a\u0648 \u0643\u062a\u064a\u062d\u0644 \u0631\u0639\u0634", "cuts": [[[321, 3580], [321, 3731], [335, 3731], [335, 3580]], [[363, 3580], [363, 3731], [363, 3731], [363, 3580]], [[405, 3580], [405, 3731], [405, 3731], [405, 3580]], [[434, 3580], [434, 3731], [434, 3731], [434, 3580]], [[476, 3580], [476, 3731], [504, 3731], [504, 3580]], [[546, 3580], [546, 3731], [560, 3731], [560, 3580]], [[616, 3580], [616, 3731], [616, 3731], [616, 3580]], [[644, 3580], [644, 3731], [658, 3731], [658, 3580]], [[672, 3580], [672, 3731], [672, 3731], [672, 3580]], [[729, 3580], [729, 3731], [729, 3731], [729, 3580]], [[757, 3580], [757, 3731], [771, 3731], [771, 3580]], [[785, 3580], [785, 3731], [799, 3731], [799, 3580]], [[813, 3580], [813, 3731], [827, 3731], [827, 3580]], [[841, 3580], [841, 3731], [841, 3731], [841, 3580]], [[883, 3580], [883, 3731], [883, 3731], [883, 3580]], [[925, 3580], [925, 3731], [925, 3731], [925, 3580]], [[995, 3580], [995, 3731], [1010, 3731], [1010, 3580]], [[1024, 3580], [1024, 3731], [1038, 3731], [1038, 3580]], [[1052, 3580], [1052, 3731], [1052, 3731], [1052, 3580]], [[1094, 3580], [1094, 3731], [1094, 3731], [1094, 3580]], [[1122, 3580], [1122, 3731], [1136, 3731], [1136, 3580]], [[1178, 3580], [1178, 3731], [1178, 3731], [1178, 3580]], [[1234, 3580], [1234, 3731], [1248, 3731], [1248, 3580]], [[1262, 3580], [1262, 3731], [1276, 3731], [1276, 3580]], [[1291, 3580], [1291, 3731], [1305, 3731], [1305, 3580]], [[1347, 3580], [1347, 3731], [1361, 3731], [1361, 3580]], [[1375, 3580], [1375, 3731], [1389, 3731], [1389, 3580]], [[1417, 3580], [1417, 3731], [1431, 3731], [1431, 3580]], [[1445, 3580], [1445, 3731], [1459, 3731], [1459, 3580]], [[1501, 3580], [1501, 3731], [1501, 3731], [1501, 3580]], [[1529, 3580], [1529, 3731], [1529, 3731], [1529, 3580]], [[1571, 3580], [1571, 3731], [1586, 3731], [1586, 3580]], [[1600, 3580], [1600, 3731], [1600, 3731], [1600, 3580]], [[1614, 3580], [1614, 3731], [1628, 3731], [1628, 3580]], [[1642, 3580], [1642, 3731], [1642, 3731], [1642, 3580]], [[1656, 3580], [1656, 3731], [1670, 3731], [1670, 3580]], [[1712, 3580], [1712, 3731], [1712, 3731], [1712, 3580]], [[1726, 3580], [1726, 3731], [1726, 3731], [1726, 3580]], [[1754, 3580], [1754, 3731], [1754, 3731], [1754, 3580]], [[1768, 3580], [1768, 3731], [1782, 3731], [1782, 3580]], [[1824, 3580], [1824, 3731], [1824, 3731], [1824, 3580]], [[1881, 3580], [1881, 3731], [1881, 3731], [1881, 3580]], [[1909, 3580], [1909, 3731], [1923, 3731], [1923, 3580]], [[1951, 3580], [1951, 3731], [1951, 3731], [1951, 3580]], [[2007, 3580], [2007, 3731], [2007, 3731], [2007, 3580]], [[2035, 3580], [2035, 3731], [2049, 3731], [2049, 3580]], [[2063, 3580], [2063, 3731], [2063, 3731], [2063, 3580]], [[2077, 3580], [2077, 3731], [2091, 3731], [2091, 3580]], [[2232, 3580], [2232, 3731], [2232, 3731], [2232, 3580]], [[2316, 3580], [2316, 3731], [2330, 3731], [2330, 3580]], [[2358, 3580], [2358, 3731], [2358, 3731], [2358, 3580]], [[2400, 3580], [2400, 3731], [2400, 3731], [2400, 3580]], [[2457, 3580], [2457, 3731], [2457, 3731], [2457, 3580]], [[2485, 3580], [2485, 3731], [2485, 3731], [2485, 3580]], [[2513, 3580], [2513, 3731], [2527, 3731], [2527, 3580]], [[2569, 3580], [2569, 3731], [2569, 3731], [2569, 3580]], [[2611, 3580], [2611, 3731], [2625, 3731], [2625, 3580]], [[2653, 3580], [2653, 3731], [2653, 3731], [2653, 3580]], [[2695, 3580], [2695, 3731], [2695, 3731], [2695, 3580]], [[2737, 3580], [2737, 3731], [2752, 3731], [2752, 3580]], [[2766, 3580], [2766, 3731], [2780, 3731], [2780, 3580]], [[2822, 3580], [2822, 3731], [2822, 3731], [2822, 3580]], [[2878, 3580], [2878, 3731], [2878, 3731], [2878, 3580]], [[2906, 3580], [2906, 3731], [2920, 3731], [2920, 3580]], [[2948, 3580], [2948, 3731], [2948, 3731], [2948, 3580]], [[2962, 3580], [2962, 3731], [2962, 3731], [2962, 3580]], [[3004, 3580], [3004, 3731], [3004, 3731], [3004, 3580]], [[3032, 3580], [3032, 3731], [3047, 3731], [3047, 3580]], [[3075, 3580], [3075, 3731], [3075, 3731], [3075, 3580]], [[3131, 3580], [3131, 3731], [3131, 3731], [3131, 3580]]], "confidences": [0.998375415802002, 0.7084844708442688, 0.9999047517776489, 0.9999986886978149, 0.9975200295448303, 0.9999372959136963, 0.9996757507324219, 0.9996148347854614, 0.9969292283058167, 0.9986764788627625, 0.9608417749404907, 0.9995263814926147, 0.9976219534873962, 0.9999587535858154, 0.9711738228797913, 0.9985242486000061, 0.8398705720901489, 0.9996516704559326, 0.9961230158805847, 0.9993791580200195, 0.9999798536300659, 0.9998527765274048, 0.9999849796295166, 0.9962425231933594, 0.9955328702926636, 0.9989853501319885, 0.999942421913147, 0.9898174405097961, 0.9999264478683472, 0.999687910079956, 0.9997530579566956, 0.9998797178268433, 0.9882998466491699, 0.9634631872177124, 0.999843955039978, 0.9989407658576965, 0.9994811415672302, 0.9873757362365723, 0.996773898601532, 0.9990653395652771, 0.9880833029747009, 0.9579822421073914, 0.9963617920875549, 0.968079149723053, 0.9967735409736633, 0.9786046743392944, 0.6416178941726685, 0.9990584254264832, 0.99955815076828, 0.9967063069343567, 0.998286783695221, 0.6909951567649841, 0.7128172516822815, 0.9613966941833496, 0.9996551275253296, 0.9983021020889282, 0.999221682548523, 0.9992075562477112, 0.9989655017852783, 0.9996083378791809, 0.9999632835388184, 0.936977207660675, 0.9235370755195618, 0.9997147917747498, 0.667002260684967, 0.9975676536560059, 0.9907772541046143, 0.9969243407249451, 0.9055776000022888, 0.7779210209846497], "line": {"id": "b70a13b9-2e63-4bd6-a567-65320f60f155", "bbox": [307, 3580, 3145, 3731], "type": "bbox"}}, {"prediction": "\u0644\u0635\u0648 \u0627\u0644\u0641 \u0647\u0631\u064a\u063a \u0649\u0644\u0627 \u0643\u0644\u0630 \u0641\u0644\u0627\u062e \u0627\u0644\u0648 \u0627\u0645\u062b\u0627\u0644\u062b \u0646\u064a\u0628\u0639\u0643\u0644\u0627 \u0649\u0644\u0627 \u0643\u064a\u0644\u062c\u0631 \u0644\u0633\u063a\u062a\u0648\u0627\u0645\u0647\u0646\u0637\u0627\u0628\u0648 \u0643\u064a\u0646\u0630\u0627", "cuts": [[[361, 3744], [361, 3918], [375, 3918], [375, 3744]], [[417, 3744], [417, 3918], [417, 3918], [417, 3744]], [[487, 3744], [487, 3918], [487, 3918], [487, 3744]], [[515, 3744], [515, 3918], [529, 3918], [529, 3744]], [[543, 3744], [543, 3918], [557, 3918], [557, 3744]], [[585, 3744], [585, 3918], [599, 3918], [599, 3744]], [[613, 3744], [613, 3918], [613, 3918], [613, 3744]], [[641, 3744], [641, 3918], [655, 3918], [655, 3744]], [[683, 3744], [683, 3918], [683, 3918], [683, 3744]], [[739, 3744], [739, 3918], [739, 3918], [739, 3744]], [[753, 3744], [753, 3918], [767, 3918], [767, 3744]], [[795, 3744], [795, 3918], [795, 3918], [795, 3744]], [[837, 3744], [837, 3918], [837, 3918], [837, 3744]], [[879, 3744], [879, 3918], [879, 3918], [879, 3744]], [[893, 3744], [893, 3918], [907, 3918], [907, 3744]], [[921, 3744], [921, 3918], [921, 3918], [921, 3744]], [[935, 3744], [935, 3918], [963, 3918], [963, 3744]], [[1019, 3744], [1019, 3918], [1019, 3918], [1019, 3744]], [[1075, 3744], [1075, 3918], [1075, 3918], [1075, 3744]], [[1103, 3744], [1103, 3918], [1103, 3918], [1103, 3744]], [[1131, 3744], [1131, 3918], [1145, 3918], [1145, 3744]], [[1215, 3744], [1215, 3918], [1229, 3918], [1229, 3744]], [[1243, 3744], [1243, 3918], [1257, 3918], [1257, 3744]], [[1271, 3744], [1271, 3918], [1285, 3918], [1285, 3744]], [[1299, 3744], [1299, 3918], [1313, 3918], [1313, 3744]], [[1383, 3744], [1383, 3918], [1397, 3918], [1397, 3744]], [[1411, 3744], [1411, 3918], [1439, 3918], [1439, 3744]], [[1453, 3744], [1453, 3918], [1467, 3918], [1467, 3744]], [[1509, 3744], [1509, 3918], [1509, 3918], [1509, 3744]], [[1537, 3744], [1537, 3918], [1537, 3918], [1537, 3744]], [[1551, 3744], [1551, 3918], [1551, 3918], [1551, 3744]], [[1565, 3744], [1565, 3918], [1565, 3918], [1565, 3744]], [[1579, 3744], [1579, 3918], [1579, 3918], [1579, 3744]], [[1607, 3744], [1607, 3918], [1621, 3918], [1621, 3744]], [[1635, 3744], [1635, 3918], [1649, 3918], [1649, 3744]], [[1663, 3744], [1663, 3918], [1663, 3918], [1663, 3744]], [[1691, 3744], [1691, 3918], [1719, 3918], [1719, 3744]], [[1747, 3744], [1747, 3918], [1761, 3918], [1761, 3744]], [[1775, 3744], [1775, 3918], [1789, 3918], [1789, 3744]], [[1803, 3744], [1803, 3918], [1817, 3918], [1817, 3744]], [[1845, 3744], [1845, 3918], [1845, 3918], [1845, 3744]], [[1873, 3744], [1873, 3918], [1873, 3918], [1873, 3744]], [[1943, 3744], [1943, 3918], [1957, 3918], [1957, 3744]], [[1971, 3744], [1971, 3918], [1971, 3918], [1971, 3744]], [[1985, 3744], [1985, 3918], [1999, 3918], [1999, 3744]], [[2041, 3744], [2041, 3918], [2041, 3918], [2041, 3744]], [[2055, 3744], [2055, 3918], [2055, 3918], [2055, 3744]], [[2083, 3744], [2083, 3918], [2083, 3918], [2083, 3744]], [[2097, 3744], [2097, 3918], [2111, 3918], [2111, 3744]], [[2153, 3744], [2153, 3918], [2153, 3918], [2153, 3744]], [[2209, 3744], [2209, 3918], [2209, 3918], [2209, 3744]], [[2237, 3744], [2237, 3918], [2237, 3918], [2237, 3744]], [[2265, 3744], [2265, 3918], [2279, 3918], [2279, 3744]], [[2335, 3744], [2335, 3918], [2349, 3918], [2349, 3744]], [[2363, 3744], [2363, 3918], [2377, 3918], [2377, 3744]], [[2419, 3744], [2419, 3918], [2433, 3918], [2433, 3744]], [[2475, 3744], [2475, 3918], [2475, 3918], [2475, 3744]], [[2517, 3744], [2517, 3918], [2517, 3918], [2517, 3744]], [[2545, 3744], [2545, 3918], [2545, 3918], [2545, 3744]], [[2601, 3744], [2601, 3918], [2601, 3918], [2601, 3744]], [[2643, 3744], [2643, 3918], [2643, 3918], [2643, 3744]], [[2657, 3744], [2657, 3918], [2671, 3918], [2671, 3744]], [[2699, 3744], [2699, 3918], [2713, 3918], [2713, 3744]], [[2741, 3744], [2741, 3918], [2741, 3918], [2741, 3744]], [[2769, 3744], [2769, 3918], [2769, 3918], [2769, 3744]], [[2811, 3744], [2811, 3918], [2825, 3918], [2825, 3744]], [[2839, 3744], [2839, 3918], [2839, 3918], [2839, 3744]], [[2881, 3744], [2881, 3918], [2895, 3918], [2895, 3744]], [[2923, 3744], [2923, 3918], [2923, 3918], [2923, 3744]], [[2965, 3744], [2965, 3918], [2979, 3918], [2979, 3744]], [[3021, 3744], [3021, 3918], [3035, 3918], [3035, 3744]], [[3049, 3744], [3049, 3918], [3049, 3918], [3049, 3744]], [[3077, 3744], [3077, 3918], [3091, 3918], [3091, 3744]], [[3119, 3744], [3119, 3918], [3133, 3918], [3133, 3744]]], "confidences": [0.9999858140945435, 0.9996674060821533, 0.9778488278388977, 0.999860405921936, 0.9980079531669617, 0.9999980926513672, 0.9997289776802063, 0.9999096393585205, 0.9999042749404907, 0.9987836480140686, 0.999509334564209, 0.8447310328483582, 0.9997413754463196, 0.9830690622329712, 0.9998390674591064, 0.8895362615585327, 0.9999918937683105, 0.9990143775939941, 0.9999878406524658, 0.9991787075996399, 0.9999074935913086, 0.999941349029541, 0.9998675584793091, 0.9998282194137573, 0.99846351146698, 0.9999916553497314, 0.9999760389328003, 0.9508774876594543, 0.9997891783714294, 0.9323558807373047, 0.9861510396003723, 0.9936410784721375, 0.9994382262229919, 0.9971796274185181, 0.9985735416412354, 0.9859241843223572, 0.9663385152816772, 0.9317023158073425, 0.9961659908294678, 0.9577418565750122, 0.9928492307662964, 0.9323335886001587, 0.9990610480308533, 0.9972244501113892, 0.9995347261428833, 0.9952410459518433, 0.9984773993492126, 0.999396800994873, 0.9987291693687439, 0.8243120908737183, 0.9955060482025146, 0.7022139430046082, 0.9865391850471497, 0.9992412328720093, 0.9976450800895691, 0.9810840487480164, 0.9991329312324524, 0.9990897178649902, 0.9992324113845825, 0.998461127281189, 0.9994111061096191, 0.9990944862365723, 0.9991432428359985, 0.9482150077819824, 0.9927623867988586, 0.9994828701019287, 0.953675389289856, 0.9985700845718384, 0.9993718266487122, 0.94927978515625, 0.9973020553588867, 0.9952284097671509, 0.9812739491462708, 0.9950826168060303], "line": {"id": "89d8c033-1838-4339-a7c5-765c50025016", "bbox": [333, 3744, 3133, 3918], "type": "bbox"}}, {"prediction": "\u0649\u0627\u0644\u0648\u0645\u0644\u0627\u0642 \u0645\u062b \u0647\u0641\u0627\u0644\u062e \u0649\u0644\u0639 \u0629\u0628\u0627\u0635\u0639\u0644\u0627 \u0639\u0645\u062c\u0654\u0627 \u0627\u0645 \u0647\u064a\u0641 \u0647\u0644 \u0645\u0633\u0631 \u0645 \u0628\u062c\u0639\u062a \u0646\u064a\u0637\u0642\u064a \u0646\u0628 \u0649\u0644\u0639 \u0649\u0644\u0627 \u0628\u0646\u0627\u062a\u0643\u0644\u0627", "cuts": [[[374, 3912], [374, 4081], [374, 4081], [374, 3912]], [[416, 3912], [416, 4081], [430, 4081], [430, 3912]], [[444, 3912], [444, 4081], [458, 4081], [458, 3912]], [[486, 3912], [486, 4081], [500, 4081], [500, 3912]], [[528, 3912], [528, 4081], [528, 4081], [528, 3912]], [[598, 3912], [598, 4081], [598, 4081], [598, 3912]], [[612, 3912], [612, 4081], [612, 4081], [612, 3912]], [[641, 3912], [641, 4081], [641, 4081], [641, 3912]], [[669, 3912], [669, 4081], [683, 4081], [683, 3912]], [[697, 3912], [697, 4081], [711, 4081], [711, 3912]], [[739, 3912], [739, 4081], [739, 4081], [739, 3912]], [[767, 3912], [767, 4081], [767, 4081], [767, 3912]], [[781, 3912], [781, 4081], [795, 4081], [795, 3912]], [[823, 3912], [823, 4081], [823, 4081], [823, 3912]], [[851, 3912], [851, 4081], [865, 4081], [865, 3912]], [[879, 3912], [879, 4081], [893, 4081], [893, 3912]], [[921, 3912], [921, 4081], [935, 4081], [935, 3912]], [[963, 3912], [963, 4081], [977, 4081], [977, 3912]], [[1019, 3912], [1019, 4081], [1019, 4081], [1019, 3912]], [[1033, 3912], [1033, 4081], [1033, 4081], [1033, 3912]], [[1047, 3912], [1047, 4081], [1061, 4081], [1061, 3912]], [[1089, 3912], [1089, 4081], [1103, 4081], [1103, 3912]], [[1117, 3912], [1117, 4081], [1117, 4081], [1117, 3912]], [[1145, 3912], [1145, 4081], [1145, 4081], [1145, 3912]], [[1173, 3912], [1173, 4081], [1187, 4081], [1187, 3912]], [[1229, 3912], [1229, 4081], [1229, 4081], [1229, 3912]], [[1271, 3912], [1271, 4081], [1285, 4081], [1285, 3912]], [[1313, 3912], [1313, 4081], [1313, 4081], [1313, 3912]], [[1327, 3912], [1327, 4081], [1327, 4081], [1327, 3912]], [[1341, 3912], [1341, 4081], [1356, 4081], [1356, 3912]], [[1370, 3912], [1370, 4081], [1384, 4081], [1384, 3912]], [[1412, 3912], [1412, 4081], [1426, 4081], [1426, 3912]], [[1440, 3912], [1440, 4081], [1454, 4081], [1454, 3912]], [[1482, 3912], [1482, 4081], [1482, 4081], [1482, 3912]], [[1496, 3912], [1496, 4081], [1496, 4081], [1496, 3912]], [[1524, 3912], [1524, 4081], [1524, 4081], [1524, 3912]], [[1538, 3912], [1538, 4081], [1538, 4081], [1538, 3912]], [[1594, 3912], [1594, 4081], [1608, 4081], [1608, 3912]], [[1636, 3912], [1636, 4081], [1650, 4081], [1650, 3912]], [[1664, 3912], [1664, 4081], [1664, 4081], [1664, 3912]], [[1692, 3912], [1692, 4081], [1692, 4081], [1692, 3912]], [[1720, 3912], [1720, 4081], [1720, 4081], [1720, 3912]], [[1748, 3912], [1748, 4081], [1762, 4081], [1762, 3912]], [[1776, 3912], [1776, 4081], [1776, 4081], [1776, 3912]], [[1804, 3912], [1804, 4081], [1818, 4081], [1818, 3912]], [[1832, 3912], [1832, 4081], [1832, 4081], [1832, 3912]], [[1846, 3912], [1846, 4081], [1860, 4081], [1860, 3912]], [[1916, 3912], [1916, 4081], [1916, 4081], [1916, 3912]], [[1972, 3912], [1972, 4081], [1972, 4081], [1972, 3912]], [[1986, 3912], [1986, 4081], [2000, 4081], [2000, 3912]], [[2042, 3912], [2042, 4081], [2042, 4081], [2042, 3912]], [[2084, 3912], [2084, 4081], [2099, 4081], [2099, 3912]], [[2141, 3912], [2141, 4081], [2141, 4081], [2141, 3912]], [[2197, 3912], [2197, 4081], [2211, 4081], [2211, 3912]], [[2253, 3912], [2253, 4081], [2253, 4081], [2253, 3912]], [[2281, 3912], [2281, 4081], [2281, 4081], [2281, 3912]], [[2309, 3912], [2309, 4081], [2323, 4081], [2323, 3912]], [[2351, 3912], [2351, 4081], [2365, 4081], [2365, 3912]], [[2379, 3912], [2379, 4081], [2379, 4081], [2379, 3912]], [[2407, 3912], [2407, 4081], [2421, 4081], [2421, 3912]], [[2463, 3912], [2463, 4081], [2477, 4081], [2477, 3912]], [[2491, 3912], [2491, 4081], [2505, 4081], [2505, 3912]], [[2519, 3912], [2519, 4081], [2519, 4081], [2519, 3912]], [[2547, 3912], [2547, 4081], [2561, 4081], [2561, 3912]], [[2575, 3912], [2575, 4081], [2575, 4081], [2575, 3912]], [[2603, 3912], [2603, 4081], [2617, 4081], [2617, 3912]], [[2687, 3912], [2687, 4081], [2687, 4081], [2687, 3912]], [[2701, 3912], [2701, 4081], [2701, 4081], [2701, 3912]], [[2715, 3912], [2715, 4081], [2729, 4081], [2729, 3912]], [[2771, 3912], [2771, 4081], [2771, 4081], [2771, 3912]], [[2813, 3912], [2813, 4081], [2813, 4081], [2813, 3912]], [[2828, 3912], [2828, 4081], [2842, 4081], [2842, 3912]], [[2856, 3912], [2856, 4081], [2856, 4081], [2856, 3912]], [[2870, 3912], [2870, 4081], [2870, 4081], [2870, 3912]], [[2912, 3912], [2912, 4081], [2912, 4081], [2912, 3912]], [[2926, 3912], [2926, 4081], [2926, 4081], [2926, 3912]], [[2954, 3912], [2954, 4081], [2954, 4081], [2954, 3912]], [[2982, 3912], [2982, 4081], [2982, 4081], [2982, 3912]], [[3024, 3912], [3024, 4081], [3024, 4081], [3024, 3912]], [[3108, 3912], [3108, 4081], [3108, 4081], [3108, 3912]], [[3122, 3912], [3122, 4081], [3136, 4081], [3136, 3912]]], "confidences": [0.991776704788208, 0.9966753721237183, 0.9947142004966736, 0.9186890721321106, 0.9635366797447205, 0.9986220598220825, 0.9777283668518066, 0.9586911797523499, 0.9998502731323242, 0.9988514184951782, 0.9999862909317017, 0.46282950043678284, 0.973861575126648, 0.42882752418518066, 0.9648494124412537, 0.9557760953903198, 0.9976227879524231, 0.5231557488441467, 0.7373040914535522, 0.997160792350769, 0.9977774024009705, 0.9998714923858643, 0.9994800686836243, 0.5984565019607544, 0.9999616146087646, 0.953172504901886, 0.9998903274536133, 0.5577518939971924, 0.6261033415794373, 0.9999628067016602, 0.9987449645996094, 0.9979907274246216, 0.9999592304229736, 0.9994562268257141, 0.776331901550293, 0.9890751838684082, 0.9983356595039368, 0.986653745174408, 0.9932841062545776, 0.9770086407661438, 0.8269332051277161, 0.9864249229431152, 0.9786643981933594, 0.9915361404418945, 0.9968346953392029, 0.9864396452903748, 0.9924086332321167, 0.998105525970459, 0.9923842549324036, 0.9835927486419678, 0.9957876801490784, 0.9960395097732544, 0.9908498525619507, 0.9995176792144775, 0.9677330255508423, 0.9952746629714966, 0.9993299245834351, 0.998761773109436, 0.9985032081604004, 0.9977524876594543, 0.9977297186851501, 0.9998428821563721, 0.9996432065963745, 0.9972556233406067, 0.8950211405754089, 0.982606828212738, 0.9643605351448059, 0.9769435524940491, 0.9995658993721008, 0.9992498755455017, 0.7895783185958862, 0.9948700666427612, 0.8788118362426758, 0.9814590215682983, 0.9998113512992859, 0.8790767788887024, 0.7014104723930359, 0.7737085819244385, 0.9973267316818237, 0.9496884942054749, 0.9877499938011169], "line": {"id": "2f15907b-447d-4609-92ed-05ba4b2b5c27", "bbox": [304, 3912, 3136, 4081], "type": "bbox"}}, {"prediction": "\u0647\u064a\u0644\u0639 \u0627\u0645 \u0641\u0644\u0627\u062e\u064a\u0648 \u062f\u062d\u0644\u0627 \u0627\u0630\u0647 \u0649\u0644\u0639 \u0647\u0648\u0636\u0648 \u064a\u0641 \u0644\u0645\u0639\u064a \u0646\u0627\u0643\u0641 \u0647\u0631\u0645\u0654\u0627 \u0644\u062b\u062a\u0645 \u0627\u0646\u0654\u0627\u0648 \u0644\u0627\u0642 \u0627\u0645\u0628 \u0645\u0644\u0639\u0654\u0627", "cuts": [[[305, 4078], [305, 4239], [305, 4239], [305, 4078]], [[348, 4078], [348, 4239], [348, 4239], [348, 4078]], [[362, 4078], [362, 4239], [376, 4239], [376, 4078]], [[390, 4078], [390, 4239], [404, 4239], [404, 4078]], [[447, 4078], [447, 4239], [447, 4239], [447, 4078]], [[461, 4078], [461, 4239], [475, 4239], [475, 4078]], [[489, 4078], [489, 4239], [489, 4239], [489, 4078]], [[518, 4078], [518, 4239], [532, 4239], [532, 4078]], [[617, 4078], [617, 4239], [617, 4239], [617, 4078]], [[645, 4078], [645, 4239], [645, 4239], [645, 4078]], [[659, 4078], [659, 4239], [674, 4239], [674, 4078]], [[702, 4078], [702, 4239], [702, 4239], [702, 4078]], [[730, 4078], [730, 4239], [744, 4239], [744, 4078]], [[787, 4078], [787, 4239], [801, 4239], [801, 4078]], [[815, 4078], [815, 4239], [830, 4239], [830, 4078]], [[872, 4078], [872, 4239], [872, 4239], [872, 4078]], [[900, 4078], [900, 4239], [900, 4239], [900, 4078]], [[915, 4078], [915, 4239], [929, 4239], [929, 4078]], [[957, 4078], [957, 4239], [971, 4239], [971, 4078]], [[985, 4078], [985, 4239], [1000, 4239], [1000, 4078]], [[1028, 4078], [1028, 4239], [1042, 4239], [1042, 4078]], [[1085, 4078], [1085, 4239], [1085, 4239], [1085, 4078]], [[1113, 4078], [1113, 4239], [1113, 4239], [1113, 4078]], [[1156, 4078], [1156, 4239], [1170, 4239], [1170, 4078]], [[1198, 4078], [1198, 4239], [1198, 4239], [1198, 4078]], [[1212, 4078], [1212, 4239], [1212, 4239], [1212, 4078]], [[1241, 4078], [1241, 4239], [1241, 4239], [1241, 4078]], [[1283, 4078], [1283, 4239], [1297, 4239], [1297, 4078]], [[1311, 4078], [1311, 4239], [1311, 4239], [1311, 4078]], [[1397, 4078], [1397, 4239], [1397, 4239], [1397, 4078]], [[1439, 4078], [1439, 4239], [1453, 4239], [1453, 4078]], [[1524, 4078], [1524, 4239], [1524, 4239], [1524, 4078]], [[1552, 4078], [1552, 4239], [1552, 4239], [1552, 4078]], [[1595, 4078], [1595, 4239], [1595, 4239], [1595, 4078]], [[1609, 4078], [1609, 4239], [1609, 4239], [1609, 4078]], [[1638, 4078], [1638, 4239], [1652, 4239], [1652, 4078]], [[1694, 4078], [1694, 4239], [1694, 4239], [1694, 4078]], [[1723, 4078], [1723, 4239], [1723, 4239], [1723, 4078]], [[1765, 4078], [1765, 4239], [1765, 4239], [1765, 4078]], [[1793, 4078], [1793, 4239], [1793, 4239], [1793, 4078]], [[1822, 4078], [1822, 4239], [1836, 4239], [1836, 4078]], [[1978, 4078], [1978, 4239], [1978, 4239], [1978, 4078]], [[2049, 4078], [2049, 4239], [2063, 4239], [2063, 4078]], [[2077, 4078], [2077, 4239], [2077, 4239], [2077, 4078]], [[2120, 4078], [2120, 4239], [2120, 4239], [2120, 4078]], [[2148, 4078], [2148, 4239], [2162, 4239], [2162, 4078]], [[2205, 4078], [2205, 4239], [2205, 4239], [2205, 4078]], [[2247, 4078], [2247, 4239], [2261, 4239], [2261, 4078]], [[2290, 4078], [2290, 4239], [2290, 4239], [2290, 4078]], [[2304, 4078], [2304, 4239], [2318, 4239], [2318, 4078]], [[2332, 4078], [2332, 4239], [2332, 4239], [2332, 4078]], [[2346, 4078], [2346, 4239], [2361, 4239], [2361, 4078]], [[2403, 4078], [2403, 4239], [2417, 4239], [2417, 4078]], [[2431, 4078], [2431, 4239], [2446, 4239], [2446, 4078]], [[2474, 4078], [2474, 4239], [2474, 4239], [2474, 4078]], [[2488, 4078], [2488, 4239], [2502, 4239], [2502, 4078]], [[2531, 4078], [2531, 4239], [2531, 4239], [2531, 4078]], [[2545, 4078], [2545, 4239], [2559, 4239], [2559, 4078]], [[2573, 4078], [2573, 4239], [2573, 4239], [2573, 4078]], [[2601, 4078], [2601, 4239], [2601, 4239], [2601, 4078]], [[2616, 4078], [2616, 4239], [2616, 4239], [2616, 4078]], [[2672, 4078], [2672, 4239], [2672, 4239], [2672, 4078]], [[2701, 4078], [2701, 4239], [2701, 4239], [2701, 4078]], [[2757, 4078], [2757, 4239], [2757, 4239], [2757, 4078]], [[2772, 4078], [2772, 4239], [2772, 4239], [2772, 4078]], [[2786, 4078], [2786, 4239], [2786, 4239], [2786, 4078]], [[2814, 4078], [2814, 4239], [2842, 4239], [2842, 4078]], [[2871, 4078], [2871, 4239], [2871, 4239], [2871, 4078]], [[2928, 4078], [2928, 4239], [2942, 4239], [2942, 4078]], [[2970, 4078], [2970, 4239], [2970, 4239], [2970, 4078]], [[2984, 4078], [2984, 4239], [2998, 4239], [2998, 4078]], [[3013, 4078], [3013, 4239], [3027, 4239], [3027, 4078]], [[3041, 4078], [3041, 4239], [3041, 4239], [3041, 4078]], [[3055, 4078], [3055, 4239], [3069, 4239], [3069, 4078]], [[3098, 4078], [3098, 4239], [3098, 4239], [3098, 4078]], [[3112, 4078], [3112, 4239], [3112, 4239], [3112, 4078]]], "confidences": [0.7411984801292419, 0.6705909371376038, 0.9994827508926392, 0.9999536275863647, 0.9637630581855774, 0.990339457988739, 0.9970928430557251, 0.9842832088470459, 0.9999134540557861, 0.8257625699043274, 0.9998522996902466, 0.9860520362854004, 0.8672003149986267, 0.999895453453064, 0.9987590312957764, 0.6380735635757446, 0.9966011047363281, 0.9999879598617554, 0.9917520880699158, 0.9998186230659485, 0.9985596537590027, 0.9999741315841675, 0.9970946311950684, 0.9999897480010986, 0.9996445178985596, 0.9999563694000244, 0.9980692267417908, 0.9994539618492126, 0.5508994460105896, 0.9075180888175964, 0.6853848099708557, 0.8571422696113586, 0.7955424189567566, 0.8907495737075806, 0.9879714846611023, 0.9994396567344666, 0.848770260810852, 0.9981479644775391, 0.909099280834198, 0.9869056344032288, 0.9833765625953674, 0.9991958737373352, 0.9672496318817139, 0.9993138313293457, 0.5518977046012878, 0.8995003700256348, 0.9811897277832031, 0.9994994401931763, 0.9018236994743347, 0.9840490818023682, 0.9967617392539978, 0.9858490228652954, 0.7903525233268738, 0.996831476688385, 0.9998800754547119, 0.9991426467895508, 0.9994601607322693, 0.9994288086891174, 0.9615521430969238, 0.8211493492126465, 0.9944064617156982, 0.9838215112686157, 0.9928451180458069, 0.9992262125015259, 0.9864301681518555, 0.980707585811615, 0.9878180027008057, 0.7048366665840149, 0.9973539113998413, 0.8788666129112244, 0.9915334582328796, 0.9992111921310425, 0.9873242378234863, 0.9851594567298889, 0.5106502771377563, 0.9952054023742676], "line": {"id": "09407f8b-b683-4a37-84bc-34b89367b925", "bbox": [305, 4078, 3126, 4239], "type": "bbox"}}, {"prediction": "\u062f\u064a\u0634\u0631\u0644\u0627 \u0649\u0644\u0627 \u0646\u064a\u0637\u0642\u064a \u0646\u0628 \u0649\u0644\u0639! \u064a\u0645\u0639\u0633\u0648 \u0645\u0627\u0644\u0633\u0644\u0627 \u0647\u064a\u0644\u0639 \u0646\u0633\u062d\u0644\u0627 \u064a\u0628\u0654\u0627 \u0645\u0627\u0644 \u0627\u0644\u0627\u062b\u062a\u0645\u0655\u0627 \u0629\u0640\u0639\u064a\u0634\u0644\u0627 \u0639\u064a\u0645\u062c", "cuts": [[[316, 4249], [316, 4413], [331, 4413], [331, 4249]], [[359, 4249], [359, 4413], [359, 4413], [359, 4249]], [[402, 4249], [402, 4413], [402, 4413], [402, 4249]], [[444, 4249], [444, 4413], [444, 4413], [444, 4249]], [[459, 4249], [459, 4413], [473, 4413], [473, 4249]], [[487, 4249], [487, 4413], [501, 4413], [501, 4249]], [[515, 4249], [515, 4413], [530, 4413], [530, 4249]], [[587, 4249], [587, 4413], [587, 4413], [587, 4249]], [[601, 4249], [601, 4413], [601, 4413], [601, 4249]], [[629, 4249], [629, 4413], [629, 4413], [629, 4249]], [[643, 4249], [643, 4413], [658, 4413], [658, 4249]], [[686, 4249], [686, 4413], [700, 4413], [700, 4249]], [[715, 4249], [715, 4413], [715, 4413], [715, 4249]], [[743, 4249], [743, 4413], [757, 4413], [757, 4249]], [[800, 4249], [800, 4413], [814, 4413], [814, 4249]], [[828, 4249], [828, 4413], [843, 4413], [843, 4249]], [[857, 4249], [857, 4413], [871, 4413], [871, 4249]], [[914, 4249], [914, 4413], [914, 4413], [914, 4249]], [[942, 4249], [942, 4413], [942, 4413], [942, 4249]], [[971, 4249], [971, 4413], [985, 4413], [985, 4249]], [[1070, 4249], [1070, 4413], [1070, 4413], [1070, 4249]], [[1084, 4249], [1084, 4413], [1084, 4413], [1084, 4249]], [[1113, 4249], [1113, 4413], [1113, 4413], [1113, 4249]], [[1141, 4249], [1141, 4413], [1141, 4413], [1141, 4249]], [[1155, 4249], [1155, 4413], [1184, 4413], [1184, 4249]], [[1212, 4249], [1212, 4413], [1226, 4413], [1226, 4249]], [[1255, 4249], [1255, 4413], [1255, 4413], [1255, 4249]], [[1269, 4249], [1269, 4413], [1269, 4413], [1269, 4249]], [[1312, 4249], [1312, 4413], [1326, 4413], [1326, 4249]], [[1369, 4249], [1369, 4413], [1383, 4413], [1383, 4249]], [[1397, 4249], [1397, 4413], [1411, 4413], [1411, 4249]], [[1426, 4249], [1426, 4413], [1440, 4413], [1440, 4249]], [[1482, 4249], [1482, 4413], [1482, 4413], [1482, 4249]], [[1497, 4249], [1497, 4413], [1511, 4413], [1511, 4249]], [[1553, 4249], [1553, 4413], [1553, 4413], [1553, 4249]], [[1582, 4249], [1582, 4413], [1582, 4413], [1582, 4249]], [[1596, 4249], [1596, 4413], [1610, 4413], [1610, 4249]], [[1625, 4249], [1625, 4413], [1639, 4413], [1639, 4249]], [[1653, 4249], [1653, 4413], [1653, 4413], [1653, 4249]], [[1681, 4249], [1681, 4413], [1681, 4413], [1681, 4249]], [[1710, 4249], [1710, 4413], [1710, 4413], [1710, 4249]], [[1738, 4249], [1738, 4413], [1738, 4413], [1738, 4249]], [[1781, 4249], [1781, 4413], [1795, 4413], [1795, 4249]], [[1824, 4249], [1824, 4413], [1824, 4413], [1824, 4249]], [[1866, 4249], [1866, 4413], [1895, 4413], [1895, 4249]], [[1923, 4249], [1923, 4413], [1923, 4413], [1923, 4249]], [[1937, 4249], [1937, 4413], [1952, 4413], [1952, 4249]], [[1980, 4249], [1980, 4413], [1994, 4413], [1994, 4249]], [[2008, 4249], [2008, 4413], [2023, 4413], [2023, 4249]], [[2065, 4249], [2065, 4413], [2065, 4413], [2065, 4249]], [[2080, 4249], [2080, 4413], [2080, 4413], [2080, 4249]], [[2108, 4249], [2108, 4413], [2108, 4413], [2108, 4249]], [[2122, 4249], [2122, 4413], [2122, 4413], [2122, 4249]], [[2136, 4249], [2136, 4413], [2151, 4413], [2151, 4249]], [[2222, 4249], [2222, 4413], [2236, 4413], [2236, 4249]], [[2264, 4249], [2264, 4413], [2279, 4413], [2279, 4249]], [[2293, 4249], [2293, 4413], [2307, 4413], [2307, 4249]], [[2321, 4249], [2321, 4413], [2336, 4413], [2336, 4249]], [[2378, 4249], [2378, 4413], [2378, 4413], [2378, 4249]], [[2407, 4249], [2407, 4413], [2407, 4413], [2407, 4249]], [[2435, 4249], [2435, 4413], [2435, 4413], [2435, 4249]], [[2463, 4249], [2463, 4413], [2463, 4413], [2463, 4249]], [[2492, 4249], [2492, 4413], [2492, 4413], [2492, 4249]], [[2520, 4249], [2520, 4413], [2520, 4413], [2520, 4249]], [[2549, 4249], [2549, 4413], [2549, 4413], [2549, 4249]], [[2563, 4249], [2563, 4413], [2563, 4413], [2563, 4249]], [[2577, 4249], [2577, 4413], [2591, 4413], [2591, 4249]], [[2606, 4249], [2606, 4413], [2606, 4413], [2606, 4249]], [[2663, 4249], [2663, 4413], [2677, 4413], [2677, 4249]], [[2762, 4249], [2762, 4413], [2762, 4413], [2762, 4249]], [[2805, 4249], [2805, 4413], [2805, 4413], [2805, 4249]], [[2847, 4249], [2847, 4413], [2847, 4413], [2847, 4249]], [[2876, 4249], [2876, 4413], [2876, 4413], [2876, 4249]], [[2890, 4249], [2890, 4413], [2904, 4413], [2904, 4249]], [[2919, 4249], [2919, 4413], [2933, 4413], [2933, 4249]], [[2975, 4249], [2975, 4413], [2990, 4413], [2990, 4249]], [[3061, 4249], [3061, 4413], [3061, 4413], [3061, 4249]], [[3089, 4249], [3089, 4413], [3089, 4413], [3089, 4249]], [[3103, 4249], [3103, 4413], [3103, 4413], [3103, 4249]]], "confidences": [0.9999558925628662, 0.9997685551643372, 0.9997368454933167, 0.9977124929428101, 0.999941349029541, 0.9980744123458862, 0.9950352907180786, 0.9224417805671692, 0.8580173254013062, 0.9524855613708496, 0.9989435076713562, 0.9999842643737793, 0.9986186027526855, 0.9998856782913208, 0.9995737671852112, 0.9912926554679871, 0.9999467134475708, 0.9999945163726807, 0.9995242357254028, 0.9999788999557495, 0.9609777331352234, 0.9153129458427429, 0.9045202136039734, 0.9997207522392273, 0.9395636916160583, 0.9894552826881409, 0.9998144507408142, 0.9997990727424622, 0.9999853372573853, 0.9999799728393555, 1.0, 0.9706733822822571, 0.9758889675140381, 0.9932337403297424, 0.8476508259773254, 0.9795082807540894, 0.9796251058578491, 0.9970026612281799, 0.4895252287387848, 0.5919338464736938, 0.9867957830429077, 0.7614318132400513, 0.9896360039710999, 0.9846451878547668, 0.9974541068077087, 0.5357677340507507, 0.9974640607833862, 0.9990847110748291, 0.9961497783660889, 0.9180766940116882, 0.8193199634552002, 0.9990463852882385, 0.9899054169654846, 0.9957371950149536, 0.9989354014396667, 0.9109645485877991, 0.9999076128005981, 0.999586284160614, 0.7132347226142883, 0.9970788955688477, 0.9983876943588257, 0.6264116764068604, 0.9988951086997986, 0.9250513315200806, 0.8208836913108826, 0.8228710293769836, 0.9901149272918701, 0.997815728187561, 0.9998468160629272, 0.9990491271018982, 0.9956784844398499, 0.7115011811256409, 0.9978455305099487, 0.9982227683067322, 0.9991169571876526, 0.9916975498199463, 0.9556155204772949, 0.9978026747703552, 0.9827321171760559], "line": {"id": "02dd3ee9-dcdf-4a5d-be3b-4513160c22a2", "bbox": [302, 4249, 3132, 4413], "type": "bbox"}}, {"prediction": ".\u0649\u0644\u0639 \u064a\u0641 \u0644\u0648\u0642\u0644\u0627 \u0649\u062f\u0646\u0639 \u0631\u062b\u0643 \u062f\u0642 \u0647\u062a\u0635\u0627\u062e \u0636\u0639\u0628\u0627 \u062f\u064a\u0634\u0631\u0644\u0627 \u0644\u0627\u0642\u0641 \u0643\u0644 \u0641\u0627\u0627\u062e\u0645 \u064a\u0636\u0641\u0627\u0631 \u0647\u0627 \u0647\u0644 \u0644\u064a\u0642\u0648", "cuts": [[[297, 4427], [297, 4585], [297, 4585], [297, 4427]], [[350, 4427], [350, 4585], [350, 4585], [350, 4427]], [[363, 4427], [363, 4585], [376, 4585], [376, 4427]], [[389, 4427], [389, 4585], [389, 4585], [389, 4427]], [[429, 4427], [429, 4585], [442, 4585], [442, 4427]], [[468, 4427], [468, 4585], [468, 4585], [468, 4427]], [[481, 4427], [481, 4585], [481, 4585], [481, 4427]], [[508, 4427], [508, 4585], [534, 4585], [534, 4427]], [[587, 4427], [587, 4585], [600, 4585], [600, 4427]], [[626, 4427], [626, 4585], [639, 4585], [639, 4427]], [[679, 4427], [679, 4585], [679, 4585], [679, 4427]], [[705, 4427], [705, 4585], [705, 4585], [705, 4427]], [[718, 4427], [718, 4585], [718, 4585], [718, 4427]], [[732, 4427], [732, 4585], [745, 4585], [745, 4427]], [[797, 4427], [797, 4585], [797, 4585], [797, 4427]], [[850, 4427], [850, 4585], [863, 4585], [863, 4427]], [[890, 4427], [890, 4585], [890, 4585], [890, 4427]], [[916, 4427], [916, 4585], [916, 4585], [916, 4427]], [[955, 4427], [955, 4585], [969, 4585], [969, 4427]], [[995, 4427], [995, 4585], [1008, 4585], [1008, 4427]], [[1021, 4427], [1021, 4585], [1021, 4585], [1021, 4427]], [[1048, 4427], [1048, 4585], [1061, 4585], [1061, 4427]], [[1219, 4427], [1219, 4585], [1219, 4585], [1219, 4427]], [[1245, 4427], [1245, 4585], [1258, 4585], [1258, 4427]], [[1285, 4427], [1285, 4585], [1285, 4585], [1285, 4427]], [[1311, 4427], [1311, 4585], [1324, 4585], [1324, 4427]], [[1337, 4427], [1337, 4585], [1337, 4585], [1337, 4427]], [[1364, 4427], [1364, 4585], [1364, 4585], [1364, 4427]], [[1416, 4427], [1416, 4585], [1429, 4585], [1429, 4427]], [[1456, 4427], [1456, 4585], [1469, 4585], [1469, 4427]], [[1495, 4427], [1495, 4585], [1495, 4585], [1495, 4427]], [[1535, 4427], [1535, 4585], [1548, 4585], [1548, 4427]], [[1614, 4427], [1614, 4585], [1614, 4585], [1614, 4427]], [[1666, 4427], [1666, 4585], [1666, 4585], [1666, 4427]], [[1693, 4427], [1693, 4585], [1706, 4585], [1706, 4427]], [[1732, 4427], [1732, 4585], [1732, 4585], [1732, 4427]], [[1745, 4427], [1745, 4585], [1759, 4585], [1759, 4427]], [[1798, 4427], [1798, 4585], [1798, 4585], [1798, 4427]], [[1824, 4427], [1824, 4585], [1824, 4585], [1824, 4427]], [[1877, 4427], [1877, 4585], [1877, 4585], [1877, 4427]], [[1917, 4427], [1917, 4585], [1930, 4585], [1930, 4427]], [[1943, 4427], [1943, 4585], [1943, 4585], [1943, 4427]], [[1969, 4427], [1969, 4585], [1969, 4585], [1969, 4427]], [[1982, 4427], [1982, 4585], [1996, 4585], [1996, 4427]], [[2048, 4427], [2048, 4585], [2048, 4585], [2048, 4427]], [[2075, 4427], [2075, 4585], [2075, 4585], [2075, 4427]], [[2101, 4427], [2101, 4585], [2114, 4585], [2114, 4427]], [[2140, 4427], [2140, 4585], [2140, 4585], [2140, 4427]], [[2154, 4427], [2154, 4585], [2167, 4585], [2167, 4427]], [[2206, 4427], [2206, 4585], [2219, 4585], [2219, 4427]], [[2272, 4427], [2272, 4585], [2272, 4585], [2272, 4427]], [[2285, 4427], [2285, 4585], [2298, 4585], [2298, 4427]], [[2364, 4427], [2364, 4585], [2377, 4585], [2377, 4427]], [[2404, 4427], [2404, 4585], [2404, 4585], [2404, 4427]], [[2430, 4427], [2430, 4585], [2430, 4585], [2430, 4427]], [[2456, 4427], [2456, 4585], [2456, 4585], [2456, 4427]], [[2470, 4427], [2470, 4585], [2483, 4585], [2483, 4427]], [[2509, 4427], [2509, 4585], [2522, 4585], [2522, 4427]], [[2562, 4427], [2562, 4585], [2562, 4585], [2562, 4427]], [[2601, 4427], [2601, 4585], [2601, 4585], [2601, 4427]], [[2654, 4427], [2654, 4585], [2654, 4585], [2654, 4427]], [[2680, 4427], [2680, 4585], [2680, 4585], [2680, 4427]], [[2720, 4427], [2720, 4585], [2733, 4585], [2733, 4427]], [[2759, 4427], [2759, 4585], [2759, 4585], [2759, 4427]], [[2786, 4427], [2786, 4585], [2786, 4585], [2786, 4427]], [[2838, 4427], [2838, 4585], [2851, 4585], [2851, 4427]], [[2865, 4427], [2865, 4585], [2865, 4585], [2865, 4427]], [[2891, 4427], [2891, 4585], [2891, 4585], [2891, 4427]], [[2917, 4427], [2917, 4585], [2930, 4585], [2930, 4427]], [[2944, 4427], [2944, 4585], [2957, 4585], [2957, 4427]], [[2996, 4427], [2996, 4585], [2996, 4585], [2996, 4427]], [[3023, 4427], [3023, 4585], [3023, 4585], [3023, 4427]], [[3049, 4427], [3049, 4585], [3049, 4585], [3049, 4427]], [[3102, 4427], [3102, 4585], [3102, 4585], [3102, 4427]]], "confidences": [0.8309170007705688, 0.9710848927497864, 0.9978118538856506, 0.9952423572540283, 0.9998619556427002, 0.9853734970092773, 0.9041633605957031, 0.9999642372131348, 0.9992184638977051, 0.987206757068634, 0.9999744892120361, 0.9998753070831299, 0.9998530149459839, 0.9993923902511597, 0.9804210662841797, 0.9999669790267944, 0.9681344628334045, 0.7007457613945007, 0.9999014139175415, 0.9938947558403015, 0.9991243481636047, 0.9994795918464661, 0.9906601309776306, 0.9998043179512024, 0.9999531507492065, 0.9996731281280518, 0.9904140830039978, 0.8484129309654236, 0.9998654127120972, 0.9998722076416016, 0.884601891040802, 0.9997289776802063, 0.5172210335731506, 0.9777674078941345, 0.9999169111251831, 0.49916383624076843, 0.9641693830490112, 0.9937703013420105, 0.7306916117668152, 0.9957754015922546, 0.9984592199325562, 0.943457841873169, 0.6241721510887146, 0.9954598546028137, 0.9971427321434021, 0.8888192176818848, 0.9960846900939941, 0.9893342852592468, 0.9664679169654846, 0.9914203882217407, 0.9974316954612732, 0.9991137385368347, 0.9997954964637756, 0.9750413298606873, 0.9770325422286987, 0.9967040419578552, 0.9981144666671753, 0.9363402724266052, 0.9950194358825684, 0.8760650753974915, 0.9999531507492065, 0.9947760105133057, 0.99937504529953, 0.9894686341285706, 0.9319698810577393, 0.9841182231903076, 0.998865008354187, 0.9998772144317627, 0.9999456405639648, 0.9940637946128845, 0.8951064348220825, 0.9981452226638794, 0.9989315867424011, 0.9663097262382507], "line": {"id": "47a85dad-e82c-41b6-9a41-f6a85da7f60b", "bbox": [297, 4427, 3128, 4585], "type": "bbox"}}] \ No newline at end of file +[{"prediction": "\u0645\u0627\u0644\u0633\u0644\u0627 \u0647\u064a\u0644\u0639 \u0647\u062a\u0627\u0632\u062c\u0639\u0645 \u064a\u0641", "cuts": [[[1437, 119], [1437, 256], [1449, 256], [1449, 119]], [[1484, 119], [1484, 256], [1496, 256], [1496, 119]], [[1508, 119], [1508, 256], [1520, 256], [1520, 119]], [[1568, 119], [1568, 256], [1568, 256], [1568, 119]], [[1603, 119], [1603, 256], [1603, 256], [1603, 119]], [[1615, 119], [1615, 256], [1627, 256], [1627, 119]], [[1639, 119], [1639, 256], [1639, 256], [1639, 119]], [[1663, 119], [1663, 256], [1674, 256], [1674, 119]], [[1698, 119], [1698, 256], [1698, 256], [1698, 119]], [[1722, 119], [1722, 256], [1734, 256], [1734, 119]], [[1746, 119], [1746, 256], [1758, 256], [1758, 119]], [[1793, 119], [1793, 256], [1805, 256], [1805, 119]], [[1817, 119], [1817, 256], [1829, 256], [1829, 119]], [[1853, 119], [1853, 256], [1853, 256], [1853, 119]], [[1876, 119], [1876, 256], [1888, 256], [1888, 119]], [[1924, 119], [1924, 256], [1936, 256], [1936, 119]], [[1959, 119], [1959, 256], [1971, 256], [1971, 119]], [[2007, 119], [2007, 256], [2019, 256], [2019, 119]], [[2054, 119], [2054, 256], [2054, 256], [2054, 119]], [[2078, 119], [2078, 256], [2090, 256], [2090, 119]], [[2149, 119], [2149, 256], [2149, 256], [2149, 119]], [[2161, 119], [2161, 256], [2173, 256], [2173, 119]]], "confidences": [0.9999573230743408, 0.8209527730941772, 0.9964040517807007, 0.667267382144928, 0.9973480701446533, 0.9998679161071777, 0.9999040365219116, 0.999890923500061, 0.8255242109298706, 0.9995707869529724, 0.9976646900177002, 0.9889178276062012, 0.9869346618652344, 0.9966957569122314, 0.9958117008209229, 0.980436384677887, 0.9956343770027161, 0.9984177350997925, 0.762851893901825, 0.9997056126594543, 0.9977449178695679, 0.9985793828964233], "line": {"id": "line_0", "bbox": [1437, 119, 2185, 256], "type": "bbox"}}, {"prediction": "(294)", "cuts": [[[2838, 119], [2838, 265], [2838, 265], [2838, 119]], [[2904, 119], [2904, 265], [2904, 265], [2904, 119]], [[2954, 119], [2954, 265], [2954, 265], [2954, 119]], [[3019, 119], [3019, 265], [3019, 265], [3019, 119]], [[3069, 119], [3069, 265], [3085, 265], [3085, 119]]], "confidences": [0.5292237997055054, 0.9998055100440979, 0.9602159857749939, 0.9988068342208862, 0.994594395160675], "line": {"id": "line_1", "bbox": [2821, 119, 3119, 265], "type": "bbox"}}, {"prediction": "\u0627\u0630\u0643\u0648 \u0627\u0630\u0643\u062a\u0642\u0648 \u0641 \u0646\u064a\u0646\u0645\u0654\u0648\u0645\u0644\u0627 \u0631\u064a\u0645\u0654\u0627 \u0627\u0647\u0628 \u0647\u0645\u0631\u0643\u0627 \u0649\u062a\u0644\u0627 \u0629\u0639\u0627\u0631\u062f\u0644\u0627 \u0647\u064a\u0644\u0627 \u0644\u0645\u062d \u062f\u0642\u0648 \u0629\u0646\u0633 \u0644\u0643 \u064a\u0641", "cuts": [[[358, 365], [358, 542], [358, 542], [358, 365]], [[402, 365], [402, 542], [402, 542], [402, 365]], [[460, 365], [460, 542], [474, 542], [474, 365]], [[648, 365], [648, 542], [663, 542], [663, 365]], [[677, 365], [677, 542], [706, 542], [706, 365]], [[735, 365], [735, 542], [750, 542], [750, 365]], [[779, 365], [779, 542], [779, 542], [779, 365]], [[852, 365], [852, 542], [852, 542], [852, 365]], [[939, 365], [939, 542], [939, 542], [939, 365]], [[997, 365], [997, 542], [997, 542], [997, 365]], [[1055, 365], [1055, 542], [1055, 542], [1055, 365]], [[1069, 365], [1069, 542], [1084, 542], [1084, 365]], [[1127, 365], [1127, 542], [1142, 542], [1142, 365]], [[1171, 365], [1171, 542], [1171, 542], [1171, 365]], [[1200, 365], [1200, 542], [1215, 542], [1215, 365]], [[1229, 365], [1229, 542], [1244, 542], [1244, 365]], [[1273, 365], [1273, 542], [1273, 542], [1273, 365]], [[1302, 365], [1302, 542], [1302, 542], [1302, 365]], [[1345, 365], [1345, 542], [1345, 542], [1345, 365]], [[1360, 365], [1360, 542], [1360, 542], [1360, 365]], [[1374, 365], [1374, 542], [1374, 542], [1374, 365]], [[1389, 365], [1389, 542], [1403, 542], [1403, 365]], [[1418, 365], [1418, 542], [1432, 542], [1432, 365]], [[1447, 365], [1447, 542], [1447, 542], [1447, 365]], [[1490, 365], [1490, 542], [1490, 542], [1490, 365]], [[1505, 365], [1505, 542], [1519, 542], [1519, 365]], [[1548, 365], [1548, 542], [1548, 542], [1548, 365]], [[1578, 365], [1578, 542], [1578, 542], [1578, 365]], [[1592, 365], [1592, 542], [1592, 542], [1592, 365]], [[1607, 365], [1607, 542], [1621, 542], [1621, 365]], [[1650, 365], [1650, 542], [1650, 542], [1650, 365]], [[1665, 365], [1665, 542], [1679, 542], [1679, 365]], [[1694, 365], [1694, 542], [1708, 542], [1708, 365]], [[1723, 365], [1723, 542], [1737, 542], [1737, 365]], [[1766, 365], [1766, 542], [1766, 542], [1766, 365]], [[1810, 365], [1810, 542], [1810, 542], [1810, 365]], [[1853, 365], [1853, 542], [1868, 542], [1868, 365]], [[1882, 365], [1882, 542], [1882, 542], [1882, 365]], [[1955, 365], [1955, 542], [1969, 542], [1969, 365]], [[1984, 365], [1984, 542], [1999, 542], [1999, 365]], [[2057, 365], [2057, 542], [2057, 542], [2057, 365]], [[2071, 365], [2071, 542], [2071, 542], [2071, 365]], [[2086, 365], [2086, 542], [2100, 542], [2100, 365]], [[2115, 365], [2115, 542], [2115, 542], [2115, 365]], [[2129, 365], [2129, 542], [2144, 542], [2144, 365]], [[2173, 365], [2173, 542], [2173, 542], [2173, 365]], [[2202, 365], [2202, 542], [2202, 542], [2202, 365]], [[2245, 365], [2245, 542], [2260, 542], [2260, 365]], [[2303, 365], [2303, 542], [2303, 542], [2303, 365]], [[2332, 365], [2332, 542], [2347, 542], [2347, 365]], [[2361, 365], [2361, 542], [2361, 542], [2361, 365]], [[2376, 365], [2376, 542], [2391, 542], [2391, 365]], [[2405, 365], [2405, 542], [2420, 542], [2420, 365]], [[2434, 365], [2434, 542], [2449, 542], [2449, 365]], [[2478, 365], [2478, 542], [2478, 542], [2478, 365]], [[2492, 365], [2492, 542], [2507, 542], [2507, 365]], [[2521, 365], [2521, 542], [2521, 542], [2521, 365]], [[2536, 365], [2536, 542], [2550, 542], [2550, 365]], [[2594, 365], [2594, 542], [2594, 542], [2594, 365]], [[2623, 365], [2623, 542], [2623, 542], [2623, 365]], [[2637, 365], [2637, 542], [2652, 542], [2652, 365]], [[2681, 365], [2681, 542], [2695, 542], [2695, 365]], [[2724, 365], [2724, 542], [2724, 542], [2724, 365]], [[2753, 365], [2753, 542], [2753, 542], [2753, 365]], [[2812, 365], [2812, 542], [2812, 542], [2812, 365]], [[2841, 365], [2841, 542], [2855, 542], [2855, 365]], [[2870, 365], [2870, 542], [2870, 542], [2870, 365]], [[2899, 365], [2899, 542], [2899, 542], [2899, 365]], [[2942, 365], [2942, 542], [2957, 542], [2957, 365]], [[2986, 365], [2986, 542], [3000, 542], [3000, 365]], [[3058, 365], [3058, 542], [3058, 542], [3058, 365]], [[3073, 365], [3073, 542], [3073, 542], [3073, 365]], [[3116, 365], [3116, 542], [3131, 542], [3131, 365]], [[3145, 365], [3145, 542], [3145, 542], [3145, 365]], [[3160, 365], [3160, 542], [3174, 542], [3174, 365]]], "confidences": [0.9912043213844299, 0.9701831340789795, 0.9999876022338867, 0.9710670113563538, 0.9999645948410034, 0.9999040365219116, 0.9999904632568359, 0.9276049733161926, 0.9949396848678589, 0.9172694683074951, 0.9944435954093933, 0.9998708963394165, 0.9994745850563049, 0.9999909400939941, 0.9929296374320984, 0.9996275901794434, 0.9654240012168884, 0.9978482723236084, 0.8331916928291321, 0.9914954900741577, 0.9862202405929565, 0.9967150688171387, 0.9994681477546692, 0.9422079920768738, 0.9996860027313232, 0.9978721141815186, 0.590356171131134, 0.9853919148445129, 0.9949153661727905, 0.9330083131790161, 0.902510941028595, 0.9991570711135864, 0.9937306642532349, 0.9962736368179321, 0.9969527721405029, 0.9955304265022278, 0.9975927472114563, 0.931627094745636, 0.9910709857940674, 0.994668185710907, 0.9977930784225464, 0.9947988986968994, 0.99834144115448, 0.9974583983421326, 0.9996436834335327, 0.9992924928665161, 0.9981145858764648, 0.9989506006240845, 0.9970920085906982, 0.9896613359451294, 0.6772571206092834, 0.9618531465530396, 0.9992746710777283, 0.998647153377533, 0.834701657295227, 0.9992173910140991, 0.9594298601150513, 0.9998399019241333, 0.9885919690132141, 0.9965444207191467, 0.9950836896896362, 0.8906474709510803, 0.8982319831848145, 0.520612359046936, 0.9998024106025696, 0.9991157650947571, 0.9997696280479431, 0.9865208864212036, 0.9990457892417908, 0.9984292387962341, 0.8027671575546265, 0.9970871806144714, 0.9498249292373657, 0.9898852109909058, 0.9846636056900024], "line": {"id": "line_2", "bbox": [358, 365, 3189, 542], "type": "bbox"}}, {"prediction": "\u0646\u0627\u0643 \u0646\u0627\u0641 \u0644\u0627\u062d\u0644\u0627 \u0647\u0630\u0647 \u0646\u0639 \u0646\u063a\u0634\u0643\u0627\u0644 \u0644\u0627\u0642\u0648 \u0627\u062f\u062f\u0634 \u064b\u0627\u0640\u0628\u0646\u063a \u0628\u0636\u063a\u0648 \u0643\u0644\u0630\u0644 \u062f\u064a\u0634\u0631\u0644\u0627 \u0637\u0627\u0634\u062a\u0633\u0627\u0641", "cuts": [[[364, 534], [364, 695], [377, 695], [377, 534]], [[405, 534], [405, 695], [405, 695], [405, 534]], [[419, 534], [419, 695], [419, 695], [419, 534]], [[460, 534], [460, 695], [487, 695], [487, 534]], [[514, 534], [514, 695], [528, 695], [528, 534]], [[555, 534], [555, 695], [555, 695], [555, 534]], [[569, 534], [569, 695], [583, 695], [583, 534]], [[610, 534], [610, 695], [624, 695], [624, 534]], [[665, 534], [665, 695], [665, 695], [665, 534]], [[679, 534], [679, 695], [692, 695], [692, 534]], [[720, 534], [720, 695], [720, 695], [720, 534]], [[733, 534], [733, 695], [747, 695], [747, 534]], [[774, 534], [774, 695], [788, 695], [788, 534]], [[802, 534], [802, 695], [816, 695], [816, 534]], [[829, 534], [829, 695], [843, 695], [843, 534]], [[884, 534], [884, 695], [884, 695], [884, 534]], [[911, 534], [911, 695], [925, 695], [925, 534]], [[952, 534], [952, 695], [966, 695], [966, 534]], [[1007, 534], [1007, 695], [1007, 695], [1007, 534]], [[1048, 534], [1048, 695], [1048, 695], [1048, 534]], [[1089, 534], [1089, 695], [1103, 695], [1103, 534]], [[1144, 534], [1144, 695], [1144, 695], [1144, 534]], [[1185, 534], [1185, 695], [1185, 695], [1185, 534]], [[1240, 534], [1240, 695], [1240, 695], [1240, 534]], [[1295, 534], [1295, 695], [1295, 695], [1295, 534]], [[1363, 534], [1363, 695], [1377, 695], [1377, 534]], [[1391, 534], [1391, 695], [1404, 695], [1404, 534]], [[1418, 534], [1418, 695], [1432, 695], [1432, 534]], [[1473, 534], [1473, 695], [1486, 695], [1486, 534]], [[1500, 534], [1500, 695], [1500, 695], [1500, 534]], [[1514, 534], [1514, 695], [1514, 695], [1514, 534]], [[1568, 534], [1568, 695], [1582, 695], [1582, 534]], [[1596, 534], [1596, 695], [1623, 695], [1623, 534]], [[1651, 534], [1651, 695], [1664, 695], [1664, 534]], [[1692, 534], [1692, 695], [1705, 695], [1705, 534]], [[1760, 534], [1760, 695], [1774, 695], [1774, 534]], [[1815, 534], [1815, 695], [1829, 695], [1829, 534]], [[1842, 534], [1842, 695], [1856, 695], [1856, 534]], [[1870, 534], [1870, 695], [1870, 695], [1870, 534]], [[1883, 534], [1883, 695], [1883, 695], [1883, 534]], [[1924, 534], [1924, 695], [1952, 695], [1952, 534]], [[2034, 534], [2034, 695], [2034, 695], [2034, 534]], [[2075, 534], [2075, 695], [2075, 695], [2075, 534]], [[2130, 534], [2130, 695], [2143, 695], [2143, 534]], [[2171, 534], [2171, 695], [2185, 695], [2185, 534]], [[2226, 534], [2226, 695], [2226, 695], [2226, 534]], [[2308, 534], [2308, 695], [2308, 695], [2308, 534]], [[2363, 534], [2363, 695], [2363, 695], [2363, 534]], [[2431, 534], [2431, 695], [2431, 695], [2431, 534]], [[2458, 534], [2458, 695], [2472, 695], [2472, 534]], [[2527, 534], [2527, 695], [2527, 695], [2527, 534]], [[2582, 534], [2582, 695], [2582, 695], [2582, 534]], [[2609, 534], [2609, 695], [2623, 695], [2623, 534]], [[2650, 534], [2650, 695], [2650, 695], [2650, 534]], [[2664, 534], [2664, 695], [2677, 695], [2677, 534]], [[2705, 534], [2705, 695], [2705, 695], [2705, 534]], [[2732, 534], [2732, 695], [2746, 695], [2746, 534]], [[2787, 534], [2787, 695], [2787, 695], [2787, 534]], [[2828, 534], [2828, 695], [2828, 695], [2828, 534]], [[2842, 534], [2842, 695], [2855, 695], [2855, 534]], [[2869, 534], [2869, 695], [2869, 695], [2869, 534]], [[2883, 534], [2883, 695], [2896, 695], [2896, 534]], [[2938, 534], [2938, 695], [2938, 695], [2938, 534]], [[2992, 534], [2992, 695], [2992, 695], [2992, 534]], [[3033, 534], [3033, 695], [3033, 695], [3033, 534]], [[3061, 534], [3061, 695], [3074, 695], [3074, 534]], [[3102, 534], [3102, 695], [3129, 695], [3129, 534]], [[3143, 534], [3143, 695], [3157, 695], [3157, 534]], [[3170, 534], [3170, 695], [3170, 695], [3170, 534]]], "confidences": [0.9985698461532593, 0.9999438524246216, 0.9994581341743469, 0.9928075075149536, 0.9999692440032959, 0.9775535464286804, 0.9994893074035645, 0.9992764592170715, 0.9999681711196899, 0.999976634979248, 0.5837891101837158, 0.9994819760322571, 0.9999487400054932, 0.6378462314605713, 0.9995593428611755, 0.9997476935386658, 0.9998375177383423, 0.9999092817306519, 0.9706422686576843, 0.9981306195259094, 0.999731719493866, 0.9984344840049744, 0.9999045133590698, 0.9998281002044678, 0.9965876340866089, 0.9981406927108765, 0.9998824596405029, 0.9994693398475647, 0.9985535740852356, 0.9371808171272278, 0.9999727010726929, 0.9998328685760498, 0.9986041188240051, 0.9998788833618164, 0.9969847798347473, 0.9979107975959778, 0.9678859114646912, 0.9965589642524719, 0.9958305954933167, 0.856151819229126, 0.9174501299858093, 0.977839469909668, 0.9722991585731506, 0.999629020690918, 0.9988741278648376, 0.5952739119529724, 0.8313284516334534, 0.6637697815895081, 0.9957481026649475, 0.9997797608375549, 0.99960857629776, 0.6831809282302856, 0.9987292885780334, 0.9998849630355835, 0.9514357447624207, 0.9951800107955933, 0.9758328795433044, 0.9967122077941895, 0.7513812184333801, 0.9999700784683228, 0.9964326620101929, 0.9970759153366089, 0.9622002243995667, 0.7601332068443298, 0.9990935325622559, 0.9990278482437134, 0.9987155199050903, 0.9829656481742859, 0.6010854244232178], "line": {"id": "line_3", "bbox": [350, 534, 3184, 695], "type": "bbox"}}, {"prediction": "\u0647\u064a\u062f\u064a \u0646\u064a\u0628 \u0644\u062b\u0645 \u0627\u0644\u0641 \u0646\u064a\u0637\u0642\u064a \u0646\u0628 \u0649\u0644\u0639 \u0631\u0627\u0636\u062d\u0627\u0628 \u062a\u0642\u0648\u0644\u0627 \u064a\u0641 \u0630\u0641\u0646\u0627\u0648 \u0647\u0633\u0641\u0646 \u062a\u0642\u0647\u0632\u0654\u0627 \u0644\u0648\u0642\u062a \u0627\u0645\u0643 \u0645\u0627\u0644\u0627", "cuts": [[[349, 703], [349, 875], [362, 875], [362, 703]], [[389, 703], [389, 875], [389, 875], [389, 703]], [[428, 703], [428, 875], [441, 875], [441, 703]], [[455, 703], [455, 875], [468, 875], [468, 703]], [[481, 703], [481, 875], [494, 875], [494, 703]], [[534, 703], [534, 875], [547, 875], [547, 703]], [[560, 703], [560, 875], [560, 875], [560, 703]], [[586, 703], [586, 875], [586, 875], [586, 703]], [[613, 703], [613, 875], [626, 875], [626, 703]], [[666, 703], [666, 875], [679, 875], [679, 703]], [[705, 703], [705, 875], [705, 875], [705, 703]], [[731, 703], [731, 875], [731, 875], [731, 703]], [[758, 703], [758, 875], [771, 875], [771, 703]], [[797, 703], [797, 875], [797, 875], [797, 703]], [[837, 703], [837, 875], [837, 875], [837, 703]], [[863, 703], [863, 875], [863, 875], [863, 703]], [[890, 703], [890, 875], [903, 875], [903, 703]], [[956, 703], [956, 875], [956, 875], [956, 703]], [[982, 703], [982, 875], [982, 875], [982, 703]], [[1008, 703], [1008, 875], [1022, 875], [1022, 703]], [[1074, 703], [1074, 875], [1074, 875], [1074, 703]], [[1101, 703], [1101, 875], [1101, 875], [1101, 703]], [[1127, 703], [1127, 875], [1140, 875], [1140, 703]], [[1180, 703], [1180, 875], [1193, 875], [1193, 703]], [[1206, 703], [1206, 875], [1219, 875], [1219, 703]], [[1233, 703], [1233, 875], [1246, 875], [1246, 703]], [[1312, 703], [1312, 875], [1312, 875], [1312, 703]], [[1325, 703], [1325, 875], [1338, 875], [1338, 703]], [[1351, 703], [1351, 875], [1351, 875], [1351, 703]], [[1391, 703], [1391, 875], [1404, 875], [1404, 703]], [[1444, 703], [1444, 875], [1444, 875], [1444, 703]], [[1470, 703], [1470, 875], [1483, 875], [1483, 703]], [[1509, 703], [1509, 875], [1523, 875], [1523, 703]], [[1575, 703], [1575, 875], [1589, 875], [1589, 703]], [[1628, 703], [1628, 875], [1641, 875], [1641, 703]], [[1655, 703], [1655, 875], [1655, 875], [1655, 703]], [[1681, 703], [1681, 875], [1694, 875], [1694, 703]], [[1747, 703], [1747, 875], [1747, 875], [1747, 703]], [[1800, 703], [1800, 875], [1800, 875], [1800, 703]], [[1839, 703], [1839, 875], [1852, 875], [1852, 703]], [[1865, 703], [1865, 875], [1879, 875], [1879, 703]], [[1892, 703], [1892, 875], [1905, 875], [1905, 703]], [[1918, 703], [1918, 875], [1918, 875], [1918, 703]], [[1958, 703], [1958, 875], [1958, 875], [1958, 703]], [[1971, 703], [1971, 875], [1971, 875], [1971, 703]], [[1997, 703], [1997, 875], [2011, 875], [2011, 703]], [[2050, 703], [2050, 875], [2050, 875], [2050, 703]], [[2090, 703], [2090, 875], [2090, 875], [2090, 703]], [[2116, 703], [2116, 875], [2116, 875], [2116, 703]], [[2156, 703], [2156, 875], [2156, 875], [2156, 703]], [[2195, 703], [2195, 875], [2208, 875], [2208, 703]], [[2222, 703], [2222, 875], [2235, 875], [2235, 703]], [[2261, 703], [2261, 875], [2261, 875], [2261, 703]], [[2301, 703], [2301, 875], [2327, 875], [2327, 703]], [[2353, 703], [2353, 875], [2367, 875], [2367, 703]], [[2380, 703], [2380, 875], [2393, 875], [2393, 703]], [[2406, 703], [2406, 875], [2419, 875], [2419, 703]], [[2472, 703], [2472, 875], [2472, 875], [2472, 703]], [[2538, 703], [2538, 875], [2538, 875], [2538, 703]], [[2564, 703], [2564, 875], [2578, 875], [2578, 703]], [[2617, 703], [2617, 875], [2630, 875], [2630, 703]], [[2643, 703], [2643, 875], [2657, 875], [2657, 703]], [[2670, 703], [2670, 875], [2670, 875], [2670, 703]], [[2683, 703], [2683, 875], [2696, 875], [2696, 703]], [[2749, 703], [2749, 875], [2749, 875], [2749, 703]], [[2789, 703], [2789, 875], [2789, 875], [2789, 703]], [[2828, 703], [2828, 875], [2828, 875], [2828, 703]], [[2854, 703], [2854, 875], [2854, 875], [2854, 703]], [[2881, 703], [2881, 875], [2894, 875], [2894, 703]], [[2907, 703], [2907, 875], [2907, 875], [2907, 703]], [[2920, 703], [2920, 875], [2934, 875], [2934, 703]], [[2947, 703], [2947, 875], [2947, 875], [2947, 703]], [[2973, 703], [2973, 875], [2986, 875], [2986, 703]], [[3065, 703], [3065, 875], [3065, 875], [3065, 703]], [[3105, 703], [3105, 875], [3118, 875], [3118, 703]], [[3131, 703], [3131, 875], [3145, 875], [3145, 703]], [[3158, 703], [3158, 875], [3171, 875], [3171, 703]]], "confidences": [0.9978576302528381, 0.9365259408950806, 0.9993323683738708, 0.9999881982803345, 0.995057225227356, 0.9951127171516418, 0.9600062966346741, 0.9987906813621521, 0.9990148544311523, 0.9999818801879883, 0.979132354259491, 0.9896356463432312, 0.9996901750564575, 0.9994376301765442, 0.9832384586334229, 0.9919760823249817, 0.9994718432426453, 0.99887615442276, 0.9999384880065918, 0.9999126195907593, 0.9968804121017456, 0.9998698234558105, 0.9996697902679443, 0.9999111890792847, 0.999935507774353, 0.9999529123306274, 0.9985625147819519, 0.9987615346908569, 0.9998716115951538, 0.9999983310699463, 0.9997947812080383, 0.9999533891677856, 0.9956774115562439, 0.9921483993530273, 0.9991742968559265, 0.8690173625946045, 0.9889227151870728, 0.990256130695343, 0.9499505758285522, 0.9942019581794739, 0.992321789264679, 0.9953250885009766, 0.9952391386032104, 0.9987290501594543, 0.9708223342895508, 0.9829660654067993, 0.998319685459137, 0.9980186223983765, 0.9733465313911438, 0.9576543569564819, 0.9972822666168213, 0.9974729418754578, 0.9998486042022705, 0.9998704195022583, 0.9851626753807068, 0.999782145023346, 0.9982467889785767, 0.5265796780586243, 0.9982032775878906, 0.9953908920288086, 0.9945998191833496, 0.9988899827003479, 0.932214617729187, 0.9992570281028748, 0.9942938685417175, 0.9976638555526733, 0.8540834784507751, 0.999862551689148, 0.999956488609314, 0.5673943161964417, 0.9989564418792725, 0.996831476688385, 0.9993277788162231, 0.9955874681472778, 0.995591402053833, 0.9929797053337097, 0.9888700246810913], "line": {"id": "line_4", "bbox": [349, 703, 3171, 875], "type": "bbox"}}, {"prediction": "\u0645\u0648\u062a\u062e\u0645 \u0637\u0641\u0633 \u064a\u0641 \u0649\u062f\u0646\u0639 \u0646\u064a\u0646\u0645\u0654\u0648\u0645\u0644\u0627 \u0631\u064a\u0645\u0654\u0627\u064a \u0649\u0647 \u0644\u0627\u0642 \u0627\u0647\u0628 \u0643\u062a\u0648\u0633\u0643 \u0649\u062a\u0644\u0627 \u0629\u0639\u0631\u0627\u062f\u0644\u0627 \u0644\u0639\u0641 \u0627\u0645 \u0647\u0644 \u0644\u0627\u0642", "cuts": [[[347, 875], [347, 1045], [360, 1045], [360, 875]], [[414, 875], [414, 1045], [414, 1045], [414, 875]], [[454, 875], [454, 1045], [467, 1045], [467, 875]], [[480, 875], [480, 1045], [480, 1045], [480, 875]], [[494, 875], [494, 1045], [494, 1045], [494, 875]], [[534, 875], [534, 1045], [534, 1045], [534, 875]], [[574, 875], [574, 1045], [574, 1045], [574, 875]], [[641, 875], [641, 1045], [641, 1045], [641, 875]], [[681, 875], [681, 1045], [694, 1045], [694, 875]], [[721, 875], [721, 1045], [721, 1045], [721, 875]], [[761, 875], [761, 1045], [761, 1045], [761, 875]], [[774, 875], [774, 1045], [774, 1045], [774, 875]], [[801, 875], [801, 1045], [814, 1045], [814, 875]], [[854, 875], [854, 1045], [854, 1045], [854, 875]], [[921, 875], [921, 1045], [921, 1045], [921, 875]], [[948, 875], [948, 1045], [948, 1045], [948, 875]], [[974, 875], [974, 1045], [974, 1045], [974, 875]], [[1014, 875], [1014, 1045], [1028, 1045], [1028, 875]], [[1054, 875], [1054, 1045], [1068, 1045], [1068, 875]], [[1081, 875], [1081, 1045], [1094, 1045], [1094, 875]], [[1121, 875], [1121, 1045], [1121, 1045], [1121, 875]], [[1148, 875], [1148, 1045], [1161, 1045], [1161, 875]], [[1201, 875], [1201, 1045], [1201, 1045], [1201, 875]], [[1214, 875], [1214, 1045], [1214, 1045], [1214, 875]], [[1228, 875], [1228, 1045], [1228, 1045], [1228, 875]], [[1241, 875], [1241, 1045], [1255, 1045], [1255, 875]], [[1268, 875], [1268, 1045], [1281, 1045], [1281, 875]], [[1295, 875], [1295, 1045], [1295, 1045], [1295, 875]], [[1335, 875], [1335, 1045], [1348, 1045], [1348, 875]], [[1361, 875], [1361, 1045], [1361, 1045], [1361, 875]], [[1388, 875], [1388, 1045], [1401, 1045], [1401, 875]], [[1415, 875], [1415, 1045], [1428, 1045], [1428, 875]], [[1441, 875], [1441, 1045], [1468, 1045], [1468, 875]], [[1481, 875], [1481, 1045], [1495, 1045], [1495, 875]], [[1508, 875], [1508, 1045], [1535, 1045], [1535, 875]], [[1602, 875], [1602, 1045], [1602, 1045], [1602, 875]], [[1615, 875], [1615, 1045], [1628, 1045], [1628, 875]], [[1655, 875], [1655, 1045], [1682, 1045], [1682, 875]], [[1735, 875], [1735, 1045], [1735, 1045], [1735, 875]], [[1748, 875], [1748, 1045], [1748, 1045], [1748, 875]], [[1775, 875], [1775, 1045], [1775, 1045], [1775, 875]], [[1802, 875], [1802, 1045], [1802, 1045], [1802, 875]], [[1828, 875], [1828, 1045], [1828, 1045], [1828, 875]], [[1882, 875], [1882, 1045], [1895, 1045], [1895, 875]], [[1922, 875], [1922, 1045], [1922, 1045], [1922, 875]], [[1948, 875], [1948, 1045], [1962, 1045], [1962, 875]], [[2015, 875], [2015, 1045], [2029, 1045], [2029, 875]], [[2082, 875], [2082, 1045], [2082, 1045], [2082, 875]], [[2122, 875], [2122, 1045], [2135, 1045], [2135, 875]], [[2175, 875], [2175, 1045], [2189, 1045], [2189, 875]], [[2242, 875], [2242, 1045], [2242, 1045], [2242, 875]], [[2295, 875], [2295, 1045], [2295, 1045], [2295, 875]], [[2336, 875], [2336, 1045], [2336, 1045], [2336, 875]], [[2349, 875], [2349, 1045], [2349, 1045], [2349, 875]], [[2362, 875], [2362, 1045], [2376, 1045], [2376, 875]], [[2389, 875], [2389, 1045], [2389, 1045], [2389, 875]], [[2402, 875], [2402, 1045], [2416, 1045], [2416, 875]], [[2429, 875], [2429, 1045], [2442, 1045], [2442, 875]], [[2456, 875], [2456, 1045], [2469, 1045], [2469, 875]], [[2522, 875], [2522, 1045], [2536, 1045], [2536, 875]], [[2549, 875], [2549, 1045], [2562, 1045], [2562, 875]], [[2589, 875], [2589, 1045], [2602, 1045], [2602, 875]], [[2629, 875], [2629, 1045], [2629, 1045], [2629, 875]], [[2642, 875], [2642, 1045], [2656, 1045], [2656, 875]], [[2669, 875], [2669, 1045], [2669, 1045], [2669, 875]], [[2776, 875], [2776, 1045], [2776, 1045], [2776, 875]], [[2803, 875], [2803, 1045], [2803, 1045], [2803, 875]], [[2843, 875], [2843, 1045], [2843, 1045], [2843, 875]], [[2869, 875], [2869, 1045], [2869, 1045], [2869, 875]], [[2896, 875], [2896, 1045], [2896, 1045], [2896, 875]], [[2923, 875], [2923, 1045], [2923, 1045], [2923, 875]], [[2963, 875], [2963, 1045], [2963, 1045], [2963, 875]], [[2989, 875], [2989, 1045], [2989, 1045], [2989, 875]], [[3016, 875], [3016, 1045], [3030, 1045], [3030, 875]], [[3043, 875], [3043, 1045], [3056, 1045], [3056, 875]], [[3123, 875], [3123, 1045], [3123, 1045], [3123, 875]], [[3136, 875], [3136, 1045], [3150, 1045], [3150, 875]], [[3163, 875], [3163, 1045], [3163, 1045], [3163, 875]]], "confidences": [0.9999685287475586, 0.7677904963493347, 0.9990272521972656, 0.9999896287918091, 0.9995161294937134, 0.9926141500473022, 0.9854110479354858, 0.9970456957817078, 0.9999581575393677, 0.9979928731918335, 0.9991545677185059, 0.9992891550064087, 0.9991033673286438, 0.9999771118164062, 0.9999916553497314, 0.6514611840248108, 0.7720828652381897, 0.9889744520187378, 0.9997015595436096, 0.9999628067016602, 0.8422739505767822, 0.9995865225791931, 0.9994408488273621, 0.9979164004325867, 0.9996676445007324, 0.9994599223136902, 0.9910250902175903, 0.9999783039093018, 0.9963022470474243, 0.6243562698364258, 0.9998552799224854, 0.9986860156059265, 0.999666690826416, 0.66583651304245, 0.9677010178565979, 0.9999728202819824, 0.9999947547912598, 0.9995187520980835, 0.9917859435081482, 0.9952231049537659, 0.988452136516571, 0.9948959946632385, 0.997393012046814, 0.984053909778595, 0.9514071345329285, 0.9919347763061523, 0.9954736828804016, 0.535146176815033, 0.9996613264083862, 0.9889037013053894, 0.9973983764648438, 0.7873133420944214, 0.814349353313446, 0.9971019625663757, 0.9976648092269897, 0.9264478087425232, 0.9916608929634094, 0.9994589686393738, 0.9972610473632812, 0.9991005659103394, 0.999413013458252, 0.9994602799415588, 0.9613319039344788, 0.9990511536598206, 0.9996521472930908, 0.7384001612663269, 0.9942810535430908, 0.9455984234809875, 0.9997734427452087, 0.9952616691589355, 0.9989475607872009, 0.9959900975227356, 0.9930391907691956, 0.9999250173568726, 0.998917818069458, 0.6285094618797302, 0.8354631662368774, 0.9813341498374939], "line": {"id": "line_5", "bbox": [347, 875, 3203, 1045], "type": "bbox"}}, {"prediction": "\u0627\u0647\u062a\u0644\u0628\u0642\u0648 \u0627\u0647\u0628 \u0627\u0643\u0631\u0628\u062a \u0627\u0647\u064a\u0644\u0627 \u062a\u0631\u0638\u0646\u0648 \u0637\u0641\u0633\u0644\u0627 \u062a\u062d\u062a\u0641\u0648 \u062a\u062d\u0628\u0635\u0654\u0627 \u0627\u0644\u0641 \u0627\u0647\u0628 \u062a\u0638\u0641\u062a\u062d\u0627 \u062f\u0642 \u0628\u064a\u0637 \u0647\u064a\u0641\u0648", "cuts": [[[349, 1045], [349, 1187], [362, 1187], [362, 1045]], [[375, 1045], [375, 1187], [375, 1187], [375, 1045]], [[425, 1045], [425, 1187], [425, 1187], [425, 1045]], [[451, 1045], [451, 1187], [451, 1187], [451, 1045]], [[476, 1045], [476, 1187], [476, 1187], [476, 1045]], [[502, 1045], [502, 1187], [502, 1187], [502, 1045]], [[552, 1045], [552, 1187], [565, 1187], [565, 1045]], [[578, 1045], [578, 1187], [603, 1187], [603, 1045]], [[629, 1045], [629, 1187], [641, 1187], [641, 1045]], [[692, 1045], [692, 1187], [705, 1187], [705, 1045]], [[730, 1045], [730, 1187], [730, 1187], [730, 1045]], [[756, 1045], [756, 1187], [756, 1187], [756, 1045]], [[781, 1045], [781, 1187], [781, 1187], [781, 1045]], [[794, 1045], [794, 1187], [794, 1187], [794, 1045]], [[857, 1045], [857, 1187], [857, 1187], [857, 1045]], [[870, 1045], [870, 1187], [870, 1187], [870, 1045]], [[896, 1045], [896, 1187], [896, 1187], [896, 1045]], [[921, 1045], [921, 1187], [934, 1187], [934, 1045]], [[959, 1045], [959, 1187], [972, 1187], [972, 1045]], [[984, 1045], [984, 1187], [984, 1187], [984, 1045]], [[1023, 1045], [1023, 1187], [1023, 1187], [1023, 1045]], [[1048, 1045], [1048, 1187], [1048, 1187], [1048, 1045]], [[1061, 1045], [1061, 1187], [1073, 1187], [1073, 1045]], [[1086, 1045], [1086, 1187], [1086, 1187], [1086, 1045]], [[1137, 1045], [1137, 1187], [1137, 1187], [1137, 1045]], [[1213, 1045], [1213, 1187], [1213, 1187], [1213, 1045]], [[1239, 1045], [1239, 1187], [1239, 1187], [1239, 1045]], [[1289, 1045], [1289, 1187], [1289, 1187], [1289, 1045]], [[1340, 1045], [1340, 1187], [1340, 1187], [1340, 1045]], [[1366, 1045], [1366, 1187], [1378, 1187], [1378, 1045]], [[1417, 1045], [1417, 1187], [1417, 1187], [1417, 1045]], [[1480, 1045], [1480, 1187], [1480, 1187], [1480, 1045]], [[1518, 1045], [1518, 1187], [1531, 1187], [1531, 1045]], [[1556, 1045], [1556, 1187], [1556, 1187], [1556, 1045]], [[1569, 1045], [1569, 1187], [1582, 1187], [1582, 1045]], [[1594, 1045], [1594, 1187], [1607, 1187], [1607, 1045]], [[1645, 1045], [1645, 1187], [1645, 1187], [1645, 1045]], [[1709, 1045], [1709, 1187], [1709, 1187], [1709, 1045]], [[1760, 1045], [1760, 1187], [1760, 1187], [1760, 1045]], [[1785, 1045], [1785, 1187], [1785, 1187], [1785, 1045]], [[1836, 1045], [1836, 1187], [1836, 1187], [1836, 1045]], [[1861, 1045], [1861, 1187], [1874, 1187], [1874, 1045]], [[1925, 1045], [1925, 1187], [1925, 1187], [1925, 1045]], [[1988, 1045], [1988, 1187], [1988, 1187], [1988, 1045]], [[2039, 1045], [2039, 1187], [2039, 1187], [2039, 1045]], [[2090, 1045], [2090, 1187], [2090, 1187], [2090, 1045]], [[2128, 1045], [2128, 1187], [2128, 1187], [2128, 1045]], [[2141, 1045], [2141, 1187], [2154, 1187], [2154, 1045]], [[2166, 1045], [2166, 1187], [2179, 1187], [2179, 1045]], [[2204, 1045], [2204, 1187], [2204, 1187], [2204, 1045]], [[2243, 1045], [2243, 1187], [2243, 1187], [2243, 1045]], [[2268, 1045], [2268, 1187], [2268, 1187], [2268, 1045]], [[2293, 1045], [2293, 1187], [2306, 1187], [2306, 1045]], [[2319, 1045], [2319, 1187], [2331, 1187], [2331, 1045]], [[2344, 1045], [2344, 1187], [2357, 1187], [2357, 1045]], [[2370, 1045], [2370, 1187], [2370, 1187], [2370, 1045]], [[2395, 1045], [2395, 1187], [2408, 1187], [2408, 1045]], [[2471, 1045], [2471, 1187], [2471, 1187], [2471, 1045]], [[2522, 1045], [2522, 1187], [2522, 1187], [2522, 1045]], [[2586, 1045], [2586, 1187], [2586, 1187], [2586, 1045]], [[2611, 1045], [2611, 1187], [2611, 1187], [2611, 1045]], [[2649, 1045], [2649, 1187], [2649, 1187], [2649, 1045]], [[2700, 1045], [2700, 1187], [2713, 1187], [2713, 1045]], [[2725, 1045], [2725, 1187], [2725, 1187], [2725, 1045]], [[2764, 1045], [2764, 1187], [2776, 1187], [2776, 1045]], [[2789, 1045], [2789, 1187], [2802, 1187], [2802, 1045]], [[2827, 1045], [2827, 1187], [2827, 1187], [2827, 1045]], [[2865, 1045], [2865, 1187], [2878, 1187], [2878, 1045]], [[2929, 1045], [2929, 1187], [2929, 1187], [2929, 1045]], [[2967, 1045], [2967, 1187], [2967, 1187], [2967, 1045]], [[3005, 1045], [3005, 1187], [3030, 1187], [3030, 1045]], [[3056, 1045], [3056, 1187], [3056, 1187], [3056, 1045]], [[3094, 1045], [3094, 1187], [3094, 1187], [3094, 1045]], [[3119, 1045], [3119, 1187], [3119, 1187], [3119, 1045]], [[3170, 1045], [3170, 1187], [3170, 1187], [3170, 1045]]], "confidences": [0.9951897859573364, 0.9994397759437561, 0.9996225833892822, 0.9996881484985352, 0.9991863369941711, 0.522216796875, 0.9999700784683228, 0.9999351501464844, 0.9608615040779114, 0.9998836517333984, 0.9998319149017334, 0.9999574422836304, 0.9995219707489014, 0.9832330346107483, 0.9993361830711365, 0.9289281964302063, 0.9628921747207642, 0.9998667240142822, 0.9999779462814331, 0.9990992546081543, 0.9141392707824707, 0.9998242259025574, 0.9967435002326965, 0.9999244213104248, 0.9998732805252075, 0.9988711476325989, 0.9987514019012451, 0.9988617897033691, 0.6241702437400818, 0.979806125164032, 0.9399409294128418, 0.9999160766601562, 0.9905988574028015, 0.9990541338920593, 0.9999421834945679, 0.960566520690918, 0.9946881532669067, 0.9999477863311768, 0.833644688129425, 0.9959911704063416, 0.9991551637649536, 0.9996606111526489, 0.9877347350120544, 0.9679129123687744, 0.9596376419067383, 0.986365795135498, 0.9459453225135803, 0.9946697354316711, 0.9895763397216797, 0.9849644303321838, 0.903245210647583, 0.7387762665748596, 0.9958617687225342, 0.9985413551330566, 0.9970884919166565, 0.6466483473777771, 0.9444775581359863, 0.8205862045288086, 0.9942649006843567, 0.984862744808197, 0.9972048401832581, 0.8482417464256287, 0.9919762015342712, 0.9672141671180725, 0.9989006519317627, 0.9998776912689209, 0.9994097948074341, 0.9945313334465027, 0.9889154434204102, 0.9952592253684998, 0.999559223651886, 0.99980229139328, 0.9894945025444031, 0.7909385561943054, 0.9917729496955872], "line": {"id": "line_6", "bbox": [349, 1045, 3183, 1187], "type": "bbox"}}, {"prediction": "\u0645\u0639\u0646 \u0644\u0627\u0642 \u0629\u0639\u0627\u0633\u0644\u0627 \u0627\u0640\u0647\u0631\u0636\u062d\u0627 \u0644\u0627\u0642\u0641 \u0643\u0644\u0630 \u0644\u062b\u0645 \u062a\u0639\u0646\u0635 \u062a\u064a\u0633\u0645\u0654\u0627 \u0627\u0644\u0643\u0648 \u0627\u0647\u0639\u0636\u0648\u0645 \u0649\u0644\u0627 \u0627\u0647\u062f\u062f\u0631\u0648", "cuts": [[[342, 1217], [342, 1386], [354, 1386], [354, 1217]], [[404, 1217], [404, 1386], [404, 1386], [404, 1217]], [[428, 1217], [428, 1386], [428, 1386], [428, 1217]], [[453, 1217], [453, 1386], [465, 1386], [465, 1217]], [[527, 1217], [527, 1386], [527, 1386], [527, 1217]], [[539, 1217], [539, 1386], [539, 1386], [539, 1217]], [[564, 1217], [564, 1386], [564, 1386], [564, 1217]], [[589, 1217], [589, 1386], [613, 1386], [613, 1217]], [[638, 1217], [638, 1386], [650, 1386], [650, 1217]], [[675, 1217], [675, 1386], [675, 1386], [675, 1217]], [[712, 1217], [712, 1386], [724, 1386], [724, 1217]], [[761, 1217], [761, 1386], [774, 1386], [774, 1217]], [[786, 1217], [786, 1386], [798, 1386], [798, 1217]], [[811, 1217], [811, 1386], [823, 1386], [823, 1217]], [[835, 1217], [835, 1386], [835, 1386], [835, 1217]], [[860, 1217], [860, 1386], [872, 1386], [872, 1217]], [[909, 1217], [909, 1386], [922, 1386], [922, 1217]], [[1020, 1217], [1020, 1386], [1020, 1386], [1020, 1217]], [[1082, 1217], [1082, 1386], [1082, 1386], [1082, 1217]], [[1119, 1217], [1119, 1386], [1131, 1386], [1131, 1217]], [[1181, 1217], [1181, 1386], [1193, 1386], [1193, 1217]], [[1242, 1217], [1242, 1386], [1255, 1386], [1255, 1217]], [[1267, 1217], [1267, 1386], [1267, 1386], [1267, 1217]], [[1329, 1217], [1329, 1386], [1341, 1386], [1341, 1217]], [[1353, 1217], [1353, 1386], [1366, 1386], [1366, 1217]], [[1390, 1217], [1390, 1386], [1390, 1386], [1390, 1217]], [[1427, 1217], [1427, 1386], [1427, 1386], [1427, 1217]], [[1452, 1217], [1452, 1386], [1452, 1386], [1452, 1217]], [[1501, 1217], [1501, 1386], [1501, 1386], [1501, 1217]], [[1551, 1217], [1551, 1386], [1563, 1386], [1563, 1217]], [[1575, 1217], [1575, 1386], [1588, 1386], [1588, 1217]], [[1612, 1217], [1612, 1386], [1625, 1386], [1625, 1217]], [[1686, 1217], [1686, 1386], [1699, 1386], [1699, 1217]], [[1711, 1217], [1711, 1386], [1723, 1386], [1723, 1217]], [[1736, 1217], [1736, 1386], [1748, 1386], [1748, 1217]], [[1773, 1217], [1773, 1386], [1785, 1386], [1785, 1217]], [[1822, 1217], [1822, 1386], [1835, 1386], [1835, 1217]], [[1884, 1217], [1884, 1386], [1884, 1386], [1884, 1217]], [[1921, 1217], [1921, 1386], [1933, 1386], [1933, 1217]], [[1970, 1217], [1970, 1386], [1983, 1386], [1983, 1217]], [[2007, 1217], [2007, 1386], [2020, 1386], [2020, 1217]], [[2069, 1217], [2069, 1386], [2069, 1386], [2069, 1217]], [[2118, 1217], [2118, 1386], [2118, 1386], [2118, 1217]], [[2155, 1217], [2155, 1386], [2168, 1386], [2168, 1217]], [[2192, 1217], [2192, 1386], [2205, 1386], [2205, 1217]], [[2217, 1217], [2217, 1386], [2229, 1386], [2229, 1217]], [[2242, 1217], [2242, 1386], [2254, 1386], [2254, 1217]], [[2266, 1217], [2266, 1386], [2279, 1386], [2279, 1217]], [[2316, 1217], [2316, 1386], [2328, 1386], [2328, 1217]], [[2353, 1217], [2353, 1386], [2365, 1386], [2365, 1217]], [[2377, 1217], [2377, 1386], [2377, 1386], [2377, 1217]], [[2439, 1217], [2439, 1386], [2439, 1386], [2439, 1217]], [[2464, 1217], [2464, 1386], [2476, 1386], [2476, 1217]], [[2501, 1217], [2501, 1386], [2501, 1386], [2501, 1217]], [[2525, 1217], [2525, 1386], [2525, 1386], [2525, 1217]], [[2575, 1217], [2575, 1386], [2575, 1386], [2575, 1217]], [[2624, 1217], [2624, 1386], [2624, 1386], [2624, 1217]], [[2698, 1217], [2698, 1386], [2698, 1386], [2698, 1217]], [[2735, 1217], [2735, 1386], [2735, 1386], [2735, 1217]], [[2760, 1217], [2760, 1386], [2772, 1386], [2772, 1217]], [[2821, 1217], [2821, 1386], [2821, 1386], [2821, 1217]], [[2834, 1217], [2834, 1386], [2834, 1386], [2834, 1217]], [[2858, 1217], [2858, 1386], [2858, 1386], [2858, 1217]], [[2871, 1217], [2871, 1386], [2895, 1386], [2895, 1217]], [[2932, 1217], [2932, 1386], [2932, 1386], [2932, 1217]], [[2957, 1217], [2957, 1386], [2957, 1386], [2957, 1217]], [[3019, 1217], [3019, 1386], [3019, 1386], [3019, 1217]], [[3056, 1217], [3056, 1386], [3056, 1386], [3056, 1217]], [[3105, 1217], [3105, 1386], [3105, 1386], [3105, 1217]], [[3154, 1217], [3154, 1386], [3167, 1386], [3167, 1217]]], "confidences": [0.9998668432235718, 0.9939495325088501, 0.9999988079071045, 0.9995810389518738, 0.9973961114883423, 0.9925320744514465, 0.9987910389900208, 0.9998966455459595, 0.9999004602432251, 0.981810450553894, 0.99687659740448, 0.9998045563697815, 0.9998052716255188, 0.9931424856185913, 0.9988383650779724, 0.9999014139175415, 0.8104275465011597, 0.9999496936798096, 0.9994741082191467, 0.9992212057113647, 0.9998238682746887, 0.9998308420181274, 0.9993120431900024, 0.998877227306366, 0.999991774559021, 0.9525014758110046, 0.9995104074478149, 0.9983181953430176, 0.9150962829589844, 0.9546083807945251, 0.9991251826286316, 0.9999608993530273, 0.9821158647537231, 0.9985532164573669, 0.9999796152114868, 0.9997883439064026, 0.9903550148010254, 0.9928650856018066, 0.9961369633674622, 0.9909413456916809, 0.9947617650032043, 0.9631214737892151, 0.9943027496337891, 0.9706187844276428, 0.998685896396637, 0.9429393410682678, 0.9975836277008057, 0.9990416169166565, 0.9978206157684326, 0.9992419481277466, 0.9985764026641846, 0.9849389791488647, 0.9799551367759705, 0.9954046010971069, 0.9584742784500122, 0.9991908669471741, 0.994751513004303, 0.9992371797561646, 0.8995857834815979, 0.99809330701828, 0.999932050704956, 0.8690654039382935, 0.5987728834152222, 0.9988412261009216, 0.6917583346366882, 0.9999560117721558, 0.904447615146637, 0.9634166955947876, 0.9973717927932739, 0.9989099502563477], "line": {"id": "line_7", "bbox": [342, 1217, 3179, 1386], "type": "bbox"}}, {"prediction": "\u0630\u0640\u062e\u0646 \u0649\u0631\u0627\u062f \u0646\u0645 \u0646\u0627\u0644\u0641\u0644\u0627 \u062a\u064a\u0628\u0644\u0627 \u0649\u0644\u0627 \u0636\u0645\u0627 \u0647\u0644 \u0644\u0627\u0642\u0641 \u0647\u0645\u062f\u062e \u0636\u0639\u0628 \u0649\u0639\u062f\u062a\u0633\u0627\u0642 \u0646\u064a\u0646\u0645\u0654\u0648\u0645\u0644\u0627 \u0631\u064a\u0645\u0654\u0627\u0627\u064a", "cuts": [[[363, 1386], [363, 1518], [363, 1518], [363, 1386]], [[413, 1386], [413, 1518], [426, 1518], [426, 1386]], [[514, 1386], [514, 1518], [514, 1518], [514, 1386]], [[551, 1386], [551, 1518], [551, 1518], [551, 1386]], [[564, 1386], [564, 1518], [589, 1518], [589, 1386]], [[652, 1386], [652, 1518], [652, 1518], [652, 1386]], [[702, 1386], [702, 1518], [715, 1518], [715, 1386]], [[740, 1386], [740, 1518], [752, 1518], [752, 1386]], [[765, 1386], [765, 1518], [777, 1518], [777, 1386]], [[802, 1386], [802, 1518], [815, 1518], [815, 1386]], [[865, 1386], [865, 1518], [865, 1518], [865, 1386]], [[903, 1386], [903, 1518], [903, 1518], [903, 1386]], [[928, 1386], [928, 1518], [940, 1518], [940, 1386]], [[991, 1386], [991, 1518], [991, 1518], [991, 1386]], [[1041, 1386], [1041, 1518], [1053, 1518], [1053, 1386]], [[1066, 1386], [1066, 1518], [1078, 1518], [1078, 1386]], [[1116, 1386], [1116, 1518], [1116, 1518], [1116, 1386]], [[1141, 1386], [1141, 1518], [1141, 1518], [1141, 1386]], [[1154, 1386], [1154, 1518], [1166, 1518], [1166, 1386]], [[1179, 1386], [1179, 1518], [1191, 1518], [1191, 1386]], [[1229, 1386], [1229, 1518], [1229, 1518], [1229, 1386]], [[1279, 1386], [1279, 1518], [1279, 1518], [1279, 1386]], [[1304, 1386], [1304, 1518], [1304, 1518], [1304, 1386]], [[1329, 1386], [1329, 1518], [1342, 1518], [1342, 1386]], [[1354, 1386], [1354, 1518], [1354, 1518], [1354, 1386]], [[1367, 1386], [1367, 1518], [1380, 1518], [1380, 1386]], [[1417, 1386], [1417, 1518], [1417, 1518], [1417, 1386]], [[1430, 1386], [1430, 1518], [1442, 1518], [1442, 1386]], [[1455, 1386], [1455, 1518], [1467, 1518], [1467, 1386]], [[1480, 1386], [1480, 1518], [1480, 1518], [1480, 1386]], [[1568, 1386], [1568, 1518], [1568, 1518], [1568, 1386]], [[1618, 1386], [1618, 1518], [1631, 1518], [1631, 1386]], [[1668, 1386], [1668, 1518], [1668, 1518], [1668, 1386]], [[1681, 1386], [1681, 1518], [1693, 1518], [1693, 1386]], [[1731, 1386], [1731, 1518], [1743, 1518], [1743, 1386]], [[1769, 1386], [1769, 1518], [1769, 1518], [1769, 1386]], [[1781, 1386], [1781, 1518], [1794, 1518], [1794, 1386]], [[1844, 1386], [1844, 1518], [1844, 1518], [1844, 1386]], [[1869, 1386], [1869, 1518], [1869, 1518], [1869, 1386]], [[1907, 1386], [1907, 1518], [1907, 1518], [1907, 1386]], [[1932, 1386], [1932, 1518], [1932, 1518], [1932, 1386]], [[1957, 1386], [1957, 1518], [1969, 1518], [1969, 1386]], [[1982, 1386], [1982, 1518], [1994, 1518], [1994, 1386]], [[2032, 1386], [2032, 1518], [2032, 1518], [2032, 1386]], [[2082, 1386], [2082, 1518], [2082, 1518], [2082, 1386]], [[2120, 1386], [2120, 1518], [2132, 1518], [2132, 1386]], [[2158, 1386], [2158, 1518], [2170, 1518], [2170, 1386]], [[2245, 1386], [2245, 1518], [2258, 1518], [2258, 1386]], [[2296, 1386], [2296, 1518], [2308, 1518], [2308, 1386]], [[2333, 1386], [2333, 1518], [2333, 1518], [2333, 1386]], [[2358, 1386], [2358, 1518], [2371, 1518], [2371, 1386]], [[2421, 1386], [2421, 1518], [2434, 1518], [2434, 1386]], [[2459, 1386], [2459, 1518], [2459, 1518], [2459, 1386]], [[2521, 1386], [2521, 1518], [2521, 1518], [2521, 1386]], [[2546, 1386], [2546, 1518], [2546, 1518], [2546, 1386]], [[2597, 1386], [2597, 1518], [2597, 1518], [2597, 1386]], [[2622, 1386], [2622, 1518], [2634, 1518], [2634, 1386]], [[2647, 1386], [2647, 1518], [2647, 1518], [2647, 1386]], [[2672, 1386], [2672, 1518], [2697, 1518], [2697, 1386]], [[2735, 1386], [2735, 1518], [2747, 1518], [2747, 1386]], [[2772, 1386], [2772, 1518], [2772, 1518], [2772, 1386]], [[2797, 1386], [2797, 1518], [2810, 1518], [2810, 1386]], [[2835, 1386], [2835, 1518], [2835, 1518], [2835, 1386]], [[2873, 1386], [2873, 1518], [2873, 1518], [2873, 1386]], [[2885, 1386], [2885, 1518], [2898, 1518], [2898, 1386]], [[2910, 1386], [2910, 1518], [2910, 1518], [2910, 1386]], [[2923, 1386], [2923, 1518], [2923, 1518], [2923, 1386]], [[2948, 1386], [2948, 1518], [2961, 1518], [2961, 1386]], [[2973, 1386], [2973, 1518], [2973, 1518], [2973, 1386]], [[3011, 1386], [3011, 1518], [3023, 1518], [3023, 1386]], [[3036, 1386], [3036, 1518], [3036, 1518], [3036, 1386]], [[3073, 1386], [3073, 1518], [3073, 1518], [3073, 1386]], [[3099, 1386], [3099, 1518], [3099, 1518], [3099, 1386]], [[3111, 1386], [3111, 1518], [3111, 1518], [3111, 1386]], [[3136, 1386], [3136, 1518], [3149, 1518], [3149, 1386]], [[3161, 1386], [3161, 1518], [3161, 1518], [3161, 1386]]], "confidences": [0.9999401569366455, 0.9998226761817932, 0.9994499087333679, 0.9997947812080383, 0.9999337196350098, 0.9999203681945801, 0.9999982118606567, 0.9687603116035461, 0.9988839030265808, 0.998324453830719, 0.9755439758300781, 0.9999986886978149, 0.9999879598617554, 0.9918851852416992, 0.8710991144180298, 0.9998831748962402, 0.9799282550811768, 0.9640147686004639, 0.9995965361595154, 0.9998983144760132, 0.9994907379150391, 0.9999008178710938, 0.9999949932098389, 0.9999257326126099, 0.9849360585212708, 0.9992073178291321, 0.9999591112136841, 0.9999978542327881, 0.9979308843612671, 0.9989111423492432, 0.9988147020339966, 0.999931812286377, 0.9295510649681091, 0.9994879961013794, 0.92276930809021, 0.9905250668525696, 0.9945216178894043, 0.997312605381012, 0.9944058656692505, 0.7167887091636658, 0.9777094125747681, 0.9938310384750366, 0.9831866025924683, 0.9466024041175842, 0.9909795522689819, 0.9944062232971191, 0.9905561804771423, 0.9995214939117432, 0.9992606043815613, 0.9838502407073975, 0.9978698492050171, 0.9995675683021545, 0.9971568584442139, 0.9990284442901611, 0.9905042052268982, 0.9607644081115723, 0.9984911680221558, 0.7474943399429321, 0.9998549222946167, 0.9999047517776489, 0.9814210534095764, 0.9995946288108826, 0.999559223651886, 0.9958802461624146, 0.9985283613204956, 0.9995490908622742, 0.9966185092926025, 0.9981649518013, 0.8663971424102783, 0.9913069605827332, 0.9690742492675781, 0.9696444869041443, 0.9100111126899719, 0.9691933393478394, 0.9827510714530945, 0.9762600064277649], "line": {"id": "line_8", "bbox": [338, 1386, 3174, 1518], "type": "bbox"}}, {"prediction": "\u062b\u0628\u0644\u064a \u0645\u0644\u0641 \u0647\u0645\u062a\u062e\u0628 \u0647\u064a\u0641 \u0649\u0630\u0644\u0627 \u0637\u0641\u0633\u0644\u0627\u0628 \u0649\u0646\u0654\u064a\u062c\u0644 \u0641\u0627\u0644\u0641\u0644\u0627 \u0642\u0648\u062f\u0646\u0635\u0644\u0627 \u062d\u062a\u0641\u0627 \u0645\u062b \u0647\u062d\u062a\u0641\u0627\u0648 \u064a\u0641\u0632\u0627\u062e \u0646\u0645 \u0647\u062d\u0627\u062a\u0641\u0645", "cuts": [[[361, 1567], [361, 1720], [361, 1720], [361, 1567]], [[413, 1567], [413, 1720], [413, 1720], [413, 1567]], [[439, 1567], [439, 1720], [439, 1720], [439, 1567]], [[465, 1567], [465, 1720], [465, 1720], [465, 1567]], [[491, 1567], [491, 1720], [504, 1720], [504, 1567]], [[517, 1567], [517, 1720], [530, 1720], [530, 1567]], [[543, 1567], [543, 1720], [543, 1720], [543, 1567]], [[556, 1567], [556, 1720], [569, 1720], [569, 1567]], [[582, 1567], [582, 1720], [595, 1720], [595, 1567]], [[621, 1567], [621, 1720], [621, 1720], [621, 1567]], [[660, 1567], [660, 1720], [660, 1720], [660, 1567]], [[699, 1567], [699, 1720], [699, 1720], [699, 1567]], [[725, 1567], [725, 1720], [725, 1720], [725, 1567]], [[764, 1567], [764, 1720], [764, 1720], [764, 1567]], [[777, 1567], [777, 1720], [790, 1720], [790, 1567]], [[816, 1567], [816, 1720], [816, 1720], [816, 1567]], [[855, 1567], [855, 1720], [855, 1720], [855, 1567]], [[881, 1567], [881, 1720], [881, 1720], [881, 1567]], [[907, 1567], [907, 1720], [920, 1720], [920, 1567]], [[972, 1567], [972, 1720], [972, 1720], [972, 1567]], [[1024, 1567], [1024, 1720], [1024, 1720], [1024, 1567]], [[1051, 1567], [1051, 1720], [1051, 1720], [1051, 1567]], [[1077, 1567], [1077, 1720], [1077, 1720], [1077, 1567]], [[1090, 1567], [1090, 1720], [1103, 1720], [1103, 1567]], [[1142, 1567], [1142, 1720], [1155, 1720], [1155, 1567]], [[1207, 1567], [1207, 1720], [1207, 1720], [1207, 1567]], [[1259, 1567], [1259, 1720], [1272, 1720], [1272, 1567]], [[1298, 1567], [1298, 1720], [1311, 1720], [1311, 1567]], [[1324, 1567], [1324, 1720], [1337, 1720], [1337, 1567]], [[1350, 1567], [1350, 1720], [1350, 1720], [1350, 1567]], [[1363, 1567], [1363, 1720], [1376, 1720], [1376, 1567]], [[1415, 1567], [1415, 1720], [1415, 1720], [1415, 1567]], [[1428, 1567], [1428, 1720], [1441, 1720], [1441, 1567]], [[1454, 1567], [1454, 1720], [1454, 1720], [1454, 1567]], [[1467, 1567], [1467, 1720], [1467, 1720], [1467, 1567]], [[1493, 1567], [1493, 1720], [1506, 1720], [1506, 1567]], [[1519, 1567], [1519, 1720], [1519, 1720], [1519, 1567]], [[1545, 1567], [1545, 1720], [1558, 1720], [1558, 1567]], [[1597, 1567], [1597, 1720], [1597, 1720], [1597, 1567]], [[1636, 1567], [1636, 1720], [1662, 1720], [1662, 1567]], [[1675, 1567], [1675, 1720], [1675, 1720], [1675, 1567]], [[1714, 1567], [1714, 1720], [1714, 1720], [1714, 1567]], [[1740, 1567], [1740, 1720], [1740, 1720], [1740, 1567]], [[1753, 1567], [1753, 1720], [1753, 1720], [1753, 1567]], [[1766, 1567], [1766, 1720], [1779, 1720], [1779, 1567]], [[1831, 1567], [1831, 1720], [1831, 1720], [1831, 1567]], [[1883, 1567], [1883, 1720], [1883, 1720], [1883, 1567]], [[1935, 1567], [1935, 1720], [1935, 1720], [1935, 1567]], [[1961, 1567], [1961, 1720], [1961, 1720], [1961, 1567]], [[2013, 1567], [2013, 1720], [2013, 1720], [2013, 1567]], [[2052, 1567], [2052, 1720], [2052, 1720], [2052, 1567]], [[2065, 1567], [2065, 1720], [2078, 1720], [2078, 1567]], [[2091, 1567], [2091, 1720], [2104, 1720], [2104, 1567]], [[2130, 1567], [2130, 1720], [2130, 1720], [2130, 1567]], [[2182, 1567], [2182, 1720], [2182, 1720], [2182, 1567]], [[2208, 1567], [2208, 1720], [2208, 1720], [2208, 1567]], [[2234, 1567], [2234, 1720], [2247, 1720], [2247, 1567]], [[2260, 1567], [2260, 1720], [2260, 1720], [2260, 1567]], [[2286, 1567], [2286, 1720], [2299, 1720], [2299, 1567]], [[2338, 1567], [2338, 1720], [2338, 1720], [2338, 1567]], [[2364, 1567], [2364, 1720], [2377, 1720], [2377, 1567]], [[2390, 1567], [2390, 1720], [2390, 1720], [2390, 1567]], [[2429, 1567], [2429, 1720], [2429, 1720], [2429, 1567]], [[2482, 1567], [2482, 1720], [2482, 1720], [2482, 1567]], [[2508, 1567], [2508, 1720], [2508, 1720], [2508, 1567]], [[2534, 1567], [2534, 1720], [2534, 1720], [2534, 1567]], [[2586, 1567], [2586, 1720], [2586, 1720], [2586, 1567]], [[2612, 1567], [2612, 1720], [2625, 1720], [2625, 1567]], [[2651, 1567], [2651, 1720], [2651, 1720], [2651, 1567]], [[2664, 1567], [2664, 1720], [2664, 1720], [2664, 1567]], [[2716, 1567], [2716, 1720], [2716, 1720], [2716, 1567]], [[2742, 1567], [2742, 1720], [2742, 1720], [2742, 1567]], [[2768, 1567], [2768, 1720], [2781, 1720], [2781, 1567]], [[2807, 1567], [2807, 1720], [2820, 1720], [2820, 1567]], [[2859, 1567], [2859, 1720], [2859, 1720], [2859, 1567]], [[2898, 1567], [2898, 1720], [2898, 1720], [2898, 1567]], [[2924, 1567], [2924, 1720], [2937, 1720], [2937, 1567]], [[2963, 1567], [2963, 1720], [2963, 1720], [2963, 1567]], [[3002, 1567], [3002, 1720], [3002, 1720], [3002, 1567]], [[3054, 1567], [3054, 1720], [3054, 1720], [3054, 1567]], [[3080, 1567], [3080, 1720], [3080, 1720], [3080, 1567]], [[3119, 1567], [3119, 1720], [3119, 1720], [3119, 1567]], [[3145, 1567], [3145, 1720], [3158, 1720], [3158, 1567]]], "confidences": [0.9997847676277161, 0.8071998953819275, 0.9448097944259644, 0.5688155293464661, 0.9998739957809448, 0.9982267022132874, 0.9191160798072815, 0.9526958465576172, 0.999830961227417, 0.9999995231628418, 0.9993177652359009, 0.7347162365913391, 0.9999439716339111, 0.9998359680175781, 0.9999669790267944, 0.9836472868919373, 0.7263768315315247, 0.9997736811637878, 0.977462887763977, 0.9863080382347107, 0.9985411167144775, 0.9811128377914429, 0.8683425784111023, 0.9999358654022217, 0.9999024868011475, 0.9963384866714478, 0.9992992877960205, 0.9999573230743408, 0.9997846484184265, 0.9697093963623047, 0.9807730913162231, 0.9946768283843994, 0.9997909665107727, 0.9734904170036316, 0.9997913241386414, 0.998504638671875, 0.9990155696868896, 0.9989411234855652, 0.54173743724823, 0.9961016178131104, 0.9981348514556885, 0.9947880506515503, 0.9791303277015686, 0.9969891905784607, 0.9995549321174622, 0.8724766969680786, 0.9847140908241272, 0.9845319390296936, 0.9821130037307739, 0.9790477156639099, 0.838432252407074, 0.8714025616645813, 0.9906243681907654, 0.9986967444419861, 0.9988054037094116, 0.9993483424186707, 0.9957486987113953, 0.8649066090583801, 0.9977350234985352, 0.9995262622833252, 0.9965477585792542, 0.9975600242614746, 0.8291054368019104, 0.9957834482192993, 0.9864495396614075, 0.9921678900718689, 0.9627065658569336, 0.9999135732650757, 0.95207279920578, 0.9991065859794617, 0.9793131947517395, 0.8521793484687805, 0.9974838495254517, 0.9999358654022217, 0.9997324347496033, 0.9997784495353699, 0.9984983205795288, 0.9993114471435547, 0.8725327849388123, 0.9996665716171265, 0.9979007244110107, 0.9954906105995178, 0.9731282591819763], "line": {"id": "line_9", "bbox": [335, 1567, 3171, 1720], "type": "bbox"}}, {"prediction": "\u0647\u0640\u062d\u062a\u0641\u0648 \u0647\u0645\u062a\u062e \u0631\u0633\u0643\u0628 \u0631\u0645\u0654\u0627\u0641 \u062f\u064a\u0634\u0631\u0644\u0627 \u0649\u062f\u064a \u0646\u064a\u0628 \u0639\u0636\u0648\u0641 \u0627\u0645\u0648\u062a\u062d\u0645 \u0637\u0641\u0633\u0644\u0627\u0628 \u0621\u0627\u062c \u0646\u0627 \u0645\u0627\u0644\u063a\u0644\u0627", "cuts": [[[332, 1721], [332, 1880], [345, 1880], [345, 1721]], [[384, 1721], [384, 1880], [397, 1880], [397, 1721]], [[501, 1721], [501, 1880], [514, 1880], [514, 1721]], [[553, 1721], [553, 1880], [553, 1880], [553, 1721]], [[579, 1721], [579, 1880], [579, 1880], [579, 1721]], [[631, 1721], [631, 1880], [644, 1880], [644, 1721]], [[657, 1721], [657, 1880], [683, 1880], [683, 1721]], [[709, 1721], [709, 1880], [709, 1880], [709, 1721]], [[748, 1721], [748, 1880], [748, 1880], [748, 1721]], [[787, 1721], [787, 1880], [787, 1880], [787, 1721]], [[826, 1721], [826, 1880], [826, 1880], [826, 1721]], [[865, 1721], [865, 1880], [878, 1880], [878, 1721]], [[917, 1721], [917, 1880], [917, 1880], [917, 1721]], [[956, 1721], [956, 1880], [969, 1880], [969, 1721]], [[1021, 1721], [1021, 1880], [1021, 1880], [1021, 1721]], [[1100, 1721], [1100, 1880], [1100, 1880], [1100, 1721]], [[1126, 1721], [1126, 1880], [1139, 1880], [1139, 1721]], [[1178, 1721], [1178, 1880], [1191, 1880], [1191, 1721]], [[1217, 1721], [1217, 1880], [1217, 1880], [1217, 1721]], [[1243, 1721], [1243, 1880], [1243, 1880], [1243, 1721]], [[1256, 1721], [1256, 1880], [1269, 1880], [1269, 1721]], [[1282, 1721], [1282, 1880], [1282, 1880], [1282, 1721]], [[1308, 1721], [1308, 1880], [1321, 1880], [1321, 1721]], [[1373, 1721], [1373, 1880], [1386, 1880], [1386, 1721]], [[1412, 1721], [1412, 1880], [1412, 1880], [1412, 1721]], [[1451, 1721], [1451, 1880], [1464, 1880], [1464, 1721]], [[1503, 1721], [1503, 1880], [1503, 1880], [1503, 1721]], [[1516, 1721], [1516, 1880], [1529, 1880], [1529, 1721]], [[1542, 1721], [1542, 1880], [1555, 1880], [1555, 1721]], [[1568, 1721], [1568, 1880], [1568, 1880], [1568, 1721]], [[1659, 1721], [1659, 1880], [1659, 1880], [1659, 1721]], [[1711, 1721], [1711, 1880], [1724, 1880], [1724, 1721]], [[1776, 1721], [1776, 1880], [1776, 1880], [1776, 1721]], [[1802, 1721], [1802, 1880], [1815, 1880], [1815, 1721]], [[1841, 1721], [1841, 1880], [1854, 1880], [1854, 1721]], [[1867, 1721], [1867, 1880], [1867, 1880], [1867, 1721]], [[1893, 1721], [1893, 1880], [1893, 1880], [1893, 1721]], [[1919, 1721], [1919, 1880], [1932, 1880], [1932, 1721]], [[1997, 1721], [1997, 1880], [1997, 1880], [1997, 1721]], [[2062, 1721], [2062, 1880], [2062, 1880], [2062, 1721]], [[2127, 1721], [2127, 1880], [2140, 1880], [2140, 1721]], [[2166, 1721], [2166, 1880], [2166, 1880], [2166, 1721]], [[2192, 1721], [2192, 1880], [2205, 1880], [2205, 1721]], [[2244, 1721], [2244, 1880], [2257, 1880], [2257, 1721]], [[2270, 1721], [2270, 1880], [2283, 1880], [2283, 1721]], [[2322, 1721], [2322, 1880], [2335, 1880], [2335, 1721]], [[2361, 1721], [2361, 1880], [2361, 1880], [2361, 1721]], [[2400, 1721], [2400, 1880], [2400, 1880], [2400, 1721]], [[2413, 1721], [2413, 1880], [2413, 1880], [2413, 1721]], [[2452, 1721], [2452, 1880], [2452, 1880], [2452, 1721]], [[2492, 1721], [2492, 1880], [2505, 1880], [2505, 1721]], [[2557, 1721], [2557, 1880], [2557, 1880], [2557, 1721]], [[2609, 1721], [2609, 1880], [2622, 1880], [2622, 1721]], [[2648, 1721], [2648, 1880], [2648, 1880], [2648, 1721]], [[2661, 1721], [2661, 1880], [2674, 1880], [2674, 1721]], [[2687, 1721], [2687, 1880], [2700, 1880], [2700, 1721]], [[2713, 1721], [2713, 1880], [2726, 1880], [2726, 1721]], [[2765, 1721], [2765, 1880], [2765, 1880], [2765, 1721]], [[2791, 1721], [2791, 1880], [2804, 1880], [2804, 1721]], [[2817, 1721], [2817, 1880], [2830, 1880], [2830, 1721]], [[2869, 1721], [2869, 1880], [2882, 1880], [2882, 1721]], [[2908, 1721], [2908, 1880], [2921, 1880], [2921, 1721]], [[2947, 1721], [2947, 1880], [2960, 1880], [2960, 1721]], [[2973, 1721], [2973, 1880], [2986, 1880], [2986, 1721]], [[2999, 1721], [2999, 1880], [3012, 1880], [3012, 1721]], [[3038, 1721], [3038, 1880], [3064, 1880], [3064, 1721]], [[3077, 1721], [3077, 1880], [3077, 1880], [3077, 1721]], [[3103, 1721], [3103, 1880], [3116, 1880], [3116, 1721]], [[3142, 1721], [3142, 1880], [3142, 1880], [3142, 1721]], [[3155, 1721], [3155, 1880], [3168, 1880], [3168, 1721]]], "confidences": [0.9992807507514954, 0.9998190999031067, 0.9999728202819824, 0.9843649864196777, 0.9963064193725586, 0.9997701048851013, 0.9999123811721802, 0.9973879456520081, 0.999208390712738, 0.9719638824462891, 0.9987868666648865, 0.9970434308052063, 0.9997827410697937, 0.9999145269393921, 0.9791185259819031, 0.9905698299407959, 0.9965567588806152, 0.9983978867530823, 0.9999661445617676, 0.9999735355377197, 0.9999608993530273, 0.9998136162757874, 0.9998812675476074, 0.9741519093513489, 0.9999430179595947, 0.9712876081466675, 0.9996782541275024, 0.9999500513076782, 0.9999716281890869, 0.9999657869338989, 0.9887442588806152, 0.9972917437553406, 0.9999973773956299, 0.997856080532074, 0.9842910766601562, 0.9882177710533142, 0.9942337870597839, 0.9974427223205566, 0.8417571187019348, 0.96481853723526, 0.9993478655815125, 0.9817719459533691, 0.8848896622657776, 0.9665166735649109, 0.9880167245864868, 0.9940158128738403, 0.9972080588340759, 0.9924798011779785, 0.999430239200592, 0.9886217713356018, 0.9994122982025146, 0.9545918107032776, 0.9984832406044006, 0.9997020363807678, 0.9989163875579834, 0.9997730851173401, 0.9998658895492554, 0.9669737815856934, 0.9264388084411621, 0.9989351630210876, 0.9926611185073853, 0.9998636245727539, 0.9986826777458191, 0.9965075850486755, 0.9996894598007202, 0.9975529313087463, 0.9992383718490601, 0.9993176460266113, 0.9744951128959656, 0.9796627163887024], "line": {"id": "line_10", "bbox": [332, 1721, 3207, 1880], "type": "bbox"}}, {"prediction": "\u0647\u0628\u0636\u063a \u0646\u0645 \u062f\u064a\u0634\u0631\u0644\u0627 \u0646\u0643\u0633\u0641 \u0628\u064a\u0637\u0644\u0627 \u064a\u0641 \u0629\u0646\u0648\u0641\u062f\u0645 \u0629\u064a\u0648\u0637\u0645 \u0627\u0647\u0644\u0627\u062d \u0647\u064a\u0641 \u0629\u0639\u0627\u0631\u062f\u0644\u0627 \u0649\u0644\u0627 \u0631\u0638\u0646 \u062d\u062a\u0641 \u0627\u0644\u0646", "cuts": [[[331, 1906], [331, 2053], [331, 2053], [331, 1906]], [[370, 1906], [370, 2053], [370, 2053], [370, 1906]], [[409, 1906], [409, 2053], [409, 2053], [409, 1906]], [[473, 1906], [473, 2053], [473, 2053], [473, 1906]], [[512, 1906], [512, 2053], [525, 2053], [525, 1906]], [[563, 1906], [563, 2053], [563, 2053], [563, 1906]], [[602, 1906], [602, 2053], [602, 2053], [602, 1906]], [[628, 1906], [628, 2053], [641, 2053], [641, 1906]], [[679, 1906], [679, 2053], [679, 2053], [679, 1906]], [[705, 1906], [705, 2053], [705, 2053], [705, 1906]], [[757, 1906], [757, 2053], [757, 2053], [757, 1906]], [[795, 1906], [795, 2053], [808, 2053], [808, 1906]], [[821, 1906], [821, 2053], [821, 2053], [821, 1906]], [[834, 1906], [834, 2053], [847, 2053], [847, 1906]], [[860, 1906], [860, 2053], [873, 2053], [873, 1906]], [[924, 1906], [924, 2053], [937, 2053], [937, 1906]], [[976, 1906], [976, 2053], [976, 2053], [976, 1906]], [[1156, 1906], [1156, 2053], [1156, 2053], [1156, 1906]], [[1182, 1906], [1182, 2053], [1195, 2053], [1195, 1906]], [[1221, 1906], [1221, 2053], [1233, 2053], [1233, 1906]], [[1272, 1906], [1272, 2053], [1272, 2053], [1272, 1906]], [[1337, 1906], [1337, 2053], [1337, 2053], [1337, 1906]], [[1362, 1906], [1362, 2053], [1362, 2053], [1362, 1906]], [[1401, 1906], [1401, 2053], [1414, 2053], [1414, 1906]], [[1427, 1906], [1427, 2053], [1427, 2053], [1427, 1906]], [[1440, 1906], [1440, 2053], [1453, 2053], [1453, 1906]], [[1504, 1906], [1504, 2053], [1504, 2053], [1504, 1906]], [[1517, 1906], [1517, 2053], [1530, 2053], [1530, 1906]], [[1556, 1906], [1556, 2053], [1569, 2053], [1569, 1906]], [[1581, 1906], [1581, 2053], [1594, 2053], [1594, 1906]], [[1620, 1906], [1620, 2053], [1620, 2053], [1620, 1906]], [[1659, 1906], [1659, 2053], [1672, 2053], [1672, 1906]], [[1697, 1906], [1697, 2053], [1697, 2053], [1697, 1906]], [[1736, 1906], [1736, 2053], [1749, 2053], [1749, 1906]], [[1775, 1906], [1775, 2053], [1775, 2053], [1775, 1906]], [[1801, 1906], [1801, 2053], [1813, 2053], [1813, 1906]], [[1839, 1906], [1839, 2053], [1839, 2053], [1839, 1906]], [[1865, 1906], [1865, 2053], [1865, 2053], [1865, 1906]], [[1917, 1906], [1917, 2053], [1917, 2053], [1917, 1906]], [[1955, 1906], [1955, 2053], [1955, 2053], [1955, 1906]], [[2007, 1906], [2007, 2053], [2007, 2053], [2007, 1906]], [[2033, 1906], [2033, 2053], [2045, 2053], [2045, 1906]], [[2071, 1906], [2071, 2053], [2071, 2053], [2071, 1906]], [[2097, 1906], [2097, 2053], [2097, 2053], [2097, 1906]], [[2110, 1906], [2110, 2053], [2123, 2053], [2123, 1906]], [[2136, 1906], [2136, 2053], [2149, 2053], [2149, 1906]], [[2174, 1906], [2174, 2053], [2174, 2053], [2174, 1906]], [[2226, 1906], [2226, 2053], [2239, 2053], [2239, 1906]], [[2265, 1906], [2265, 2053], [2265, 2053], [2265, 1906]], [[2290, 1906], [2290, 2053], [2303, 2053], [2303, 1906]], [[2329, 1906], [2329, 2053], [2329, 2053], [2329, 1906]], [[2355, 1906], [2355, 2053], [2368, 2053], [2368, 1906]], [[2393, 1906], [2393, 2053], [2393, 2053], [2393, 1906]], [[2419, 1906], [2419, 2053], [2419, 2053], [2419, 1906]], [[2458, 1906], [2458, 2053], [2471, 2053], [2471, 1906]], [[2509, 1906], [2509, 2053], [2509, 2053], [2509, 1906]], [[2548, 1906], [2548, 2053], [2548, 2053], [2548, 1906]], [[2574, 1906], [2574, 2053], [2587, 2053], [2587, 1906]], [[2600, 1906], [2600, 2053], [2613, 2053], [2613, 1906]], [[2625, 1906], [2625, 2053], [2625, 2053], [2625, 1906]], [[2677, 1906], [2677, 2053], [2677, 2053], [2677, 1906]], [[2690, 1906], [2690, 2053], [2690, 2053], [2690, 1906]], [[2716, 1906], [2716, 2053], [2716, 2053], [2716, 1906]], [[2729, 1906], [2729, 2053], [2741, 2053], [2741, 1906]], [[2780, 1906], [2780, 2053], [2780, 2053], [2780, 1906]], [[2806, 1906], [2806, 2053], [2819, 2053], [2819, 1906]], [[2857, 1906], [2857, 2053], [2857, 2053], [2857, 1906]], [[2870, 1906], [2870, 2053], [2896, 2053], [2896, 1906]], [[2922, 1906], [2922, 2053], [2935, 2053], [2935, 1906]], [[2973, 1906], [2973, 2053], [2973, 2053], [2973, 1906]], [[2999, 1906], [2999, 2053], [2999, 2053], [2999, 1906]], [[3025, 1906], [3025, 2053], [3025, 2053], [3025, 1906]], [[3051, 1906], [3051, 2053], [3051, 2053], [3051, 1906]], [[3128, 1906], [3128, 2053], [3141, 2053], [3141, 1906]], [[3167, 1906], [3167, 2053], [3167, 2053], [3167, 1906]]], "confidences": [0.9159960746765137, 0.9976181387901306, 0.9996975660324097, 0.9877948760986328, 0.9998071789741516, 0.9193847179412842, 0.9977598190307617, 0.9999691247940063, 0.5213192105293274, 0.9998345375061035, 0.9993784427642822, 0.9995831847190857, 0.999843955039978, 0.9999074935913086, 0.6370336413383484, 0.9995335340499878, 0.9989326596260071, 0.9860919117927551, 0.999936580657959, 0.9919663667678833, 0.9993558526039124, 0.9862826466560364, 0.8228899836540222, 0.9858511090278625, 0.9946306943893433, 0.9999549388885498, 0.999767005443573, 0.9996095299720764, 0.9999788999557495, 0.9988093376159668, 0.5167495608329773, 0.9999475479125977, 0.9990980625152588, 0.9999123811721802, 0.6137158870697021, 0.9979343414306641, 0.9267524480819702, 0.7948201894760132, 0.9545791745185852, 0.9082372188568115, 0.9680109024047852, 0.995181143283844, 0.9705617427825928, 0.8799518942832947, 0.9786372184753418, 0.9424921274185181, 0.605963408946991, 0.9994131326675415, 0.9984038472175598, 0.9985394477844238, 0.9992857575416565, 0.9990177154541016, 0.9961357116699219, 0.9946891069412231, 0.9922365546226501, 0.9932458996772766, 0.9726880788803101, 0.9994227886199951, 0.9991672039031982, 0.9998785257339478, 0.999698281288147, 0.9973363280296326, 0.9942309856414795, 0.9929460883140564, 0.8134588599205017, 0.9999004602432251, 0.9500336647033691, 0.999967098236084, 0.9991039633750916, 0.9984264373779297, 0.8896018266677856, 0.7239580750465393, 0.9947216510772705, 0.9903062582015991, 0.8236287832260132], "line": {"id": "line_11", "bbox": [331, 1906, 3167, 2053], "type": "bbox"}}, {"prediction": "\u0627\u0647\u062f\u0639\u0628 \u0643\u064a\u0644\u0639 \u0642\u062f\u0635\u0627 \u0646\u0644\u0641 \u0627\u062f\u0634\u0627\u0631 \u0641\u0631\u0635\u0646\u0627\u0648 \u0627\u0647\u0646\u0627\u0643\u0645 \u0649\u0644\u0627 \u0627\u0647\u062f\u062f\u0631\u0627 \u0646\u064a\u0637\u0642\u064a \u0646\u0628 \u0649\u0644\u0639\u0644 \u0644\u0627\u0642 \u0645\u0654\u064a", "cuts": [[[334, 2060], [334, 2231], [334, 2231], [334, 2060]], [[360, 2060], [360, 2231], [360, 2231], [360, 2060]], [[425, 2060], [425, 2231], [425, 2231], [425, 2060]], [[451, 2060], [451, 2231], [451, 2231], [451, 2060]], [[477, 2060], [477, 2231], [490, 2231], [490, 2060]], [[503, 2060], [503, 2231], [516, 2231], [516, 2060]], [[569, 2060], [569, 2231], [569, 2231], [569, 2060]], [[621, 2060], [621, 2231], [634, 2231], [634, 2060]], [[647, 2060], [647, 2231], [647, 2231], [647, 2060]], [[673, 2060], [673, 2231], [686, 2231], [686, 2060]], [[712, 2060], [712, 2231], [738, 2231], [738, 2060]], [[803, 2060], [803, 2231], [803, 2231], [803, 2060]], [[842, 2060], [842, 2231], [855, 2231], [855, 2060]], [[894, 2060], [894, 2231], [907, 2231], [907, 2060]], [[946, 2060], [946, 2231], [959, 2231], [959, 2060]], [[972, 2060], [972, 2231], [972, 2231], [972, 2060]], [[1024, 2060], [1024, 2231], [1024, 2231], [1024, 2060]], [[1051, 2060], [1051, 2231], [1064, 2231], [1064, 2060]], [[1077, 2060], [1077, 2231], [1077, 2231], [1077, 2060]], [[1103, 2060], [1103, 2231], [1129, 2231], [1129, 2060]], [[1168, 2060], [1168, 2231], [1181, 2231], [1181, 2060]], [[1220, 2060], [1220, 2231], [1220, 2231], [1220, 2060]], [[1272, 2060], [1272, 2231], [1272, 2231], [1272, 2060]], [[1298, 2060], [1298, 2231], [1311, 2231], [1311, 2060]], [[1350, 2060], [1350, 2231], [1350, 2231], [1350, 2060]], [[1376, 2060], [1376, 2231], [1389, 2231], [1389, 2060]], [[1480, 2060], [1480, 2231], [1480, 2231], [1480, 2060]], [[1520, 2060], [1520, 2231], [1533, 2231], [1533, 2060]], [[1585, 2060], [1585, 2231], [1585, 2231], [1585, 2060]], [[1624, 2060], [1624, 2231], [1624, 2231], [1624, 2060]], [[1650, 2060], [1650, 2231], [1663, 2231], [1663, 2060]], [[1702, 2060], [1702, 2231], [1715, 2231], [1715, 2060]], [[1728, 2060], [1728, 2231], [1754, 2231], [1754, 2060]], [[1767, 2060], [1767, 2231], [1780, 2231], [1780, 2060]], [[1832, 2060], [1832, 2231], [1845, 2231], [1845, 2060]], [[1858, 2060], [1858, 2231], [1871, 2231], [1871, 2060]], [[1884, 2060], [1884, 2231], [1884, 2231], [1884, 2060]], [[1897, 2060], [1897, 2231], [1910, 2231], [1910, 2060]], [[1962, 2060], [1962, 2231], [1962, 2231], [1962, 2060]], [[1989, 2060], [1989, 2231], [2002, 2231], [2002, 2060]], [[2067, 2060], [2067, 2231], [2067, 2231], [2067, 2060]], [[2080, 2060], [2080, 2231], [2080, 2231], [2080, 2060]], [[2106, 2060], [2106, 2231], [2106, 2231], [2106, 2060]], [[2119, 2060], [2119, 2231], [2132, 2231], [2132, 2060]], [[2158, 2060], [2158, 2231], [2158, 2231], [2158, 2060]], [[2184, 2060], [2184, 2231], [2184, 2231], [2184, 2060]], [[2236, 2060], [2236, 2231], [2236, 2231], [2236, 2060]], [[2262, 2060], [2262, 2231], [2275, 2231], [2275, 2060]], [[2314, 2060], [2314, 2231], [2327, 2231], [2327, 2060]], [[2353, 2060], [2353, 2231], [2353, 2231], [2353, 2060]], [[2379, 2060], [2379, 2231], [2392, 2231], [2392, 2060]], [[2431, 2060], [2431, 2231], [2444, 2231], [2444, 2060]], [[2457, 2060], [2457, 2231], [2471, 2231], [2471, 2060]], [[2497, 2060], [2497, 2231], [2497, 2231], [2497, 2060]], [[2549, 2060], [2549, 2231], [2562, 2231], [2562, 2060]], [[2588, 2060], [2588, 2231], [2588, 2231], [2588, 2060]], [[2614, 2060], [2614, 2231], [2627, 2231], [2627, 2060]], [[2679, 2060], [2679, 2231], [2679, 2231], [2679, 2060]], [[2705, 2060], [2705, 2231], [2705, 2231], [2705, 2060]], [[2731, 2060], [2731, 2231], [2744, 2231], [2744, 2060]], [[2848, 2060], [2848, 2231], [2848, 2231], [2848, 2060]], [[2861, 2060], [2861, 2231], [2861, 2231], [2861, 2060]], [[2887, 2060], [2887, 2231], [2887, 2231], [2887, 2060]], [[2913, 2060], [2913, 2231], [2926, 2231], [2926, 2060]], [[2939, 2060], [2939, 2231], [2953, 2231], [2953, 2060]], [[3005, 2060], [3005, 2231], [3005, 2231], [3005, 2060]], [[3018, 2060], [3018, 2231], [3031, 2231], [3031, 2060]], [[3044, 2060], [3044, 2231], [3044, 2231], [3044, 2060]], [[3070, 2060], [3070, 2231], [3083, 2231], [3083, 2060]], [[3096, 2060], [3096, 2231], [3109, 2231], [3109, 2060]], [[3135, 2060], [3135, 2231], [3135, 2231], [3135, 2060]], [[3148, 2060], [3148, 2231], [3148, 2231], [3148, 2060]]], "confidences": [0.9586123824119568, 0.9986465573310852, 0.9566709995269775, 0.9922924041748047, 0.999371349811554, 0.999819815158844, 0.9982818365097046, 0.9999407529830933, 0.9542492032051086, 0.9999266862869263, 0.9977983236312866, 0.9082127213478088, 0.9984015822410583, 0.9999021291732788, 0.9999748468399048, 0.9999212026596069, 0.9956596493721008, 0.9997978806495667, 0.9995704293251038, 0.9999994039535522, 0.9999769926071167, 0.5398281216621399, 0.9999560117721558, 0.9999827146530151, 0.678408682346344, 0.999976634979248, 0.9999359846115112, 0.9980989098548889, 0.9837391376495361, 0.8357751369476318, 0.9999740123748779, 0.9798765182495117, 0.9975171089172363, 0.99134761095047, 0.9869094491004944, 0.8972664475440979, 0.9946538209915161, 0.9883899688720703, 0.9977121353149414, 0.9916154742240906, 0.9904273748397827, 0.9942137598991394, 0.9822350144386292, 0.9995124340057373, 0.6970008015632629, 0.9945922493934631, 0.9990953207015991, 0.9915691018104553, 0.9982545971870422, 0.9470371603965759, 0.9988258481025696, 0.9982693195343018, 0.9856593608856201, 0.9323335886001587, 0.9999984502792358, 0.9984018206596375, 0.9993857145309448, 0.9998714923858643, 0.6906755566596985, 0.9985949397087097, 0.994672954082489, 0.9955617189407349, 0.9956024885177612, 0.9990137815475464, 0.9867492318153381, 0.9986513257026672, 0.9989423155784607, 0.6353587508201599, 0.996551513671875, 0.9758750200271606, 0.8564420342445374, 0.5611870884895325], "line": {"id": "line_12", "bbox": [334, 2060, 3161, 2231], "type": "bbox"}}, {"prediction": "\u0648\u062d\" \u0628\u0631\u0636\u0641 \u0637\u0648\u0633 \u0641\u0644\u0627 \u0647\u0628 \u0649\u0639\u0627\u0633\u0644\u0627 \u0628\u0631\u0636\u0628 \u0645\u062f\u0642\u062a\u0648 \u0629\u064a\u0646\u0633 \u0629\u0632\u064a\u0627\u062c\u0628 \u0639\u0628\u062a\u064a \u0646\u0627 \u0631\u0645\u0654\u0627\u0648\u064b \u0627\u064a\u0639\u0627\u0633", "cuts": [[[354, 2227], [354, 2386], [354, 2386], [354, 2227]], [[393, 2227], [393, 2386], [406, 2386], [406, 2227]], [[459, 2227], [459, 2386], [459, 2386], [459, 2227]], [[472, 2227], [472, 2386], [486, 2386], [486, 2227]], [[551, 2227], [551, 2386], [551, 2386], [551, 2227]], [[617, 2227], [617, 2386], [631, 2386], [631, 2227]], [[670, 2227], [670, 2386], [670, 2386], [670, 2227]], [[710, 2227], [710, 2386], [710, 2386], [710, 2227]], [[736, 2227], [736, 2386], [763, 2386], [763, 2227]], [[815, 2227], [815, 2386], [815, 2386], [815, 2227]], [[881, 2227], [881, 2386], [881, 2386], [881, 2227]], [[921, 2227], [921, 2386], [934, 2386], [934, 2227]], [[961, 2227], [961, 2386], [987, 2386], [987, 2227]], [[1079, 2227], [1079, 2386], [1093, 2386], [1093, 2227]], [[1106, 2227], [1106, 2386], [1119, 2386], [1119, 2227]], [[1132, 2227], [1132, 2386], [1132, 2386], [1132, 2227]], [[1145, 2227], [1145, 2386], [1159, 2386], [1159, 2227]], [[1198, 2227], [1198, 2386], [1198, 2386], [1198, 2227]], [[1225, 2227], [1225, 2386], [1225, 2386], [1225, 2227]], [[1251, 2227], [1251, 2386], [1264, 2386], [1264, 2227]], [[1304, 2227], [1304, 2386], [1304, 2386], [1304, 2227]], [[1330, 2227], [1330, 2386], [1343, 2386], [1343, 2227]], [[1383, 2227], [1383, 2386], [1383, 2386], [1383, 2227]], [[1409, 2227], [1409, 2386], [1423, 2386], [1423, 2227]], [[1449, 2227], [1449, 2386], [1462, 2386], [1462, 2227]], [[1475, 2227], [1475, 2386], [1475, 2386], [1475, 2227]], [[1489, 2227], [1489, 2386], [1502, 2386], [1502, 2227]], [[1581, 2227], [1581, 2386], [1581, 2386], [1581, 2227]], [[1634, 2227], [1634, 2386], [1647, 2386], [1647, 2227]], [[1687, 2227], [1687, 2386], [1687, 2386], [1687, 2227]], [[1726, 2227], [1726, 2386], [1739, 2386], [1739, 2227]], [[1753, 2227], [1753, 2386], [1766, 2386], [1766, 2227]], [[1805, 2227], [1805, 2386], [1819, 2386], [1819, 2227]], [[1871, 2227], [1871, 2386], [1871, 2386], [1871, 2227]], [[1898, 2227], [1898, 2386], [1911, 2386], [1911, 2227]], [[1937, 2227], [1937, 2386], [1937, 2386], [1937, 2227]], [[1990, 2227], [1990, 2386], [1990, 2386], [1990, 2227]], [[2017, 2227], [2017, 2386], [2030, 2386], [2030, 2227]], [[2069, 2227], [2069, 2386], [2069, 2386], [2069, 2227]], [[2096, 2227], [2096, 2386], [2096, 2386], [2096, 2227]], [[2122, 2227], [2122, 2386], [2135, 2386], [2135, 2227]], [[2162, 2227], [2162, 2386], [2175, 2386], [2175, 2227]], [[2201, 2227], [2201, 2386], [2215, 2386], [2215, 2227]], [[2267, 2227], [2267, 2386], [2267, 2386], [2267, 2227]], [[2307, 2227], [2307, 2386], [2307, 2386], [2307, 2227]], [[2333, 2227], [2333, 2386], [2333, 2386], [2333, 2227]], [[2373, 2227], [2373, 2386], [2373, 2386], [2373, 2227]], [[2399, 2227], [2399, 2386], [2413, 2386], [2413, 2227]], [[2426, 2227], [2426, 2386], [2439, 2386], [2439, 2227]], [[2452, 2227], [2452, 2386], [2465, 2386], [2465, 2227]], [[2492, 2227], [2492, 2386], [2505, 2386], [2505, 2227]], [[2545, 2227], [2545, 2386], [2545, 2386], [2545, 2227]], [[2571, 2227], [2571, 2386], [2571, 2386], [2571, 2227]], [[2597, 2227], [2597, 2386], [2597, 2386], [2597, 2227]], [[2624, 2227], [2624, 2386], [2637, 2386], [2637, 2227]], [[2690, 2227], [2690, 2386], [2703, 2386], [2703, 2227]], [[2729, 2227], [2729, 2386], [2729, 2386], [2729, 2227]], [[2756, 2227], [2756, 2386], [2756, 2386], [2756, 2227]], [[2795, 2227], [2795, 2386], [2795, 2386], [2795, 2227]], [[2822, 2227], [2822, 2386], [2835, 2386], [2835, 2227]], [[2861, 2227], [2861, 2386], [2861, 2386], [2861, 2227]], [[2875, 2227], [2875, 2386], [2875, 2386], [2875, 2227]], [[2927, 2227], [2927, 2386], [2927, 2386], [2927, 2227]], [[2941, 2227], [2941, 2386], [2941, 2386], [2941, 2227]], [[2954, 2227], [2954, 2386], [2967, 2386], [2967, 2227]], [[2993, 2227], [2993, 2386], [3006, 2386], [3006, 2227]], [[3033, 2227], [3033, 2386], [3033, 2386], [3033, 2227]], [[3046, 2227], [3046, 2386], [3059, 2386], [3059, 2227]], [[3099, 2227], [3099, 2386], [3099, 2386], [3099, 2227]], [[3138, 2227], [3138, 2386], [3152, 2386], [3152, 2227]]], "confidences": [0.9823002219200134, 0.9972136616706848, 0.9999020099639893, 0.9994245767593384, 0.9984127283096313, 0.9963169097900391, 0.9989890456199646, 0.8085134625434875, 0.9999579191207886, 0.9999361038208008, 0.9942615032196045, 0.9278876185417175, 0.9998903274536133, 0.999955415725708, 0.9999262094497681, 0.9999407529830933, 0.9999767541885376, 0.9984294772148132, 0.8924553990364075, 0.9984814524650574, 0.9999494552612305, 0.9997356534004211, 0.9999189376831055, 0.9939833283424377, 0.9999998807907104, 0.9999184608459473, 0.9999300241470337, 0.573874831199646, 0.9986876845359802, 0.9068862199783325, 0.9941669702529907, 0.999953031539917, 0.997863233089447, 0.7316004037857056, 0.9987077713012695, 0.9907311797142029, 0.9943513870239258, 0.9962025284767151, 0.9970322847366333, 0.9568605422973633, 0.9899909496307373, 0.8733225464820862, 0.9993151426315308, 0.7688072919845581, 0.9994139671325684, 0.9989153146743774, 0.5057005286216736, 0.9989703893661499, 0.9991733431816101, 0.9928190112113953, 0.9984594583511353, 0.7554934024810791, 0.9958826303482056, 0.9795031547546387, 0.9996199607849121, 0.9911338686943054, 0.9956367611885071, 0.9094319939613342, 0.9807215929031372, 0.9925562739372253, 0.8968151211738586, 0.7551785707473755, 0.9919329285621643, 0.9729509353637695, 0.9989374279975891, 0.9944745898246765, 0.9989200830459595, 0.9993528723716736, 0.9896401166915894, 0.9964278340339661], "line": {"id": "line_13", "bbox": [327, 2227, 3165, 2386], "type": "bbox"}}, {"prediction": ". \u0643\u0644\u0630 \u064a\u0641 \u062a\u0627\u0645\u0641 \u0637\u0648\u0633 \u0629\u0627\u0645\u0633\u0645\u062e", "cuts": [[[2264, 2402], [2264, 2531], [2264, 2531], [2264, 2402]], [[2302, 2402], [2302, 2531], [2302, 2531], [2302, 2402]], [[2340, 2402], [2340, 2531], [2353, 2531], [2353, 2402]], [[2391, 2402], [2391, 2531], [2403, 2531], [2403, 2402]], [[2416, 2402], [2416, 2531], [2429, 2531], [2429, 2402]], [[2454, 2402], [2454, 2531], [2467, 2531], [2467, 2402]], [[2492, 2402], [2492, 2531], [2492, 2531], [2492, 2402]], [[2505, 2402], [2505, 2531], [2505, 2531], [2505, 2402]], [[2543, 2402], [2543, 2531], [2543, 2531], [2543, 2402]], [[2594, 2402], [2594, 2531], [2594, 2531], [2594, 2402]], [[2632, 2402], [2632, 2531], [2632, 2531], [2632, 2402]], [[2644, 2402], [2644, 2531], [2657, 2531], [2657, 2402]], [[2695, 2402], [2695, 2531], [2695, 2531], [2695, 2402]], [[2720, 2402], [2720, 2531], [2733, 2531], [2733, 2402]], [[2771, 2402], [2771, 2531], [2771, 2531], [2771, 2402]], [[2847, 2402], [2847, 2531], [2847, 2531], [2847, 2402]], [[2898, 2402], [2898, 2531], [2898, 2531], [2898, 2402]], [[2936, 2402], [2936, 2531], [2936, 2531], [2936, 2402]], [[2961, 2402], [2961, 2531], [2961, 2531], [2961, 2402]], [[3012, 2402], [3012, 2531], [3012, 2531], [3012, 2402]], [[3025, 2402], [3025, 2531], [3037, 2531], [3037, 2402]], [[3075, 2402], [3075, 2531], [3088, 2531], [3088, 2402]], [[3101, 2402], [3101, 2531], [3101, 2531], [3101, 2402]], [[3126, 2402], [3126, 2531], [3139, 2531], [3139, 2402]]], "confidences": [0.9456377625465393, 0.9999704360961914, 0.9999499320983887, 0.9995260238647461, 0.9999178647994995, 0.9999415874481201, 0.9920778870582581, 0.9997991919517517, 0.9995096921920776, 0.999977707862854, 0.8690007925033569, 0.9649189710617065, 0.9999690055847168, 0.9999949932098389, 0.9907584190368652, 0.9840313196182251, 0.9416587948799133, 0.998769223690033, 0.9915293455123901, 0.967819094657898, 0.9989644289016724, 0.9990310668945312, 0.9262909889221191, 0.9966443777084351], "line": {"id": "line_14", "bbox": [2264, 2402, 3164, 2531], "type": "bbox"}}, {"prediction": "\u062d\u0633\u0645 \u064a\u0641 \u0627\u0646\u0628\u0627\u062d\u0654\u0627 \u0646\u064a\u0628 \u0629\u064a\u0627\u0648\u0631\u0644\u0627 \u062a\u0641\u0644\u062a\u062e\u0627 \u0644\u0627\u0642 \u0644\u0636\u0635\u0641\u0644\u0627 \u0646\u0628 \u062f\u0645\u062d \u0646\u0639 \u0644\u064a\u0639\u0627\u0645\u0633\u0627 \u0646\u0628 \u062f\u0645\u0639\u0645 \u0649\u0648\u0631\u0648", "cuts": [[[331, 2564], [331, 2740], [344, 2740], [344, 2564]], [[398, 2564], [398, 2740], [398, 2740], [398, 2564]], [[439, 2564], [439, 2740], [452, 2740], [452, 2564]], [[466, 2564], [466, 2740], [479, 2740], [479, 2564]], [[520, 2564], [520, 2740], [520, 2740], [520, 2564]], [[533, 2564], [533, 2740], [533, 2740], [533, 2564]], [[560, 2564], [560, 2740], [560, 2740], [560, 2564]], [[587, 2564], [587, 2740], [587, 2740], [587, 2564]], [[614, 2564], [614, 2740], [614, 2740], [614, 2564]], [[628, 2564], [628, 2740], [641, 2740], [641, 2564]], [[668, 2564], [668, 2740], [668, 2740], [668, 2564]], [[695, 2564], [695, 2740], [709, 2740], [709, 2564]], [[763, 2564], [763, 2740], [763, 2740], [763, 2564]], [[776, 2564], [776, 2740], [790, 2740], [790, 2564]], [[803, 2564], [803, 2740], [803, 2740], [803, 2564]], [[844, 2564], [844, 2740], [857, 2740], [857, 2564]], [[871, 2564], [871, 2740], [884, 2740], [884, 2564]], [[898, 2564], [898, 2740], [898, 2740], [898, 2564]], [[925, 2564], [925, 2740], [938, 2740], [938, 2564]], [[979, 2564], [979, 2740], [979, 2740], [979, 2564]], [[1006, 2564], [1006, 2740], [1006, 2740], [1006, 2564]], [[1046, 2564], [1046, 2740], [1046, 2740], [1046, 2564]], [[1100, 2564], [1100, 2740], [1100, 2740], [1100, 2564]], [[1141, 2564], [1141, 2740], [1141, 2740], [1141, 2564]], [[1154, 2564], [1154, 2740], [1168, 2740], [1168, 2564]], [[1181, 2564], [1181, 2740], [1181, 2740], [1181, 2564]], [[1195, 2564], [1195, 2740], [1208, 2740], [1208, 2564]], [[1249, 2564], [1249, 2740], [1249, 2740], [1249, 2564]], [[1316, 2564], [1316, 2740], [1316, 2740], [1316, 2564]], [[1343, 2564], [1343, 2740], [1343, 2740], [1343, 2564]], [[1370, 2564], [1370, 2740], [1384, 2740], [1384, 2564]], [[1411, 2564], [1411, 2740], [1424, 2740], [1424, 2564]], [[1465, 2564], [1465, 2740], [1478, 2740], [1478, 2564]], [[1492, 2564], [1492, 2740], [1492, 2740], [1492, 2564]], [[1546, 2564], [1546, 2740], [1559, 2740], [1559, 2564]], [[1573, 2564], [1573, 2740], [1573, 2740], [1573, 2564]], [[1586, 2564], [1586, 2740], [1586, 2740], [1586, 2564]], [[1613, 2564], [1613, 2740], [1627, 2740], [1627, 2564]], [[1667, 2564], [1667, 2740], [1681, 2740], [1681, 2564]], [[1721, 2564], [1721, 2740], [1721, 2740], [1721, 2564]], [[1735, 2564], [1735, 2740], [1735, 2740], [1735, 2564]], [[1775, 2564], [1775, 2740], [1789, 2740], [1789, 2564]], [[1802, 2564], [1802, 2740], [1816, 2740], [1816, 2564]], [[1829, 2564], [1829, 2740], [1829, 2740], [1829, 2564]], [[1843, 2564], [1843, 2740], [1856, 2740], [1856, 2564]], [[1897, 2564], [1897, 2740], [1897, 2740], [1897, 2564]], [[1924, 2564], [1924, 2740], [1924, 2740], [1924, 2564]], [[1951, 2564], [1951, 2740], [1964, 2740], [1964, 2564]], [[2005, 2564], [2005, 2740], [2005, 2740], [2005, 2564]], [[2032, 2564], [2032, 2740], [2045, 2740], [2045, 2564]], [[2059, 2564], [2059, 2740], [2059, 2740], [2059, 2564]], [[2086, 2564], [2086, 2740], [2086, 2740], [2086, 2564]], [[2113, 2564], [2113, 2740], [2113, 2740], [2113, 2564]], [[2153, 2564], [2153, 2740], [2153, 2740], [2153, 2564]], [[2194, 2564], [2194, 2740], [2207, 2740], [2207, 2564]], [[2248, 2564], [2248, 2740], [2248, 2740], [2248, 2564]], [[2275, 2564], [2275, 2740], [2288, 2740], [2288, 2564]], [[2302, 2564], [2302, 2740], [2315, 2740], [2315, 2564]], [[2356, 2564], [2356, 2740], [2356, 2740], [2356, 2564]], [[2369, 2564], [2369, 2740], [2383, 2740], [2383, 2564]], [[2410, 2564], [2410, 2740], [2423, 2740], [2423, 2564]], [[2450, 2564], [2450, 2740], [2450, 2740], [2450, 2564]], [[2464, 2564], [2464, 2740], [2477, 2740], [2477, 2564]], [[2504, 2564], [2504, 2740], [2518, 2740], [2518, 2564]], [[2545, 2564], [2545, 2740], [2545, 2740], [2545, 2564]], [[2572, 2564], [2572, 2740], [2572, 2740], [2572, 2564]], [[2612, 2564], [2612, 2740], [2612, 2740], [2612, 2564]], [[2639, 2564], [2639, 2740], [2653, 2740], [2653, 2564]], [[2666, 2564], [2666, 2740], [2666, 2740], [2666, 2564]], [[2680, 2564], [2680, 2740], [2680, 2740], [2680, 2564]], [[2707, 2564], [2707, 2740], [2720, 2740], [2720, 2564]], [[2761, 2564], [2761, 2740], [2761, 2740], [2761, 2564]], [[2828, 2564], [2828, 2740], [2828, 2740], [2828, 2564]], [[2869, 2564], [2869, 2740], [2882, 2740], [2882, 2564]], [[2923, 2564], [2923, 2740], [2936, 2740], [2936, 2564]]], "confidences": [0.9999998807907104, 0.9929130673408508, 0.9938241243362427, 0.9778679609298706, 0.9086365699768066, 0.654657781124115, 0.9912302494049072, 0.9998319149017334, 0.9415075182914734, 0.9910994172096252, 0.8468749523162842, 0.991156816482544, 0.9946617484092712, 0.9841130375862122, 0.5371823906898499, 0.9606072902679443, 0.9999836683273315, 0.982523500919342, 0.9999951124191284, 0.9997585415840149, 0.9992431402206421, 0.9998185038566589, 0.8639128804206848, 0.999992847442627, 0.9997803568840027, 0.9999289512634277, 0.9999123811721802, 0.8764679431915283, 0.99874347448349, 0.7210342288017273, 0.9998082518577576, 0.9998107552528381, 0.9988790154457092, 0.9528904557228088, 0.9895849823951721, 0.989848792552948, 0.9913495779037476, 0.9971917271614075, 0.9919770359992981, 0.9953035116195679, 0.9654654860496521, 0.956558108329773, 0.968718945980072, 0.9891232848167419, 0.9995982050895691, 0.5353143811225891, 0.9994182586669922, 0.9978064894676208, 0.9980046153068542, 0.9997578263282776, 0.9991948008537292, 0.999717652797699, 0.999285876750946, 0.9232087731361389, 0.9976062774658203, 0.9995843768119812, 0.9938365817070007, 0.998508870601654, 0.8162130117416382, 0.9771808385848999, 0.9998940229415894, 0.9971707463264465, 0.9978471994400024, 0.9858810901641846, 0.938630223274231, 0.9977301955223083, 0.9997122883796692, 0.99797123670578, 0.5294272303581238, 0.9924471378326416, 0.9994334578514099, 0.9998548030853271, 0.999200165271759, 0.9990027546882629, 0.9875484704971313], "line": {"id": "line_15", "bbox": [317, 2564, 2950, 2740], "type": "bbox"}}, {"prediction": "\u0639\u0628\u0627\u0640\u0635\u0654\u0627\u0644\u0627 \u0649\u0644\u0627 \u0646\u064a\u0628\u0639\u0643\u0644\u0627 \u0646\u0645 \u0645\u0654\u0627 \u0646\u064a\u0628\u0639\u0643\u0644\u0627 \u0649\u0644\u0627 \u0639\u0628\u0627\u0635\u0654\u0627\u0644\u0627 \u0646\u0645 \u0648\u0645\u0654\u0627 \u0621\u0648\u0636\u0648\u0644\u0627 \u0641 \u0646\u064a\u0644\u062c\u0631\u0644\u0627", "cuts": [[[335, 2733], [335, 2890], [335, 2890], [335, 2733]], [[396, 2733], [396, 2890], [396, 2890], [396, 2733]], [[442, 2733], [442, 2890], [442, 2890], [442, 2733]], [[488, 2733], [488, 2890], [519, 2890], [519, 2733]], [[611, 2733], [611, 2890], [611, 2890], [611, 2733]], [[657, 2733], [657, 2890], [657, 2890], [657, 2733]], [[673, 2733], [673, 2890], [673, 2890], [673, 2733]], [[688, 2733], [688, 2890], [704, 2890], [704, 2733]], [[719, 2733], [719, 2890], [734, 2890], [734, 2733]], [[750, 2733], [750, 2890], [750, 2890], [750, 2733]], [[796, 2733], [796, 2890], [796, 2890], [796, 2733]], [[811, 2733], [811, 2890], [827, 2890], [827, 2733]], [[842, 2733], [842, 2890], [842, 2890], [842, 2733]], [[857, 2733], [857, 2890], [873, 2890], [873, 2733]], [[904, 2733], [904, 2890], [904, 2890], [904, 2733]], [[934, 2733], [934, 2890], [934, 2890], [934, 2733]], [[965, 2733], [965, 2890], [965, 2890], [965, 2733]], [[996, 2733], [996, 2890], [996, 2890], [996, 2733]], [[1057, 2733], [1057, 2890], [1057, 2890], [1057, 2733]], [[1119, 2733], [1119, 2890], [1134, 2890], [1134, 2733]], [[1150, 2733], [1150, 2890], [1150, 2890], [1150, 2733]], [[1165, 2733], [1165, 2890], [1180, 2890], [1180, 2733]], [[1288, 2733], [1288, 2890], [1303, 2890], [1303, 2733]], [[1380, 2733], [1380, 2890], [1380, 2890], [1380, 2733]], [[1411, 2733], [1411, 2890], [1426, 2890], [1426, 2733]], [[1442, 2733], [1442, 2890], [1457, 2890], [1457, 2733]], [[1473, 2733], [1473, 2890], [1473, 2890], [1473, 2733]], [[1488, 2733], [1488, 2890], [1503, 2890], [1503, 2733]], [[1519, 2733], [1519, 2890], [1534, 2890], [1534, 2733]], [[1565, 2733], [1565, 2890], [1565, 2890], [1565, 2733]], [[1580, 2733], [1580, 2890], [1596, 2890], [1596, 2733]], [[1626, 2733], [1626, 2890], [1626, 2890], [1626, 2733]], [[1657, 2733], [1657, 2890], [1657, 2890], [1657, 2733]], [[1703, 2733], [1703, 2890], [1719, 2890], [1719, 2733]], [[1780, 2733], [1780, 2890], [1780, 2890], [1780, 2733]], [[1796, 2733], [1796, 2890], [1796, 2890], [1796, 2733]], [[1811, 2733], [1811, 2890], [1826, 2890], [1826, 2733]], [[1857, 2733], [1857, 2890], [1872, 2890], [1872, 2733]], [[1888, 2733], [1888, 2890], [1888, 2890], [1888, 2733]], [[1903, 2733], [1903, 2890], [1919, 2890], [1919, 2733]], [[1934, 2733], [1934, 2890], [1934, 2890], [1934, 2733]], [[1965, 2733], [1965, 2890], [1965, 2890], [1965, 2733]], [[2042, 2733], [2042, 2890], [2042, 2890], [2042, 2733]], [[2072, 2733], [2072, 2890], [2072, 2890], [2072, 2733]], [[2118, 2733], [2118, 2890], [2134, 2890], [2134, 2733]], [[2165, 2733], [2165, 2890], [2180, 2890], [2180, 2733]], [[2195, 2733], [2195, 2890], [2195, 2890], [2195, 2733]], [[2211, 2733], [2211, 2890], [2211, 2890], [2211, 2733]], [[2226, 2733], [2226, 2890], [2241, 2890], [2241, 2733]], [[2257, 2733], [2257, 2890], [2272, 2890], [2272, 2733]], [[2318, 2733], [2318, 2890], [2318, 2890], [2318, 2733]], [[2349, 2733], [2349, 2890], [2349, 2890], [2349, 2733]], [[2380, 2733], [2380, 2890], [2395, 2890], [2395, 2733]], [[2426, 2733], [2426, 2890], [2441, 2890], [2441, 2733]], [[2472, 2733], [2472, 2890], [2472, 2890], [2472, 2733]], [[2503, 2733], [2503, 2890], [2503, 2890], [2503, 2733]], [[2518, 2733], [2518, 2890], [2534, 2890], [2534, 2733]], [[2549, 2733], [2549, 2890], [2549, 2890], [2549, 2733]], [[2580, 2733], [2580, 2890], [2580, 2890], [2580, 2733]], [[2626, 2733], [2626, 2890], [2641, 2890], [2641, 2733]], [[2687, 2733], [2687, 2890], [2687, 2890], [2687, 2733]], [[2749, 2733], [2749, 2890], [2749, 2890], [2749, 2733]], [[2780, 2733], [2780, 2890], [2780, 2890], [2780, 2733]], [[2795, 2733], [2795, 2890], [2811, 2890], [2811, 2733]], [[2826, 2733], [2826, 2890], [2826, 2890], [2826, 2733]], [[2872, 2733], [2872, 2890], [2887, 2890], [2887, 2733]], [[2918, 2733], [2918, 2890], [2918, 2890], [2918, 2733]], [[2949, 2733], [2949, 2890], [2949, 2890], [2949, 2733]], [[2980, 2733], [2980, 2890], [2980, 2890], [2980, 2733]], [[3010, 2733], [3010, 2890], [3010, 2890], [3010, 2733]], [[3041, 2733], [3041, 2890], [3041, 2890], [3041, 2733]], [[3103, 2733], [3103, 2890], [3103, 2890], [3103, 2733]], [[3118, 2733], [3118, 2890], [3133, 2890], [3133, 2733]], [[3149, 2733], [3149, 2890], [3149, 2890], [3149, 2733]]], "confidences": [0.9999692440032959, 0.7431797385215759, 0.9892282485961914, 0.9999510049819946, 0.9351767897605896, 0.9993116855621338, 0.9982556700706482, 0.9992502331733704, 0.9992731213569641, 0.9999591112136841, 0.9965296387672424, 0.9999610185623169, 0.9995737671852112, 0.9993835687637329, 0.987348198890686, 0.7714233994483948, 0.9989540576934814, 0.9985584616661072, 0.9998059868812561, 0.9927629828453064, 0.9998949766159058, 0.9996819496154785, 0.9967392086982727, 0.999603807926178, 0.9831695556640625, 0.9224259257316589, 0.9802579283714294, 0.9334492683410645, 0.9981402158737183, 0.9999240636825562, 0.986011266708374, 0.9975579977035522, 0.9953357577323914, 0.9803675413131714, 0.9984625577926636, 0.9977602958679199, 0.9838416576385498, 0.9906837940216064, 0.9881343245506287, 0.9841576814651489, 0.9998107552528381, 0.9991499185562134, 0.9434433579444885, 0.9854111671447754, 0.8520838618278503, 0.9964721202850342, 0.9900435209274292, 0.9503771066665649, 0.9993019104003906, 0.9988412261009216, 0.99639892578125, 0.8105504512786865, 0.9876804351806641, 0.9993699193000793, 0.921359121799469, 0.9604810476303101, 0.995456337928772, 0.9368835687637329, 0.9467335343360901, 0.9949937462806702, 0.999894380569458, 0.9988865256309509, 0.9930035471916199, 0.9975302815437317, 0.9954912066459656, 0.824739933013916, 0.9803107380867004, 0.98244708776474, 0.9932101368904114, 0.9977071285247803, 0.5027340054512024, 0.9766203165054321, 0.9856435060501099, 0.9869322180747986], "line": {"id": "line_16", "bbox": [319, 2733, 3149, 2890], "type": "bbox"}}, {"prediction": "\u062f\u0642 \u0627\u0646\u0628\u0627\u062d\u0635\u0654\u0627 \u0646\u0627 \u0643\u0627\u062f\u0641 \u062a\u0644\u0639\u062c \u0645\u0627\u0644\u0633\u0644\u0627 \u0647\u064a\u0644\u0639 \u0649\u0633\u0648\u0645 \u0646\u0633\u062d\u0644\u0627 \u064a\u0627 \u0649\u0644\u0627 \u0646\u064a\u0637\u0642\u064a \u0646\u0628 \u0649\u0644\u0639 \u0628\u062a\u0643\u0641", "cuts": [[[330, 2903], [330, 3080], [343, 3080], [343, 2903]], [[407, 2903], [407, 3080], [407, 3080], [407, 2903]], [[433, 2903], [433, 3080], [446, 3080], [446, 2903]], [[459, 2903], [459, 3080], [472, 3080], [472, 2903]], [[485, 2903], [485, 3080], [497, 3080], [497, 2903]], [[510, 2903], [510, 3080], [510, 3080], [510, 2903]], [[549, 2903], [549, 3080], [549, 3080], [549, 2903]], [[575, 2903], [575, 3080], [588, 3080], [588, 2903]], [[613, 2903], [613, 3080], [613, 3080], [613, 2903]], [[639, 2903], [639, 3080], [652, 3080], [652, 2903]], [[665, 2903], [665, 3080], [665, 3080], [665, 2903]], [[678, 2903], [678, 3080], [691, 3080], [691, 2903]], [[716, 2903], [716, 3080], [729, 3080], [729, 2903]], [[768, 2903], [768, 3080], [768, 3080], [768, 2903]], [[781, 2903], [781, 3080], [807, 3080], [807, 2903]], [[845, 2903], [845, 3080], [845, 3080], [845, 2903]], [[897, 2903], [897, 3080], [897, 3080], [897, 2903]], [[935, 2903], [935, 3080], [948, 3080], [948, 2903]], [[974, 2903], [974, 3080], [974, 3080], [974, 2903]], [[1000, 2903], [1000, 3080], [1013, 3080], [1013, 2903]], [[1051, 2903], [1051, 3080], [1051, 3080], [1051, 2903]], [[1103, 2903], [1103, 3080], [1116, 3080], [1116, 2903]], [[1142, 2903], [1142, 3080], [1142, 3080], [1142, 2903]], [[1180, 2903], [1180, 3080], [1193, 3080], [1193, 2903]], [[1232, 2903], [1232, 3080], [1245, 3080], [1245, 2903]], [[1283, 2903], [1283, 3080], [1296, 3080], [1296, 2903]], [[1335, 2903], [1335, 3080], [1348, 3080], [1348, 2903]], [[1360, 2903], [1360, 3080], [1373, 3080], [1373, 2903]], [[1412, 2903], [1412, 3080], [1425, 3080], [1425, 2903]], [[1438, 2903], [1438, 3080], [1451, 3080], [1451, 2903]], [[1464, 2903], [1464, 3080], [1464, 3080], [1464, 2903]], [[1476, 2903], [1476, 3080], [1489, 3080], [1489, 2903]], [[1502, 2903], [1502, 3080], [1515, 3080], [1515, 2903]], [[1541, 2903], [1541, 3080], [1554, 3080], [1554, 2903]], [[1567, 2903], [1567, 3080], [1579, 3080], [1579, 2903]], [[1592, 2903], [1592, 3080], [1605, 3080], [1605, 2903]], [[1644, 2903], [1644, 3080], [1657, 3080], [1657, 2903]], [[1708, 2903], [1708, 3080], [1708, 3080], [1708, 2903]], [[1747, 2903], [1747, 3080], [1747, 3080], [1747, 2903]], [[1798, 2903], [1798, 3080], [1811, 3080], [1811, 2903]], [[1837, 2903], [1837, 3080], [1837, 3080], [1837, 2903]], [[1863, 2903], [1863, 3080], [1876, 3080], [1876, 2903]], [[1927, 2903], [1927, 3080], [1927, 3080], [1927, 2903]], [[1966, 2903], [1966, 3080], [1979, 3080], [1979, 2903]], [[2017, 2903], [2017, 3080], [2017, 3080], [2017, 2903]], [[2030, 2903], [2030, 3080], [2043, 3080], [2043, 2903]], [[2069, 2903], [2069, 3080], [2082, 3080], [2082, 2903]], [[2095, 2903], [2095, 3080], [2108, 3080], [2108, 2903]], [[2146, 2903], [2146, 3080], [2146, 3080], [2146, 2903]], [[2198, 2903], [2198, 3080], [2211, 3080], [2211, 2903]], [[2223, 2903], [2223, 3080], [2223, 3080], [2223, 2903]], [[2262, 2903], [2262, 3080], [2262, 3080], [2262, 2903]], [[2275, 2903], [2275, 3080], [2288, 3080], [2288, 2903]], [[2301, 2903], [2301, 3080], [2314, 3080], [2314, 2903]], [[2326, 2903], [2326, 3080], [2339, 3080], [2339, 2903]], [[2365, 2903], [2365, 3080], [2378, 3080], [2378, 2903]], [[2404, 2903], [2404, 3080], [2404, 3080], [2404, 2903]], [[2430, 2903], [2430, 3080], [2430, 3080], [2430, 2903]], [[2494, 2903], [2494, 3080], [2494, 3080], [2494, 2903]], [[2520, 2903], [2520, 3080], [2520, 3080], [2520, 2903]], [[2545, 2903], [2545, 3080], [2558, 3080], [2558, 2903]], [[2623, 2903], [2623, 3080], [2623, 3080], [2623, 2903]], [[2649, 2903], [2649, 3080], [2649, 3080], [2649, 2903]], [[2674, 2903], [2674, 3080], [2687, 3080], [2687, 2903]], [[2752, 2903], [2752, 3080], [2752, 3080], [2752, 2903]], [[2764, 2903], [2764, 3080], [2777, 3080], [2777, 2903]], [[2790, 2903], [2790, 3080], [2803, 3080], [2803, 2903]], [[2829, 2903], [2829, 3080], [2842, 3080], [2842, 2903]], [[2893, 2903], [2893, 3080], [2893, 3080], [2893, 2903]], [[2945, 2903], [2945, 3080], [2945, 3080], [2945, 2903]], [[2983, 2903], [2983, 3080], [2983, 3080], [2983, 2903]], [[3138, 2903], [3138, 3080], [3138, 3080], [3138, 2903]]], "confidences": [0.9998844861984253, 0.7102985382080078, 0.9393450021743774, 0.9997884631156921, 0.999976634979248, 0.9990993738174438, 0.9997594952583313, 0.9806336760520935, 0.9991434812545776, 0.999870777130127, 0.999963641166687, 0.9986358284950256, 0.9997819066047668, 0.9902760982513428, 0.9999171495437622, 0.870272159576416, 0.9959033131599426, 0.9999700784683228, 0.9983206391334534, 0.9999897480010986, 0.9983596205711365, 0.9999958276748657, 0.7078837156295776, 0.9993500113487244, 0.9999644756317139, 0.9912440776824951, 0.9898048639297485, 0.9963675737380981, 0.9999985694885254, 0.9996073842048645, 0.9969272017478943, 0.9999234676361084, 0.9996798038482666, 0.9999964237213135, 0.9991588592529297, 0.9990678429603577, 0.9999243021011353, 0.9791718125343323, 0.8421644568443298, 0.9974477291107178, 0.7698737978935242, 0.9559314250946045, 0.9906162619590759, 0.9658488631248474, 0.9968318343162537, 0.9971415400505066, 0.9973932504653931, 0.99928218126297, 0.9969269633293152, 0.9991139769554138, 0.994012176990509, 0.880149781703949, 0.9992927312850952, 0.9991368651390076, 0.9945836663246155, 0.9022614359855652, 0.9830822944641113, 0.9845501780509949, 0.9880629777908325, 0.9992579817771912, 0.9978712797164917, 0.9982649683952332, 0.996843695640564, 0.9984459280967712, 0.9971120357513428, 0.9952387809753418, 0.9999581575393677, 0.9986611604690552, 0.9999819993972778, 0.9977983832359314, 0.5938760638237, 0.49053633213043213], "line": {"id": "line_17", "bbox": [317, 2903, 3151, 3080], "type": "bbox"}}, {"prediction": "\u0646\u0655\u0627 \u062a\u0644\u0639\u0641 \u0647\u064a\u0644\u0639 \u0649\u0644\u0645\u0639 \u0646\u0648\u0643\u064a \u0627\u0645 \u0643\u0637\u062e\u0628 \u0649\u0644\u0627 \u0628\u062a\u0643\u062a \u0646\u0654\u0627 \u062a\u064a\u0654\u0627\u0631 \u0646\u0627\u0641 \u0646\u064a\u0644\u062c\u0631\u0644\u0627 \u062d\u0633\u0645 \u064a\u0641 \u0627\u0648\u0641\u0644\u062a\u062e\u0627", "cuts": [[[328, 3067], [328, 3246], [342, 3246], [342, 3067]], [[357, 3067], [357, 3246], [357, 3246], [357, 3067]], [[371, 3067], [371, 3246], [386, 3246], [386, 3067]], [[400, 3067], [400, 3246], [400, 3246], [400, 3067]], [[444, 3067], [444, 3246], [444, 3246], [444, 3067]], [[502, 3067], [502, 3246], [502, 3246], [502, 3067]], [[531, 3067], [531, 3246], [531, 3246], [531, 3067]], [[560, 3067], [560, 3246], [560, 3246], [560, 3067]], [[589, 3067], [589, 3246], [589, 3246], [589, 3067]], [[604, 3067], [604, 3246], [618, 3246], [618, 3067]], [[647, 3067], [647, 3246], [647, 3246], [647, 3067]], [[676, 3067], [676, 3246], [676, 3246], [676, 3067]], [[691, 3067], [691, 3246], [705, 3246], [705, 3067]], [[735, 3067], [735, 3246], [749, 3246], [749, 3067]], [[822, 3067], [822, 3246], [822, 3246], [822, 3067]], [[836, 3067], [836, 3246], [836, 3246], [836, 3067]], [[851, 3067], [851, 3246], [851, 3246], [851, 3067]], [[880, 3067], [880, 3246], [880, 3246], [880, 3067]], [[923, 3067], [923, 3246], [938, 3246], [938, 3067]], [[967, 3067], [967, 3246], [967, 3246], [967, 3067]], [[1025, 3067], [1025, 3246], [1025, 3246], [1025, 3067]], [[1054, 3067], [1054, 3246], [1054, 3246], [1054, 3067]], [[1098, 3067], [1098, 3246], [1098, 3246], [1098, 3067]], [[1127, 3067], [1127, 3246], [1141, 3246], [1141, 3067]], [[1170, 3067], [1170, 3246], [1185, 3246], [1185, 3067]], [[1200, 3067], [1200, 3246], [1214, 3246], [1214, 3067]], [[1243, 3067], [1243, 3246], [1243, 3246], [1243, 3067]], [[1301, 3067], [1301, 3246], [1301, 3246], [1301, 3067]], [[1359, 3067], [1359, 3246], [1359, 3246], [1359, 3067]], [[1403, 3067], [1403, 3246], [1403, 3246], [1403, 3067]], [[1432, 3067], [1432, 3246], [1432, 3246], [1432, 3067]], [[1461, 3067], [1461, 3246], [1476, 3246], [1476, 3067]], [[1548, 3067], [1548, 3246], [1548, 3246], [1548, 3067]], [[1563, 3067], [1563, 3246], [1563, 3246], [1563, 3067]], [[1577, 3067], [1577, 3246], [1592, 3246], [1592, 3067]], [[1606, 3067], [1606, 3246], [1621, 3246], [1621, 3067]], [[1665, 3067], [1665, 3246], [1665, 3246], [1665, 3067]], [[1723, 3067], [1723, 3246], [1723, 3246], [1723, 3067]], [[1781, 3067], [1781, 3246], [1781, 3246], [1781, 3067]], [[1839, 3067], [1839, 3246], [1839, 3246], [1839, 3067]], [[1868, 3067], [1868, 3246], [1883, 3246], [1883, 3067]], [[1926, 3067], [1926, 3246], [1941, 3246], [1941, 3067]], [[1970, 3067], [1970, 3246], [1970, 3246], [1970, 3067]], [[1984, 3067], [1984, 3246], [1984, 3246], [1984, 3067]], [[1999, 3067], [1999, 3246], [2013, 3246], [2013, 3067]], [[2057, 3067], [2057, 3246], [2057, 3246], [2057, 3067]], [[2115, 3067], [2115, 3246], [2115, 3246], [2115, 3067]], [[2130, 3067], [2130, 3246], [2144, 3246], [2144, 3067]], [[2159, 3067], [2159, 3246], [2159, 3246], [2159, 3067]], [[2202, 3067], [2202, 3246], [2202, 3246], [2202, 3067]], [[2231, 3067], [2231, 3246], [2231, 3246], [2231, 3067]], [[2260, 3067], [2260, 3246], [2275, 3246], [2275, 3067]], [[2304, 3067], [2304, 3246], [2304, 3246], [2304, 3067]], [[2319, 3067], [2319, 3246], [2319, 3246], [2319, 3067]], [[2348, 3067], [2348, 3246], [2362, 3246], [2362, 3067]], [[2391, 3067], [2391, 3246], [2391, 3246], [2391, 3067]], [[2420, 3067], [2420, 3246], [2420, 3246], [2420, 3067]], [[2449, 3067], [2449, 3246], [2449, 3246], [2449, 3067]], [[2478, 3067], [2478, 3246], [2493, 3246], [2493, 3067]], [[2537, 3067], [2537, 3246], [2551, 3246], [2551, 3067]], [[2566, 3067], [2566, 3246], [2566, 3246], [2566, 3067]], [[2580, 3067], [2580, 3246], [2595, 3246], [2595, 3067]], [[2609, 3067], [2609, 3246], [2624, 3246], [2624, 3067]], [[2653, 3067], [2653, 3246], [2653, 3246], [2653, 3067]], [[2711, 3067], [2711, 3246], [2711, 3246], [2711, 3067]], [[2755, 3067], [2755, 3246], [2755, 3246], [2755, 3067]], [[2769, 3067], [2769, 3246], [2784, 3246], [2784, 3067]], [[2827, 3067], [2827, 3246], [2827, 3246], [2827, 3067]], [[2842, 3067], [2842, 3246], [2842, 3246], [2842, 3067]], [[2871, 3067], [2871, 3246], [2871, 3246], [2871, 3067]], [[2900, 3067], [2900, 3246], [2900, 3246], [2900, 3067]], [[2943, 3067], [2943, 3246], [2958, 3246], [2958, 3067]], [[2987, 3067], [2987, 3246], [3002, 3246], [3002, 3067]], [[3016, 3067], [3016, 3246], [3016, 3246], [3016, 3067]], [[3045, 3067], [3045, 3246], [3045, 3246], [3045, 3067]], [[3089, 3067], [3089, 3246], [3089, 3246], [3089, 3067]], [[3132, 3067], [3132, 3246], [3147, 3246], [3147, 3067]]], "confidences": [0.9998571872711182, 0.9720284938812256, 0.9996850490570068, 0.9983483552932739, 0.9983503818511963, 0.9421389102935791, 0.9757440090179443, 0.9998825788497925, 0.995537281036377, 0.9998735189437866, 0.979082465171814, 0.9991683959960938, 0.8312473297119141, 0.9998272061347961, 0.9998739957809448, 0.9941480159759521, 0.6946954131126404, 0.9902309775352478, 0.99941086769104, 0.9953650236129761, 0.9976621866226196, 0.9999786615371704, 0.6234442591667175, 0.9998052716255188, 0.9999556541442871, 0.9997043013572693, 0.9890322089195251, 0.9971346855163574, 0.9940102100372314, 0.9995328187942505, 0.999966025352478, 0.7640908360481262, 0.4993588328361511, 0.9998918771743774, 0.9999830722808838, 0.9678281545639038, 0.9903719425201416, 0.9858986139297485, 0.6294997930526733, 0.971433699131012, 0.9831180572509766, 0.9937307834625244, 0.9823363423347473, 0.9849645495414734, 0.9930417537689209, 0.9968459010124207, 0.9991890788078308, 0.9997627139091492, 0.9964436888694763, 0.8590208292007446, 0.9995020627975464, 0.9917978048324585, 0.9393941760063171, 0.9994710087776184, 0.9996200799942017, 0.6683350205421448, 0.7901033759117126, 0.9907926917076111, 0.9704153537750244, 0.9975791573524475, 0.999360978603363, 0.9991258978843689, 0.9997497200965881, 0.8905563354492188, 0.9997245669364929, 0.9991188645362854, 0.9998225569725037, 0.9893819093704224, 0.997583270072937, 0.9980733394622803, 0.9992850422859192, 0.9999197721481323, 0.9919565916061401, 0.9748324751853943, 0.8973613381385803, 0.9983094930648804, 0.9631760120391846], "line": {"id": "line_18", "bbox": [313, 3067, 3147, 3246], "type": "bbox"}}, {"prediction": "\u0621\u0648\u0636\u0648\u0644\u0627 \u064a\u0641 \u0641\u0627\u0644\u062a\u062e\u0655\u0627\u0644\u0627 \u0646\u0645 \u062a\u0631\u0643\u0630 \u0627\u0645 \u062a\u0645\u0647\u0641 \u060c \u0639. \u0646\u0633\u062d\u0644\u0627 \u0648\u0628\u0654\u0627 \u0647\u064a\u0644\u0627 \u0628\u062a\u0643\u0642 \u0649\u0644\u0627\u0639\u062a \u0647\u062a\u0627 \u0621\u0627\u0634", "cuts": [[[318, 3226], [318, 3412], [318, 3412], [318, 3226]], [[375, 3226], [375, 3412], [375, 3412], [375, 3226]], [[418, 3226], [418, 3412], [418, 3412], [418, 3226]], [[489, 3226], [489, 3412], [503, 3412], [503, 3226]], [[517, 3226], [517, 3412], [517, 3412], [517, 3226]], [[546, 3226], [546, 3412], [546, 3412], [546, 3226]], [[560, 3226], [560, 3412], [574, 3412], [574, 3226]], [[603, 3226], [603, 3412], [603, 3412], [603, 3226]], [[617, 3226], [617, 3412], [617, 3412], [617, 3226]], [[646, 3226], [646, 3412], [660, 3412], [660, 3226]], [[745, 3226], [745, 3412], [745, 3412], [745, 3226]], [[774, 3226], [774, 3412], [788, 3412], [788, 3226]], [[802, 3226], [802, 3412], [802, 3412], [802, 3226]], [[831, 3226], [831, 3412], [831, 3412], [831, 3226]], [[873, 3226], [873, 3412], [888, 3412], [888, 3226]], [[930, 3226], [930, 3412], [930, 3412], [930, 3226]], [[945, 3226], [945, 3412], [945, 3412], [945, 3226]], [[959, 3226], [959, 3412], [973, 3412], [973, 3226]], [[987, 3226], [987, 3412], [1001, 3412], [1001, 3226]], [[1016, 3226], [1016, 3412], [1030, 3412], [1030, 3226]], [[1101, 3226], [1101, 3412], [1101, 3412], [1101, 3226]], [[1130, 3226], [1130, 3412], [1144, 3412], [1144, 3226]], [[1172, 3226], [1172, 3412], [1172, 3412], [1172, 3226]], [[1215, 3226], [1215, 3412], [1215, 3412], [1215, 3226]], [[1286, 3226], [1286, 3412], [1286, 3412], [1286, 3226]], [[1315, 3226], [1315, 3412], [1315, 3412], [1315, 3226]], [[1386, 3226], [1386, 3412], [1386, 3412], [1386, 3226]], [[1414, 3226], [1414, 3412], [1443, 3412], [1443, 3226]], [[1471, 3226], [1471, 3412], [1471, 3412], [1471, 3226]], [[1500, 3226], [1500, 3412], [1500, 3412], [1500, 3226]], [[1528, 3226], [1528, 3412], [1542, 3412], [1542, 3226]], [[1585, 3226], [1585, 3412], [1585, 3412], [1585, 3226]], [[1642, 3226], [1642, 3412], [1642, 3412], [1642, 3226]], [[1685, 3226], [1685, 3412], [1685, 3412], [1685, 3226]], [[1727, 3226], [1727, 3412], [1727, 3412], [1727, 3226]], [[1756, 3226], [1756, 3412], [1770, 3412], [1770, 3226]], [[1799, 3226], [1799, 3412], [1799, 3412], [1799, 3226]], [[1827, 3226], [1827, 3412], [1827, 3412], [1827, 3226]], [[1870, 3226], [1870, 3412], [1870, 3412], [1870, 3226]], [[1941, 3226], [1941, 3412], [1941, 3412], [1941, 3226]], [[1969, 3226], [1969, 3412], [1984, 3412], [1984, 3226]], [[2026, 3226], [2026, 3412], [2026, 3412], [2026, 3226]], [[2069, 3226], [2069, 3412], [2083, 3412], [2083, 3226]], [[2112, 3226], [2112, 3412], [2112, 3412], [2112, 3226]], [[2126, 3226], [2126, 3412], [2140, 3412], [2140, 3226]], [[2169, 3226], [2169, 3412], [2183, 3412], [2183, 3226]], [[2197, 3226], [2197, 3412], [2211, 3412], [2211, 3226]], [[2240, 3226], [2240, 3412], [2254, 3412], [2254, 3226]], [[2268, 3226], [2268, 3412], [2268, 3412], [2268, 3226]], [[2297, 3226], [2297, 3412], [2297, 3412], [2297, 3226]], [[2311, 3226], [2311, 3412], [2311, 3412], [2311, 3226]], [[2339, 3226], [2339, 3412], [2354, 3412], [2354, 3226]], [[2382, 3226], [2382, 3412], [2382, 3412], [2382, 3226]], [[2411, 3226], [2411, 3412], [2411, 3412], [2411, 3226]], [[2439, 3226], [2439, 3412], [2439, 3412], [2439, 3226]], [[2453, 3226], [2453, 3412], [2468, 3412], [2468, 3226]], [[2482, 3226], [2482, 3412], [2482, 3412], [2482, 3226]], [[2539, 3226], [2539, 3412], [2539, 3412], [2539, 3226]], [[2596, 3226], [2596, 3412], [2596, 3412], [2596, 3226]], [[2638, 3226], [2638, 3412], [2638, 3412], [2638, 3226]], [[2681, 3226], [2681, 3412], [2681, 3412], [2681, 3226]], [[2710, 3226], [2710, 3412], [2724, 3412], [2724, 3226]], [[2766, 3226], [2766, 3412], [2766, 3412], [2766, 3226]], [[2781, 3226], [2781, 3412], [2781, 3412], [2781, 3226]], [[2795, 3226], [2795, 3412], [2809, 3412], [2809, 3226]], [[2823, 3226], [2823, 3412], [2838, 3412], [2838, 3226]], [[2866, 3226], [2866, 3412], [2866, 3412], [2866, 3226]], [[2880, 3226], [2880, 3412], [2895, 3412], [2895, 3226]], [[2923, 3226], [2923, 3412], [2923, 3412], [2923, 3226]], [[2952, 3226], [2952, 3412], [2952, 3412], [2952, 3226]], [[2994, 3226], [2994, 3412], [2994, 3412], [2994, 3226]], [[3008, 3226], [3008, 3412], [3023, 3412], [3023, 3226]], [[3051, 3226], [3051, 3412], [3051, 3412], [3051, 3226]], [[3080, 3226], [3080, 3412], [3094, 3412], [3094, 3226]], [[3137, 3226], [3137, 3412], [3137, 3412], [3137, 3226]]], "confidences": [0.9989814162254333, 0.9999122619628906, 0.9998594522476196, 0.9999371767044067, 0.9949018955230713, 0.8918391466140747, 0.9331813454627991, 0.9998503923416138, 0.999738872051239, 0.9999352693557739, 0.9999396800994873, 0.9997422099113464, 0.9998968839645386, 0.999890923500061, 0.9986469149589539, 0.9979827404022217, 0.9983227849006653, 0.9980936646461487, 0.9998340606689453, 0.9999415874481201, 0.9813975095748901, 0.9996932744979858, 0.9956713914871216, 0.9996687173843384, 0.9994198083877563, 0.732080340385437, 0.840719997882843, 0.9999840259552002, 0.9996098875999451, 0.9923226237297058, 0.9988951086997986, 0.5162858963012695, 0.5562438368797302, 0.799801766872406, 0.9747372269630432, 0.9793431758880615, 0.9933470487594604, 0.9947622418403625, 0.9987406134605408, 0.9820605516433716, 0.9616630673408508, 0.9937961101531982, 0.9977521300315857, 0.996338963508606, 0.9950332641601562, 0.8663762807846069, 0.9994631409645081, 0.9986950755119324, 0.8317818641662598, 0.9994366765022278, 0.9611929655075073, 0.9998297691345215, 0.9822288751602173, 0.9975958466529846, 0.9939688444137573, 0.9993873834609985, 0.998565137386322, 0.9918579459190369, 0.9916180968284607, 0.9998064637184143, 0.8910688161849976, 0.9938943982124329, 0.9996296167373657, 0.9683365821838379, 0.8659057021141052, 0.999840497970581, 0.9998772144317627, 0.9978265166282654, 0.9994264841079712, 0.9970901012420654, 0.9989050626754761, 0.9994168281555176, 0.9968239068984985, 0.9972999691963196, 0.8729744553565979], "line": {"id": "line_19", "bbox": [318, 3226, 3151, 3412], "type": "bbox"}}, {"prediction": "\u0644\u063a\u062a\u0648 \u0627\u0654\u064a\u0627\u0644\u062b \u0643\u0647\u062c\u0648 \u0644\u0633\u063a\u062a\u0648 \u0627\u062b\u0627\u0644\u062b \u0642\u0634\u0646\u062a\u0633\u062a\u0648 \u0627\u0627\u0644\u062b \u0636\u0645\u0636\u0645\u062a \u0646\u0654\u0627 \u0643\u0644\u0630 \u064a\u0641 \u0647\u0628\u0643\u0631\u0645\u0653\u0627 \u0649\u0630\u0644\u0627\u0648", "cuts": [[[340, 3404], [340, 3582], [369, 3582], [369, 3404]], [[398, 3404], [398, 3582], [398, 3582], [398, 3404]], [[441, 3404], [441, 3582], [441, 3582], [441, 3404]], [[484, 3404], [484, 3582], [498, 3582], [498, 3404]], [[513, 3404], [513, 3582], [527, 3582], [527, 3404]], [[556, 3404], [556, 3582], [556, 3582], [556, 3404]], [[570, 3404], [570, 3582], [570, 3582], [570, 3404]], [[585, 3404], [585, 3582], [585, 3582], [585, 3404]], [[613, 3404], [613, 3582], [628, 3582], [628, 3404]], [[642, 3404], [642, 3582], [642, 3582], [642, 3404]], [[671, 3404], [671, 3582], [671, 3582], [671, 3404]], [[700, 3404], [700, 3582], [714, 3582], [714, 3404]], [[757, 3404], [757, 3582], [757, 3582], [757, 3404]], [[800, 3404], [800, 3582], [815, 3582], [815, 3404]], [[844, 3404], [844, 3582], [858, 3582], [858, 3404]], [[930, 3404], [930, 3582], [930, 3582], [930, 3404]], [[959, 3404], [959, 3582], [973, 3582], [973, 3404]], [[1016, 3404], [1016, 3582], [1031, 3582], [1031, 3404]], [[1059, 3404], [1059, 3582], [1074, 3582], [1074, 3404]], [[1117, 3404], [1117, 3582], [1117, 3582], [1117, 3404]], [[1146, 3404], [1146, 3582], [1160, 3582], [1160, 3404]], [[1203, 3404], [1203, 3582], [1203, 3582], [1203, 3404]], [[1232, 3404], [1232, 3582], [1246, 3582], [1246, 3404]], [[1261, 3404], [1261, 3582], [1275, 3582], [1275, 3404]], [[1290, 3404], [1290, 3582], [1290, 3582], [1290, 3404]], [[1318, 3404], [1318, 3582], [1333, 3582], [1333, 3404]], [[1347, 3404], [1347, 3582], [1362, 3582], [1362, 3404]], [[1376, 3404], [1376, 3582], [1390, 3582], [1390, 3404]], [[1405, 3404], [1405, 3582], [1419, 3582], [1419, 3404]], [[1462, 3404], [1462, 3582], [1462, 3582], [1462, 3404]], [[1520, 3404], [1520, 3582], [1520, 3582], [1520, 3404]], [[1549, 3404], [1549, 3582], [1549, 3582], [1549, 3404]], [[1577, 3404], [1577, 3582], [1577, 3582], [1577, 3404]], [[1621, 3404], [1621, 3582], [1635, 3582], [1635, 3404]], [[1664, 3404], [1664, 3582], [1664, 3582], [1664, 3404]], [[1707, 3404], [1707, 3582], [1721, 3582], [1721, 3404]], [[1736, 3404], [1736, 3582], [1764, 3582], [1764, 3404]], [[1779, 3404], [1779, 3582], [1793, 3582], [1793, 3404]], [[1836, 3404], [1836, 3582], [1851, 3582], [1851, 3404]], [[1880, 3404], [1880, 3582], [1880, 3582], [1880, 3404]], [[1908, 3404], [1908, 3582], [1908, 3582], [1908, 3404]], [[1923, 3404], [1923, 3582], [1937, 3582], [1937, 3404]], [[2009, 3404], [2009, 3582], [2009, 3582], [2009, 3404]], [[2067, 3404], [2067, 3582], [2067, 3582], [2067, 3404]], [[2124, 3404], [2124, 3582], [2124, 3582], [2124, 3404]], [[2182, 3404], [2182, 3582], [2182, 3582], [2182, 3404]], [[2211, 3404], [2211, 3582], [2211, 3582], [2211, 3404]], [[2239, 3404], [2239, 3582], [2254, 3582], [2254, 3404]], [[2282, 3404], [2282, 3582], [2282, 3582], [2282, 3404]], [[2311, 3404], [2311, 3582], [2311, 3582], [2311, 3404]], [[2326, 3404], [2326, 3582], [2326, 3582], [2326, 3404]], [[2340, 3404], [2340, 3582], [2354, 3582], [2354, 3404]], [[2398, 3404], [2398, 3582], [2398, 3582], [2398, 3404]], [[2455, 3404], [2455, 3582], [2455, 3582], [2455, 3404]], [[2484, 3404], [2484, 3582], [2484, 3582], [2484, 3404]], [[2513, 3404], [2513, 3582], [2513, 3582], [2513, 3404]], [[2556, 3404], [2556, 3582], [2556, 3582], [2556, 3404]], [[2570, 3404], [2570, 3582], [2570, 3582], [2570, 3404]], [[2599, 3404], [2599, 3582], [2613, 3582], [2613, 3404]], [[2628, 3404], [2628, 3582], [2628, 3582], [2628, 3404]], [[2657, 3404], [2657, 3582], [2657, 3582], [2657, 3404]], [[2714, 3404], [2714, 3582], [2714, 3582], [2714, 3404]], [[2772, 3404], [2772, 3582], [2786, 3582], [2786, 3404]], [[2800, 3404], [2800, 3582], [2815, 3582], [2815, 3404]], [[2858, 3404], [2858, 3582], [2858, 3582], [2858, 3404]], [[2872, 3404], [2872, 3582], [2887, 3582], [2887, 3404]], [[2901, 3404], [2901, 3582], [2916, 3582], [2916, 3404]], [[2988, 3404], [2988, 3582], [2988, 3582], [2988, 3404]], [[3031, 3404], [3031, 3582], [3031, 3582], [3031, 3404]], [[3059, 3404], [3059, 3582], [3074, 3582], [3074, 3404]], [[3088, 3404], [3088, 3582], [3088, 3582], [3088, 3404]], [[3131, 3404], [3131, 3582], [3131, 3582], [3131, 3404]]], "confidences": [0.9967783093452454, 0.9999089241027832, 0.6990695595741272, 0.9999850988388062, 0.9994284510612488, 0.9905351996421814, 0.9979711174964905, 0.9925774931907654, 0.9997119307518005, 0.9998630285263062, 0.9991826415061951, 0.9995831847190857, 0.8739675283432007, 0.9986891150474548, 0.9998999834060669, 0.712096631526947, 0.9542328119277954, 0.9998071789741516, 0.9994687438011169, 0.9119349718093872, 0.9997267127037048, 0.9990538954734802, 0.9999830722808838, 0.9995676875114441, 0.9998180270195007, 0.9542503952980042, 0.9904987215995789, 0.9882673621177673, 0.9979777932167053, 0.9933269023895264, 0.9998037219047546, 0.9610075354576111, 0.9995414018630981, 0.9869469404220581, 0.9698469638824463, 0.9878268837928772, 0.9939728379249573, 0.8041937947273254, 0.9983476400375366, 0.792262077331543, 0.9819558262825012, 0.9396706223487854, 0.997104823589325, 0.9705645442008972, 0.9958399534225464, 0.9978986978530884, 0.8801516890525818, 0.9995551705360413, 0.9966424703598022, 0.9960938096046448, 0.9987300038337708, 0.9998194575309753, 0.563930094242096, 0.9453648328781128, 0.9340890049934387, 0.5644081830978394, 0.9911462664604187, 0.9987581968307495, 0.8091545701026917, 0.9992177486419678, 0.9971036314964294, 0.999757707118988, 0.999749481678009, 0.9985652565956116, 0.9988590478897095, 0.9889073371887207, 0.9370191693305969, 0.9869567155838013, 0.5738163590431213, 0.9979482293128967, 0.9877589344978333, 0.9431320428848267], "line": {"id": "line_20", "bbox": [311, 3404, 3146, 3582], "type": "bbox"}}, {"prediction": "\u0631\u0647\u0627\u0638 \u062d\u0633\u0645\u062a\u0648 \u0647\u0644\u0643 \u0643\u0633\u0654\u0627\u0631 \u062d\u0633\u0645\u062a\u0648 \u0646\u064a\u0642\u0641\u0631\u0645\u0644\u0627 \u0649\u0644\u0627 \u0643\u0639\u0628\u0627\u0635\u0654\u0627 \u0646\u0645 \u0643\u062f\u064a \u0644\u0633\u063a\u062a\u0648 \u0643\u062a\u064a\u062d\u0644 \u0631\u0639\u0634", "cuts": [[[321, 3580], [321, 3731], [335, 3731], [335, 3580]], [[363, 3580], [363, 3731], [363, 3731], [363, 3580]], [[405, 3580], [405, 3731], [405, 3731], [405, 3580]], [[434, 3580], [434, 3731], [434, 3731], [434, 3580]], [[476, 3580], [476, 3731], [504, 3731], [504, 3580]], [[546, 3580], [546, 3731], [560, 3731], [560, 3580]], [[616, 3580], [616, 3731], [616, 3731], [616, 3580]], [[644, 3580], [644, 3731], [658, 3731], [658, 3580]], [[672, 3580], [672, 3731], [672, 3731], [672, 3580]], [[729, 3580], [729, 3731], [729, 3731], [729, 3580]], [[757, 3580], [757, 3731], [771, 3731], [771, 3580]], [[785, 3580], [785, 3731], [799, 3731], [799, 3580]], [[813, 3580], [813, 3731], [827, 3731], [827, 3580]], [[841, 3580], [841, 3731], [841, 3731], [841, 3580]], [[883, 3580], [883, 3731], [883, 3731], [883, 3580]], [[925, 3580], [925, 3731], [925, 3731], [925, 3580]], [[995, 3580], [995, 3731], [1010, 3731], [1010, 3580]], [[1024, 3580], [1024, 3731], [1038, 3731], [1038, 3580]], [[1052, 3580], [1052, 3731], [1052, 3731], [1052, 3580]], [[1094, 3580], [1094, 3731], [1094, 3731], [1094, 3580]], [[1122, 3580], [1122, 3731], [1136, 3731], [1136, 3580]], [[1178, 3580], [1178, 3731], [1178, 3731], [1178, 3580]], [[1234, 3580], [1234, 3731], [1248, 3731], [1248, 3580]], [[1262, 3580], [1262, 3731], [1276, 3731], [1276, 3580]], [[1291, 3580], [1291, 3731], [1305, 3731], [1305, 3580]], [[1347, 3580], [1347, 3731], [1361, 3731], [1361, 3580]], [[1375, 3580], [1375, 3731], [1389, 3731], [1389, 3580]], [[1417, 3580], [1417, 3731], [1431, 3731], [1431, 3580]], [[1445, 3580], [1445, 3731], [1459, 3731], [1459, 3580]], [[1501, 3580], [1501, 3731], [1501, 3731], [1501, 3580]], [[1529, 3580], [1529, 3731], [1529, 3731], [1529, 3580]], [[1571, 3580], [1571, 3731], [1586, 3731], [1586, 3580]], [[1600, 3580], [1600, 3731], [1600, 3731], [1600, 3580]], [[1614, 3580], [1614, 3731], [1628, 3731], [1628, 3580]], [[1642, 3580], [1642, 3731], [1642, 3731], [1642, 3580]], [[1656, 3580], [1656, 3731], [1670, 3731], [1670, 3580]], [[1712, 3580], [1712, 3731], [1712, 3731], [1712, 3580]], [[1726, 3580], [1726, 3731], [1726, 3731], [1726, 3580]], [[1754, 3580], [1754, 3731], [1754, 3731], [1754, 3580]], [[1768, 3580], [1768, 3731], [1782, 3731], [1782, 3580]], [[1824, 3580], [1824, 3731], [1824, 3731], [1824, 3580]], [[1881, 3580], [1881, 3731], [1881, 3731], [1881, 3580]], [[1909, 3580], [1909, 3731], [1923, 3731], [1923, 3580]], [[1951, 3580], [1951, 3731], [1951, 3731], [1951, 3580]], [[2007, 3580], [2007, 3731], [2007, 3731], [2007, 3580]], [[2035, 3580], [2035, 3731], [2049, 3731], [2049, 3580]], [[2063, 3580], [2063, 3731], [2063, 3731], [2063, 3580]], [[2077, 3580], [2077, 3731], [2091, 3731], [2091, 3580]], [[2232, 3580], [2232, 3731], [2232, 3731], [2232, 3580]], [[2316, 3580], [2316, 3731], [2330, 3731], [2330, 3580]], [[2358, 3580], [2358, 3731], [2358, 3731], [2358, 3580]], [[2400, 3580], [2400, 3731], [2400, 3731], [2400, 3580]], [[2457, 3580], [2457, 3731], [2457, 3731], [2457, 3580]], [[2485, 3580], [2485, 3731], [2485, 3731], [2485, 3580]], [[2513, 3580], [2513, 3731], [2527, 3731], [2527, 3580]], [[2569, 3580], [2569, 3731], [2569, 3731], [2569, 3580]], [[2611, 3580], [2611, 3731], [2625, 3731], [2625, 3580]], [[2653, 3580], [2653, 3731], [2653, 3731], [2653, 3580]], [[2695, 3580], [2695, 3731], [2695, 3731], [2695, 3580]], [[2737, 3580], [2737, 3731], [2752, 3731], [2752, 3580]], [[2766, 3580], [2766, 3731], [2780, 3731], [2780, 3580]], [[2822, 3580], [2822, 3731], [2822, 3731], [2822, 3580]], [[2878, 3580], [2878, 3731], [2878, 3731], [2878, 3580]], [[2906, 3580], [2906, 3731], [2920, 3731], [2920, 3580]], [[2948, 3580], [2948, 3731], [2948, 3731], [2948, 3580]], [[2962, 3580], [2962, 3731], [2962, 3731], [2962, 3580]], [[3004, 3580], [3004, 3731], [3004, 3731], [3004, 3580]], [[3032, 3580], [3032, 3731], [3047, 3731], [3047, 3580]], [[3075, 3580], [3075, 3731], [3075, 3731], [3075, 3580]], [[3131, 3580], [3131, 3731], [3131, 3731], [3131, 3580]]], "confidences": [0.998375415802002, 0.7084844708442688, 0.9999047517776489, 0.9999986886978149, 0.9975200295448303, 0.9999372959136963, 0.9996757507324219, 0.9996148347854614, 0.9969292283058167, 0.9986764788627625, 0.9608417749404907, 0.9995263814926147, 0.9976219534873962, 0.9999587535858154, 0.9711738228797913, 0.9985242486000061, 0.8398705720901489, 0.9996516704559326, 0.9961230158805847, 0.9993791580200195, 0.9999798536300659, 0.9998527765274048, 0.9999849796295166, 0.9962425231933594, 0.9955328702926636, 0.9989853501319885, 0.999942421913147, 0.9898174405097961, 0.9999264478683472, 0.999687910079956, 0.9997530579566956, 0.9998797178268433, 0.9882998466491699, 0.9634631872177124, 0.999843955039978, 0.9989407658576965, 0.9994811415672302, 0.9873757362365723, 0.996773898601532, 0.9990653395652771, 0.9880833029747009, 0.9579822421073914, 0.9963617920875549, 0.968079149723053, 0.9967735409736633, 0.9786046743392944, 0.6416178941726685, 0.9990584254264832, 0.99955815076828, 0.9967063069343567, 0.998286783695221, 0.6909951567649841, 0.7128172516822815, 0.9613966941833496, 0.9996551275253296, 0.9983021020889282, 0.999221682548523, 0.9992075562477112, 0.9989655017852783, 0.9996083378791809, 0.9999632835388184, 0.936977207660675, 0.9235370755195618, 0.9997147917747498, 0.667002260684967, 0.9975676536560059, 0.9907772541046143, 0.9969243407249451, 0.9055776000022888, 0.7779210209846497], "line": {"id": "line_21", "bbox": [307, 3580, 3145, 3731], "type": "bbox"}}, {"prediction": "\u0644\u0635\u0648 \u0627\u0644\u0641 \u0647\u0631\u064a\u063a \u0649\u0644\u0627 \u0643\u0644\u0630 \u0641\u0644\u0627\u062e \u0627\u0644\u0648 \u0627\u0645\u062b\u0627\u0644\u062b \u0646\u064a\u0628\u0639\u0643\u0644\u0627 \u0649\u0644\u0627 \u0643\u064a\u0644\u062c\u0631 \u0644\u0633\u063a\u062a\u0648\u0627\u0645\u0647\u0646\u0637\u0627\u0628\u0648 \u0643\u064a\u0646\u0630\u0627", "cuts": [[[361, 3744], [361, 3918], [375, 3918], [375, 3744]], [[417, 3744], [417, 3918], [417, 3918], [417, 3744]], [[487, 3744], [487, 3918], [487, 3918], [487, 3744]], [[515, 3744], [515, 3918], [529, 3918], [529, 3744]], [[543, 3744], [543, 3918], [557, 3918], [557, 3744]], [[585, 3744], [585, 3918], [599, 3918], [599, 3744]], [[613, 3744], [613, 3918], [613, 3918], [613, 3744]], [[641, 3744], [641, 3918], [655, 3918], [655, 3744]], [[683, 3744], [683, 3918], [683, 3918], [683, 3744]], [[739, 3744], [739, 3918], [739, 3918], [739, 3744]], [[753, 3744], [753, 3918], [767, 3918], [767, 3744]], [[795, 3744], [795, 3918], [795, 3918], [795, 3744]], [[837, 3744], [837, 3918], [837, 3918], [837, 3744]], [[879, 3744], [879, 3918], [879, 3918], [879, 3744]], [[893, 3744], [893, 3918], [907, 3918], [907, 3744]], [[921, 3744], [921, 3918], [921, 3918], [921, 3744]], [[935, 3744], [935, 3918], [963, 3918], [963, 3744]], [[1019, 3744], [1019, 3918], [1019, 3918], [1019, 3744]], [[1075, 3744], [1075, 3918], [1075, 3918], [1075, 3744]], [[1103, 3744], [1103, 3918], [1103, 3918], [1103, 3744]], [[1131, 3744], [1131, 3918], [1145, 3918], [1145, 3744]], [[1215, 3744], [1215, 3918], [1229, 3918], [1229, 3744]], [[1243, 3744], [1243, 3918], [1257, 3918], [1257, 3744]], [[1271, 3744], [1271, 3918], [1285, 3918], [1285, 3744]], [[1299, 3744], [1299, 3918], [1313, 3918], [1313, 3744]], [[1383, 3744], [1383, 3918], [1397, 3918], [1397, 3744]], [[1411, 3744], [1411, 3918], [1439, 3918], [1439, 3744]], [[1453, 3744], [1453, 3918], [1467, 3918], [1467, 3744]], [[1509, 3744], [1509, 3918], [1509, 3918], [1509, 3744]], [[1537, 3744], [1537, 3918], [1537, 3918], [1537, 3744]], [[1551, 3744], [1551, 3918], [1551, 3918], [1551, 3744]], [[1565, 3744], [1565, 3918], [1565, 3918], [1565, 3744]], [[1579, 3744], [1579, 3918], [1579, 3918], [1579, 3744]], [[1607, 3744], [1607, 3918], [1621, 3918], [1621, 3744]], [[1635, 3744], [1635, 3918], [1649, 3918], [1649, 3744]], [[1663, 3744], [1663, 3918], [1663, 3918], [1663, 3744]], [[1691, 3744], [1691, 3918], [1719, 3918], [1719, 3744]], [[1747, 3744], [1747, 3918], [1761, 3918], [1761, 3744]], [[1775, 3744], [1775, 3918], [1789, 3918], [1789, 3744]], [[1803, 3744], [1803, 3918], [1817, 3918], [1817, 3744]], [[1845, 3744], [1845, 3918], [1845, 3918], [1845, 3744]], [[1873, 3744], [1873, 3918], [1873, 3918], [1873, 3744]], [[1943, 3744], [1943, 3918], [1957, 3918], [1957, 3744]], [[1971, 3744], [1971, 3918], [1971, 3918], [1971, 3744]], [[1985, 3744], [1985, 3918], [1999, 3918], [1999, 3744]], [[2041, 3744], [2041, 3918], [2041, 3918], [2041, 3744]], [[2055, 3744], [2055, 3918], [2055, 3918], [2055, 3744]], [[2083, 3744], [2083, 3918], [2083, 3918], [2083, 3744]], [[2097, 3744], [2097, 3918], [2111, 3918], [2111, 3744]], [[2153, 3744], [2153, 3918], [2153, 3918], [2153, 3744]], [[2209, 3744], [2209, 3918], [2209, 3918], [2209, 3744]], [[2237, 3744], [2237, 3918], [2237, 3918], [2237, 3744]], [[2265, 3744], [2265, 3918], [2279, 3918], [2279, 3744]], [[2335, 3744], [2335, 3918], [2349, 3918], [2349, 3744]], [[2363, 3744], [2363, 3918], [2377, 3918], [2377, 3744]], [[2419, 3744], [2419, 3918], [2433, 3918], [2433, 3744]], [[2475, 3744], [2475, 3918], [2475, 3918], [2475, 3744]], [[2517, 3744], [2517, 3918], [2517, 3918], [2517, 3744]], [[2545, 3744], [2545, 3918], [2545, 3918], [2545, 3744]], [[2601, 3744], [2601, 3918], [2601, 3918], [2601, 3744]], [[2643, 3744], [2643, 3918], [2643, 3918], [2643, 3744]], [[2657, 3744], [2657, 3918], [2671, 3918], [2671, 3744]], [[2699, 3744], [2699, 3918], [2713, 3918], [2713, 3744]], [[2741, 3744], [2741, 3918], [2741, 3918], [2741, 3744]], [[2769, 3744], [2769, 3918], [2769, 3918], [2769, 3744]], [[2811, 3744], [2811, 3918], [2825, 3918], [2825, 3744]], [[2839, 3744], [2839, 3918], [2839, 3918], [2839, 3744]], [[2881, 3744], [2881, 3918], [2895, 3918], [2895, 3744]], [[2923, 3744], [2923, 3918], [2923, 3918], [2923, 3744]], [[2965, 3744], [2965, 3918], [2979, 3918], [2979, 3744]], [[3021, 3744], [3021, 3918], [3035, 3918], [3035, 3744]], [[3049, 3744], [3049, 3918], [3049, 3918], [3049, 3744]], [[3077, 3744], [3077, 3918], [3091, 3918], [3091, 3744]], [[3119, 3744], [3119, 3918], [3133, 3918], [3133, 3744]]], "confidences": [0.9999858140945435, 0.9996674060821533, 0.9778488278388977, 0.999860405921936, 0.9980079531669617, 0.9999980926513672, 0.9997289776802063, 0.9999096393585205, 0.9999042749404907, 0.9987836480140686, 0.999509334564209, 0.8447310328483582, 0.9997413754463196, 0.9830690622329712, 0.9998390674591064, 0.8895362615585327, 0.9999918937683105, 0.9990143775939941, 0.9999878406524658, 0.9991787075996399, 0.9999074935913086, 0.999941349029541, 0.9998675584793091, 0.9998282194137573, 0.99846351146698, 0.9999916553497314, 0.9999760389328003, 0.9508774876594543, 0.9997891783714294, 0.9323558807373047, 0.9861510396003723, 0.9936410784721375, 0.9994382262229919, 0.9971796274185181, 0.9985735416412354, 0.9859241843223572, 0.9663385152816772, 0.9317023158073425, 0.9961659908294678, 0.9577418565750122, 0.9928492307662964, 0.9323335886001587, 0.9990610480308533, 0.9972244501113892, 0.9995347261428833, 0.9952410459518433, 0.9984773993492126, 0.999396800994873, 0.9987291693687439, 0.8243120908737183, 0.9955060482025146, 0.7022139430046082, 0.9865391850471497, 0.9992412328720093, 0.9976450800895691, 0.9810840487480164, 0.9991329312324524, 0.9990897178649902, 0.9992324113845825, 0.998461127281189, 0.9994111061096191, 0.9990944862365723, 0.9991432428359985, 0.9482150077819824, 0.9927623867988586, 0.9994828701019287, 0.953675389289856, 0.9985700845718384, 0.9993718266487122, 0.94927978515625, 0.9973020553588867, 0.9952284097671509, 0.9812739491462708, 0.9950826168060303], "line": {"id": "line_22", "bbox": [333, 3744, 3133, 3918], "type": "bbox"}}, {"prediction": "\u0649\u0627\u0644\u0648\u0645\u0644\u0627\u0642 \u0645\u062b \u0647\u0641\u0627\u0644\u062e \u0649\u0644\u0639 \u0629\u0628\u0627\u0635\u0639\u0644\u0627 \u0639\u0645\u062c\u0654\u0627 \u0627\u0645 \u0647\u064a\u0641 \u0647\u0644 \u0645\u0633\u0631 \u0645 \u0628\u062c\u0639\u062a \u0646\u064a\u0637\u0642\u064a \u0646\u0628 \u0649\u0644\u0639 \u0649\u0644\u0627 \u0628\u0646\u0627\u062a\u0643\u0644\u0627", "cuts": [[[374, 3912], [374, 4081], [374, 4081], [374, 3912]], [[416, 3912], [416, 4081], [430, 4081], [430, 3912]], [[444, 3912], [444, 4081], [458, 4081], [458, 3912]], [[486, 3912], [486, 4081], [500, 4081], [500, 3912]], [[528, 3912], [528, 4081], [528, 4081], [528, 3912]], [[598, 3912], [598, 4081], [598, 4081], [598, 3912]], [[612, 3912], [612, 4081], [612, 4081], [612, 3912]], [[641, 3912], [641, 4081], [641, 4081], [641, 3912]], [[669, 3912], [669, 4081], [683, 4081], [683, 3912]], [[697, 3912], [697, 4081], [711, 4081], [711, 3912]], [[739, 3912], [739, 4081], [739, 4081], [739, 3912]], [[767, 3912], [767, 4081], [767, 4081], [767, 3912]], [[781, 3912], [781, 4081], [795, 4081], [795, 3912]], [[823, 3912], [823, 4081], [823, 4081], [823, 3912]], [[851, 3912], [851, 4081], [865, 4081], [865, 3912]], [[879, 3912], [879, 4081], [893, 4081], [893, 3912]], [[921, 3912], [921, 4081], [935, 4081], [935, 3912]], [[963, 3912], [963, 4081], [977, 4081], [977, 3912]], [[1019, 3912], [1019, 4081], [1019, 4081], [1019, 3912]], [[1033, 3912], [1033, 4081], [1033, 4081], [1033, 3912]], [[1047, 3912], [1047, 4081], [1061, 4081], [1061, 3912]], [[1089, 3912], [1089, 4081], [1103, 4081], [1103, 3912]], [[1117, 3912], [1117, 4081], [1117, 4081], [1117, 3912]], [[1145, 3912], [1145, 4081], [1145, 4081], [1145, 3912]], [[1173, 3912], [1173, 4081], [1187, 4081], [1187, 3912]], [[1229, 3912], [1229, 4081], [1229, 4081], [1229, 3912]], [[1271, 3912], [1271, 4081], [1285, 4081], [1285, 3912]], [[1313, 3912], [1313, 4081], [1313, 4081], [1313, 3912]], [[1327, 3912], [1327, 4081], [1327, 4081], [1327, 3912]], [[1341, 3912], [1341, 4081], [1356, 4081], [1356, 3912]], [[1370, 3912], [1370, 4081], [1384, 4081], [1384, 3912]], [[1412, 3912], [1412, 4081], [1426, 4081], [1426, 3912]], [[1440, 3912], [1440, 4081], [1454, 4081], [1454, 3912]], [[1482, 3912], [1482, 4081], [1482, 4081], [1482, 3912]], [[1496, 3912], [1496, 4081], [1496, 4081], [1496, 3912]], [[1524, 3912], [1524, 4081], [1524, 4081], [1524, 3912]], [[1538, 3912], [1538, 4081], [1538, 4081], [1538, 3912]], [[1594, 3912], [1594, 4081], [1608, 4081], [1608, 3912]], [[1636, 3912], [1636, 4081], [1650, 4081], [1650, 3912]], [[1664, 3912], [1664, 4081], [1664, 4081], [1664, 3912]], [[1692, 3912], [1692, 4081], [1692, 4081], [1692, 3912]], [[1720, 3912], [1720, 4081], [1720, 4081], [1720, 3912]], [[1748, 3912], [1748, 4081], [1762, 4081], [1762, 3912]], [[1776, 3912], [1776, 4081], [1776, 4081], [1776, 3912]], [[1804, 3912], [1804, 4081], [1818, 4081], [1818, 3912]], [[1832, 3912], [1832, 4081], [1832, 4081], [1832, 3912]], [[1846, 3912], [1846, 4081], [1860, 4081], [1860, 3912]], [[1916, 3912], [1916, 4081], [1916, 4081], [1916, 3912]], [[1972, 3912], [1972, 4081], [1972, 4081], [1972, 3912]], [[1986, 3912], [1986, 4081], [2000, 4081], [2000, 3912]], [[2042, 3912], [2042, 4081], [2042, 4081], [2042, 3912]], [[2084, 3912], [2084, 4081], [2099, 4081], [2099, 3912]], [[2141, 3912], [2141, 4081], [2141, 4081], [2141, 3912]], [[2197, 3912], [2197, 4081], [2211, 4081], [2211, 3912]], [[2253, 3912], [2253, 4081], [2253, 4081], [2253, 3912]], [[2281, 3912], [2281, 4081], [2281, 4081], [2281, 3912]], [[2309, 3912], [2309, 4081], [2323, 4081], [2323, 3912]], [[2351, 3912], [2351, 4081], [2365, 4081], [2365, 3912]], [[2379, 3912], [2379, 4081], [2379, 4081], [2379, 3912]], [[2407, 3912], [2407, 4081], [2421, 4081], [2421, 3912]], [[2463, 3912], [2463, 4081], [2477, 4081], [2477, 3912]], [[2491, 3912], [2491, 4081], [2505, 4081], [2505, 3912]], [[2519, 3912], [2519, 4081], [2519, 4081], [2519, 3912]], [[2547, 3912], [2547, 4081], [2561, 4081], [2561, 3912]], [[2575, 3912], [2575, 4081], [2575, 4081], [2575, 3912]], [[2603, 3912], [2603, 4081], [2617, 4081], [2617, 3912]], [[2687, 3912], [2687, 4081], [2687, 4081], [2687, 3912]], [[2701, 3912], [2701, 4081], [2701, 4081], [2701, 3912]], [[2715, 3912], [2715, 4081], [2729, 4081], [2729, 3912]], [[2771, 3912], [2771, 4081], [2771, 4081], [2771, 3912]], [[2813, 3912], [2813, 4081], [2813, 4081], [2813, 3912]], [[2828, 3912], [2828, 4081], [2842, 4081], [2842, 3912]], [[2856, 3912], [2856, 4081], [2856, 4081], [2856, 3912]], [[2870, 3912], [2870, 4081], [2870, 4081], [2870, 3912]], [[2912, 3912], [2912, 4081], [2912, 4081], [2912, 3912]], [[2926, 3912], [2926, 4081], [2926, 4081], [2926, 3912]], [[2954, 3912], [2954, 4081], [2954, 4081], [2954, 3912]], [[2982, 3912], [2982, 4081], [2982, 4081], [2982, 3912]], [[3024, 3912], [3024, 4081], [3024, 4081], [3024, 3912]], [[3108, 3912], [3108, 4081], [3108, 4081], [3108, 3912]], [[3122, 3912], [3122, 4081], [3136, 4081], [3136, 3912]]], "confidences": [0.991776704788208, 0.9966753721237183, 0.9947142004966736, 0.9186890721321106, 0.9635366797447205, 0.9986220598220825, 0.9777283668518066, 0.9586911797523499, 0.9998502731323242, 0.9988514184951782, 0.9999862909317017, 0.46282950043678284, 0.973861575126648, 0.42882752418518066, 0.9648494124412537, 0.9557760953903198, 0.9976227879524231, 0.5231557488441467, 0.7373040914535522, 0.997160792350769, 0.9977774024009705, 0.9998714923858643, 0.9994800686836243, 0.5984565019607544, 0.9999616146087646, 0.953172504901886, 0.9998903274536133, 0.5577518939971924, 0.6261033415794373, 0.9999628067016602, 0.9987449645996094, 0.9979907274246216, 0.9999592304229736, 0.9994562268257141, 0.776331901550293, 0.9890751838684082, 0.9983356595039368, 0.986653745174408, 0.9932841062545776, 0.9770086407661438, 0.8269332051277161, 0.9864249229431152, 0.9786643981933594, 0.9915361404418945, 0.9968346953392029, 0.9864396452903748, 0.9924086332321167, 0.998105525970459, 0.9923842549324036, 0.9835927486419678, 0.9957876801490784, 0.9960395097732544, 0.9908498525619507, 0.9995176792144775, 0.9677330255508423, 0.9952746629714966, 0.9993299245834351, 0.998761773109436, 0.9985032081604004, 0.9977524876594543, 0.9977297186851501, 0.9998428821563721, 0.9996432065963745, 0.9972556233406067, 0.8950211405754089, 0.982606828212738, 0.9643605351448059, 0.9769435524940491, 0.9995658993721008, 0.9992498755455017, 0.7895783185958862, 0.9948700666427612, 0.8788118362426758, 0.9814590215682983, 0.9998113512992859, 0.8790767788887024, 0.7014104723930359, 0.7737085819244385, 0.9973267316818237, 0.9496884942054749, 0.9877499938011169], "line": {"id": "line_23", "bbox": [304, 3912, 3136, 4081], "type": "bbox"}}, {"prediction": "\u0647\u064a\u0644\u0639 \u0627\u0645 \u0641\u0644\u0627\u062e\u064a\u0648 \u062f\u062d\u0644\u0627 \u0627\u0630\u0647 \u0649\u0644\u0639 \u0647\u0648\u0636\u0648 \u064a\u0641 \u0644\u0645\u0639\u064a \u0646\u0627\u0643\u0641 \u0647\u0631\u0645\u0654\u0627 \u0644\u062b\u062a\u0645 \u0627\u0646\u0654\u0627\u0648 \u0644\u0627\u0642 \u0627\u0645\u0628 \u0645\u0644\u0639\u0654\u0627", "cuts": [[[305, 4078], [305, 4239], [305, 4239], [305, 4078]], [[348, 4078], [348, 4239], [348, 4239], [348, 4078]], [[362, 4078], [362, 4239], [376, 4239], [376, 4078]], [[390, 4078], [390, 4239], [404, 4239], [404, 4078]], [[447, 4078], [447, 4239], [447, 4239], [447, 4078]], [[461, 4078], [461, 4239], [475, 4239], [475, 4078]], [[489, 4078], [489, 4239], [489, 4239], [489, 4078]], [[518, 4078], [518, 4239], [532, 4239], [532, 4078]], [[617, 4078], [617, 4239], [617, 4239], [617, 4078]], [[645, 4078], [645, 4239], [645, 4239], [645, 4078]], [[659, 4078], [659, 4239], [674, 4239], [674, 4078]], [[702, 4078], [702, 4239], [702, 4239], [702, 4078]], [[730, 4078], [730, 4239], [744, 4239], [744, 4078]], [[787, 4078], [787, 4239], [801, 4239], [801, 4078]], [[815, 4078], [815, 4239], [830, 4239], [830, 4078]], [[872, 4078], [872, 4239], [872, 4239], [872, 4078]], [[900, 4078], [900, 4239], [900, 4239], [900, 4078]], [[915, 4078], [915, 4239], [929, 4239], [929, 4078]], [[957, 4078], [957, 4239], [971, 4239], [971, 4078]], [[985, 4078], [985, 4239], [1000, 4239], [1000, 4078]], [[1028, 4078], [1028, 4239], [1042, 4239], [1042, 4078]], [[1085, 4078], [1085, 4239], [1085, 4239], [1085, 4078]], [[1113, 4078], [1113, 4239], [1113, 4239], [1113, 4078]], [[1156, 4078], [1156, 4239], [1170, 4239], [1170, 4078]], [[1198, 4078], [1198, 4239], [1198, 4239], [1198, 4078]], [[1212, 4078], [1212, 4239], [1212, 4239], [1212, 4078]], [[1241, 4078], [1241, 4239], [1241, 4239], [1241, 4078]], [[1283, 4078], [1283, 4239], [1297, 4239], [1297, 4078]], [[1311, 4078], [1311, 4239], [1311, 4239], [1311, 4078]], [[1397, 4078], [1397, 4239], [1397, 4239], [1397, 4078]], [[1439, 4078], [1439, 4239], [1453, 4239], [1453, 4078]], [[1524, 4078], [1524, 4239], [1524, 4239], [1524, 4078]], [[1552, 4078], [1552, 4239], [1552, 4239], [1552, 4078]], [[1595, 4078], [1595, 4239], [1595, 4239], [1595, 4078]], [[1609, 4078], [1609, 4239], [1609, 4239], [1609, 4078]], [[1638, 4078], [1638, 4239], [1652, 4239], [1652, 4078]], [[1694, 4078], [1694, 4239], [1694, 4239], [1694, 4078]], [[1723, 4078], [1723, 4239], [1723, 4239], [1723, 4078]], [[1765, 4078], [1765, 4239], [1765, 4239], [1765, 4078]], [[1793, 4078], [1793, 4239], [1793, 4239], [1793, 4078]], [[1822, 4078], [1822, 4239], [1836, 4239], [1836, 4078]], [[1978, 4078], [1978, 4239], [1978, 4239], [1978, 4078]], [[2049, 4078], [2049, 4239], [2063, 4239], [2063, 4078]], [[2077, 4078], [2077, 4239], [2077, 4239], [2077, 4078]], [[2120, 4078], [2120, 4239], [2120, 4239], [2120, 4078]], [[2148, 4078], [2148, 4239], [2162, 4239], [2162, 4078]], [[2205, 4078], [2205, 4239], [2205, 4239], [2205, 4078]], [[2247, 4078], [2247, 4239], [2261, 4239], [2261, 4078]], [[2290, 4078], [2290, 4239], [2290, 4239], [2290, 4078]], [[2304, 4078], [2304, 4239], [2318, 4239], [2318, 4078]], [[2332, 4078], [2332, 4239], [2332, 4239], [2332, 4078]], [[2346, 4078], [2346, 4239], [2361, 4239], [2361, 4078]], [[2403, 4078], [2403, 4239], [2417, 4239], [2417, 4078]], [[2431, 4078], [2431, 4239], [2446, 4239], [2446, 4078]], [[2474, 4078], [2474, 4239], [2474, 4239], [2474, 4078]], [[2488, 4078], [2488, 4239], [2502, 4239], [2502, 4078]], [[2531, 4078], [2531, 4239], [2531, 4239], [2531, 4078]], [[2545, 4078], [2545, 4239], [2559, 4239], [2559, 4078]], [[2573, 4078], [2573, 4239], [2573, 4239], [2573, 4078]], [[2601, 4078], [2601, 4239], [2601, 4239], [2601, 4078]], [[2616, 4078], [2616, 4239], [2616, 4239], [2616, 4078]], [[2672, 4078], [2672, 4239], [2672, 4239], [2672, 4078]], [[2701, 4078], [2701, 4239], [2701, 4239], [2701, 4078]], [[2757, 4078], [2757, 4239], [2757, 4239], [2757, 4078]], [[2772, 4078], [2772, 4239], [2772, 4239], [2772, 4078]], [[2786, 4078], [2786, 4239], [2786, 4239], [2786, 4078]], [[2814, 4078], [2814, 4239], [2842, 4239], [2842, 4078]], [[2871, 4078], [2871, 4239], [2871, 4239], [2871, 4078]], [[2928, 4078], [2928, 4239], [2942, 4239], [2942, 4078]], [[2970, 4078], [2970, 4239], [2970, 4239], [2970, 4078]], [[2984, 4078], [2984, 4239], [2998, 4239], [2998, 4078]], [[3013, 4078], [3013, 4239], [3027, 4239], [3027, 4078]], [[3041, 4078], [3041, 4239], [3041, 4239], [3041, 4078]], [[3055, 4078], [3055, 4239], [3069, 4239], [3069, 4078]], [[3098, 4078], [3098, 4239], [3098, 4239], [3098, 4078]], [[3112, 4078], [3112, 4239], [3112, 4239], [3112, 4078]]], "confidences": [0.7411984801292419, 0.6705909371376038, 0.9994827508926392, 0.9999536275863647, 0.9637630581855774, 0.990339457988739, 0.9970928430557251, 0.9842832088470459, 0.9999134540557861, 0.8257625699043274, 0.9998522996902466, 0.9860520362854004, 0.8672003149986267, 0.999895453453064, 0.9987590312957764, 0.6380735635757446, 0.9966011047363281, 0.9999879598617554, 0.9917520880699158, 0.9998186230659485, 0.9985596537590027, 0.9999741315841675, 0.9970946311950684, 0.9999897480010986, 0.9996445178985596, 0.9999563694000244, 0.9980692267417908, 0.9994539618492126, 0.5508994460105896, 0.9075180888175964, 0.6853848099708557, 0.8571422696113586, 0.7955424189567566, 0.8907495737075806, 0.9879714846611023, 0.9994396567344666, 0.848770260810852, 0.9981479644775391, 0.909099280834198, 0.9869056344032288, 0.9833765625953674, 0.9991958737373352, 0.9672496318817139, 0.9993138313293457, 0.5518977046012878, 0.8995003700256348, 0.9811897277832031, 0.9994994401931763, 0.9018236994743347, 0.9840490818023682, 0.9967617392539978, 0.9858490228652954, 0.7903525233268738, 0.996831476688385, 0.9998800754547119, 0.9991426467895508, 0.9994601607322693, 0.9994288086891174, 0.9615521430969238, 0.8211493492126465, 0.9944064617156982, 0.9838215112686157, 0.9928451180458069, 0.9992262125015259, 0.9864301681518555, 0.980707585811615, 0.9878180027008057, 0.7048366665840149, 0.9973539113998413, 0.8788666129112244, 0.9915334582328796, 0.9992111921310425, 0.9873242378234863, 0.9851594567298889, 0.5106502771377563, 0.9952054023742676], "line": {"id": "line_24", "bbox": [305, 4078, 3126, 4239], "type": "bbox"}}, {"prediction": "\u062f\u064a\u0634\u0631\u0644\u0627 \u0649\u0644\u0627 \u0646\u064a\u0637\u0642\u064a \u0646\u0628 \u0649\u0644\u0639! \u064a\u0645\u0639\u0633\u0648 \u0645\u0627\u0644\u0633\u0644\u0627 \u0647\u064a\u0644\u0639 \u0646\u0633\u062d\u0644\u0627 \u064a\u0628\u0654\u0627 \u0645\u0627\u0644 \u0627\u0644\u0627\u062b\u062a\u0645\u0655\u0627 \u0629\u0640\u0639\u064a\u0634\u0644\u0627 \u0639\u064a\u0645\u062c", "cuts": [[[316, 4249], [316, 4413], [331, 4413], [331, 4249]], [[359, 4249], [359, 4413], [359, 4413], [359, 4249]], [[402, 4249], [402, 4413], [402, 4413], [402, 4249]], [[444, 4249], [444, 4413], [444, 4413], [444, 4249]], [[459, 4249], [459, 4413], [473, 4413], [473, 4249]], [[487, 4249], [487, 4413], [501, 4413], [501, 4249]], [[515, 4249], [515, 4413], [530, 4413], [530, 4249]], [[587, 4249], [587, 4413], [587, 4413], [587, 4249]], [[601, 4249], [601, 4413], [601, 4413], [601, 4249]], [[629, 4249], [629, 4413], [629, 4413], [629, 4249]], [[643, 4249], [643, 4413], [658, 4413], [658, 4249]], [[686, 4249], [686, 4413], [700, 4413], [700, 4249]], [[715, 4249], [715, 4413], [715, 4413], [715, 4249]], [[743, 4249], [743, 4413], [757, 4413], [757, 4249]], [[800, 4249], [800, 4413], [814, 4413], [814, 4249]], [[828, 4249], [828, 4413], [843, 4413], [843, 4249]], [[857, 4249], [857, 4413], [871, 4413], [871, 4249]], [[914, 4249], [914, 4413], [914, 4413], [914, 4249]], [[942, 4249], [942, 4413], [942, 4413], [942, 4249]], [[971, 4249], [971, 4413], [985, 4413], [985, 4249]], [[1070, 4249], [1070, 4413], [1070, 4413], [1070, 4249]], [[1084, 4249], [1084, 4413], [1084, 4413], [1084, 4249]], [[1113, 4249], [1113, 4413], [1113, 4413], [1113, 4249]], [[1141, 4249], [1141, 4413], [1141, 4413], [1141, 4249]], [[1155, 4249], [1155, 4413], [1184, 4413], [1184, 4249]], [[1212, 4249], [1212, 4413], [1226, 4413], [1226, 4249]], [[1255, 4249], [1255, 4413], [1255, 4413], [1255, 4249]], [[1269, 4249], [1269, 4413], [1269, 4413], [1269, 4249]], [[1312, 4249], [1312, 4413], [1326, 4413], [1326, 4249]], [[1369, 4249], [1369, 4413], [1383, 4413], [1383, 4249]], [[1397, 4249], [1397, 4413], [1411, 4413], [1411, 4249]], [[1426, 4249], [1426, 4413], [1440, 4413], [1440, 4249]], [[1482, 4249], [1482, 4413], [1482, 4413], [1482, 4249]], [[1497, 4249], [1497, 4413], [1511, 4413], [1511, 4249]], [[1553, 4249], [1553, 4413], [1553, 4413], [1553, 4249]], [[1582, 4249], [1582, 4413], [1582, 4413], [1582, 4249]], [[1596, 4249], [1596, 4413], [1610, 4413], [1610, 4249]], [[1625, 4249], [1625, 4413], [1639, 4413], [1639, 4249]], [[1653, 4249], [1653, 4413], [1653, 4413], [1653, 4249]], [[1681, 4249], [1681, 4413], [1681, 4413], [1681, 4249]], [[1710, 4249], [1710, 4413], [1710, 4413], [1710, 4249]], [[1738, 4249], [1738, 4413], [1738, 4413], [1738, 4249]], [[1781, 4249], [1781, 4413], [1795, 4413], [1795, 4249]], [[1824, 4249], [1824, 4413], [1824, 4413], [1824, 4249]], [[1866, 4249], [1866, 4413], [1895, 4413], [1895, 4249]], [[1923, 4249], [1923, 4413], [1923, 4413], [1923, 4249]], [[1937, 4249], [1937, 4413], [1952, 4413], [1952, 4249]], [[1980, 4249], [1980, 4413], [1994, 4413], [1994, 4249]], [[2008, 4249], [2008, 4413], [2023, 4413], [2023, 4249]], [[2065, 4249], [2065, 4413], [2065, 4413], [2065, 4249]], [[2080, 4249], [2080, 4413], [2080, 4413], [2080, 4249]], [[2108, 4249], [2108, 4413], [2108, 4413], [2108, 4249]], [[2122, 4249], [2122, 4413], [2122, 4413], [2122, 4249]], [[2136, 4249], [2136, 4413], [2151, 4413], [2151, 4249]], [[2222, 4249], [2222, 4413], [2236, 4413], [2236, 4249]], [[2264, 4249], [2264, 4413], [2279, 4413], [2279, 4249]], [[2293, 4249], [2293, 4413], [2307, 4413], [2307, 4249]], [[2321, 4249], [2321, 4413], [2336, 4413], [2336, 4249]], [[2378, 4249], [2378, 4413], [2378, 4413], [2378, 4249]], [[2407, 4249], [2407, 4413], [2407, 4413], [2407, 4249]], [[2435, 4249], [2435, 4413], [2435, 4413], [2435, 4249]], [[2463, 4249], [2463, 4413], [2463, 4413], [2463, 4249]], [[2492, 4249], [2492, 4413], [2492, 4413], [2492, 4249]], [[2520, 4249], [2520, 4413], [2520, 4413], [2520, 4249]], [[2549, 4249], [2549, 4413], [2549, 4413], [2549, 4249]], [[2563, 4249], [2563, 4413], [2563, 4413], [2563, 4249]], [[2577, 4249], [2577, 4413], [2591, 4413], [2591, 4249]], [[2606, 4249], [2606, 4413], [2606, 4413], [2606, 4249]], [[2663, 4249], [2663, 4413], [2677, 4413], [2677, 4249]], [[2762, 4249], [2762, 4413], [2762, 4413], [2762, 4249]], [[2805, 4249], [2805, 4413], [2805, 4413], [2805, 4249]], [[2847, 4249], [2847, 4413], [2847, 4413], [2847, 4249]], [[2876, 4249], [2876, 4413], [2876, 4413], [2876, 4249]], [[2890, 4249], [2890, 4413], [2904, 4413], [2904, 4249]], [[2919, 4249], [2919, 4413], [2933, 4413], [2933, 4249]], [[2975, 4249], [2975, 4413], [2990, 4413], [2990, 4249]], [[3061, 4249], [3061, 4413], [3061, 4413], [3061, 4249]], [[3089, 4249], [3089, 4413], [3089, 4413], [3089, 4249]], [[3103, 4249], [3103, 4413], [3103, 4413], [3103, 4249]]], "confidences": [0.9999558925628662, 0.9997685551643372, 0.9997368454933167, 0.9977124929428101, 0.999941349029541, 0.9980744123458862, 0.9950352907180786, 0.9224417805671692, 0.8580173254013062, 0.9524855613708496, 0.9989435076713562, 0.9999842643737793, 0.9986186027526855, 0.9998856782913208, 0.9995737671852112, 0.9912926554679871, 0.9999467134475708, 0.9999945163726807, 0.9995242357254028, 0.9999788999557495, 0.9609777331352234, 0.9153129458427429, 0.9045202136039734, 0.9997207522392273, 0.9395636916160583, 0.9894552826881409, 0.9998144507408142, 0.9997990727424622, 0.9999853372573853, 0.9999799728393555, 1.0, 0.9706733822822571, 0.9758889675140381, 0.9932337403297424, 0.8476508259773254, 0.9795082807540894, 0.9796251058578491, 0.9970026612281799, 0.4895252287387848, 0.5919338464736938, 0.9867957830429077, 0.7614318132400513, 0.9896360039710999, 0.9846451878547668, 0.9974541068077087, 0.5357677340507507, 0.9974640607833862, 0.9990847110748291, 0.9961497783660889, 0.9180766940116882, 0.8193199634552002, 0.9990463852882385, 0.9899054169654846, 0.9957371950149536, 0.9989354014396667, 0.9109645485877991, 0.9999076128005981, 0.999586284160614, 0.7132347226142883, 0.9970788955688477, 0.9983876943588257, 0.6264116764068604, 0.9988951086997986, 0.9250513315200806, 0.8208836913108826, 0.8228710293769836, 0.9901149272918701, 0.997815728187561, 0.9998468160629272, 0.9990491271018982, 0.9956784844398499, 0.7115011811256409, 0.9978455305099487, 0.9982227683067322, 0.9991169571876526, 0.9916975498199463, 0.9556155204772949, 0.9978026747703552, 0.9827321171760559], "line": {"id": "line_25", "bbox": [302, 4249, 3132, 4413], "type": "bbox"}}, {"prediction": ".\u0649\u0644\u0639 \u064a\u0641 \u0644\u0648\u0642\u0644\u0627 \u0649\u062f\u0646\u0639 \u0631\u062b\u0643 \u062f\u0642 \u0647\u062a\u0635\u0627\u062e \u0636\u0639\u0628\u0627 \u062f\u064a\u0634\u0631\u0644\u0627 \u0644\u0627\u0642\u0641 \u0643\u0644 \u0641\u0627\u0627\u062e\u0645 \u064a\u0636\u0641\u0627\u0631 \u0647\u0627 \u0647\u0644 \u0644\u064a\u0642\u0648", "cuts": [[[297, 4427], [297, 4585], [297, 4585], [297, 4427]], [[350, 4427], [350, 4585], [350, 4585], [350, 4427]], [[363, 4427], [363, 4585], [376, 4585], [376, 4427]], [[389, 4427], [389, 4585], [389, 4585], [389, 4427]], [[429, 4427], [429, 4585], [442, 4585], [442, 4427]], [[468, 4427], [468, 4585], [468, 4585], [468, 4427]], [[481, 4427], [481, 4585], [481, 4585], [481, 4427]], [[508, 4427], [508, 4585], [534, 4585], [534, 4427]], [[587, 4427], [587, 4585], [600, 4585], [600, 4427]], [[626, 4427], [626, 4585], [639, 4585], [639, 4427]], [[679, 4427], [679, 4585], [679, 4585], [679, 4427]], [[705, 4427], [705, 4585], [705, 4585], [705, 4427]], [[718, 4427], [718, 4585], [718, 4585], [718, 4427]], [[732, 4427], [732, 4585], [745, 4585], [745, 4427]], [[797, 4427], [797, 4585], [797, 4585], [797, 4427]], [[850, 4427], [850, 4585], [863, 4585], [863, 4427]], [[890, 4427], [890, 4585], [890, 4585], [890, 4427]], [[916, 4427], [916, 4585], [916, 4585], [916, 4427]], [[955, 4427], [955, 4585], [969, 4585], [969, 4427]], [[995, 4427], [995, 4585], [1008, 4585], [1008, 4427]], [[1021, 4427], [1021, 4585], [1021, 4585], [1021, 4427]], [[1048, 4427], [1048, 4585], [1061, 4585], [1061, 4427]], [[1219, 4427], [1219, 4585], [1219, 4585], [1219, 4427]], [[1245, 4427], [1245, 4585], [1258, 4585], [1258, 4427]], [[1285, 4427], [1285, 4585], [1285, 4585], [1285, 4427]], [[1311, 4427], [1311, 4585], [1324, 4585], [1324, 4427]], [[1337, 4427], [1337, 4585], [1337, 4585], [1337, 4427]], [[1364, 4427], [1364, 4585], [1364, 4585], [1364, 4427]], [[1416, 4427], [1416, 4585], [1429, 4585], [1429, 4427]], [[1456, 4427], [1456, 4585], [1469, 4585], [1469, 4427]], [[1495, 4427], [1495, 4585], [1495, 4585], [1495, 4427]], [[1535, 4427], [1535, 4585], [1548, 4585], [1548, 4427]], [[1614, 4427], [1614, 4585], [1614, 4585], [1614, 4427]], [[1666, 4427], [1666, 4585], [1666, 4585], [1666, 4427]], [[1693, 4427], [1693, 4585], [1706, 4585], [1706, 4427]], [[1732, 4427], [1732, 4585], [1732, 4585], [1732, 4427]], [[1745, 4427], [1745, 4585], [1759, 4585], [1759, 4427]], [[1798, 4427], [1798, 4585], [1798, 4585], [1798, 4427]], [[1824, 4427], [1824, 4585], [1824, 4585], [1824, 4427]], [[1877, 4427], [1877, 4585], [1877, 4585], [1877, 4427]], [[1917, 4427], [1917, 4585], [1930, 4585], [1930, 4427]], [[1943, 4427], [1943, 4585], [1943, 4585], [1943, 4427]], [[1969, 4427], [1969, 4585], [1969, 4585], [1969, 4427]], [[1982, 4427], [1982, 4585], [1996, 4585], [1996, 4427]], [[2048, 4427], [2048, 4585], [2048, 4585], [2048, 4427]], [[2075, 4427], [2075, 4585], [2075, 4585], [2075, 4427]], [[2101, 4427], [2101, 4585], [2114, 4585], [2114, 4427]], [[2140, 4427], [2140, 4585], [2140, 4585], [2140, 4427]], [[2154, 4427], [2154, 4585], [2167, 4585], [2167, 4427]], [[2206, 4427], [2206, 4585], [2219, 4585], [2219, 4427]], [[2272, 4427], [2272, 4585], [2272, 4585], [2272, 4427]], [[2285, 4427], [2285, 4585], [2298, 4585], [2298, 4427]], [[2364, 4427], [2364, 4585], [2377, 4585], [2377, 4427]], [[2404, 4427], [2404, 4585], [2404, 4585], [2404, 4427]], [[2430, 4427], [2430, 4585], [2430, 4585], [2430, 4427]], [[2456, 4427], [2456, 4585], [2456, 4585], [2456, 4427]], [[2470, 4427], [2470, 4585], [2483, 4585], [2483, 4427]], [[2509, 4427], [2509, 4585], [2522, 4585], [2522, 4427]], [[2562, 4427], [2562, 4585], [2562, 4585], [2562, 4427]], [[2601, 4427], [2601, 4585], [2601, 4585], [2601, 4427]], [[2654, 4427], [2654, 4585], [2654, 4585], [2654, 4427]], [[2680, 4427], [2680, 4585], [2680, 4585], [2680, 4427]], [[2720, 4427], [2720, 4585], [2733, 4585], [2733, 4427]], [[2759, 4427], [2759, 4585], [2759, 4585], [2759, 4427]], [[2786, 4427], [2786, 4585], [2786, 4585], [2786, 4427]], [[2838, 4427], [2838, 4585], [2851, 4585], [2851, 4427]], [[2865, 4427], [2865, 4585], [2865, 4585], [2865, 4427]], [[2891, 4427], [2891, 4585], [2891, 4585], [2891, 4427]], [[2917, 4427], [2917, 4585], [2930, 4585], [2930, 4427]], [[2944, 4427], [2944, 4585], [2957, 4585], [2957, 4427]], [[2996, 4427], [2996, 4585], [2996, 4585], [2996, 4427]], [[3023, 4427], [3023, 4585], [3023, 4585], [3023, 4427]], [[3049, 4427], [3049, 4585], [3049, 4585], [3049, 4427]], [[3102, 4427], [3102, 4585], [3102, 4585], [3102, 4427]]], "confidences": [0.8309170007705688, 0.9710848927497864, 0.9978118538856506, 0.9952423572540283, 0.9998619556427002, 0.9853734970092773, 0.9041633605957031, 0.9999642372131348, 0.9992184638977051, 0.987206757068634, 0.9999744892120361, 0.9998753070831299, 0.9998530149459839, 0.9993923902511597, 0.9804210662841797, 0.9999669790267944, 0.9681344628334045, 0.7007457613945007, 0.9999014139175415, 0.9938947558403015, 0.9991243481636047, 0.9994795918464661, 0.9906601309776306, 0.9998043179512024, 0.9999531507492065, 0.9996731281280518, 0.9904140830039978, 0.8484129309654236, 0.9998654127120972, 0.9998722076416016, 0.884601891040802, 0.9997289776802063, 0.5172210335731506, 0.9777674078941345, 0.9999169111251831, 0.49916383624076843, 0.9641693830490112, 0.9937703013420105, 0.7306916117668152, 0.9957754015922546, 0.9984592199325562, 0.943457841873169, 0.6241721510887146, 0.9954598546028137, 0.9971427321434021, 0.8888192176818848, 0.9960846900939941, 0.9893342852592468, 0.9664679169654846, 0.9914203882217407, 0.9974316954612732, 0.9991137385368347, 0.9997954964637756, 0.9750413298606873, 0.9770325422286987, 0.9967040419578552, 0.9981144666671753, 0.9363402724266052, 0.9950194358825684, 0.8760650753974915, 0.9999531507492065, 0.9947760105133057, 0.99937504529953, 0.9894686341285706, 0.9319698810577393, 0.9841182231903076, 0.998865008354187, 0.9998772144317627, 0.9999456405639648, 0.9940637946128845, 0.8951064348220825, 0.9981452226638794, 0.9989315867424011, 0.9663097262382507], "line": {"id": "line_26", "bbox": [297, 4427, 3128, 4585], "type": "bbox"}}] \ No newline at end of file From 306866371227a885c3e1a080d446a20b0e015397 Mon Sep 17 00:00:00 2001 From: Benjamin Kiessling Date: Wed, 6 Mar 2024 15:59:10 +0100 Subject: [PATCH 06/76] Use container class ProcessingSteps in CLI driver --- kraken/blla.py | 21 +++------------ kraken/kraken.py | 68 +++++++++++++++++++++++++++--------------------- 2 files changed, 43 insertions(+), 46 deletions(-) diff --git a/kraken/blla.py b/kraken/blla.py index 3d0e961f4..d78ee55af 100644 --- a/kraken/blla.py +++ b/kraken/blla.py @@ -274,23 +274,10 @@ def segment(im: PIL.Image.Image, autocast: Runs the model with automatic mixed precision Returns: - A :class:`kraken.containers.Segmentation` class containing reading order - sorted baselines (polylines) and their respective polygonal boundaries - as :class:`kraken.containers.BaselineLine` records. - The format of the line and region records is shown below. The last and - first point of each boundary polygon are connected. - - .. code-block:: - :force: - - 'lines': [ - {'baseline': [[x0, y0], [x1, y1], ..., [x_n, y_n]], 'boundary': [[x0, y0], [x1, y1], ... [x_m, y_m]]}, - {'baseline': [[x0, ...]], 'boundary': [[x0, ...]]} - ] - 'regions': [ - {'region': [[x0, y0], [x1, y1], ..., [x_n, y_n]], 'type': 'image'}, - {'region': [[x0, ...]], 'type': 'text'} - ] + A :class:`kraken.containers.Segmentation` class containing reading + order sorted baselines (polylines) and their respective polygonal + boundaries as :class:`kraken.containers.BaselineLine` records. The + last and first point of each boundary polygon are connected. Raises: KrakenInvalidModelException: if the given model is not a valid diff --git a/kraken/kraken.py b/kraken/kraken.py index fc5d65faa..a24a683c6 100644 --- a/kraken/kraken.py +++ b/kraken/kraken.py @@ -349,6 +349,7 @@ def process_pipeline(subcommands, input, batch_input, suffix, verbose, format_ty from threadpoolctl import threadpool_limits + from kraken.containers import ProcessingStep from kraken.lib.progress import KrakenProgressBar ctx = click.get_current_context() @@ -399,7 +400,10 @@ def process_pipeline(subcommands, input, batch_input, suffix, verbose, format_ty progress.update(pdf_parse_task, total=num_pages) logger.warning(f'{fpath} is not a PDF file. Skipping.') input = new_input - ctx.meta['steps'].insert(0, {'category': 'preprocessing', 'description': 'PDF image extraction', 'settings': {}}) + ctx.meta['steps'].insert(0, ProcessingStep(id=uuid.uuid4(), + category='preprocessing', + description='PDF image extraction', + settings={})) for io_pair in input: ctx.meta['first_process'] = True @@ -444,16 +448,18 @@ def binarize(ctx, threshold, zoom, escale, border, perc, range, low, high): """ Binarizes page images. """ - ctx.meta['steps'].append({'category': 'preprocessing', - 'description': 'Image binarization', - 'settings': {'threshold': threshold, - 'zoom': zoom, - 'escale': escale, - 'border': border, - 'perc': perc, - 'range': range, - 'low': low, - 'high': high}}) + from kraken.containers import ProcessingStep + + ctx.meta['steps'].append(ProcessingStep(category='preprocessing', + description='Image binarization', + settings={'threshold': threshold, + 'zoom': zoom, + 'escale': escale, + 'border': border, + 'perc': perc, + 'range': range, + 'low': low, + 'high': high})) return partial(binarizer, threshold, zoom, escale, border, perc, range, low, high) @@ -486,6 +492,8 @@ def segment(ctx, model, boxes, text_direction, scale, maxcolseps, """ Segments page images into text lines. """ + from kraken.containers import ProcessingStep + if model and boxes: logger.warning(f'Baseline model ({model}) given but legacy segmenter selected. Forcing to -bl.') boxes = False @@ -493,10 +501,10 @@ def segment(ctx, model, boxes, text_direction, scale, maxcolseps, if boxes is False: if not model: model = SEGMENTATION_DEFAULT_MODEL - ctx.meta['steps'].append({'category': 'processing', - 'description': 'Baseline and region segmentation', - 'settings': {'model': os.path.basename(model), - 'text_direction': text_direction}}) + ctx.meta['steps'].append(ProcessingStep(category='processing', + description='Baseline and region segmentation', + settings={'model': os.path.basename(model), + 'text_direction': text_direction})) # first try to find the segmentation model by its given name, # then look in the kraken config folder @@ -522,14 +530,14 @@ def segment(ctx, model, boxes, text_direction, scale, maxcolseps, message('\u2713', fg='green') else: - ctx.meta['steps'].append({'category': 'processing', - 'description': 'bounding box segmentation', - 'settings': {'text_direction': text_direction, - 'scale': scale, - 'maxcolseps': maxcolseps, - 'black_colseps': black_colseps, - 'remove_hlines': remove_hlines, - 'pad': pad}}) + ctx.meta['steps'].append(ProcessingStep(category='processing', + description='bounding box segmentation', + settings={'text_direction': text_direction, + 'scale': scale, + 'maxcolseps': maxcolseps, + 'black_colseps': black_colseps, + 'remove_hlines': remove_hlines, + 'pad': pad})) return partial(segmenter, boxes, model, text_direction, scale, maxcolseps, black_colseps, remove_hlines, pad, mask, ctx.meta['device']) @@ -594,6 +602,8 @@ def ocr(ctx, model, pad, reorder, base_dir, no_segmentation, text_direction): """ from kraken.lib import models + from kraken.containers import ProcessingStep + if ctx.meta['input_format_type'] != 'image' and no_segmentation: raise click.BadParameter('no_segmentation mode is incompatible with page/alto inputs') @@ -631,12 +641,12 @@ def ocr(ctx, model, pad, reorder, base_dir, no_segmentation, text_direction): nn.update(nm) nm = nn - ctx.meta['steps'].append({'category': 'processing', - 'description': 'Text line recognition', - 'settings': {'text_direction': text_direction, - 'models': ' '.join(os.path.basename(v) for v in model.values()), - 'pad': pad, - 'bidi_reordering': reorder}}) + ctx.meta['steps'].append(ProcessingStep(category='processing', + description='Text line recognition', + settings={'text_direction': text_direction, + 'models': ' '.join(os.path.basename(v) for v in model.values()), + 'pad': pad, + 'bidi_reordering': reorder})) # set output mode ctx.meta['text_direction'] = text_direction From feeecc91df04eb8e5d712a24940ab618a783ac63 Mon Sep 17 00:00:00 2001 From: Benjamin Kiessling Date: Wed, 6 Mar 2024 16:02:49 +0100 Subject: [PATCH 07/76] uuid imports --- kraken/kraken.py | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/kraken/kraken.py b/kraken/kraken.py index a24a683c6..9c33dbf29 100644 --- a/kraken/kraken.py +++ b/kraken/kraken.py @@ -21,6 +21,7 @@ import dataclasses import logging import os +import uuid import shlex import warnings from functools import partial @@ -179,7 +180,6 @@ def recognizer(model, pad, no_segmentation, bidi_reordering, tags_ignore, input, import dataclasses import json - import uuid from kraken import rpred from kraken.containers import BBoxLine, Segmentation @@ -345,7 +345,6 @@ def process_pipeline(subcommands, input, batch_input, suffix, verbose, format_ty """ import glob import tempfile - import uuid from threadpoolctl import threadpool_limits @@ -450,7 +449,8 @@ def binarize(ctx, threshold, zoom, escale, border, perc, range, low, high): """ from kraken.containers import ProcessingStep - ctx.meta['steps'].append(ProcessingStep(category='preprocessing', + ctx.meta['steps'].append(ProcessingStep(id=uuid.uuid4(), + category='preprocessing', description='Image binarization', settings={'threshold': threshold, 'zoom': zoom, @@ -501,7 +501,8 @@ def segment(ctx, model, boxes, text_direction, scale, maxcolseps, if boxes is False: if not model: model = SEGMENTATION_DEFAULT_MODEL - ctx.meta['steps'].append(ProcessingStep(category='processing', + ctx.meta['steps'].append(ProcessingStep(id=uuid.uuid4(), + category='processing', description='Baseline and region segmentation', settings={'model': os.path.basename(model), 'text_direction': text_direction})) @@ -530,7 +531,8 @@ def segment(ctx, model, boxes, text_direction, scale, maxcolseps, message('\u2713', fg='green') else: - ctx.meta['steps'].append(ProcessingStep(category='processing', + ctx.meta['steps'].append(ProcessingStep(id=uuid.uuid4(), + category='processing', description='bounding box segmentation', settings={'text_direction': text_direction, 'scale': scale, @@ -641,7 +643,8 @@ def ocr(ctx, model, pad, reorder, base_dir, no_segmentation, text_direction): nn.update(nm) nm = nn - ctx.meta['steps'].append(ProcessingStep(category='processing', + ctx.meta['steps'].append(ProcessingStep(id=uuid.uuid4(), + category='processing', description='Text line recognition', settings={'text_direction': text_direction, 'models': ' '.join(os.path.basename(v) for v in model.values()), From 4248ca000f76b25816446c42e66c26bdbfacafa6 Mon Sep 17 00:00:00 2001 From: Benjamin Kiessling Date: Wed, 6 Mar 2024 17:26:32 +0100 Subject: [PATCH 08/76] Filter out very small regions in segmenter --- kraken/lib/segmentation.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/kraken/lib/segmentation.py b/kraken/lib/segmentation.py index 87870562a..abff7abd5 100644 --- a/kraken/lib/segmentation.py +++ b/kraken/lib/segmentation.py @@ -352,10 +352,13 @@ def vectorize_regions(im: np.ndarray, threshold: float = 0.5): [[x0, y0, ... xn, yn], [xm, ym, ..., xk, yk], ... ] A list of lists containing the region polygons. """ + print(f'shape: {im.shape} {im.max()}') bin = im > threshold labelled = label(bin) boundaries = [] for x in regionprops(labelled): + if x.area < 32: + continue boundary = boundary_tracing(x) if len(boundary) > 2: boundaries.append(geom.Polygon(boundary)) From 150323d0c722573a96dddd7750584a0d140644b2 Mon Sep 17 00:00:00 2001 From: Benjamin Kiessling Date: Wed, 13 Mar 2024 11:27:59 +0100 Subject: [PATCH 09/76] erroneous debug print --- kraken/lib/segmentation.py | 1 - 1 file changed, 1 deletion(-) diff --git a/kraken/lib/segmentation.py b/kraken/lib/segmentation.py index abff7abd5..8c979da53 100644 --- a/kraken/lib/segmentation.py +++ b/kraken/lib/segmentation.py @@ -352,7 +352,6 @@ def vectorize_regions(im: np.ndarray, threshold: float = 0.5): [[x0, y0, ... xn, yn], [xm, ym, ..., xk, yk], ... ] A list of lists containing the region polygons. """ - print(f'shape: {im.shape} {im.max()}') bin = im > threshold labelled = label(bin) boundaries = [] From 9187dbbb3bc601103c3bb8ab539078a4a2e65f8c Mon Sep 17 00:00:00 2001 From: Stefan Weil Date: Fri, 15 Mar 2024 18:05:32 +0100 Subject: [PATCH 10/76] Update deprecated import statement for scipy filters This fixes some runtime warnings: ``` venv3.11/lib/python3.11/site-packages/kraken/pageseg.py:28 venv3.11/lib/python3.11/site-packages/kraken/pageseg.py:28: DeprecationWarning: Please use `gaussian_filter` from the `scipy.ndimage` namespace, the `scipy.ndimage.filters` namespace is deprecated. from scipy.ndimage.filters import (gaussian_filter, maximum_filter, venv3.11/lib/python3.11/site-packages/kraken/pageseg.py:28 venv3.11/lib/python3.11/site-packages/kraken/pageseg.py:28: DeprecationWarning: Please use `maximum_filter` from the `scipy.ndimage` namespace, the `scipy.ndimage.filters` namespace is deprecated. from scipy.ndimage.filters import (gaussian_filter, maximum_filter, venv3.11/lib/python3.11/site-packages/kraken/pageseg.py:28 venv3.11/lib/python3.11/site-packages/kraken/pageseg.py:28: DeprecationWarning: Please use `uniform_filter` from the `scipy.ndimage` namespace, the `scipy.ndimage.filters` namespace is deprecated. from scipy.ndimage.filters import (gaussian_filter, maximum_filter, ``` Signed-off-by: Stefan Weil --- kraken/pageseg.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/kraken/pageseg.py b/kraken/pageseg.py index c29742620..12fe28d02 100644 --- a/kraken/pageseg.py +++ b/kraken/pageseg.py @@ -25,8 +25,7 @@ import numpy as np import PIL -from scipy.ndimage.filters import (gaussian_filter, maximum_filter, - uniform_filter) +from scipy.ndimage import gaussian_filter, maximum_filter, uniform_filter from kraken.containers import BBoxLine, Segmentation from kraken.lib import morph, sl From a4a24c84bd2cea24aed46041f7a604b0abd1b929 Mon Sep 17 00:00:00 2001 From: Stefan Weil Date: Sat, 16 Mar 2024 13:48:17 +0100 Subject: [PATCH 11/76] Enable test_pageseg in GitHub CI test action That test passes and does not need much time, so there is no reason to exclude it from the test. Signed-off-by: Stefan Weil --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 725ab6562..eac90c000 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -30,7 +30,7 @@ jobs: flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics - name: Run tests, except training tests run: | - pytest -k 'not test_train and not test_pageseg' + pytest -k 'not test_train' build-n-publish-pypi: name: Build and publish Python 🐍 distributions 📦 to PyPI and TestPyPI From 3201fdd792e797426e9d9a823a16c0d4a30be580 Mon Sep 17 00:00:00 2001 From: Benjamin Kiessling Date: Tue, 26 Mar 2024 10:31:22 +0100 Subject: [PATCH 12/76] Faster polygonal line extraction commit 432422a27615824bc5dd53086d79e0848fdbcb94 Author: Robin Champenois <4519091+Evarin@users.noreply.github.com> Date: Fri Mar 1 14:25:19 2024 +0100 Better legacy polygon arrow behavior commit aeaa6890cd3952ccb7008f021bbaee6fbfd62d93 Author: Robin Champenois <4519091+Evarin@users.noreply.github.com> Date: Tue Feb 27 19:20:41 2024 +0100 Tests for arrow dataset and new polygons commit be0083ca02832766b0fe25caba0d8171868e3ec6 Author: Robin Champenois <4519091+Evarin@users.noreply.github.com> Date: Tue Feb 27 17:29:25 2024 +0100 Handle extract_polygons toggle for Arrow Datasets commit d830fb7a3418aa85340289fd9fac05e9d5635bdc Author: Robin Champenois <4519091+Evarin@users.noreply.github.com> Date: Mon Feb 26 16:57:33 2024 +0100 Improve legacy polygon tests commit b99b7882ee3f38c16d9fb41edbf6af343d527368 Author: Robin Champenois <4519091+Evarin@users.noreply.github.com> Date: Mon Feb 26 16:01:31 2024 +0100 Full new polygon extraction tests commit d3398797faa5216e61682bfd62474bb720c325bf Author: Robin Champenois <4519091+Evarin@users.noreply.github.com> Date: Mon Feb 26 13:31:40 2024 +0100 [WIP] test the application of new polygons commit 16be09173b7eb2e5c2c00b03254b6e246e7e158c Author: Benjamin Kiessling Date: Tue Mar 26 10:28:31 2024 +0100 [WIP] legacy polygon flag system commit 197569e0ce28df80613b9b666231e49c902dcb96 Author: Benjamin Kiessling Date: Tue Mar 26 10:27:57 2024 +0100 Fix tests commit 29c7266e802370c356f64b22aa9817e8df721937 Author: Robin Champenois <4519091+Evarin@users.noreply.github.com> Date: Mon Dec 4 13:43:20 2023 +0100 Faster and cleaner extract_polygons and _rotate --- kraken/contrib/extract_lines.py | 7 +- kraken/ketos/dataset.py | 7 +- kraken/ketos/pretrain.py | 11 +- kraken/ketos/recognition.py | 52 +- kraken/ketos/ro.py | 2 +- kraken/ketos/segmentation.py | 4 +- kraken/kraken.py | 12 +- kraken/lib/arrow_dataset.py | 12 +- kraken/lib/dataset/recognition.py | 15 +- kraken/lib/pretrain/model.py | 32 +- kraken/lib/segmentation.py | 413 +++++++++++----- kraken/lib/train.py | 24 +- kraken/lib/vgsl.py | 14 +- kraken/rpred.py | 33 +- tests/resources/170025120000003,0074-lite.xml | 89 ++++ tests/resources/overfit_newpoly.mlmodel | Bin 0 -> 183424 bytes tests/test_newpolygons.py | 449 ++++++++++++++++++ 17 files changed, 1027 insertions(+), 149 deletions(-) create mode 100644 tests/resources/170025120000003,0074-lite.xml create mode 100644 tests/resources/overfit_newpoly.mlmodel create mode 100644 tests/test_newpolygons.py diff --git a/kraken/contrib/extract_lines.py b/kraken/contrib/extract_lines.py index 95233263c..78f779af9 100755 --- a/kraken/contrib/extract_lines.py +++ b/kraken/contrib/extract_lines.py @@ -9,8 +9,9 @@ 'link to source images.') @click.option('-i', '--model', default=None, show_default=True, type=click.Path(exists=True), help='Baseline detection model to use. Overrides format type and expects image files as input.') +@click.option('--legacy-polygons', is_flag=True, help='Use the legacy polygon extractor.') @click.argument('files', nargs=-1) -def cli(format_type, model, files): +def cli(format_type, model, legacy_polygons, files): """ A small script extracting rectified line polygons as defined in either ALTO or PageXML files or run a model to do the same. @@ -37,7 +38,7 @@ def cli(format_type, model, files): data = xml.XMLPage(doc, format_type) if len(data.lines) > 0: bounds = data.to_container() - for idx, (im, box) in enumerate(segmentation.extract_polygons(Image.open(bounds.imagename), bounds)): + for idx, (im, box) in enumerate(segmentation.extract_polygons(Image.open(bounds.imagename), bounds, legacy=legacy_polygons)): click.echo('.', nl=False) im.save('{}.{}.jpg'.format(splitext(bounds.imagename)[0], idx)) with open('{}.{}.gt.txt'.format(splitext(bounds.imagename)[0], idx), 'w') as fp: @@ -61,7 +62,7 @@ def cli(format_type, model, files): click.echo(f'Processing {doc} ', nl=False) full_im = Image.open(doc) bounds = blla.segment(full_im, model=net) - for idx, (im, box) in enumerate(segmentation.extract_polygons(full_im, bounds)): + for idx, (im, box) in enumerate(segmentation.extract_polygons(full_im, bounds, legacy=legacy_polygons)): click.echo('.', nl=False) im.save('{}.{}.jpg'.format(splitext(doc)[0], idx)) diff --git a/kraken/ketos/dataset.py b/kraken/ketos/dataset.py index a4df23400..06154d78a 100644 --- a/kraken/ketos/dataset.py +++ b/kraken/ketos/dataset.py @@ -55,9 +55,11 @@ help='Minimum number of records per RecordBatch written to the ' 'output file. Larger batches require more transient memory ' 'but slightly improve reading performance.') +@click.option('--legacy-polygons', show_default=True, default=False, is_flag=True, + help='Use the old polygon extractor.') @click.argument('ground_truth', nargs=-1, type=click.Path(exists=True, dir_okay=False)) def compile(ctx, output, workers, format_type, files, random_split, force_type, - save_splits, skip_empty_lines, recordbatch_size, ground_truth): + save_splits, skip_empty_lines, recordbatch_size, ground_truth, legacy_polygons): """ Precompiles a binary dataset from a collection of XML files. """ @@ -91,6 +93,7 @@ def compile(ctx, output, workers, format_type, files, random_split, force_type, force_type, recordbatch_size, skip_empty_lines, - lambda advance, total: progress.update(extract_task, total=total, advance=advance)) + lambda advance, total: progress.update(extract_task, total=total, advance=advance), + legacy_polygons=legacy_polygons) message(f'Output file written to {output}') diff --git a/kraken/ketos/pretrain.py b/kraken/ketos/pretrain.py index a8c404dac..5d6055849 100644 --- a/kraken/ketos/pretrain.py +++ b/kraken/ketos/pretrain.py @@ -133,7 +133,7 @@ @click.option('-e', '--evaluation-files', show_default=True, default=None, multiple=True, callback=_validate_manifests, type=click.File(mode='r', lazy=True), help='File(s) with paths to evaluation data. Overrides the `-p` parameter') -@click.option('--workers', show_default=True, default=1, type=click.IntRange(1), help='Number of worker processes.') +@click.option('--workers', show_default=True, default=1, type=click.IntRange(0), help='Number of worker processes.') @click.option('--threads', show_default=True, default=1, type=click.IntRange(1), help='Maximum size of OpenMP/BLAS thread pool.') @click.option('--load-hyper-parameters/--no-load-hyper-parameters', show_default=True, default=False, help='When loading an existing model, retrieve hyperparameters from the model') @@ -179,6 +179,7 @@ default=RECOGNITION_PRETRAIN_HYPER_PARAMS['logit_temp'], help='Multiplicative factor for the logits used in contrastive loss.') @click.argument('ground_truth', nargs=-1, callback=_expand_gt, type=click.Path(exists=False, dir_okay=False)) +@click.option('--legacy-polygons', show_default=True, default=False, is_flag=True, help='Use the legacy polygon extractor.') def pretrain(ctx, batch_size, pad, output, spec, load, freq, quit, epochs, min_epochs, lag, min_delta, device, precision, optimizer, lrate, momentum, weight_decay, warmup, schedule, gamma, step_size, sched_patience, @@ -186,7 +187,7 @@ def pretrain(ctx, batch_size, pad, output, spec, load, freq, quit, epochs, evaluation_files, workers, threads, load_hyper_parameters, repolygonize, force_binarization, format_type, augment, mask_probability, mask_width, num_negatives, logit_temp, - ground_truth): + ground_truth, legacy_polygons): """ Trains a model from image-text pairs. """ @@ -258,7 +259,8 @@ def pretrain(ctx, batch_size, pad, output, spec, load, freq, quit, epochs, output=output, spec=spec, model=load, - load_hyper_parameters=load_hyper_parameters) + load_hyper_parameters=load_hyper_parameters, + legacy_polygons=legacy_polygons) data_module = PretrainDataModule(batch_size=hyper_params.pop('batch_size'), pad=hyper_params.pop('pad'), @@ -273,7 +275,8 @@ def pretrain(ctx, batch_size, pad, output, spec, load, freq, quit, epochs, channels=model.channels, repolygonize=repolygonize, force_binarization=force_binarization, - format_type=format_type) + format_type=format_type, + legacy_polygons=legacy_polygons,) model.len_train_set = len(data_module.train_dataloader()) diff --git a/kraken/ketos/recognition.py b/kraken/ketos/recognition.py index 849408162..559d86d3b 100644 --- a/kraken/ketos/recognition.py +++ b/kraken/ketos/recognition.py @@ -21,6 +21,8 @@ import logging import pathlib from typing import List +from functools import partial +import warnings import click from threadpoolctl import threadpool_limits @@ -157,7 +159,7 @@ @click.option('-e', '--evaluation-files', show_default=True, default=None, multiple=True, callback=_validate_manifests, type=click.File(mode='r', lazy=True), help='File(s) with paths to evaluation data. Overrides the `-p` parameter') -@click.option('--workers', show_default=True, default=1, type=click.IntRange(1), help='Number of worker processes.') +@click.option('--workers', show_default=True, default=1, type=click.IntRange(0), help='Number of worker processes.') @click.option('--threads', show_default=True, default=1, type=click.IntRange(1), help='Maximum size of OpenMP/BLAS thread pool.') @click.option('--load-hyper-parameters/--no-load-hyper-parameters', show_default=True, default=False, help='When loading an existing model, retrieve hyperparameters from the model') @@ -190,6 +192,7 @@ @click.option('--log-dir', show_default=True, type=click.Path(exists=True, dir_okay=True, writable=True), help='Path to directory where the logger will store the logs. If not set, a directory will be created in the current working directory.') @click.argument('ground_truth', nargs=-1, callback=_expand_gt, type=click.Path(exists=False, dir_okay=False)) +@click.option('--legacy-polygons', show_default=True, default=False, is_flag=True, help='Use the legacy polygon extractor.') def train(ctx, batch_size, pad, output, spec, append, load, freq, quit, epochs, min_epochs, lag, min_delta, device, precision, optimizer, lrate, momentum, weight_decay, warmup, freeze_backbone, schedule, gamma, step_size, @@ -197,7 +200,7 @@ def train(ctx, batch_size, pad, output, spec, append, load, freq, quit, epochs, normalize_whitespace, codec, resize, reorder, base_dir, training_files, evaluation_files, workers, threads, load_hyper_parameters, repolygonize, force_binarization, format_type, augment, - pl_logger, log_dir, ground_truth): + pl_logger, log_dir, ground_truth, legacy_polygons): """ Trains a model from image-text pairs. """ @@ -300,7 +303,19 @@ def train(ctx, batch_size, pad, output, spec, append, load, freq, quit, epochs, force_binarization=force_binarization, format_type=format_type, codec=codec, - resize=resize) + resize=resize, + legacy_polygons=legacy_polygons) + + # Force upgrade to new polygon extractor if model was not trained with it + if model.nn and model.nn.use_legacy_polygons: + if not legacy_polygons and not model.legacy_polygons: + # upgrade to new polygon extractor + logger.warning('The model will be flagged to use new polygon extractor.') + model.nn.use_legacy_polygons = False + if not model.nn and legacy_polygons != model.legacy_polygons: + logger.warning(f'Dataset was compiled with legacy polygon extractor: {model.legacy_polygons}, ' + f'the new model will be flagged to use {"legacy" if model.legacy_polygons else "new"} method.') + legacy_polygons = model.legacy_polygons trainer = KrakenTrainer(accelerator=accelerator, devices=device, @@ -349,7 +364,7 @@ def train(ctx, batch_size, pad, output, spec, append, load, freq, quit, epochs, @click.option('--pad', show_default=True, type=click.INT, default=16, help='Left and right ' 'padding around lines') @click.option('--workers', show_default=True, default=1, - type=click.IntRange(1), + type=click.IntRange(0), help='Number of worker processes when running on CPU.') @click.option('--threads', show_default=True, default=1, type=click.IntRange(1), @@ -387,9 +402,10 @@ def train(ctx, batch_size, pad, output, spec, append, load, freq, quit, epochs, @click.option('--fixed-splits/--ignore-fixed-split', show_default=True, default=False, help='Whether to honor fixed splits in binary datasets.') @click.argument('test_set', nargs=-1, callback=_expand_gt, type=click.Path(exists=False, dir_okay=False)) +@click.option('--no-legacy-polygons', show_default=True, default=False, is_flag=True, help='Force disable the legacy polygon extractor.') def test(ctx, batch_size, model, evaluation_files, device, pad, workers, threads, reorder, base_dir, normalization, normalize_whitespace, - repolygonize, force_binarization, format_type, fixed_splits, test_set): + repolygonize, force_binarization, format_type, fixed_splits, test_set, no_legacy_polygons): """ Evaluate on a test set. """ @@ -410,11 +426,28 @@ def test(ctx, batch_size, model, evaluation_files, device, pad, workers, logger.info('Building test set from {} line images'.format(len(test_set) + len(evaluation_files))) + legacy_polygons = None + incoherent_legacy_polygons = False + nn = {} for p in model: message('Loading model {}\t'.format(p), nl=False) nn[p] = models.load_any(p, device) message('\u2713', fg='green') + model_legacy_polygons = nn[p].nn.use_legacy_polygons + if legacy_polygons is None: + legacy_polygons = model_legacy_polygons + elif legacy_polygons != model_legacy_polygons: + incoherent_legacy_polygons = True + + if incoherent_legacy_polygons and not no_legacy_polygons: + logger.warning('Models use different polygon extractors. Legacy polygon extractor will be used ; use --no-legacy-polygons to force disable it.') + legacy_polygons = True + elif no_legacy_polygons: + legacy_polygons = False + + if legacy_polygons: + warnings.warn('Using legacy polygon extractor, as the model was not trained with the new method. Please retrain your model to get performance improvements.') pin_ds_mem = False if device != 'cpu': @@ -440,7 +473,7 @@ def test(ctx, batch_size, model, evaluation_files, device, pad, workers, message('Repolygonizing data') test_set = [{'page': XMLPage(file, filetype=format_type).to_container()} for file in test_set] valid_norm = False - DatasetClass = PolygonGTDataset + DatasetClass = partial(PolygonGTDataset, legacy_polygons=legacy_polygons) elif format_type == 'binary': DatasetClass = ArrowIPCRecognitionDataset if repolygonize: @@ -485,6 +518,13 @@ def test(ctx, batch_size, model, evaluation_files, device, pad, workers, ds.add(**line) except ValueError as e: logger.info(e) + + if hasattr(ds, 'legacy_polygon_status'): + if ds.legacy_polygons_status != legacy_polygons: + warnings.warn( + f'Binary dataset was compiled with legacy polygon extractor: {ds.legacy_polygon_status}, ' + f'while expecting data extracted with {"legacy" if legacy_polygons else "new"} method. Results may be inaccurate.') + # don't encode validation set as the alphabets may not match causing encoding failures ds.no_encode() ds_loader = DataLoader(ds, diff --git a/kraken/ketos/ro.py b/kraken/ketos/ro.py index 9ff26d57e..33191d596 100644 --- a/kraken/ketos/ro.py +++ b/kraken/ketos/ro.py @@ -123,7 +123,7 @@ @click.option('-e', '--evaluation-files', show_default=True, default=None, multiple=True, callback=_validate_manifests, type=click.File(mode='r', lazy=True), help='File(s) with paths to evaluation data. Overrides the `-p` parameter') -@click.option('--workers', show_default=True, default=1, type=click.IntRange(1), help='Number of worker proesses.') +@click.option('--workers', show_default=True, default=1, type=click.IntRange(0), help='Number of worker proesses.') @click.option('--threads', show_default=True, default=1, type=click.IntRange(1), help='Maximum size of OpenMP/BLAS thread pool.') @click.option('--load-hyper-parameters/--no-load-hyper-parameters', show_default=True, default=False, help='When loading an existing model, retrieve hyper-parameters from the model') diff --git a/kraken/ketos/segmentation.py b/kraken/ketos/segmentation.py index 4d6cdfaeb..f1391e358 100644 --- a/kraken/ketos/segmentation.py +++ b/kraken/ketos/segmentation.py @@ -159,7 +159,7 @@ def _validate_merging(ctx, param, value): @click.option('-e', '--evaluation-files', show_default=True, default=None, multiple=True, callback=_validate_manifests, type=click.File(mode='r', lazy=True), help='File(s) with paths to evaluation data. Overrides the `-p` parameter') -@click.option('--workers', show_default=True, default=1, type=click.IntRange(1), help='Number of worker proesses.') +@click.option('--workers', show_default=True, default=1, type=click.IntRange(0), help='Number of worker proesses.') @click.option('--threads', show_default=True, default=1, type=click.IntRange(1), help='Maximum size of OpenMP/BLAS thread pool.') @click.option('--load-hyper-parameters/--no-load-hyper-parameters', show_default=True, default=False, help='When loading an existing model, retrieve hyper-parameters from the model') @@ -382,7 +382,7 @@ def segtrain(ctx, output, spec, line_width, pad, load, freq, quit, epochs, callback=_validate_manifests, type=click.File(mode='r', lazy=True), help='File(s) with paths to evaluation data.') @click.option('-d', '--device', show_default=True, default='cpu', help='Select device to use (cpu, cuda:0, cuda:1, ...)') -@click.option('--workers', default=1, show_default=True, type=click.IntRange(1), +@click.option('--workers', default=1, show_default=True, type=click.IntRange(0), help='Number of worker processes for data loading.') @click.option('--threads', default=1, show_default=True, type=click.IntRange(1), help='Size of thread pools for intra-op parallelization') diff --git a/kraken/kraken.py b/kraken/kraken.py index 9c33dbf29..61b653880 100644 --- a/kraken/kraken.py +++ b/kraken/kraken.py @@ -227,10 +227,12 @@ def recognizer(model, pad, no_segmentation, bidi_reordering, tags_ignore, input, if bounds.script_detection: it = rpred.mm_rpred(model, im, bounds, pad, bidi_reordering=bidi_reordering, - tags_ignore=tags_ignore) + tags_ignore=tags_ignore, + no_legacy_polygons=ctx.meta['no_legacy_polygons']) else: it = rpred.rpred(model['default'], im, bounds, pad, - bidi_reordering=bidi_reordering) + bidi_reordering=bidi_reordering, + no_legacy_polygons=ctx.meta['no_legacy_polygons']) preds = [] @@ -302,8 +304,10 @@ def recognizer(model, pad, no_segmentation, bidi_reordering, tags_ignore, input, help='On compatible devices, uses autocast for `segment` which lower the memory usage.') @click.option('--threads', default=1, show_default=True, type=click.IntRange(1), help='Size of thread pools for intra-op parallelization') +@click.option('--no-legacy-polygons', 'no_legacy_polygons', is_flag=True, default=False, + help="Force disable legacy polygon extraction") def cli(input, batch_input, suffix, verbose, format_type, pdf_format, - serializer, template, device, raise_on_error, autocast, threads): + serializer, template, device, raise_on_error, autocast, threads, no_legacy_polygons): """ Base command for recognition functionality. @@ -334,6 +338,8 @@ def cli(input, batch_input, suffix, verbose, format_type, pdf_format, ctx.meta['steps'] = [] ctx.meta["autocast"] = autocast ctx.meta['threads'] = threads + ctx.meta['no_legacy_polygons'] = no_legacy_polygons + log.set_logger(logger, level=30 - min(10 * verbose, 20)) diff --git a/kraken/lib/arrow_dataset.py b/kraken/lib/arrow_dataset.py index c9159a916..d3b4a9288 100755 --- a/kraken/lib/arrow_dataset.py +++ b/kraken/lib/arrow_dataset.py @@ -44,7 +44,7 @@ logger = logging.getLogger(__name__) -def _extract_line(xml_record, skip_empty_lines: bool = True): +def _extract_line(xml_record, skip_empty_lines: bool = True, legacy_polygons: bool = False): lines = [] try: im = Image.open(xml_record.imagename) @@ -62,7 +62,7 @@ def _extract_line(xml_record, skip_empty_lines: bool = True): script_detection=False, line_orders=[]) try: - line_im, line = next(extract_polygons(im, seg)) + line_im, line = next(extract_polygons(im, seg, legacy=legacy_polygons)) except KrakenInputException: logger.warning(f'Invalid line {idx} in {im.filename}') continue @@ -113,7 +113,8 @@ def build_binary_dataset(files: Optional[List[Union[str, 'PathLike', Dict]]] = N force_type: Optional[str] = None, recordbatch_size: int = 100, skip_empty_lines: bool = True, - callback: Callable[[int, int], None] = lambda chunk, lines: None) -> None: + callback: Callable[[int, int], None] = lambda chunk, lines: None, + legacy_polygons: bool = False) -> None: """ Parses XML files and dumps the baseline-style line images and text into a binary dataset. @@ -141,10 +142,11 @@ def build_binary_dataset(files: Optional[List[Union[str, 'PathLike', Dict]]] = N skip_empty_lines: Do not compile empty text lines into the dataset. callback: Function called every time a new recordbatch is flushed into the Arrow IPC file. + legacy_polygons: Use legacy polygon extraction code. """ logger.info('Parsing XML files') - extract_fn = partial(_extract_line, skip_empty_lines=skip_empty_lines) + extract_fn = partial(_extract_line, skip_empty_lines=skip_empty_lines, legacy_polygons=legacy_polygons) parse_fn = None if format_type in ['xml', 'alto', 'page']: parse_fn = XMLPage @@ -216,6 +218,7 @@ def build_binary_dataset(files: Optional[List[Union[str, 'PathLike', Dict]]] = N 'image_type': 'raw', 'splits': ['train', 'eval', 'test'], 'im_mode': '1', + 'legacy_polygons': legacy_polygons, 'counts': Counter({'all': 0, 'train': 0, 'validation': 0, @@ -309,6 +312,7 @@ def _make_record_batch(line_cache): f"image_type: {metadata['lines']['image_type']}\n" f"splits: {metadata['lines']['splits']}\n" f"im_mode: {metadata['lines']['im_mode']}\n" + f"legacy_polygons: {metadata['lines']['legacy_polygons']}\n" f"lines: {metadata['lines']['counts']}\n") with pa.memory_map(tmp_file, 'rb') as source: diff --git a/kraken/lib/dataset/recognition.py b/kraken/lib/dataset/recognition.py index a80f6cd89..fde975cc5 100644 --- a/kraken/lib/dataset/recognition.py +++ b/kraken/lib/dataset/recognition.py @@ -121,6 +121,7 @@ def __init__(self, self.arrow_table = None self.codec = None self.skip_empty_lines = skip_empty_lines + self.legacy_polygons_status = None self.seg_type = None # built text transformations @@ -174,6 +175,12 @@ def add(self, file: Union[str, 'PathLike']) -> None: if self.seg_type == 'bbox' and metadata['image_type'] == 'raw': self.transforms.valid_norm = True + legacy_polygons = metadata.get('legacy_polygons', True) + if self.legacy_polygons_status is None: + self.legacy_polygons_status = legacy_polygons + elif self.legacy_polygons_status != legacy_polygons: + self.legacy_polygons_status = "mixed" + self.alphabet.update(metadata['alphabet']) num_lines = metadata['counts'][self._split_filter] if self._split_filter else metadata['counts']['all'] if self._split_filter: @@ -284,7 +291,8 @@ def __init__(self, skip_empty_lines: bool = True, reorder: Union[bool, Literal['L', 'R']] = True, im_transforms: Callable[[Any], torch.Tensor] = transforms.Compose([]), - augmentation: bool = False) -> None: + augmentation: bool = False, + legacy_polygons: bool=False) -> None: """ Creates a dataset for a polygonal (baseline) transcription model. @@ -307,6 +315,7 @@ def __init__(self, self.aug = None self.skip_empty_lines = skip_empty_lines self.failed_samples = set() + self.legacy_polygons = legacy_polygons self.seg_type = 'baselines' # built text transformations @@ -424,8 +433,8 @@ def __getitem__(self, index: int) -> Tuple[torch.Tensor, torch.Tensor]: boundary=item[0][2])], script_detection=True, regions={}, - line_orders=[]) - )) + line_orders=[]), + legacy=self.legacy_polygons)) im = self.transforms(im) if im.shape[0] == 3: im_mode = 'RGB' diff --git a/kraken/lib/pretrain/model.py b/kraken/lib/pretrain/model.py index 4685e1851..68626cf49 100644 --- a/kraken/lib/pretrain/model.py +++ b/kraken/lib/pretrain/model.py @@ -32,6 +32,7 @@ import math import re from itertools import chain +from functools import partial from typing import TYPE_CHECKING, Any, Dict, Optional, Sequence, Union import numpy as np @@ -87,7 +88,8 @@ def __init__(self, force_binarization: bool = False, format_type: str = 'path', pad: int = 16, - augment: bool = default_specs.RECOGNITION_PRETRAIN_HYPER_PARAMS['augment']): + augment: bool = default_specs.RECOGNITION_PRETRAIN_HYPER_PARAMS['augment'], + legacy_polygons: bool = False): """ A LightningDataModule encapsulating text-less training data for unsupervised recognition model pretraining. @@ -106,6 +108,8 @@ def __init__(self, super().__init__() self.save_hyperparameters() + self.legacy_polygons = legacy_polygons + DatasetClass = GroundTruthDataset valid_norm = True if format_type in ['xml', 'page', 'alto']: @@ -117,7 +121,7 @@ def __init__(self, if binary_dataset_split: logger.warning('Internal binary dataset splits are enabled but using non-binary dataset files. Will be ignored.') binary_dataset_split = False - DatasetClass = PolygonGTDataset + DatasetClass = partial(PolygonGTDataset, legacy_polygons=legacy_polygons) valid_norm = False elif format_type == 'binary': DatasetClass = ArrowIPCRecognitionDataset @@ -147,7 +151,7 @@ def __init__(self, # format_type is None. Determine training type from length of training data entry elif not format_type: if training_data[0].type == 'baselines': - DatasetClass = PolygonGTDataset + DatasetClass = partial(PolygonGTDataset, legacy_polygons=legacy_polygons) valid_norm = False else: if force_binarization: @@ -205,6 +209,19 @@ def __init__(self, 'set. (Will disable alphabet mismatch detection.)') self.train_set, self.val_set = random_split(train_set, (train_len, val_len)) + if format_type == 'binary': + legacy_train_status = train_set.legacy_polygons_status + if val_set and val_set.legacy_polygons_status != legacy_train_status: + logger.warning( + f'Train and validation set have different legacy polygon status: {legacy_train_status} and {val_set.legacy_polygons_status}.' + 'Train set status prevails.') + if legacy_train_status == "mixed": + logger.warning('Mixed legacy polygon status in training dataset. Consider recompilation.') + legacy_train_status = False + if legacy_polygons != legacy_train_status: + logger.warning(f'Setting dataset legacy polygon status to {legacy_train_status} based on training set.') + self.legacy_polygons = legacy_train_status + if len(self.train_set) == 0 or len(self.val_set) == 0: raise ValueError('No valid training data was provided to the train ' 'command. Please add valid XML, line, or binary data.') @@ -255,7 +272,8 @@ def __init__(self, spec: str = default_specs.RECOGNITION_SPEC, model: Optional[Union['PathLike', str]] = None, load_hyper_parameters: bool = False, - len_train_set: int = -1): + len_train_set: int = -1, + legacy_polygons: bool = False): """ A LightningModule encapsulating the unsupervised pretraining setup for a text recognition model. @@ -273,10 +291,15 @@ def __init__(self, """ super().__init__() hyper_params_ = default_specs.RECOGNITION_PRETRAIN_HYPER_PARAMS + self.legacy_polygons = legacy_polygons + if model: logger.info(f'Loading existing model from {model} ') self.nn = vgsl.TorchVGSLModel.load_model(model) + # apply legacy polygon parameter + self.nn.use_legacy_polygons = legacy_polygons + if self.nn.model_type not in [None, 'recognition']: raise ValueError(f'Model {model} is of type {self.nn.model_type} while `recognition` is expected.') @@ -430,6 +453,7 @@ def setup(self, stage: Optional[str] = None): else: logger.info(f'Creating new model {self.spec}') self.nn = vgsl.TorchVGSLModel(self.spec) + self.nn.use_legacy_polygons = self.legacy_polygons # initialize weights self.nn.init_weights() diff --git a/kraken/lib/segmentation.py b/kraken/lib/segmentation.py index 8c979da53..9fad17a60 100644 --- a/kraken/lib/segmentation.py +++ b/kraken/lib/segmentation.py @@ -18,15 +18,15 @@ import logging from collections import defaultdict from typing import (TYPE_CHECKING, Dict, List, Literal, Optional, Sequence, - Tuple, Union) + Tuple, Union, TypeVar, Any, Generator) import numpy as np import shapely.geometry as geom import torch import torch.nn.functional as F -from PIL import Image +from PIL import Image, ImageDraw from scipy.ndimage import (binary_erosion, distance_transform_cdt, - gaussian_filter, maximum_filter) + gaussian_filter, maximum_filter, affine_transform) from scipy.signal import convolve2d from scipy.spatial.distance import pdist, squareform from shapely.ops import nearest_points, unary_union @@ -38,15 +38,18 @@ subdivide_polygon) from skimage.morphology import skeletonize from skimage.transform import (AffineTransform, PiecewiseAffineTransform, - SimilarityTransform, warp) + warp) from kraken.lib import default_specs from kraken.lib.exceptions import KrakenInputException if TYPE_CHECKING: - from kraken.containers import Segmentation + from kraken.containers import Segmentation, BBoxLine, BaselineLine from kraken.lib.vgsl import TorchVGSLModel + +_T_pil_or_np = TypeVar('_T_pil_or_np', Image.Image, np.ndarray) + logger = logging.getLogger('kraken') __all__ = ['reading_order', @@ -356,8 +359,6 @@ def vectorize_regions(im: np.ndarray, threshold: float = 0.5): labelled = label(bin) boundaries = [] for x in regionprops(labelled): - if x.area < 32: - continue boundary = boundary_tracing(x) if len(boundary) > 2: boundaries.append(geom.Polygon(boundary)) @@ -371,19 +372,32 @@ def vectorize_regions(im: np.ndarray, threshold: float = 0.5): return [np.array(x.coords, dtype=np.uint)[:, [1, 0]].tolist() for x in boundaries] -def _rotate(image, angle, center, scale, cval=0): +def _rotate(image: _T_pil_or_np, + angle: float, + center: Any, + scale: float, + cval: int = 0, + order: int = 0) -> Tuple[AffineTransform, _T_pil_or_np]: """ - Rotate function taken mostly from scikit image. Main difference is that - this one allows dimensional scaling and records the final translation - to ensure no image content is lost. This is needed to rotate the seam - back into the original image. + Rotate an image at an angle with optional scaling + Args: + image (PIL.Image.Image or (H, W, C) np.ndarray): Input image + angle (float): Angle in radians + center (tuple): unused + scale (float): x-Axis scaling factor + cval (int): Padding value + order (int): Interpolation order + Returns: + A tuple containing the transformation matrix and the rotated image. + Note: this function is much faster applied on PIL images than on numpy ndarrays. """ - rows, cols = image.shape[0], image.shape[1] - tform1 = SimilarityTransform(translation=center) - tform2 = SimilarityTransform(rotation=angle) - tform3 = SimilarityTransform(translation=-center) - tform4 = AffineTransform(scale=(1/scale, 1)) - tform = tform4 + tform3 + tform2 + tform1 + if isinstance(image, Image.Image): + rows, cols = image.height, image.width + else: + rows, cols = image.shape[:2] + assert len(image.shape) == 3 or len(image.shape) == 2, 'Image must be 2D or 3D' + + tform = AffineTransform(rotation=angle, scale=(1/scale, 1)) corners = np.array([ [0, 0], [0, rows - 1], @@ -397,13 +411,25 @@ def _rotate(image, angle, center, scale, cval=0): maxr = corners[:, 1].max() out_rows = maxr - minr + 1 out_cols = maxc - minc + 1 - output_shape = np.around((out_rows, out_cols)) + output_shape = tuple(int(o) for o in np.around((out_rows, out_cols))) # fit output image in new shape - translation = (minc, minr) - tform5 = SimilarityTransform(translation=translation) - tform = tform5 + tform - tform.params[2] = (0, 0, 1) - return tform, warp(image, tform, output_shape=output_shape, order=0, cval=cval, clip=False, preserve_range=True) + translation = tform([[minc, minr]]) + tform = AffineTransform(rotation=angle, scale=(1/scale, 1), translation=[f for f in translation.flatten()]) + + if isinstance(image, Image.Image): + # PIL is much faster than scipy + pdata = tform.params.flatten().tolist()[:6] + resample = {0: Image.NEAREST, 1: Image.BILINEAR, 2: Image.BICUBIC, 3: Image.BICUBIC}.get(order, Image.NEAREST) + return tform, image.transform(output_shape[::-1], Image.AFFINE, data=pdata, resample=resample, fillcolor=cval) + + # params for scipy + # swap X and Y axis for scipy + pdata = tform.params.copy()[[1, 0, 2], :][:, [1, 0, 2]] + # we copy the translation vector + offset = pdata[:2, 2].copy() + # scipy expects a 3x3 *linear* matrix (to include channel axis), we don't want the channel axis to be modified + pdata[:2, 2] = 0 + return tform, affine_transform(image, pdata, offset=(*offset, 0), output_shape=(*output_shape, *image.shape[2:]), cval=cval, order=order) def line_regions(line, regions): @@ -458,7 +484,6 @@ def _calc_seam(baseline, polygon, angle, im_feats, bias=150): level. """ MASK_VAL = 99999 - r, c = draw.polygon(polygon[:, 1], polygon[:, 0]) c_min, c_max = int(polygon[:, 0].min()), int(polygon[:, 0].max()) r_min, r_max = int(polygon[:, 1].min()), int(polygon[:, 1].max()) patch = im_feats[r_min:r_max+2, c_min:c_max+2].copy() @@ -472,8 +497,7 @@ def _calc_seam(baseline, polygon, angle, im_feats, bias=150): mask[line_locs] = 0 dist_bias = distance_transform_cdt(mask) # absolute mask - mask = np.ones_like(patch, dtype=bool) - mask[r-r_min, c-c_min] = False + mask = np.array(make_polygonal_mask(polygon-(r_min, c_min)), patch.shape[1::-1]) > 128 # dilate mask to compensate for aliasing during rotation mask = binary_erosion(mask, border_value=True, iterations=2) # combine weights with features @@ -1025,7 +1049,99 @@ def compute_polygon_section(baseline: Sequence[Tuple[int, int]], return tuple(o) -def extract_polygons(im: Image.Image, bounds: 'Segmentation') -> Image.Image: +def _bevelled_warping_envelope(baseline: np.ndarray, + output_bl_start: Tuple[float, float], + output_shape: Tuple[int, int]) -> Tuple[List[Tuple[int, int]], List[Tuple[int, int]]]: + """ + Calculates the source and target envelope for a piecewise affine transform + """ + def _as_int_tuple(x): + return tuple(int(i) for i in x) + + envelope_dy = [-output_bl_start[1], output_shape[0] - output_bl_start[1]] + diff_bl = np.diff(baseline, axis=0) + diff_bl_normed = diff_bl / np.linalg.norm(diff_bl, axis=1)[:, None] + l_bl = len(baseline) + cum_lens = np.cumsum([0] + np.linalg.norm(diff_bl, axis=1).tolist()) + + bl_seg_normals = np.array([-diff_bl_normed[:, 1], diff_bl_normed[:, 0]]).T + ini_point = baseline[0] - diff_bl_normed[0] * output_bl_start[0] + source_envelope = [ + _as_int_tuple(ini_point + envelope_dy[0]*bl_seg_normals[0]), + _as_int_tuple(ini_point + envelope_dy[1]*bl_seg_normals[0]), + ] + target_envelope = [ + (0, 0), + (0, output_shape[0]) + ] + MAX_BEVEL_WIDTH = output_shape[0] / 3 + BEVEL_STEP_WIDTH = MAX_BEVEL_WIDTH / 2 + + for k in range(l_bl-2): + pt = baseline[k+1] + seg_prev = baseline[k] - pt + seg_next = baseline[k+2] - pt + bevel_prev = seg_prev / max(2., np.linalg.norm(seg_prev) / MAX_BEVEL_WIDTH) + bevel_next = seg_next / max(2., np.linalg.norm(seg_next) / MAX_BEVEL_WIDTH) + bevel_nsteps = max(1, np.round((np.linalg.norm(bevel_prev) + np.linalg.norm(bevel_next)) / BEVEL_STEP_WIDTH)) + l_prev = np.linalg.norm(bevel_prev) + l_next = np.linalg.norm(bevel_next) + for i in range(int(bevel_nsteps)+1): + # bezier interp + t = i / bevel_nsteps + tpt = pt + (1-t)**2 * bevel_prev + t**2 * bevel_next + tx = output_bl_start[0] + cum_lens[k+1] - (1-t)**2 * l_prev + t**2 * l_next + tnormal = (1-t) * bl_seg_normals[k] + t * bl_seg_normals[k+1] + tnormal /= np.linalg.norm(tnormal) + source_points = [_as_int_tuple(tpt + envelope_dy[0]*tnormal), _as_int_tuple(tpt + envelope_dy[1]*tnormal)] + target_points = [(int(tx), 0), (int(tx), output_shape[0])] + # avoid duplicate points leading to singularities + if source_points[0] == source_envelope[-2] or source_points[1] == source_envelope[-1] or target_points[0] == target_envelope[-2]: + continue + source_envelope += source_points + target_envelope += target_points + + end_point = baseline[-1] + diff_bl_normed[-1]*(output_shape[1]-cum_lens[-1]-output_bl_start[0]) + source_envelope += [ + end_point + envelope_dy[0]*bl_seg_normals[-1], + end_point + envelope_dy[1]*bl_seg_normals[-1], + ] + target_envelope += [ + (output_shape[1], 0), + (output_shape[1], output_shape[0]) + ] + return source_envelope, target_envelope + + +def make_polygonal_mask(polygon: np.ndarray, shape: Tuple[int, int]) -> Image.Image: + """ + Creates a mask from a polygon. + + Args: + polygon: A polygon as a list of points. + shape: The shape of the mask to create. + + Returns: + A PIL.Image.Image instance containing the mask. + """ + mask = Image.new('L', shape, 0) + ImageDraw.Draw(mask).polygon([tuple(p) for p in polygon.astype(int).tolist()], fill=255, width=2) + return mask + + +def apply_polygonal_mask(img: Image.Image, polygon: np.ndarray, cval: int = 0) -> Image.Image: + """ + Extract the polygonal mask of an image. + """ + mask = make_polygonal_mask(polygon, img.size) + out = Image.new(img.mode, (img.width, img.height), cval) + out.paste(img, mask=mask) + return out + + +def extract_polygons(im: Image.Image, + bounds: "Segmentation", + legacy: bool = False) -> Generator[Tuple[Image.Image, Union["BBoxLine", "BaselineLine"],], None, None]: """ Yields the subimages of image im defined in the list of bounding polygons with baselines preserving order. @@ -1034,9 +1150,10 @@ def extract_polygons(im: Image.Image, bounds: 'Segmentation') -> Image.Image: im: Input image bounds: A Segmentation class containing a bounding box or baseline segmentation. + legacy: Use the old, slow, and deprecated path Yields: - The extracted subimage + The extracted subimage, and the corresponding bounding box or baseline """ if bounds.type == 'baselines': # select proper interpolation scheme depending on shape @@ -1045,7 +1162,6 @@ def extract_polygons(im: Image.Image, bounds: 'Segmentation') -> Image.Image: im = im.convert('L') else: order = 1 - im = np.array(im) for line in bounds.lines: if line.boundary is None: @@ -1055,85 +1171,170 @@ def extract_polygons(im: Image.Image, bounds: 'Segmentation') -> Image.Image: c_min, c_max = int(pl[:, 0].min()), int(pl[:, 0].max()) r_min, r_max = int(pl[:, 1].min()), int(pl[:, 1].max()) - if (pl < 0).any() or (pl.max(axis=0)[::-1] >= im.shape[:2]).any(): + imshape = np.array([im.height, im.width]) + + if (pl < 0).any() or (pl.max(axis=0)[::-1] >= imshape).any(): raise KrakenInputException('Line polygon outside of image bounds') - if (baseline < 0).any() or (baseline.max(axis=0)[::-1] >= im.shape[:2]).any(): + if (baseline < 0).any() or (baseline.max(axis=0)[::-1] >= imshape).any(): raise KrakenInputException('Baseline outside of image bounds') - # fast path for straight baselines requiring only rotation - if len(baseline) == 2: - baseline = baseline.astype(float) - # calculate direction vector - lengths = np.linalg.norm(np.diff(baseline.T), axis=0) - p_dir = np.mean(np.diff(baseline.T) * lengths/lengths.sum(), axis=1) - p_dir = (p_dir.T / np.sqrt(np.sum(p_dir**2, axis=-1))) - angle = np.arctan2(p_dir[1], p_dir[0]) - patch = im[r_min:r_max+1, c_min:c_max+1].copy() - offset_polygon = pl - (c_min, r_min) - r, c = draw.polygon(offset_polygon[:, 1], offset_polygon[:, 0]) - mask = np.zeros(patch.shape[:2], dtype=bool) - mask[r, c] = True - patch[np.invert(mask)] = 0 - extrema = offset_polygon[(0, -1), :] - # scale line image to max 600 pixel width - tform, rotated_patch = _rotate(patch, angle, center=extrema[0], scale=1.0, cval=0) - i = Image.fromarray(rotated_patch.astype('uint8')) - # normal slow path with piecewise affine transformation - else: - if len(pl) > 50: - pl = approximate_polygon(pl, 2) - full_polygon = subdivide_polygon(pl, preserve_ends=True) - pl = geom.MultiPoint(full_polygon) - - bl = zip(baseline[:-1:], baseline[1::]) - bl = [geom.LineString(x) for x in bl] - cum_lens = np.cumsum([0] + [line.length for line in bl]) - # distance of intercept from start point and number of line segment - control_pts = [] - for point in pl.geoms: - npoint = np.array(point.coords)[0] - line_idx, dist, intercept = min(((idx, line.project(point), - np.array(line.interpolate(line.project(point)).coords)) for idx, line in enumerate(bl)), - key=lambda x: np.linalg.norm(npoint-x[2])) - # absolute distance from start of line - line_dist = cum_lens[line_idx] + dist - intercept = np.array(intercept) - # side of line the point is at - side = np.linalg.det(np.array([[baseline[line_idx+1][0]-baseline[line_idx][0], - npoint[0]-baseline[line_idx][0]], - [baseline[line_idx+1][1]-baseline[line_idx][1], - npoint[1]-baseline[line_idx][1]]])) - side = np.sign(side) - # signed perpendicular distance from the rectified distance - per_dist = side * np.linalg.norm(npoint-intercept) - control_pts.append((line_dist, per_dist)) - # calculate baseline destination points - bl_dst_pts = baseline[0] + np.dstack((cum_lens, np.zeros_like(cum_lens)))[0] - # calculate bounding polygon destination points - pol_dst_pts = np.array([baseline[0] + (line_dist, per_dist) for line_dist, per_dist in control_pts]) - # extract bounding box patch - c_dst_min, c_dst_max = int(pol_dst_pts[:, 0].min()), int(pol_dst_pts[:, 0].max()) - r_dst_min, r_dst_max = int(pol_dst_pts[:, 1].min()), int(pol_dst_pts[:, 1].max()) - output_shape = np.around((r_dst_max - r_dst_min + 1, c_dst_max - c_dst_min + 1)) - patch = im[r_min:r_max+1, c_min:c_max+1].copy() - # offset src points by patch shape - offset_polygon = full_polygon - (c_min, r_min) - offset_baseline = baseline - (c_min, r_min) - # offset dst point by dst polygon shape - offset_bl_dst_pts = bl_dst_pts - (c_dst_min, r_dst_min) - offset_pol_dst_pts = pol_dst_pts - (c_dst_min, r_dst_min) - # mask out points outside bounding polygon - mask = np.zeros(patch.shape[:2], dtype=bool) - r, c = draw.polygon(offset_polygon[:, 1], offset_polygon[:, 0]) - mask[r, c] = True - patch[np.invert(mask)] = 0 - # estimate piecewise transform - src_points = np.concatenate((offset_baseline, offset_polygon)) - dst_points = np.concatenate((offset_bl_dst_pts, offset_pol_dst_pts)) - tform = PiecewiseAffineTransform() - tform.estimate(src_points, dst_points) - o = warp(patch, tform.inverse, output_shape=output_shape, preserve_range=True, order=order) - i = Image.fromarray(o.astype('uint8')) + if legacy: + im = np.array(im) + # Old, slow, and deprecated path + # fast path for straight baselines requiring only rotation + if len(baseline) == 2: + baseline = baseline.astype(float) + # calculate direction vector + lengths = np.linalg.norm(np.diff(baseline.T), axis=0) + p_dir = np.mean(np.diff(baseline.T) * lengths/lengths.sum(), axis=1) + p_dir = (p_dir.T / np.sqrt(np.sum(p_dir**2, axis=-1))) + angle = np.arctan2(p_dir[1], p_dir[0]) + patch = im[r_min:r_max+1, c_min:c_max+1].copy() + offset_polygon = pl - (c_min, r_min) + r, c = draw.polygon(offset_polygon[:, 1], offset_polygon[:, 0]) + mask = np.zeros(patch.shape[:2], dtype=bool) + mask[r, c] = True + patch[np.invert(mask)] = 0 + extrema = offset_polygon[(0, -1), :] + # scale line image to max 600 pixel width + tform, rotated_patch = _rotate(patch, angle, center=extrema[0], scale=1.0, cval=0) + i = Image.fromarray(rotated_patch.astype('uint8')) + # normal slow path with piecewise affine transformation + else: + if len(pl) > 50: + pl = approximate_polygon(pl, 2) + full_polygon = subdivide_polygon(pl, preserve_ends=True) + pl = geom.MultiPoint(full_polygon) + + bl = zip(baseline[:-1:], baseline[1::]) + bl = [geom.LineString(x) for x in bl] + cum_lens = np.cumsum([0] + [line.length for line in bl]) + # distance of intercept from start point and number of line segment + control_pts = [] + for point in pl.geoms: + npoint = np.array(point.coords)[0] + line_idx, dist, intercept = min(((idx, line.project(point), + np.array(line.interpolate(line.project(point)).coords)) for idx, line in enumerate(bl)), + key=lambda x: np.linalg.norm(npoint-x[2])) + # absolute distance from start of line + line_dist = cum_lens[line_idx] + dist + intercept = np.array(intercept) + # side of line the point is at + side = np.linalg.det(np.array([[baseline[line_idx+1][0]-baseline[line_idx][0], + npoint[0]-baseline[line_idx][0]], + [baseline[line_idx+1][1]-baseline[line_idx][1], + npoint[1]-baseline[line_idx][1]]])) + side = np.sign(side) + # signed perpendicular distance from the rectified distance + per_dist = side * np.linalg.norm(npoint-intercept) + control_pts.append((line_dist, per_dist)) + # calculate baseline destination points + bl_dst_pts = baseline[0] + np.dstack((cum_lens, np.zeros_like(cum_lens)))[0] + # calculate bounding polygon destination points + pol_dst_pts = np.array([baseline[0] + (line_dist, per_dist) for line_dist, per_dist in control_pts]) + # extract bounding box patch + c_dst_min, c_dst_max = int(pol_dst_pts[:, 0].min()), int(pol_dst_pts[:, 0].max()) + r_dst_min, r_dst_max = int(pol_dst_pts[:, 1].min()), int(pol_dst_pts[:, 1].max()) + output_shape = np.around((r_dst_max - r_dst_min + 1, c_dst_max - c_dst_min + 1)) + patch = im[r_min:r_max+1, c_min:c_max+1].copy() + # offset src points by patch shape + offset_polygon = full_polygon - (c_min, r_min) + offset_baseline = baseline - (c_min, r_min) + # offset dst point by dst polygon shape + offset_bl_dst_pts = bl_dst_pts - (c_dst_min, r_dst_min) + offset_pol_dst_pts = pol_dst_pts - (c_dst_min, r_dst_min) + # mask out points outside bounding polygon + mask = np.zeros(patch.shape[:2], dtype=bool) + r, c = draw.polygon(offset_polygon[:, 1], offset_polygon[:, 0]) + mask[r, c] = True + patch[np.invert(mask)] = 0 + # estimate piecewise transform + src_points = np.concatenate((offset_baseline, offset_polygon)) + dst_points = np.concatenate((offset_bl_dst_pts, offset_pol_dst_pts)) + tform = PiecewiseAffineTransform() + tform.estimate(src_points, dst_points) + o = warp(patch, tform.inverse, output_shape=output_shape, preserve_range=True, order=order) + i = Image.fromarray(o.astype('uint8')) + + else: # if not legacy + # new, fast, and efficient path + # fast path for straight baselines requiring only rotation + if len(baseline) == 2: + baseline = baseline.astype(float) + # calculate direction vector + lengths = np.linalg.norm(np.diff(baseline.T), axis=0) + p_dir = np.mean(np.diff(baseline.T) * lengths/lengths.sum(), axis=1) + p_dir = (p_dir.T / np.sqrt(np.sum(p_dir**2, axis=-1))) + angle = np.arctan2(p_dir[1], p_dir[0]) + # crop out bounding box + patch = im.crop((c_min, r_min, c_max+1, r_max+1)) + offset_polygon = pl - (c_min, r_min) + patch = apply_polygonal_mask(patch, offset_polygon, cval=0) + extrema = offset_polygon[(0, -1), :] + tform, i = _rotate(patch, angle, center=extrema[0], scale=1.0, cval=0, order=order) + # normal slow path with piecewise affine transformation + else: + if len(pl) > 50: + pl = approximate_polygon(pl, 2) + full_polygon = subdivide_polygon(pl, preserve_ends=True) + + # baseline segment vectors + diff_bl = np.diff(baseline, axis=0) + diff_bl_norms = np.linalg.norm(diff_bl, axis=1) + diff_bl_normed = diff_bl / diff_bl_norms[:, None] + + l_poly = len(full_polygon) + cum_lens = np.cumsum([0] + np.linalg.norm(diff_bl, axis=1).tolist()) + + # calculate baseline destination points : + bl_dst_pts = baseline[0] + np.dstack((cum_lens, np.zeros_like(cum_lens)))[0] + + # calculate bounding polygon destination points : + # diff[k, p] = baseline[k] - polygon[p] + poly_bl_diff = full_polygon[None, :] - baseline[:-1, None] + # local x coordinates of polygon points on baseline segments + # x[k, p] = (baseline[k] - polygon[p]) . (baseline[k+1] - baseline[k]) / |baseline[k+1] - baseline[k]| + poly_bl_x = np.einsum('kpm,km->kp', poly_bl_diff, diff_bl_normed) + # distance to baseline segments + poly_bl_segdist = np.maximum(-poly_bl_x, poly_bl_x - diff_bl_norms[:, None]) + # closest baseline segment index + poly_closest_bl = np.argmin((poly_bl_segdist), axis=0) + poly_bl_x = poly_bl_x[poly_closest_bl, np.arange(l_poly)] + poly_bl_diff = poly_bl_diff[poly_closest_bl, np.arange(l_poly)] + # signed distance between polygon points and baseline segments (to get y coordinates) + poly_bl_y = np.cross(diff_bl_normed[poly_closest_bl], poly_bl_diff) + # final destination points + pol_dst_pts = np.array( + [cum_lens[poly_closest_bl] + poly_bl_x, poly_bl_y] + ).T + baseline[:1] + + # extract bounding box patch + c_dst_min, c_dst_max = int(pol_dst_pts[:, 0].min()), int(pol_dst_pts[:, 0].max()) + r_dst_min, r_dst_max = int(pol_dst_pts[:, 1].min()), int(pol_dst_pts[:, 1].max()) + output_shape = np.around((r_dst_max - r_dst_min + 1, c_dst_max - c_dst_min + 1)) + patch = im.crop((c_min, r_min, c_max+1, r_max+1)) + # offset src points by patch shape + offset_polygon = full_polygon - (c_min, r_min) + offset_baseline = baseline - (c_min, r_min) + # offset dst point by dst polygon shape + offset_bl_dst_pts = bl_dst_pts - (c_dst_min, r_dst_min) + # mask out points outside bounding polygon + patch = apply_polygonal_mask(patch, offset_polygon, cval=0) + + # estimate piecewise transform by beveling angles + source_envelope, target_envelope = _bevelled_warping_envelope(offset_baseline, offset_bl_dst_pts[0], output_shape) + # mesh for PIL, as (box, quad) tuples : box is (NW, SE) and quad is (NW, SW, SE, NE) + deform_mesh = [ + ( + (*target_envelope[i], *target_envelope[i+3]), + (*source_envelope[i], *source_envelope[i+1], *source_envelope[i+3], *source_envelope[i+2]) + ) + for i in range(0, len(source_envelope)-3, 2) + ] + # warp + resample = {0: Image.NEAREST, 1: Image.BILINEAR, 2: Image.BICUBIC, 3: Image.BICUBIC}.get(order, Image.NEAREST) + i = patch.transform((output_shape[1], output_shape[0]), Image.MESH, data=deform_mesh, resample=resample) + yield i.crop(i.getbbox()), line else: if bounds.text_direction.startswith('vertical'): diff --git a/kraken/lib/train.py b/kraken/lib/train.py index 1ba45eb00..da1f4ff79 100644 --- a/kraken/lib/train.py +++ b/kraken/lib/train.py @@ -20,6 +20,7 @@ import warnings from typing import (TYPE_CHECKING, Any, Callable, Dict, Literal, Optional, Sequence, Union) +from functools import partial import numpy as np import pytorch_lightning as pl @@ -216,7 +217,8 @@ def __init__(self, force_binarization: bool = False, format_type: Literal['path', 'alto', 'page', 'xml', 'binary'] = 'path', codec: Optional[Dict] = None, - resize: Literal['fail', 'both', 'new', 'add', 'union'] = 'fail'): + resize: Literal['fail', 'both', 'new', 'add', 'union'] = 'fail', + legacy_polygons: bool = False): """ A LightningModule encapsulating the training setup for a text recognition model. @@ -233,6 +235,7 @@ def __init__(self, **kwargs: Setup parameters, i.e. CLI parameters of the train() command. """ super().__init__() + self.legacy_polygons = legacy_polygons hyper_params_ = default_specs.RECOGNITION_HYPER_PARAMS.copy() if model: logger.info(f'Loading existing model from {model} ') @@ -284,7 +287,7 @@ def __init__(self, if binary_dataset_split: logger.warning('Internal binary dataset splits are enabled but using non-binary dataset files. Will be ignored.') binary_dataset_split = False - DatasetClass = PolygonGTDataset + DatasetClass = partial(PolygonGTDataset, legacy_polygons=legacy_polygons) valid_norm = False elif format_type == 'binary': DatasetClass = ArrowIPCRecognitionDataset @@ -314,7 +317,7 @@ def __init__(self, # format_type is None. Determine training type from container class types elif not format_type: if training_data[0].type == 'baselines': - DatasetClass = PolygonGTDataset + DatasetClass = partial(PolygonGTDataset, legacy_polygons=legacy_polygons) valid_norm = False else: if force_binarization: @@ -375,6 +378,7 @@ def __init__(self, logger.debug('Setting multiprocessing tensor sharing strategy to file_system') torch.multiprocessing.set_sharing_strategy('file_system') + val_set = None if evaluation_data: train_set = self._build_dataset(DatasetClass, training_data) self.train_set = Subset(train_set, range(len(train_set))) @@ -399,6 +403,19 @@ def __init__(self, raise ValueError('No valid training data was provided to the train ' 'command. Please add valid XML, line, or binary data.') + if format_type == 'binary': + legacy_train_status = train_set.legacy_polygons_status + if val_set and val_set.legacy_polygons_status != legacy_train_status: + logger.warning( + f'Train and validation set have different legacy polygon status: {legacy_train_status} and {val_set.legacy_polygons_status}.' + 'Train set status prevails.') + if legacy_train_status == "mixed": + logger.warning('Mixed legacy polygon status in training dataset. Consider recompilation.') + legacy_train_status = False + if legacy_polygons != legacy_train_status: + logger.warning(f'Setting dataset legacy polygon status to {legacy_train_status} based on training set.') + self.legacy_polygons = legacy_train_status + logger.info(f'Training set {len(self.train_set)} lines, validation set ' f'{len(self.val_set)} lines, alphabet {len(train_set.alphabet)} ' 'symbols') @@ -592,6 +609,7 @@ def setup(self, stage: Optional[str] = None): logger.info(f'Creating new model {self.spec} with {self.train_set.dataset.codec.max_label+1} outputs') self.spec = '[{} O1c{}]'.format(self.spec[1:-1], self.train_set.dataset.codec.max_label + 1) self.nn = vgsl.TorchVGSLModel(self.spec) + self.nn.use_legacy_polygons = self.legacy_polygons # initialize weights self.nn.init_weights() self.nn.add_codec(self.train_set.dataset.codec) diff --git a/kraken/lib/vgsl.py b/kraken/lib/vgsl.py index 9d1cfc6cc..93a7d0cb3 100644 --- a/kraken/lib/vgsl.py +++ b/kraken/lib/vgsl.py @@ -140,7 +140,8 @@ def __init__(self, spec: str) -> None: 'seg_type': None, 'one_channel_mode': None, 'model_type': None, - 'hyper_params': {}} + 'hyper_params': {}, + 'legacy_polygons': False} # enable new polygons by default on new models self._aux_layers = nn.ModuleDict() self.idx = -1 @@ -311,7 +312,8 @@ def _deserialize_layers(name, layer): 'seg_type': 'bbox', 'one_channel_mode': '1', 'model_type': None, - 'hyper_params': {}} + 'hyper_params': {}, + 'legacy_polygons': True} # disable new polygons by default on load if 'kraken_meta' in mlmodel.user_defined_metadata: nn.user_metadata.update(json.loads(mlmodel.user_defined_metadata['kraken_meta'])) @@ -363,6 +365,14 @@ def aux_layers(self, **kwargs): def aux_layers(self, val: Dict[str, torch.nn.Module]): self._aux_layers.update(val) + @property + def use_legacy_polygons(self): + return self.user_metadata.get('legacy_polygons', True) + + @use_legacy_polygons.setter + def use_legacy_polygons(self, val: bool): + self.user_metadata['legacy_polygons'] = val + def save_model(self, path: str): """ Serializes the model into path. diff --git a/kraken/rpred.py b/kraken/rpred.py index 96dff4fdd..d41a11f67 100644 --- a/kraken/rpred.py +++ b/kraken/rpred.py @@ -24,6 +24,7 @@ from functools import partial from typing import (TYPE_CHECKING, Dict, Generator, List, Optional, Sequence, Tuple, Union) +import warnings from kraken.containers import BaselineOCRRecord, BBoxOCRRecord, ocr_record from kraken.lib.dataset import ImageInputTransforms @@ -52,7 +53,8 @@ def __init__(self, bounds: 'Segmentation', pad: int = 16, bidi_reordering: Union[bool, str] = True, - tags_ignore: Optional[List[Tuple[str, str]]] = None) -> Generator[ocr_record, None, None]: + tags_ignore: Optional[List[Tuple[str, str]]] = None, + no_legacy_polygons: bool = False) -> Generator[ocr_record, None, None]: """ Multi-model version of kraken.rpred.rpred. @@ -159,6 +161,7 @@ def __init__(self, self.pad = pad self.bounds = bounds self.tags_ignore = tags_ignore + self.no_legacy_polygons = no_legacy_polygons def _recognize_box_line(self, line): xmin, ymin, xmax, ymax = line.bbox @@ -175,8 +178,10 @@ def _recognize_box_line(self, line): tag, net = self._resolve_tags_to_model(line.tags, self.nets) + use_legacy_polygons = self._choose_legacy_polygon_extractor(net) + seg = dataclasses.replace(self.bounds, lines=[line]) - box, coords = next(extract_polygons(self.im, seg)) + box, coords = next(extract_polygons(self.im, seg, legacy=use_legacy_polygons)) self.box = box # check if boxes are non-zero in any dimension @@ -242,14 +247,17 @@ def _recognize_baseline_line(self, line): seg = dataclasses.replace(self.bounds, lines=[line]) + tag, net = self._resolve_tags_to_model(line.tags, self.nets) + + use_legacy_polygons = self._choose_legacy_polygon_extractor(net) + try: - box, coords = next(extract_polygons(self.im, seg)) + box, coords = next(extract_polygons(self.im, seg, legacy=use_legacy_polygons)) except KrakenInputException as e: logger.warning(f'Extracting line failed: {e}') return BaselineOCRRecord('', [], [], line) self.box = box - tag, net = self._resolve_tags_to_model(line.tags, self.nets) # check if boxes are non-zero in any dimension if 0 in box.size: logger.warning(f'{line} with zero dimension. Emitting empty record.') @@ -299,13 +307,26 @@ def __len__(self): def _scale_val(self, val, min_val, max_val): return int(round(min(max(((val*self.net_scale)-self.pad)*self.in_scale, min_val), max_val-1))) + + def _choose_legacy_polygon_extractor(self, net) -> bool: + # grouping the checks here to display warnings only once + if net.nn.use_legacy_polygons: + if self.no_legacy_polygons: + warnings.warn('Enforcing use of the new polygon extractor for models trained with old version. Accuracy may be affected.') + return False + else: + warnings.warn('Using legacy polygon extractor, as the model was not trained with the new method. Please retrain your model to get speed improvement.') + return True + return False + def rpred(network: 'TorchSeqRecognizer', im: 'Image.Image', bounds: 'Segmentation', pad: int = 16, - bidi_reordering: Union[bool, str] = True) -> Generator[ocr_record, None, None]: + bidi_reordering: Union[bool, str] = True, + no_legacy_polygons: bool = False) -> Generator[ocr_record, None, None]: """ Uses a TorchSeqRecognizer and a segmentation to recognize text @@ -325,7 +346,7 @@ def rpred(network: 'TorchSeqRecognizer', An ocr_record containing the recognized text, absolute character positions, and confidence values for each character. """ - return mm_rpred(defaultdict(lambda: network), im, bounds, pad, bidi_reordering) + return mm_rpred(defaultdict(lambda: network), im, bounds, pad, bidi_reordering, no_legacy_polygons=no_legacy_polygons) def _resolve_tags_to_model(tags: Optional[Sequence[Dict[str, str]]], diff --git a/tests/resources/170025120000003,0074-lite.xml b/tests/resources/170025120000003,0074-lite.xml new file mode 100644 index 000000000..504794e0f --- /dev/null +++ b/tests/resources/170025120000003,0074-lite.xml @@ -0,0 +1,89 @@ + + + + TRP + 2016-06-16T16:57:15.027+02:00 + 2018-07-04T17:25:44.389+02:00 + + + + + + + + + + + + + + + + + $pag:39 + + + + $pag:39 + + + + + + + + + $-nor su hijo, De todos sus bienes, con los pactos + + + + + + + y salvedades alli expressadas; Y fue acetada; + + + + + + + y assi mismo el dho$.dicho $ofi:Patron $ant:Miguel $ant:Carreras, + + + + + + + y el $ofi:Rndo$.Reverendo $ant:Miguel $ant:Carreras $ofi:pbro$.presbítero residente en la + + + + $-nor su hijo, De todos sus bienes, con los pactos +y salvedades alli expressadas; Y fue acetada; +y assi mismo el dho$.dicho $ofi:Patron $ant:Miguel $ant:Carreras, +y el $ofi:Rndo$.Reverendo $ant:Miguel $ant:Carreras $ofi:pbro$.presbítero residente en la +Parq.$^l$.Parroquial Igla$.Iglesia de dha$.dicha villa de $top:Canet Padre é, hijo +hizieron donacion a la dha$.dicha $ant:Anna $ant:Maria su +hija y hermana resp.$^e$.respectivamente por todos sus drôs$.derechos de le:$- +$-gitima Paterna, Materna y otros de ducientas$.doscientas +libras de moneda Bar$.barcelonesa; arca y vestidos corres:$- +$-pondientes, con promesa de pagar en esta +forma, ésto es arcas, ropas y joyas el dia de las +Bodas; cien libras del dia de la fecha, á, medio +año y las restantes cien libras del dho$.dicho dia de la +fecha á tres años prox.$^s$.proximos venturos bajo obli:$- +$-gacion de todos sus bienes; cuya dha$.dicha donacion +fue echa con el pacto revercional acos:$- +$-tumbrado; Y fue azetada por la dha$.dicha $ant:Anna +$ant:Maria por quien fue echa la diffinición cor:$- +$-respondiente de dhos$.dichos sus dros$.derechos a favor del dho$.dicho +su Padre y hermano resp.$^e$.respectivamente y salvose el de +futura sucession: Y en su consequencia hizo +la correspondiente constitucion dotal al +dho$.dicho $ant:Joseph $ant:Vancells su venidero esposo; y este +acetandola prometió en su caso restituir +bajo obligacion de todos sus bienes. + + + + diff --git a/tests/resources/overfit_newpoly.mlmodel b/tests/resources/overfit_newpoly.mlmodel new file mode 100644 index 0000000000000000000000000000000000000000..cb7b40aa9547f82c25be94202ef6c7cc7dca555e GIT binary patch literal 183424 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 R|BI8yZKWo#fBX_1_df%BnY#c0 literal 0 HcmV?d00001 diff --git a/tests/test_newpolygons.py b/tests/test_newpolygons.py new file mode 100644 index 000000000..ffa06d0fb --- /dev/null +++ b/tests/test_newpolygons.py @@ -0,0 +1,449 @@ +# -*- coding: utf-8 -*- + +from contextlib import contextmanager +import unittest +import tempfile +from unittest.mock import Mock, patch +from pathlib import Path +from traceback import print_exception +import warnings +from typing import Optional, List + +from PIL import Image + +from click.testing import CliRunner + +from kraken.containers import ( + BaselineLine, + BaselineOCRRecord, + BBoxLine, + BBoxOCRRecord, + Segmentation, +) +from kraken.lib import xml +from kraken.lib import segmentation +from kraken.lib.models import load_any +from kraken.rpred import mm_rpred, rpred +from kraken.kraken import cli as kraken_cli +from kraken.ketos import cli as ketos_cli +import re + +thisfile = Path(__file__).resolve().parent +resources = thisfile / "resources" + +def mock_extract_polygons(): + return Mock(side_effect=segmentation.extract_polygons) + +class TestNewPolygons(unittest.TestCase): + """ + Tests for the new polygon extraction method. + """ + + def setUp(self): + self.im = Image.open(resources / "bw.png") + self.old_model_path = str(resources / "overfit.mlmodel") + self.old_model = load_any(self.old_model_path) + self.new_model_path = str(resources / "overfit_newpoly.mlmodel") + self.new_model = load_any(self.new_model_path) + self.segmented_img = str(resources / "170025120000003,0074-lite.xml") + self.runner = CliRunner() + self.color_img = resources / "input.tif" + self.arrow_data = str(resources / "merge_tests/base.arrow") + self.simple_bl_seg = Segmentation( + type="baselines", + imagename=resources / "bw.png", + lines=[ + BaselineLine( + id="foo", + baseline=[[0, 10], [2543, 10]], + boundary=[[0, 0], [2543, 0], [2543, 155], [0, 155]], + ) + ], + text_direction="horizontal-lr", + script_detection=False, + ) + + ## RECIPES + + @patch("kraken.rpred.extract_polygons", new_callable=mock_extract_polygons) + def _test_rpred(self, extractor_mock: Mock, *, model, force_no_legacy: bool=False, expect_legacy: bool): + """ + Base recipe for testing rpred with a given model and polygon extraction method + """ + pred = rpred(model, self.im, self.simple_bl_seg, True, no_legacy_polygons=force_no_legacy) + _ = next(pred) + + extractor_mock.assert_called() + for cl in extractor_mock.mock_calls: + self.assertEqual(cl[2]["legacy"], expect_legacy) + + @patch("kraken.rpred.extract_polygons", new_callable=mock_extract_polygons) + def _test_krakencli(self, extractor_mock: Mock, *, args, force_no_legacy: bool=False, expect_legacy: bool,): + """ + Base recipe for testing kraken_cli with a given polygon extraction method + """ + if force_no_legacy: + args = ["--no-legacy-polygons"] + args + + result = self.runner.invoke(kraken_cli, args) + print("kraken", *args) + + if result.exception: + print_exception(result.exception) + + self.assertEqual(result.exit_code, 0) + extractor_mock.assert_called() + for cl in extractor_mock.mock_calls: + self.assertEqual(cl[2]["legacy"], expect_legacy) + + def _test_ketoscli(self, *, args, expect_legacy: bool, check_exit_code: Optional[int|List[int]]=0, patching_dir="kraken.lib.dataset.recognition"): + """ + Base recipe for testing ketos_cli with a given polygon extraction method + """ + with patch(patching_dir + ".extract_polygons", new_callable=mock_extract_polygons) as extractor_mock: + result = self.runner.invoke(ketos_cli, args) + + print("ketos", *args) + if result.exception: + print(result.output) + print_exception(result.exception) + + if check_exit_code is not None: + if isinstance(check_exit_code, int): + check_exit_code = [check_exit_code] + self.assertIn(result.exit_code, check_exit_code, "Command failed") + + extractor_mock.assert_called() + for cl in extractor_mock.mock_calls: + self.assertEqual(cl[2]["legacy"], expect_legacy) + + ## TESTS + + def test_rpred_from_old_model(self): + """ + Test rpred with old model, check that it uses legacy polygon extraction method + """ + self._test_rpred(model=self.old_model, force_no_legacy=False, expect_legacy=True) + + def test_rpred_from_old_model_force_new(self): + """ + Test rpred with old model, but disabling legacy polygons + """ + self._test_rpred(model=self.old_model, force_no_legacy=True, expect_legacy=False) + + def test_rpred_from_new_model(self): + """ + Test rpred with new model, check that it uses new polygon extraction method + """ + self._test_rpred(model=self.new_model, force_no_legacy=False, expect_legacy=False) + + + def test_krakencli_ocr_old_model(self): + """ + Test kraken_cli with old model, check that it uses legacy polygon extraction method + """ + with tempfile.NamedTemporaryFile() as fp: + self._test_krakencli( + args=['-f', 'xml', '-i', self.segmented_img, fp.name, 'ocr', '-m', self.old_model_path], + force_no_legacy=False, + expect_legacy=True, + ) + + def test_krakencli_ocr_old_model_force_new(self): + """ + Test kraken_cli with old model, check that it uses legacy polygon extraction method + """ + with tempfile.NamedTemporaryFile() as fp: + self._test_krakencli( + args=['-f', 'xml', '-i', self.segmented_img, fp.name, 'ocr', '-m', self.old_model_path], + force_no_legacy=True, + expect_legacy=False, + ) + + def test_krakencli_ocr_new_model(self): + """ + Test kraken_cli with new model, check that it uses new polygon extraction method + """ + with tempfile.NamedTemporaryFile() as fp: + self._test_krakencli( + args=['-f', 'xml', '-i', self.segmented_img, fp.name, 'ocr', '-m', self.new_model_path], + force_no_legacy=False, + expect_legacy=False, + ) + + + + def test_ketoscli_test_old_model(self): + """ + Test `ketos test` with old model, check that it uses legacy polygon extraction method + """ + self._test_ketoscli( + args=['test', '-m', self.old_model_path, '-f', 'xml', '--workers', '0', self.segmented_img], + expect_legacy=True, + ) + + def test_ketoscli_test_old_model_force_new(self): + """ + Test `ketos test` with old model, check that it does not use legacy polygon extraction method + """ + self._test_ketoscli( + args=['test', '--no-legacy-polygons', '-m', self.old_model_path, '-f', 'xml', '--workers', '0', self.segmented_img], + expect_legacy=False, + ) + + def test_ketoscli_test_new_model(self): + """ + Test `ketos test` with new model, check that it uses new polygon extraction method + """ + self._test_ketoscli( + args=['test', '-m', self.new_model_path, '-f', 'xml', '--workers', '0', self.segmented_img], + expect_legacy=False, + ) + + + def test_ketoscli_train_new_model(self): + """ + Test `ketos train` with new model, check that it uses new polygon extraction method + """ + with tempfile.TemporaryDirectory() as tempdir: + mfp = str(Path(tempdir) / "model") + fp = str(Path(tempdir) / "test.xml") + + self._test_ketoscli( + args=['train', '-f', 'xml', '-N', '1', '-q', 'fixed', '-o', mfp, '--workers', '0', self.segmented_img], + expect_legacy=False, + check_exit_code=[0, 1], # Model may not improve during training + ) + + self._test_krakencli( + args=['-f', 'xml', '-i', self.segmented_img, fp, 'ocr', '-m', mfp + "_0.mlmodel"], + expect_legacy=False, + ) + + def test_ketoscli_train_new_model_force_legacy(self): + """ + Test `ketos train` training new model, check that it uses legacy polygon extraction method if forced + """ + with tempfile.TemporaryDirectory() as tempdir: + mfp = str(Path(tempdir) / "model") + fp = str(Path(tempdir) / "test.xml") + + self._test_ketoscli( + args=['train', '--legacy-polygons', '-f', 'xml', '-N', '1', '-q', 'fixed', '-o', mfp, '--workers', '0', self.segmented_img], + expect_legacy=True, + check_exit_code=[0, 1], # Model may not improve during training + ) + + self._test_krakencli( + args=['-f', 'xml', '-i', self.segmented_img, fp, 'ocr', '-m', mfp + "_0.mlmodel"], + expect_legacy=True, + ) + + def test_ketoscli_train_old_model(self): + """ + Test `ketos train` finetuning old model, check that it uses new polygon extraction method + """ + with tempfile.TemporaryDirectory() as tempdir: + mfp = str(Path(tempdir) / "model") + fp = str(Path(tempdir) / "test.xml") + + self._test_ketoscli( + args=['train', '-f', 'xml', '-N', '1', '-q', 'fixed', '-i', self.old_model_path, '--resize', 'add', '-o', mfp, '--workers', '0', self.segmented_img], + expect_legacy=False, + check_exit_code=[0, 1], # Model may not improve during training + ) + self._test_krakencli( + args=['-f', 'xml', '-i', self.segmented_img, fp, 'ocr', '-m', mfp + "_0.mlmodel"], + expect_legacy=False, + ) + + def test_ketoscli_train_old_model_force_legacy(self): + """ + Test `ketos train` finetuning old model, check that it uses legacy polygon extraction method if forced + """ + with tempfile.TemporaryDirectory() as tempdir: + mfp = str(Path(tempdir) / "model") + fp = str(Path(tempdir) / "test.xml") + + self._test_ketoscli( + args=['train', '--legacy-polygons', '-f', 'xml', '-N', '1', '-q', 'fixed', '-i', self.old_model_path, '--resize', 'add', '-o', mfp, '--workers', '0', self.segmented_img], + expect_legacy=True, + check_exit_code=[0, 1], # Model may not improve during training + ) + self._test_krakencli( + args=['-f', 'xml', '-i', self.segmented_img, fp, 'ocr', '-m', mfp + "_0.mlmodel"], + expect_legacy=True, + ) + + + @unittest.expectedFailure + def test_ketoscli_pretrain_new_model(self): + """ + Test `ketos pretrain` with new model, check that it uses new polygon extraction method + """ + with tempfile.TemporaryDirectory() as tempdir: + mfp = str(Path(tempdir) / "model") + fp = str(Path(tempdir) / "test.xml") + + self._test_ketoscli( + args=['pretrain', '-f', 'xml', '-N', '1', '-q', 'fixed', '-o', mfp, '--workers', '0', self.segmented_img], + expect_legacy=False, + check_exit_code=[0, 1], # Model may not improve during training + ) + self._test_krakencli( + args=['-f', 'xml', '-i', self.segmented_img, fp, 'ocr', '-m', mfp + "_0.mlmodel"], + expect_legacy=False, + ) + + @unittest.expectedFailure + def test_ketoscli_pretrain_new_model_force_legacy(self): + """ + Test `ketos pretrain` with new model, check that it uses legacy polygon extraction method if forced + """ + with tempfile.TemporaryDirectory() as tempdir: + mfp = str(Path(tempdir) / "model") + fp = str(Path(tempdir) / "test.xml") + + self._test_ketoscli( + args=['pretrain', '--legacy-polygons', '-f', 'xml', '-N', '1', '-q', 'fixed', '-o', mfp, '--workers', '0', self.segmented_img], + expect_legacy=True, + check_exit_code=[0, 1], # Model may not improve during training + ) + + self._test_krakencli( + args=['-f', 'xml', '-i', self.segmented_img, fp, 'ocr', '-m', str(mfp) + "_0.mlmodel"], + expect_legacy=True, + ) + + @unittest.expectedFailure + def test_ketoscli_pretrain_old_model(self): + """ + Test `ketos pretrain` with old model, check that it uses new polygon extraction method + """ + with tempfile.TemporaryDirectory() as tempdir: + mfp = str(Path(tempdir) / "model") + fp = str(Path(tempdir) / "test.xml") + + self._test_ketoscli( + args=['pretrain', '-f', 'xml', '-N', '1', '-q', 'fixed', '-i', self.old_model_path, '--resize', 'add', '-o', mfp, '--workers', '0', self.segmented_img], + expect_legacy=False, + check_exit_code=[0, 1], # Model may not improve during training + ) + + self._test_krakencli( + args=['-f', 'xml', '-i', self.segmented_img, fp, 'ocr', '-m', mfp + "_0.mlmodel"], + expect_legacy=False, + ) + + + def _assertWarnsWhenTrainingArrow( + self, model: str, *dset: str, from_model: str|None=None, force_legacy: bool=False, + expect_warning_msgs: list[str]=[], expect_not_warning_msgs: list[str]=[]): + + args = ['-f', 'binary', '-N', '1', '-q', 'fixed', '-o', model, *dset] + if force_legacy: + args = ['--legacy-polygons'] + args + if from_model: + args = ['-i', from_model, '--resize', 'add'] + args + + print("ketos", 'train', *args) + run = self.runner.invoke(ketos_cli, ['train'] + args) + output = re.sub(r'\w+\.py:\d+\n', '', run.output) + output = re.sub(r'\s+', ' ', output) + for warning_msg in expect_warning_msgs: + self.assertIn(warning_msg, output, f"Expected warning '{warning_msg}' not found in output") + for warning_msg in expect_not_warning_msgs: + self.assertNotIn(warning_msg, output, f"Unexpected warning '{warning_msg}' found in output") + + def test_ketos_old_arrow_train_new(self): + """ + Test `ketos train`, on old arrow dataset, check that it raises a warning about polygon extraction method only if incoherent + """ + with tempfile.TemporaryDirectory() as tempdir: + mfp = str(Path(tempdir) / "model") + mfp2 = str(Path(tempdir) / "model2") + + self._assertWarnsWhenTrainingArrow(mfp, self.arrow_data, force_legacy=False, expect_warning_msgs=["WARNING Setting dataset legacy polygon status to True based on training set", "the new model will be flagged to use legacy"]) + self._assertWarnsWhenTrainingArrow(mfp2, self.arrow_data, force_legacy=True, expect_not_warning_msgs=["WARNING Setting dataset legacy polygon status to True based on training set", "the new model will be flagged to use legacy"]) + + def test_ketos_new_arrow(self): + """ + Test `ketos compile`, check that it uses new polygon extraction method + """ + with tempfile.TemporaryDirectory() as tempdir: + dset = str(Path(tempdir) / "dataset.arrow") + mfp = str(Path(tempdir) / "model") + mfp2 = str(Path(tempdir) / "model2") + + self._test_ketoscli( + args=['compile', '-f', 'xml', '-o', dset, self.segmented_img], + expect_legacy=False, + patching_dir="kraken.lib.arrow_dataset", + ) + + self._assertWarnsWhenTrainingArrow(mfp, dset, force_legacy=False, expect_not_warning_msgs=["WARNING Setting dataset legacy polygon status to False based on training set", "the new model will be flagged to use legacy"]) + self._assertWarnsWhenTrainingArrow(mfp2, dset, force_legacy=True, expect_warning_msgs=["WARNING Setting dataset legacy polygon status to False based on training set", "the new model will be flagged to use new"]) + + + def test_ketos_new_arrow_force_legacy(self): + """ + Test `ketos compile`, check that it uses old polygon extraction method + """ + with tempfile.TemporaryDirectory() as tempdir: + dset = str(Path(tempdir) / "dataset.arrow") + mfp = str(Path(tempdir) / "model") + mfp2 = str(Path(tempdir) / "model2") + + self._test_ketoscli( + args=['compile', '--legacy-polygons', '-f', 'xml', '-o', dset, self.segmented_img], + expect_legacy=True, + patching_dir="kraken.lib.arrow_dataset", + ) + + self._assertWarnsWhenTrainingArrow(mfp, dset, force_legacy=False, expect_warning_msgs=["WARNING Setting dataset legacy polygon status to True based on training set", "the new model will be flagged to use legacy"]) + self._assertWarnsWhenTrainingArrow(mfp2, dset, force_legacy=True, expect_not_warning_msgs=["WARNING Setting dataset legacy polygon status to True based on training set", "the new model will be flagged to use legacy"]) + + def test_ketos_old_arrow_old_model(self): + """ + Test `ketos train`, on old arrow dataset, check that it raises a warning about polygon extraction method only if incoherent + """ + with tempfile.TemporaryDirectory() as tempdir: + mfp = str(Path(tempdir) / "model") + mfp2 = str(Path(tempdir) / "model2") + + self._assertWarnsWhenTrainingArrow(mfp, self.arrow_data, from_model=self.old_model_path, force_legacy=False, expect_warning_msgs=["WARNING Setting dataset legacy polygon status to True based on training set"], expect_not_warning_msgs=["model will be flagged to use new"]) + self._assertWarnsWhenTrainingArrow(mfp2, self.arrow_data, from_model=self.old_model_path, force_legacy=True, expect_not_warning_msgs=["WARNING Setting dataset legacy polygon status to True based on training set", "model will be flagged to use new"]) + + def test_ketos_new_arrow_old_model(self): + """ + Test `ketos train`, on new arrow dataset, check that it raises a warning about polygon extraction method only if incoherent + """ + with tempfile.TemporaryDirectory() as tempdir: + dset = str(Path(tempdir) / "dataset.arrow") + mfp = str(Path(tempdir) / "model") + mfp2 = str(Path(tempdir) / "model2") + + self._test_ketoscli( + args=['compile', '-f', 'xml', '-o', dset, self.segmented_img], + expect_legacy=False, + patching_dir="kraken.lib.arrow_dataset", + ) + + self._assertWarnsWhenTrainingArrow(mfp, dset, from_model=self.old_model_path, force_legacy=False, expect_not_warning_msgs=["WARNING Setting dataset legacy polygon status to False based on training set"], expect_warning_msgs=["model will be flagged to use new"]) + self._assertWarnsWhenTrainingArrow(mfp2, dset, from_model=self.old_model_path, force_legacy=True, expect_warning_msgs=["WARNING Setting dataset legacy polygon status to False based on training set"], expect_not_warning_msgs=["model will be flagged to use new"]) + + def test_ketos_mixed_arrow_train_new(self): + """ + Test `ketos train`, on mixed arrow dataset, check that it raises a warning about polygon extraction method only if incoherent + """ + with tempfile.TemporaryDirectory() as tempdir: + dset = str(Path(tempdir) / "dataset.arrow") + mfp = str(Path(tempdir) / "model") + + self._test_ketoscli( + args=['compile', '-f', 'xml', '-o', dset, self.segmented_img, self.arrow_data], + expect_legacy=False, + patching_dir="kraken.lib.arrow_dataset", + ) + + self._assertWarnsWhenTrainingArrow(mfp, dset, self.arrow_data, force_legacy=True, expect_warning_msgs=["WARNING Mixed legacy polygon", "WARNING Setting dataset legacy polygon status to False based on training set"], expect_not_warning_msgs=["model will be flagged to use legacy"]) \ No newline at end of file From 761a2bf2cd3e0007cde429ac11b21a787fbaafc8 Mon Sep 17 00:00:00 2001 From: Benjamin Kiessling Date: Tue, 26 Mar 2024 11:02:36 +0100 Subject: [PATCH 13/76] python 3.9 compatibility --- tests/test_newpolygons.py | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/tests/test_newpolygons.py b/tests/test_newpolygons.py index ffa06d0fb..0c05256c5 100644 --- a/tests/test_newpolygons.py +++ b/tests/test_newpolygons.py @@ -7,7 +7,7 @@ from pathlib import Path from traceback import print_exception import warnings -from typing import Optional, List +from typing import Optional, List, Union from PIL import Image @@ -96,7 +96,7 @@ def _test_krakencli(self, extractor_mock: Mock, *, args, force_no_legacy: bool=F for cl in extractor_mock.mock_calls: self.assertEqual(cl[2]["legacy"], expect_legacy) - def _test_ketoscli(self, *, args, expect_legacy: bool, check_exit_code: Optional[int|List[int]]=0, patching_dir="kraken.lib.dataset.recognition"): + def _test_ketoscli(self, *, args, expect_legacy: bool, check_exit_code: Optional[Union[int, List[int]]] = 0, patching_dir="kraken.lib.dataset.recognition"): """ Base recipe for testing ketos_cli with a given polygon extraction method """ @@ -336,9 +336,13 @@ def test_ketoscli_pretrain_old_model(self): ) - def _assertWarnsWhenTrainingArrow( - self, model: str, *dset: str, from_model: str|None=None, force_legacy: bool=False, - expect_warning_msgs: list[str]=[], expect_not_warning_msgs: list[str]=[]): + def _assertWarnsWhenTrainingArrow(self, + model: str, + *dset: str, + from_model: Optional[str] = None, + force_legacy: bool = False, + expect_warning_msgs: List[str] = [], + expect_not_warning_msgs: List[str] = []): args = ['-f', 'binary', '-N', '1', '-q', 'fixed', '-o', model, *dset] if force_legacy: @@ -446,4 +450,4 @@ def test_ketos_mixed_arrow_train_new(self): patching_dir="kraken.lib.arrow_dataset", ) - self._assertWarnsWhenTrainingArrow(mfp, dset, self.arrow_data, force_legacy=True, expect_warning_msgs=["WARNING Mixed legacy polygon", "WARNING Setting dataset legacy polygon status to False based on training set"], expect_not_warning_msgs=["model will be flagged to use legacy"]) \ No newline at end of file + self._assertWarnsWhenTrainingArrow(mfp, dset, self.arrow_data, force_legacy=True, expect_warning_msgs=["WARNING Mixed legacy polygon", "WARNING Setting dataset legacy polygon status to False based on training set"], expect_not_warning_msgs=["model will be flagged to use legacy"]) From 5af9c8c6c13fd7bf16327ba40ccaa6d156c7e038 Mon Sep 17 00:00:00 2001 From: Benjamin Kiessling Date: Tue, 26 Mar 2024 11:48:24 +0100 Subject: [PATCH 14/76] Cleanup of PR #555 merge --- kraken/lib/dataset/recognition.py | 2 +- kraken/lib/dataset/segmentation.py | 1 - kraken/lib/pretrain/model.py | 7 ++++--- kraken/lib/pretrain/util.py | 2 +- kraken/lib/segmentation.py | 7 ++++--- kraken/lib/train.py | 7 ++++--- kraken/lib/vgsl.py | 6 +++--- tests/test_newpolygons.py | 6 +++--- 8 files changed, 20 insertions(+), 18 deletions(-) diff --git a/kraken/lib/dataset/recognition.py b/kraken/lib/dataset/recognition.py index fde975cc5..5f8744724 100644 --- a/kraken/lib/dataset/recognition.py +++ b/kraken/lib/dataset/recognition.py @@ -292,7 +292,7 @@ def __init__(self, reorder: Union[bool, Literal['L', 'R']] = True, im_transforms: Callable[[Any], torch.Tensor] = transforms.Compose([]), augmentation: bool = False, - legacy_polygons: bool=False) -> None: + legacy_polygons: bool = False) -> None: """ Creates a dataset for a polygonal (baseline) transcription model. diff --git a/kraken/lib/dataset/segmentation.py b/kraken/lib/dataset/segmentation.py index b52fe7ddc..a9f962226 100644 --- a/kraken/lib/dataset/segmentation.py +++ b/kraken/lib/dataset/segmentation.py @@ -165,7 +165,6 @@ def __getitem__(self, idx): im, target = self.transform(im, target) return {'image': im, 'target': target} except Exception: - raise self.failed_samples.add(idx) idx = np.random.randint(0, len(self.imgs)) logger.debug(traceback.format_exc()) diff --git a/kraken/lib/pretrain/model.py b/kraken/lib/pretrain/model.py index 68626cf49..d86d2a7c1 100644 --- a/kraken/lib/pretrain/model.py +++ b/kraken/lib/pretrain/model.py @@ -212,9 +212,10 @@ def __init__(self, if format_type == 'binary': legacy_train_status = train_set.legacy_polygons_status if val_set and val_set.legacy_polygons_status != legacy_train_status: - logger.warning( - f'Train and validation set have different legacy polygon status: {legacy_train_status} and {val_set.legacy_polygons_status}.' - 'Train set status prevails.') + logger.warning('Train and validation set have different legacy ' + f'polygon status: {legacy_train_status} and ' + f'{val_set.legacy_polygons_status}. Train set ' + 'status prevails.') if legacy_train_status == "mixed": logger.warning('Mixed legacy polygon status in training dataset. Consider recompilation.') legacy_train_status = False diff --git a/kraken/lib/pretrain/util.py b/kraken/lib/pretrain/util.py index 7bf3760a8..ce29c4b00 100644 --- a/kraken/lib/pretrain/util.py +++ b/kraken/lib/pretrain/util.py @@ -139,7 +139,7 @@ def arrange(s, e, length, keep_length): for length in sorted(lengths, reverse=True): lens = np.fromiter( (e - s if e - s >= length + mask_min_space else 0 for s, e in parts), - np.int, + int, ) l_sum = np.sum(lens) if l_sum == 0: diff --git a/kraken/lib/segmentation.py b/kraken/lib/segmentation.py index 9fad17a60..3ab6008a1 100644 --- a/kraken/lib/segmentation.py +++ b/kraken/lib/segmentation.py @@ -25,6 +25,7 @@ import torch import torch.nn.functional as F from PIL import Image, ImageDraw +from PIL.Image import Resampling, Transform from scipy.ndimage import (binary_erosion, distance_transform_cdt, gaussian_filter, maximum_filter, affine_transform) from scipy.signal import convolve2d @@ -419,8 +420,8 @@ def _rotate(image: _T_pil_or_np, if isinstance(image, Image.Image): # PIL is much faster than scipy pdata = tform.params.flatten().tolist()[:6] - resample = {0: Image.NEAREST, 1: Image.BILINEAR, 2: Image.BICUBIC, 3: Image.BICUBIC}.get(order, Image.NEAREST) - return tform, image.transform(output_shape[::-1], Image.AFFINE, data=pdata, resample=resample, fillcolor=cval) + resample = {0: Resampling.NEAREST, 1: Resampling.BILINEAR, 2: Resampling.BICUBIC, 3: Resampling.BICUBIC}.get(order, Resampling.NEAREST) + return tform, image.transform(output_shape[::-1], Transform.AFFINE, data=pdata, resample=resample, fillcolor=cval) # params for scipy # swap X and Y axis for scipy @@ -1332,7 +1333,7 @@ def extract_polygons(im: Image.Image, for i in range(0, len(source_envelope)-3, 2) ] # warp - resample = {0: Image.NEAREST, 1: Image.BILINEAR, 2: Image.BICUBIC, 3: Image.BICUBIC}.get(order, Image.NEAREST) + resample = {0: Resampling.NEAREST, 1: Resampling.BILINEAR, 2: Resampling.BICUBIC, 3: Resampling.BICUBIC}.get(order, Resampling.NEAREST) i = patch.transform((output_shape[1], output_shape[0]), Image.MESH, data=deform_mesh, resample=resample) yield i.crop(i.getbbox()), line diff --git a/kraken/lib/train.py b/kraken/lib/train.py index da1f4ff79..fb54d5791 100644 --- a/kraken/lib/train.py +++ b/kraken/lib/train.py @@ -406,9 +406,10 @@ def __init__(self, if format_type == 'binary': legacy_train_status = train_set.legacy_polygons_status if val_set and val_set.legacy_polygons_status != legacy_train_status: - logger.warning( - f'Train and validation set have different legacy polygon status: {legacy_train_status} and {val_set.legacy_polygons_status}.' - 'Train set status prevails.') + logger.warning('Train and validation set have different legacy ' + f'polygon status: {legacy_train_status} and ' + f'{val_set.legacy_polygons_status}. Train set ' + 'status prevails.') if legacy_train_status == "mixed": logger.warning('Mixed legacy polygon status in training dataset. Consider recompilation.') legacy_train_status = False diff --git a/kraken/lib/vgsl.py b/kraken/lib/vgsl.py index 93a7d0cb3..9a4f0759b 100644 --- a/kraken/lib/vgsl.py +++ b/kraken/lib/vgsl.py @@ -141,7 +141,7 @@ def __init__(self, spec: str) -> None: 'one_channel_mode': None, 'model_type': None, 'hyper_params': {}, - 'legacy_polygons': False} # enable new polygons by default on new models + 'legacy_polygons': False} # enable new polygons by default on new models self._aux_layers = nn.ModuleDict() self.idx = -1 @@ -313,7 +313,7 @@ def _deserialize_layers(name, layer): 'one_channel_mode': '1', 'model_type': None, 'hyper_params': {}, - 'legacy_polygons': True} # disable new polygons by default on load + 'legacy_polygons': True} # disable new polygons by default on load if 'kraken_meta' in mlmodel.user_defined_metadata: nn.user_metadata.update(json.loads(mlmodel.user_defined_metadata['kraken_meta'])) @@ -368,7 +368,7 @@ def aux_layers(self, val: Dict[str, torch.nn.Module]): @property def use_legacy_polygons(self): return self.user_metadata.get('legacy_polygons', True) - + @use_legacy_polygons.setter def use_legacy_polygons(self, val: bool): self.user_metadata['legacy_polygons'] = val diff --git a/tests/test_newpolygons.py b/tests/test_newpolygons.py index 0c05256c5..18d7faacd 100644 --- a/tests/test_newpolygons.py +++ b/tests/test_newpolygons.py @@ -5,7 +5,7 @@ import tempfile from unittest.mock import Mock, patch from pathlib import Path -from traceback import print_exception +from traceback import print_exc import warnings from typing import Optional, List, Union @@ -89,7 +89,7 @@ def _test_krakencli(self, extractor_mock: Mock, *, args, force_no_legacy: bool=F print("kraken", *args) if result.exception: - print_exception(result.exception) + print_exc() self.assertEqual(result.exit_code, 0) extractor_mock.assert_called() @@ -106,7 +106,7 @@ def _test_ketoscli(self, *, args, expect_legacy: bool, check_exit_code: Optional print("ketos", *args) if result.exception: print(result.output) - print_exception(result.exception) + print_exc() if check_exit_code is not None: if isinstance(check_exit_code, int): From 463ca9ed69f4ce8cbffee50c4814211e96a582cc Mon Sep 17 00:00:00 2001 From: Benjamin Kiessling Date: Tue, 26 Mar 2024 15:08:25 +0100 Subject: [PATCH 15/76] zenodo search API doesn't work with versioned records :/ --- tests/test_repo.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/test_repo.py b/tests/test_repo.py index 06a97fc28..29274711f 100644 --- a/tests/test_repo.py +++ b/tests/test_repo.py @@ -32,14 +32,14 @@ def test_get_description(self): """ Tests fetching the description of a model. """ - record = repo.get_description('10.5281/zenodo.6657809') - self.assertEqual(record['doi'], '10.5281/zenodo.6657809') + record = repo.get_description('10.5281/zenodo.8425684') + self.assertEqual(record['doi'], '10.5281/zenodo.8425684') def test_get_model(self): """ Tests fetching a model. """ - id = repo.get_model('10.5281/zenodo.6657809', + id = repo.get_model('10.5281/zenodo.8425684', path=self.temp_model.name) - self.assertEqual(id, 'HTR-United-Manu_McFrench.mlmodel') - self.assertEqual((self.temp_path / id).stat().st_size, 16176844) + self.assertEqual(id, 'omnisyr_best.mlmodel') + self.assertEqual((self.temp_path / id).stat().st_size, 16245671) From 6995394b8f4d082c78e1e65839679e0fadb262d3 Mon Sep 17 00:00:00 2001 From: Benjamin Kiessling Date: Wed, 27 Mar 2024 23:46:56 +0100 Subject: [PATCH 16/76] Better examples in docs --- README.rst | 16 ++++++++-------- docs/index.rst | 43 ++++++++++++++++++++++++------------------- 2 files changed, 32 insertions(+), 27 deletions(-) diff --git a/README.rst b/README.rst index 3010304b3..b7a25d6c7 100644 --- a/README.rst +++ b/README.rst @@ -9,7 +9,7 @@ material. kraken's main features are: - - Fully trainable layout analysis and character recognition + - Fully trainable layout analysis, reading order, and character recognition - `Right-to-Left `_, `BiDi `_, and Top-to-Bottom script support @@ -44,14 +44,14 @@ install the `pdf` extras package for PyPi: $ pip install kraken[pdf] -or install `pyvips` manually with conda: +or install `pyvips` manually with pip: :: - $ conda install -c conda-forge pyvips + $ pip install pyvips -Conda environment files are provided which for the seamless installation of the -main branch as well: +Conda environment files are provided for the seamless installation of the main +branch as well: :: @@ -70,12 +70,12 @@ or: for CUDA acceleration with the appropriate hardware. Finally you'll have to scrounge up a model to do the actual recognition of -characters. To download the default model for printed English text and place it +characters. To download the default model for printed French text and place it in the kraken directory for the current user: :: - $ kraken get 10.5281/zenodo.2577813 + $ kraken get 10.5281/zenodo.10592716 A list of libre models available in the central repository can be retrieved by running: @@ -111,7 +111,7 @@ To segment and OCR an image using the default model(s): :: - $ kraken -i image.tif image.txt segment -bl ocr + $ kraken -i image.tif image.txt segment -bl ocr -m catmus-print-fondue-large.mlmodel All subcommands and options are documented. Use the ``help`` option to get more information. diff --git a/docs/index.rst b/docs/index.rst index 5713d8fdd..59e096265 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -103,13 +103,14 @@ for CUDA acceleration with the appropriate hardware. Finding Recognition Models -------------------------- -Finally you'll have to scrounge up a recognition model to do the actual -recognition of characters. To download the default English text recognition -model and place it in the user's kraken directory: +Finally you'll have to scrounge up a model to do the actual recognition of +characters. To download the default model for printed French text and place it +in the kraken directory for the current user: -.. code-block:: console +:: + + $ kraken get 10.5281/zenodo.10592716 - $ kraken get 10.5281/zenodo.2577813 A list of libre models available in the central repository can be retrieved by running: @@ -122,18 +123,22 @@ Model metadata can be extracted using: .. code-block:: console - $ kraken show 10.5281/zenodo.2577813 - name: 10.5281/zenodo.2577813 - - A generalized model for English printed text + $ kraken show 10.5281/zenodo.10592716 + name: 10.5281/zenodo.10592716 + + CATMuS-Print (Large, 2024-01-30) - Diachronic model for French prints and other languages - This model has been trained on a large corpus of modern printed English text\naugmented with ~10000 lines of historical p +

CATMuS-Print (Large) - Diachronic model for French prints and other West European languages

+

CATMuS (Consistent Approach to Transcribing ManuScript) Print is a Kraken HTR model trained on data produced by several projects, dealing with different languages (French, Spanish, German, English, Corsican, Catalan, Latin, Italian…) and different centuries (from the first prints of the 16th c. to digital documents of the 21st century).

+

Transcriptions follow graphematic principles and try to be as compatible as possible with guidelines previously published for French: no ligature (except those that still exist), no allographetic variants (except the long s), and preservation of the historical use of some letters (u/v, i/j). Abbreviations are not resolved. Inconsistencies might be present, because transcriptions have been done over several years and the norms have slightly evolved.

+

The model is trained with NFKD Unicode normalization: each diacritic (including superscripts) are transcribed as their own characters, separately from the "main" character.

+

This model is the result of the collaboration from researchers from the University of Geneva and Inria Paris and will be consolidated under the CATMuS Medieval Guidelines in an upcoming paper.

scripts: Latn - alphabet: !"#$%&'()+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]`abcdefghijklmnopqrstuvwxyz{} SPACE - accuracy: 99.95% - license: Apache-2.0 - author(s): Kiessling, Benjamin - date: 2019-02-26 + alphabet: !"#$%&'()*+,-./0123456789:;<=>?ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_abcdefghijklmnopqrstuvwxyz|}~¡£¥§«¬°¶·»¿ÆßæđłŒœƀǝɇΑΒΓΔΕΖΘΙΚΛΜΝΟΠΡΣΤΥΦΧΩαβγδεζηθικλμνξοπρςστυφχωϛחלרᑕᗅᗞᚠẞ–—‘’‚“”„‟†•⁄⁊⁋℟←▽◊★☙✠✺✻⟦⟧⬪ꝑꝓꝗꝙꝟꝯꝵ SPACE, COMBINING GRAVE ACCENT, COMBINING ACUTE ACCENT, COMBINING CIRCUMFLEX ACCENT, COMBINING TILDE, COMBINING MACRON, COMBINING DOT ABOVE, COMBINING DIAERESIS, COMBINING RING ABOVE, COMBINING COMMA ABOVE, COMBINING REVERSED COMMA ABOVE, COMBINING CEDILLA, COMBINING OGONEK, COMBINING GREEK PERISPOMENI, COMBINING GREEK YPOGEGRAMMENI, COMBINING LATIN SMALL LETTER I, COMBINING LATIN SMALL LETTER U, 0xe682, 0xe68b, 0xe8bf, 0xf1a7 + accuracy: 98.56% + license: cc-by-4.0 + author(s): Gabay, Simon; Clérice, Thibault + date: 2024-01-30 Quickstart ========== @@ -154,7 +159,7 @@ prerequisite step of page segmentation: .. code-block:: console - $ kraken -i image.tif image.txt segment -bl ocr + $ kraken -i image.tif image.txt segment -bl ocr -m catmus-print-fondue-large.mlmodel Loading RNN ✓ Processing ⣻ @@ -164,18 +169,18 @@ To segment an image into reading-order sorted baselines and regions: $ kraken -i bw.tif lines.json segment -bl -To OCR an image using the default model: +To OCR an image using the previously downloaded model: .. code-block:: console - $ kraken -i bw.tif image.txt segment -bl ocr + $ kraken -i bw.tif image.txt segment -bl ocr -m catmus-print-fondue-large.mlmodel To OCR an image using the default model and serialize the output using the ALTO template: .. code-block:: console - $ kraken -a -i bw.tif image.txt segment -bl ocr + $ kraken -a -i bw.tif image.txt segment -bl ocr -m catmus-print-fondue-large.mlmodel All commands and their parameters are documented, just add the standard ``--help`` flag for further information. From c57b94de3ace14f9403dfec670c594cf5e60099a Mon Sep 17 00:00:00 2001 From: Benjamin Kiessling Date: Fri, 29 Mar 2024 00:50:11 +0100 Subject: [PATCH 17/76] Allow querying of previous model version from repository Zenodo API returns only latest version of record by default. --- kraken/repo.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/kraken/repo.py b/kraken/repo.py index 628c327fb..f902e9f80 100644 --- a/kraken/repo.py +++ b/kraken/repo.py @@ -125,7 +125,7 @@ def get_model(model_id: str, path: str, callback: Callable[[int, int], Any] = la Will usually be the file name of the model. """ logger.info(f'Saving model {model_id} to {path}') - r = requests.get(f'{MODEL_REPO}records', params={'q': f'doi:"{model_id}"'}) + r = requests.get(f'{MODEL_REPO}records', params={'q': f'doi:"{model_id}"', 'allversions': '1'}) r.raise_for_status() callback(0, 0) resp = r.json() @@ -164,7 +164,7 @@ def get_description(model_id: str, callback: Callable[..., Any] = lambda: None) Dict """ logger.info(f'Retrieving metadata for {model_id}') - r = requests.get(f'{MODEL_REPO}records', params={'q': f'doi:"{model_id}"'}) + r = requests.get(f'{MODEL_REPO}records', params={'q': f'doi:"{model_id}"', 'allversions': '1'}) r.raise_for_status() callback() resp = r.json() From 857fb9cfa8a569e9a5385f325aa14e0e3b7c94b1 Mon Sep 17 00:00:00 2001 From: Benjamin Kiessling Date: Fri, 29 Mar 2024 01:18:38 +0100 Subject: [PATCH 18/76] Test accessing versioned records on Zenodo --- tests/test_repo.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/tests/test_repo.py b/tests/test_repo.py index 29274711f..3b54f099a 100644 --- a/tests/test_repo.py +++ b/tests/test_repo.py @@ -43,3 +43,20 @@ def test_get_model(self): path=self.temp_model.name) self.assertEqual(id, 'omnisyr_best.mlmodel') self.assertEqual((self.temp_path / id).stat().st_size, 16245671) + + def test_prev_record_version_get_description(self): + """ + Tests fetching the description of a model that has a superseding newer version. + """ + record = repo.get_description('10.5281/zenodo.6657809') + self.assertEqual(record['doi'], '10.5281/zenodo.6657809') + + def test_prev_record_version_get_model(self): + """ + Tests fetching a model that has a superseding newer version. + """ + id = repo.get_model('10.5281/zenodo.6657809', + path=self.temp_model.name) + self.assertEqual(id, 'HTR-United-Manu_McFrench.mlmodel') + self.assertEqual((self.temp_path / id).stat().st_size, 16176844) + From 4500256909216608e0afac344978b1ca6dc1c880 Mon Sep 17 00:00:00 2001 From: Benjamin Kiessling Date: Fri, 29 Mar 2024 10:14:53 +0100 Subject: [PATCH 19/76] Cast output to float64 in inference Otherwise numpy conversion fails when using 16 bit precision --- kraken/lib/models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kraken/lib/models.py b/kraken/lib/models.py index fbc1c32bb..4ec8daa62 100644 --- a/kraken/lib/models.py +++ b/kraken/lib/models.py @@ -109,7 +109,7 @@ def forward(self, line: torch.Tensor, lens: torch.Tensor = None) -> Union[np.nda o, olens = self.nn.nn(line, lens) if o.size(2) != 1: raise KrakenInputException('Expected dimension 3 to be 1, actual {}'.format(o.size())) - self.outputs = o.detach().squeeze(2).cpu().numpy() + self.outputs = o.detach().squeeze(2).float().cpu().numpy() if olens is not None: olens = olens.cpu().numpy() return self.outputs, olens From 7e59b8241f8636870fd644e1555762b902e59146 Mon Sep 17 00:00:00 2001 From: Stefan Weil Date: Sat, 30 Mar 2024 10:06:39 +0100 Subject: [PATCH 20/76] Remove trailing whitespace Signed-off-by: Stefan Weil --- .github/workflows/test.yml | 8 +- README.rst | 8 +- docs/alto.xml | 10 +- docs/api.rst | 12 +- docs/index.rst | 12 +- docs/ketos.rst | 40 ++-- docs/training.rst | 28 +-- docs/vgsl.rst | 34 ++-- kraken/ketos/recognition.py | 2 +- kraken/rpred.py | 2 +- kraken/templates/layout.html | 2 +- kraken/templates/style.css | 2 +- tests/resources/bsb00084914_00007.xml | 276 +++++++++++++------------- tests/resources/merge_tests/0014.xml | 32 +-- tests/resources/xlink.xsd | 84 ++++---- tests/test_merging.py | 2 +- tests/test_train.py | 8 +- 17 files changed, 281 insertions(+), 281 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index eac90c000..1f35aea43 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -1,8 +1,8 @@ name: Lint, test, build, and publish -on: +on: push: - + jobs: lint_and_test: @@ -130,7 +130,7 @@ jobs: pypi/* publish-gh-pages: - name: Update kraken.re github pages + name: Update kraken.re github pages needs: lint_and_test runs-on: ubuntu-latest if: | @@ -147,7 +147,7 @@ jobs: python-version: 3.9 - name: Install sphinx-multiversion run: python -m pip install sphinx-multiversion sphinx-autoapi - - name: Create docs + - name: Create docs run: sphinx-multiversion docs build/html - name: Create redirect run: cp docs/redirect.html build/html/index.html diff --git a/README.rst b/README.rst index b7a25d6c7..b046953ff 100644 --- a/README.rst +++ b/README.rst @@ -55,7 +55,7 @@ branch as well: :: - $ git clone https://github.com/mittagessen/kraken.git + $ git clone https://github.com/mittagessen/kraken.git $ cd kraken $ conda env create -f environment.yml @@ -63,7 +63,7 @@ or: :: - $ git clone https://github.com/mittagessen/kraken.git + $ git clone https://github.com/mittagessen/kraken.git $ cd kraken $ conda env create -f environment_cuda.yml @@ -75,7 +75,7 @@ in the kraken directory for the current user: :: - $ kraken get 10.5281/zenodo.10592716 + $ kraken get 10.5281/zenodo.10592716 A list of libre models available in the central repository can be retrieved by running: @@ -105,7 +105,7 @@ To segment an image (binarized or not) with the new baseline segmenter: :: $ kraken -i image.tif lines.json segment -bl - + To segment and OCR an image using the default model(s): diff --git a/docs/alto.xml b/docs/alto.xml index dbf0ca0a1..70185b516 100644 --- a/docs/alto.xml +++ b/docs/alto.xml @@ -13,18 +13,18 @@ - ... diff --git a/docs/api.rst b/docs/api.rst index 703829f3a..1ffdee61d 100644 --- a/docs/api.rst +++ b/docs/api.rst @@ -1,10 +1,10 @@ -API Quickstart +API Quickstart ============== Kraken provides routines which are usable by third party tools to access all functionality of the OCR engine. Most functional blocks, binarization, segmentation, recognition, and serialization are encapsulated in one high -level method each. +level method each. Simple use cases of the API which are mostly useful for debugging purposes are contained in the `contrib` directory. In general it is recommended to look at @@ -353,7 +353,7 @@ handling and verbosity options for the CLI. .. code-block:: python - >>> from kraken.lib.train import RecognitionModel, KrakenTrainer + >>> from kraken.lib.train import RecognitionModel, KrakenTrainer >>> ground_truth = glob.glob('training/*.xml') >>> training_files = ground_truth[:250] # training data is shuffled internally >>> evaluation_files = ground_truth[250:] @@ -382,14 +382,14 @@ can be attached to the trainer object: .. code-block:: python >>> from pytorch_lightning.callbacks import Callback - >>> from kraken.lib.train import RecognitionModel, KrakenTrainer + >>> from kraken.lib.train import RecognitionModel, KrakenTrainer >>> class MyPrintingCallback(Callback): def on_init_start(self, trainer): print("Starting to init trainer!") - + def on_init_end(self, trainer): print("trainer is init now") - + def on_train_end(self, trainer, pl_module): print("do something when training ends") >>> ground_truth = glob.glob('training/*.xml') diff --git a/docs/index.rst b/docs/index.rst index 59e096265..17739aab2 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -30,7 +30,7 @@ kraken's main features are: - :ref:`Public repository ` of model files - :ref:`Variable recognition network architectures ` -Pull requests and code contributions are always welcome. +Pull requests and code contributions are always welcome. Installation ============ @@ -86,7 +86,7 @@ The git repository contains some environment files that aid in setting up the la .. code-block:: console - $ git clone https://github.com/mittagessen/kraken.git + $ git clone https://github.com/mittagessen/kraken.git $ cd kraken $ conda env create -f environment.yml @@ -94,7 +94,7 @@ or: .. code-block:: console - $ git clone https://github.com/mittagessen/kraken.git + $ git clone https://github.com/mittagessen/kraken.git $ cd kraken $ conda env create -f environment_cuda.yml @@ -109,7 +109,7 @@ in the kraken directory for the current user: :: - $ kraken get 10.5281/zenodo.10592716 + $ kraken get 10.5281/zenodo.10592716 A list of libre models available in the central repository can be retrieved by @@ -125,9 +125,9 @@ Model metadata can be extracted using: $ kraken show 10.5281/zenodo.10592716 name: 10.5281/zenodo.10592716 - + CATMuS-Print (Large, 2024-01-30) - Diachronic model for French prints and other languages - +

CATMuS-Print (Large) - Diachronic model for French prints and other West European languages

CATMuS (Consistent Approach to Transcribing ManuScript) Print is a Kraken HTR model trained on data produced by several projects, dealing with different languages (French, Spanish, German, English, Corsican, Catalan, Latin, Italian…) and different centuries (from the first prints of the 16th c. to digital documents of the 21st century).

Transcriptions follow graphematic principles and try to be as compatible as possible with guidelines previously published for French: no ligature (except those that still exist), no allographetic variants (except the long s), and preservation of the historical use of some letters (u/v, i/j). Abbreviations are not resolved. Inconsistencies might be present, because transcriptions have been done over several years and the norms have slightly evolved.

diff --git a/docs/ketos.rst b/docs/ketos.rst index b1c23ae30..b2b2b00e8 100644 --- a/docs/ketos.rst +++ b/docs/ketos.rst @@ -5,12 +5,12 @@ Training This page describes the training utilities available through the ``ketos`` command line utility in depth. For a gentle introduction on model training -please refer to the :ref:`tutorial `. +please refer to the :ref:`tutorial `. There are currently three trainable components in the kraken processing pipeline: * Segmentation: finding lines and regions in images * Reading Order: ordering lines found in the previous segmentation step. Reading order models are closely linked to segmentation models and both are usually trained on the same dataset. -* Recognition: recognition models transform images of lines into text. +* Recognition: recognition models transform images of lines into text. Depending on the use case it is not necessary to manually train new models for each material. The default segmentation model works well on quite a variety of @@ -246,7 +246,7 @@ would be: A better configuration for large and complicated datasets such as handwritten texts: -.. code-block:: console +.. code-block:: console $ ketos train --augment --workers 4 -d cuda -f binary --min-epochs 20 -w 0 -s '[1,120,0,1 Cr3,13,32 Do0.1,2 Mp2,2 Cr3,13,32 Do0.1,2 Mp2,2 Cr3,9,64 Do0.1,2 Mp2,2 Cr3,9,64 Do0.1,2 S1(1x0)1,3 Lbx200 Do0.1,2 Lbx200 Do.1,2 Lbx200 Do]' -r 0.0001 dataset_large.arrow @@ -273,10 +273,10 @@ an exact match. Otherwise an error will be raised: $ ketos train -i model_5.mlmodel kamil/*.png Building training set [####################################] 100% Building validation set [####################################] 100% - [0.8616] alphabet mismatch {'~', '»', '8', '9', 'ـ'} + [0.8616] alphabet mismatch {'~', '»', '8', '9', 'ـ'} Network codec not compatible with training set - [0.8620] Training data and model codec alphabets mismatch: {'ٓ', '؟', '!', 'ص', '،', 'ذ', 'ة', 'ي', 'و', 'ب', 'ز', 'ح', 'غ', '~', 'ف', ')', 'د', 'خ', 'م', '»', 'ع', 'ى', 'ق', 'ش', 'ا', 'ه', 'ك', 'ج', 'ث', '(', 'ت', 'ظ', 'ض', 'ل', 'ط', '؛', 'ر', 'س', 'ن', 'ء', 'ٔ', '«', 'ـ', 'ٕ'} - + [0.8620] Training data and model codec alphabets mismatch: {'ٓ', '؟', '!', 'ص', '،', 'ذ', 'ة', 'ي', 'و', 'ب', 'ز', 'ح', 'غ', '~', 'ف', ')', 'د', 'خ', 'م', '»', 'ع', 'ى', 'ق', 'ش', 'ا', 'ه', 'ك', 'ج', 'ث', '(', 'ت', 'ظ', 'ض', 'ل', 'ط', '؛', 'ر', 'س', 'ن', 'ء', 'ٔ', '«', 'ـ', 'ٕ'} + There are two modes dealing with mismatching alphabets, ``union`` and ``new``. ``union`` resizes the output layer and codec of the loaded model to include all characters in the new training set without removing any characters. ``new`` @@ -340,10 +340,10 @@ layers we define a network stub and index for appending: .. code-block:: console - $ ketos train -i model_1.mlmodel --append 7 -s '[Lbx256 Do]' syr/*.png + $ ketos train -i model_1.mlmodel --append 7 -s '[Lbx256 Do]' syr/*.png Building training set [####################################] 100% Building validation set [####################################] 100% - [0.8014] alphabet mismatch {'8', '3', '9', '7', '܇', '݀', '݂', '4', ':', '0'} + [0.8014] alphabet mismatch {'8', '3', '9', '7', '܇', '݀', '݂', '4', ':', '0'} Slicing and dicing model ✓ The new model will behave exactly like a new one, except potentially training a @@ -599,7 +599,7 @@ It is also possible to filter out baselines/regions selectively: Finally, we can merge baselines and regions into each other: -.. code-block:: console +.. code-block:: console $ ketos segtrain -f xml --merge-baselines default:foo training_data/*.xml Training line types: @@ -653,7 +653,7 @@ with their segmentation model in a subsequent step. The general sequence is therefore: .. code-block:: console - + $ ketos segtrain -o fr_manu_seg.mlmodel -f xml french/*.xml ... $ ketos rotrain -o fr_manu_ro.mlmodel -f xml french/*.xml @@ -671,8 +671,8 @@ serialized in the final XML output (in ALTO/PAGE XML). Reading order models work purely on the typology and geometric features of the lines and regions. They construct an approximate ordering matrix by feeding feature vectors of two lines (or regions) into the network - to decide which of those two lines precedes the other. - + to decide which of those two lines precedes the other. + These feature vectors are quite simple; just the lines' types, and their start, center, and end points. Therefore they can *not* reliably learn any ordering relying on graphical features of the input page such @@ -705,10 +705,10 @@ sufficiently large training datasets: │ 3 │ ro_net.relu │ ReLU │ 0 │ │ 4 │ ro_net.fc2 │ Linear │ 45 │ └───┴─────────────┴───────────────────┴────────┘ - Trainable params: 1.1 K - Non-trainable params: 0 - Total params: 1.1 K - Total estimated model params size (MB): 0 + Trainable params: 1.1 K + Non-trainable params: 0 + Total params: 1.1 K + Total estimated model params size (MB): 0 stage 0/∞ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 0/35 0:00:00 • -:--:-- 0.00it/s val_spearman: 0.912 val_loss: 0.701 early_stopping: 0/300 inf During validation a metric called Spearman's footrule is computed. To calculate @@ -756,20 +756,20 @@ adding a number of image files as the final argument: Evaluating $model Evaluating [####################################] 100% === report test_model.mlmodel === - + 7012 Characters 6022 Errors 14.12% Accuracy - + 5226 Insertions 2 Deletions 794 Substitutions - + Count Missed %Right 1567 575 63.31% Common 5230 5230 0.00% Arabic 215 215 0.00% Inherited - + Errors Correct-Generated 773 { ا } - { } 536 { ل } - { } diff --git a/docs/training.rst b/docs/training.rst index aa63338f5..704727aa5 100644 --- a/docs/training.rst +++ b/docs/training.rst @@ -142,7 +142,7 @@ that can be adjusted: Training a network will take some time on a modern computer, even with the default parameters. While the exact time required is unpredictable as training is a somewhat random process a rough guide is that accuracy seldom improves -after 50 epochs reached between 8 and 24 hours of training. +after 50 epochs reached between 8 and 24 hours of training. When to stop training is a matter of experience; the default setting employs a fairly reliable approach known as `early stopping @@ -150,10 +150,10 @@ fairly reliable approach known as `early stopping the error rate on the validation set doesn't improve anymore. This will prevent `overfitting `_, i.e. fitting the model to recognize only the training data properly instead of the -general patterns contained therein. +general patterns contained therein. .. code-block:: console - + $ ketos train output_dir/*.png Building training set [####################################] 100% Building validation set [####################################] 100% @@ -164,7 +164,7 @@ general patterns contained therein. Accuracy report (1) 0.0245 3504 3418 epoch 1/-1 [####################################] 788/788 Accuracy report (2) 0.8445 3504 545 - epoch 2/-1 [####################################] 788/788 + epoch 2/-1 [####################################] 788/788 Accuracy report (3) 0.9541 3504 161 epoch 3/-1 [------------------------------------] 13/788 0d 00:22:09 ... @@ -212,8 +212,8 @@ information by appending one or more ``-v`` to the command: .. code-block:: console $ ketos -vv train syr/*.png - [0.7272] Building ground truth set from 876 line images - [0.7281] Taking 88 lines from training for evaluation + [0.7272] Building ground truth set from 876 line images + [0.7281] Taking 88 lines from training for evaluation ... [0.8479] Training set 788 lines, validation set 88 lines, alphabet 48 symbols [0.8481] alphabet mismatch {'\xa0', '0', ':', '݀', '܇', '݂', '5'} @@ -314,20 +314,20 @@ After all lines have been processed a evaluation report will be printed: .. code-block:: console === report === - + 35619 Characters 336 Errors 99.06% Accuracy - + 157 Insertions 81 Deletions 98 Substitutions - + Count Missed %Right 27046 143 99.47% Syriac 7015 52 99.26% Common 1558 60 96.15% Inherited - + Errors Correct-Generated 25 { } - { COMBINING DOT BELOW } 25 { COMBINING DOT BELOW } - { } @@ -433,16 +433,16 @@ Retrieving model metadata for a particular model: $ kraken show arabic-alam-al-kutub name: arabic-alam-al-kutub.mlmodel - + An experimental model for Classical Arabic texts. - + Network trained on 889 lines of [0] as a test case for a general Classical Arabic model. Ground truth was prepared by Sarah Savant and Maxim Romanov . - + Vocalization was omitted in the ground truth. Training was stopped at ~35000 iterations with an accuracy of 97%. - + [0] Ibn al-Faqīh (d. 365 AH). Kitāb al-buldān. Edited by Yūsuf al-Hādī, 1st edition. Bayrūt: ʿĀlam al-kutub, 1416 AH/1996 CE. alphabet: !()-.0123456789:[] «»،؟ءابةتثجحخدذرزسشصضطظعغفقكلمنهوىي ARABIC diff --git a/docs/vgsl.rst b/docs/vgsl.rst index 8a956b213..6a0c42de4 100644 --- a/docs/vgsl.rst +++ b/docs/vgsl.rst @@ -55,11 +55,11 @@ Examples [1,1,0,48 Lbx100 Do 01c59] - Creating new model [1,1,0,48 Lbx100 Do] with 59 outputs - layer type params + Creating new model [1,1,0,48 Lbx100 Do] with 59 outputs + layer type params 0 rnn direction b transposed False summarize False out 100 legacy None - 1 dropout probability 0.5 dims 1 - 2 linear augmented False out 59 + 1 dropout probability 0.5 dims 1 + 2 linear augmented False out 59 A simple recurrent recognition model with a single LSTM layer classifying lines normalized to 48 pixels in height. @@ -68,18 +68,18 @@ normalized to 48 pixels in height. [1,48,0,1 Cr3,3,32 Do0.1,2 Mp2,2 Cr3,3,64 Do0.1,2 Mp2,2 S1(1x12)1,3 Lbx100 Do 01c59] - Creating new model [1,48,0,1 Cr3,3,32 Do0.1,2 Mp2,2 Cr3,3,64 Do0.1,2 Mp2,2 S1(1x12)1,3 Lbx100 Do] with 59 outputs - layer type params - 0 conv kernel 3 x 3 filters 32 activation r - 1 dropout probability 0.1 dims 2 - 2 maxpool kernel 2 x 2 stride 2 x 2 - 3 conv kernel 3 x 3 filters 64 activation r - 4 dropout probability 0.1 dims 2 - 5 maxpool kernel 2 x 2 stride 2 x 2 - 6 reshape from 1 1 x 12 to 1/3 - 7 rnn direction b transposed False summarize False out 100 legacy None - 8 dropout probability 0.5 dims 1 - 9 linear augmented False out 59 + Creating new model [1,48,0,1 Cr3,3,32 Do0.1,2 Mp2,2 Cr3,3,64 Do0.1,2 Mp2,2 S1(1x12)1,3 Lbx100 Do] with 59 outputs + layer type params + 0 conv kernel 3 x 3 filters 32 activation r + 1 dropout probability 0.1 dims 2 + 2 maxpool kernel 2 x 2 stride 2 x 2 + 3 conv kernel 3 x 3 filters 64 activation r + 4 dropout probability 0.1 dims 2 + 5 maxpool kernel 2 x 2 stride 2 x 2 + 6 reshape from 1 1 x 12 to 1/3 + 7 rnn direction b transposed False summarize False out 100 legacy None + 8 dropout probability 0.5 dims 1 + 9 linear augmented False out 59 A model with a small convolutional stack before a recurrent LSTM layer. The extended dropout layer syntax is used to reduce drop probability on the depth @@ -129,7 +129,7 @@ other branch simply passes through the output of the first convolution layer. The input of the last convolutional layer is then the output of the two branches of the parallel block concatenated, i.e. the output of the first convolutional layer together with the output of the transposed convolutional layer, -giving `32 + 32 = 64` feature dimensions. +giving `32 + 32 = 64` feature dimensions. Convolutional Layers -------------------- diff --git a/kraken/ketos/recognition.py b/kraken/ketos/recognition.py index 559d86d3b..e6d1374f1 100644 --- a/kraken/ketos/recognition.py +++ b/kraken/ketos/recognition.py @@ -305,7 +305,7 @@ def train(ctx, batch_size, pad, output, spec, append, load, freq, quit, epochs, codec=codec, resize=resize, legacy_polygons=legacy_polygons) - + # Force upgrade to new polygon extractor if model was not trained with it if model.nn and model.nn.use_legacy_polygons: if not legacy_polygons and not model.legacy_polygons: diff --git a/kraken/rpred.py b/kraken/rpred.py index d41a11f67..99184c208 100644 --- a/kraken/rpred.py +++ b/kraken/rpred.py @@ -307,7 +307,7 @@ def __len__(self): def _scale_val(self, val, min_val, max_val): return int(round(min(max(((val*self.net_scale)-self.pad)*self.in_scale, min_val), max_val-1))) - + def _choose_legacy_polygon_extractor(self, net) -> bool: # grouping the checks here to display warnings only once if net.nn.use_legacy_polygons: diff --git a/kraken/templates/layout.html b/kraken/templates/layout.html index 4a7d14dbd..9ca212e0b 100644 --- a/kraken/templates/layout.html +++ b/kraken/templates/layout.html @@ -1,6 +1,6 @@ - + diff --git a/kraken/templates/style.css b/kraken/templates/style.css index 30e3ba30f..117657f74 100644 --- a/kraken/templates/style.css +++ b/kraken/templates/style.css @@ -111,7 +111,7 @@ nav a { } nav a:hover { - text-decoration: underline; + text-decoration: underline; } button.download { diff --git a/tests/resources/bsb00084914_00007.xml b/tests/resources/bsb00084914_00007.xml index 311751ad1..538e4a107 100644 --- a/tests/resources/bsb00084914_00007.xml +++ b/tests/resources/bsb00084914_00007.xml @@ -6,10 +6,10 @@ pixel bsb00084914_00007.jpg - + - + @@ -154,7 +154,7 @@ VPOS="0" WIDTH="3177" HEIGHT="4308"> - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - + - + - - + + - + - + - - + + - + - + - - + + - - + + - + - + - - + + - + - - + + diff --git a/tests/resources/merge_tests/0014.xml b/tests/resources/merge_tests/0014.xml index 1752f7117..c801094b5 100644 --- a/tests/resources/merge_tests/0014.xml +++ b/tests/resources/merge_tests/0014.xml @@ -6,15 +6,15 @@ pixel 0014.jpg - + - + - + - + - - + + - - + + - - + + - + - + diff --git a/tests/resources/xlink.xsd b/tests/resources/xlink.xsd index f55eb6dae..8283fe669 100644 --- a/tests/resources/xlink.xsd +++ b/tests/resources/xlink.xsd @@ -1,75 +1,75 @@ - + - + - - - - - + + + + + - - - - + + + + - - - + + + - - - - - - - + + + + + + + - - - + + + - - - - - + + + + + - - - - - - - + + + + + + + - - - - + + + + - + - + diff --git a/tests/test_merging.py b/tests/test_merging.py index a9a00631e..a32b3a47e 100644 --- a/tests/test_merging.py +++ b/tests/test_merging.py @@ -81,7 +81,7 @@ def test_merging_union(self): model.nn.codec.encode("x").shape, (1, ), "x is known to the loaded model and should be encoded through `new`" ) - + def test_merging_union_with_nfd(self): """ Asserts that union, which only takes into account new the original codec and the new data, works as intended diff --git a/tests/test_train.py b/tests/test_train.py index 3d651d927..59b663435 100644 --- a/tests/test_train.py +++ b/tests/test_train.py @@ -200,7 +200,7 @@ def test_krakentrainer_rec_bl_dict(self): self.assertEqual(module.nn.seg_type, 'baselines') self.assertIsInstance(module.train_set.dataset, kraken.lib.dataset.PolygonGTDataset) trainer = KrakenTrainer(max_steps=1) - + def test_krakentrainer_rec_bl_augment(self): """ Test that augmentation is added if specified. @@ -212,14 +212,14 @@ def test_krakentrainer_rec_bl_augment(self): evaluation_data=evaluation_data) module.setup() self.assertEqual(module.train_set.dataset.aug, None) - + module = RecognitionModel({'augment': True}, format_type='xml', training_data=training_data, evaluation_data=evaluation_data) module.setup() self.assertIsInstance(module.train_set.dataset.aug, kraken.lib.dataset.recognition.DefaultAugmenter) - + def test_krakentrainer_rec_box_augment(self): """ Test that augmentation is added if specified. @@ -231,7 +231,7 @@ def test_krakentrainer_rec_box_augment(self): evaluation_data=evaluation_data) module.setup() self.assertEqual(module.train_set.dataset.aug, None) - + module = RecognitionModel({'augment': True}, format_type='path', training_data=training_data, From 5696830642efc9a3182df3d9ed28d325e2fa9f86 Mon Sep 17 00:00:00 2001 From: Stefan Weil Date: Sat, 30 Mar 2024 14:45:52 +0100 Subject: [PATCH 21/76] Replace CR/LF by LF Signed-off-by: Stefan Weil --- tests/resources/FineReader10-schema-v1.xml | 1252 ++--- tests/resources/alto-4-3.xsd | 2496 ++++----- tests/resources/cPAS-2000.xml | 820 +-- tests/resources/pagecontent.xsd | 5288 ++++++++++---------- 4 files changed, 4928 insertions(+), 4928 deletions(-) diff --git a/tests/resources/FineReader10-schema-v1.xml b/tests/resources/FineReader10-schema-v1.xml index d98b46ce7..80dda2ace 100644 --- a/tests/resources/FineReader10-schema-v1.xml +++ b/tests/resources/FineReader10-schema-v1.xml @@ -1,626 +1,626 @@ - - - Schema for representing OCR results exported from FineReader 10.0 SDK. Copyright 2001-2011 ABBYY, Inc. - - - - - - - - - Global document data - - - - - - - Paragraph formatting styles collection - - - - - - - Paragraph formatting style - - - - - - - - - Document sections collection - - - - - - - Section - - - - - - - - - - - - Recognized page - - - - - - - Recognized block - - - - - - Page Section - - - - - - Running titles and artefacts - - - - - - - - - - If true, all coordinates are relative to original image before opening, otherwise they are relative to the opened (deskewed) image - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Page section is the sequence of page streams - - - - - - - - - - - Page Stream is the sequence of page elements - - - - - - - - - - - - text - - - - - Table - - - - - Barcode - - - - - Picture - - - - - - - - - - - Table captions - - - - - - - Table cells - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Picture captions - - - - - - - - - - - - - - - - - - - - - - - Text Stream is the sequence of paragraphs and/or blocks - - - - - - - - - - - - - - - - - Id of page element - - - - - - - - - - - - - - - - - - - - - - - - - - - Block region, the set of rectangles - - - - - - - - - - - - - - - - - - Recognized block text, presents if blockType attribute is Text - - - - - The set of table rows, presents if blockType attribute is Table - - - - - Separators box block, presents if blockType attribute is SeparatorsBox - - - - - - - - - - - Separator block, presents if blockType attribute is Separator - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Text paragraph - - - - - - - - - - - - - - - - - - - - - - - - - Table cell - - - - - - Cell text - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Text paragraph line - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Group of characters with uniform formatting - - - - - - - - - - - - - - - Attributes of characters are alternated with word's recognition variants. The variants of recognition of the word are written before the word - - - - Attributes of single character - - - - - Variants of recognition of the next word - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Starting point of the separator - - - - - Ending point of the separator - - - - - - - - - - - - - - - - - - - - - - + + + Schema for representing OCR results exported from FineReader 10.0 SDK. Copyright 2001-2011 ABBYY, Inc. + + + + + + + + + Global document data + + + + + + + Paragraph formatting styles collection + + + + + + + Paragraph formatting style + + + + + + + + + Document sections collection + + + + + + + Section + + + + + + + + + + + + Recognized page + + + + + + + Recognized block + + + + + + Page Section + + + + + + Running titles and artefacts + + + + + + + + + + If true, all coordinates are relative to original image before opening, otherwise they are relative to the opened (deskewed) image + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Page section is the sequence of page streams + + + + + + + + + + + Page Stream is the sequence of page elements + + + + + + + + + + + + text + + + + + Table + + + + + Barcode + + + + + Picture + + + + + + + + + + + Table captions + + + + + + + Table cells + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Picture captions + + + + + + + + + + + + + + + + + + + + + + + Text Stream is the sequence of paragraphs and/or blocks + + + + + + + + + + + + + + + + + Id of page element + + + + + + + + + + + + + + + + + + + + + + + + + + + Block region, the set of rectangles + + + + + + + + + + + + + + + + + + Recognized block text, presents if blockType attribute is Text + + + + + The set of table rows, presents if blockType attribute is Table + + + + + Separators box block, presents if blockType attribute is SeparatorsBox + + + + + + + + + + + Separator block, presents if blockType attribute is Separator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Text paragraph + + + + + + + + + + + + + + + + + + + + + + + + + Table cell + + + + + + Cell text + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Text paragraph line + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Group of characters with uniform formatting + + + + + + + + + + + + + + + Attributes of characters are alternated with word's recognition variants. The variants of recognition of the word are written before the word + + + + Attributes of single character + + + + + Variants of recognition of the next word + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Starting point of the separator + + + + + Ending point of the separator + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/resources/alto-4-3.xsd b/tests/resources/alto-4-3.xsd index f02195b03..cb8daf94f 100644 --- a/tests/resources/alto-4-3.xsd +++ b/tests/resources/alto-4-3.xsd @@ -1,1248 +1,1248 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ALTO (analyzed layout and text object) stores layout information and - OCR recognized text of pages of any kind of printed documents like books, journals and newspapers. - ALTO is a standardized XML format to store layout and content information. - It is designed to be used as an extension schema to METS (Metadata Encoding and Transmission Standard), - where METS provides metadata and structural information while ALTO contains content and physical information. - - - - - - - - Describes general settings of the alto file like measurement units and metadata - - - - - Styles define properties of layout elements. A style defined in a parent element is used as default style for all related children elements. - - - - - - Tag define properties of additional characteristic. The tags are referenced from related content element on Block or String element by attribute TAGREF via the tag ID. - This container element contains the individual elements for LayoutTags, StructureTags, RoleTags, NamedEntityTags and OtherTags - - - - - - - Describes alternative hierarchical orderings of the page (i.e. total orders over its segments, for linear text flow), - in addition to the explicit flat reading order defined by @IDNEXT on the block level, - and the implicit flat reading order implied by the segment element ordering. - - - - - - The root layout element. - - - - - - Schema version of the ALTO file. - - - - - - - - - - Element deprecated. 'Processing' should be used instead. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - There are following variation of tag types available: - LayoutTag – criteria about arrangement or graphical appearance - StructureTag – criteria about grouping or formation - RoleTag – criteria about function or mission - NamedEntityTag – criteria about assignment of terms to their relationship / meaning (NER) - OtherTag – criteria about any other characteristic not listed above, the TYPE attribute is intended to be used for classification within those. - - - - - - - - - - - - - - - - Defines one or more reading orders within the - page. Groups may be either unordered or ordered and can - contain other groups, e.g. a page containing - unrelated texts that are ordered individually - would be encoded as an UnorderedGroup containing - multiple OrderedGroups. The granularity of - elements can vary inside groups. - - - - - - - - - - - - - A reference to an element such as a block, TextLine, String, or Glyph. - - - - - - - A link to the referenced element. Valid - target elements are any block type, - TextLine, String, or Glyph. - - - - - - - Optionally annotates the role of the - referenced element in the reading order - with one or more tags. Examples could be - interlinear additions or marginalia. - - - - - - - - A group containing ordered elements (i.e. the sequence of OrderedGroup, UnorderedGroup or ElementRef subelements is ordered). - - - - - - - - - - - - - - Optionally annotates the role of the - group in the reading order - with one or more tags. Examples could be - distinguishing - parallel texts or apparatus criticus and - main text. - - - - - - - A link to the referenced element. Valid - target elements are any block type, - TextLine, or String. - - - - - - - - A group containing unordered elements (i.e. the sequence of OrderedGroup, UnorderedGroup or ElementRef subelements is arbitrary). - - - - - - - - - - - - - - - A link to the referenced element. Valid - target elements are any block type, - TextLine, or String. - - - - - - - Gives brief information about original page quality - - - - - - - - - - - - - - Gives more details about the original page quality, since QUALITY attribute gives only brief and restrictive information - - - - - - Position of the page. Could be lefthanded, righthanded, cover, foldout or single if it has no special position. - - - - - - - - - - - - Page Confidence: Confidence level of the ocr for this page. A value between 0 (unsure) and 1 (sure). - - - - - - - - - One page of a book or journal. - - - - - The area between the top line of print and the upper edge of the leaf. It may contain page number or running title. - - - - - The area between the printspace and the left border of a page. May contain margin notes. - - - - - The area between the printspace and the right border of a page. May contain margin notes. - - - - - The area between the bottom line of letterpress or writing and the bottom edge of the leaf. It may contain a page number, a signature number or a catch word. - - - - - Rectangle covering the printed area of a page. Page number and running title are not part of the print space. - - - - - - - Any user-defined class like title page. - - - - - - - - - The number of the page within the document. - - - - - The page number that is printed on the page. - - - - - - - - A link to the processing description that has been used for this page. - - - - - Estimated percentage of OCR Accuracy in range from 0 to 100 - - - - - - - - - - - - - A text style defines font properties of text. - - - - - - - A paragraph style defines formatting properties of text blocks. - - - - - Indicates the alignement of the paragraph. Could be left, right, center or justify. - - - - - - - - - - - - - Left indent of the paragraph in relation to the column. - - - - - Right indent of the paragraph in relation to the column. - - - - - Line spacing between two lines of the paragraph. Measurement calculated from baseline to baseline. - - - - - Indent of the first line of the paragraph if this is different from the other lines. A negative value indicates an indent to the left, a positive value indicates an indent to the right. - - - - - - - - - - - - - - - - - - - - - - - - - - - Group of available block types - - - - - A block of text. - - - - - A picture or image. - - - - - A graphic used to separate blocks. Usually a line or rectangle. - - - - - A block that consists of other blocks - - - - - - - Base type for any kind of block on the page. - - - - - - - - - - - - - - - Tells the rotation of e.g. text or illustration within the block. The value is in degree counterclockwise. - - - - - The next block in reading order of the page (if ReadingOrder is not specified, and elements are not in order). - - - - - Correction Status. Indicates whether manual correction has been done or not. The correction status should be recorded at the highest level possible (Block, TextLine, String). - - - - - - - A white space. - - - - - - - - - - Type of the substitution (if any). - - - - - - - - - - - - - - - Word Confidence: Confidence level of the ocr for this string. A value between 0 (unsure) and 1 (sure). - - - - - - - - - - Any alternative for the word. - Alternative can outline a variant of writing by new typing / spelling rules, typically manually done or by dictionary replacements. - The above sample is an old composed character "Æ" of ancient time, which is replaced now by "Ä". - As variant are meant alternatives of the real printed content which are options outlined by the text recognition process. - Similar sample: "Straße" vs. "Strasse". Such alternatives are not coming from text recognition. - - - - - - - Identifies the purpose of the alternative. - - - - - - - - A sequence of chars. Strings are separated by white spaces or hyphenation chars. - - - - - - - - - - - - - - - - - - - - Content of the substitution. - - - - - - Confidence level of each character in that string. A list of numbers, one number between 0 (sure) and 9 (unsure) for each character. - - - - - Correction Status. Indicates whether manual correction has been done or not. The correction status should be recorded at the highest level possible (Block, TextLine, String). - - - - - Attribute to record language of the string. The language should be recorded at the highest level possible. - - - - - - A region on a page - - - - - - - - - - - - - - - - - - A list of points - - - - - - Describes the bounding shape of a block, if it is not rectangular. - - - - - - - - - - Describes the inline base direction and line orientation of a line or of all lines inside a text block. - The meaning of these terms is defined by the W3C writing modes document:
- These values should correspond to the base direction set in the BiDi algorithm to the respective elements during Unicode encoding. A value of "ttb" (top-to-bottom) implies a base direction of left-to-right, a value of "btt" (bottom-to-top) a base direction of right-to-left. - - - - - - - - - - - A polygon shape. - - - - - - An ellipse shape. HPOS and VPOS describe the center of the ellipse. - HLENGTH and VLENGTH are the width and height of the described ellipse. - The attribute ROTATION tells the rotation of the e.g. text or - illustration within the block. The value is in degrees counterclockwise. - - - - - - - - - - A circle shape. HPOS and VPOS describe the center of the circle. - - - - - - - - Formatting attributes. Note that these attributes are assumed to be inherited from ancestor elements of the document hierarchy. - - - - The font name. - - - - - - - The font size, in points (1/72 of an inch). - - - - - Font color as RGB value - - - - - - - Serif or Sans-Serif - - - - - - - - - fixed or proportional - - - - - - - - - - - All measurement values inside the alto file are related to - this unit, except the font size. - Coordinates as being used in HPOS and VPOS are absolute coordinates referring to the upper-left corner of a page. - The upper left corner of the page is defined as coordinate (0/0). - - values meaning: - mm10: 1/10th of millimeter - inch1200: 1/1200th of inch - pixel: 1 pixel - - The values for pixel will be related to the resolution of the image based - on which the layout is described. Incase the original image is not known - the scaling factor can be calculated based on total width and height of - the image and the according information of the PAGE element. - - - - - - - - - - - Information to identify the image file from which the OCR text was created. - - - - - - - - - - - - - - - - - - - A unique identifier for the image file. This is drawn from MIX. - This identifier must be unique within the local system. - To facilitate file sharing or interoperability with other systems, fileIdentifierLocation may be added to designate the system or application where the identifier is unique. - - - - - - A location qualifier, i.e., a namespace. - - - - - - - - - - - - - - A unique identifier for the document. - This identifier must be unique within the local system. - To facilitate file sharing or interoperability with other systems, documentIdentifierLocation may be added to designate the system or application where the identifier is unique. - - - - - - A location qualifier, i.e., a namespace. - - - - - - - - Deprecated. processingStepType should be used instead. - Information on how the text was created, including preprocessing, OCR processing, and postprocessing steps. Where possible, this draws from MIX's change history. - - - - - - - - - - Description of the processing step. - - - - - Classification of the category of operation, how the file was created, including generation, modification, preprocessing, postprocessing or any other steps. - - - - - Date or DateTime the image was processed. - - - - - Identifies the organizationlevel producer(s) of the processed image. - - - - - An ordinal listing of the image processing steps performed. For example, "image despeckling." - - - - - A description of any setting of the processing application. For example, for a multi-engine OCR application this might include the engines which were used. Ideally, this description should be adequate so that someone else using the same application can produce identical results. - - - - - - - - - - - - - - - - - - - - - Information about a software application. Where applicable, the preferred method for determining this information is by selecting Help -- About. - - - - - The name of the organization or company that created the application. - - - - - The name of the application. - - - - - The version of the application. - - - - - A description of any important characteristics of the application, especially for non-commercial applications. For example, if a non-commercial application is built using commercial components, e.g., an OCR engine SDK. Those components should be mentioned here. - - - - - - - - - - List of any combination of font styles - - - - - - - - - - - - - - - - - - - - - - - A block that consists of other blocks - - - - - - - - - A user defined string to identify the type of composed block (e.g. table, advertisement, ...) - - - - - An ID to link to an image which contains only the composed block. The ID and the file link is defined in the related METS file. - - - - - - - - A picture or image. - - - - - - A user defined string to identify the type of illustration like photo, map, drawing, chart, ... - - - - - A link to an image which contains only the illustration. - - - - - - - - A graphic used to separate blocks. Usually a line or rectangle. - - - - - - - - A block of text. - - - - - - - A single line of text. - - - - - - - - - - - - - A hyphenation char. Can appear only at the end of a line. - - - - - - - - - - - - - - - - - - - - - Pixel coordinates based on the left-hand top corner of an image which define a polyline on which a line of text rests. - - - - - Attribute to record language of the textline. - - - - - Correction Status. Indicates whether manual correction has been done or not. The correction status should be recorded at the highest level possible (Block, TextLine, String). - - - - - Indicates the inline base direction of this TextLine. Overrides the value on elements higher in the hierarchy. - - - - - - - - Attribute deprecated. LANG should be used instead. - - - - - Attribute to record language of the textblock. - - - - - Indicates the inline base direction of the TextBlock. - - - - - - - - - - - The xml data wrapper element XmlData is used to contain XML encoded metadata. - The content of an XmlData element can be in any namespace or in no namespace. - As permitted by the XML Schema Standard, the processContents attribute value for the - metadata in an XmlData is set to “lax”. Therefore, if the source schema and its location are - identified by means of an XML schemaLocation attribute, then an XML processor will validate - the elements for which it can find declarations. If a source schema is not identified, or cannot be - found at the specified schemaLocation, then an XML validator will check for well-formedness, - but otherwise skip over the elements appearing in the XmlData element. - - - - - - - - - - - - - Type can be used to classify and group the information within each tag element type. - - - - - Content / information value of the tag. - - - - - Description text for tag information for clarification. - - - - - Any URI for authority or description relevant information. - - - - - - - Modern OCR software stores information on glyph level. A glyph is essentially a character or ligature. - Accordingly the value for the glyph element will be defined as follows: - Pre-composed representation = base + combining character(s) (decomposed representation) - See http://www.fileformat.info/info/unicode/char/0101/index.htm - "U+0101" = (U+0061) + (U+0304) - "combining characters" ("base characters" in combination with non-spacing marks or characters which are combined to one) are represented as one "glyph", e.g. áàâ. - - Each glyph has its own coordinate information and must be separately addressable as a distinct object. - Correction and verification processes can be carried out for individual characters. - - Post-OCR analysis of the text as well as adaptive OCR algorithm must be able to record information on glyph level. - In order to reproduce the decision of the OCR software, optional characters must be recorded. These are called variants. - The OCR software evaluates each variant and picks the one with the highest confidence score as the glyph. - The confidence score expresses how confident the OCR software is that a single glyph had been recognized correctly. - - The glyph elements are in order of the word. Each glyph need to be recorded to built up the whole word sequence. - - The glyph’s CONTENT attribute is no replacement for the string’s CONTENT attribute. - Due to post-processing steps such as correction the values of both attributes may be inconsistent. - - - - - - - - - - - CONTENT contains the precomposed representation (combining character) of the character from the parent String element. - The sequence position of the Gylph element matches the position of the character in the String. - - - - - - - - - - - - - This GC attribute records a float value between 0.0 and 1.0 that expresses the level of confidence for the glyph where 1 is certain. - This attribute is optional. If it is not available, the default value for the glyph is “0”. - The GC attribute semantic is the same as the WC attribute on the String element and VC on Variant element. - - - - - - - - - - - - - - - - - - Alternative (combined) character for the glyph, outlined by OCR engine or similar recognition processes. - In case the variant are two (combining) characters, two characters are outlined in one Variant element. - E.g. a Glyph element with CONTENT="m" can have a Variant element with the content "rn". - Details for different use-cases see on the samples on GitHub. - - - - - - Each Variant represents an option for the glyph that the OCR software detected as possible alternatives. - In case the variant are two (combining) characters, two characters are outlined in one Variant element. - E.g. a Glyph element with CONTENT="m" can have a Variant element with the content "rn". - Details for different use-cases see on the samples on GitHub. - - - - - - - - - - - - - This VC attribute records a float value between 0.0 and 1.0 that expresses the level of confidence for the variant where is 1 is certain. - This attribute is optional. If it is not available, the default value for the variant is “0”. - The VC attribute semantic is the same as the GC attribute on the Glyph element. - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ALTO (analyzed layout and text object) stores layout information and + OCR recognized text of pages of any kind of printed documents like books, journals and newspapers. + ALTO is a standardized XML format to store layout and content information. + It is designed to be used as an extension schema to METS (Metadata Encoding and Transmission Standard), + where METS provides metadata and structural information while ALTO contains content and physical information. + + + + + + + + Describes general settings of the alto file like measurement units and metadata + + + + + Styles define properties of layout elements. A style defined in a parent element is used as default style for all related children elements. + + + + + + Tag define properties of additional characteristic. The tags are referenced from related content element on Block or String element by attribute TAGREF via the tag ID. + This container element contains the individual elements for LayoutTags, StructureTags, RoleTags, NamedEntityTags and OtherTags + + + + + + + Describes alternative hierarchical orderings of the page (i.e. total orders over its segments, for linear text flow), + in addition to the explicit flat reading order defined by @IDNEXT on the block level, + and the implicit flat reading order implied by the segment element ordering. + + + + + + The root layout element. + + + + + + Schema version of the ALTO file. + + + + + + + + + + Element deprecated. 'Processing' should be used instead. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + There are following variation of tag types available: + LayoutTag – criteria about arrangement or graphical appearance + StructureTag – criteria about grouping or formation + RoleTag – criteria about function or mission + NamedEntityTag – criteria about assignment of terms to their relationship / meaning (NER) + OtherTag – criteria about any other characteristic not listed above, the TYPE attribute is intended to be used for classification within those. + + + + + + + + + + + + + + + + Defines one or more reading orders within the + page. Groups may be either unordered or ordered and can + contain other groups, e.g. a page containing + unrelated texts that are ordered individually + would be encoded as an UnorderedGroup containing + multiple OrderedGroups. The granularity of + elements can vary inside groups. + + + + + + + + + + + + + A reference to an element such as a block, TextLine, String, or Glyph. + + + + + + + A link to the referenced element. Valid + target elements are any block type, + TextLine, String, or Glyph. + + + + + + + Optionally annotates the role of the + referenced element in the reading order + with one or more tags. Examples could be + interlinear additions or marginalia. + + + + + + + + A group containing ordered elements (i.e. the sequence of OrderedGroup, UnorderedGroup or ElementRef subelements is ordered). + + + + + + + + + + + + + + Optionally annotates the role of the + group in the reading order + with one or more tags. Examples could be + distinguishing + parallel texts or apparatus criticus and + main text. + + + + + + + A link to the referenced element. Valid + target elements are any block type, + TextLine, or String. + + + + + + + + A group containing unordered elements (i.e. the sequence of OrderedGroup, UnorderedGroup or ElementRef subelements is arbitrary). + + + + + + + + + + + + + + + A link to the referenced element. Valid + target elements are any block type, + TextLine, or String. + + + + + + + Gives brief information about original page quality + + + + + + + + + + + + + + Gives more details about the original page quality, since QUALITY attribute gives only brief and restrictive information + + + + + + Position of the page. Could be lefthanded, righthanded, cover, foldout or single if it has no special position. + + + + + + + + + + + + Page Confidence: Confidence level of the ocr for this page. A value between 0 (unsure) and 1 (sure). + + + + + + + + + One page of a book or journal. + + + + + The area between the top line of print and the upper edge of the leaf. It may contain page number or running title. + + + + + The area between the printspace and the left border of a page. May contain margin notes. + + + + + The area between the printspace and the right border of a page. May contain margin notes. + + + + + The area between the bottom line of letterpress or writing and the bottom edge of the leaf. It may contain a page number, a signature number or a catch word. + + + + + Rectangle covering the printed area of a page. Page number and running title are not part of the print space. + + + + + + + Any user-defined class like title page. + + + + + + + + + The number of the page within the document. + + + + + The page number that is printed on the page. + + + + + + + + A link to the processing description that has been used for this page. + + + + + Estimated percentage of OCR Accuracy in range from 0 to 100 + + + + + + + + + + + + + A text style defines font properties of text. + + + + + + + A paragraph style defines formatting properties of text blocks. + + + + + Indicates the alignement of the paragraph. Could be left, right, center or justify. + + + + + + + + + + + + + Left indent of the paragraph in relation to the column. + + + + + Right indent of the paragraph in relation to the column. + + + + + Line spacing between two lines of the paragraph. Measurement calculated from baseline to baseline. + + + + + Indent of the first line of the paragraph if this is different from the other lines. A negative value indicates an indent to the left, a positive value indicates an indent to the right. + + + + + + + + + + + + + + + + + + + + + + + + + + + Group of available block types + + + + + A block of text. + + + + + A picture or image. + + + + + A graphic used to separate blocks. Usually a line or rectangle. + + + + + A block that consists of other blocks + + + + + + + Base type for any kind of block on the page. + + + + + + + + + + + + + + + Tells the rotation of e.g. text or illustration within the block. The value is in degree counterclockwise. + + + + + The next block in reading order of the page (if ReadingOrder is not specified, and elements are not in order). + + + + + Correction Status. Indicates whether manual correction has been done or not. The correction status should be recorded at the highest level possible (Block, TextLine, String). + + + + + + + A white space. + + + + + + + + + + Type of the substitution (if any). + + + + + + + + + + + + + + + Word Confidence: Confidence level of the ocr for this string. A value between 0 (unsure) and 1 (sure). + + + + + + + + + + Any alternative for the word. + Alternative can outline a variant of writing by new typing / spelling rules, typically manually done or by dictionary replacements. + The above sample is an old composed character "Æ" of ancient time, which is replaced now by "Ä". + As variant are meant alternatives of the real printed content which are options outlined by the text recognition process. + Similar sample: "Straße" vs. "Strasse". Such alternatives are not coming from text recognition. + + + + + + + Identifies the purpose of the alternative. + + + + + + + + A sequence of chars. Strings are separated by white spaces or hyphenation chars. + + + + + + + + + + + + + + + + + + + + Content of the substitution. + + + + + + Confidence level of each character in that string. A list of numbers, one number between 0 (sure) and 9 (unsure) for each character. + + + + + Correction Status. Indicates whether manual correction has been done or not. The correction status should be recorded at the highest level possible (Block, TextLine, String). + + + + + Attribute to record language of the string. The language should be recorded at the highest level possible. + + + + + + A region on a page + + + + + + + + + + + + + + + + + + A list of points + + + + + + Describes the bounding shape of a block, if it is not rectangular. + + + + + + + + + + Describes the inline base direction and line orientation of a line or of all lines inside a text block. + The meaning of these terms is defined by the W3C writing modes document: + These values should correspond to the base direction set in the BiDi algorithm to the respective elements during Unicode encoding. A value of "ttb" (top-to-bottom) implies a base direction of left-to-right, a value of "btt" (bottom-to-top) a base direction of right-to-left. + + + + + + + + + + + A polygon shape. + + + + + + An ellipse shape. HPOS and VPOS describe the center of the ellipse. + HLENGTH and VLENGTH are the width and height of the described ellipse. + The attribute ROTATION tells the rotation of the e.g. text or + illustration within the block. The value is in degrees counterclockwise. + + + + + + + + + + A circle shape. HPOS and VPOS describe the center of the circle. + + + + + + + + Formatting attributes. Note that these attributes are assumed to be inherited from ancestor elements of the document hierarchy. + + + + The font name. + + + + + + + The font size, in points (1/72 of an inch). + + + + + Font color as RGB value + + + + + + + Serif or Sans-Serif + + + + + + + + + fixed or proportional + + + + + + + + + + + All measurement values inside the alto file are related to + this unit, except the font size. + Coordinates as being used in HPOS and VPOS are absolute coordinates referring to the upper-left corner of a page. + The upper left corner of the page is defined as coordinate (0/0). + + values meaning: + mm10: 1/10th of millimeter + inch1200: 1/1200th of inch + pixel: 1 pixel + + The values for pixel will be related to the resolution of the image based + on which the layout is described. Incase the original image is not known + the scaling factor can be calculated based on total width and height of + the image and the according information of the PAGE element. + + + + + + + + + + + Information to identify the image file from which the OCR text was created. + + + + + + + + + + + + + + + + + + + A unique identifier for the image file. This is drawn from MIX. + This identifier must be unique within the local system. + To facilitate file sharing or interoperability with other systems, fileIdentifierLocation may be added to designate the system or application where the identifier is unique. + + + + + + A location qualifier, i.e., a namespace. + + + + + + + + + + + + + + A unique identifier for the document. + This identifier must be unique within the local system. + To facilitate file sharing or interoperability with other systems, documentIdentifierLocation may be added to designate the system or application where the identifier is unique. + + + + + + A location qualifier, i.e., a namespace. + + + + + + + + Deprecated. processingStepType should be used instead. + Information on how the text was created, including preprocessing, OCR processing, and postprocessing steps. Where possible, this draws from MIX's change history. + + + + + + + + + + Description of the processing step. + + + + + Classification of the category of operation, how the file was created, including generation, modification, preprocessing, postprocessing or any other steps. + + + + + Date or DateTime the image was processed. + + + + + Identifies the organizationlevel producer(s) of the processed image. + + + + + An ordinal listing of the image processing steps performed. For example, "image despeckling." + + + + + A description of any setting of the processing application. For example, for a multi-engine OCR application this might include the engines which were used. Ideally, this description should be adequate so that someone else using the same application can produce identical results. + + + + + + + + + + + + + + + + + + + + + Information about a software application. Where applicable, the preferred method for determining this information is by selecting Help -- About. + + + + + The name of the organization or company that created the application. + + + + + The name of the application. + + + + + The version of the application. + + + + + A description of any important characteristics of the application, especially for non-commercial applications. For example, if a non-commercial application is built using commercial components, e.g., an OCR engine SDK. Those components should be mentioned here. + + + + + + + + + + List of any combination of font styles + + + + + + + + + + + + + + + + + + + + + + + A block that consists of other blocks + + + + + + + + + A user defined string to identify the type of composed block (e.g. table, advertisement, ...) + + + + + An ID to link to an image which contains only the composed block. The ID and the file link is defined in the related METS file. + + + + + + + + A picture or image. + + + + + + A user defined string to identify the type of illustration like photo, map, drawing, chart, ... + + + + + A link to an image which contains only the illustration. + + + + + + + + A graphic used to separate blocks. Usually a line or rectangle. + + + + + + + + A block of text. + + + + + + + A single line of text. + + + + + + + + + + + + + A hyphenation char. Can appear only at the end of a line. + + + + + + + + + + + + + + + + + + + + + Pixel coordinates based on the left-hand top corner of an image which define a polyline on which a line of text rests. + + + + + Attribute to record language of the textline. + + + + + Correction Status. Indicates whether manual correction has been done or not. The correction status should be recorded at the highest level possible (Block, TextLine, String). + + + + + Indicates the inline base direction of this TextLine. Overrides the value on elements higher in the hierarchy. + + + + + + + + Attribute deprecated. LANG should be used instead. + + + + + Attribute to record language of the textblock. + + + + + Indicates the inline base direction of the TextBlock. + + + + + + + + + + + The xml data wrapper element XmlData is used to contain XML encoded metadata. + The content of an XmlData element can be in any namespace or in no namespace. + As permitted by the XML Schema Standard, the processContents attribute value for the + metadata in an XmlData is set to “lax”. Therefore, if the source schema and its location are + identified by means of an XML schemaLocation attribute, then an XML processor will validate + the elements for which it can find declarations. If a source schema is not identified, or cannot be + found at the specified schemaLocation, then an XML validator will check for well-formedness, + but otherwise skip over the elements appearing in the XmlData element. + + + + + + + + + + + + + Type can be used to classify and group the information within each tag element type. + + + + + Content / information value of the tag. + + + + + Description text for tag information for clarification. + + + + + Any URI for authority or description relevant information. + + + + + + + Modern OCR software stores information on glyph level. A glyph is essentially a character or ligature. + Accordingly the value for the glyph element will be defined as follows: + Pre-composed representation = base + combining character(s) (decomposed representation) + See http://www.fileformat.info/info/unicode/char/0101/index.htm + "U+0101" = (U+0061) + (U+0304) + "combining characters" ("base characters" in combination with non-spacing marks or characters which are combined to one) are represented as one "glyph", e.g. áàâ. + + Each glyph has its own coordinate information and must be separately addressable as a distinct object. + Correction and verification processes can be carried out for individual characters. + + Post-OCR analysis of the text as well as adaptive OCR algorithm must be able to record information on glyph level. + In order to reproduce the decision of the OCR software, optional characters must be recorded. These are called variants. + The OCR software evaluates each variant and picks the one with the highest confidence score as the glyph. + The confidence score expresses how confident the OCR software is that a single glyph had been recognized correctly. + + The glyph elements are in order of the word. Each glyph need to be recorded to built up the whole word sequence. + + The glyph’s CONTENT attribute is no replacement for the string’s CONTENT attribute. + Due to post-processing steps such as correction the values of both attributes may be inconsistent. + + + + + + + + + + + CONTENT contains the precomposed representation (combining character) of the character from the parent String element. + The sequence position of the Gylph element matches the position of the character in the String. + + + + + + + + + + + + + This GC attribute records a float value between 0.0 and 1.0 that expresses the level of confidence for the glyph where 1 is certain. + This attribute is optional. If it is not available, the default value for the glyph is “0”. + The GC attribute semantic is the same as the WC attribute on the String element and VC on Variant element. + + + + + + + + + + + + + + + + + + Alternative (combined) character for the glyph, outlined by OCR engine or similar recognition processes. + In case the variant are two (combining) characters, two characters are outlined in one Variant element. + E.g. a Glyph element with CONTENT="m" can have a Variant element with the content "rn". + Details for different use-cases see on the samples on GitHub. + + + + + + Each Variant represents an option for the glyph that the OCR software detected as possible alternatives. + In case the variant are two (combining) characters, two characters are outlined in one Variant element. + E.g. a Glyph element with CONTENT="m" can have a Variant element with the content "rn". + Details for different use-cases see on the samples on GitHub. + + + + + + + + + + + + + This VC attribute records a float value between 0.0 and 1.0 that expresses the level of confidence for the variant where is 1 is certain. + This attribute is optional. If it is not available, the default value for the variant is “0”. + The VC attribute semantic is the same as the GC attribute on the Glyph element. + + + + + + + + + + + diff --git a/tests/resources/cPAS-2000.xml b/tests/resources/cPAS-2000.xml index d9f844121..adc36de41 100644 --- a/tests/resources/cPAS-2000.xml +++ b/tests/resources/cPAS-2000.xml @@ -1,410 +1,410 @@ - - - - TRP - 2018-12-24T11:28:19+07:00 - 2019-02-05T09:16:48Z - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + TRP + 2018-12-24T11:28:19+07:00 + 2019-02-05T09:16:48Z + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/resources/pagecontent.xsd b/tests/resources/pagecontent.xsd index 5874131c8..d45d51680 100644 --- a/tests/resources/pagecontent.xsd +++ b/tests/resources/pagecontent.xsd @@ -1,2644 +1,2644 @@ - - - - - - Page Content - Ground Truth and Storage - - - - - - - - - - - - - - - - The timestamp has to be in UTC (Coordinated - Universal Time) and not local time. - - - - - - - The timestamp has to be in UTC - (Coordinated Universal Time) - and not local time. - - - - - - - - - - - - - External reference of any kind - - - - - - - - Semantic labels / tags - - - - - - - Type of metadata (e.g. author) - - - - - - - - - - - - - - - E.g. imagePhotometricInterpretation - - - - - - E.g. RGB - - - - - - - - - - A semantic label / tag - - - - - - - - Reference to external model / ontology / schema - - - - - - - E.g. an RDF resource identifier - (to be used as subject or object of an RDF triple) - - - - - - - Prefix for all labels (e.g. first part of an URI) - - - - - - - - Semantic label - - - - - The label / tag (e.g. 'person'). - Can be an RDF resource identifier - (e.g. object of an RDF triple). - - - - - - - Additional information on the label - (e.g. 'YYYY-mm-dd' for a date label). - Can be used as predicate of an RDF triple. - - - - - - - - - - - - Alternative document page images - (e.g. black-and-white). - - - - - - - - - - Order of blocks within the page. - - - - - - Unassigned regions are considered to be in the - (virtual) default layer which is to be treated - as below any other layers. - - - - - - - - Default text style - - - - - - - Semantic labels / tags - - - - - - - - - - - - - - - - - - - - - - - - Contains the image file name including the file extension. - - - - - - Specifies the width of the image. - - - - - Specifies the height of the image. - - - - - Specifies the image resolution in width. - - - - - Specifies the image resolution in height. - - - - - - Specifies the unit of the resolution information - referring to a standardised unit of measurement - (pixels per inch, pixels per centimeter or other). - - - - - - - - - - - - - For generic use - - - - - - The angle the rectangle encapsulating the page - (or its Border) has to be rotated in clockwise direction - in order to correct the present skew - (negative values indicate anti-clockwise rotation). - (The rotated image can be further referenced - via “AlternativeImage”.) - Range: -179.999,180 - - - - - - - The type of the page within the document - (e.g. cover page). - - - - - - - The primary language used in the page - (lower-level definitions override the page-level definition). - - - - - - - The secondary language used in the page - (lower-level definitions override the page-level definition). - - - - - - - The primary script used in the page - (lower-level definitions override the page-level definition). - - - - - - - The secondary script used in the page - (lower-level definitions override the page-level definition). - - - - - - - The direction in which text within lines - should be read (order of words and characters), - in addition to “textLineOrder” - (lower-level definitions override the page-level definition). - - - - - - - The order of text lines within a block, - in addition to “readingDirection” - (lower-level definitions override the page-level definition). - - - - - - Confidence value for whole page (between 0 and 1) - - - - - - - Pure text is represented as a text region. This includes - drop capitals, but practically ornate text may be - considered as a graphic. - - - - - - - - - - - - - The angle the rectangle encapsulating the region - has to be rotated in clockwise direction - in order to correct the present skew - (negative values indicate anti-clockwise rotation). - (The rotated image can be further referenced - via “AlternativeImage”.) - Range: -179.999,180 - - - - - - - The nature of the text in the region - - - - - - - The degree of space in points between the lines of - text (line spacing) - - - - - - - The direction in which text within lines - should be read (order of words and characters), - in addition to “textLineOrder”. - - - - - - - The order of text lines within the block, - in addition to “readingDirection”. - - - - - - - The angle the baseline of text within the region - has to be rotated (relative to the rectangle - encapsulating the region) in clockwise direction - in order to correct the present skew, - in addition to “orientation” - (negative values indicate anti-clockwise rotation). - Range: -179.999,180 - - - - - - - Defines whether a region of text is indented or not - - - - - - Text align - - - - - - The primary language used in the region - - - - - - - The secondary language used in the region - - - - - - - The primary script used in the region - - - - - - - The secondary script used in the region - - - - - - - - - - - - Polygon outline of the element as a path of points. - No points may lie outside the outline of its parent, - which in the case of Border is the bounding rectangle - of the root image. Paths are closed by convention, - i.e. the last point logically connects with the first - (and at least 3 points are required to span an area). - Paths must be planar (i.e. must not self-intersect). - - - - - - Confidence value (between 0 and 1) - - - - - - - - - Alternative text line images (e.g. - black-and-white) - - - - - - - - Multiple connected points that mark the baseline - of the glyphs - - - - - - - - - - - - - - Semantic labels / tags - - - - - - - - Overrides primaryLanguage attribute of parent text - region - - - - - - - The primary script used in the text line - - - - - - - The secondary script used in the text line - - - - - - - The direction in which text within the line - should be read (order of words and characters). - - - - - - - Overrides the production attribute of the parent - text region - - - - - - For generic use - - - - - - - Position (order number) of this text line within the - parent text region. - - - - - - - - - - Alternative word images (e.g. - black-and-white) - - - - - - - - - - - - - - - Semantic labels / tags - - - - - - - - Overrides primaryLanguage attribute of parent line - and/or text region - - - - - - - The primary script used in the word - - - - - - - The secondary script used in the word - - - - - - - The direction in which text within the word - should be read (order of characters). - - - - - - - Overrides the production attribute of the parent - text line and/or text region. - - - - - - For generic use - - - - - - - - - - Alternative glyph images (e.g. - black-and-white) - - - - - - - - Container for graphemes, grapheme groups and - non-printing characters - - - - - - - - - - - - Semantic labels / tags - - - - - - - - - - The script used for the glyph - - - - - - - Overrides the production attribute of the parent - word / text line / text region. - - - - - - For generic use - - - - - - - - - - Text in a "simple" form (ASCII or extended ASCII - as mostly used for typing). I.e. no use of - special characters for ligatures (should be - stored as two separate characters) etc. - - - - - - - Correct encoding of the original, always using - the corresponding Unicode code point. I.e. - ligatures have to be represented as one - character etc. - - - - - - - - Used for sort order in case multiple TextEquivs are defined. - The text content with the lowest index should be interpreted - as the main text content. - - - - - - - - - - - OCR confidence value (between 0 and 1) - - - - - - Type of text content (is it free text or a number, for instance). - This is only a descriptive attribute, the text type - is not checked during XML validation. - - - - - - - Refinement for dataType attribute. Can be a regular expression, for instance. - - - - - - - - - - An image is considered to be more intricate and complex - than a graphic. These can be photos or drawings. - - - - - - - - The angle the rectangle encapsulating a region - has to be rotated in clockwise direction - in order to correct the present skew - (negative values indicate anti-clockwise rotation). - Range: -179.999,180 - - - - - - - The colour bit depth required for the region - - - - - - - The background colour of the region - - - - - - - Specifies whether the region also contains - text - - - - - - - - - - A line drawing is a single colour illustration without - solid areas. - - - - - - - - The angle the rectangle encapsulating a region - has to be rotated in clockwise direction - in order to correct the present skew - (negative values indicate anti-clockwise rotation). - Range: -179.999,180 - - - - - - - The pen (foreground) colour of the region - - - - - - - The background colour of the region - - - - - - - Specifies whether the region also contains - text - - - - - - - - - - Regions containing simple graphics, such as a company - logo, should be marked as graphic regions. - - - - - - - - The angle the rectangle encapsulating a region - has to be rotated in clockwise direction - in order to correct the present skew - (negative values indicate anti-clockwise rotation). - Range: -179.999,180 - - - - - - - The type of graphic in the region - - - - - - - An approximation of the number of colours - used in the region - - - - - - - Specifies whether the region also contains - text. - - - - - - - - - - Tabular data in any form is represented with a table - region. Rows and columns may or may not have separator - lines; these lines are not separator regions. - - - - - - - - Table grid (visible or virtual grid lines) - - - - - - - The angle the rectangle encapsulating a region - has to be rotated in clockwise direction - in order to correct the present skew - (negative values indicate anti-clockwise rotation). - Range: -179.999,180 - - - - - - - The number of rows present in the table - - - - - - - The number of columns present in the table - - - - - - - The colour of the lines used in the region - - - - - - - The background colour of the region - - - - - - - Specifies the presence of line separators - - - - - - - Specifies whether the region also contains - text - - - - - - - - - - Matrix of grid points defining the table grid on the page. - - - - - - - One row in the grid point matrix. - Points with x,y coordinates. - (note: for a table with n table rows there should be n+1 grid rows) - - - - - - - - Points with x,y coordinates. - - - - - The grid row index - - - - - - - - - Regions containing charts or graphs of any type, should - be marked as chart regions. - - - - - - - - The angle the rectangle encapsulating a region - has to be rotated in clockwise direction - in order to correct the present skew - (negative values indicate anti-clockwise rotation). - Range: -179.999,180 - - - - - - - The type of chart in the region - - - - - - - An approximation of the number of colours - used in the region - - - - - - - The background colour of the region - - - - - - - Specifies whether the region also contains - text - - - - - - - - - - Separators are lines that lie between columns and - paragraphs and can be used to logically separate - different articles from each other. - - - - - - - - The angle the rectangle encapsulating a region - has to be rotated in clockwise direction - in order to correct the present skew - (negative values indicate anti-clockwise rotation). - Range: -179.999,180 - - - - - - - The colour of the separator - - - - - - - - - - Regions containing equations and mathematical symbols - should be marked as maths regions. - - - - - - - - The angle the rectangle encapsulating a region - has to be rotated in clockwise direction - in order to correct the present skew - (negative values indicate anti-clockwise rotation). - Range: -179.999,180 - - - - - - - The background colour of the region - - - - - - - - - - Regions containing chemical formulas. - - - - - - - - The angle the rectangle encapsulating a - region has to be rotated in clockwise - direction in order to correct the present - skew (negative values indicate - anti-clockwise rotation). Range: - -179.999,180 - - - - - - - The background colour of the region - - - - - - - - - - Regions containing maps. - - - - - - - - The angle the rectangle encapsulating a - region has to be rotated in clockwise - direction in order to correct the present - skew (negative values indicate - anti-clockwise rotation). Range: - -179.999,180 - - - - - - - - - - Regions containing musical notations. - - - - - - - - The angle the rectangle encapsulating a region - has to be rotated in clockwise direction - in order to correct the present skew - (negative values indicate anti-clockwise rotation). - Range: -179.999,180 - - - - - - - The background colour of the region - - - - - - - - - - Regions containing advertisements. - - - - - - - - The angle the rectangle encapsulating a region - has to be rotated in clockwise direction - in order to correct the present skew - (negative values indicate anti-clockwise rotation). - Range: -179.999,180 - - - - - - - The background colour of the region - - - - - - - - - - Noise regions are regions where no real data lies, only - false data created by artifacts on the document or - scanner noise. - - - - - - - - - - To be used if the region type cannot be ascertained. - - - - - - - - - - Regions containing content that is not covered - by the default types (text, graphic, image, - line drawing, chart, table, separator, maths, - map, music, chem, advert, noise, unknown). - - - - - - - - Information on the type of content represented by this region - - - - - - - - - - Determines the effective area on the paper of a printed page. - Its size is equal for all pages of a book - (exceptions: titlepage, multipage pictures). - It contains all living elements (except marginals) - like body type, footnotes, headings, running titles. - It does not contain pagenumber (if not part of running title), - marginals, signature mark, preview words. - - - - - - - - - - Definition of the reading order within the page. - To express a reading order between elements - they have to be included in an OrderedGroup. - Groups may contain further groups. - - - - - - - - - Confidence value (between 0 and 1) - - - - - - Numbered region - - - - Position (order number) of this item within the current hierarchy level. - - - - - - - - Indexed group containing ordered elements - - - - - - - Semantic labels / tags - - - - - - - - - - - - - Optional link to a parent region of nested regions. - The parent region doubles as reading order group. - Only the nested regions should be allowed as group members. - - - - - - - Position (order number) of this item within the - current hierarchy level. - - - - - - - - - Is this group a continuation of another group (from - previous column or page, for example)? - - - - - - For generic use - - - - - - - - Indexed group containing unordered elements - - - - - - - - Semantic labels / tags - - - - - - - - - - - - - Optional link to a parent region of nested regions. - The parent region doubles as reading order group. - Only the nested regions should be allowed as group members. - - - - - - - Position (order number) of this item within the - current hierarchy level. - - - - - - - - - Is this group a continuation of another group - (from previous column or page, for example)? - - - - - - For generic use - - - - - - - - - - - Numbered group (contains ordered elements) - - - - - - - - Semantic labels / tags - - - - - - - - - - - - - Optional link to a parent region of nested regions. - The parent region doubles as reading order group. - Only the nested regions should be allowed as group members. - - - - - - - - - Is this group a continuation of another group - (from previous column or page, for example)? - - - - - - For generic use - - - - - - - - Numbered group (contains unordered elements) - - - - - - - - Semantic labels / tags - - - - - - - - - - - - - Optional link to a parent region of nested regions. - The parent region doubles as reading order group. - Only the nested regions should be allowed as group members. - - - - - - - - - Is this group a continuation of another group - (from previous column or page, for example)? - - - - - - For generic use - - - - - - - - Border of the actual page (if the scanned image - contains parts not belonging to the page). - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ISO 639.x 2016-07-14 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - iso15924 2016-07-14 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Can be used to express the z-index of overlapping - regions. An element with a greater z-index is always in - front of another element with lower z-index. - - - - - - - - - - - - - - - - - - - - - - Confidence value (between 0 and 1) - - - - - - - - Point list with format "x1,y1 x2,y2 ...", where - "x" / "y" refer to the horizontal / vertical - pixel positions in a coordinate system which always - references the root PageType/@imageFilename, with - "0,0" in the upper left corner of the root image and - "imageWidth,imageHeight" in the lower right. - - - - - - - - - - Container for one-to-one relations between layout - objects (for example: DropCap - paragraph, caption - - image). - - - - - - - - - - - One-to-one relation between to layout object. Use 'link' - for loose relations and 'join' for strong relations - (where something is fragmented for instance). - - Examples for 'link': caption - image floating - - paragraph paragraph - paragraph (when a paragraph is - split across columns and the last word of the first - paragraph DOES NOT continue in the second paragraph) - drop-cap - paragraph (when the drop-cap is a whole word) - - Examples for 'join': word - word (separated word at the - end of a line) drop-cap - paragraph (when the drop-cap - is not a whole word) paragraph - paragraph (when a - pragraph is split across columns and the last word of - the first paragraph DOES continue in the second - paragraph) - - - - - - Semantic labels / tags - - - - - - - - - - - - - - - - - - - For generic use - - - - - - - - Text production type - - - - - - - - - - - - - - - Monospace (fixed-pitch, non-proportional) or - proportional font. - - - - - - For instance: Arial, Times New Roman. - Add more information if necessary - (e.g. blackletter, antiqua). - - - - - - - Serif or sans-serif typeface. - - - - - - - - The size of the characters in points. - - - - - - - The x-height or corpus size refers to the distance - between the baseline and the mean line of - lower-case letters in a typeface. - The unit is assumed to be pixels. - - - - - - - The degree of space (in points) between - the characters in a string of text. - - - - - - - - Text colour in RGB encoded format - (red value) + (256 x green value) + (65536 x blue value). - - - - - - Background colour - - - - - - Background colour in RGB encoded format - (red value) + (256 x green value) + (65536 x blue value). - - - - - - - Specifies whether the colour of the text appears - reversed against a background colour. - - - - - - - - - Line style details if "underlined" is TRUE - - - - - - - - - - - - - - - - Alternative region images - (e.g. black-and-white). - - - - - - - - - Semantic labels / tags - - - - - - Roles the region takes - (e.g. in context of a parent region). - - - - - - - - - - - - - - - - - - - - - - - - For generic use - - - - - - - Is this region a continuation of another region - (in previous column or page, for example)? - - - - - - - - - - - Confidence value (between 0 and 1) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Examples: - "123.456", "+1234.456", - "-1234.456", "-.456", "-456" - - - - - - - Examples: - "123.456", "+1234.456", "-1.2344e56", - "-.45E-6", "INF", "-INF", "NaN" - - - - - - - Examples: - "123456", "+00000012", "-1", "-456" - - - - - - - Examples: "true", "false", "1", "0" - - - - - - - Examples: - "2001-10-26", "2001-10-26+02:00", - "2001-10-26Z", "2001-10-26+00:00", - "-2001-10-26", "-20000-04-01" - - - - - - - Examples: - "21:32:52", "21:32:52+02:00", "19:32:52Z", - "19:32:52+00:00", "21:32:52.12679" - - - - - - - Examples: - "2001-10-26T21:32:52", "2001-10-26T21:32:52+02:00", - "2001-10-26T19:32:52Z", "2001-10-26T19:32:52+00:00", - "-2001-10-26T21:32:52", "2001-10-26T21:32:52.12679" - - - - - - Generic text string - - - - - - An XSD type that is not listed or a custom type - (use dataTypeDetails attribute). - - - - - - - - - Container for graphemes, grapheme groups and - non-printing characters. - - - - - - - - - - - - Base type for graphemes, grapheme groups and non-printing characters. - - - - - - - - - - Order index of grapheme, group, or non-printing character - within the parent container (graphemes or glyph or grapheme group). - - - - - - - - - - - - - Type of character represented by the - grapheme, group, or non-printing character element. - - - - - - - - - - - - For generic use - - - - - For generic use - - - - - - - Represents a sub-element of a glyph. - Smallest graphical unit that can be - assigned a Unicode code point. - - - - - - - - - - - - - - A glyph component without visual representation - but with Unicode code point. - Non-visual / non-printing / control character. - Part of grapheme container (of glyph) or grapheme sub group. - - - - - - - - - - - - - - - - - - - - - Container for user-defined attributes - - - - - - - - - Structured custom data defined by name, type and value. - - - - - - - - - - - - - - - - - - - - Cell position in table starting with row 0 - - - - - Cell position in table starting with column 0 - - - - - Number of rows the cell spans (optional; default is 1) - - - - - Number of columns the cell spans (optional; default is 1) - - - - - - Is the cell a column or row header? - - - - - - - - - - Data for a region that takes on the role - of a table cell within a parent table region. - - - - - - - - - - - - - + + + + + + Page Content - Ground Truth and Storage + + + + + + + + + + + + + + + + The timestamp has to be in UTC (Coordinated + Universal Time) and not local time. + + + + + + + The timestamp has to be in UTC + (Coordinated Universal Time) + and not local time. + + + + + + + + + + + + + External reference of any kind + + + + + + + + Semantic labels / tags + + + + + + + Type of metadata (e.g. author) + + + + + + + + + + + + + + + E.g. imagePhotometricInterpretation + + + + + + E.g. RGB + + + + + + + + + + A semantic label / tag + + + + + + + + Reference to external model / ontology / schema + + + + + + + E.g. an RDF resource identifier + (to be used as subject or object of an RDF triple) + + + + + + + Prefix for all labels (e.g. first part of an URI) + + + + + + + + Semantic label + + + + + The label / tag (e.g. 'person'). + Can be an RDF resource identifier + (e.g. object of an RDF triple). + + + + + + + Additional information on the label + (e.g. 'YYYY-mm-dd' for a date label). + Can be used as predicate of an RDF triple. + + + + + + + + + + + + Alternative document page images + (e.g. black-and-white). + + + + + + + + + + Order of blocks within the page. + + + + + + Unassigned regions are considered to be in the + (virtual) default layer which is to be treated + as below any other layers. + + + + + + + + Default text style + + + + + + + Semantic labels / tags + + + + + + + + + + + + + + + + + + + + + + + + Contains the image file name including the file extension. + + + + + + Specifies the width of the image. + + + + + Specifies the height of the image. + + + + + Specifies the image resolution in width. + + + + + Specifies the image resolution in height. + + + + + + Specifies the unit of the resolution information + referring to a standardised unit of measurement + (pixels per inch, pixels per centimeter or other). + + + + + + + + + + + + + For generic use + + + + + + The angle the rectangle encapsulating the page + (or its Border) has to be rotated in clockwise direction + in order to correct the present skew + (negative values indicate anti-clockwise rotation). + (The rotated image can be further referenced + via “AlternativeImage”.) + Range: -179.999,180 + + + + + + + The type of the page within the document + (e.g. cover page). + + + + + + + The primary language used in the page + (lower-level definitions override the page-level definition). + + + + + + + The secondary language used in the page + (lower-level definitions override the page-level definition). + + + + + + + The primary script used in the page + (lower-level definitions override the page-level definition). + + + + + + + The secondary script used in the page + (lower-level definitions override the page-level definition). + + + + + + + The direction in which text within lines + should be read (order of words and characters), + in addition to “textLineOrder” + (lower-level definitions override the page-level definition). + + + + + + + The order of text lines within a block, + in addition to “readingDirection” + (lower-level definitions override the page-level definition). + + + + + + Confidence value for whole page (between 0 and 1) + + + + + + + Pure text is represented as a text region. This includes + drop capitals, but practically ornate text may be + considered as a graphic. + + + + + + + + + + + + + The angle the rectangle encapsulating the region + has to be rotated in clockwise direction + in order to correct the present skew + (negative values indicate anti-clockwise rotation). + (The rotated image can be further referenced + via “AlternativeImage”.) + Range: -179.999,180 + + + + + + + The nature of the text in the region + + + + + + + The degree of space in points between the lines of + text (line spacing) + + + + + + + The direction in which text within lines + should be read (order of words and characters), + in addition to “textLineOrder”. + + + + + + + The order of text lines within the block, + in addition to “readingDirection”. + + + + + + + The angle the baseline of text within the region + has to be rotated (relative to the rectangle + encapsulating the region) in clockwise direction + in order to correct the present skew, + in addition to “orientation” + (negative values indicate anti-clockwise rotation). + Range: -179.999,180 + + + + + + + Defines whether a region of text is indented or not + + + + + + Text align + + + + + + The primary language used in the region + + + + + + + The secondary language used in the region + + + + + + + The primary script used in the region + + + + + + + The secondary script used in the region + + + + + + + + + + + + Polygon outline of the element as a path of points. + No points may lie outside the outline of its parent, + which in the case of Border is the bounding rectangle + of the root image. Paths are closed by convention, + i.e. the last point logically connects with the first + (and at least 3 points are required to span an area). + Paths must be planar (i.e. must not self-intersect). + + + + + + Confidence value (between 0 and 1) + + + + + + + + + Alternative text line images (e.g. + black-and-white) + + + + + + + + Multiple connected points that mark the baseline + of the glyphs + + + + + + + + + + + + + + Semantic labels / tags + + + + + + + + Overrides primaryLanguage attribute of parent text + region + + + + + + + The primary script used in the text line + + + + + + + The secondary script used in the text line + + + + + + + The direction in which text within the line + should be read (order of words and characters). + + + + + + + Overrides the production attribute of the parent + text region + + + + + + For generic use + + + + + + + Position (order number) of this text line within the + parent text region. + + + + + + + + + + Alternative word images (e.g. + black-and-white) + + + + + + + + + + + + + + + Semantic labels / tags + + + + + + + + Overrides primaryLanguage attribute of parent line + and/or text region + + + + + + + The primary script used in the word + + + + + + + The secondary script used in the word + + + + + + + The direction in which text within the word + should be read (order of characters). + + + + + + + Overrides the production attribute of the parent + text line and/or text region. + + + + + + For generic use + + + + + + + + + + Alternative glyph images (e.g. + black-and-white) + + + + + + + + Container for graphemes, grapheme groups and + non-printing characters + + + + + + + + + + + + Semantic labels / tags + + + + + + + + + + The script used for the glyph + + + + + + + Overrides the production attribute of the parent + word / text line / text region. + + + + + + For generic use + + + + + + + + + + Text in a "simple" form (ASCII or extended ASCII + as mostly used for typing). I.e. no use of + special characters for ligatures (should be + stored as two separate characters) etc. + + + + + + + Correct encoding of the original, always using + the corresponding Unicode code point. I.e. + ligatures have to be represented as one + character etc. + + + + + + + + Used for sort order in case multiple TextEquivs are defined. + The text content with the lowest index should be interpreted + as the main text content. + + + + + + + + + + + OCR confidence value (between 0 and 1) + + + + + + Type of text content (is it free text or a number, for instance). + This is only a descriptive attribute, the text type + is not checked during XML validation. + + + + + + + Refinement for dataType attribute. Can be a regular expression, for instance. + + + + + + + + + + An image is considered to be more intricate and complex + than a graphic. These can be photos or drawings. + + + + + + + + The angle the rectangle encapsulating a region + has to be rotated in clockwise direction + in order to correct the present skew + (negative values indicate anti-clockwise rotation). + Range: -179.999,180 + + + + + + + The colour bit depth required for the region + + + + + + + The background colour of the region + + + + + + + Specifies whether the region also contains + text + + + + + + + + + + A line drawing is a single colour illustration without + solid areas. + + + + + + + + The angle the rectangle encapsulating a region + has to be rotated in clockwise direction + in order to correct the present skew + (negative values indicate anti-clockwise rotation). + Range: -179.999,180 + + + + + + + The pen (foreground) colour of the region + + + + + + + The background colour of the region + + + + + + + Specifies whether the region also contains + text + + + + + + + + + + Regions containing simple graphics, such as a company + logo, should be marked as graphic regions. + + + + + + + + The angle the rectangle encapsulating a region + has to be rotated in clockwise direction + in order to correct the present skew + (negative values indicate anti-clockwise rotation). + Range: -179.999,180 + + + + + + + The type of graphic in the region + + + + + + + An approximation of the number of colours + used in the region + + + + + + + Specifies whether the region also contains + text. + + + + + + + + + + Tabular data in any form is represented with a table + region. Rows and columns may or may not have separator + lines; these lines are not separator regions. + + + + + + + + Table grid (visible or virtual grid lines) + + + + + + + The angle the rectangle encapsulating a region + has to be rotated in clockwise direction + in order to correct the present skew + (negative values indicate anti-clockwise rotation). + Range: -179.999,180 + + + + + + + The number of rows present in the table + + + + + + + The number of columns present in the table + + + + + + + The colour of the lines used in the region + + + + + + + The background colour of the region + + + + + + + Specifies the presence of line separators + + + + + + + Specifies whether the region also contains + text + + + + + + + + + + Matrix of grid points defining the table grid on the page. + + + + + + + One row in the grid point matrix. + Points with x,y coordinates. + (note: for a table with n table rows there should be n+1 grid rows) + + + + + + + + Points with x,y coordinates. + + + + + The grid row index + + + + + + + + + Regions containing charts or graphs of any type, should + be marked as chart regions. + + + + + + + + The angle the rectangle encapsulating a region + has to be rotated in clockwise direction + in order to correct the present skew + (negative values indicate anti-clockwise rotation). + Range: -179.999,180 + + + + + + + The type of chart in the region + + + + + + + An approximation of the number of colours + used in the region + + + + + + + The background colour of the region + + + + + + + Specifies whether the region also contains + text + + + + + + + + + + Separators are lines that lie between columns and + paragraphs and can be used to logically separate + different articles from each other. + + + + + + + + The angle the rectangle encapsulating a region + has to be rotated in clockwise direction + in order to correct the present skew + (negative values indicate anti-clockwise rotation). + Range: -179.999,180 + + + + + + + The colour of the separator + + + + + + + + + + Regions containing equations and mathematical symbols + should be marked as maths regions. + + + + + + + + The angle the rectangle encapsulating a region + has to be rotated in clockwise direction + in order to correct the present skew + (negative values indicate anti-clockwise rotation). + Range: -179.999,180 + + + + + + + The background colour of the region + + + + + + + + + + Regions containing chemical formulas. + + + + + + + + The angle the rectangle encapsulating a + region has to be rotated in clockwise + direction in order to correct the present + skew (negative values indicate + anti-clockwise rotation). Range: + -179.999,180 + + + + + + + The background colour of the region + + + + + + + + + + Regions containing maps. + + + + + + + + The angle the rectangle encapsulating a + region has to be rotated in clockwise + direction in order to correct the present + skew (negative values indicate + anti-clockwise rotation). Range: + -179.999,180 + + + + + + + + + + Regions containing musical notations. + + + + + + + + The angle the rectangle encapsulating a region + has to be rotated in clockwise direction + in order to correct the present skew + (negative values indicate anti-clockwise rotation). + Range: -179.999,180 + + + + + + + The background colour of the region + + + + + + + + + + Regions containing advertisements. + + + + + + + + The angle the rectangle encapsulating a region + has to be rotated in clockwise direction + in order to correct the present skew + (negative values indicate anti-clockwise rotation). + Range: -179.999,180 + + + + + + + The background colour of the region + + + + + + + + + + Noise regions are regions where no real data lies, only + false data created by artifacts on the document or + scanner noise. + + + + + + + + + + To be used if the region type cannot be ascertained. + + + + + + + + + + Regions containing content that is not covered + by the default types (text, graphic, image, + line drawing, chart, table, separator, maths, + map, music, chem, advert, noise, unknown). + + + + + + + + Information on the type of content represented by this region + + + + + + + + + + Determines the effective area on the paper of a printed page. + Its size is equal for all pages of a book + (exceptions: titlepage, multipage pictures). + It contains all living elements (except marginals) + like body type, footnotes, headings, running titles. + It does not contain pagenumber (if not part of running title), + marginals, signature mark, preview words. + + + + + + + + + + Definition of the reading order within the page. + To express a reading order between elements + they have to be included in an OrderedGroup. + Groups may contain further groups. + + + + + + + + + Confidence value (between 0 and 1) + + + + + + Numbered region + + + + Position (order number) of this item within the current hierarchy level. + + + + + + + + Indexed group containing ordered elements + + + + + + + Semantic labels / tags + + + + + + + + + + + + + Optional link to a parent region of nested regions. + The parent region doubles as reading order group. + Only the nested regions should be allowed as group members. + + + + + + + Position (order number) of this item within the + current hierarchy level. + + + + + + + + + Is this group a continuation of another group (from + previous column or page, for example)? + + + + + + For generic use + + + + + + + + Indexed group containing unordered elements + + + + + + + + Semantic labels / tags + + + + + + + + + + + + + Optional link to a parent region of nested regions. + The parent region doubles as reading order group. + Only the nested regions should be allowed as group members. + + + + + + + Position (order number) of this item within the + current hierarchy level. + + + + + + + + + Is this group a continuation of another group + (from previous column or page, for example)? + + + + + + For generic use + + + + + + + + + + + Numbered group (contains ordered elements) + + + + + + + + Semantic labels / tags + + + + + + + + + + + + + Optional link to a parent region of nested regions. + The parent region doubles as reading order group. + Only the nested regions should be allowed as group members. + + + + + + + + + Is this group a continuation of another group + (from previous column or page, for example)? + + + + + + For generic use + + + + + + + + Numbered group (contains unordered elements) + + + + + + + + Semantic labels / tags + + + + + + + + + + + + + Optional link to a parent region of nested regions. + The parent region doubles as reading order group. + Only the nested regions should be allowed as group members. + + + + + + + + + Is this group a continuation of another group + (from previous column or page, for example)? + + + + + + For generic use + + + + + + + + Border of the actual page (if the scanned image + contains parts not belonging to the page). + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ISO 639.x 2016-07-14 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + iso15924 2016-07-14 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Can be used to express the z-index of overlapping + regions. An element with a greater z-index is always in + front of another element with lower z-index. + + + + + + + + + + + + + + + + + + + + + + Confidence value (between 0 and 1) + + + + + + + + Point list with format "x1,y1 x2,y2 ...", where + "x" / "y" refer to the horizontal / vertical + pixel positions in a coordinate system which always + references the root PageType/@imageFilename, with + "0,0" in the upper left corner of the root image and + "imageWidth,imageHeight" in the lower right. + + + + + + + + + + Container for one-to-one relations between layout + objects (for example: DropCap - paragraph, caption - + image). + + + + + + + + + + + One-to-one relation between to layout object. Use 'link' + for loose relations and 'join' for strong relations + (where something is fragmented for instance). + + Examples for 'link': caption - image floating - + paragraph paragraph - paragraph (when a paragraph is + split across columns and the last word of the first + paragraph DOES NOT continue in the second paragraph) + drop-cap - paragraph (when the drop-cap is a whole word) + + Examples for 'join': word - word (separated word at the + end of a line) drop-cap - paragraph (when the drop-cap + is not a whole word) paragraph - paragraph (when a + pragraph is split across columns and the last word of + the first paragraph DOES continue in the second + paragraph) + + + + + + Semantic labels / tags + + + + + + + + + + + + + + + + + + + For generic use + + + + + + + + Text production type + + + + + + + + + + + + + + + Monospace (fixed-pitch, non-proportional) or + proportional font. + + + + + + For instance: Arial, Times New Roman. + Add more information if necessary + (e.g. blackletter, antiqua). + + + + + + + Serif or sans-serif typeface. + + + + + + + + The size of the characters in points. + + + + + + + The x-height or corpus size refers to the distance + between the baseline and the mean line of + lower-case letters in a typeface. + The unit is assumed to be pixels. + + + + + + + The degree of space (in points) between + the characters in a string of text. + + + + + + + + Text colour in RGB encoded format + (red value) + (256 x green value) + (65536 x blue value). + + + + + + Background colour + + + + + + Background colour in RGB encoded format + (red value) + (256 x green value) + (65536 x blue value). + + + + + + + Specifies whether the colour of the text appears + reversed against a background colour. + + + + + + + + + Line style details if "underlined" is TRUE + + + + + + + + + + + + + + + + Alternative region images + (e.g. black-and-white). + + + + + + + + + Semantic labels / tags + + + + + + Roles the region takes + (e.g. in context of a parent region). + + + + + + + + + + + + + + + + + + + + + + + + For generic use + + + + + + + Is this region a continuation of another region + (in previous column or page, for example)? + + + + + + + + + + + Confidence value (between 0 and 1) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Examples: + "123.456", "+1234.456", + "-1234.456", "-.456", "-456" + + + + + + + Examples: + "123.456", "+1234.456", "-1.2344e56", + "-.45E-6", "INF", "-INF", "NaN" + + + + + + + Examples: + "123456", "+00000012", "-1", "-456" + + + + + + + Examples: "true", "false", "1", "0" + + + + + + + Examples: + "2001-10-26", "2001-10-26+02:00", + "2001-10-26Z", "2001-10-26+00:00", + "-2001-10-26", "-20000-04-01" + + + + + + + Examples: + "21:32:52", "21:32:52+02:00", "19:32:52Z", + "19:32:52+00:00", "21:32:52.12679" + + + + + + + Examples: + "2001-10-26T21:32:52", "2001-10-26T21:32:52+02:00", + "2001-10-26T19:32:52Z", "2001-10-26T19:32:52+00:00", + "-2001-10-26T21:32:52", "2001-10-26T21:32:52.12679" + + + + + + Generic text string + + + + + + An XSD type that is not listed or a custom type + (use dataTypeDetails attribute). + + + + + + + + + Container for graphemes, grapheme groups and + non-printing characters. + + + + + + + + + + + + Base type for graphemes, grapheme groups and non-printing characters. + + + + + + + + + + Order index of grapheme, group, or non-printing character + within the parent container (graphemes or glyph or grapheme group). + + + + + + + + + + + + + Type of character represented by the + grapheme, group, or non-printing character element. + + + + + + + + + + + + For generic use + + + + + For generic use + + + + + + + Represents a sub-element of a glyph. + Smallest graphical unit that can be + assigned a Unicode code point. + + + + + + + + + + + + + + A glyph component without visual representation + but with Unicode code point. + Non-visual / non-printing / control character. + Part of grapheme container (of glyph) or grapheme sub group. + + + + + + + + + + + + + + + + + + + + + Container for user-defined attributes + + + + + + + + + Structured custom data defined by name, type and value. + + + + + + + + + + + + + + + + + + + + Cell position in table starting with row 0 + + + + + Cell position in table starting with column 0 + + + + + Number of rows the cell spans (optional; default is 1) + + + + + Number of columns the cell spans (optional; default is 1) + + + + + + Is the cell a column or row header? + + + + + + + + + + Data for a region that takes on the role + of a table cell within a parent table region. + + + + + + + + + + + + + From c1e8b4fb8d6b760d98c21300a0643bcf853d777f Mon Sep 17 00:00:00 2001 From: Benjamin Kiessling Date: Tue, 2 Apr 2024 01:43:50 +0200 Subject: [PATCH 22/76] fix environment name in cuda env file --- environment_cuda.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/environment_cuda.yml b/environment_cuda.yml index 50da33e79..5d740ca96 100644 --- a/environment_cuda.yml +++ b/environment_cuda.yml @@ -1,4 +1,4 @@ -name: kraken_2 +name: kraken channels: - defaults - conda-forge From 526379750c807c61b771c71c659022917c94cc14 Mon Sep 17 00:00:00 2001 From: Benjamin Kiessling Date: Tue, 2 Apr 2024 22:25:06 +0200 Subject: [PATCH 23/76] s/pytorch-lightning/lightning --- conda/meta.yaml | 2 +- environment.yml | 2 +- environment_cuda.yml | 2 +- setup.cfg | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/conda/meta.yaml b/conda/meta.yaml index be1e2edb4..1e687f559 100644 --- a/conda/meta.yaml +++ b/conda/meta.yaml @@ -30,7 +30,7 @@ requirements: - pyvips - coremltools - pyarrow - - pytorch-lightning~=2.0 + - lightning~=2.0 - torchmetrics>=1.1.0 - conda-forge::threadpoolctl~=3.2.0 - albumentations diff --git a/environment.yml b/environment.yml index 93bd5b800..410e1a087 100644 --- a/environment.yml +++ b/environment.yml @@ -23,7 +23,7 @@ dependencies: - imagemagick>=7.1.0 - pyarrow - importlib-resources>=1.3.0 - - conda-forge::pytorch-lightning~=2.0.0 + - conda-forge::lightning~=2.0.0 - conda-forge::torchmetrics>=1.1.0 - conda-forge::threadpoolctl~=3.2 - pip diff --git a/environment_cuda.yml b/environment_cuda.yml index 5d740ca96..7844ba138 100644 --- a/environment_cuda.yml +++ b/environment_cuda.yml @@ -24,7 +24,7 @@ dependencies: - imagemagick>=7.1.0 - pyarrow - importlib-resources>=1.3.0 - - conda-forge::pytorch-lightning~=2.0.0 + - conda-forge::lightning~=2.0.0 - conda-forge::torchmetrics>=1.1.0 - conda-forge::threadpoolctl~=3.2 - pip diff --git a/setup.cfg b/setup.cfg index e5a224e6e..982d5a815 100644 --- a/setup.cfg +++ b/setup.cfg @@ -58,7 +58,7 @@ install_requires = scikit-image~=0.21.0 shapely~=1.8.5 pyarrow - pytorch-lightning~=2.0.0 + lightning~=2.0.0 torchmetrics>=1.1.0 threadpoolctl~=3.2.0 importlib-resources>=1.3.0 From f7fb6222aaefb9eee9681cd92b5f5d68a5aabbc7 Mon Sep 17 00:00:00 2001 From: Benjamin Kiessling Date: Thu, 4 Apr 2024 00:54:21 +0200 Subject: [PATCH 24/76] Fix cosine annealing scheduling in training parts --- kraken/ketos/pretrain.py | 7 ++++++- kraken/ketos/recognition.py | 20 +++++++++++++------- kraken/ketos/ro.py | 11 ++++++++--- kraken/ketos/segmentation.py | 11 ++++++++--- kraken/lib/default_specs.py | 4 ++++ kraken/lib/train.py | 7 ++++++- 6 files changed, 45 insertions(+), 15 deletions(-) diff --git a/kraken/ketos/pretrain.py b/kraken/ketos/pretrain.py index 5d6055849..27eabfd1f 100644 --- a/kraken/ketos/pretrain.py +++ b/kraken/ketos/pretrain.py @@ -123,6 +123,10 @@ show_default=True, default=RECOGNITION_PRETRAIN_HYPER_PARAMS['cos_t_max'], help='Epoch of minimal learning rate for cosine LR scheduler.') +@click.option('--cos-min-lr', + show_default=True, + default=RECOGNITION_HYPER_PARAMS['cos_min_lr'], + help='Minimal final learning rate for cosine LR scheduler.') @click.option('-p', '--partition', show_default=True, default=0.9, help='Ground truth data partition ratio between train/validation set') @click.option('--fixed-splits/--ignore-fixed-splits', show_default=True, default=False, @@ -183,7 +187,7 @@ def pretrain(ctx, batch_size, pad, output, spec, load, freq, quit, epochs, min_epochs, lag, min_delta, device, precision, optimizer, lrate, momentum, weight_decay, warmup, schedule, gamma, step_size, sched_patience, - cos_max, partition, fixed_splits, training_files, + cos_max, cos_min_lr, partition, fixed_splits, training_files, evaluation_files, workers, threads, load_hyper_parameters, repolygonize, force_binarization, format_type, augment, mask_probability, mask_width, num_negatives, logit_temp, @@ -227,6 +231,7 @@ def pretrain(ctx, batch_size, pad, output, spec, load, freq, quit, epochs, 'step_size': step_size, 'rop_patience': sched_patience, 'cos_t_max': cos_max, + 'cos_min_lr': cos_min_lr, 'augment': augment, 'mask_prob': mask_probability, 'mask_width': mask_width, diff --git a/kraken/ketos/recognition.py b/kraken/ketos/recognition.py index 559d86d3b..edc321f80 100644 --- a/kraken/ketos/recognition.py +++ b/kraken/ketos/recognition.py @@ -127,6 +127,10 @@ show_default=True, default=RECOGNITION_HYPER_PARAMS['cos_t_max'], help='Epoch of minimal learning rate for cosine LR scheduler.') +@click.option('--cos-min-lr', + show_default=True, + default=RECOGNITION_HYPER_PARAMS['cos_min_lr'], + help='Minimal final learning rate for cosine LR scheduler.') @click.option('-p', '--partition', show_default=True, default=0.9, help='Ground truth data partition ratio between train/validation set') @click.option('--fixed-splits/--ignore-fixed-split', show_default=True, default=False, @@ -194,13 +198,14 @@ @click.argument('ground_truth', nargs=-1, callback=_expand_gt, type=click.Path(exists=False, dir_okay=False)) @click.option('--legacy-polygons', show_default=True, default=False, is_flag=True, help='Use the legacy polygon extractor.') def train(ctx, batch_size, pad, output, spec, append, load, freq, quit, epochs, - min_epochs, lag, min_delta, device, precision, optimizer, lrate, momentum, - weight_decay, warmup, freeze_backbone, schedule, gamma, step_size, - sched_patience, cos_max, partition, fixed_splits, normalization, - normalize_whitespace, codec, resize, reorder, base_dir, - training_files, evaluation_files, workers, threads, load_hyper_parameters, - repolygonize, force_binarization, format_type, augment, - pl_logger, log_dir, ground_truth, legacy_polygons): + min_epochs, lag, min_delta, device, precision, optimizer, lrate, + momentum, weight_decay, warmup, freeze_backbone, schedule, gamma, + step_size, sched_patience, cos_max, cos_min_lr, partition, + fixed_splits, normalization, normalize_whitespace, codec, resize, + reorder, base_dir, training_files, evaluation_files, workers, + threads, load_hyper_parameters, repolygonize, force_binarization, + format_type, augment, pl_logger, log_dir, ground_truth, + legacy_polygons): """ Trains a model from image-text pairs. """ @@ -253,6 +258,7 @@ def train(ctx, batch_size, pad, output, spec, append, load, freq, quit, epochs, 'step_size': step_size, 'rop_patience': sched_patience, 'cos_t_max': cos_max, + 'cos_min_lr': cos_min_lr, 'normalization': normalization, 'normalize_whitespace': normalize_whitespace, 'augment': augment, diff --git a/kraken/ketos/ro.py b/kraken/ketos/ro.py index 33191d596..a8b7e4c9b 100644 --- a/kraken/ketos/ro.py +++ b/kraken/ketos/ro.py @@ -115,6 +115,10 @@ show_default=True, default=READING_ORDER_HYPER_PARAMS['cos_t_max'], help='Epoch of minimal learning rate for cosine LR scheduler.') +@click.option('--cos-min-lr', + show_default=True, + default=RECOGNITION_HYPER_PARAMS['cos_min_lr'], + help='Minimal final learning rate for cosine LR scheduler.') @click.option('-p', '--partition', show_default=True, default=0.9, help='Ground truth data partition ratio between train/validation set') @click.option('-t', '--training-files', show_default=True, default=None, multiple=True, @@ -143,9 +147,9 @@ def rotrain(ctx, batch_size, output, load, freq, quit, epochs, min_epochs, lag, min_delta, device, precision, optimizer, lrate, momentum, weight_decay, warmup, schedule, gamma, step_size, sched_patience, - cos_max, partition, training_files, evaluation_files, workers, - threads, load_hyper_parameters, format_type, pl_logger, log_dir, - level, reading_order, ground_truth): + cos_max, cos_min_lr, partition, training_files, evaluation_files, + workers, threads, load_hyper_parameters, format_type, pl_logger, + log_dir, level, reading_order, ground_truth): """ Trains a baseline labeling model for layout analysis """ @@ -189,6 +193,7 @@ def rotrain(ctx, batch_size, output, load, freq, quit, epochs, min_epochs, lag, 'step_size': step_size, 'rop_patience': sched_patience, 'cos_t_max': cos_max, + 'cos_min_lr': cos_min_lr, 'pl_logger': pl_logger, } ) diff --git a/kraken/ketos/segmentation.py b/kraken/ketos/segmentation.py index f1391e358..171e834f1 100644 --- a/kraken/ketos/segmentation.py +++ b/kraken/ketos/segmentation.py @@ -151,6 +151,10 @@ def _validate_merging(ctx, param, value): show_default=True, default=SEGMENTATION_HYPER_PARAMS['cos_t_max'], help='Epoch of minimal learning rate for cosine LR scheduler.') +@click.option('--cos-min-lr', + show_default=True, + default=RECOGNITION_HYPER_PARAMS['cos_min_lr'], + help='Minimal final learning rate for cosine LR scheduler.') @click.option('-p', '--partition', show_default=True, default=0.9, help='Ground truth data partition ratio between train/validation set') @click.option('-t', '--training-files', show_default=True, default=None, multiple=True, @@ -226,12 +230,12 @@ def _validate_merging(ctx, param, value): def segtrain(ctx, output, spec, line_width, pad, load, freq, quit, epochs, min_epochs, lag, min_delta, device, precision, optimizer, lrate, momentum, weight_decay, warmup, schedule, gamma, step_size, - sched_patience, cos_max, partition, training_files, + sched_patience, cos_max, cos_min_lr, partition, training_files, evaluation_files, workers, threads, load_hyper_parameters, force_binarization, format_type, suppress_regions, suppress_baselines, valid_regions, valid_baselines, merge_regions, - merge_baselines, bounding_regions, - augment, resize, topline, pl_logger, log_dir, ground_truth): + merge_baselines, bounding_regions, augment, resize, topline, + pl_logger, log_dir, ground_truth): """ Trains a baseline labeling model for layout analysis """ @@ -285,6 +289,7 @@ def segtrain(ctx, output, spec, line_width, pad, load, freq, quit, epochs, 'step_size': step_size, 'rop_patience': sched_patience, 'cos_t_max': cos_max, + 'cos_min_lr': cos_min_lr, }) # disable automatic partition when given evaluation set explicitly diff --git a/kraken/lib/default_specs.py b/kraken/lib/default_specs.py index af08fd1e5..53d4bfb5d 100644 --- a/kraken/lib/default_specs.py +++ b/kraken/lib/default_specs.py @@ -40,6 +40,7 @@ 'rop_patience': 5, # cosine 'cos_t_max': 100, + 'cos_min_lr': 0.001, 'warmup': 0, } @@ -67,6 +68,7 @@ 'rop_patience': 5, # cosine 'cos_t_max': 100, + 'cos_min_lr': 1e-7, # masking parameters 'mask_width': 4, 'mask_prob': 0.5, @@ -101,6 +103,7 @@ 'rop_patience': 5, # cosine 'cos_t_max': 50, + 'cos_min_lr': 1e-4, 'warmup': 0, 'freeze_backbone': 0, } @@ -129,5 +132,6 @@ 'rop_patience': 5, # cosine 'cos_t_max': 50, + 'cos_min_r': 2e-5, 'warmup': 0, } diff --git a/kraken/lib/train.py b/kraken/lib/train.py index fb54d5791..65b65b1e1 100644 --- a/kraken/lib/train.py +++ b/kraken/lib/train.py @@ -1129,6 +1129,8 @@ def _configure_optimizer_and_lr_scheduler(hparams, params, len_train_set=None, l weight_decay = hparams.get("weight_decay") schedule = hparams.get("schedule") gamma = hparams.get("gamma") + cos_t_max = hparams.get("cos_t_max") + cos_min_lr = hparams.get("cos_min_lr") step_size = hparams.get("step_size") rop_factor = hparams.get("rop_factor") rop_patience = hparams.get("rop_patience") @@ -1149,7 +1151,10 @@ def _configure_optimizer_and_lr_scheduler(hparams, params, len_train_set=None, l lr_sched = {'scheduler': lr_scheduler.ExponentialLR(optim, gamma, last_epoch=completed_epochs-1), 'interval': 'step'} elif schedule == 'cosine': - lr_sched = {'scheduler': lr_scheduler.CosineAnnealingLR(optim, gamma, last_epoch=completed_epochs-1), + lr_sched = {'scheduler': lr_scheduler.CosineAnnealingLR(optim, + cos_t_max, + cos_min_lr, + last_epoch=completed_epochs-1), 'interval': 'step'} elif schedule == 'step': lr_sched = {'scheduler': lr_scheduler.StepLR(optim, step_size, gamma, last_epoch=completed_epochs-1), From db35eaef0c56c8750a16f8234e36371e3b0d1979 Mon Sep 17 00:00:00 2001 From: Benjamin Kiessling Date: Thu, 4 Apr 2024 23:41:12 +0200 Subject: [PATCH 25/76] fix hyper param dicts --- kraken/ketos/pretrain.py | 2 +- kraken/ketos/ro.py | 2 +- kraken/ketos/segmentation.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/kraken/ketos/pretrain.py b/kraken/ketos/pretrain.py index 27eabfd1f..841d39191 100644 --- a/kraken/ketos/pretrain.py +++ b/kraken/ketos/pretrain.py @@ -125,7 +125,7 @@ help='Epoch of minimal learning rate for cosine LR scheduler.') @click.option('--cos-min-lr', show_default=True, - default=RECOGNITION_HYPER_PARAMS['cos_min_lr'], + default=RECOGNITION_PRETRAIN_HYPER_PARAMS['cos_min_lr'], help='Minimal final learning rate for cosine LR scheduler.') @click.option('-p', '--partition', show_default=True, default=0.9, help='Ground truth data partition ratio between train/validation set') diff --git a/kraken/ketos/ro.py b/kraken/ketos/ro.py index a8b7e4c9b..055d86d29 100644 --- a/kraken/ketos/ro.py +++ b/kraken/ketos/ro.py @@ -117,7 +117,7 @@ help='Epoch of minimal learning rate for cosine LR scheduler.') @click.option('--cos-min-lr', show_default=True, - default=RECOGNITION_HYPER_PARAMS['cos_min_lr'], + default=READING_ORDER_HYPER_PARAMS['cos_min_lr'], help='Minimal final learning rate for cosine LR scheduler.') @click.option('-p', '--partition', show_default=True, default=0.9, help='Ground truth data partition ratio between train/validation set') diff --git a/kraken/ketos/segmentation.py b/kraken/ketos/segmentation.py index 171e834f1..e91e4e2cd 100644 --- a/kraken/ketos/segmentation.py +++ b/kraken/ketos/segmentation.py @@ -153,7 +153,7 @@ def _validate_merging(ctx, param, value): help='Epoch of minimal learning rate for cosine LR scheduler.') @click.option('--cos-min-lr', show_default=True, - default=RECOGNITION_HYPER_PARAMS['cos_min_lr'], + default=SEGMENTATION_HYPER_PARAMS,['cos_min_lr'], help='Minimal final learning rate for cosine LR scheduler.') @click.option('-p', '--partition', show_default=True, default=0.9, help='Ground truth data partition ratio between train/validation set') From 0231a76008d27db10ee17927daa6a86c05940171 Mon Sep 17 00:00:00 2001 From: Benjamin Kiessling Date: Fri, 5 Apr 2024 00:03:22 +0200 Subject: [PATCH 26/76] syntax error --- kraken/ketos/segmentation.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kraken/ketos/segmentation.py b/kraken/ketos/segmentation.py index e91e4e2cd..a98a4f667 100644 --- a/kraken/ketos/segmentation.py +++ b/kraken/ketos/segmentation.py @@ -153,7 +153,7 @@ def _validate_merging(ctx, param, value): help='Epoch of minimal learning rate for cosine LR scheduler.') @click.option('--cos-min-lr', show_default=True, - default=SEGMENTATION_HYPER_PARAMS,['cos_min_lr'], + default=SEGMENTATION_HYPER_PARAMS['cos_min_lr'], help='Minimal final learning rate for cosine LR scheduler.') @click.option('-p', '--partition', show_default=True, default=0.9, help='Ground truth data partition ratio between train/validation set') From d539fde6bfd781a2a269fa1d7418e1bd69d50323 Mon Sep 17 00:00:00 2001 From: Benjamin Kiessling Date: Fri, 5 Apr 2024 00:13:48 +0200 Subject: [PATCH 27/76] typo --- kraken/lib/default_specs.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kraken/lib/default_specs.py b/kraken/lib/default_specs.py index 53d4bfb5d..aab5a3e78 100644 --- a/kraken/lib/default_specs.py +++ b/kraken/lib/default_specs.py @@ -132,6 +132,6 @@ 'rop_patience': 5, # cosine 'cos_t_max': 50, - 'cos_min_r': 2e-5, + 'cos_min_lr': 2e-5, 'warmup': 0, } From da6c0a4ce7bf67f0cfcceb0d50ed5e3ddf32ab0f Mon Sep 17 00:00:00 2001 From: Benjamin Kiessling Date: Mon, 8 Apr 2024 03:09:14 +0200 Subject: [PATCH 28/76] Correct cuts in hOCR serialization Fixes #582 --- kraken/rpred.py | 6 +++--- kraken/serialization.py | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/kraken/rpred.py b/kraken/rpred.py index d41a11f67..179d9e872 100644 --- a/kraken/rpred.py +++ b/kraken/rpred.py @@ -285,8 +285,8 @@ def _recognize_baseline_line(self, line): pos = [] conf = [] for _, start, end, c in preds: - pos.append((self._scale_val(start, 0, self.box.size[0]), - self._scale_val(end, 0, self.box.size[0]))) + pos.append([self._scale_val(start, 0, self.box.size[0]), + self._scale_val(end, 0, self.box.size[0])]) conf.append(c) rec = BaselineOCRRecord(pred, pos, conf, line) if self.bidi_reordering: @@ -307,7 +307,7 @@ def __len__(self): def _scale_val(self, val, min_val, max_val): return int(round(min(max(((val*self.net_scale)-self.pad)*self.in_scale, min_val), max_val-1))) - + def _choose_legacy_polygon_extractor(self, net) -> bool: # grouping the checks here to display warnings only once if net.nn.use_legacy_polygons: diff --git a/kraken/serialization.py b/kraken/serialization.py index cb335a71b..b1e7ab9e8 100644 --- a/kraken/serialization.py +++ b/kraken/serialization.py @@ -165,7 +165,7 @@ def serialize(results: 'Segmentation', # addition to bounding boxes line = {'id': record.id, 'bbox': max_bbox([record.boundary]) if record.type == 'baselines' else record.bbox, - 'cuts': record.cuts, + 'cuts': [list(x) for x in record.cuts], 'confidences': record.confidences, 'recognition': [], 'boundary': [list(x) for x in record.boundary] if record.type == 'baselines' else [[record.bbox[0], record.bbox[1]], From d814500a5817702712937a593d28b150a114710f Mon Sep 17 00:00:00 2001 From: Benjamin Kiessling Date: Mon, 8 Apr 2024 19:15:50 +0200 Subject: [PATCH 29/76] Syntax error in polygonizer Small oversight from the new polygon extraction code --- kraken/lib/segmentation.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kraken/lib/segmentation.py b/kraken/lib/segmentation.py index 3ab6008a1..d0b986fe0 100644 --- a/kraken/lib/segmentation.py +++ b/kraken/lib/segmentation.py @@ -498,7 +498,7 @@ def _calc_seam(baseline, polygon, angle, im_feats, bias=150): mask[line_locs] = 0 dist_bias = distance_transform_cdt(mask) # absolute mask - mask = np.array(make_polygonal_mask(polygon-(r_min, c_min)), patch.shape[1::-1]) > 128 + mask = np.array(make_polygonal_mask(polygon-(r_min, c_min), patch.shape[::-1])) > 128 # dilate mask to compensate for aliasing during rotation mask = binary_erosion(mask, border_value=True, iterations=2) # combine weights with features From 4c4e3757cb4e71a138b202634517acfe28be29f7 Mon Sep 17 00:00:00 2001 From: Benjamin Kiessling Date: Mon, 8 Apr 2024 20:10:22 +0200 Subject: [PATCH 30/76] Fixes 8 bit image mode setting in datasets Squashed commit of the following: commit 5524d88c1094254a60c507ceb2d60b1d2429ddbb Author: Benjamin Kiessling Date: Mon Apr 8 20:09:28 2024 +0200 Shared im_mode setting in GroundTruthDataset/PolygonGTDataset commit 46be12cabf553a54c9544c4dbaa4078b159d73b7 Author: Benjamin Kiessling Date: Sun Apr 7 23:33:45 2024 +0200 put image mode in shared memory --- kraken/lib/dataset/recognition.py | 57 ++++++++++++++++++++----------- kraken/lib/util.py | 2 +- 2 files changed, 39 insertions(+), 20 deletions(-) diff --git a/kraken/lib/dataset/recognition.py b/kraken/lib/dataset/recognition.py index 5f8744724..5a13d2f00 100644 --- a/kraken/lib/dataset/recognition.py +++ b/kraken/lib/dataset/recognition.py @@ -15,21 +15,24 @@ """ Utility functions for data loading and training of VGSL networks. """ -import dataclasses import io import json +import torch +import numpy as np +import pyarrow as pa import traceback +import dataclasses +import multiprocessing as mp + from collections import Counter from functools import partial from typing import (TYPE_CHECKING, Any, Callable, List, Literal, Optional, Tuple, Union) -import numpy as np -import pyarrow as pa -import torch from PIL import Image -from torch.utils.data import Dataset +from ctypes import c_char from torchvision import transforms +from torch.utils.data import Dataset from kraken.containers import BaselineLine, BBoxLine, Segmentation from kraken.lib import functional_im_transforms as F_t @@ -331,7 +334,7 @@ def __init__(self, if augmentation: self.aug = DefaultAugmenter() - self.im_mode = '1' + self._im_mode = mp.Value(c_char, b'1') def add(self, line: Optional[BaselineLine] = None, @@ -437,15 +440,16 @@ def __getitem__(self, index: int) -> Tuple[torch.Tensor, torch.Tensor]: legacy=self.legacy_polygons)) im = self.transforms(im) if im.shape[0] == 3: - im_mode = 'RGB' + im_mode = b'R' elif im.shape[0] == 1: - im_mode = 'L' + im_mode = b'L' if is_bitonal(im): - im_mode = '1' + im_mode = b'1' - if im_mode > self.im_mode: - logger.info(f'Upgrading "im_mode" from {self.im_mode} to {im_mode}') - self.im_mode = im_mode + with self._im_mode.get_lock(): + if im_mode > self._im_mode.value: + logger.info(f'Upgrading "im_mode" from {self._im_mode.value} to {im_mode}') + self._im_mode.value = im_mode if self.aug: im = im.permute((1, 2, 0)).numpy() o = self.aug(image=im) @@ -461,6 +465,12 @@ def __getitem__(self, index: int) -> Tuple[torch.Tensor, torch.Tensor]: def __len__(self) -> int: return len(self._images) + @property + def im_mode(self): + return {b'1': '1', + b'L': 'L', + b'R': 'RGB'}[self._im_mode.value] + class GroundTruthDataset(Dataset): """ @@ -520,7 +530,7 @@ def __init__(self, if augmentation: self.aug = DefaultAugmenter() - self.im_mode = '1' + self._im_mode = mp.Value(c_char, b'1') def add(self, line: Optional[BBoxLine] = None, @@ -616,14 +626,15 @@ def __getitem__(self, index: int) -> Tuple[torch.Tensor, torch.Tensor]: im = im.crop((xmin, ymin, xmax, ymax)) im = self.transforms(im) if im.shape[0] == 3: - im_mode = 'RGB' + im_mode = b'R' elif im.shape[0] == 1: - im_mode = 'L' + im_mode = b'L' if is_bitonal(im): - im_mode = '1' - if im_mode > self.im_mode: - logger.info(f'Upgrading "im_mode" from {self.im_mode} to {im_mode}') - self.im_mode = im_mode + im_mode = b'1' + with self._im_mode.get_lock(): + if im_mode > self._im_mode.value: + logger.info(f'Upgrading "im_mode" from {self._im_mode.value} to {im_mode}') + self._im_mode.value = im_mode if self.aug: im = im.permute((1, 2, 0)).numpy() o = self.aug(image=im) @@ -639,3 +650,11 @@ def __getitem__(self, index: int) -> Tuple[torch.Tensor, torch.Tensor]: def __len__(self) -> int: return len(self._images) + + @property + def im_mode(self): + return {b'1': '1', + b'L': 'L', + b'R': 'RGB'}[self._im_mode.value] + + diff --git a/kraken/lib/util.py b/kraken/lib/util.py index 609e924fe..267b4545b 100644 --- a/kraken/lib/util.py +++ b/kraken/lib/util.py @@ -56,7 +56,7 @@ def is_bitonal(im: Union[Image.Image, torch.Tensor]) -> bool: if isinstance(im, Image.Image): return im.getcolors(2) is not None and len(im.getcolors(2)) == 2 elif isinstance(im, torch.Tensor): - return len(im.int().unique()) == 2 + return len(im.unique()) == 2 def get_im_str(im: Image.Image) -> str: From 82af6624da8ec3afcd262f6a341cb95de1e7cfb8 Mon Sep 17 00:00:00 2001 From: anutkk <58149093+anutkk@users.noreply.github.com> Date: Mon, 8 Apr 2024 23:25:31 +0300 Subject: [PATCH 31/76] Speed up legacy polygon extraction --- kraken/lib/segmentation.py | 36 ++++++++++++++++++++++++++++-------- 1 file changed, 28 insertions(+), 8 deletions(-) diff --git a/kraken/lib/segmentation.py b/kraken/lib/segmentation.py index d0b986fe0..e490114aa 100644 --- a/kraken/lib/segmentation.py +++ b/kraken/lib/segmentation.py @@ -41,6 +41,24 @@ from skimage.transform import (AffineTransform, PiecewiseAffineTransform, warp) +#faster implementation of PiecewiseAffineTransform - see https://github.com/scikit-image/scikit-image/issues/6864 and https://github.com/scikit-image/scikit-image/pull/6963 +class FastPiecewiseAffineTransform(PiecewiseAffineTransform): + def __call__(self, coords): + coords = np.asarray(coords) + + simplex = self._tesselation.find_simplex(coords) + + affines = np.array( + [self.affines[i].params for i in range(len(self._tesselation.simplices))] + )[simplex] + + pts = np.c_[coords, np.ones((coords.shape[0], 1))] + + result = np.einsum("ij,ikj->ik", pts, affines) + result[simplex == -1, :] = -1 + + return result + from kraken.lib import default_specs from kraken.lib.exceptions import KrakenInputException @@ -1180,7 +1198,7 @@ def extract_polygons(im: Image.Image, raise KrakenInputException('Baseline outside of image bounds') if legacy: - im = np.array(im) + im = np.asarray(im) # Old, slow, and deprecated path # fast path for straight baselines requiring only rotation if len(baseline) == 2: @@ -1192,9 +1210,10 @@ def extract_polygons(im: Image.Image, angle = np.arctan2(p_dir[1], p_dir[0]) patch = im[r_min:r_max+1, c_min:c_max+1].copy() offset_polygon = pl - (c_min, r_min) - r, c = draw.polygon(offset_polygon[:, 1], offset_polygon[:, 0]) - mask = np.zeros(patch.shape[:2], dtype=bool) - mask[r, c] = True + offset_polygon2 = offset_polygon.flatten().tolist() + img = Image.new('L', patch.shape[:2][::-1], 0) + ImageDraw.Draw(img).polygon(offset_polygon2, outline=1, fill=1) + mask = np.asarray(img, dtype=bool) patch[np.invert(mask)] = 0 extrema = offset_polygon[(0, -1), :] # scale line image to max 600 pixel width @@ -1245,14 +1264,15 @@ def extract_polygons(im: Image.Image, offset_bl_dst_pts = bl_dst_pts - (c_dst_min, r_dst_min) offset_pol_dst_pts = pol_dst_pts - (c_dst_min, r_dst_min) # mask out points outside bounding polygon - mask = np.zeros(patch.shape[:2], dtype=bool) - r, c = draw.polygon(offset_polygon[:, 1], offset_polygon[:, 0]) - mask[r, c] = True + offset_polygon2 = offset_polygon.flatten().tolist() + img = Image.new('L', patch.shape[:2][::-1], 0) + ImageDraw.Draw(img).polygon(offset_polygon2, outline=1, fill=1) + mask = np.asarray(img, dtype=bool) patch[np.invert(mask)] = 0 # estimate piecewise transform src_points = np.concatenate((offset_baseline, offset_polygon)) dst_points = np.concatenate((offset_bl_dst_pts, offset_pol_dst_pts)) - tform = PiecewiseAffineTransform() + tform = FastPiecewiseAffineTransform() tform.estimate(src_points, dst_points) o = warp(patch, tform.inverse, output_shape=output_shape, preserve_range=True, order=order) i = Image.fromarray(o.astype('uint8')) From b661fa06ecacfa524fcc59aad7636fc252e084ab Mon Sep 17 00:00:00 2001 From: Benjamin Kiessling Date: Tue, 9 Apr 2024 04:12:09 +0200 Subject: [PATCH 32/76] Regression in segmentation serialization in CLI driver --- kraken/kraken.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/kraken/kraken.py b/kraken/kraken.py index 61b653880..ee94da490 100644 --- a/kraken/kraken.py +++ b/kraken/kraken.py @@ -163,12 +163,11 @@ def segmenter(legacy, model, text_direction, scale, maxcolseps, black_colseps, fp = cast('IO[Any]', fp) logger.info('Serializing as {} into {}'.format(ctx.meta['output_mode'], output)) from kraken import serialization - fp.write(serialization.serialize_segmentation(res, - image_name=ctx.meta['base_image'], - image_size=im.size, - template=ctx.meta['output_template'], - template_source='custom' if ctx.meta['output_mode'] == 'template' else 'native', - processing_steps=ctx.meta['steps'])) + fp.write(serialization.serialize(res, + image_size=im.size, + template=ctx.meta['output_template'], + template_source='custom' if ctx.meta['output_mode'] == 'template' else 'native', + processing_steps=ctx.meta['steps'])) else: with click.open_file(output, 'w') as fp: fp = cast('IO[Any]', fp) From 905592c8b70917b0d7ea4682fbb528b533f2f568 Mon Sep 17 00:00:00 2001 From: Stefan Weil Date: Wed, 10 Apr 2024 09:15:20 +0200 Subject: [PATCH 33/76] Replace broken URL for eScriptorium Replace also escriptorium by eScriptorium. Signed-off-by: Stefan Weil --- README.rst | 4 ++-- docs/index.rst | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/README.rst b/README.rst index b7a25d6c7..8c9ef62b2 100644 --- a/README.rst +++ b/README.rst @@ -124,8 +124,8 @@ Have a look at the `docs `_. Related Software ================ -These days kraken is quite closely linked to the `escriptorium -`_ project developed in the same eScripta research +These days kraken is quite closely linked to the `eScriptorium +`_ project developed in the same eScripta research group. eScriptorium provides a user-friendly interface for annotating data, training models, and inference (but also much more). There is a `gitter channel `_ that is mostly intended for diff --git a/docs/index.rst b/docs/index.rst index 59e096265..2c2a0e81b 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -193,8 +193,8 @@ There is a training tutorial at :doc:`training`. Related Software ================ -These days kraken is quite closely linked to the `escriptorium -`_ project developed in the same eScripta research +These days kraken is quite closely linked to the `eScriptorium +`_ project developed in the same eScripta research group. eScriptorium provides a user-friendly interface for annotating data, training models, and inference (but also much more). There is a `gitter channel `_ that is mostly intended for From ef1166b3c35741af92ba7eba39273d65ac015492 Mon Sep 17 00:00:00 2001 From: Benjamin Kiessling Date: Wed, 10 Apr 2024 12:14:28 +0200 Subject: [PATCH 34/76] add Region to __all__ --- kraken/containers.py | 1 + 1 file changed, 1 insertion(+) diff --git a/kraken/containers.py b/kraken/containers.py index b649a5ced..81aad2930 100644 --- a/kraken/containers.py +++ b/kraken/containers.py @@ -36,6 +36,7 @@ __all__ = ['BaselineLine', 'BBoxLine', 'Segmentation', + 'Region', 'ocr_record', 'BaselineOCRRecord', 'BBoxOCRRecord', From 403bec36158726e448216e53fd3542892068f663 Mon Sep 17 00:00:00 2001 From: Benjamin Kiessling Date: Wed, 10 Apr 2024 12:27:00 +0200 Subject: [PATCH 35/76] Update sphinx config to something non-ancient Fixes #587 --- docs/Makefile | 198 +++--------------------------------- docs/conf.py | 270 +++----------------------------------------------- docs/make.bat | 263 ------------------------------------------------ 3 files changed, 26 insertions(+), 705 deletions(-) delete mode 100644 docs/make.bat diff --git a/docs/Makefile b/docs/Makefile index 8512ab244..d4bb2cbb9 100644 --- a/docs/Makefile +++ b/docs/Makefile @@ -1,192 +1,20 @@ -# Makefile for Sphinx documentation +# Minimal makefile for Sphinx documentation # -# You can set these variables from the command line. -SPHINXOPTS = -SPHINXBUILD = sphinx-build -PAPER = +# You can set these variables from the command line, and also +# from the environment for the first two. +SPHINXOPTS ?= +SPHINXBUILD ?= sphinx-build +SOURCEDIR = . BUILDDIR = _build -# User-friendly check for sphinx-build -ifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $$?), 1) -$(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don't have Sphinx installed, grab it from http://sphinx-doc.org/) -endif - -# Internal variables. -PAPEROPT_a4 = -D latex_paper_size=a4 -PAPEROPT_letter = -D latex_paper_size=letter -ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . -# the i18n builder cannot share the environment and doctrees with the others -I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . - -.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest coverage gettext - +# Put it first so that "make" without argument is like "make help". help: - @echo "Please use \`make ' where is one of" - @echo " html to make standalone HTML files" - @echo " dirhtml to make HTML files named index.html in directories" - @echo " singlehtml to make a single large HTML file" - @echo " pickle to make pickle files" - @echo " json to make JSON files" - @echo " htmlhelp to make HTML files and a HTML help project" - @echo " qthelp to make HTML files and a qthelp project" - @echo " applehelp to make an Apple Help Book" - @echo " devhelp to make HTML files and a Devhelp project" - @echo " epub to make an epub" - @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" - @echo " latexpdf to make LaTeX files and run them through pdflatex" - @echo " latexpdfja to make LaTeX files and run them through platex/dvipdfmx" - @echo " text to make text files" - @echo " man to make manual pages" - @echo " texinfo to make Texinfo files" - @echo " info to make Texinfo files and run them through makeinfo" - @echo " gettext to make PO message catalogs" - @echo " changes to make an overview of all changed/added/deprecated items" - @echo " xml to make Docutils-native XML files" - @echo " pseudoxml to make pseudoxml-XML files for display purposes" - @echo " linkcheck to check all external links for integrity" - @echo " doctest to run all doctests embedded in the documentation (if enabled)" - @echo " coverage to run coverage check of the documentation (if enabled)" - -clean: - rm -rf $(BUILDDIR)/* - -html: - $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html - @echo - @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." - -dirhtml: - $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml - @echo - @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." - -singlehtml: - $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml - @echo - @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." - -pickle: - $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle - @echo - @echo "Build finished; now you can process the pickle files." - -json: - $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json - @echo - @echo "Build finished; now you can process the JSON files." - -htmlhelp: - $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp - @echo - @echo "Build finished; now you can run HTML Help Workshop with the" \ - ".hhp project file in $(BUILDDIR)/htmlhelp." - -qthelp: - $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp - @echo - @echo "Build finished; now you can run "qcollectiongenerator" with the" \ - ".qhcp project file in $(BUILDDIR)/qthelp, like this:" - @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/kraken.qhcp" - @echo "To view the help file:" - @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/kraken.qhc" - -applehelp: - $(SPHINXBUILD) -b applehelp $(ALLSPHINXOPTS) $(BUILDDIR)/applehelp - @echo - @echo "Build finished. The help book is in $(BUILDDIR)/applehelp." - @echo "N.B. You won't be able to view it unless you put it in" \ - "~/Library/Documentation/Help or install it in your application" \ - "bundle." - -devhelp: - $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp - @echo - @echo "Build finished." - @echo "To view the help file:" - @echo "# mkdir -p $$HOME/.local/share/devhelp/kraken" - @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/kraken" - @echo "# devhelp" - -epub: - $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub - @echo - @echo "Build finished. The epub file is in $(BUILDDIR)/epub." - -latex: - $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex - @echo - @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." - @echo "Run \`make' in that directory to run these through (pdf)latex" \ - "(use \`make latexpdf' here to do that automatically)." - -latexpdf: - $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex - @echo "Running LaTeX files through pdflatex..." - $(MAKE) -C $(BUILDDIR)/latex all-pdf - @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." - -latexpdfja: - $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex - @echo "Running LaTeX files through platex and dvipdfmx..." - $(MAKE) -C $(BUILDDIR)/latex all-pdf-ja - @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." - -text: - $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text - @echo - @echo "Build finished. The text files are in $(BUILDDIR)/text." - -man: - $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man - @echo - @echo "Build finished. The manual pages are in $(BUILDDIR)/man." - -texinfo: - $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo - @echo - @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo." - @echo "Run \`make' in that directory to run these through makeinfo" \ - "(use \`make info' here to do that automatically)." - -info: - $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo - @echo "Running Texinfo files through makeinfo..." - make -C $(BUILDDIR)/texinfo info - @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo." - -gettext: - $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale - @echo - @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale." - -changes: - $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes - @echo - @echo "The overview file is in $(BUILDDIR)/changes." - -linkcheck: - $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck - @echo - @echo "Link check complete; look for any errors in the above output " \ - "or in $(BUILDDIR)/linkcheck/output.txt." - -doctest: - $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest - @echo "Testing of doctests in the sources finished, look at the " \ - "results in $(BUILDDIR)/doctest/output.txt." - -coverage: - $(SPHINXBUILD) -b coverage $(ALLSPHINXOPTS) $(BUILDDIR)/coverage - @echo "Testing of coverage in the sources finished, look at the " \ - "results in $(BUILDDIR)/coverage/python.txt." + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) -xml: - $(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml - @echo - @echo "Build finished. The XML files are in $(BUILDDIR)/xml." +.PHONY: help Makefile -pseudoxml: - $(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml - @echo - @echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml." +# Catch-all target: route all unknown targets to Sphinx using the new +# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). +%: Makefile + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/docs/conf.py b/docs/conf.py index 22c7d6614..eaf7d1e3b 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -1,32 +1,18 @@ -# -*- coding: utf-8 -*- +# Configuration file for the Sphinx documentation builder. # -# kraken documentation build configuration file, created by -# sphinx-quickstart on Fri May 22 16:51:45 2015. -# -# This file is execfile()d with the current directory set to its -# containing dir. -# -# Note that not all possible configuration values are present in this -# autogenerated file. -# -# All configuration values have a default; values that are commented out -# serve to show the default. +# For the full list of built-in configuration values, see the documentation: +# https://www.sphinx-doc.org/en/master/usage/configuration.html -from subprocess import PIPE, Popen +import importlib.metadata -# If extensions (or modules to document with autodoc) are in another directory, -# add these directories to sys.path here. If the directory is relative to the -# documentation root, use os.path.abspath to make it absolute, like shown here. -#sys.path.insert(0, os.path.abspath('../kraken')) +# -- Project information ----------------------------------------------------- +# https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information -# -- General configuration ------------------------------------------------ +project = 'kraken' +copyright = '2015-2024, Benjamin Kiessling' +author = 'Benjamin Kiessling' +release = importlib.metadata.version('kraken') -# If your documentation needs a minimal Sphinx version, state it here. -needs_sphinx = '2.0' - -# Add any Sphinx extension module names here, as strings. They can be -# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom -# ones. extensions = [ 'sphinx.ext.autodoc', 'sphinx.ext.autodoc.typehints', @@ -36,6 +22,9 @@ 'sphinx_multiversion', ] +templates_path = ['_templates'] +exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] + autodoc_typehints = 'description' autoapi_type = 'python' @@ -51,267 +40,34 @@ ] autoapi_generate_api_docs = False -# Add any paths that contain templates here, relative to this directory. -templates_path = ['_templates'] - -# The suffix(es) of source filenames. -# You can specify multiple suffix as a list of string: -# source_suffix = ['.rst', '.md'] source_suffix = '.rst' -# The encoding of source files. -#source_encoding = 'utf-8-sig' - -# The master toctree document. master_doc = 'index' -# General information about the project. -project = u'kraken' -copyright = u'2015, mittagessen' -author = u'mittagessen' - -# The version info for the project you're documenting, acts as replacement for -# |version| and |release|, also used in various other places throughout the -# built documents. -# -# The short X.Y version. -pipe = Popen('git describe --tags --always main', stdout=PIPE, shell=True) -version = pipe.stdout.read().decode('utf-8') -release = version - -# The language for content autogenerated by Sphinx. Refer to documentation -# for a list of supported languages. -# -# This is also used if you do content translation via gettext catalogs. -# Usually you set "language" from the command line for these cases. language = 'en' -# There are two options for replacing |today|: either, you set today to some -# non-false value, then it is used: -#today = '' -# Else, today_fmt is used as the format for a strftime call. -#today_fmt = '%B %d, %Y' - -# List of patterns, relative to source directory, that match files and -# directories to ignore when looking for source files. -exclude_patterns = ['_build'] - -# The reST default role (used for this markup: `text`) to use for all -# documents. -#default_role = None - -# If true, '()' will be appended to :func: etc. cross-reference text. -#add_function_parentheses = True - -# If true, the current module name will be prepended to all description -# unit titles (such as .. function::). -#add_module_names = True - -# If true, sectionauthor and moduleauthor directives will be shown in the -# output. They are ignored by default. -#show_authors = False - -# The name of the Pygments (syntax highlighting) style to use. pygments_style = 'sphinx' - -# A list of ignored prefixes for module index sorting. -#modindex_common_prefix = [] - -# If true, keep warnings as "system message" paragraphs in the built documents. -#keep_warnings = False - -# If true, `todo` and `todoList` produce output, else they produce nothing. todo_include_todos = False -# -- Options for HTML output ---------------------------------------------- - -# The theme to use for HTML and HTML Help pages. See the documentation for -# a list of builtin themes. html_theme = 'alabaster' - -# Theme options are theme-specific and customize the look and feel of a theme -# further. For a list of options available for each theme, see the -# documentation. html_theme_options = { 'github_user': 'mittagessen', 'github_repo': 'kraken', } -# Add any paths that contain custom themes here, relative to this directory. -#html_theme_path = [] - -# The name for this set of Sphinx documents. If None, it defaults to -# " v documentation". -#html_title = None - -# A shorter title for the navigation bar. Default is the same as html_title. -#html_short_title = None - -# The name of an image file (relative to this directory) to place at the top -# of the sidebar. -html_logo = '_static/kraken.png' - -# The name of an image file (within the static path) to use as favicon of the -# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 -# pixels large. -#html_favicon = None - -# Add any paths that contain custom static files (such as style sheets) here, -# relative to this directory. They are copied after the builtin static files, -# so a file named "default.css" will overwrite the builtin "default.css". html_static_path = ['_static'] html_css_files = [ 'custom.css', ] -# Add any extra paths that contain custom files (such as robots.txt or -# .htaccess) here, relative to this directory. These files are copied -# directly to the root of the documentation. -#html_extra_path = [] - -# If not '', a 'Last updated on:' timestamp is inserted at every page bottom, -# using the given strftime format. -#html_last_updated_fmt = '%b %d, %Y' - -# If true, SmartyPants will be used to convert quotes and dashes to -# typographically correct entities. -#html_use_smartypants = True - -# Custom sidebar templates, maps document names to template names. html_sidebars = { 'index': ['sidebarintro.html', 'navigation.html', 'searchbox.html', 'versions.html'], '**': ['localtoc.html', 'relations.html', 'searchbox.html', 'versions.html'] } html_baseurl = 'kraken.re' -# Additional templates that should be rendered to pages, maps page names to -# template names. -#html_additional_pages = {} - -# If false, no module index is generated. -#html_domain_indices = True - -# If false, no index is generated. -#html_use_index = True - -# If true, the index is split into individual pages for each letter. -#html_split_index = False - -# If true, links to the reST sources are added to the pages. -#html_show_sourcelink = True - -# If true, "Created using Sphinx" is shown in the HTML footer. Default is True. -#html_show_sphinx = True - -# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. -#html_show_copyright = True - -# If true, an OpenSearch description file will be output, and all pages will -# contain a tag referring to it. The value of this option must be the -# base URL from which the finished HTML is served. -#html_use_opensearch = '' - -# This is the file name suffix for HTML files (e.g. ".xhtml"). -#html_file_suffix = None - -# Language to be used for generating the HTML full-text search index. -# Sphinx supports the following languages: -# 'da', 'de', 'en', 'es', 'fi', 'fr', 'hu', 'it', 'ja' -# 'nl', 'no', 'pt', 'ro', 'ru', 'sv', 'tr' -#html_search_language = 'en' - -# A dictionary with options for the search language support, empty by default. -# Now only 'ja' uses this config value -#html_search_options = {'type': 'default'} - -# The name of a javascript file (relative to the configuration directory) that -# implements a search results scorer. If empty, the default will be used. -#html_search_scorer = 'scorer.js' - -# Output file base name for HTML help builder. htmlhelp_basename = 'krakendoc' -# -- Options for LaTeX output --------------------------------------------- - -latex_elements = { -# The paper size ('letterpaper' or 'a4paper'). -#'papersize': 'letterpaper', - -# The font size ('10pt', '11pt' or '12pt'). -#'pointsize': '10pt', - -# Additional stuff for the LaTeX preamble. -#'preamble': '', - -# Latex figure (float) alignment -#'figure_align': 'htbp', -} - -# Grouping the document tree into LaTeX files. List of tuples -# (source start file, target name, title, -# author, documentclass [howto, manual, or own class]). -latex_documents = [ - (master_doc, 'kraken.tex', 'kraken Documentation', - 'mittagessen', 'manual'), -] - -# The name of an image file (relative to this directory) to place at the top of -# the title page. -#latex_logo = None - -# For "manual" documents, if this is true, then toplevel headings are parts, -# not chapters. -#latex_use_parts = False - -# If true, show page references after internal links. -#latex_show_pagerefs = False - -# If true, show URL addresses after external links. -#latex_show_urls = False - -# Documents to append as an appendix to all manuals. -#latex_appendices = [] - -# If false, no module index is generated. -#latex_domain_indices = True - - -# -- Options for manual page output --------------------------------------- - -# One entry per manual page. List of tuples -# (source start file, name, description, authors, manual section). -man_pages = [ - (master_doc, 'kraken', 'kraken Documentation', - [author], 1) -] - -# If true, show URL addresses after external links. -#man_show_urls = False - - -# -- Options for Texinfo output ------------------------------------------- - -# Grouping the document tree into Texinfo files. List of tuples -# (source start file, target name, title, author, -# dir menu entry, description, category) -texinfo_documents = [ - (master_doc, 'kraken', 'kraken Documentation', - author, 'kraken', 'One line description of project.', - 'Miscellaneous'), -] - -# Documents to append as an appendix to all manuals. -#texinfo_appendices = [] - -# If false, no module index is generated. -#texinfo_domain_indices = True - -# How to display URL addresses: 'footnote', 'no', or 'inline'. -#texinfo_show_urls = 'footnote' - -# If true, do not generate a @detailmenu in the "Top" node's menu. -#texinfo_no_detailmenu = False - smv_branch_whitelist = r'main' smv_tag_whitelist = r'^[2-9]\.\d+(\.0)?$' diff --git a/docs/make.bat b/docs/make.bat deleted file mode 100644 index e51ed814f..000000000 --- a/docs/make.bat +++ /dev/null @@ -1,263 +0,0 @@ -@ECHO OFF - -REM Command file for Sphinx documentation - -if "%SPHINXBUILD%" == "" ( - set SPHINXBUILD=sphinx-build -) -set BUILDDIR=_build -set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% . -set I18NSPHINXOPTS=%SPHINXOPTS% . -if NOT "%PAPER%" == "" ( - set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS% - set I18NSPHINXOPTS=-D latex_paper_size=%PAPER% %I18NSPHINXOPTS% -) - -if "%1" == "" goto help - -if "%1" == "help" ( - :help - echo.Please use `make ^` where ^ is one of - echo. html to make standalone HTML files - echo. dirhtml to make HTML files named index.html in directories - echo. singlehtml to make a single large HTML file - echo. pickle to make pickle files - echo. json to make JSON files - echo. htmlhelp to make HTML files and a HTML help project - echo. qthelp to make HTML files and a qthelp project - echo. devhelp to make HTML files and a Devhelp project - echo. epub to make an epub - echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter - echo. text to make text files - echo. man to make manual pages - echo. texinfo to make Texinfo files - echo. gettext to make PO message catalogs - echo. changes to make an overview over all changed/added/deprecated items - echo. xml to make Docutils-native XML files - echo. pseudoxml to make pseudoxml-XML files for display purposes - echo. linkcheck to check all external links for integrity - echo. doctest to run all doctests embedded in the documentation if enabled - echo. coverage to run coverage check of the documentation if enabled - goto end -) - -if "%1" == "clean" ( - for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i - del /q /s %BUILDDIR%\* - goto end -) - - -REM Check if sphinx-build is available and fallback to Python version if any -%SPHINXBUILD% 2> nul -if errorlevel 9009 goto sphinx_python -goto sphinx_ok - -:sphinx_python - -set SPHINXBUILD=python -m sphinx.__init__ -%SPHINXBUILD% 2> nul -if errorlevel 9009 ( - echo. - echo.The 'sphinx-build' command was not found. Make sure you have Sphinx - echo.installed, then set the SPHINXBUILD environment variable to point - echo.to the full path of the 'sphinx-build' executable. Alternatively you - echo.may add the Sphinx directory to PATH. - echo. - echo.If you don't have Sphinx installed, grab it from - echo.http://sphinx-doc.org/ - exit /b 1 -) - -:sphinx_ok - - -if "%1" == "html" ( - %SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The HTML pages are in %BUILDDIR%/html. - goto end -) - -if "%1" == "dirhtml" ( - %SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml. - goto end -) - -if "%1" == "singlehtml" ( - %SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml. - goto end -) - -if "%1" == "pickle" ( - %SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle - if errorlevel 1 exit /b 1 - echo. - echo.Build finished; now you can process the pickle files. - goto end -) - -if "%1" == "json" ( - %SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json - if errorlevel 1 exit /b 1 - echo. - echo.Build finished; now you can process the JSON files. - goto end -) - -if "%1" == "htmlhelp" ( - %SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp - if errorlevel 1 exit /b 1 - echo. - echo.Build finished; now you can run HTML Help Workshop with the ^ -.hhp project file in %BUILDDIR%/htmlhelp. - goto end -) - -if "%1" == "qthelp" ( - %SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp - if errorlevel 1 exit /b 1 - echo. - echo.Build finished; now you can run "qcollectiongenerator" with the ^ -.qhcp project file in %BUILDDIR%/qthelp, like this: - echo.^> qcollectiongenerator %BUILDDIR%\qthelp\kraken.qhcp - echo.To view the help file: - echo.^> assistant -collectionFile %BUILDDIR%\qthelp\kraken.ghc - goto end -) - -if "%1" == "devhelp" ( - %SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. - goto end -) - -if "%1" == "epub" ( - %SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The epub file is in %BUILDDIR%/epub. - goto end -) - -if "%1" == "latex" ( - %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex - if errorlevel 1 exit /b 1 - echo. - echo.Build finished; the LaTeX files are in %BUILDDIR%/latex. - goto end -) - -if "%1" == "latexpdf" ( - %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex - cd %BUILDDIR%/latex - make all-pdf - cd %~dp0 - echo. - echo.Build finished; the PDF files are in %BUILDDIR%/latex. - goto end -) - -if "%1" == "latexpdfja" ( - %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex - cd %BUILDDIR%/latex - make all-pdf-ja - cd %~dp0 - echo. - echo.Build finished; the PDF files are in %BUILDDIR%/latex. - goto end -) - -if "%1" == "text" ( - %SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The text files are in %BUILDDIR%/text. - goto end -) - -if "%1" == "man" ( - %SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The manual pages are in %BUILDDIR%/man. - goto end -) - -if "%1" == "texinfo" ( - %SPHINXBUILD% -b texinfo %ALLSPHINXOPTS% %BUILDDIR%/texinfo - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The Texinfo files are in %BUILDDIR%/texinfo. - goto end -) - -if "%1" == "gettext" ( - %SPHINXBUILD% -b gettext %I18NSPHINXOPTS% %BUILDDIR%/locale - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The message catalogs are in %BUILDDIR%/locale. - goto end -) - -if "%1" == "changes" ( - %SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes - if errorlevel 1 exit /b 1 - echo. - echo.The overview file is in %BUILDDIR%/changes. - goto end -) - -if "%1" == "linkcheck" ( - %SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck - if errorlevel 1 exit /b 1 - echo. - echo.Link check complete; look for any errors in the above output ^ -or in %BUILDDIR%/linkcheck/output.txt. - goto end -) - -if "%1" == "doctest" ( - %SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest - if errorlevel 1 exit /b 1 - echo. - echo.Testing of doctests in the sources finished, look at the ^ -results in %BUILDDIR%/doctest/output.txt. - goto end -) - -if "%1" == "coverage" ( - %SPHINXBUILD% -b coverage %ALLSPHINXOPTS% %BUILDDIR%/coverage - if errorlevel 1 exit /b 1 - echo. - echo.Testing of coverage in the sources finished, look at the ^ -results in %BUILDDIR%/coverage/python.txt. - goto end -) - -if "%1" == "xml" ( - %SPHINXBUILD% -b xml %ALLSPHINXOPTS% %BUILDDIR%/xml - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The XML files are in %BUILDDIR%/xml. - goto end -) - -if "%1" == "pseudoxml" ( - %SPHINXBUILD% -b pseudoxml %ALLSPHINXOPTS% %BUILDDIR%/pseudoxml - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The pseudo-XML files are in %BUILDDIR%/pseudoxml. - goto end -) - -:end From f6cb0b9975bd915298f72974de97ee4c80f90267 Mon Sep 17 00:00:00 2001 From: Benjamin Kiessling Date: Wed, 10 Apr 2024 20:03:39 +0200 Subject: [PATCH 36/76] 5.0 updates to API tutorial --- docs/api.rst | 284 ++++++++++++++++++++++++++++++++++------------ docs/api_docs.rst | 13 ++- 2 files changed, 221 insertions(+), 76 deletions(-) diff --git a/docs/api.rst b/docs/api.rst index 703829f3a..ec1d22a0f 100644 --- a/docs/api.rst +++ b/docs/api.rst @@ -59,17 +59,32 @@ scripts) and explicit masking of non-text image regions: >>> seg = pageseg.segment(bw_im) >>> seg - {'text_direction': 'horizontal-lr', - 'boxes': [[0, 29, 232, 56], - [28, 54, 121, 84], - [9, 73, 92, 117], - [103, 76, 145, 131], - [7, 105, 119, 230], - [10, 228, 126, 345], - ... - ], - 'script_detection': False} - + Segmentation(type='bbox', + imagename='foo.png', + text_direction='horizontal-lr', + script_detection=False, + lines=[BBoxLine(id='0ce11ad6-1f3b-4f7d-a8c8-0178e411df69', + bbox=[74, 61, 136, 101], + text=None, + base_dir=None, + type='bbox', + imagename=None, + tags=None, + split=None, + regions=None, + text_direction='horizontal-lr'), + BBoxLine(id='c4a751dc-6731-4eea-a287-d4b57683f5b0', ...), + ....], + regions={}, + line_orders=[]) + +All segmentation methods return a :class:`kraken.containers.Segmentation` +object that contains all elements of the segmentation: its type, a list of +lines (either :class:`kraken.containers.BBoxLine` or +:class:`kraken.containers.BaselineLine`), a dictionary mapping region types to +lists of regions (:class:`kraken.containers.Region`), and one or more line +reading orders. + Baseline segmentation ~~~~~~~~~~~~~~~~~~~~~ @@ -103,22 +118,35 @@ Afterwards they can be fed into the segmentation method >>> baseline_seg = blla.segment(im, model=model) >>> baseline_seg - {'text_direction': 'horizontal-lr', - 'type': 'baselines', - 'script_detection': False, - 'lines': [{'script': 'default', - 'baseline': [[471, 1408], [524, 1412], [509, 1397], [1161, 1412], [1195, 1412]], - 'boundary': [[471, 1408], [491, 1408], [515, 1385], [562, 1388], [575, 1377], ... [473, 1410]]}, - ...], - 'regions': {'$tip':[[[536, 1716], ... [522, 1708], [524, 1716], [536, 1716], ...] - '$par': ... - '$nop': ...}} - >>> alto = serialization.serialize_segmentation(baseline_seg, image_name=im.filename, image_size=im.size, template='alto') + Segmentation(type='baselines', + imagename='foo.png', + text_direction='horizontal-lr', + script_detection=False, + lines=[BaselineLine(id='22fee3d1-377e-4130-b9e5-5983a0c50ce8', + baseline=[[71, 93], [145, 92]], + boundary=[[71, 93], ..., [71, 93]], + text=None, + base_dir=None, + type='baselines', + imagename=None, + tags={'type': 'default'}, + split=None, + regions=['f17d03e0-50bb-4a35-b247-cb910c0aaf2b']), + BaselineLine(id='539eadce-f795-4bba-a785-c7767d10c407', ...), ...], + regions={'text': [Region(id='f17d03e0-50bb-4a35-b247-cb910c0aaf2b', + boundary=[[277, 54], ..., [277, 54]], + imagename=None, + tags={'type': 'text'})]}, + line_orders=[]) + >>> alto = serialization.serialize(baseline_seg, + image_size=im.size, + template='alto') >>> with open('segmentation_output.xml', 'w') as fp: fp.write(alto) -Optional parameters are largely the same as for the legacy segmenter, i.e. text -direction and masking. +A default segmentation model is supplied and will be used if none is specified +explicitly as an argument. Optional parameters are largely the same as for the +legacy segmenter, i.e. text direction and masking. Images are automatically converted into the proper mode for recognition, except in the case of models trained on binary images as there is a plethora of @@ -187,7 +215,7 @@ segmentation model loading. >>> model = models.load_any(rec_model_path) The sequence recognizer wrapper combines the neural network itself, a -:ref:`codec `, metadata such as the if the input is supposed to be +:ref:`codec `, metadata such as if the input is supposed to be grayscale or binarized, and an instance of a CTC decoder that performs the conversion of the raw output tensor of the network into a sequence of labels: @@ -198,7 +226,7 @@ Afterwards, given an image, a segmentation and the model one can perform text recognition. The code is identical for both legacy and baseline segmentations. Like for segmentation input images are auto-converted to the correct color mode, except in the case of binary models for which a warning will be raised if -there is a mismatch for binary input models. +there is a mismatch. There are two methods for recognition, a basic single model call :func:`kraken.rpred.rpred` and a multi-model recognizer @@ -210,12 +238,15 @@ a document. >>> from kraken import rpred # single model recognition - >>> pred_it = rpred(model, im, baseline_seg) + >>> pred_it = rpred(network=model, + im=im, + segmentation=baseline_seg) >>> for record in pred_it: print(record) -The output isn't just a sequence of characters but an -:class:`kraken.rpred.ocr_record` record object containing the character +The output isn't just a sequence of characters but, depending on the type of +segmentation supplied, a :class:`kraken.containers.BaselineOCRRecord` or +:class:`kraken.containers.BBoxOCRRecord` record object containing the character prediction, cuts (approximate locations), and confidences. .. code-block:: python @@ -237,7 +268,7 @@ it is also possible to access the original line information: # for box lines >>> record.type - 'box' + 'bbox' >>> record.line >>> record.script @@ -276,70 +307,179 @@ XML Parsing Sometimes it is desired to take the data in an existing XML serialization format like PageXML or ALTO and apply an OCR function on it. The :mod:`kraken.lib.xml` module includes parsers extracting information into data -structures processable with minimal transformtion by the functional blocks: +structures processable with minimal transformation by the functional blocks: + +Parsing is accessed is through the :class:`kraken.lib.xml.XMLPage` class. .. code-block:: python >>> from kraken.lib import xml >>> alto_doc = '/path/to/alto' - >>> xml.parse_alto(alto_doc) - {'image': '/path/to/image/file', - 'type': 'baselines', - 'lines': [{'baseline': [(24, 2017), (25, 2078)], - 'boundary': [(69, 2016), (70, 2077), (20, 2078), (19, 2017)], - 'text': '', - 'script': 'default'}, - {'baseline': [(79, 2016), (79, 2041)], - 'boundary': [(124, 2016), (124, 2041), (74, 2041), (74, 2016)], - 'text': '', - 'script': 'default'}, ...], - 'regions': {'Image/Drawing/Figure': [[(-5, 3398), (207, 3398), (207, 2000), (-5, 2000)], - [(253, 3292), (668, 3292), (668, 3455), (253, 3455)], - [(216, -4), (1015, -4), (1015, 534), (216, 534)]], - 'Handwritten text': [[(2426, 3367), (2483, 3367), (2483, 3414), (2426, 3414)], - [(1824, 3437), (2072, 3437), (2072, 3514), (1824, 3514)]], - ...} + >>> parsed_doc = xml.XMLPage(alto_doc) + >>> parsed_doc + XMLPage(filename='/path/to/alto', filetype=alto) + >>> parsed_doc.lines + {'line_1469098625593_463': BaselineLine(id='line_1469098625593_463', + baseline=[(2337, 226), (2421, 239)], + boundary=[(2344, 182), (2428, 195), (2420, 244), (2336, 231)], + text='$pag:39', + base_dir=None, + type='baselines', + imagename=None, + tags={'type': '$pag'}, + split=None, + regions=['region_1469098609000_462']), + + 'line_1469098649515_464': BaselineLine(id='line_1469098649515_464', + baseline=[(789, 269), (2397, 304)], + boundary=[(790, 224), (2398, 259), (2397, 309), (789, 274)], + text='$-nor su hijo, De todos sus bienes, con los pactos', + base_dir=None, + type='baselines', + imagename=None, + tags={'type': '$pac'}, + split=None, + regions=['region_1469098557906_461']), + ....} + >>> parsed_doc.regions + {'$pag': [Region(id='region_1469098609000_462', + boundary=[(2324, 171), (2437, 171), (2436, 258), (2326, 237)], + imagename=None, + tags={'type': '$pag'})], + '$pac': [Region(id='region_1469098557906_461', + boundary=[(738, 203), (2339, 245), (2398, 294), (2446, 345), (2574, 469), (2539, 1873), (2523, 2053), (2477, 2182), (738, 2243)], + imagename=None, + tags={'type': '$pac'})], + '$tip': [Region(id='TextRegion_1520586482298_194', + boundary=[(687, 2428), (688, 2422), (107, 2420), (106, 2264), (789, 2256), (758, 2404)], + imagename=None, + tags={'type': '$tip'})], + '$par': [Region(id='TextRegion_1520586482298_193', + boundary=[(675, 3772), (687, 2428), (758, 2404), (789, 2256), (2542, 2236), (2581, 3748)], + imagename=None, + tags={'type': '$par'})] } - >>> page_doc = '/path/to/page' - >>> xml.parse_page(page_doc) - {'image': '/path/to/image/file', - 'type': 'baselines', - 'lines': [{'baseline': [(24, 2017), (25, 2078)], - 'boundary': [(69, 2016), (70, 2077), (20, 2078), (19, 2017)], - 'text': '', - 'script': 'default'}, - {'baseline': [(79, 2016), (79, 2041)], - 'boundary': [(124, 2016), (124, 2041), (74, 2041), (74, 2016)], - 'text': '', - 'script': 'default'}, ...], - 'regions': {'Image/Drawing/Figure': [[(-5, 3398), (207, 3398), (207, 2000), (-5, 2000)], - [(253, 3292), (668, 3292), (668, 3455), (253, 3455)], - [(216, -4), (1015, -4), (1015, 534), (216, 534)]], - 'Handwritten text': [[(2426, 3367), (2483, 3367), (2483, 3414), (2426, 3414)], - [(1824, 3437), (2072, 3437), (2072, 3514), (1824, 3514)]], - ...} +The parser is aware of reading order(s), thus the basic properties accessing +lines and regions are unordered dictionaries. Reading orders can be accessed +separately through the `reading_orders` property: + +.. code-block:: python + + >>> parsed_doc.region_orders + {'line_implicit': {'order': ['line_1469098625593_463', + 'line_1469098649515_464', + ... + 'line_1469099255968_508'], + 'is_total': True, + 'description': 'Implicit line order derived from element sequence'}, + 'region_implicit': {'order': ['region_1469098609000_462', + ... + 'TextRegion_1520586482298_193'], + 'is_total': True, + 'description': 'Implicit region order derived from element sequence'}, + 'region_transkribus': {'order': ['region_1469098609000_462', + ... + 'TextRegion_1520586482298_193'], + 'is_total': True, + 'description': 'Explicit region order from `custom` attribute'}, + 'line_transkribus': {'order': ['line_1469098625593_463', + ... + 'line_1469099255968_508'], + 'is_total': True, + 'description': 'Explicit line order from `custom` attribute'}, + 'o_1530717944451': {'order': ['region_1469098609000_462', + ... + 'TextRegion_1520586482298_193'], + 'is_total': True, + 'description': 'Regions reading order'}} + +Reading orders are created from different sources, depending on the content of +the XML file. Every document will contain at least implicit orders for lines +and regions (`line_implicit` and `region_implicit`) sourced from the sequence +of line and region elements. There can also be explicit additional orders +defined by the standard reading order elements, for example `o_1530717944451` +in the above example. In Page XML files reading orders defined with the +Transkribus style custom attribute are also recognized. + +To access the lines or regions of a document in a particular order: + +.. code-block:: python + + >>> parsed_doc.get_sorted_lines(ro='line_implicit') + [BaselineLine(id='line_1469098625593_463', + baseline=[(2337, 226), (2421, 239)], + boundary=[(2344, 182), (2428, 195), (2420, 244), (2336, 231)], + text='$pag:39', + base_dir=None, + type='baselines', + imagename=None, + tags={'type': '$pag'}, + split=None, + regions=['region_1469098609000_462']), + BaselineLine(id='line_1469098649515_464', + baseline=[(789, 269), (2397, 304)], + boundary=[(790, 224), (2398, 259), (2397, 309), (789, 274)], + text='$-nor su hijo, De todos sus bienes, con los pactos', + base_dir=None, + type='baselines', + imagename=None, + tags={'type': '$pac'}, + split=None, + regions=['region_1469098557906_461']) + ...] + +The recognizer functions do not accept :class:`kraken.lib.xml.XMLPage` objects +directly which means that for most practical purposes these need to be +converted into :class:`container ` objects: + +.. code-block:: python + + >>> segmentation = parsed_doc.to_container() + >>> pred_it = rpred(network=model, + im=im, + segmentation=segmentation) + >>> for record in pred_it: + print(record) Serialization ------------- -The serialization module can be used to transform the :class:`ocr_records -` returned by the prediction iterator into a text -based (most often XML) format for archival. The module renders `jinja2 -`_ templates in `kraken/templates` through -the :func:`kraken.serialization.serialize` function. + +The serialization module can be used to transform results returned by the +segmenter or recognizer into a text based (most often XML) format for archival. +The module renders `jinja2 `_ templates, +either ones :ref:`packaged ` with kraken or supplied externally, +through the :func:`kraken.serialization.serialize` function. .. code-block:: python + >>> import dataclasses >>> from kraken.lib import serialization + >>> alto_seg_only = serialization.serialize(baseline_seg, image_size=im.size, template='alto') + >>> records = [record for record in pred_it] - >>> alto = serialization.serialize(records, image_name='path/to/image', image_size=im.size, template='alto') + >>> results = dataclasses.replace(pred_it.bounds, lines=records) + >>> alto = serialization.serialize(results, image_size=im.size, template='alto') >>> with open('output.xml', 'w') as fp: fp.write(alto) +The serialization function accepts arbitrary +:class:`kraken.containers.Segmentation` objects, which may contain textual or +only segmentation information. As the recognizer returns +:class:`ocr_records ` which cannot be serialized +directly it is necessary to either construct a new +:class:`kraken.containers.Segmentation` from scratch or insert them into the +segmentation fed into the recognizer (:class:`ocr_records +` subclass :class:`BaselineLine +`/:class:`BBoxLine +` The container classes are immutable data classes, +therefore it is necessary for simple insertion of the records to use +`dataclasses.replace` to create a new segmentation with a changed lines +attribute. Training -------- diff --git a/docs/api_docs.rst b/docs/api_docs.rst index cb85ff91f..494232c09 100644 --- a/docs/api_docs.rst +++ b/docs/api_docs.rst @@ -53,28 +53,30 @@ kraken.serialization module Default templates ----------------- +.. _templates: + ALTO 4.4 ^^^^^^^^ -.. literalinclude:: ../../templates/alto +.. literalinclude:: ../kraken/templates/alto :language: xml+jinja PageXML ^^^^^^^ -.. literalinclude:: ../../templates/alto +.. literalinclude:: ../kraken/templates/alto :language: xml+jinja hOCR ^^^^ -.. literalinclude:: ../../templates/alto +.. literalinclude:: ../kraken/templates/alto :language: xml+jinja ABBYY XML ^^^^^^^^^ -.. literalinclude:: ../../templates/abbyyxml +.. literalinclude:: ../kraken/templates/abbyyxml :language: xml+jinja Containers and Helpers @@ -98,6 +100,9 @@ kraken.containers module .. autoapiclass:: kraken.containers.BBoxLine :members: +.. autoapiclass:: kraken.containers.Region + :members: + .. autoapiclass:: kraken.containers.ocr_record :members: From 19ab0931a97fe9c2ff71e5dc936c6a3e4429ee70 Mon Sep 17 00:00:00 2001 From: Stefan Weil Date: Fri, 19 Apr 2024 17:29:38 +0200 Subject: [PATCH 37/76] Print separate lines for pages in log output of extract_lines.py Signed-off-by: Stefan Weil --- kraken/contrib/extract_lines.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/kraken/contrib/extract_lines.py b/kraken/contrib/extract_lines.py index 78f779af9..053d48f97 100755 --- a/kraken/contrib/extract_lines.py +++ b/kraken/contrib/extract_lines.py @@ -56,6 +56,7 @@ def cli(format_type, model, legacy_polygons, files): im.save('{}.{}.jpg'.format(splitext(doc)[0], idx)) with open('{}.{}.gt.txt'.format(splitext(doc)[0], idx), 'w') as fp: fp.write(sample['text']) + click.echo() else: net = vgsl.TorchVGSLModel.load_model(model) for doc in files: @@ -65,6 +66,7 @@ def cli(format_type, model, legacy_polygons, files): for idx, (im, box) in enumerate(segmentation.extract_polygons(full_im, bounds, legacy=legacy_polygons)): click.echo('.', nl=False) im.save('{}.{}.jpg'.format(splitext(doc)[0], idx)) + click.echo() if __name__ == '__main__': From 36b3424810c8eaec2ba62e784d579eb3d2a716bb Mon Sep 17 00:00:00 2001 From: Benjamin Kiessling Date: Sat, 20 Apr 2024 15:15:33 +0200 Subject: [PATCH 38/76] Update pytorch/lightning to 2.2 --- conda/meta.yaml | 6 +- environment.yml | 6 +- environment_cuda.yml | 6 +- .../hyperparameters/tune_pretraining.py | 89 ------------------- .../contrib/hyperparameters/tune_training.py | 58 ------------ kraken/ketos/__init__.py | 4 +- kraken/lib/pretrain/model.py | 10 +-- kraken/lib/progress.py | 2 +- kraken/lib/ro/model.py | 6 +- kraken/lib/train.py | 32 +++---- setup.cfg | 6 +- 11 files changed, 39 insertions(+), 186 deletions(-) delete mode 100644 kraken/contrib/hyperparameters/tune_pretraining.py delete mode 100644 kraken/contrib/hyperparameters/tune_training.py diff --git a/conda/meta.yaml b/conda/meta.yaml index 1e687f559..4a06a0a91 100644 --- a/conda/meta.yaml +++ b/conda/meta.yaml @@ -21,7 +21,7 @@ requirements: - scipy~=1.11.0 - jinja2~=3.0 - torchvision - - pytorch>=1.12.0 + - pytorch~=2.2.0 - cudatoolkit - jsonschema - scikit-image~=0.21.0 @@ -30,9 +30,9 @@ requirements: - pyvips - coremltools - pyarrow - - lightning~=2.0 + - lightning~=2.2 - torchmetrics>=1.1.0 - - conda-forge::threadpoolctl~=3.2.0 + - conda-forge::threadpoolctl~=3.4.0 - albumentations - rich about: diff --git a/environment.yml b/environment.yml index 410e1a087..4787271dc 100644 --- a/environment.yml +++ b/environment.yml @@ -14,7 +14,7 @@ dependencies: - scipy~=1.10.0 - jinja2~=3.0 - conda-forge::torchvision-cpu>=0.5.0 - - conda-forge::pytorch-cpu~=2.0.0 + - conda-forge::pytorch-cpu~=2.2.0 - jsonschema - scikit-learn~=1.2.1 - scikit-image~=0.21.0 @@ -23,9 +23,9 @@ dependencies: - imagemagick>=7.1.0 - pyarrow - importlib-resources>=1.3.0 - - conda-forge::lightning~=2.0.0 + - conda-forge::lightning~=2.2.0 - conda-forge::torchmetrics>=1.1.0 - - conda-forge::threadpoolctl~=3.2 + - conda-forge::threadpoolctl~=3.4 - pip - albumentations - rich diff --git a/environment_cuda.yml b/environment_cuda.yml index 7844ba138..ebdda92de 100644 --- a/environment_cuda.yml +++ b/environment_cuda.yml @@ -14,7 +14,7 @@ dependencies: - scipy~=1.10.0 - jinja2~=3.0 - conda-forge::torchvision>=0.5.0 - - conda-forge::pytorch~=2.0.0 + - conda-forge::pytorch~=2.2.0 - cudatoolkit>=9.2 - jsonschema - scikit-learn~=1.2.1 @@ -24,9 +24,9 @@ dependencies: - imagemagick>=7.1.0 - pyarrow - importlib-resources>=1.3.0 - - conda-forge::lightning~=2.0.0 + - conda-forge::lightning~=2.2.0 - conda-forge::torchmetrics>=1.1.0 - - conda-forge::threadpoolctl~=3.2 + - conda-forge::threadpoolctl~=3.4 - pip - albumentations - rich diff --git a/kraken/contrib/hyperparameters/tune_pretraining.py b/kraken/contrib/hyperparameters/tune_pretraining.py deleted file mode 100644 index 5564b521d..000000000 --- a/kraken/contrib/hyperparameters/tune_pretraining.py +++ /dev/null @@ -1,89 +0,0 @@ -#!/usr/bin/env python -""" -A script for a grid search over pretraining hyperparameters. -""" -from functools import partial - -import click -import pytorch_lightning as pl -from pytorch_lightning import seed_everything -from ray import tune -from ray.tune.integration.pytorch_lightning import TuneReportCallback - -from kraken.ketos.util import _validate_manifests -from kraken.lib.default_specs import (RECOGNITION_PRETRAIN_HYPER_PARAMS, - RECOGNITION_SPEC) -from kraken.lib.pretrain.model import (PretrainDataModule, - RecognitionPretrainModel) - -config = {'lrate': tune.loguniform(1e-8, 1e-2), - 'num_negatives': tune.qrandint(1, 4, 1), - 'mask_prob': tune.loguniform(0.01, 0.2), - 'mask_width': tune.qrandint(2, 8, 2)} - -resources_per_trial = {"cpu": 8, "gpu": 0.5} - - -def train_tune(config, training_data=None, epochs=100, spec=RECOGNITION_SPEC): - - hyper_params = RECOGNITION_PRETRAIN_HYPER_PARAMS.copy() - hyper_params.update(config) - - model = RecognitionPretrainModel(hyper_params=hyper_params, - output='./model', - spec=spec) - - data_module = PretrainDataModule(batch_size=hyper_params.pop('batch_size'), - pad=hyper_params.pop('pad'), - augment=hyper_params.pop('augment'), - training_data=training_data, - num_workers=resources_per_trial['cpu'], - height=model.height, - width=model.width, - channels=model.channels, - format_type='binary') - - callback = TuneReportCallback({'loss': 'CE'}, on='validation_end') - trainer = pl.Trainer(max_epochs=epochs, - accelerator='gpu', - devices=1, - callbacks=[callback], - enable_progress_bar=False) - trainer.fit(model, datamodule=data_module) - - -@click.command() -@click.option('-v', '--verbose', default=0, count=True) -@click.option('-s', '--seed', default=42, type=click.INT, - help='Seed for numpy\'s and torch\'s RNG. Set to a fixed value to ' - 'ensure reproducible random splits of data') -@click.option('-o', '--output', show_default=True, type=click.Path(), default='pretrain_hyper', help='output directory') -@click.option('-n', '--num-samples', show_default=True, type=int, default=100, help='Number of samples to train') -@click.option('-N', '--epochs', show_default=True, type=int, default=10, help='Maximum number of epochs to train per sample') -@click.option('-s', '--spec', show_default=True, default=RECOGNITION_SPEC, help='VGSL spec of the network to train.') -@click.option('-t', '--training-files', show_default=True, default=None, multiple=True, - callback=_validate_manifests, type=click.File(mode='r', lazy=True), - help='File(s) with additional paths to training data') -@click.argument('files', nargs=-1) -def cli(verbose, seed, output, num_samples, epochs, spec, training_files, files): - - files = list(files) - - if training_files: - files.extend(training_files) - - if not files: - raise click.UsageError('No training data was provided to the search command. Use `-t` or the `files` argument.') - - seed_everything(seed, workers=True) - - analysis = tune.run(partial(train_tune, - training_data=files, - epochs=epochs, - spec=spec), local_dir=output, num_samples=num_samples, resources_per_trial=resources_per_trial, config=config) - - click.echo("Best hyperparameters found were: ", analysis.get_best_config(metric='accuracy', mode='max')) - - -if __name__ == '__main__': - cli() diff --git a/kraken/contrib/hyperparameters/tune_training.py b/kraken/contrib/hyperparameters/tune_training.py deleted file mode 100644 index e123c3754..000000000 --- a/kraken/contrib/hyperparameters/tune_training.py +++ /dev/null @@ -1,58 +0,0 @@ -#!/usr/bin/env python -""" -A script for a grid search over pretraining hyperparameters. -""" -import sys -from functools import partial - -import pytorch_lightning as pl -from ray import tune -from ray.tune.integration.pytorch_lightning import TuneReportCallback - -from kraken.lib.default_spec import (RECOGNITION_PRETRAIN_HYPER_PARAMS, - RECOGNITION_SPEC) -from kraken.lib.pretrain.model import (PretrainDataModule, - RecognitionPretrainModel) - -config = {'lrate': tune.loguniform(1e-8, 1e-2), - 'num_negatives': tune.qrandint(2, 100, 8), - 'mask_prob': tune.loguniform(0.01, 0.2), - 'mask_width': tune.qrandint(2, 8, 2)} - -resources_per_trial = {"cpu": 8, "gpu": 0.5} - - -def train_tune(config, training_data=None, epochs=100): - - hyper_params = RECOGNITION_PRETRAIN_HYPER_PARAMS.copy() - hyper_params.update(config) - - model = RecognitionPretrainModel(hyper_params=hyper_params, - output='model', - spec=RECOGNITION_SPEC) - - _ = PretrainDataModule(batch_size=hyper_params.pop('batch_size'), - pad=hyper_params.pop('pad'), - augment=hyper_params.pop('augment'), - training_data=training_data, - num_workers=resources_per_trial['cpu'], - height=model.height, - width=model.width, - channels=model.channels, - format_type='binary') - - callback = TuneReportCallback({'loss': 'CE'}, on='validation_end') - trainer = pl.Trainer(max_epochs=epochs, - gpus=1, - callbacks=[callback], - enable_progress_bar=False) - trainer.fit(model) - - -analysis = tune.run(partial(train_tune, training_data=sys.argv[2:]), - local_dir=sys.argv[1], - num_samples=100, - resources_per_trial=resources_per_trial, - config=config) - -print("Best hyperparameters found were: ", analysis.get_best_config(metric='accuracy', mode='max')) diff --git a/kraken/ketos/__init__.py b/kraken/ketos/__init__.py index 9edb8d005..4537691b3 100644 --- a/kraken/ketos/__init__.py +++ b/kraken/ketos/__init__.py @@ -60,10 +60,10 @@ def cli(ctx, verbose, seed, deterministic): ctx.meta['deterministic'] = False if not deterministic else 'warn' if seed: - from pytorch_lightning import seed_everything + from lightning.pytorch import seed_everything seed_everything(seed, workers=True) elif deterministic: - from pytorch_lightning import seed_everything + from lightning.pytorch import seed_everything seed_everything(42, workers=True) ctx.meta['verbose'] = verbose diff --git a/kraken/lib/pretrain/model.py b/kraken/lib/pretrain/model.py index d86d2a7c1..cd1d12e32 100644 --- a/kraken/lib/pretrain/model.py +++ b/kraken/lib/pretrain/model.py @@ -36,11 +36,11 @@ from typing import TYPE_CHECKING, Any, Dict, Optional, Sequence, Union import numpy as np -import pytorch_lightning as pl +import lightning as L import torch import torch.nn.functional as F -from pytorch_lightning.callbacks import EarlyStopping -from pytorch_lightning.utilities.memory import (garbage_collection_cuda, +from lightning.pytorch.callbacks import EarlyStopping +from lightning.pytorch.utilities.memory import (garbage_collection_cuda, is_oom_error) from torch.optim import lr_scheduler from torch.utils.data import DataLoader, Subset, random_split @@ -73,7 +73,7 @@ def _star_fun(fun, kwargs): return None -class PretrainDataModule(pl.LightningDataModule): +class PretrainDataModule(L.LightningDataModule): def __init__(self, training_data: Union[Sequence[Union['PathLike', str]], Sequence[Dict[str, Any]]] = None, evaluation_data: Optional[Union[Sequence[Union['PathLike', str]], Sequence[Dict[str, Any]]]] = None, @@ -266,7 +266,7 @@ def setup(self, stage: Optional[str] = None): self.val_set.dataset.no_encode() -class RecognitionPretrainModel(pl.LightningModule): +class RecognitionPretrainModel(L.LightningModule): def __init__(self, hyper_params: Dict[str, Any] = None, output: str = 'model', diff --git a/kraken/lib/progress.py b/kraken/lib/progress.py index 25201a9be..1ba65a258 100644 --- a/kraken/lib/progress.py +++ b/kraken/lib/progress.py @@ -18,7 +18,7 @@ from dataclasses import dataclass from typing import TYPE_CHECKING, Union -from pytorch_lightning.callbacks.progress.rich_progress import ( +from lightning.pytorch.callbacks.progress.rich_progress import ( CustomProgress, MetricsTextColumn, RichProgressBar) from rich import get_console, reconfigure from rich.default_styles import DEFAULT_STYLES diff --git a/kraken/lib/ro/model.py b/kraken/lib/ro/model.py index cba78bd13..c9c661afa 100644 --- a/kraken/lib/ro/model.py +++ b/kraken/lib/ro/model.py @@ -23,10 +23,10 @@ Sequence, Union) import numpy as np -import pytorch_lightning as pl +import lightning as L import torch import torch.nn.functional as F -from pytorch_lightning.callbacks import EarlyStopping, LearningRateMonitor +from lightning.pytorch.callbacks import EarlyStopping, LearningRateMonitor from torch.optim import lr_scheduler from torch.utils.data import DataLoader, Subset @@ -64,7 +64,7 @@ def spearman_footrule_distance(s, t): return (s - t).abs().sum() / (0.5 * (len(s) ** 2 - (len(s) % 2))) -class ROModel(pl.LightningModule): +class ROModel(L.LightningModule): def __init__(self, hyper_params: Dict[str, Any] = None, output: str = 'model', diff --git a/kraken/lib/train.py b/kraken/lib/train.py index 65b65b1e1..31d6532a8 100644 --- a/kraken/lib/train.py +++ b/kraken/lib/train.py @@ -23,10 +23,10 @@ from functools import partial import numpy as np -import pytorch_lightning as pl +import lightning as L import torch import torch.nn.functional as F -from pytorch_lightning.callbacks import (BaseFinetuning, Callback, +from lightning.pytorch.callbacks import (BaseFinetuning, Callback, EarlyStopping, LearningRateMonitor) from torch.optim import lr_scheduler from torch.utils.data import DataLoader, Subset, random_split @@ -66,21 +66,21 @@ def _validation_worker_init_fn(worker_id): results when validating. Temporarily increase the logging level for lightning because otherwise it will display a message at info level about the seed being changed. """ - from pytorch_lightning import seed_everything + from lightning.pytorch import seed_everything level = logging.getLogger("lightning_fabric.utilities.seed").level logging.getLogger("lightning_fabric.utilities.seed").setLevel(logging.WARN) seed_everything(42) logging.getLogger("lightning_fabric.utilities.seed").setLevel(level) -class KrakenTrainer(pl.Trainer): +class KrakenTrainer(L.Trainer): def __init__(self, enable_progress_bar: bool = True, enable_summary: bool = True, min_epochs: int = 5, max_epochs: int = 100, freeze_backbone=-1, - pl_logger: Union[pl.loggers.logger.Logger, str, None] = None, + pl_logger: Union[L.loggers.logger.Logger, str, None] = None, log_dir: Optional['PathLike'] = None, *args, **kwargs): @@ -93,14 +93,14 @@ def __init__(self, kwargs['callbacks'] = [kwargs['callbacks']] if pl_logger: - if 'logger' in kwargs and isinstance(kwargs['logger'], pl.loggers.logger.Logger): + if 'logger' in kwargs and isinstance(kwargs['logger'], L.loggers.logger.Logger): logger.debug('Experiment logger has been provided outside KrakenTrainer as `logger`') - elif isinstance(pl_logger, pl.loggers.logger.Logger): + elif isinstance(pl_logger, L.loggers.logger.Logger): logger.debug('Experiment logger has been provided outside KrakenTrainer as `pl_logger`') kwargs['logger'] = pl_logger elif pl_logger == 'tensorboard': logger.debug('Creating default experiment logger') - kwargs['logger'] = pl.loggers.TensorBoardLogger(log_dir) + kwargs['logger'] = L.loggers.TensorBoardLogger(log_dir) else: logger.error('`pl_logger` was set, but %s is not an accepted value', pl_logger) raise ValueError(f'{pl_logger} is not acceptable as logger') @@ -113,7 +113,7 @@ def __init__(self, kwargs['callbacks'].append(progress_bar_cb) if enable_summary: - from pytorch_lightning.callbacks import RichModelSummary + from lightning.pytorch.callbacks import RichModelSummary summary_cb = RichModelSummary(max_depth=2) kwargs['callbacks'].append(summary_cb) kwargs['enable_model_summary'] = False @@ -146,10 +146,10 @@ def freeze_before_training(self, pl_module): def finetune_function(self, pl_module, current_epoch, optimizer): pass - def on_train_start(self, trainer: "pl.Trainer", pl_module: "pl.LightningModule") -> None: + def on_train_start(self, trainer: "L.Trainer", pl_module: "L.LightningModule") -> None: self.freeze(pl_module.net[:-1]) - def on_train_batch_start(self, trainer: "pl.Trainer", pl_module: "pl.LightningModule", batch, batch_idx) -> None: + def on_train_batch_start(self, trainer: "L.Trainer", pl_module: "L.LightningModule", batch, batch_idx) -> None: """ Called for each training batch. """ @@ -162,7 +162,7 @@ def on_train_batch_start(self, trainer: "pl.Trainer", pl_module: "pl.LightningMo current_param_groups = optimizer.param_groups self._store(pl_module, opt_idx, num_param_groups, current_param_groups) - def on_train_epoch_start(self, trainer: "pl.Trainer", pl_module: "pl.LightningModule") -> None: + def on_train_epoch_start(self, trainer: "L.Trainer", pl_module: "L.LightningModule") -> None: """Called when the epoch begins.""" pass @@ -171,7 +171,7 @@ class KrakenSetOneChannelMode(Callback): """ Callback that sets the one_channel_mode of the model after the first epoch. """ - def on_train_epoch_end(self, trainer: "pl.Trainer", pl_module: "pl.LightningModule") -> None: + def on_train_epoch_end(self, trainer: "L.Trainer", pl_module: "L.LightningModule") -> None: # fill one_channel_mode after 1 iteration over training data set if not trainer.sanity_checking and trainer.current_epoch == 0 and trainer.model.nn.model_type == 'recognition': ds = getattr(pl_module, 'train_set', None) @@ -187,7 +187,7 @@ class KrakenSaveModel(Callback): """ Kraken's own serialization callback instead of pytorch's. """ - def on_validation_end(self, trainer: "pl.Trainer", pl_module: "pl.LightningModule") -> None: + def on_validation_end(self, trainer: "L.Trainer", pl_module: "L.LightningModule") -> None: if not trainer.sanity_checking: trainer.model.nn.hyper_params['completed_epochs'] += 1 metric = float(trainer.logged_metrics['val_metric']) if 'val_metric' in trainer.logged_metrics else -1.0 @@ -199,7 +199,7 @@ def on_validation_end(self, trainer: "pl.Trainer", pl_module: "pl.LightningModul trainer.model.best_model = f'{trainer.model.output}_{trainer.model.best_epoch}.mlmodel' -class RecognitionModel(pl.LightningModule): +class RecognitionModel(L.LightningModule): def __init__(self, hyper_params: Dict[str, Any] = None, output: str = 'model', @@ -706,7 +706,7 @@ def lr_scheduler_step(self, scheduler, metric): scheduler.step(metric) -class SegmentationModel(pl.LightningModule): +class SegmentationModel(L.LightningModule): def __init__(self, hyper_params: Dict = None, load_hyper_parameters: bool = False, diff --git a/setup.cfg b/setup.cfg index 982d5a815..4f880f868 100644 --- a/setup.cfg +++ b/setup.cfg @@ -53,14 +53,14 @@ install_requires = jinja2~=3.0 python-bidi torchvision>=0.5.0 - torch~=2.0.1 + torch~=2.2.0 scikit-learn~=1.2.1 scikit-image~=0.21.0 shapely~=1.8.5 pyarrow - lightning~=2.0.0 + lightning~=2.2.0 torchmetrics>=1.1.0 - threadpoolctl~=3.2.0 + threadpoolctl~=3.4.0 importlib-resources>=1.3.0 rich From 51d593a51ee4b51af174fa4100da9ee59f661da1 Mon Sep 17 00:00:00 2001 From: Benjamin Kiessling Date: Sat, 20 Apr 2024 16:07:27 +0200 Subject: [PATCH 39/76] fix deps --- conda/meta.yaml | 2 +- environment.yml | 2 +- environment_cuda.yml | 2 +- kraken/lib/train.py | 8 ++++---- setup.cfg | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/conda/meta.yaml b/conda/meta.yaml index 4a06a0a91..1620e62cc 100644 --- a/conda/meta.yaml +++ b/conda/meta.yaml @@ -21,7 +21,7 @@ requirements: - scipy~=1.11.0 - jinja2~=3.0 - torchvision - - pytorch~=2.2.0 + - pytorch~=2.1.0 - cudatoolkit - jsonschema - scikit-image~=0.21.0 diff --git a/environment.yml b/environment.yml index 4787271dc..242b8426c 100644 --- a/environment.yml +++ b/environment.yml @@ -14,7 +14,7 @@ dependencies: - scipy~=1.10.0 - jinja2~=3.0 - conda-forge::torchvision-cpu>=0.5.0 - - conda-forge::pytorch-cpu~=2.2.0 + - conda-forge::pytorch-cpu~=2.1.0 - jsonschema - scikit-learn~=1.2.1 - scikit-image~=0.21.0 diff --git a/environment_cuda.yml b/environment_cuda.yml index ebdda92de..83b75f850 100644 --- a/environment_cuda.yml +++ b/environment_cuda.yml @@ -14,7 +14,7 @@ dependencies: - scipy~=1.10.0 - jinja2~=3.0 - conda-forge::torchvision>=0.5.0 - - conda-forge::pytorch~=2.2.0 + - conda-forge::pytorch~=2.1.0 - cudatoolkit>=9.2 - jsonschema - scikit-learn~=1.2.1 diff --git a/kraken/lib/train.py b/kraken/lib/train.py index 31d6532a8..ec9685aff 100644 --- a/kraken/lib/train.py +++ b/kraken/lib/train.py @@ -80,7 +80,7 @@ def __init__(self, min_epochs: int = 5, max_epochs: int = 100, freeze_backbone=-1, - pl_logger: Union[L.loggers.logger.Logger, str, None] = None, + pl_logger: Union[L.pytorch.loggers.logger.Logger, str, None] = None, log_dir: Optional['PathLike'] = None, *args, **kwargs): @@ -93,14 +93,14 @@ def __init__(self, kwargs['callbacks'] = [kwargs['callbacks']] if pl_logger: - if 'logger' in kwargs and isinstance(kwargs['logger'], L.loggers.logger.Logger): + if 'logger' in kwargs and isinstance(kwargs['logger'], L.pytorch.loggers.logger.Logger): logger.debug('Experiment logger has been provided outside KrakenTrainer as `logger`') - elif isinstance(pl_logger, L.loggers.logger.Logger): + elif isinstance(pl_logger, L.pytorch.loggers.logger.Logger): logger.debug('Experiment logger has been provided outside KrakenTrainer as `pl_logger`') kwargs['logger'] = pl_logger elif pl_logger == 'tensorboard': logger.debug('Creating default experiment logger') - kwargs['logger'] = L.loggers.TensorBoardLogger(log_dir) + kwargs['logger'] = L.pytorch.loggers.TensorBoardLogger(log_dir) else: logger.error('`pl_logger` was set, but %s is not an accepted value', pl_logger) raise ValueError(f'{pl_logger} is not acceptable as logger') diff --git a/setup.cfg b/setup.cfg index 4f880f868..5f675f35e 100644 --- a/setup.cfg +++ b/setup.cfg @@ -53,7 +53,7 @@ install_requires = jinja2~=3.0 python-bidi torchvision>=0.5.0 - torch~=2.2.0 + torch~=2.1.0 scikit-learn~=1.2.1 scikit-image~=0.21.0 shapely~=1.8.5 From d72570d3adbadc9e56c9cd7d782e7607012c7b3e Mon Sep 17 00:00:00 2001 From: Benjamin Kiessling Date: Sat, 20 Apr 2024 17:16:26 +0200 Subject: [PATCH 40/76] do not use workers in ketos compile tests --- tests/test_newpolygons.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/test_newpolygons.py b/tests/test_newpolygons.py index 18d7faacd..6eb431727 100644 --- a/tests/test_newpolygons.py +++ b/tests/test_newpolygons.py @@ -380,7 +380,7 @@ def test_ketos_new_arrow(self): mfp2 = str(Path(tempdir) / "model2") self._test_ketoscli( - args=['compile', '-f', 'xml', '-o', dset, self.segmented_img], + args=['compile', '--workers', '0', '-f', 'xml', '-o', dset, self.segmented_img], expect_legacy=False, patching_dir="kraken.lib.arrow_dataset", ) @@ -399,7 +399,7 @@ def test_ketos_new_arrow_force_legacy(self): mfp2 = str(Path(tempdir) / "model2") self._test_ketoscli( - args=['compile', '--legacy-polygons', '-f', 'xml', '-o', dset, self.segmented_img], + args=['compile', '--workers', '0', '--legacy-polygons', '-f', 'xml', '-o', dset, self.segmented_img], expect_legacy=True, patching_dir="kraken.lib.arrow_dataset", ) @@ -428,7 +428,7 @@ def test_ketos_new_arrow_old_model(self): mfp2 = str(Path(tempdir) / "model2") self._test_ketoscli( - args=['compile', '-f', 'xml', '-o', dset, self.segmented_img], + args=['compile', '--workers', '0', '-f', 'xml', '-o', dset, self.segmented_img], expect_legacy=False, patching_dir="kraken.lib.arrow_dataset", ) @@ -445,7 +445,7 @@ def test_ketos_mixed_arrow_train_new(self): mfp = str(Path(tempdir) / "model") self._test_ketoscli( - args=['compile', '-f', 'xml', '-o', dset, self.segmented_img, self.arrow_data], + args=['compile', '--workers', '0', '-f', 'xml', '-o', dset, self.segmented_img, self.arrow_data], expect_legacy=False, patching_dir="kraken.lib.arrow_dataset", ) From 100270292988eee93d385463f81d9c324da1950b Mon Sep 17 00:00:00 2001 From: Benjamin Kiessling Date: Sat, 20 Apr 2024 17:42:58 +0200 Subject: [PATCH 41/76] skip polygon extraction tests that seem to fail randomly --- tests/test_newpolygons.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/tests/test_newpolygons.py b/tests/test_newpolygons.py index 18d7faacd..8b2e3f124 100644 --- a/tests/test_newpolygons.py +++ b/tests/test_newpolygons.py @@ -172,7 +172,6 @@ def test_krakencli_ocr_new_model(self): ) - def test_ketoscli_test_old_model(self): """ Test `ketos test` with old model, check that it uses legacy polygon extraction method @@ -200,7 +199,7 @@ def test_ketoscli_test_new_model(self): expect_legacy=False, ) - + @unittest.skip('fails randomly') def test_ketoscli_train_new_model(self): """ Test `ketos train` with new model, check that it uses new polygon extraction method @@ -220,6 +219,7 @@ def test_ketoscli_train_new_model(self): expect_legacy=False, ) + @unittest.skip('fails randomly') def test_ketoscli_train_new_model_force_legacy(self): """ Test `ketos train` training new model, check that it uses legacy polygon extraction method if forced @@ -239,6 +239,7 @@ def test_ketoscli_train_new_model_force_legacy(self): expect_legacy=True, ) + @unittest.skip('fails randomly') def test_ketoscli_train_old_model(self): """ Test `ketos train` finetuning old model, check that it uses new polygon extraction method @@ -257,6 +258,7 @@ def test_ketoscli_train_old_model(self): expect_legacy=False, ) + @unittest.skip('fails randomly') def test_ketoscli_train_old_model_force_legacy(self): """ Test `ketos train` finetuning old model, check that it uses legacy polygon extraction method if forced @@ -275,7 +277,6 @@ def test_ketoscli_train_old_model_force_legacy(self): expect_legacy=True, ) - @unittest.expectedFailure def test_ketoscli_pretrain_new_model(self): """ @@ -420,7 +421,7 @@ def test_ketos_old_arrow_old_model(self): def test_ketos_new_arrow_old_model(self): """ - Test `ketos train`, on new arrow dataset, check that it raises a warning about polygon extraction method only if incoherent + Test `ketos compile`, on new arrow dataset, check that it raises a warning about polygon extraction method only if incoherent """ with tempfile.TemporaryDirectory() as tempdir: dset = str(Path(tempdir) / "dataset.arrow") @@ -438,7 +439,7 @@ def test_ketos_new_arrow_old_model(self): def test_ketos_mixed_arrow_train_new(self): """ - Test `ketos train`, on mixed arrow dataset, check that it raises a warning about polygon extraction method only if incoherent + Test `ketos compile`, on mixed arrow dataset, check that it raises a warning about polygon extraction method only if incoherent """ with tempfile.TemporaryDirectory() as tempdir: dset = str(Path(tempdir) / "dataset.arrow") From 1c6186adc46f80ddd1a0c5058204eabc0babdc1c Mon Sep 17 00:00:00 2001 From: Benjamin Kiessling Date: Sat, 20 Apr 2024 17:55:33 +0200 Subject: [PATCH 42/76] make sphinx build work without installed kraken --- docs/conf.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index eaf7d1e3b..62c2b92bd 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -3,15 +3,16 @@ # For the full list of built-in configuration values, see the documentation: # https://www.sphinx-doc.org/en/master/usage/configuration.html -import importlib.metadata - # -- Project information ----------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information project = 'kraken' copyright = '2015-2024, Benjamin Kiessling' author = 'Benjamin Kiessling' -release = importlib.metadata.version('kraken') + +from subprocess import Popen, PIPE +pipe = Popen('git describe --tags --always main', stdout=PIPE, shell=True) +release = pipe.stdout.read().decode('utf-8') extensions = [ 'sphinx.ext.autodoc', From adaec33fd69342e1280cec12256ec373aa1f2e11 Mon Sep 17 00:00:00 2001 From: Benjamin Kiessling Date: Sun, 21 Apr 2024 14:18:14 +0200 Subject: [PATCH 43/76] Use ramber-build for building conda packages --- .github/workflows/test.yml | 68 ++++++++++++++++---------------- conda/build.sh | 1 - conda/conda_build_config.yaml | 4 -- conda/{meta.yaml => recipe.yaml} | 28 +++++++++---- 4 files changed, 55 insertions(+), 46 deletions(-) delete mode 100755 conda/build.sh delete mode 100644 conda/conda_build_config.yaml rename conda/{meta.yaml => recipe.yaml} (58%) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 1f35aea43..b9e2df836 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -13,9 +13,9 @@ jobs: python-version: [3.8, 3.9, '3.10', '3.11'] steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v4 + uses: actions/setup-python@v5 with: python-version: ${{ matrix.python-version }} - name: Install dependencies and kraken @@ -39,11 +39,11 @@ jobs: if: startsWith(github.ref, 'refs/tags/') steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: fetch-depth: 0 - name: Set up Python 3.9 - uses: actions/setup-python@v4 + uses: actions/setup-python@v5 with: python-version: 3.9 - name: Build a binary wheel and a source tarball @@ -68,43 +68,43 @@ jobs: if: startsWith(github.ref, 'refs/tags/') steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: fetch-depth: 0 - - uses: conda-incubator/setup-miniconda@v2 + - uses: conda-incubator/setup-miniconda@v3 with: python-version: 3.9 miniforge-variant: Mambaforge - name: install dependencies build shell: bash -l {0} - run: mamba install "conda-build>=3.20" colorama pip ruamel ruamel.yaml rich jsonschema conda-verify anaconda-client mamba + run: mamba install colorama pip ruamel ruamel.yaml rich jsonschema conda-verify anaconda-client # Runs the action with the following inputs or defaults if not specified. - - name: install boa - shell: bash -l {0} - run: pip install https://github.com/mamba-org/boa/archive/refs/tags/0.14.0.zip - - name: validate recipe - shell: bash -l {0} - id: conda_validation - run: | - PACKAGE_PATHS=$(conda mambabuild . --output --check -c conda-forge | tail -n 1) - echo "package_paths=$PACKAGE_PATHS" >> $GITHUB_OUTPUT - - name: run build - shell: bash -l {0} - run: conda mambabuild . -c conda-forge - - name: convert packages - shell: bash -l {0} - run: | - conda convert -p osx-arm64 -p osx-64 -o conda_convert ${{ steps.conda_validation.outputs.package_paths }} - mkdir conda_convert/linux-64 - cp -f ${{ steps.conda_validation.outputs.package_paths }} conda_convert/linux-64 - - name: upload to anaconda - shell: bash -l {0} - run: anaconda -t ${{ secrets.ANACONDA_TOKEN }} upload --no-progress --force conda_convert/*/* + - name: Build linux-64 conda package + uses: prefix-dev/rattler-build-action@v0.2.6 + with: + recipe-path: "conda/recipe.yaml" + build-args: "--experimental --target-platform linux-64" + - name: Build osx-64 conda package + uses: prefix-dev/rattler-build-action@v0.2.6 + with: + recipe-path: "conda/recipe.yaml" + build-args: "--experimental --target-platform osx-64" + - name: Build osx-arm64 conda package + uses: prefix-dev/rattler-build-action@v0.2.6 + with: + recipe-path: "conda/recipe.yaml" + build-args: "--experimental --target-platform osx-arm64" + - name: Upload conda package + - run: | + for pkg in $(find output -type f \( -name "*.conda" -o -name "*.tar.bz2" \) ); do + echo "Uploading ${pkg}" + rattler-build upload anaconda -o mittagessen -a ${{ secrets.ANACONDA_TOKEN }} "${pkg}" + done - name: Upload conda artifacts to GH storage - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: conda_packages - path: conda_convert/*/*.tar.bz2 + path: output/*/*.conda autodraft-gh-release: name: Create github release @@ -112,11 +112,11 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/download-artifact@v3 + - uses: actions/download-artifact@v4 with: name: conda_packages path: conda - - uses: actions/download-artifact@v3 + - uses: actions/download-artifact@v4 with: name: pypi_packages path: pypi @@ -138,11 +138,11 @@ jobs: startsWith(github.ref, 'refs/tags/') steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: fetch-depth: 0 - name: Set up Python 3.9 - uses: actions/setup-python@v4 + uses: actions/setup-python@v5 with: python-version: 3.9 - name: Install sphinx-multiversion diff --git a/conda/build.sh b/conda/build.sh deleted file mode 100755 index 07d551f99..000000000 --- a/conda/build.sh +++ /dev/null @@ -1 +0,0 @@ -pip install --no-deps . diff --git a/conda/conda_build_config.yaml b/conda/conda_build_config.yaml deleted file mode 100644 index d0d6407a9..000000000 --- a/conda/conda_build_config.yaml +++ /dev/null @@ -1,4 +0,0 @@ -python: - - 3.9 - - '3.10' - - '3.11' diff --git a/conda/meta.yaml b/conda/recipe.yaml similarity index 58% rename from conda/meta.yaml rename to conda/recipe.yaml index 1620e62cc..18128d46d 100644 --- a/conda/meta.yaml +++ b/conda/recipe.yaml @@ -1,16 +1,27 @@ +context: + git_url: . + git_tag: ${{ git.latest_tag(git_url) }} + package: name: kraken - version: {{ GIT_DESCRIBE_TAG }} + version: ${{ git_tag }} source: - git_url: .. + git: ${{ git_url }} + tag: ${{ git_tag }} + +build: + script: pip install --no-deps . requirements: build: - - python - - setuptools - - pbr + - python>=3.8,<3.12 + - setuptools + - pbr + host: + - python>=3.8,<3.12 run: + - python>=3.8,<3.12 - python-bidi - lxml - regex @@ -35,7 +46,10 @@ requirements: - conda-forge::threadpoolctl~=3.4.0 - albumentations - rich + about: - home: https://kraken.re - license: APACHE + homepage: https://kraken.re + license: Apache-2.0 summary: 'OCR/HTR engine for all the languages' + repository: https://github.com/mittagessen/kraken + documentation: https://kraken.re From a47895973d38e78ded713b7db7aa7cbd86238020 Mon Sep 17 00:00:00 2001 From: Benjamin Kiessling Date: Sun, 21 Apr 2024 14:22:13 +0200 Subject: [PATCH 44/76] workflow auto-release file collection fix --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index b9e2df836..d75a4bfd0 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -126,7 +126,7 @@ jobs: prerelease: false draft: true files: | - conda/*/*.tar.bz2 + output/*/*.conda pypi/* publish-gh-pages: From bdc0189798caf790f5d7462c1c542f224e7864fd Mon Sep 17 00:00:00 2001 From: Benjamin Kiessling Date: Sun, 21 Apr 2024 14:25:13 +0200 Subject: [PATCH 45/76] try to find syntax error in yml --- .github/workflows/test.yml | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index d75a4bfd0..58f75adfa 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -79,21 +79,21 @@ jobs: shell: bash -l {0} run: mamba install colorama pip ruamel ruamel.yaml rich jsonschema conda-verify anaconda-client # Runs the action with the following inputs or defaults if not specified. - - name: Build linux-64 conda package - uses: prefix-dev/rattler-build-action@v0.2.6 - with: - recipe-path: "conda/recipe.yaml" - build-args: "--experimental --target-platform linux-64" - - name: Build osx-64 conda package - uses: prefix-dev/rattler-build-action@v0.2.6 - with: - recipe-path: "conda/recipe.yaml" - build-args: "--experimental --target-platform osx-64" - - name: Build osx-arm64 conda package - uses: prefix-dev/rattler-build-action@v0.2.6 - with: - recipe-path: "conda/recipe.yaml" - build-args: "--experimental --target-platform osx-arm64" + # - name: Build linux-64 conda package + # uses: prefix-dev/rattler-build-action@v0.2.6 + # with: + # recipe-path: "conda/recipe.yaml" + # build-args: "--experimental --target-platform linux-64" + # - name: Build osx-64 conda package + # uses: prefix-dev/rattler-build-action@v0.2.6 + # with: + # recipe-path: "conda/recipe.yaml" + # build-args: "--experimental --target-platform osx-64" + # - name: Build osx-arm64 conda package + # uses: prefix-dev/rattler-build-action@v0.2.6 + # with: + # recipe-path: "conda/recipe.yaml" + # build-args: "--experimental --target-platform osx-arm64" - name: Upload conda package - run: | for pkg in $(find output -type f \( -name "*.conda" -o -name "*.tar.bz2" \) ); do From 4bdd9031910779b6db80e288b91d19e65b5ca340 Mon Sep 17 00:00:00 2001 From: Benjamin Kiessling Date: Sun, 21 Apr 2024 14:27:11 +0200 Subject: [PATCH 46/76] hope that's it --- .github/workflows/test.yml | 33 ++++++++++++++++----------------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 58f75adfa..955da228d 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -78,24 +78,23 @@ jobs: - name: install dependencies build shell: bash -l {0} run: mamba install colorama pip ruamel ruamel.yaml rich jsonschema conda-verify anaconda-client - # Runs the action with the following inputs or defaults if not specified. - # - name: Build linux-64 conda package - # uses: prefix-dev/rattler-build-action@v0.2.6 - # with: - # recipe-path: "conda/recipe.yaml" - # build-args: "--experimental --target-platform linux-64" - # - name: Build osx-64 conda package - # uses: prefix-dev/rattler-build-action@v0.2.6 - # with: - # recipe-path: "conda/recipe.yaml" - # build-args: "--experimental --target-platform osx-64" - # - name: Build osx-arm64 conda package - # uses: prefix-dev/rattler-build-action@v0.2.6 - # with: - # recipe-path: "conda/recipe.yaml" - # build-args: "--experimental --target-platform osx-arm64" + - name: Build linux-64 conda package + uses: prefix-dev/rattler-build-action@v0.2.6 + with: + recipe-path: "conda/recipe.yaml" + build-args: "--experimental --target-platform linux-64" + - name: Build osx-64 conda package + uses: prefix-dev/rattler-build-action@v0.2.6 + with: + recipe-path: "conda/recipe.yaml" + build-args: "--experimental --target-platform osx-64" + - name: Build osx-arm64 conda package + uses: prefix-dev/rattler-build-action@v0.2.6 + with: + recipe-path: "conda/recipe.yaml" + build-args: "--experimental --target-platform osx-arm64" - name: Upload conda package - - run: | + run: | for pkg in $(find output -type f \( -name "*.conda" -o -name "*.tar.bz2" \) ); do echo "Uploading ${pkg}" rattler-build upload anaconda -o mittagessen -a ${{ secrets.ANACONDA_TOKEN }} "${pkg}" From e56082e76ee7f8f001bce72db5c7c3f8f604bf99 Mon Sep 17 00:00:00 2001 From: Benjamin Kiessling Date: Sun, 21 Apr 2024 14:38:36 +0200 Subject: [PATCH 47/76] disable osx-arm64 builds rattler-build throws some errors for cross builds --- .github/workflows/test.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 955da228d..19280b8c2 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -88,11 +88,11 @@ jobs: with: recipe-path: "conda/recipe.yaml" build-args: "--experimental --target-platform osx-64" - - name: Build osx-arm64 conda package - uses: prefix-dev/rattler-build-action@v0.2.6 - with: - recipe-path: "conda/recipe.yaml" - build-args: "--experimental --target-platform osx-arm64" +# - name: Build osx-arm64 conda package +# uses: prefix-dev/rattler-build-action@v0.2.6 +# with: +# recipe-path: "conda/recipe.yaml" +# build-args: "--experimental --target-platform osx-arm64" - name: Upload conda package run: | for pkg in $(find output -type f \( -name "*.conda" -o -name "*.tar.bz2" \) ); do From 3ed652699b0a0c84fc358ea3ec5a12724f58b12e Mon Sep 17 00:00:00 2001 From: Benjamin Kiessling Date: Sun, 21 Apr 2024 14:50:16 +0200 Subject: [PATCH 48/76] update ghaction-github-pages --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 19280b8c2..82e0fd7f6 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -151,7 +151,7 @@ jobs: - name: Create redirect run: cp docs/redirect.html build/html/index.html - name: Push gh-pages - uses: crazy-max/ghaction-github-pages@v3 + uses: crazy-max/ghaction-github-pages@v4 with: target_branch: gh-pages build_dir: build/html From aca1779d8045f73419e73c577571a5439ecdbfa2 Mon Sep 17 00:00:00 2001 From: Benjamin Kiessling Date: Mon, 22 Apr 2024 12:20:10 +0200 Subject: [PATCH 49/76] Fix for progress bar crash with lightning 2.2 Fixes one part of #592 --- kraken/lib/progress.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/kraken/lib/progress.py b/kraken/lib/progress.py index 1ba65a258..4c6052944 100644 --- a/kraken/lib/progress.py +++ b/kraken/lib/progress.py @@ -110,7 +110,10 @@ def _init_progress(self, trainer): reconfigure(**self._console_kwargs) self._console = get_console() self._console.clear_live() - self._metric_component = MetricsTextColumn(trainer, self.theme.metrics) + self._metric_component = MetricsTextColumn(trainer, + self.theme.metrics, + self.theme.metrics_text_delimiter, + self.theme.metrics_format) columns = self.configure_columns(trainer) columns.append(self._metric_component) @@ -158,3 +161,5 @@ class RichProgressBarTheme: time: Union[str, 'Style'] = DEFAULT_STYLES['progress.elapsed'] processing_speed: Union[str, 'Style'] = DEFAULT_STYLES['progress.data.speed'] metrics: Union[str, 'Style'] = DEFAULT_STYLES['progress.description'] + metrics_text_delimiter: str = ' ' + metrics_format: str = '.3f' From 3982aee5fdee812022f062bef47cd0261fb411c3 Mon Sep 17 00:00:00 2001 From: Benjamin Kiessling Date: Mon, 22 Apr 2024 15:26:46 +0200 Subject: [PATCH 50/76] Improved dict-style region detection in Segmentation Current test would crash if the first type in region dictionary would not contain any regions. Fixes #592 --- kraken/containers.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/kraken/containers.py b/kraken/containers.py index 81aad2930..1a5be2230 100644 --- a/kraken/containers.py +++ b/kraken/containers.py @@ -194,11 +194,14 @@ def __post_init__(self): if len(self.lines) and not isinstance(self.lines[0], BBoxLine) and not isinstance(self.lines[0], BaselineLine): line_cls = BBoxLine if self.type == 'bbox' else BaselineLine self.lines = [line_cls(**line) for line in self.lines] - if len(self.regions) and not isinstance(next(iter(self.regions.values()))[0], Region): - regs = {} - for k, v in self.regions.items(): - regs[k] = [Region(**reg) for reg in v] - self.regions = regs + if len(self.regions): + for regs in self.regions.values(): + if regs and not isinstance(regs[0], Region): + regs = {} + for k, v in self.regions.items(): + regs[k] = [Region(**reg) for reg in v] + self.regions = regs + break class ocr_record(ABC): From a3e22c1581842bcd37cc5a7585b686477933f12f Mon Sep 17 00:00:00 2001 From: Benjamin Kiessling Date: Mon, 22 Apr 2024 17:26:52 +0200 Subject: [PATCH 51/76] Add WER calculation to `ketos test` report Fixes #559 --- kraken/ketos/pretrain.py | 12 +------ kraken/ketos/recognition.py | 61 +++++++++++++++++------------------- kraken/lib/pretrain/model.py | 7 ----- kraken/lib/train.py | 7 ----- kraken/serialization.py | 5 ++- kraken/templates/report | 3 +- 6 files changed, 36 insertions(+), 59 deletions(-) diff --git a/kraken/ketos/pretrain.py b/kraken/ketos/pretrain.py index 841d39191..89fdd92c2 100644 --- a/kraken/ketos/pretrain.py +++ b/kraken/ketos/pretrain.py @@ -141,15 +141,6 @@ @click.option('--threads', show_default=True, default=1, type=click.IntRange(1), help='Maximum size of OpenMP/BLAS thread pool.') @click.option('--load-hyper-parameters/--no-load-hyper-parameters', show_default=True, default=False, help='When loading an existing model, retrieve hyperparameters from the model') -@click.option('--repolygonize/--no-repolygonize', show_default=True, - default=False, help='Repolygonizes line data in ALTO/PageXML ' - 'files. This ensures that the trained model is compatible with the ' - 'segmenter in kraken even if the original image files either do ' - 'not contain anything but transcriptions and baseline information ' - 'or the polygon data was created using a different method. Will ' - 'be ignored in `path` mode. Note that this option will be slow ' - 'and will not scale input images to the same size as the segmenter ' - 'does.') @click.option('--force-binarization/--no-binarization', show_default=True, default=False, help='Forces input images to be binary, otherwise ' 'the appropriate color format will be auto-determined through the ' @@ -188,7 +179,7 @@ def pretrain(ctx, batch_size, pad, output, spec, load, freq, quit, epochs, min_epochs, lag, min_delta, device, precision, optimizer, lrate, momentum, weight_decay, warmup, schedule, gamma, step_size, sched_patience, cos_max, cos_min_lr, partition, fixed_splits, training_files, - evaluation_files, workers, threads, load_hyper_parameters, repolygonize, + evaluation_files, workers, threads, load_hyper_parameters, force_binarization, format_type, augment, mask_probability, mask_width, num_negatives, logit_temp, ground_truth, legacy_polygons): @@ -278,7 +269,6 @@ def pretrain(ctx, batch_size, pad, output, spec, load, freq, quit, epochs, height=model.height, width=model.width, channels=model.channels, - repolygonize=repolygonize, force_binarization=force_binarization, format_type=format_type, legacy_polygons=legacy_polygons,) diff --git a/kraken/ketos/recognition.py b/kraken/ketos/recognition.py index e4e0b76ea..1296135c8 100644 --- a/kraken/ketos/recognition.py +++ b/kraken/ketos/recognition.py @@ -167,15 +167,6 @@ @click.option('--threads', show_default=True, default=1, type=click.IntRange(1), help='Maximum size of OpenMP/BLAS thread pool.') @click.option('--load-hyper-parameters/--no-load-hyper-parameters', show_default=True, default=False, help='When loading an existing model, retrieve hyperparameters from the model') -@click.option('--repolygonize/--no-repolygonize', show_default=True, - default=False, help='Repolygonizes line data in ALTO/PageXML ' - 'files. This ensures that the trained model is compatible with the ' - 'segmenter in kraken even if the original image files either do ' - 'not contain anything but transcriptions and baseline information ' - 'or the polygon data was created using a different method. Will ' - 'be ignored in `path` mode. Note that this option will be slow ' - 'and will not scale input images to the same size as the segmenter ' - 'does.') @click.option('--force-binarization/--no-binarization', show_default=True, default=False, help='Forces input images to be binary, otherwise ' 'the appropriate color format will be auto-determined through the ' @@ -203,7 +194,7 @@ def train(ctx, batch_size, pad, output, spec, append, load, freq, quit, epochs, step_size, sched_patience, cos_max, cos_min_lr, partition, fixed_splits, normalization, normalize_whitespace, codec, resize, reorder, base_dir, training_files, evaluation_files, workers, - threads, load_hyper_parameters, repolygonize, force_binarization, + threads, load_hyper_parameters, force_binarization, format_type, augment, pl_logger, log_dir, ground_truth, legacy_polygons): """ @@ -305,7 +296,6 @@ def train(ctx, batch_size, pad, output, spec, append, load, freq, quit, epochs, binary_dataset_split=fixed_splits, num_workers=workers, load_hyper_parameters=load_hyper_parameters, - repolygonize=repolygonize, force_binarization=force_binarization, format_type=format_type, codec=codec, @@ -385,15 +375,6 @@ def train(ctx, batch_size, pad, output, spec, append, load, freq, quit, epochs, default=None, help='Ground truth normalization') @click.option('-n', '--normalize-whitespace/--no-normalize-whitespace', show_default=True, default=True, help='Normalizes unicode whitespace') -@click.option('--repolygonize/--no-repolygonize', show_default=True, - default=False, help='Repolygonizes line data in ALTO/PageXML ' - 'files. This ensures that the trained model is compatible with the ' - 'segmenter in kraken even if the original image files either do ' - 'not contain anything but transcriptions and baseline information ' - 'or the polygon data was created using a different method. Will ' - 'be ignored in `path` mode. Note, that this option will be slow ' - 'and will not scale input images to the same size as the segmenter ' - 'does.') @click.option('--force-binarization/--no-binarization', show_default=True, default=False, help='Forces input images to be binary, otherwise ' 'the appropriate color format will be auto-determined through the ' @@ -411,7 +392,7 @@ def train(ctx, batch_size, pad, output, spec, append, load, freq, quit, epochs, @click.option('--no-legacy-polygons', show_default=True, default=False, is_flag=True, help='Force disable the legacy polygon extractor.') def test(ctx, batch_size, model, evaluation_files, device, pad, workers, threads, reorder, base_dir, normalization, normalize_whitespace, - repolygonize, force_binarization, format_type, fixed_splits, test_set, no_legacy_polygons): + force_binarization, format_type, fixed_splits, test_set, no_legacy_polygons): """ Evaluate on a test set. """ @@ -421,6 +402,8 @@ def test(ctx, batch_size, model, evaluation_files, device, pad, workers, import numpy as np from torch.utils.data import DataLoader + from torchmetrics.text import CharErrorRate, WordErrorRate + from kraken.lib import models, util from kraken.lib.dataset import (ArrowIPCRecognitionDataset, GroundTruthDataset, ImageInputTransforms, @@ -475,15 +458,11 @@ def test(ctx, batch_size, model, evaluation_files, device, pad, workers, dataset_kwargs["split_filter"] = "test" if format_type in ['xml', 'page', 'alto']: - if repolygonize: - message('Repolygonizing data') test_set = [{'page': XMLPage(file, filetype=format_type).to_container()} for file in test_set] valid_norm = False DatasetClass = partial(PolygonGTDataset, legacy_polygons=legacy_polygons) elif format_type == 'binary': DatasetClass = ArrowIPCRecognitionDataset - if repolygonize: - logger.warning('Repolygonization enabled in `binary` mode. Will be ignored.') test_set = [{'file': file} for file in test_set] valid_norm = False else: @@ -491,8 +470,6 @@ def test(ctx, batch_size, model, evaluation_files, device, pad, workers, if force_binarization: logger.warning('Forced binarization enabled in `path` mode. Will be ignored.') force_binarization = False - if repolygonize: - logger.warning('Repolygonization enabled in `path` mode. Will be ignored.') test_set = [{'line': util.parse_gt_path(img)} for img in test_set] valid_norm = True @@ -502,7 +479,8 @@ def test(ctx, batch_size, model, evaluation_files, device, pad, workers, if reorder and base_dir != 'auto': reorder = base_dir - acc_list = [] + cer_list = [] + wer_list = [] with threadpool_limits(limits=threads): for p, net in nn.items(): @@ -539,6 +517,9 @@ def test(ctx, batch_size, model, evaluation_files, device, pad, workers, pin_memory=pin_ds_mem, collate_fn=collate_sequences) + test_cer = CharErrorRate() + test_wer = WordErrorRate() + with KrakenProgressBar() as progress: batches = len(ds_loader) pred_task = progress.add_task('Evaluating', total=batches, visible=True if not ctx.meta['verbose'] else False) @@ -555,6 +536,9 @@ def test(ctx, batch_size, model, evaluation_files, device, pad, workers, algn_gt.extend(algn1) algn_pred.extend(algn2) error += c + test_cer.update(x, y) + test_wer.update(x, y) + except FileNotFoundError as e: batches -= 1 progress.update(pred_task, total=batches) @@ -565,10 +549,23 @@ def test(ctx, batch_size, model, evaluation_files, device, pad, workers, logger.warning(str(e)) progress.update(pred_task, advance=1) - acc_list.append((chars - error) / chars) + cer_list.append(1.0 - test_cer.compute()) + wer_list.append(1.0 - test_wer.compute()) confusions, scripts, ins, dels, subs = compute_confusions(algn_gt, algn_pred) - rep = render_report(p, chars, error, confusions, scripts, ins, dels, subs) + rep = render_report(p, + chars, + error, + cer_list[-1], + wer_list[-1], + confusions, + scripts, + ins, + dels, + subs) logger.info(rep) message(rep) - logger.info('Average accuracy: {:0.2f}%, (stddev: {:0.2f})'.format(np.mean(acc_list) * 100, np.std(acc_list) * 100)) - message('Average accuracy: {:0.2f}%, (stddev: {:0.2f})'.format(np.mean(acc_list) * 100, np.std(acc_list) * 100)) + + logger.info('Average character accuracy: {:0.2f}%, (stddev: {:0.2f})'.format(np.mean(cer_list) * 100, np.std(cer_list) * 100)) + message('Average character accuracy: {:0.2f}%, (stddev: {:0.2f})'.format(np.mean(cer_list) * 100, np.std(cer_list) * 100)) + logger.info('Average word accuracy: {:0.2f}%, (stddev: {:0.2f})'.format(np.mean(wer_list) * 100, np.std(wer_list) * 100)) + message('Average word accuracy: {:0.2f}%, (stddev: {:0.2f})'.format(np.mean(wer_list) * 100, np.std(wer_list) * 100)) diff --git a/kraken/lib/pretrain/model.py b/kraken/lib/pretrain/model.py index cd1d12e32..eb0d3cc57 100644 --- a/kraken/lib/pretrain/model.py +++ b/kraken/lib/pretrain/model.py @@ -84,7 +84,6 @@ def __init__(self, width: int = 0, channels: int = 1, num_workers: int = 1, - repolygonize: bool = False, force_binarization: bool = False, format_type: str = 'path', pad: int = 16, @@ -125,8 +124,6 @@ def __init__(self, valid_norm = False elif format_type == 'binary': DatasetClass = ArrowIPCRecognitionDataset - if repolygonize: - logger.warning('Repolygonization enabled in `binary` mode. Will be ignored.') valid_norm = False logger.info(f'Got {len(training_data)} binary dataset files for training data') training_data = [{'file': file} for file in training_data] @@ -137,8 +134,6 @@ def __init__(self, if force_binarization: logger.warning('Forced binarization enabled in `path` mode. Will be ignored.') force_binarization = False - if repolygonize: - logger.warning('Repolygonization enabled in `path` mode. Will be ignored.') if binary_dataset_split: logger.warning('Internal binary dataset splits are enabled but using non-binary dataset files. Will be ignored.') binary_dataset_split = False @@ -157,8 +152,6 @@ def __init__(self, if force_binarization: logger.warning('Forced binarization enabled with box lines. Will be ignored.') force_binarization = False - if repolygonize: - logger.warning('Repolygonization enabled with box lines. Will be ignored.') if binary_dataset_split: logger.warning('Internal binary dataset splits are enabled but using non-binary dataset files. Will be ignored.') binary_dataset_split = False diff --git a/kraken/lib/train.py b/kraken/lib/train.py index ec9685aff..0a8bc7665 100644 --- a/kraken/lib/train.py +++ b/kraken/lib/train.py @@ -213,7 +213,6 @@ def __init__(self, binary_dataset_split: bool = False, num_workers: int = 1, load_hyper_parameters: bool = False, - repolygonize: bool = False, force_binarization: bool = False, format_type: Literal['path', 'alto', 'page', 'xml', 'binary'] = 'path', codec: Optional[Dict] = None, @@ -291,8 +290,6 @@ def __init__(self, valid_norm = False elif format_type == 'binary': DatasetClass = ArrowIPCRecognitionDataset - if repolygonize: - logger.warning('Repolygonization enabled in `binary` mode. Will be ignored.') valid_norm = False logger.info(f'Got {len(training_data)} binary dataset files for training data') training_data = [{'file': file} for file in training_data] @@ -303,8 +300,6 @@ def __init__(self, if force_binarization: logger.warning('Forced binarization enabled in `path` mode. Will be ignored.') force_binarization = False - if repolygonize: - logger.warning('Repolygonization enabled in `path` mode. Will be ignored.') if binary_dataset_split: logger.warning('Internal binary dataset splits are enabled but using non-binary dataset files. Will be ignored.') binary_dataset_split = False @@ -323,8 +318,6 @@ def __init__(self, if force_binarization: logger.warning('Forced binarization enabled with box lines. Will be ignored.') force_binarization = False - if repolygonize: - logger.warning('Repolygonization enabled with box lines. Will be ignored.') if binary_dataset_split: logger.warning('Internal binary dataset splits are enabled but using non-binary dataset files. Will be ignored.') binary_dataset_split = False diff --git a/kraken/serialization.py b/kraken/serialization.py index b1e7ab9e8..f4fd4432d 100644 --- a/kraken/serialization.py +++ b/kraken/serialization.py @@ -247,6 +247,8 @@ def _load_template(name): def render_report(model: str, chars: int, errors: int, + char_accuracy: float, + word_accuracy: float, char_confusions: 'Counter', scripts: 'Counter', insertions: 'Counter', @@ -275,7 +277,8 @@ def render_report(model: str, report = {'model': model, 'chars': chars, 'errors': errors, - 'accuracy': (chars-errors)/chars * 100, + 'character_accuracy': char_accuracy * 100, + 'word_accuracy': word_accuracy * 100, 'insertions': sum(insertions.values()), 'deletions': deletions, 'substitutions': sum(substitutions.values()), diff --git a/kraken/templates/report b/kraken/templates/report index 264b8b6aa..abd81fbb2 100644 --- a/kraken/templates/report +++ b/kraken/templates/report @@ -2,7 +2,8 @@ {{ report.chars }} Characters {{ report.errors }} Errors -{{ '%0.2f'| format(report.accuracy) }}% Accuracy +{{ '%0.2f'| format(report.character_accuracy) }}% Character Accuracy +{{ '%0.2f'| format(report.word_accuracy) }}% Word Accuracy {{ report.insertions }} Insertions {{ report.deletions }} Deletions From 3a8aba1c330d8df406ae4d921565dec43d590065 Mon Sep 17 00:00:00 2001 From: Benjamin Kiessling Date: Tue, 23 Apr 2024 15:50:47 +0200 Subject: [PATCH 52/76] forced_alignment_overlay.py regression in 5.x Didn't actually call to_container() method. --- kraken/contrib/forced_alignment_overlay.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kraken/contrib/forced_alignment_overlay.py b/kraken/contrib/forced_alignment_overlay.py index 2610d84c4..7752a7c3c 100755 --- a/kraken/contrib/forced_alignment_overlay.py +++ b/kraken/contrib/forced_alignment_overlay.py @@ -117,7 +117,7 @@ def cli(format_type, model, normalization, output, files): click.echo(f'Processing {doc} ', nl=False) data = XMLPage(doc) im = Image.open(data.imagename).convert('RGBA') - result = align.forced_align(data.to_container, net) + result = align.forced_align(data.to_container(), net) if normalization: for line in data._lines: line["text"] = normalize(normalization, line["text"]) From 786fcb9e139326200ae50b5be3730ddddc5b1bf9 Mon Sep 17 00:00:00 2001 From: Benjamin Kiessling Date: Wed, 24 Apr 2024 16:23:19 +0200 Subject: [PATCH 53/76] compatibility forced_align_overlay.py XML output with container classes --- kraken/contrib/forced_alignment_overlay.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/kraken/contrib/forced_alignment_overlay.py b/kraken/contrib/forced_alignment_overlay.py index 7752a7c3c..23bae3fd2 100755 --- a/kraken/contrib/forced_alignment_overlay.py +++ b/kraken/contrib/forced_alignment_overlay.py @@ -50,7 +50,9 @@ def _repl_alto(fname, cuts): for chld in el: if chld.tag.endswith('Glyph'): el.remove(chld) - for char in line_cuts[idx:str_len]: + for char in zip(line_cuts.prediction[idx:str_len], + line_cuts.cuts[idx:str_len], + line_cuts.confidences[idx:str_len]): glyph = etree.SubElement(el, 'Glyph') glyph.set('ID', f'char_{char_idx}') char_idx += 1 From 96e10433c445208b32f84f5a1b298232725a3552 Mon Sep 17 00:00:00 2001 From: Benjamin Kiessling Date: Sun, 28 Apr 2024 23:50:41 +0200 Subject: [PATCH 54/76] Add warning about fixed splits in `ketos train`/`ketos test` --- docs/ketos.rst | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/docs/ketos.rst b/docs/ketos.rst index b2b2b00e8..e97bccd57 100644 --- a/docs/ketos.rst +++ b/docs/ketos.rst @@ -26,6 +26,7 @@ Recognition model training * The default architecture works well for decently sized datasets. * Use precompiled binary datasets and put them in a place where they can be memory mapped during training (local storage, not NFS or similar). +* Fixed splits in precompiled datasets increase memory use and slow down startup as the dataset needs to be loaded once into the dataset. It is recommended to create explicit splits by compiling source XML files into separate datasets. * Use the ``--logger`` flag to track your training metrics across experiments using Tensorboard. * If the network doesn't converge before the early stopping aborts training, increase ``--min-epochs`` or ``--lag``. Use the ``--logger`` option to inspect your training loss. * Use the flag ``--augment`` to activate data augmentation. @@ -127,11 +128,20 @@ compile time: $ ketos compile --random-split 0.8 0.1 0.1 ... + The above line splits assigns 80% of the source lines to the training set, 10% to the validation set, and 10% to the test set. The training and validation sets in the dataset file are used automatically by `ketos train` (unless told otherwise) while the remaining 10% of the test set is selected by `ketos test`. +.. warning: + + Fixed splits in datasets are ignored during training and testing per + default as they require loading the entire dataset into main memory at + once, drastically increasing memory consumption and causing initial delays. + Use the `--fixed-splits` option in `ketos train` and `ketos test` to + respect fixed splints. + Recognition training -------------------- From 4a1e41de8819e3d89f173c176708432e0904f4c8 Mon Sep 17 00:00:00 2001 From: Benjamin Kiessling Date: Mon, 29 Apr 2024 01:28:21 +0200 Subject: [PATCH 55/76] correct warning syntax --- docs/advanced.rst | 2 +- docs/ketos.rst | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/docs/advanced.rst b/docs/advanced.rst index 533e1280f..93822e472 100644 --- a/docs/advanced.rst +++ b/docs/advanced.rst @@ -266,7 +266,7 @@ an additional option. Valid options consist of two parts, an initial principal line orientation (`horizontal` or `vertical`) followed by a block order (`lr` for left-to-right or `rl` for right-to-left). -.. warning: +.. warning:: The principal text direction is independent of the direction of the *inline text direction* (which is left-to-right for writing systems like diff --git a/docs/ketos.rst b/docs/ketos.rst index e97bccd57..47394e6e0 100644 --- a/docs/ketos.rst +++ b/docs/ketos.rst @@ -134,8 +134,7 @@ to the validation set, and 10% to the test set. The training and validation sets in the dataset file are used automatically by `ketos train` (unless told otherwise) while the remaining 10% of the test set is selected by `ketos test`. -.. warning: - +.. warning:: Fixed splits in datasets are ignored during training and testing per default as they require loading the entire dataset into main memory at once, drastically increasing memory consumption and causing initial delays. From a6eb904becae56efa23d404b923a8961224f2f27 Mon Sep 17 00:00:00 2001 From: Benjamin Kiessling Date: Mon, 29 Apr 2024 01:58:54 +0200 Subject: [PATCH 56/76] s/splints/splits --- docs/ketos.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/ketos.rst b/docs/ketos.rst index 47394e6e0..11f4d2a90 100644 --- a/docs/ketos.rst +++ b/docs/ketos.rst @@ -138,8 +138,8 @@ otherwise) while the remaining 10% of the test set is selected by `ketos test`. Fixed splits in datasets are ignored during training and testing per default as they require loading the entire dataset into main memory at once, drastically increasing memory consumption and causing initial delays. - Use the `--fixed-splits` option in `ketos train` and `ketos test` to - respect fixed splints. + Use the `\-\-fixed-splits` option in `ketos train` and `ketos test` to + respect fixed splits. Recognition training -------------------- From c621747abf15e5238f70eafdbe63e9827081b82d Mon Sep 17 00:00:00 2001 From: Benjamin Kiessling Date: Tue, 30 Apr 2024 02:15:35 +0200 Subject: [PATCH 57/76] no_segmentation mode fix --- kraken/kraken.py | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/kraken/kraken.py b/kraken/kraken.py index ee94da490..22429d05d 100644 --- a/kraken/kraken.py +++ b/kraken/kraken.py @@ -214,8 +214,10 @@ def recognizer(model, pad, no_segmentation, bidi_reordering, tags_ignore, input, if no_segmentation: bounds = Segmentation(type='bbox', text_direction='horizontal-lr', - lines=[BBoxLine(id=uuid.uuid4(), - bbox=((0, 0), (0, im.size[1]), im.size, (im.size[0], 0)))]) + imagename=ctx.meta['base_image'], + script_detection=False, + lines=[BBoxLine(id=str(uuid.uuid4()), + bbox=(0, 0, im.size[1], im.size[0]))]) else: raise click.UsageError('No line segmentation given. Add one with the input or run `segment` first.') elif no_segmentation: @@ -404,7 +406,7 @@ def process_pipeline(subcommands, input, batch_input, suffix, verbose, format_ty progress.update(pdf_parse_task, total=num_pages) logger.warning(f'{fpath} is not a PDF file. Skipping.') input = new_input - ctx.meta['steps'].insert(0, ProcessingStep(id=uuid.uuid4(), + ctx.meta['steps'].insert(0, ProcessingStep(id=str(uuid.uuid4()), category='preprocessing', description='PDF image extraction', settings={})) @@ -454,7 +456,7 @@ def binarize(ctx, threshold, zoom, escale, border, perc, range, low, high): """ from kraken.containers import ProcessingStep - ctx.meta['steps'].append(ProcessingStep(id=uuid.uuid4(), + ctx.meta['steps'].append(ProcessingStep(id=str(uuid.uuid4()), category='preprocessing', description='Image binarization', settings={'threshold': threshold, @@ -506,7 +508,7 @@ def segment(ctx, model, boxes, text_direction, scale, maxcolseps, if boxes is False: if not model: model = SEGMENTATION_DEFAULT_MODEL - ctx.meta['steps'].append(ProcessingStep(id=uuid.uuid4(), + ctx.meta['steps'].append(ProcessingStep(id=str(uuid.uuid4()), category='processing', description='Baseline and region segmentation', settings={'model': os.path.basename(model), @@ -536,7 +538,7 @@ def segment(ctx, model, boxes, text_direction, scale, maxcolseps, message('\u2713', fg='green') else: - ctx.meta['steps'].append(ProcessingStep(id=uuid.uuid4(), + ctx.meta['steps'].append(ProcessingStep(id=str(uuid.uuid4()), category='processing', description='bounding box segmentation', settings={'text_direction': text_direction, @@ -648,7 +650,7 @@ def ocr(ctx, model, pad, reorder, base_dir, no_segmentation, text_direction): nn.update(nm) nm = nn - ctx.meta['steps'].append(ProcessingStep(id=uuid.uuid4(), + ctx.meta['steps'].append(ProcessingStep(id=str(uuid.uuid4()), category='processing', description='Text line recognition', settings={'text_direction': text_direction, From ffe6de3343bab47f375c2539fbf8a733e7eb8d56 Mon Sep 17 00:00:00 2001 From: Benjamin Kiessling Date: Tue, 30 Apr 2024 12:33:20 +0200 Subject: [PATCH 58/76] Do not log validation worker seed initialization --- kraken/lib/train.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/kraken/lib/train.py b/kraken/lib/train.py index 0a8bc7665..f4cb3135a 100644 --- a/kraken/lib/train.py +++ b/kraken/lib/train.py @@ -67,10 +67,7 @@ def _validation_worker_init_fn(worker_id): for lightning because otherwise it will display a message at info level about the seed being changed. """ from lightning.pytorch import seed_everything - level = logging.getLogger("lightning_fabric.utilities.seed").level - logging.getLogger("lightning_fabric.utilities.seed").setLevel(logging.WARN) seed_everything(42) - logging.getLogger("lightning_fabric.utilities.seed").setLevel(level) class KrakenTrainer(L.Trainer): From a7910be34c6353e08d5d15746cc5b781a8282d43 Mon Sep 17 00:00:00 2001 From: Arch-W Date: Wed, 1 May 2024 11:21:43 +0100 Subject: [PATCH 59/76] Fixed hyperparameters batch_size check for logging to TensorBoard. --- kraken/lib/train.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/kraken/lib/train.py b/kraken/lib/train.py index f4cb3135a..9a406a969 100644 --- a/kraken/lib/train.py +++ b/kraken/lib/train.py @@ -502,9 +502,9 @@ def validation_step(self, batch, batch_idx): self.val_cer.update(pred, decoded_targets) self.val_wer.update(pred, decoded_targets) - if self.logger and self.trainer.state.stage != 'sanity_check' and self.hparams.batch_size * batch_idx < 16: - for i in range(self.hparams.batch_size): - count = self.hparams.batch_size * batch_idx + i + if self.logger and self.trainer.state.stage != 'sanity_check' and self.hparams.hyper_params["batch_size"] * batch_idx < 16: + for i in range(self.hparams.hyper_params["batch_size"]): + count = self.hparams.hyper_params["batch_size"] * batch_idx + i if count < 16: self.logger.experiment.add_image(f'Validation #{count}, target: {decoded_targets[i]}', batch['image'][i], From 2eba59f91a32e5bcb61b55da7f8dc42a98c065a9 Mon Sep 17 00:00:00 2001 From: Benjamin Kiessling Date: Sun, 5 May 2024 23:05:22 +0200 Subject: [PATCH 60/76] Regression in segmentation training Incorrect copying of hyperparameter data. Fixes #600. --- kraken/lib/train.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kraken/lib/train.py b/kraken/lib/train.py index 9a406a969..fa4c7e4ef 100644 --- a/kraken/lib/train.py +++ b/kraken/lib/train.py @@ -1016,7 +1016,7 @@ def setup(self, stage: Optional[str] = None): self.val_set.dataset.class_mapping = self.nn.user_metadata['class_mapping'] # updates model's hyper params with user-defined ones - self.nn.hyper_params = self.hparams + self.nn.hyper_params = self.hparams.hyper_params # change topline/baseline switch loc = {None: 'centerline', From b4b0589e18d0baaeebed3c8fc301e991390054b7 Mon Sep 17 00:00:00 2001 From: Benjamin Kiessling Date: Wed, 8 May 2024 23:49:05 +0200 Subject: [PATCH 61/76] Type updates for segmentation trainer --- kraken/lib/train.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/kraken/lib/train.py b/kraken/lib/train.py index fa4c7e4ef..48e330afd 100644 --- a/kraken/lib/train.py +++ b/kraken/lib/train.py @@ -705,12 +705,12 @@ def __init__(self, output: str = 'model', spec: str = default_specs.SEGMENTATION_SPEC, model: Optional[Union['PathLike', str]] = None, - training_data: Union[Sequence[Union['PathLike', str]], Sequence[Dict[str, Any]]] = None, - evaluation_data: Optional[Union[Sequence[Union['PathLike', str]], Sequence[Dict[str, Any]]]] = None, + training_data: Union[Sequence[Union['PathLike', str]], Sequence[Segmentation]] = None, + evaluation_data: Optional[Union[Sequence[Union['PathLike', str]], Sequence[Segmentation]]] = None, partition: Optional[float] = 0.9, num_workers: int = 1, force_binarization: bool = False, - format_type: Literal['path', 'alto', 'page', 'xml'] = 'path', + format_type: Literal['path', 'alto', 'page', 'xml', None] = 'path', suppress_regions: bool = False, suppress_baselines: bool = False, valid_regions: Optional[Sequence[str]] = None, From d6c75d75c9683a45f1c0912ed9dac895dc8ad38c Mon Sep 17 00:00:00 2001 From: Benjamin Kiessling Date: Thu, 9 May 2024 00:14:52 +0200 Subject: [PATCH 62/76] Make arrow ds compilation work with container classes --- kraken/lib/arrow_dataset.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/kraken/lib/arrow_dataset.py b/kraken/lib/arrow_dataset.py index d3b4a9288..ced0ea8a3 100755 --- a/kraken/lib/arrow_dataset.py +++ b/kraken/lib/arrow_dataset.py @@ -104,7 +104,7 @@ def parse_path(path: Union[str, 'PathLike'], return {'image': path, 'lines': [{'text': gt}]} -def build_binary_dataset(files: Optional[List[Union[str, 'PathLike', Dict]]] = None, +def build_binary_dataset(files: Optional[List[Union[str, 'PathLike', 'Segmentation']]] = None, output_file: Union[str, 'PathLike'] = None, format_type: str = 'xml', num_workers: int = 0, @@ -120,7 +120,7 @@ def build_binary_dataset(files: Optional[List[Union[str, 'PathLike', Dict]]] = N binary dataset. Args: - files: List of XML input files. + files: List of XML input files or Segmentation container objects. output_file: Path to the output file. format_type: One of `xml`, `alto`, `page`, `path`, or None. In `None` mode, the files argument is expected to be a list of @@ -191,9 +191,9 @@ def build_binary_dataset(files: Optional[List[Union[str, 'PathLike', Dict]]] = N alphabet = Counter() num_lines = 0 for doc in docs: - if format_type in ['xml', 'alto', 'page']: + if format_type in ['xml', 'alto', 'page', None]: lines = doc.lines.values() - else: + elif format_type == 'path': lines = doc['lines'] for line in lines: num_lines += 1 From 6b9f7d4bde94fd2682e127aa9cba3c825f8d0314 Mon Sep 17 00:00:00 2001 From: Benjamin Kiessling Date: Thu, 9 May 2024 12:03:13 +0200 Subject: [PATCH 63/76] Typing fixes of format_type in build_binary_dataset --- kraken/lib/arrow_dataset.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/kraken/lib/arrow_dataset.py b/kraken/lib/arrow_dataset.py index ced0ea8a3..3d4b79a0f 100755 --- a/kraken/lib/arrow_dataset.py +++ b/kraken/lib/arrow_dataset.py @@ -23,7 +23,7 @@ from collections import Counter from functools import partial from multiprocessing import Pool -from typing import TYPE_CHECKING, Callable, Dict, List, Optional, Tuple, Union +from typing import TYPE_CHECKING, Literal, Callable, List, Optional, Tuple, Union import numpy as np import pyarrow as pa @@ -106,7 +106,7 @@ def parse_path(path: Union[str, 'PathLike'], def build_binary_dataset(files: Optional[List[Union[str, 'PathLike', 'Segmentation']]] = None, output_file: Union[str, 'PathLike'] = None, - format_type: str = 'xml', + format_type: Literal['xml', 'alto', 'page', None] = 'xml', num_workers: int = 0, ignore_splits: bool = False, random_split: Optional[Tuple[float, float, float]] = None, @@ -124,8 +124,7 @@ def build_binary_dataset(files: Optional[List[Union[str, 'PathLike', 'Segmentati output_file: Path to the output file. format_type: One of `xml`, `alto`, `page`, `path`, or None. In `None` mode, the files argument is expected to be a list of - dictionaries in the output format of the - `kraken.lib.xml.parse_{alto,page,xml}` functions. + `kraken.containers.Segmentation` objects. num_workers: Number of workers for parallelized extraction of line images. Set to `0` to disable parallelism. ignore_splits: Switch to disable serialization of the explicit From ac5e7b5214aefb0968715a7433ece52b749a3ae2 Mon Sep 17 00:00:00 2001 From: Benjamin Kiessling Date: Thu, 9 May 2024 16:49:35 +0200 Subject: [PATCH 64/76] 5.x dataset from object regression and some basic tests so this doesn't happen again --- kraken/lib/arrow_dataset.py | 9 +-- tests/resources/170025120000003,0074-lite.xml | 2 +- tests/test_arrow_dataset.py | 72 ++++++++++++++++--- 3 files changed, 70 insertions(+), 13 deletions(-) diff --git a/kraken/lib/arrow_dataset.py b/kraken/lib/arrow_dataset.py index 3d4b79a0f..bf3423266 100755 --- a/kraken/lib/arrow_dataset.py +++ b/kraken/lib/arrow_dataset.py @@ -52,8 +52,7 @@ def _extract_line(xml_record, skip_empty_lines: bool = True, legacy_polygons: bo return lines, None, None if is_bitonal(im): im = im.convert('1') - recs = xml_record.lines.values() - for idx, rec in enumerate(recs): + for idx, rec in enumerate(xml_record.lines): seg = Segmentation(text_direction='horizontal-lr', imagename=xml_record.imagename, type=xml_record.type, @@ -167,6 +166,8 @@ def build_binary_dataset(files: Optional[List[Union[str, 'PathLike', 'Segmentati for doc in files: try: data = parse_fn(doc) + if format_type in ['xml', 'alto', 'page']: + data = data.to_container() except (FileNotFoundError, KrakenInputException, ValueError): logger.warning(f'Invalid input file {doc}') continue @@ -191,12 +192,12 @@ def build_binary_dataset(files: Optional[List[Union[str, 'PathLike', 'Segmentati num_lines = 0 for doc in docs: if format_type in ['xml', 'alto', 'page', None]: - lines = doc.lines.values() + lines = doc.lines elif format_type == 'path': lines = doc['lines'] for line in lines: num_lines += 1 - alphabet.update(line.text if format_type in ['xml', 'alto', 'page'] else line['text']) + alphabet.update(line.text if format_type in ['xml', 'alto', 'page', None] else line['text']) callback(0, num_lines) diff --git a/tests/resources/170025120000003,0074-lite.xml b/tests/resources/170025120000003,0074-lite.xml index 504794e0f..b87e85d4c 100644 --- a/tests/resources/170025120000003,0074-lite.xml +++ b/tests/resources/170025120000003,0074-lite.xml @@ -33,7 +33,7 @@ - $-nor su hijo, De todos sus bienes, con los pactos + diff --git a/tests/test_arrow_dataset.py b/tests/test_arrow_dataset.py index 4ce06031a..31c3fb8ba 100644 --- a/tests/test_arrow_dataset.py +++ b/tests/test_arrow_dataset.py @@ -2,8 +2,10 @@ import json import unittest -from pathlib import Path +import tempfile +import pyarrow as pa +from pathlib import Path from pytest import raises import kraken @@ -13,23 +15,77 @@ thisfile = Path(__file__).resolve().parent resources = thisfile / 'resources' +def _validate_ds(self, path, num_lines, num_empty_lines, ds_type): + with pa.memory_map(path, 'rb') as source: + ds_table = pa.ipc.open_file(source).read_all() + raw_metadata = ds_table.schema.metadata + if not raw_metadata or b'lines' not in raw_metadata: + raise ValueError(f'{file} does not contain a valid metadata record.') + metadata = json.loads(raw_metadata[b'lines']) + self.assertEqual(metadata['type'], + ds_type, + f'Unexpected dataset type (expected: {ds_type}, found: {metadata["type"]}') + self.assertEqual(metadata['counts']['all'], + num_lines, + 'Unexpected number of lines in dataset metadata ' + f'(expected: {num_lines}, found: {metadata["counts"]["all"]}') + self.assertEqual(len(ds_table), + num_lines, + 'Unexpected number of rows in arrow table ' + f'(expected: {num_lines}, found: {metadata["counts"]["all"]}') + + real_empty_lines = len([line for line in ds_table.column('lines') if not str(line[0])]) + self.assertEqual(real_empty_lines, + num_empty_lines, + 'Unexpected number of empty lines in dataset ' + f'(expected: {num_empty_lines}, found: {real_empty_lines}') + + class TestKrakenArrowCompilation(unittest.TestCase): """ Tests for binary datasets """ def setUp(self): - self.xml = resources / '170025120000003,0074.xml' - self.bls = xml.XMLPage(self.xml) + self.xml = resources / '170025120000003,0074-lite.xml' + self.seg = xml.XMLPage(self.xml).to_container() self.box_lines = [resources / '000236.png'] def test_build_path_dataset(self): - pass + with tempfile.NamedTemporaryFile() as tmp_file: + build_binary_dataset(files=4*self.box_lines, + output_file=tmp_file.name, + format_type='path') + _validate_ds(self, tmp_file.name, 4, 0, 'kraken_recognition_bbox') def test_build_xml_dataset(self): - pass + with tempfile.NamedTemporaryFile() as tmp_file: + build_binary_dataset(files=[self.xml], + output_file=tmp_file.name, + format_type='xml') + _validate_ds(self, tmp_file.name, 4, 0, 'kraken_recognition_baseline') + + def test_build_seg_dataset(self): + with tempfile.NamedTemporaryFile() as tmp_file: + build_binary_dataset(files=[self.seg], + output_file=tmp_file.name, + format_type=None) + _validate_ds(self, tmp_file.name, 4, 0, 'kraken_recognition_baseline') - def test_build_obj_dataset(self): - pass + def test_forced_type_dataset(self): + with tempfile.NamedTemporaryFile() as tmp_file: + build_binary_dataset(files=4*self.box_lines, + output_file=tmp_file.name, + format_type='path', + force_type='kraken_recognition_baseline') + _validate_ds(self, tmp_file.name, 4, 0, 'kraken_recognition_baseline') def test_build_empty_dataset(self): - pass + """ + Test that empty lines are retained in compiled dataset. + """ + with tempfile.NamedTemporaryFile() as tmp_file: + build_binary_dataset(files=[self.xml], + output_file=tmp_file.name, + format_type='xml', + skip_empty_lines=False) + _validate_ds(self, tmp_file.name, 5, 1, 'kraken_recognition_baseline') From 2fb846a45189a490ee0b07d7170f9c03038c5409 Mon Sep 17 00:00:00 2001 From: Benjamin Kiessling Date: Thu, 9 May 2024 17:10:16 +0200 Subject: [PATCH 65/76] don't update metrics after sanity checking --- kraken/lib/pretrain/model.py | 17 +++++----- kraken/lib/ro/model.py | 24 +++++++------- kraken/lib/train.py | 63 +++++++++++++++++++----------------- 3 files changed, 55 insertions(+), 49 deletions(-) diff --git a/kraken/lib/pretrain/model.py b/kraken/lib/pretrain/model.py index eb0d3cc57..97b220751 100644 --- a/kraken/lib/pretrain/model.py +++ b/kraken/lib/pretrain/model.py @@ -394,16 +394,17 @@ def validation_step(self, batch, batch_idx): self.log('CE', loss, on_step=True, on_epoch=True) def on_validation_epoch_end(self): - ce = np.mean(self.val_ce) + if not self.trainer.sanity_checking: + ce = np.mean(self.val_ce) + + if ce < self.best_metric: + logger.debug(f'Updating best metric from {self.best_metric} ({self.best_epoch}) to {ce} ({self.current_epoch})') + self.best_epoch = self.current_epoch + self.best_metric = ce + logger.info(f'validation run: cross_enctropy: {ce}') + self.log('val_ce', ce, on_step=False, on_epoch=True, prog_bar=True, logger=True) self.val_ce.clear() - if ce < self.best_metric: - logger.debug(f'Updating best metric from {self.best_metric} ({self.best_epoch}) to {ce} ({self.current_epoch})') - self.best_epoch = self.current_epoch - self.best_metric = ce - logger.info(f'validation run: cross_enctropy: {ce}') - self.log('val_ce', ce, on_step=False, on_epoch=True, prog_bar=True, logger=True) - def training_step(self, batch, batch_idx): o = self._step(batch, batch_idx) if o is not None: diff --git a/kraken/lib/ro/model.py b/kraken/lib/ro/model.py index c9c661afa..d5ef0927c 100644 --- a/kraken/lib/ro/model.py +++ b/kraken/lib/ro/model.py @@ -164,20 +164,22 @@ def validation_step(self, batch, batch_idx): self.val_spearman.append(spearman_dist.cpu()) def on_validation_epoch_end(self): - val_metric = np.mean(self.val_spearman) - val_loss = np.mean(self.val_losses) + if not self.trainer.sanity_checking: + val_metric = np.mean(self.val_spearman) + val_loss = np.mean(self.val_losses) + + if val_metric < self.best_metric: + logger.debug(f'Updating best metric from {self.best_metric} ({self.best_epoch}) to {val_metric} ({self.current_epoch})') + self.best_epoch = self.current_epoch + self.best_metric = val_metric + logger.info(f'validation run: val_spearman {val_metric} val_loss {val_loss}') + self.log('val_spearman', val_metric, on_step=False, on_epoch=True, prog_bar=True, logger=True) + self.log('val_metric', val_metric, on_step=False, on_epoch=True, prog_bar=False, logger=True) + self.log('val_loss', val_loss, on_step=False, on_epoch=True, prog_bar=True, logger=True) + self.val_spearman.clear() self.val_losses.clear() - if val_metric < self.best_metric: - logger.debug(f'Updating best metric from {self.best_metric} ({self.best_epoch}) to {val_metric} ({self.current_epoch})') - self.best_epoch = self.current_epoch - self.best_metric = val_metric - logger.info(f'validation run: val_spearman {val_metric} val_loss {val_loss}') - self.log('val_spearman', val_metric, on_step=False, on_epoch=True, prog_bar=True, logger=True) - self.log('val_metric', val_metric, on_step=False, on_epoch=True, prog_bar=False, logger=True) - self.log('val_loss', val_loss, on_step=False, on_epoch=True, prog_bar=True, logger=True) - def training_step(self, batch, batch_idx): x, y = batch['sample'], batch['target'] logits = self.ro_net(x) diff --git a/kraken/lib/train.py b/kraken/lib/train.py index 48e330afd..1e5a41e80 100644 --- a/kraken/lib/train.py +++ b/kraken/lib/train.py @@ -515,17 +515,19 @@ def validation_step(self, batch, batch_idx): self.global_step) def on_validation_epoch_end(self): - accuracy = 1.0 - self.val_cer.compute() - word_accuracy = 1.0 - self.val_wer.compute() - - if accuracy > self.best_metric: - logger.debug(f'Updating best metric from {self.best_metric} ({self.best_epoch}) to {accuracy} ({self.current_epoch})') - self.best_epoch = self.current_epoch - self.best_metric = accuracy - logger.info(f'validation run: total chars {self.val_cer.total} errors {self.val_cer.errors} accuracy {accuracy}') - self.log('val_accuracy', accuracy, on_step=False, on_epoch=True, prog_bar=True, logger=True) - self.log('val_word_accuracy', word_accuracy, on_step=False, on_epoch=True, prog_bar=True, logger=True) - self.log('val_metric', accuracy, on_step=False, on_epoch=True, prog_bar=False, logger=True) + if not self.trainer.sanity_checking: + accuracy = 1.0 - self.val_cer.compute() + word_accuracy = 1.0 - self.val_wer.compute() + + if accuracy > self.best_metric: + logger.debug(f'Updating best metric from {self.best_metric} ({self.best_epoch}) to {accuracy} ({self.current_epoch})') + self.best_epoch = self.current_epoch + self.best_metric = accuracy + logger.info(f'validation run: total chars {self.val_cer.total} errors {self.val_cer.errors} accuracy {accuracy}') + self.log('val_accuracy', accuracy, on_step=False, on_epoch=True, prog_bar=True, logger=True) + self.log('val_word_accuracy', word_accuracy, on_step=False, on_epoch=True, prog_bar=True, logger=True) + self.log('val_metric', accuracy, on_step=False, on_epoch=True, prog_bar=False, logger=True) + # reset metrics even if not sanity checking self.val_cer.reset() self.val_wer.reset() @@ -905,25 +907,26 @@ def validation_step(self, batch, batch_idx): self.val_freq_iu.update(pred, y) def on_validation_epoch_end(self): - - pixel_accuracy = self.val_px_accuracy.compute() - mean_accuracy = self.val_mean_accuracy.compute() - mean_iu = self.val_mean_iu.compute() - freq_iu = self.val_freq_iu.compute() - - if mean_iu > self.best_metric: - logger.debug(f'Updating best metric from {self.best_metric} ({self.best_epoch}) to {mean_iu} ({self.current_epoch})') - self.best_epoch = self.current_epoch - self.best_metric = mean_iu - - logger.info(f'validation run: accuracy {pixel_accuracy} mean_acc {mean_accuracy} mean_iu {mean_iu} freq_iu {freq_iu}') - - self.log('val_accuracy', pixel_accuracy, on_step=False, on_epoch=True, prog_bar=True, logger=True) - self.log('val_mean_acc', mean_accuracy, on_step=False, on_epoch=True, prog_bar=True, logger=True) - self.log('val_mean_iu', mean_iu, on_step=False, on_epoch=True, prog_bar=True, logger=True) - self.log('val_freq_iu', freq_iu, on_step=False, on_epoch=True, prog_bar=True, logger=True) - self.log('val_metric', mean_iu, on_step=False, on_epoch=True, prog_bar=False, logger=True) - + if not self.trainer.sanity_checking: + pixel_accuracy = self.val_px_accuracy.compute() + mean_accuracy = self.val_mean_accuracy.compute() + mean_iu = self.val_mean_iu.compute() + freq_iu = self.val_freq_iu.compute() + + if mean_iu > self.best_metric: + logger.debug(f'Updating best metric from {self.best_metric} ({self.best_epoch}) to {mean_iu} ({self.current_epoch})') + self.best_epoch = self.current_epoch + self.best_metric = mean_iu + + logger.info(f'validation run: accuracy {pixel_accuracy} mean_acc {mean_accuracy} mean_iu {mean_iu} freq_iu {freq_iu}') + + self.log('val_accuracy', pixel_accuracy, on_step=False, on_epoch=True, prog_bar=True, logger=True) + self.log('val_mean_acc', mean_accuracy, on_step=False, on_epoch=True, prog_bar=True, logger=True) + self.log('val_mean_iu', mean_iu, on_step=False, on_epoch=True, prog_bar=True, logger=True) + self.log('val_freq_iu', freq_iu, on_step=False, on_epoch=True, prog_bar=True, logger=True) + self.log('val_metric', mean_iu, on_step=False, on_epoch=True, prog_bar=False, logger=True) + + # reset metrics even if sanity checking self.val_px_accuracy.reset() self.val_mean_accuracy.reset() self.val_mean_iu.reset() From 3899b4969de8203adc0871c398074bee4d8e287e Mon Sep 17 00:00:00 2001 From: Benjamin Kiessling Date: Fri, 10 May 2024 03:37:19 +0200 Subject: [PATCH 66/76] Correctly start task in ketos compile progress bar Fixes #504. --- kraken/ketos/dataset.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/kraken/ketos/dataset.py b/kraken/ketos/dataset.py index 06154d78a..af0feb394 100644 --- a/kraken/ketos/dataset.py +++ b/kraken/ketos/dataset.py @@ -84,6 +84,11 @@ def compile(ctx, output, workers, format_type, files, random_split, force_type, with KrakenProgressBar() as progress: extract_task = progress.add_task('Extracting lines', total=0, start=False, visible=True if not ctx.meta['verbose'] else False) + def _update_bar(advance, total): + if not progress.tasks[0].started: + progress.start_task(extract_task) + progress.update(extract_task, total=total, advance=advance) + arrow_dataset.build_binary_dataset(ground_truth, output, format_type, @@ -93,7 +98,7 @@ def compile(ctx, output, workers, format_type, files, random_split, force_type, force_type, recordbatch_size, skip_empty_lines, - lambda advance, total: progress.update(extract_task, total=total, advance=advance), + _update_bar, legacy_polygons=legacy_polygons) message(f'Output file written to {output}') From fb773eac89f30e3989a8bfcbb4bb198d345bfcf3 Mon Sep 17 00:00:00 2001 From: Benjamin Kiessling Date: Fri, 10 May 2024 16:17:01 +0200 Subject: [PATCH 67/76] Serialization of segmentation results in XML Fixes #597 --- kraken/serialization.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/kraken/serialization.py b/kraken/serialization.py index f4fd4432d..e374eeafb 100644 --- a/kraken/serialization.py +++ b/kraken/serialization.py @@ -165,8 +165,8 @@ def serialize(results: 'Segmentation', # addition to bounding boxes line = {'id': record.id, 'bbox': max_bbox([record.boundary]) if record.type == 'baselines' else record.bbox, - 'cuts': [list(x) for x in record.cuts], - 'confidences': record.confidences, + 'cuts': [list(x) for x in getattr(record, 'cuts', [])], + 'confidences': getattr(record, 'confidences', []), 'recognition': [], 'boundary': [list(x) for x in record.boundary] if record.type == 'baselines' else [[record.bbox[0], record.bbox[1]], [record.bbox[2], record.bbox[1]], @@ -179,7 +179,7 @@ def serialize(results: 'Segmentation', if record.type == 'baselines': line['baseline'] = [list(x) for x in record.baseline] - splits = regex.split(r'(\s+)', record.prediction) + splits = regex.split(r'(\s+)', getattr(record, 'prediction', '')) line_offset = 0 logger.debug(f'Record contains {len(splits)} segments') for segment in splits: From b594af3553614b42a5ea44e6b167cde356ec3aa6 Mon Sep 17 00:00:00 2001 From: Benjamin Kiessling Date: Mon, 13 May 2024 01:02:02 +0200 Subject: [PATCH 68/76] Use image name in warning from xml_record --- kraken/lib/arrow_dataset.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/kraken/lib/arrow_dataset.py b/kraken/lib/arrow_dataset.py index bf3423266..310cd0fe0 100755 --- a/kraken/lib/arrow_dataset.py +++ b/kraken/lib/arrow_dataset.py @@ -63,10 +63,10 @@ def _extract_line(xml_record, skip_empty_lines: bool = True, legacy_polygons: bo try: line_im, line = next(extract_polygons(im, seg, legacy=legacy_polygons)) except KrakenInputException: - logger.warning(f'Invalid line {idx} in {im.filename}') + logger.warning(f'Invalid line {idx} in {xml_record.imagename}') continue except Exception as e: - logger.warning(f'Unexpected exception {e} from line {idx} in {im.filename}') + logger.warning(f'Unexpected exception {e} from line {idx} in {xml_record.imagename}') continue if not line.text and skip_empty_lines: continue From c09b872d58ab0b0cdd6693c20b85b1d1c7421a80 Mon Sep 17 00:00:00 2001 From: Benjamin Kiessling Date: Mon, 13 May 2024 01:41:04 +0200 Subject: [PATCH 69/76] Suppress annoying worker seeding log messages Fixes #603 --- kraken/ketos/__init__.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/kraken/ketos/__init__.py b/kraken/ketos/__init__.py index 4537691b3..2d246ec41 100644 --- a/kraken/ketos/__init__.py +++ b/kraken/ketos/__init__.py @@ -36,11 +36,10 @@ from .segmentation import segtest, segtrain from .transcription import extract, transcription -APP_NAME = 'kraken' - logging.captureWarnings(True) logger = logging.getLogger('kraken') - +# disable annoying lightning worker seeding log messages +logging.getLogger("lightning.fabric.utilities.seed").setLevel(logging.ERROR) # install rich traceback handler install(suppress=[click]) From 940b49d548e830651911a8ac9fd7dac3c536b535 Mon Sep 17 00:00:00 2001 From: Benjamin Kiessling Date: Tue, 14 May 2024 14:48:46 +0200 Subject: [PATCH 70/76] crash in segmentation_overlay script with xml input --- kraken/contrib/segmentation_overlay.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kraken/contrib/segmentation_overlay.py b/kraken/contrib/segmentation_overlay.py index 4a91081be..00bc10459 100755 --- a/kraken/contrib/segmentation_overlay.py +++ b/kraken/contrib/segmentation_overlay.py @@ -65,7 +65,7 @@ def cli(model, text_direction, repolygonize, files): if model is None: for doc in files: click.echo(f'Processing {doc} ', nl=False) - data = xml.XMLPage(doc) + data = xml.XMLPage(doc).to_container() if repolygonize: im = Image.open(data.imagename).convert('L') lines = data.lines From bb5a7bc29a340993e13c76d0f4f9373601b5ff3f Mon Sep 17 00:00:00 2001 From: Benjamin Kiessling Date: Tue, 14 May 2024 16:03:05 +0200 Subject: [PATCH 71/76] remove executable bit on arrow_dataset --- kraken/lib/arrow_dataset.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 kraken/lib/arrow_dataset.py diff --git a/kraken/lib/arrow_dataset.py b/kraken/lib/arrow_dataset.py old mode 100755 new mode 100644 From f77248074c69ec9b36877b345929341036f3fcad Mon Sep 17 00:00:00 2001 From: Benjamin Kiessling Date: Thu, 23 May 2024 15:13:25 +0200 Subject: [PATCH 72/76] Use skimage warp in bounding polygon calculation Corrects polygonization artifacts. Fixes #605 --- kraken/lib/segmentation.py | 58 +++++++++++++++++++++++--------------- 1 file changed, 35 insertions(+), 23 deletions(-) diff --git a/kraken/lib/segmentation.py b/kraken/lib/segmentation.py index e490114aa..29e72bf02 100644 --- a/kraken/lib/segmentation.py +++ b/kraken/lib/segmentation.py @@ -38,26 +38,7 @@ from skimage.measure import (approximate_polygon, label, regionprops, subdivide_polygon) from skimage.morphology import skeletonize -from skimage.transform import (AffineTransform, PiecewiseAffineTransform, - warp) - -#faster implementation of PiecewiseAffineTransform - see https://github.com/scikit-image/scikit-image/issues/6864 and https://github.com/scikit-image/scikit-image/pull/6963 -class FastPiecewiseAffineTransform(PiecewiseAffineTransform): - def __call__(self, coords): - coords = np.asarray(coords) - - simplex = self._tesselation.find_simplex(coords) - - affines = np.array( - [self.affines[i].params for i in range(len(self._tesselation.simplices))] - )[simplex] - - pts = np.c_[coords, np.ones((coords.shape[0], 1))] - - result = np.einsum("ij,ikj->ik", pts, affines) - result[simplex == -1, :] = -1 - - return result +from skimage.transform import (AffineTransform, PiecewiseAffineTransform, warp) from kraken.lib import default_specs from kraken.lib.exceptions import KrakenInputException @@ -82,6 +63,27 @@ def __call__(self, coords): 'extract_polygons'] +# faster implementation of PiecewiseAffineTransform - see +# https://github.com/scikit-image/scikit-image/issues/6864 and +# https://github.com/scikit-image/scikit-image/pull/6963 +class FastPiecewiseAffineTransform(PiecewiseAffineTransform): + def __call__(self, coords): + coords = np.asarray(coords) + + simplex = self._tesselation.find_simplex(coords) + + affines = np.array( + [self.affines[i].params for i in range(len(self._tesselation.simplices))] + )[simplex] + + pts = np.c_[coords, np.ones((coords.shape[0], 1))] + + result = np.einsum("ij,ikj->ik", pts, affines) + result[simplex == -1, :] = -1 + + return result + + def reading_order(lines: Sequence[Tuple[slice, slice]], text_direction: Literal['lr', 'rl'] = 'lr') -> np.ndarray: """Given the list of lines (a list of 2D slices), computes the partial reading order. The output is a binary 2D array @@ -396,9 +398,11 @@ def _rotate(image: _T_pil_or_np, center: Any, scale: float, cval: int = 0, - order: int = 0) -> Tuple[AffineTransform, _T_pil_or_np]: + order: int = 0, + use_skimage_warp: bool = False) -> Tuple[AffineTransform, _T_pil_or_np]: """ Rotate an image at an angle with optional scaling + Args: image (PIL.Image.Image or (H, W, C) np.ndarray): Input image angle (float): Angle in radians @@ -448,7 +452,10 @@ def _rotate(image: _T_pil_or_np, offset = pdata[:2, 2].copy() # scipy expects a 3x3 *linear* matrix (to include channel axis), we don't want the channel axis to be modified pdata[:2, 2] = 0 - return tform, affine_transform(image, pdata, offset=(*offset, 0), output_shape=(*output_shape, *image.shape[2:]), cval=cval, order=order) + if use_skimage_warp: + return tform, warp(image, tform, output_shape=output_shape, order=order, cval=cval, clip=False, preserve_range=True) + else: + return tform, affine_transform(image, pdata, offset=(*offset, 0), output_shape=(*output_shape, *image.shape[2:]), cval=cval, order=order) def line_regions(line, regions): @@ -525,7 +532,12 @@ def _calc_seam(baseline, polygon, angle, im_feats, bias=150): extrema = baseline[(0, -1), :] - (c_min, r_min) # scale line image to max 600 pixel width scale = min(1.0, 600/(c_max-c_min)) - tform, rotated_patch = _rotate(patch, angle, center=extrema[0], scale=scale, cval=MASK_VAL) + tform, rotated_patch = _rotate(patch, + angle, + center=extrema[0], + scale=scale, + cval=MASK_VAL, + use_skimage_warp=True) # ensure to cut off padding after rotation x_offsets = np.sort(np.around(tform.inverse(extrema)[:, 0]).astype('int')) rotated_patch = rotated_patch[:, x_offsets[0]:x_offsets[1]+1] From 811db0afde04163f58c463a382037917380b684d Mon Sep 17 00:00:00 2001 From: Benjamin Kiessling Date: Thu, 23 May 2024 15:16:02 +0200 Subject: [PATCH 73/76] Proper repolyognization support in segmentation_overlay.py --- kraken/contrib/segmentation_overlay.py | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/kraken/contrib/segmentation_overlay.py b/kraken/contrib/segmentation_overlay.py index 00bc10459..1d49621c4 100755 --- a/kraken/contrib/segmentation_overlay.py +++ b/kraken/contrib/segmentation_overlay.py @@ -46,8 +46,14 @@ def slugify(value): 'be ignored in `path` mode. Note, that this option will be slow ' 'and will not scale input images to the same size as the segmenter ' 'does.') +@click.option('-tl', '--topline', 'topline', show_default=True, flag_value='topline', + help='Switch for the baseline location in the scripts. ') +@click.option('-cl', '--centerline', 'topline', flag_value='centerline') +@click.option('-bl', '--baseline', 'topline', flag_value='baseline', default='baseline') +@click.option('--height-scale', default=1800, show_default=True, + help='Maximum height of input image in height dimension') @click.argument('files', nargs=-1) -def cli(model, text_direction, repolygonize, files): +def cli(model, text_direction, repolygonize, topline, height_scale, files): """ A script producing overlays of lines and regions from either ALTO or PageXML files or run a model to do the same. @@ -62,6 +68,12 @@ def cli(model, text_direction, repolygonize, files): from kraken import blla from kraken.lib import segmentation, vgsl, xml + loc = {'topline': True, + 'baseline': False, + 'centerline': None} + + topline = loc[topline] + if model is None: for doc in files: click.echo(f'Processing {doc} ', nl=False) @@ -69,7 +81,10 @@ def cli(model, text_direction, repolygonize, files): if repolygonize: im = Image.open(data.imagename).convert('L') lines = data.lines - polygons = segmentation.calculate_polygonal_environment(im, [x.baseline for x in lines], scale=(1200, 0)) + polygons = segmentation.calculate_polygonal_environment(im, + [x.baseline for x in lines], + scale=(height_scale, 0), + topline=topline) data.lines = [dataclasses.replace(orig, boundary=polygon) for orig, polygon in zip(lines, polygons)] # reorder lines by type lines = defaultdict(list) From d983d480ae7518c425473854b9f0b4ec24b11ff2 Mon Sep 17 00:00:00 2001 From: Benjamin Kiessling Date: Thu, 23 May 2024 15:16:23 +0200 Subject: [PATCH 74/76] training empty line in recognition.py --- kraken/lib/dataset/recognition.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/kraken/lib/dataset/recognition.py b/kraken/lib/dataset/recognition.py index 5a13d2f00..75a3bb9a8 100644 --- a/kraken/lib/dataset/recognition.py +++ b/kraken/lib/dataset/recognition.py @@ -656,5 +656,3 @@ def im_mode(self): return {b'1': '1', b'L': 'L', b'R': 'RGB'}[self._im_mode.value] - - From 8003dc0adc66210d257ac8b288a29c87fe4d92c1 Mon Sep 17 00:00:00 2001 From: Benjamin Kiessling Date: Thu, 23 May 2024 17:26:13 +0200 Subject: [PATCH 75/76] Robustness improvement in extract_polygonal_environment() Fixes #606 --- kraken/lib/segmentation.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/kraken/lib/segmentation.py b/kraken/lib/segmentation.py index 29e72bf02..44ec18b30 100644 --- a/kraken/lib/segmentation.py +++ b/kraken/lib/segmentation.py @@ -1197,6 +1197,8 @@ def extract_polygons(im: Image.Image, for line in bounds.lines: if line.boundary is None: raise KrakenInputException('No boundary given for line') + if len(line.baseline) < 2 or geom.LineString(line.baseline).length < 5: + raise KrakenInputException('Baseline length below minimum 5px') pl = np.array(line.boundary) baseline = np.array(line.baseline) c_min, c_max = int(pl[:, 0].min()), int(pl[:, 0].max()) From 0309bc1e02bf13f1318a0c6082274ac8c18dd463 Mon Sep 17 00:00:00 2001 From: Benjamin Kiessling Date: Mon, 27 May 2024 02:04:40 +0200 Subject: [PATCH 76/76] pin setuptools to <70 until we can upgrade to pytorch 2.3 when lightning has a new release. --- conda/recipe.yaml | 2 +- environment.yml | 1 + environment_cuda.yml | 1 + pyproject.toml | 2 +- 4 files changed, 4 insertions(+), 2 deletions(-) diff --git a/conda/recipe.yaml b/conda/recipe.yaml index 18128d46d..cdeca881f 100644 --- a/conda/recipe.yaml +++ b/conda/recipe.yaml @@ -16,7 +16,7 @@ build: requirements: build: - python>=3.8,<3.12 - - setuptools + - setuptools>=36.6.0,<70.0.0 - pbr host: - python>=3.8,<3.12 diff --git a/environment.yml b/environment.yml index 242b8426c..be2050ffa 100644 --- a/environment.yml +++ b/environment.yml @@ -29,6 +29,7 @@ dependencies: - pip - albumentations - rich + - setuptools>=36.6.0,<70.0.0 - pip: - coremltools~=6.0 - file:. diff --git a/environment_cuda.yml b/environment_cuda.yml index 83b75f850..392284508 100644 --- a/environment_cuda.yml +++ b/environment_cuda.yml @@ -30,6 +30,7 @@ dependencies: - pip - albumentations - rich + - setuptools>=36.6.0,<70.0.0 - pip: - coremltools~=6.0 - file:. diff --git a/pyproject.toml b/pyproject.toml index 7fecc5fb8..637e7fdd6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,5 +1,5 @@ [project] [build-system] -requires = ["pbr>=5.7.0", "setuptools>=36.6.0", "wheel"] +requires = ["pbr>=5.7.0", "setuptools>=36.6.0,<70.0.0", "wheel"] build-backend = "pbr.build"