From 1403898b23b8fe942cd49d6e14e1253c466f1485 Mon Sep 17 00:00:00 2001 From: Belyaeva Oksana Date: Fri, 15 Dec 2023 14:08:46 +0300 Subject: [PATCH 1/4] TLDR-538 ocr correction scripts --- dedoc/scripts/language_tool_correction.py | 0 dedoc/scripts/text_blob_correction.py | 9 + requirements.txt | 3 +- .../tesseract_benchmark_sage-correction.txt | 359 ++++++++++++++++++ .../tesseract_benchmark_with_correction.txt | 259 +++++++++++++ scripts/calc_tesseract_benchmarks.py | 130 +++++-- scripts/language_tool_correction.py | 0 scripts/ocr_correction.py | 43 +++ scripts/text_blob_correction.py | 9 + 9 files changed, 771 insertions(+), 41 deletions(-) create mode 100644 dedoc/scripts/language_tool_correction.py create mode 100644 dedoc/scripts/text_blob_correction.py create mode 100644 resources/benchmarks/tesseract_benchmark_sage-correction.txt create mode 100644 resources/benchmarks/tesseract_benchmark_with_correction.txt create mode 100644 scripts/language_tool_correction.py create mode 100644 scripts/ocr_correction.py create mode 100644 scripts/text_blob_correction.py diff --git a/dedoc/scripts/language_tool_correction.py b/dedoc/scripts/language_tool_correction.py new file mode 100644 index 00000000..e69de29b diff --git a/dedoc/scripts/text_blob_correction.py b/dedoc/scripts/text_blob_correction.py new file mode 100644 index 00000000..8ecf8be6 --- /dev/null +++ b/dedoc/scripts/text_blob_correction.py @@ -0,0 +1,9 @@ +from textblob import TextBlob + + +class TextBlobCorrector: + def __init__(self): + return + + def correct(self, text: str) -> str: + return str(TextBlob(text).correct()) diff --git a/requirements.txt b/requirements.txt index 1ddb72e8..41f0c60c 100644 --- a/requirements.txt +++ b/requirements.txt @@ -37,4 +37,5 @@ uvicorn>=0.18.0,<=0.23.2 wget==3.2 xgbfir==0.3.1 xgboost>=1.1.1,<1.2.0 -xlrd==1.2.0 \ No newline at end of file +xlrd==1.2.0 +textblob==0.17.1 \ No newline at end of file diff --git a/resources/benchmarks/tesseract_benchmark_sage-correction.txt b/resources/benchmarks/tesseract_benchmark_sage-correction.txt new file mode 100644 index 00000000..f75ea71e --- /dev/null +++ b/resources/benchmarks/tesseract_benchmark_sage-correction.txt @@ -0,0 +1,359 @@ +Tesseract version is 5.0.0 +Correction step: _sage-correction + +Table 1 - Accuracy for each file ++---------------+---------------------+-------+-----------------+--------------+ +| Dataset | Image name | --psm | Amount of words | Accuracy OCR | ++===============+=====================+=======+=================+==============+ +| english-words | Kaspersky | 6 | 111 | 99.300 | ++---------------+---------------------+-------+-----------------+--------------+ +| english-words | USB | 6 | 4 | 80.900 | ++---------------+---------------------+-------+-----------------+--------------+ +| english-words | words1 | 6 | 19 | 100 | ++---------------+---------------------+-------+-----------------+--------------+ +| english-words | words2 | 6 | 9 | 100 | ++---------------+---------------------+-------+-----------------+--------------+ +| english-words | words3 | 6 | 9 | 100 | ++---------------+---------------------+-------+-----------------+--------------+ +| low_quality | 0 | 4 | 315 | 94.500 | ++---------------+---------------------+-------+-----------------+--------------+ +| low_quality | 1 | 4 | 308 | 94.600 | ++---------------+---------------------+-------+-----------------+--------------+ +| low_quality | 2 | 4 | 238 | 96.600 | ++---------------+---------------------+-------+-----------------+--------------+ +| low_quality | 3 | 4 | 313 | 96.900 | ++---------------+---------------------+-------+-----------------+--------------+ +| low_quality | 4 | 4 | 218 | 94.100 | ++---------------+---------------------+-------+-----------------+--------------+ +| low_quality | 5 | 4 | 291 | 94 | ++---------------+---------------------+-------+-----------------+--------------+ +| low_quality | 6 | 4 | 268 | 95.200 | ++---------------+---------------------+-------+-----------------+--------------+ +| low_quality | 7 | 4 | 390 | 95.100 | ++---------------+---------------------+-------+-----------------+--------------+ +| low_quality | 8 | 4 | 117 | 94 | ++---------------+---------------------+-------+-----------------+--------------+ +| low_quality | 9 | 4 | 294 | 97.900 | ++---------------+---------------------+-------+-----------------+--------------+ +| others | Zaklyuchenie_nevrol | 4 | 525 | 83 | +| | oga_00 | | | | ++---------------+---------------------+-------+-----------------+--------------+ +| others | Zaklyuchenie_nevrol | 4 | 241 | 87 | +| | oga_01 | | | | ++---------------+---------------------+-------+-----------------+--------------+ +| others | napalm_doc_2_2_6 | 4 | 124 | 85 | ++---------------+---------------------+-------+-----------------+--------------+ +| tz-npa | 1.620e+14 | 4 | 695 | 99.600 | ++---------------+---------------------+-------+-----------------+--------------+ +| tz-npa | 1.620e+14 | 4 | 696 | 99.600 | ++---------------+---------------------+-------+-----------------+--------------+ +| tz-npa | 1.620e+14 | 4 | 699 | 99.400 | ++---------------+---------------------+-------+-----------------+--------------+ +| tz-npa | article_multiline | 4 | 471 | 99.900 | ++---------------+---------------------+-------+-----------------+--------------+ +| tz-npa | fstek17_00 | 4 | 192 | 92.300 | ++---------------+---------------------+-------+-----------------+--------------+ +| tz-npa | fstek17_01 | 4 | 332 | 99.600 | ++---------------+---------------------+-------+-----------------+--------------+ +| tz-npa | law_image | 4 | 182 | 99.500 | ++---------------+---------------------+-------+-----------------+--------------+ +| tz-npa | napalm_doc_13_2 | 4 | 243 | 96.700 | ++---------------+---------------------+-------+-----------------+--------------+ +| tz-npa | ukaz_prezidenta_1 | 4 | 264 | 98.800 | ++---------------+---------------------+-------+-----------------+--------------+ +| tz-npa | ukodeksrf_00 | 4 | 287 | 99.900 | ++---------------+---------------------+-------+-----------------+--------------+ +| tz-npa | ukodeksrf_01 | 4 | 340 | 99.500 | ++---------------+---------------------+-------+-----------------+--------------+ +| tz-npa | with_applications_0 | 4 | 146 | 94.400 | +| | 0 | | | | ++---------------+---------------------+-------+-----------------+--------------+ +| tz-npa | with_applications_0 | 4 | 276 | 98.800 | +| | 1 | | | | ++---------------+---------------------+-------+-----------------+--------------+ +| tz-npa | with_applications_0 | 4 | 165 | 98.500 | +| | 2 | | | | ++---------------+---------------------+-------+-----------------+--------------+ +| tz-npa | with_applications_0 | 4 | 90 | 99.400 | +| | 3 | | | | ++---------------+---------------------+-------+-----------------+--------------+ +| tz-npa | ТЗ_00 | 4 | 78 | 97.400 | ++---------------+---------------------+-------+-----------------+--------------+ +| tz-npa | ТЗ_01 | 4 | 296 | 98 | ++---------------+---------------------+-------+-----------------+--------------+ +| tz-npa | ТЗ_02 | 4 | 309 | 98.800 | ++---------------+---------------------+-------+-----------------+--------------+ +| tz-npa | ТЗ_03 | 4 | 337 | 98.300 | ++---------------+---------------------+-------+-----------------+--------------+ +| tz-npa | ТЗ_04 | 4 | 257 | 96.300 | ++---------------+---------------------+-------+-----------------+--------------+ +| tz-npa | ТЗ_05 | 4 | 238 | 97.800 | ++---------------+---------------------+-------+-----------------+--------------+ +| tz-npa | ТЗ_06 | 4 | 219 | 93.500 | ++---------------+---------------------+-------+-----------------+--------------+ +| tz-npa | ТЗ_07 | 4 | 233 | 98.500 | ++---------------+---------------------+-------+-----------------+--------------+ +| tz-npa | ТЗ_08 | 4 | 284 | 95.900 | ++---------------+---------------------+-------+-----------------+--------------+ +| tz-npa | ТЗ_09 | 4 | 154 | 97.600 | ++---------------+---------------------+-------+-----------------+--------------+ + +Table 2 - AVG by each type of symbols: ++--------+--------+--------+--------+--------+--------+--------+-------+-------+ +| Datase | ASCII_ | ASCII_ | ASCII_ | ASCII_ | Latin1 | Cyrill | Amoun | AVG A | +| t | Spacin | Specia | Digits | Upperc | _Speci | ic | t of | ccura | +| | g_Char | l_Symb | | ase_Ch | al_Sym | | words | cy | +| | s | ols | | ars | bols | | | | ++========+========+========+========+========+========+========+=======+=======+ +| englis | 94.820 | 99.333 | 100 | 0 | 0 | 94.540 | 152 | 96.04 | +| h- | | | | | | | | 0 | +| words | | | | | | | | | ++--------+--------+--------+--------+--------+--------+--------+-------+-------+ +| low_qu | 99.190 | 75.340 | 94.544 | 0 | 0 | 97.640 | 2752 | 95.29 | +| ality | | | | | | | | 0 | ++--------+--------+--------+--------+--------+--------+--------+-------+-------+ +| others | 89.767 | 77.100 | 89.533 | 0 | 0 | 86.433 | 890 | 85 | ++--------+--------+--------+--------+--------+--------+--------+-------+-------+ +| tz-npa | 98.956 | 90.920 | 92.104 | 0 | 0 | 99.488 | 7483 | 97.92 | +| | | | | | | | | 0 | ++--------+--------+--------+--------+--------+--------+--------+-------+-------+ + +Table 3 -OCR error by symbol: ++--------+---------------------------------------------------------------------+ +| Symbol | Cnt Errors & Correct-Generated | ++========+=====================================================================+ +| | ['3 & <. №> -> < No>', '2 & < 2> -> ', '2 & < г> -> <К>', '2 & < | +| | ‚> -> <,>', "2 & <1 > -> <'>", '2 & <и > -> <н>', '2 & <№ > -> | +| | '] | ++--------+---------------------------------------------------------------------+ +| . | ['54 & <.> -> <,>', '3 & <. №> -> < No>', '3 & <3.> -> < De>', '3 & | +| | <В.В> -> ', '2 & <Г.> -> <С>', '2 & <г.> -> <ГТ>', '2 & <п.> -> | +| | <,>'] | ++--------+---------------------------------------------------------------------+ +| , | ['80 & <,> -> <.>', '3 & <ва,> -> <нь>', '1 & <,> -> <»>'] | ++--------+---------------------------------------------------------------------+ +| е | ['6 & <не> -> ', '4 & <е> -> <ё>', '3 & <все> -> <Ко>', '3 & | +| | <ге> -> <Кри>', '3 & <е-> -> <бов>', '3 & <е> -> <а>', '3 & <цев> | +| | -> ', '3 & <че-> -> <и»>', '2 & <е> -> <и>', '2 & <е> -> | +| | <ми>', '2 & <е> -> <с>', '2 & <ее> -> ', '2 & <ле> -> <У>', '1 | +| | & <е> -> <Е>', '1 & <е> -> <о>'] | ++--------+---------------------------------------------------------------------+ +| о | ['6 & <то> -> ', '3 & <По> -> ', '3 & <Про> -> <Ис>', '3 & | +| | <но> -> ', '3 & <она> -> ', '3 & <под> -> ', '3 & | +| | <фок> -> <М>', '2 & <во> -> <за>', '2 & <до> -> ', '2 & <до> -> | +| | ', '2 & <о> -> <ак>', '2 & <о> -> <у>', '2 & <об> -> <бы>', '2 | +| | & <по> -> <10>', '2 & <то> -> ', '1 & <о> -> <в>', '1 & <о> -> | +| | <я>'] | ++--------+---------------------------------------------------------------------+ +| а | ['5 & <а> -> <о>', '4 & <на> -> ', '3 & <Нам> -> ', '3 & | +| | <а> -> <ёту>', '3 & <ва,> -> <нь>', '3 & <на> -> <под>', '3 & <она> | +| | -> ', '3 & <рак> -> <Ли>', '3 & <сан> -> <еви>', '3 & <так> -> | +| | ', '2 & <Ла> -> <А>', '2 & <а> -> <ся>', '2 & <ва> -> <к>', '2 | +| | & <на> -> ', '1 & <а> -> <Б>', '1 & <а> -> <е>', '1 & <а> -> | +| | <у>', '1 & <а> -> <ы>', '1 & <а> -> <ь>'] | ++--------+---------------------------------------------------------------------+ +| н | ['6 & <не> -> ', '4 & <на> -> ', '3 & <на> -> <под>', '3 & | +| | <но> -> ', '3 & <она> -> ', '3 & <сан> -> <еви>', '2 & | +| | <йн> -> <ем>', '2 & <н> -> <п>', '2 & <на> -> ', '2 & <нк> -> | +| | <х>', '2 & <ны> -> <им>', '1 & <н> -> <Н>', '1 & <н> -> <и>', '1 & | +| | <н> -> <й>', '1 & <н> -> <л>', '1 & <н> -> <м>', '1 & <н> -> <ф>'] | ++--------+---------------------------------------------------------------------+ +| и | ['4 & <и> -> <е>', '3 & <ив> -> <ьюж>', '3 & <тип> -> ', '3 & | +| | <ции> -> <узы>', '2 & <и > -> <н>', '2 & <и> -> <10>', '2 & <и> -> | +| | <ей>', '2 & <и> -> <мм>', '2 & <ис> -> <не>', '2 & <их> -> ', | +| | '2 & <их> -> ', '2 & <си> -> <ен>', '1 & <и> -> <В>', '1 & <и> | +| | -> <а>', '1 & <и> -> <с>', '1 & <и> -> <ь>'] | ++--------+---------------------------------------------------------------------+ +| - | ['8 & <-> -> <но>', '6 & <-> -> <ния>', '5 & <-> -> <в>', '3 & <-> | +| | -> <жья>', '3 & <-> -> <ков>', '3 & <-> -> <нил>', '3 & <-> -> | +| | <щим>', '3 & <е-> -> <бов>', '3 & <че-> -> <и»>', '2 & <-> -> | +| | <ве>', '2 & <-> -> <да>', '2 & <-> -> <ие>', '2 & <-> -> <ко>', '2 | +| | & <-> -> <ли>', '2 & <-> -> <м">', '2 & <-> -> <м>', '2 & <-> -> | +| | <мо>', '2 & <-> -> <ны>', '2 & <-> -> <ры>', '2 & <-> -> <ых>', '2 | +| | & <-> -> <“>', '2 & <у-> -> <ем>', '2 & <ы-> -> <им>', '2 & <ы-> -> | +| | <ём>', '1 & <-> -> <">', '1 & <-> -> <»>', '1 & <-> -> <д>', '1 & | +| | <-> -> <л>', '1 & <-> -> <н>', '1 & <-> -> <ы>'] | ++--------+---------------------------------------------------------------------+ +| 1 | ["4 & <1> -> <'>", '4 & <1С> -> ', '3 & <1> -> <3>', '3 & <№1> | +| | -> ', '3 & <№1»> -> ', "2 & <1 > -> <'>", '2 & <1C> -> | +| | ', '2 & <1C> -> <С>', '2 & <1> -> <2>', '2 & <1> -> ', '1 & | +| | <1> -> ', '1 & <1> -> <5>', '1 & <1> -> <Г>', '1 & <1> -> <С>', | +| | '1 & <1> -> <Т>'] | ++--------+---------------------------------------------------------------------+ +| № | ['94 & <№> -> ', '6 & <№> -> ', '3 & <. №> -> < No>', '3 & | +| | <№1> -> ', '3 & <№1»> -> ', '2 & <№ > -> '] | ++--------+---------------------------------------------------------------------+ +| в | ['4 & <в> -> <6>', '3 & <ва,> -> <нь>', '3 & <все> -> <Ко>', '3 & | +| | <ив> -> <ьюж>', '3 & <ств> -> <У н>', '3 & <цев> -> ', '2 & | +| | <в> -> <«В>', '2 & <в> -> <зм>', '2 & <в> -> <м>', '2 & <в> -> | +| | <по>', '2 & <ва> -> <к>', '2 & <во> -> <за>', '1 & <в> -> ', '1 | +| | & <в> -> <В>', '1 & <в> -> <г>', '1 & <в> -> <н>'] | ++--------+---------------------------------------------------------------------+ +| с | ['3 & <все> -> <Ко>', '3 & <сан> -> <еви>', '3 & <ств> -> <У н>', | +| | '2 & <ис> -> <не>', '2 & <с> -> <Не>', '2 & <с> -> <От>', '2 & <си> | +| | -> <ен>', '1 & <с> -> ', '1 & <с> -> <б>', '1 & <с> -> <н>'] | ++--------+---------------------------------------------------------------------+ +| т | ['6 & <то> -> ', '3 & <ств> -> <У н>', '3 & <так> -> ', '3 | +| | & <тип> -> ', '2 & <т> -> <г>', '2 & <то> -> ', '1 & <т> | +| | -> <Д>', '1 & <т> -> <Т>', '1 & <т> -> <м>'] | ++--------+---------------------------------------------------------------------+ +| л | ['2 & <зл> -> <им>', '2 & <ле> -> <У>', '1 & <л> -> ', '1 & <л> | +| | -> <Л>', '1 & <л> -> <д>', '1 & <л> -> <т>'] | ++--------+---------------------------------------------------------------------+ +| р | ['3 & <Про> -> <Ис>', '3 & <гр> -> <тав>', '3 & <рак> -> <Ли>', '2 | +| | & <гр> -> ', '2 & <р> -> <ал>'] | ++--------+---------------------------------------------------------------------+ +| 2 | ['2 & < 2> -> ', '2 & <28> -> ', '2 & <28> -> <ИР>', '2 & | +| | <28> -> <Я>'] | ++--------+---------------------------------------------------------------------+ +| д | ['3 & <д> -> <Пен>', '3 & <под> -> ', '2 & <до> -> ', '2 & | +| | <до> -> ', '1 & <д> -> <Т>', '1 & <д> -> <Ц>'] | ++--------+---------------------------------------------------------------------+ +| г | ['3 & <ге> -> <Кри>', '3 & <гр> -> <тав>', '2 & < г> -> <К>', '2 & | +| | <г.> -> <ГТ>', '2 & <г> -> <т>', '2 & <гр> -> '] | ++--------+---------------------------------------------------------------------+ +| 3 | ['3 & <3.> -> < De>', '1 & <3> -> <">', '1 & <3> -> '] | ++--------+---------------------------------------------------------------------+ +| С | ['6 & <СЗВ> -> ', '4 & <1С> -> ', '3 & <ОС> -> ', '3 | +| | & <С> -> ', '2 & <ОС> -> '] | ++--------+---------------------------------------------------------------------+ +| N | ['22 & -> <М>'] | ++--------+---------------------------------------------------------------------+ +| А | ['2 & <А> -> ', '2 & <А> -> <Ли>'] | ++--------+---------------------------------------------------------------------+ +| И | ['2 & <И> -> <АН>', '1 & <И> -> <В>', '1 & <И> -> <Й>'] | ++--------+---------------------------------------------------------------------+ +| п | ['3 & <под> -> ', '3 & <тип> -> ', '2 & <п.> -> <,>', '2 | +| | & <п> -> <и >', '2 & <п> -> <л>', '2 & <по> -> <10>', '1 & <п> -> | +| | <П>'] | ++--------+---------------------------------------------------------------------+ +| к | ['3 & <рак> -> <Ли>', '3 & <так> -> ', '3 & <фок> -> <М>', '2 | +| | & <нк> -> <х>'] | ++--------+---------------------------------------------------------------------+ +| у | ['3 & <у> -> <ы>', '2 & <у-> -> <ем>'] | ++--------+---------------------------------------------------------------------+ +| Н | ['3 & <Нам> -> ', '2 & <Н> -> <ЕМ>', '1 & <Н> -> <И>'] | ++--------+---------------------------------------------------------------------+ +| Е | ['2 & <ЕМ> -> <Ш>'] | ++--------+---------------------------------------------------------------------+ +| О | ['3 & <ОС> -> ', '2 & <ОС> -> ', '2 & <Об> -> <06>', '1 & | +| | <О> -> ', '1 & <О> -> <Ю>', '1 & <О> -> <о>'] | ++--------+---------------------------------------------------------------------+ +| П | ['3 & <По> -> ', '3 & <Про> -> <Ис>', '2 & <П> -> <И>', '1 & | +| | <П> -> <К>', '1 & <П> -> <п>'] | ++--------+---------------------------------------------------------------------+ +| б | ['3 & <"б"> -> <“8”>', '2 & <Об> -> <06>', '2 & <б> -> <«Л>', '2 & | +| | <об> -> <бы>'] | ++--------+---------------------------------------------------------------------+ +| ы | ['2 & <ны> -> <им>', '2 & <ы-> -> <им>', '2 & <ы-> -> <ём>', '1 & | +| | <ы> -> <б>', '1 & <ы> -> <е>'] | ++--------+---------------------------------------------------------------------+ +| ; | ['9 & <;> -> <:>', '1 & <;> -> <,>', '1 & <;> -> <.>'] | ++--------+---------------------------------------------------------------------+ +| Т | ['3 & <МРТ> -> ', '3 & <Т> -> <Г>', '3 & <ТЗР> -> '] | ++--------+---------------------------------------------------------------------+ +| м | ['3 & <Нам> -> '] | ++--------+---------------------------------------------------------------------+ +| В | ['6 & <СЗВ> -> ', '3 & <В.В> -> ', '2 & <ВЗ> -> <РИ>'] | ++--------+---------------------------------------------------------------------+ +| 0 | ['3 & <608> -> '] | ++--------+---------------------------------------------------------------------+ +| I | ['3 & -> <Ш>', '3 & -> <УП>', '1 & -> '] | ++--------+---------------------------------------------------------------------+ +| М | ['3 & <МРТ> -> ', '2 & <ЕМ> -> <Ш>'] | ++--------+---------------------------------------------------------------------+ +| 6 | ['3 & <608> -> '] | ++--------+---------------------------------------------------------------------+ +| Р | ['3 & <МРТ> -> ', '3 & <ТЗР> -> '] | ++--------+---------------------------------------------------------------------+ +| ц | ['3 & <цев> -> ', '3 & <ции> -> <узы>', '2 & <ц> -> <С>', '1 & | +| | <ц> -> <щ>'] | ++--------+---------------------------------------------------------------------+ +| Л | ['2 & <Ла> -> <А>'] | ++--------+---------------------------------------------------------------------+ +| 5 | ['2 & <75> -> <2>'] | ++--------+---------------------------------------------------------------------+ +| з | ['2 & <зл> -> <им>'] | ++--------+---------------------------------------------------------------------+ +| 8 | ['3 & <608> -> ', '2 & <28> -> ', '2 & <28> -> <ИР>', '2 & | +| | <28> -> <Я>'] | ++--------+---------------------------------------------------------------------+ +| й | ['2 & <й> -> <е:>', '2 & <йн> -> <ем>'] | ++--------+---------------------------------------------------------------------+ +| " | ['3 & <"б"> -> <“8”>', '2 & <"> -> <“>', '1 & <"> -> <”>'] | ++--------+---------------------------------------------------------------------+ +| 7 | ['2 & <75> -> <2>'] | ++--------+---------------------------------------------------------------------+ +| E | ['3 & -> <ЕВР>'] | ++--------+---------------------------------------------------------------------+ +| З | ['6 & <СЗВ> -> ', '3 & <БЗ> -> <653>', '3 & <ТЗР> -> ', | +| | '2 & <ВЗ> -> <РИ>'] | ++--------+---------------------------------------------------------------------+ +| ч | ['3 & <че-> -> <и»>'] | ++--------+---------------------------------------------------------------------+ +| : | ['2 & <:> -> '] | ++--------+---------------------------------------------------------------------+ +| [ | ['2 & <[> -> <(>'] | ++--------+---------------------------------------------------------------------+ +| ] | ['2 & <]> -> <)>'] | ++--------+---------------------------------------------------------------------+ +| 4 | ['1 & <4> -> <“>'] | ++--------+---------------------------------------------------------------------+ +| C | ['2 & <1C> -> ', '2 & <1C> -> <С>', '2 & -> <С>'] | ++--------+---------------------------------------------------------------------+ +| Б | ['3 & <БЗ> -> <653>'] | ++--------+---------------------------------------------------------------------+ +| Д | ['1 & <Д> -> <З>'] | ++--------+---------------------------------------------------------------------+ +| | | ['1 & <|> -> <1>'] | ++--------+---------------------------------------------------------------------+ +| Ц | ['1 & <Ц> -> <Т>'] | ++--------+---------------------------------------------------------------------+ +| ш | ['2 & <ш> -> <«Ч>', '1 & <ш> -> <ч>'] | ++--------+---------------------------------------------------------------------+ +| P | ['3 & -> <ЕВР>'] | ++--------+---------------------------------------------------------------------+ +| R | ['3 & -> <ЕВР>'] | ++--------+---------------------------------------------------------------------+ +| a | ['4 & -> <на>', '1 & -> <а>'] | ++--------+---------------------------------------------------------------------+ +| х | ['2 & <их> -> ', '2 & <их> -> '] | ++--------+---------------------------------------------------------------------+ +| — | ['1 & <—> -> <->'] | ++--------+---------------------------------------------------------------------+ +| G | ['2 & -> <С>'] | ++--------+---------------------------------------------------------------------+ +| H | ['4 & -> <на>', '2 & -> <Из>'] | ++--------+---------------------------------------------------------------------+ +| V | ['3 & -> <УП>'] | ++--------+---------------------------------------------------------------------+ +| m | ['2 & -> '] | ++--------+---------------------------------------------------------------------+ +| ф | ['3 & <фок> -> <М>', '1 & <ф> -> <Ф>'] | ++--------+---------------------------------------------------------------------+ +| ю | ['1 & <ю> -> <у>'] | ++--------+---------------------------------------------------------------------+ +| c | ['2 & -> <со>', '1 & -> <с>'] | ++--------+---------------------------------------------------------------------+ +| o | ['2 & -> <со>', '2 & -> '] | ++--------+---------------------------------------------------------------------+ +| Ю | ['2 & <Ю> -> <1 >'] | ++--------+---------------------------------------------------------------------+ +| ‚ | ['2 & < ‚> -> <,>'] | ++--------+---------------------------------------------------------------------+ +| Y | ['1 & -> <У>'] | ++--------+---------------------------------------------------------------------+ +| _ | ['1 & <_> -> <Х>'] | ++--------+---------------------------------------------------------------------+ +| d | ['1 & -> <4>'] | ++--------+---------------------------------------------------------------------+ +| e | ['2 & -> <Из>'] | ++--------+---------------------------------------------------------------------+ +| x | ['1 & -> <х>'] | ++--------+---------------------------------------------------------------------+ +| y | ['1 & -> <у>'] | ++--------+---------------------------------------------------------------------+ +| » | ['3 & <№1»> -> '] | ++--------+---------------------------------------------------------------------+ +| Г | ['2 & <Г.> -> <С>'] | ++--------+---------------------------------------------------------------------+ \ No newline at end of file diff --git a/resources/benchmarks/tesseract_benchmark_with_correction.txt b/resources/benchmarks/tesseract_benchmark_with_correction.txt new file mode 100644 index 00000000..2d8f79ad --- /dev/null +++ b/resources/benchmarks/tesseract_benchmark_with_correction.txt @@ -0,0 +1,259 @@ +Tesseract version is 5.0.0 +Correction step: True +Time mean correction ocr = 14.493645176743016 +Table 1 - Accuracy for each file ++---------------+---------------------+-------+-----------------+--------------+ +| Dataset | Image name | --psm | Amount of words | Accuracy OCR | ++===============+=====================+=======+=================+==============+ +| english-words | Kaspersky | 6 | 111 | 99.300 | ++---------------+---------------------+-------+-----------------+--------------+ +| english-words | USB | 6 | 4 | 80.900 | ++---------------+---------------------+-------+-----------------+--------------+ +| english-words | words1 | 6 | 19 | 100 | ++---------------+---------------------+-------+-----------------+--------------+ +| english-words | words2 | 6 | 9 | 100 | ++---------------+---------------------+-------+-----------------+--------------+ +| english-words | words3 | 6 | 9 | 100 | ++---------------+---------------------+-------+-----------------+--------------+ +| others | Zaklyuchenie_nevrol | 4 | 525 | 83 | +| | oga_00 | | | | ++---------------+---------------------+-------+-----------------+--------------+ +| others | Zaklyuchenie_nevrol | 4 | 241 | 87 | +| | oga_01 | | | | ++---------------+---------------------+-------+-----------------+--------------+ +| others | napalm_doc_2_2_6 | 4 | 124 | 85 | ++---------------+---------------------+-------+-----------------+--------------+ +| tz-npa | 1.620e+14 | 4 | 695 | 99.600 | ++---------------+---------------------+-------+-----------------+--------------+ +| tz-npa | 1.620e+14 | 4 | 696 | 99.600 | ++---------------+---------------------+-------+-----------------+--------------+ +| tz-npa | 1.620e+14 | 4 | 699 | 99.400 | ++---------------+---------------------+-------+-----------------+--------------+ +| tz-npa | article_multiline | 4 | 471 | 99.900 | ++---------------+---------------------+-------+-----------------+--------------+ +| tz-npa | fstek17_00 | 4 | 192 | 92.300 | ++---------------+---------------------+-------+-----------------+--------------+ +| tz-npa | fstek17_01 | 4 | 332 | 99.600 | ++---------------+---------------------+-------+-----------------+--------------+ +| tz-npa | law_image | 4 | 182 | 99.500 | ++---------------+---------------------+-------+-----------------+--------------+ +| tz-npa | napalm_doc_13_2 | 4 | 243 | 96.700 | ++---------------+---------------------+-------+-----------------+--------------+ +| tz-npa | ukaz_prezidenta_1 | 4 | 264 | 98.800 | ++---------------+---------------------+-------+-----------------+--------------+ +| tz-npa | ukodeksrf_00 | 4 | 287 | 99.900 | ++---------------+---------------------+-------+-----------------+--------------+ +| tz-npa | ukodeksrf_01 | 4 | 340 | 99.500 | ++---------------+---------------------+-------+-----------------+--------------+ +| tz-npa | with_applications_0 | 4 | 146 | 94.400 | +| | 0 | | | | ++---------------+---------------------+-------+-----------------+--------------+ +| tz-npa | with_applications_0 | 4 | 276 | 98.800 | +| | 1 | | | | ++---------------+---------------------+-------+-----------------+--------------+ +| tz-npa | with_applications_0 | 4 | 165 | 98.500 | +| | 2 | | | | ++---------------+---------------------+-------+-----------------+--------------+ +| tz-npa | with_applications_0 | 4 | 90 | 99.400 | +| | 3 | | | | ++---------------+---------------------+-------+-----------------+--------------+ +| tz-npa | ТЗ_00 | 4 | 78 | 97.400 | ++---------------+---------------------+-------+-----------------+--------------+ +| tz-npa | ТЗ_01 | 4 | 296 | 98 | ++---------------+---------------------+-------+-----------------+--------------+ +| tz-npa | ТЗ_02 | 4 | 309 | 98.800 | ++---------------+---------------------+-------+-----------------+--------------+ +| tz-npa | ТЗ_03 | 4 | 337 | 98.300 | ++---------------+---------------------+-------+-----------------+--------------+ +| tz-npa | ТЗ_04 | 4 | 257 | 96.300 | ++---------------+---------------------+-------+-----------------+--------------+ +| tz-npa | ТЗ_05 | 4 | 238 | 97.800 | ++---------------+---------------------+-------+-----------------+--------------+ +| tz-npa | ТЗ_06 | 4 | 219 | 93.500 | ++---------------+---------------------+-------+-----------------+--------------+ +| tz-npa | ТЗ_07 | 4 | 233 | 98.500 | ++---------------+---------------------+-------+-----------------+--------------+ +| tz-npa | ТЗ_08 | 4 | 284 | 95.900 | ++---------------+---------------------+-------+-----------------+--------------+ +| tz-npa | ТЗ_09 | 4 | 154 | 97.600 | ++---------------+---------------------+-------+-----------------+--------------+ + +Table 2 - AVG by each type of symbols: ++--------+--------+--------+--------+--------+--------+--------+-------+-------+ +| Datase | ASCII_ | ASCII_ | ASCII_ | ASCII_ | Latin1 | Cyrill | Amoun | AVG A | +| t | Spacin | Specia | Digits | Upperc | _Speci | ic | t of | ccura | +| | g_Char | l_Symb | | ase_Ch | al_Sym | | words | cy | +| | s | ols | | ars | bols | | | | ++========+========+========+========+========+========+========+=======+=======+ +| englis | 94.820 | 99.333 | 100 | 0 | 0 | 94.540 | 152 | 96.04 | +| h- | | | | | | | | 0 | +| words | | | | | | | | | ++--------+--------+--------+--------+--------+--------+--------+-------+-------+ +| others | 89.767 | 77.100 | 89.533 | 0 | 0 | 86.433 | 890 | 85 | ++--------+--------+--------+--------+--------+--------+--------+-------+-------+ +| tz-npa | 98.956 | 90.920 | 92.104 | 0 | 0 | 99.488 | 7483 | 97.92 | +| | | | | | | | | 0 | ++--------+--------+--------+--------+--------+--------+--------+-------+-------+ + +Table 3 -OCR error by symbol: ++--------+---------------------------------------------------------------------+ +| Symbol | Cnt Errors & Correct-Generated | ++========+=====================================================================+ +| | ['3 & <. №> -> < No>', '2 & < г> -> <К>', '2 & < ‚> -> <,>', "2 & | +| | <1 > -> <'>", '2 & <и > -> <н>', '2 & <№ > -> '] | ++--------+---------------------------------------------------------------------+ +| . | ['4 & <.> -> <,>', '3 & <. №> -> < No>', '3 & <3.> -> < De>', '2 & | +| | <г.> -> <ГТ>'] | ++--------+---------------------------------------------------------------------+ +| , | ['66 & <,> -> <.>', '3 & <ва,> -> <нь>'] | ++--------+---------------------------------------------------------------------+ +| 1 | ['4 & <1С> -> ', "3 & <1> -> <'>", '3 & <1> -> <3>', '3 & <№1> | +| | -> ', '3 & <№1»> -> ', "2 & <1 > -> <'>", '2 & <1C> -> | +| | ', '2 & <1C> -> <С>', '2 & <1> -> <2>', '2 & <1> -> ', '1 & | +| | <1> -> <5>', '1 & <1> -> <Г>', '1 & <1> -> <С>', '1 & <1> -> <Т>'] | ++--------+---------------------------------------------------------------------+ +| е | ['2 & <е> -> <и>', '2 & <е> -> <ё>', '2 & <ле> -> <У>', '2 & <не> | +| | -> ', '1 & <е> -> <о>'] | ++--------+---------------------------------------------------------------------+ +| и | ['4 & <и> -> <е>', '3 & <тип> -> ', '2 & <и > -> <н>', '2 & | +| | <ис> -> <не>', '2 & <си> -> <ен>', '1 & <и> -> <В>', '1 & <и> -> | +| | <а>', '1 & <и> -> <ь>'] | ++--------+---------------------------------------------------------------------+ +| а | ['4 & <а> -> <о>', '3 & <ва,> -> <нь>', '3 & <на> -> <под>', '1 & | +| | <а> -> <Б>', '1 & <а> -> <е>', '1 & <а> -> <у>'] | ++--------+---------------------------------------------------------------------+ +| № | ['80 & <№> -> ', '6 & <№> -> ', '3 & <. №> -> < No>', '3 & | +| | <№1> -> ', '3 & <№1»> -> ', '2 & <№ > -> '] | ++--------+---------------------------------------------------------------------+ +| н | ['3 & <на> -> <под>', '2 & <не> -> ', '1 & <н> -> <й>'] | ++--------+---------------------------------------------------------------------+ +| о | ['3 & <фок> -> <М>', '2 & <о> -> <у>', '2 & <об> -> <бы>', '2 & | +| | <то> -> ', '1 & <о> -> <в>', '1 & <о> -> <я>'] | ++--------+---------------------------------------------------------------------+ +| 2 | ['2 & <28> -> ', '2 & <28> -> <ИР>', '2 & <28> -> <Я>'] | ++--------+---------------------------------------------------------------------+ +| л | ['2 & <ле> -> <У>', '1 & <л> -> <Л>', '1 & <л> -> <д>', '1 & <л> -> | +| | <т>'] | ++--------+---------------------------------------------------------------------+ +| т | ['3 & <тип> -> ', '2 & <т> -> <г>', '2 & <то> -> '] | ++--------+---------------------------------------------------------------------+ +| р | ['3 & <гр> -> <тав>', '2 & <гр> -> '] | ++--------+---------------------------------------------------------------------+ +| 3 | ['3 & <3.> -> < De>', '1 & <3> -> '] | ++--------+---------------------------------------------------------------------+ +| N | ['22 & -> <М>'] | ++--------+---------------------------------------------------------------------+ +| С | ['6 & <СЗВ> -> ', '4 & <1С> -> ', '3 & <ОС> -> ', '3 | +| | & <С> -> ', '2 & <ОС> -> '] | ++--------+---------------------------------------------------------------------+ +| г | ['3 & <гр> -> <тав>', '2 & < г> -> <К>', '2 & <г.> -> <ГТ>', '2 & | +| | <г> -> <т>', '2 & <гр> -> '] | ++--------+---------------------------------------------------------------------+ +| с | ['2 & <ис> -> <не>', '2 & <си> -> <ен>', '1 & <с> -> '] | ++--------+---------------------------------------------------------------------+ +| в | ['3 & <ва,> -> <нь>', '2 & <в> -> <м>', '2 & <в> -> <по>', '1 & <в> | +| | -> <В>'] | ++--------+---------------------------------------------------------------------+ +| И | ['2 & <И> -> <АН>', '1 & <И> -> <В>', '1 & <И> -> <Й>'] | ++--------+---------------------------------------------------------------------+ +| Е | ['2 & <ЕМ> -> <Ш>'] | ++--------+---------------------------------------------------------------------+ +| Н | ['2 & <Н> -> <ЕМ>', '1 & <Н> -> <И>'] | ++--------+---------------------------------------------------------------------+ +| О | ['3 & <ОС> -> ', '2 & <ОС> -> ', '2 & <Об> -> <06>', '1 & | +| | <О> -> <Ю>', '1 & <О> -> <о>'] | ++--------+---------------------------------------------------------------------+ +| Т | ['3 & <МРТ> -> ', '3 & <Т> -> <Г>', '3 & <ТЗР> -> '] | ++--------+---------------------------------------------------------------------+ +| П | ['1 & <П> -> <И>', '1 & <П> -> <К>', '1 & <П> -> <п>'] | ++--------+---------------------------------------------------------------------+ +| - | ['2 & <-> -> <ры>'] | ++--------+---------------------------------------------------------------------+ +| 0 | ['3 & <608> -> '] | ++--------+---------------------------------------------------------------------+ +| у | ['2 & <у> -> <ы>'] | ++--------+---------------------------------------------------------------------+ +| 6 | ['3 & <608> -> '] | ++--------+---------------------------------------------------------------------+ +| I | ['3 & -> <Ш>', '3 & -> <УП>'] | ++--------+---------------------------------------------------------------------+ +| В | ['6 & <СЗВ> -> ', '2 & <ВЗ> -> <РИ>'] | ++--------+---------------------------------------------------------------------+ +| Р | ['3 & <МРТ> -> ', '3 & <ТЗР> -> '] | ++--------+---------------------------------------------------------------------+ +| п | ['3 & <тип> -> '] | ++--------+---------------------------------------------------------------------+ +| М | ['3 & <МРТ> -> ', '2 & <ЕМ> -> <Ш>'] | ++--------+---------------------------------------------------------------------+ +| б | ['2 & <Об> -> <06>', '2 & <об> -> <бы>'] | ++--------+---------------------------------------------------------------------+ +| к | ['3 & <фок> -> <М>'] | ++--------+---------------------------------------------------------------------+ +| 5 | ['2 & <75> -> <2>'] | ++--------+---------------------------------------------------------------------+ +| ; | ['8 & <;> -> <:>'] | ++--------+---------------------------------------------------------------------+ +| ы | ['1 & <ы> -> <б>'] | ++--------+---------------------------------------------------------------------+ +| 8 | ['3 & <608> -> ', '2 & <28> -> ', '2 & <28> -> <ИР>', '2 & | +| | <28> -> <Я>'] | ++--------+---------------------------------------------------------------------+ +| E | ['3 & -> <ЕВР>'] | ++--------+---------------------------------------------------------------------+ +| З | ['6 & <СЗВ> -> ', '3 & <БЗ> -> <653>', '3 & <ТЗР> -> ', | +| | '2 & <ВЗ> -> <РИ>'] | ++--------+---------------------------------------------------------------------+ +| ц | ['1 & <ц> -> <С>', '1 & <ц> -> <щ>'] | ++--------+---------------------------------------------------------------------+ +| 7 | ['2 & <75> -> <2>'] | ++--------+---------------------------------------------------------------------+ +| C | ['2 & <1C> -> ', '2 & <1C> -> <С>', '2 & -> <С>'] | ++--------+---------------------------------------------------------------------+ +| Б | ['3 & <БЗ> -> <653>'] | ++--------+---------------------------------------------------------------------+ +| Д | ['1 & <Д> -> <З>'] | ++--------+---------------------------------------------------------------------+ +| й | ['2 & <й> -> <е:>'] | ++--------+---------------------------------------------------------------------+ +| | | ['1 & <|> -> <1>'] | ++--------+---------------------------------------------------------------------+ +| Ц | ['1 & <Ц> -> <Т>'] | ++--------+---------------------------------------------------------------------+ +| P | ['3 & -> <ЕВР>'] | ++--------+---------------------------------------------------------------------+ +| R | ['3 & -> <ЕВР>'] | ++--------+---------------------------------------------------------------------+ +| a | ['4 & -> <на>', '1 & -> <а>'] | ++--------+---------------------------------------------------------------------+ +| G | ['2 & -> <С>'] | ++--------+---------------------------------------------------------------------+ +| H | ['4 & -> <на>', '2 & -> <Из>'] | ++--------+---------------------------------------------------------------------+ +| V | ['3 & -> <УП>'] | ++--------+---------------------------------------------------------------------+ +| m | ['2 & -> '] | ++--------+---------------------------------------------------------------------+ +| Ю | ['2 & <Ю> -> <1 >'] | ++--------+---------------------------------------------------------------------+ +| ф | ['3 & <фок> -> <М>'] | ++--------+---------------------------------------------------------------------+ +| ‚ | ['2 & < ‚> -> <,>'] | ++--------+---------------------------------------------------------------------+ +| Y | ['1 & -> <У>'] | ++--------+---------------------------------------------------------------------+ +| _ | ['1 & <_> -> <Х>'] | ++--------+---------------------------------------------------------------------+ +| c | ['1 & -> <с>'] | ++--------+---------------------------------------------------------------------+ +| d | ['1 & -> <4>'] | ++--------+---------------------------------------------------------------------+ +| e | ['2 & -> <Из>'] | ++--------+---------------------------------------------------------------------+ +| o | ['2 & -> '] | ++--------+---------------------------------------------------------------------+ +| y | ['1 & -> <у>'] | ++--------+---------------------------------------------------------------------+ +| » | ['3 & <№1»> -> '] | ++--------+---------------------------------------------------------------------+ +| ю | ['1 & <ю> -> <у>'] | ++--------+---------------------------------------------------------------------+ \ No newline at end of file diff --git a/scripts/calc_tesseract_benchmarks.py b/scripts/calc_tesseract_benchmarks.py index 69229b55..ca259d87 100644 --- a/scripts/calc_tesseract_benchmarks.py +++ b/scripts/calc_tesseract_benchmarks.py @@ -1,5 +1,6 @@ import os import re +import time import zipfile from tempfile import TemporaryDirectory from typing import Dict, List, Tuple @@ -11,6 +12,14 @@ from texttable import Texttable from dedoc.config import get_config +from dedoc.scripts.text_blob_correction import TextBlobCorrector +from scripts.ocr_correction import correction, init_correction_step + +WITHOUT_CORRECTION = "" +SAGE_CORRECTION = "_sage-correction" +TEXT_BLOB_CORRECTION = "_textblob-correction" + +USE_CORRECTION_OCR = TEXT_BLOB_CORRECTION def _call_tesseract(image: np.ndarray, language: str, psm: int = 3) -> str: @@ -169,9 +178,28 @@ def __create_statistic_tables(statistics: dict, accuracy_values: List) -> Tuple[ return table_common, table_accuracy_per_image -def __calculate_ocr_reports(cache_dir_accuracy: str, benchmark_data_path: str) -> Tuple[Texttable, Texttable]: +def calculate_accuracy_script(tmp_gt_path: str, tmp_prediction_path: str, accuracy_path: str) -> None: + # calculation accuracy build for Ubuntu from source https://github.com/eddieantonio/ocreval + accuracy_script_path = os.path.abspath(os.path.join(os.path.dirname(__file__), "accuracy")) + command = f"{accuracy_script_path} {tmp_gt_path} {tmp_prediction_path} >> {accuracy_path}" + os.system(command) + + +def __calculate_ocr_reports(cache_dir_accuracy: str, benchmark_data_path: str, cache_dir: str) -> Tuple[Texttable, Texttable]: statistics = {} accuracy_values = [] + correction_times = [] + + result_dir = os.path.join(cache_dir, "result_ocr") + os.makedirs(result_dir, exist_ok=True) + + corrector, corrected_path = None, None + if USE_CORRECTION_OCR == SAGE_CORRECTION: + corrector, corrected_path = init_correction_step(cache_dir) + elif USE_CORRECTION_OCR == TEXT_BLOB_CORRECTION: + corrector = TextBlobCorrector() + corrected_path = os.path.join(cache_dir, "result_corrected") + os.makedirs(corrected_path, exist_ok=True) with zipfile.ZipFile(benchmark_data_path, "r") as arch_file: names_dirs = [member.filename for member in arch_file.infolist() if member.file_size > 0] @@ -191,41 +219,61 @@ def __calculate_ocr_reports(cache_dir_accuracy: str, benchmark_data_path: str) - gt_path = os.path.join(base_zip, dataset_name, "gts", f"{base_name}.txt") imgs_path = os.path.join(base_zip, dataset_name, "imgs", img_name) accuracy_path = os.path.join(cache_dir_accuracy, f"{dataset_name}_{base_name}_accuracy.txt") - - with TemporaryDirectory() as tmpdir: - tmp_gt_path = os.path.join(tmpdir, "tmp_gt.txt") - tmp_ocr_path = os.path.join(tmpdir, "tmp_ocr.txt") - - try: - with arch_file.open(gt_path) as gt_file, open(tmp_gt_path, "wb") as tmp_gt_file, open(tmp_ocr_path, "w") as tmp_ocr_file: - - gt_text = gt_file.read().decode("utf-8") - word_cnt = len(gt_text.split()) - - tmp_gt_file.write(gt_text.encode()) # extraction gt from zip - tmp_gt_file.flush() - - arch_file.extract(imgs_path, tmpdir) - image = cv2.imread(tmpdir + "/" + imgs_path) - - # call ocr - psm = 6 if dataset_name == "english-words" else 4 - text = _call_tesseract(image, "rus+eng", psm=psm) - tmp_ocr_file.write(text) - tmp_ocr_file.flush() - - # calculation accuracy build for Ubuntu from source https://github.com/eddieantonio/ocreval - accuracy_script_path = os.path.abspath(os.path.join(os.path.dirname(__file__), "accuracy")) - command = f"{accuracy_script_path} {tmp_gt_path} {tmp_ocr_path} >> {accuracy_path}" - os.system(command) - - statistics = _update_statistics_by_dataset(statistics, dataset_name, accuracy_path, word_cnt) - accuracy_values.append([dataset_name, base_name, psm, word_cnt, statistics[dataset_name]["Accuracy"][-1]]) - - except Exception as ex: - print(ex) - print("If you have problems with libutf8proc.so.2, try the command: `apt install -y libutf8proc-dev`") - + if os.path.exists(accuracy_path): + os.remove(accuracy_path) + + tmp_gt_path = os.path.join(result_dir, f"{img_name}_gt.txt") + tmp_ocr_path = os.path.join(result_dir, f"{img_name}_ocr.txt") + + try: + with arch_file.open(gt_path) as gt_file, open(tmp_gt_path, "wb") as tmp_gt_file, open(tmp_ocr_path, "w") as tmp_ocr_file: + + gt_text = gt_file.read().decode("utf-8") + word_cnt = len(gt_text.split()) + + tmp_gt_file.write(gt_text.encode()) # extraction gt from zip + tmp_gt_file.close() + + arch_file.extract(imgs_path, result_dir) + image = cv2.imread(result_dir + "/" + imgs_path) + + # call ocr + psm = 6 if dataset_name == "english-words" else 4 + text = _call_tesseract(image, "rus+eng", psm=psm) + tmp_ocr_file.write(text) + tmp_ocr_file.close() + + # call correction step + time_b = time.time() + if USE_CORRECTION_OCR == SAGE_CORRECTION: + tmp_corrected_path = os.path.join(corrected_path, f"{img_name}_ocr.txt") + corrected_text = correction(corrector, text) + correction_times.append(time.time() - time_b) + with open(tmp_corrected_path, "w") as tmp_corrected_file: + tmp_corrected_file.write(corrected_text) + tmp_corrected_file.close() + + calculate_accuracy_script(tmp_gt_path, tmp_corrected_path, accuracy_path) + elif USE_CORRECTION_OCR == TEXT_BLOB_CORRECTION: + tmp_corrected_path = os.path.join(corrected_path, f"{img_name}_ocr.txt") + corrected_text = corrector.correct(text) + correction_times.append(time.time() - time_b) + with open(tmp_corrected_path, "w") as tmp_corrected_file: + tmp_corrected_file.write(corrected_text) + tmp_corrected_file.close() + + calculate_accuracy_script(tmp_gt_path, tmp_corrected_path, accuracy_path) + else: + calculate_accuracy_script(tmp_gt_path, tmp_ocr_path, accuracy_path) + + statistics = _update_statistics_by_dataset(statistics, dataset_name, accuracy_path, word_cnt) + accuracy_values.append([dataset_name, base_name, psm, word_cnt, statistics[dataset_name]["Accuracy"][-1]]) + + except Exception as ex: + print(ex) + print("If you have problems with libutf8proc.so.2, try the command: `apt install -y libutf8proc-dev`") + + print(f"Time mean correction ocr = {np.array(correction_times).mean()}") table_common, table_accuracy_per_image = __create_statistic_tables(statistics, accuracy_values) return table_common, table_accuracy_per_image @@ -240,18 +288,20 @@ def __calculate_ocr_reports(cache_dir_accuracy: str, benchmark_data_path: str) - benchmark_data_path = os.path.join(cache_dir, f"{base_zip}.zip") if not os.path.isfile(benchmark_data_path): - wget.download("https://at.ispras.ru/owncloud/index.php/s/HqKt53BWmR8nCVG/download", benchmark_data_path) + wget.download("https://at.ispras.ru/owncloud/index.php/s/wMyKioKInYITpYT", benchmark_data_path) print(f"Benchmark data downloaded to {benchmark_data_path}") else: print(f"Use cached benchmark data from {benchmark_data_path}") assert os.path.isfile(benchmark_data_path) - table_common, table_accuracy_per_image = __calculate_ocr_reports(cache_dir_accuracy, benchmark_data_path) + table_common, table_accuracy_per_image = __calculate_ocr_reports(cache_dir_accuracy, benchmark_data_path, cache_dir) table_errors = __get_summary_symbol_error(path_reports=cache_dir_accuracy) - with open(os.path.join(output_dir, "tesseract_benchmark.txt"), "w") as res_file: - res_file.write(f"Tesseract version is {pytesseract.get_tesseract_version()}\nTable 1 - Accuracy for each file\n") + with open(os.path.join(output_dir, f"tesseract_benchmark{USE_CORRECTION_OCR}.txt"), "w") as res_file: + res_file.write(f"Tesseract version is {pytesseract.get_tesseract_version()}\n") + res_file.write(f"Correction step: {USE_CORRECTION_OCR}\n") + res_file.write(f"\nTable 1 - Accuracy for each file\n") res_file.write(table_accuracy_per_image.draw()) res_file.write(f"\n\nTable 2 - AVG by each type of symbols:\n") res_file.write(table_common.draw()) diff --git a/scripts/language_tool_correction.py b/scripts/language_tool_correction.py new file mode 100644 index 00000000..e69de29b diff --git a/scripts/ocr_correction.py b/scripts/ocr_correction.py new file mode 100644 index 00000000..ada563e2 --- /dev/null +++ b/scripts/ocr_correction.py @@ -0,0 +1,43 @@ +import os +from typing import Tuple + +import torch +from sage.spelling_correction.corrector import Corrector +from sage.spelling_correction import AvailableCorrectors +from sage.spelling_correction import RuM2M100ModelForSpellingCorrection + +''' +Install sage library (for ocr correction step): +git clone https://github.com/ai-forever/sage.git +cd sage +pip install . +pip install -r requirements.txt + +Note: sage use 5.2 Gb GPU ...... +''' +USE_GPU = True + + +def correction(model: Corrector, ocr_text: str) -> str: + + corrected_lines = [] + for line in ocr_text.split("\n"): + corrected_lines.append(model.correct(line)[0]) + corrected_text = "\n".join(corrected_lines) + + return corrected_text + + +def init_correction_step(cache_dir: str) -> Tuple[Corrector, str]: + + corrected_path = os.path.join(cache_dir, "result_corrected") + os.makedirs(corrected_path, exist_ok=True) + corrector = RuM2M100ModelForSpellingCorrection.from_pretrained(AvailableCorrectors.m2m100_1B.value) # 4.49 Gb model (pytorch_model.bin) + if torch.cuda.is_available() and USE_GPU: + corrector.model.to(torch.device("cuda:0")) + print("use CUDA") + else: + print("use CPU") + return corrector, corrected_path + + diff --git a/scripts/text_blob_correction.py b/scripts/text_blob_correction.py new file mode 100644 index 00000000..8ecf8be6 --- /dev/null +++ b/scripts/text_blob_correction.py @@ -0,0 +1,9 @@ +from textblob import TextBlob + + +class TextBlobCorrector: + def __init__(self): + return + + def correct(self, text: str) -> str: + return str(TextBlob(text).correct()) From e6c70c9eccb468fc56e19c882ecb73508b230429 Mon Sep 17 00:00:00 2001 From: Nasty Date: Fri, 26 Jan 2024 18:03:19 +0300 Subject: [PATCH 2/4] Remove unused files --- dedoc/scripts/language_tool_correction.py | 0 dedoc/scripts/text_blob_correction.py | 9 --------- scripts/calc_tesseract_benchmarks.py | 3 +-- scripts/language_tool_correction.py | 0 4 files changed, 1 insertion(+), 11 deletions(-) delete mode 100644 dedoc/scripts/language_tool_correction.py delete mode 100644 dedoc/scripts/text_blob_correction.py delete mode 100644 scripts/language_tool_correction.py diff --git a/dedoc/scripts/language_tool_correction.py b/dedoc/scripts/language_tool_correction.py deleted file mode 100644 index e69de29b..00000000 diff --git a/dedoc/scripts/text_blob_correction.py b/dedoc/scripts/text_blob_correction.py deleted file mode 100644 index 8ecf8be6..00000000 --- a/dedoc/scripts/text_blob_correction.py +++ /dev/null @@ -1,9 +0,0 @@ -from textblob import TextBlob - - -class TextBlobCorrector: - def __init__(self): - return - - def correct(self, text: str) -> str: - return str(TextBlob(text).correct()) diff --git a/scripts/calc_tesseract_benchmarks.py b/scripts/calc_tesseract_benchmarks.py index ca259d87..326cc9db 100644 --- a/scripts/calc_tesseract_benchmarks.py +++ b/scripts/calc_tesseract_benchmarks.py @@ -2,7 +2,6 @@ import re import time import zipfile -from tempfile import TemporaryDirectory from typing import Dict, List, Tuple import cv2 @@ -12,8 +11,8 @@ from texttable import Texttable from dedoc.config import get_config -from dedoc.scripts.text_blob_correction import TextBlobCorrector from scripts.ocr_correction import correction, init_correction_step +from scripts.text_blob_correction import TextBlobCorrector WITHOUT_CORRECTION = "" SAGE_CORRECTION = "_sage-correction" diff --git a/scripts/language_tool_correction.py b/scripts/language_tool_correction.py deleted file mode 100644 index e69de29b..00000000 From 152036c3a7886b4a110827628150b949167380e8 Mon Sep 17 00:00:00 2001 From: sunveil Date: Wed, 31 Jan 2024 14:19:02 +0800 Subject: [PATCH 3/4] Resolve comments --- requirements.txt | 3 +- ...sseract_benchmark_textblob-correction.txt} | 313 +++++++++++------- scripts/accsum | Bin 39280 -> 42728 bytes scripts/accuracy | Bin 48512 -> 51960 bytes .../calc_tesseract_benchmarks.py | 32 +- .../ocr_correction.py | 0 scripts/tesseract_benchmark/requirements.txt | 1 + .../text_blob_correction.py | 0 8 files changed, 202 insertions(+), 147 deletions(-) rename resources/benchmarks/{tesseract_benchmark_with_correction.txt => tesseract_benchmark_textblob-correction.txt} (53%) rename scripts/{ => tesseract_benchmark}/calc_tesseract_benchmarks.py (91%) rename scripts/{ => tesseract_benchmark}/ocr_correction.py (100%) create mode 100644 scripts/tesseract_benchmark/requirements.txt rename scripts/{ => tesseract_benchmark}/text_blob_correction.py (100%) diff --git a/requirements.txt b/requirements.txt index 41f0c60c..1ddb72e8 100644 --- a/requirements.txt +++ b/requirements.txt @@ -37,5 +37,4 @@ uvicorn>=0.18.0,<=0.23.2 wget==3.2 xgbfir==0.3.1 xgboost>=1.1.1,<1.2.0 -xlrd==1.2.0 -textblob==0.17.1 \ No newline at end of file +xlrd==1.2.0 \ No newline at end of file diff --git a/resources/benchmarks/tesseract_benchmark_with_correction.txt b/resources/benchmarks/tesseract_benchmark_textblob-correction.txt similarity index 53% rename from resources/benchmarks/tesseract_benchmark_with_correction.txt rename to resources/benchmarks/tesseract_benchmark_textblob-correction.txt index 2d8f79ad..2de957a5 100644 --- a/resources/benchmarks/tesseract_benchmark_with_correction.txt +++ b/resources/benchmarks/tesseract_benchmark_textblob-correction.txt @@ -1,81 +1,81 @@ -Tesseract version is 5.0.0 -Correction step: True -Time mean correction ocr = 14.493645176743016 +Tesseract version is 4.1.1 +Correction step: _textblob-correction + Table 1 - Accuracy for each file +---------------+---------------------+-------+-----------------+--------------+ | Dataset | Image name | --psm | Amount of words | Accuracy OCR | +===============+=====================+=======+=================+==============+ -| english-words | Kaspersky | 6 | 111 | 99.300 | +| english-words | Kaspersky | 6 | 111 | 73.400 | +---------------+---------------------+-------+-----------------+--------------+ -| english-words | USB | 6 | 4 | 80.900 | +| english-words | USB | 6 | 4 | 47.600 | +---------------+---------------------+-------+-----------------+--------------+ -| english-words | words1 | 6 | 19 | 100 | +| english-words | words1 | 6 | 19 | 66.900 | +---------------+---------------------+-------+-----------------+--------------+ -| english-words | words2 | 6 | 9 | 100 | +| english-words | words2 | 6 | 9 | 72.700 | +---------------+---------------------+-------+-----------------+--------------+ -| english-words | words3 | 6 | 9 | 100 | +| english-words | words3 | 6 | 9 | 61.800 | +---------------+---------------------+-------+-----------------+--------------+ -| others | Zaklyuchenie_nevrol | 4 | 525 | 83 | +| others | Zaklyuchenie_nevrol | 4 | 525 | 80.200 | | | oga_00 | | | | +---------------+---------------------+-------+-----------------+--------------+ | others | Zaklyuchenie_nevrol | 4 | 241 | 87 | | | oga_01 | | | | +---------------+---------------------+-------+-----------------+--------------+ -| others | napalm_doc_2_2_6 | 4 | 124 | 85 | +| others | napalm_doc_2_2_6 | 4 | 124 | 84.400 | +---------------+---------------------+-------+-----------------+--------------+ -| tz-npa | 1.620e+14 | 4 | 695 | 99.600 | +| tz-npa | 1.620e+14 | 4 | 695 | 98.100 | +---------------+---------------------+-------+-----------------+--------------+ -| tz-npa | 1.620e+14 | 4 | 696 | 99.600 | +| tz-npa | 1.620e+14 | 4 | 696 | 98.100 | +---------------+---------------------+-------+-----------------+--------------+ -| tz-npa | 1.620e+14 | 4 | 699 | 99.400 | +| tz-npa | 1.620e+14 | 4 | 699 | 97.900 | +---------------+---------------------+-------+-----------------+--------------+ -| tz-npa | article_multiline | 4 | 471 | 99.900 | +| tz-npa | article_multiline | 4 | 471 | 98.400 | +---------------+---------------------+-------+-----------------+--------------+ -| tz-npa | fstek17_00 | 4 | 192 | 92.300 | +| tz-npa | fstek17_00 | 4 | 192 | 91.700 | +---------------+---------------------+-------+-----------------+--------------+ -| tz-npa | fstek17_01 | 4 | 332 | 99.600 | +| tz-npa | fstek17_01 | 4 | 332 | 97.500 | +---------------+---------------------+-------+-----------------+--------------+ -| tz-npa | law_image | 4 | 182 | 99.500 | +| tz-npa | law_image | 4 | 182 | 99 | +---------------+---------------------+-------+-----------------+--------------+ -| tz-npa | napalm_doc_13_2 | 4 | 243 | 96.700 | +| tz-npa | napalm_doc_13_2 | 4 | 243 | 95.900 | +---------------+---------------------+-------+-----------------+--------------+ -| tz-npa | ukaz_prezidenta_1 | 4 | 264 | 98.800 | +| tz-npa | ukaz_prezidenta_1 | 4 | 264 | 97.100 | +---------------+---------------------+-------+-----------------+--------------+ -| tz-npa | ukodeksrf_00 | 4 | 287 | 99.900 | +| tz-npa | ukodeksrf_00 | 4 | 287 | 98.200 | +---------------+---------------------+-------+-----------------+--------------+ -| tz-npa | ukodeksrf_01 | 4 | 340 | 99.500 | +| tz-npa | ukodeksrf_01 | 4 | 340 | 97.200 | +---------------+---------------------+-------+-----------------+--------------+ -| tz-npa | with_applications_0 | 4 | 146 | 94.400 | +| tz-npa | with_applications_0 | 4 | 146 | 94.900 | | | 0 | | | | +---------------+---------------------+-------+-----------------+--------------+ -| tz-npa | with_applications_0 | 4 | 276 | 98.800 | +| tz-npa | with_applications_0 | 4 | 276 | 98.700 | | | 1 | | | | +---------------+---------------------+-------+-----------------+--------------+ -| tz-npa | with_applications_0 | 4 | 165 | 98.500 | +| tz-npa | with_applications_0 | 4 | 165 | 98.700 | | | 2 | | | | +---------------+---------------------+-------+-----------------+--------------+ -| tz-npa | with_applications_0 | 4 | 90 | 99.400 | +| tz-npa | with_applications_0 | 4 | 90 | 99.100 | | | 3 | | | | +---------------+---------------------+-------+-----------------+--------------+ -| tz-npa | ТЗ_00 | 4 | 78 | 97.400 | +| tz-npa | ТЗ_00 | 4 | 78 | 91.900 | +---------------+---------------------+-------+-----------------+--------------+ -| tz-npa | ТЗ_01 | 4 | 296 | 98 | +| tz-npa | ТЗ_01 | 4 | 296 | 94.600 | +---------------+---------------------+-------+-----------------+--------------+ -| tz-npa | ТЗ_02 | 4 | 309 | 98.800 | +| tz-npa | ТЗ_02 | 4 | 309 | 96.700 | +---------------+---------------------+-------+-----------------+--------------+ -| tz-npa | ТЗ_03 | 4 | 337 | 98.300 | +| tz-npa | ТЗ_03 | 4 | 337 | 95.500 | +---------------+---------------------+-------+-----------------+--------------+ -| tz-npa | ТЗ_04 | 4 | 257 | 96.300 | +| tz-npa | ТЗ_04 | 4 | 257 | 94.600 | +---------------+---------------------+-------+-----------------+--------------+ -| tz-npa | ТЗ_05 | 4 | 238 | 97.800 | +| tz-npa | ТЗ_05 | 4 | 238 | 96.600 | +---------------+---------------------+-------+-----------------+--------------+ -| tz-npa | ТЗ_06 | 4 | 219 | 93.500 | +| tz-npa | ТЗ_06 | 4 | 219 | 95.800 | +---------------+---------------------+-------+-----------------+--------------+ -| tz-npa | ТЗ_07 | 4 | 233 | 98.500 | +| tz-npa | ТЗ_07 | 4 | 233 | 96.400 | +---------------+---------------------+-------+-----------------+--------------+ -| tz-npa | ТЗ_08 | 4 | 284 | 95.900 | +| tz-npa | ТЗ_08 | 4 | 284 | 94.300 | +---------------+---------------------+-------+-----------------+--------------+ -| tz-npa | ТЗ_09 | 4 | 154 | 97.600 | +| tz-npa | ТЗ_09 | 4 | 154 | 93.700 | +---------------+---------------------+-------+-----------------+--------------+ Table 2 - AVG by each type of symbols: @@ -85,175 +85,234 @@ Table 2 - AVG by each type of symbols: | | g_Char | l_Symb | | ase_Ch | al_Sym | | words | cy | | | s | ols | | ars | bols | | | | +========+========+========+========+========+========+========+=======+=======+ -| englis | 94.820 | 99.333 | 100 | 0 | 0 | 94.540 | 152 | 96.04 | +| englis | 100 | 99.333 | 100 | 0 | 0 | 60.680 | 152 | 64.48 | | h- | | | | | | | | 0 | | words | | | | | | | | | +--------+--------+--------+--------+--------+--------+--------+-------+-------+ -| others | 89.767 | 77.100 | 89.533 | 0 | 0 | 86.433 | 890 | 85 | +| others | 90.767 | 80.167 | 90.700 | 0 | 0 | 83.400 | 890 | 83.86 | +| | | | | | | | | 7 | +--------+--------+--------+--------+--------+--------+--------+-------+-------+ -| tz-npa | 98.956 | 90.920 | 92.104 | 0 | 0 | 99.488 | 7483 | 97.92 | -| | | | | | | | | 0 | +| tz-npa | 99.328 | 91.692 | 85.916 | 0 | 0 | 97.300 | 7483 | 96.42 | +| | | | | | | | | 4 | +--------+--------+--------+--------+--------+--------+--------+-------+-------+ Table 3 -OCR error by symbol: +--------+---------------------------------------------------------------------+ | Symbol | Cnt Errors & Correct-Generated | +========+=====================================================================+ -| | ['3 & <. №> -> < No>', '2 & < г> -> <К>', '2 & < ‚> -> <,>', "2 & | -| | <1 > -> <'>", '2 & <и > -> <н>', '2 & <№ > -> '] | +| о | ['198 & <по> -> ', '118 & <от> -> ', '46 & <об> -> ', | +| | '12 & <во> -> ', '12 & <то> -> ', '10 & <до> -> ', '8 & | +| | <со> -> ', '4 & <По> -> ', '4 & <Со> -> ', '4 & <но> -> | +| | ', '4 & <он> -> ', '3 & <и о> -> ', '2 & <го> -> ', | +| | '2 & <по> -> '] | +--------+---------------------------------------------------------------------+ -| . | ['4 & <.> -> <,>', '3 & <. №> -> < No>', '3 & <3.> -> < De>', '2 & | -| | <г.> -> <ГТ>'] | +| н | ['246 & <на> -> ', '92 & <не> -> ', '4 & <но> -> ', '4 | +| | & <он> -> ', '2 & <нa> -> ', '2 & <н> -> <и>', '2 & <на> -> | +| | '] | +--------+---------------------------------------------------------------------+ -| , | ['66 & <,> -> <.>', '3 & <ва,> -> <нь>'] | +| а | ['246 & <на> -> ', '56 & <за> -> ', '6 & <На> -> ', '4 | +| | & <За> -> ', '2 & <на> -> ', '2 & <ра> -> '] | +--------+---------------------------------------------------------------------+ -| 1 | ['4 & <1С> -> ', "3 & <1> -> <'>", '3 & <1> -> <3>', '3 & <№1> | -| | -> ', '3 & <№1»> -> ', "2 & <1 > -> <'>", '2 & <1C> -> | -| | ', '2 & <1C> -> <С>', '2 & <1> -> <2>', '2 & <1> -> ', '1 & | -| | <1> -> <5>', '1 & <1> -> <Г>', '1 & <1> -> <С>', '1 & <1> -> <Т>'] | +| е | ['92 & <не> -> ', '12 & <ед> -> ', '6 & <ее> -> ', '4 & | +| | <Не> -> ', '3 & <е> -> <с>', '3 & <пер> -> ', '2 & <же> -> | +| | ', '2 & <те> -> ', '1 & <е> -> <а>'] | +--------+---------------------------------------------------------------------+ -| е | ['2 & <е> -> <и>', '2 & <е> -> <ё>', '2 & <ле> -> <У>', '2 & <не> | -| | -> ', '1 & <е> -> <о>'] | +| т | ['118 & <от> -> ', '36 & <ст> -> ', '12 & <то> -> ', '6 | +| | & <т> -> <г>', '6 & <ти> -> < of>', '3 & <От > -> ', '3 & <тип> | +| | -> ', '2 & <рт> -> ', '2 & <те> -> '] | +--------+---------------------------------------------------------------------+ -| и | ['4 & <и> -> <е>', '3 & <тип> -> ', '2 & <и > -> <н>', '2 & | -| | <ис> -> <не>', '2 & <си> -> <ен>', '1 & <и> -> <В>', '1 & <и> -> | -| | <а>', '1 & <и> -> <ь>'] | +| п | ['198 & <по> -> ', '3 & <Тип> -> ', '3 & <пер> -> ', | +| | '3 & <тип> -> ', '2 & <п> -> <и>', '2 & <по> -> ', '1 & | +| | <п> -> <н>'] | +--------+---------------------------------------------------------------------+ -| а | ['4 & <а> -> <о>', '3 & <ва,> -> <нь>', '3 & <на> -> <под>', '1 & | -| | <а> -> <Б>', '1 & <а> -> <е>', '1 & <а> -> <у>'] | +| | ['3 & <От > -> ', '3 & <и о> -> ', '3 & <с 6> -> ', '2 | +| | & <. > -> < ‘>', "2 & <1 > -> <'>", '2 & -> <№>'] | +--------+---------------------------------------------------------------------+ -| № | ['80 & <№> -> ', '6 & <№> -> ', '3 & <. №> -> < No>', '3 & | -| | <№1> -> ', '3 & <№1»> -> ', '2 & <№ > -> '] | +| 1 | ['104 & <1С> -> ', '18 & <1C> -> ', '8 & <1С> -> ', '4 | +| | & <11> -> <И>', '4 & <1C> -> ', "3 & <1> -> <'>", "2 & <1 > -> | +| | <'>", '2 & <1C> -> ', '2 & <1C> -> <С>', '2 & <1> -> <|>', '2 & | +| | <31> -> ', '1 & <1> -> <\\>'] | +--------+---------------------------------------------------------------------+ -| н | ['3 & <на> -> <под>', '2 & <не> -> ', '1 & <н> -> <й>'] | +| и | ['34 & <из> -> ', '32 & <их> -> ', '12 & <им> -> ', '6 | +| | & <ти> -> < of>', '3 & <Тип> -> ', '3 & <и о> -> ', '3 & | +| | <тип> -> ', '2 & <ис> -> <не>'] | +--------+---------------------------------------------------------------------+ -| о | ['3 & <фок> -> <М>', '2 & <о> -> <у>', '2 & <об> -> <бы>', '2 & | -| | <то> -> ', '1 & <о> -> <в>', '1 & <о> -> <я>'] | +| С | ['104 & <1С> -> ', '8 & <1С> -> ', '8 & <ОС> -> ', '4 & | +| | <Со> -> ', '3 & <НДС> -> ', '2 & <ДС> -> ', '2 & <ЮС> | +| | -> <1О>', '1 & <С> -> <—>'] | +--------+---------------------------------------------------------------------+ -| 2 | ['2 & <28> -> ', '2 & <28> -> <ИР>', '2 & <28> -> <Я>'] | +| , | ['64 & <,> -> <.>', '6 & <ПО,> -> ', '1 & <,> -> <;>'] | +--------+---------------------------------------------------------------------+ -| л | ['2 & <ле> -> <У>', '1 & <л> -> <Л>', '1 & <л> -> <д>', '1 & <л> -> | -| | <т>'] | +| . | ['3 & <.> -> <,>', '3 & <3.> -> < He>', '2 & <. > -> < ‘>', '2 & | +| | <г.> -> <Г>'] | +--------+---------------------------------------------------------------------+ -| т | ['3 & <тип> -> ', '2 & <т> -> <г>', '2 & <то> -> '] | +| с | ['36 & <ст> -> ', '8 & <со> -> ', '4 & <см> -> ', '3 & | +| | <с 6> -> ', '3 & <ься> -> < by>', '2 & <ис> -> <не>', '1 & <с> | +| | -> ', '1 & <с> -> <©>', '1 & <с> -> <е>'] | +--------+---------------------------------------------------------------------+ -| р | ['3 & <гр> -> <тав>', '2 & <гр> -> '] | +| з | ['56 & <за> -> ', '34 & <из> -> '] | +--------+---------------------------------------------------------------------+ -| 3 | ['3 & <3.> -> < De>', '1 & <3> -> '] | +| О | ['20 & <ПО> -> ', '14 & <Об> -> ', '8 & <ДО> -> ', '8 & | +| | <ОС> -> ', '6 & <ПО,> -> ', '4 & <АО> -> ', '4 & <ЛО> | +| | -> ', '4 & <МО> -> ', '3 & <От > -> '] | +--------+---------------------------------------------------------------------+ -| N | ['22 & -> <М>'] | +| л | ['6 & <для> -> ', '6 & <мл> -> ', '3 & <для> -> <11>', '3 & | +| | <для> -> ', '3 & <л> -> <п>', '2 & <Эл> -> ', '2 & <ул> -> | +| | '] | +--------+---------------------------------------------------------------------+ -| С | ['6 & <СЗВ> -> ', '4 & <1С> -> ', '3 & <ОС> -> ', '3 | -| | & <С> -> ', '2 & <ОС> -> '] | +| б | ['46 & <об> -> ', '14 & <Об> -> '] | +--------+---------------------------------------------------------------------+ -| г | ['3 & <гр> -> <тав>', '2 & < г> -> <К>', '2 & <г.> -> <ГТ>', '2 & | -| | <г> -> <т>', '2 & <гр> -> '] | +| д | ['12 & <ед> -> ', '10 & <до> -> ', '6 & <для> -> ', '3 & | +| | <д> -> <л>', '3 & <для> -> <11>', '3 & <для> -> ', '1 & <д> -> | +| | <2>'] | +--------+---------------------------------------------------------------------+ -| с | ['2 & <ис> -> <не>', '2 & <си> -> <ен>', '1 & <с> -> '] | +| З | ['56 & <ФЗ> -> ', '4 & <За> -> ', '3 & <БЗ> -> <653>', '3 & | +| | <ТЗР> -> ', '2 & <ВЗ> -> <Ръ>'] | +--------+---------------------------------------------------------------------+ -| в | ['3 & <ва,> -> <нь>', '2 & <в> -> <м>', '2 & <в> -> <по>', '1 & <в> | -| | -> <В>'] | +| в | ['12 & <во> -> ', '1 & <в> -> ', '1 & <в> -> <В>', '1 & <в> | +| | -> <п>'] | +--------+---------------------------------------------------------------------+ -| И | ['2 & <И> -> <АН>', '1 & <И> -> <В>', '1 & <И> -> <Й>'] | +| Ф | ['56 & <ФЗ> -> ', '12 & <РФ> -> ', '2 & <ФД> -> '] | +--------+---------------------------------------------------------------------+ -| Е | ['2 & <ЕМ> -> <Ш>'] | +| м | ['12 & <им> -> ', '12 & <мг> -> ', '6 & <мл> -> ', '4 & | +| | <см> -> ', '2 & <мм> -> ', '2 & <мы> -> '] | +--------+---------------------------------------------------------------------+ -| Н | ['2 & <Н> -> <ЕМ>', '1 & <Н> -> <И>'] | +| г | ['12 & <мг> -> ', '2 & <г.> -> <Г>', '2 & <г> -> <т >', '2 & | +| | <г> -> <т>', '2 & <го> -> ', '2 & <гр> -> ', '2 & <гр> -> | +| | <тв>', '1 & <г> -> '] | +--------+---------------------------------------------------------------------+ -| О | ['3 & <ОС> -> ', '2 & <ОС> -> ', '2 & <Об> -> <06>', '1 & | -| | <О> -> <Ю>', '1 & <О> -> <о>'] | +| р | ['3 & <пер> -> ', '2 & <гр> -> ', '2 & <гр> -> <тв>', '2 & | +| | <ра> -> ', '2 & <рт> -> ', '2 & <ры> -> '] | +--------+---------------------------------------------------------------------+ -| Т | ['3 & <МРТ> -> ', '3 & <Т> -> <Г>', '3 & <ТЗР> -> '] | +| П | ['20 & <ПО> -> ', '6 & <ПО,> -> ', '4 & <По> -> ', '1 | +| | & <П> -> <И>'] | +--------+---------------------------------------------------------------------+ -| П | ['1 & <П> -> <И>', '1 & <П> -> <К>', '1 & <П> -> <п>'] | +| Н | ['6 & <Н> -> <* П>', '6 & <На> -> ', '4 & <Не> -> ', '3 & | +| | <Н> -> <И>', '3 & <НДС> -> ', '2 & <ЕН> -> <ек>', '2 & <НБ> -> | +| | ', '1 & <Н> -> <П>'] | +--------+---------------------------------------------------------------------+ -| - | ['2 & <-> -> <ры>'] | +| 2 | ['4 & <28> -> ', '2 & <28> -> <Я >'] | +--------+---------------------------------------------------------------------+ -| 0 | ['3 & <608> -> '] | +| N | ['22 & -> <М>', '2 & -> <№>'] | +--------+---------------------------------------------------------------------+ -| у | ['2 & <у> -> <ы>'] | +| E | ['45 & -> <ЕВР>', '3 & -> <ЕКР>'] | +--------+---------------------------------------------------------------------+ -| 6 | ['3 & <608> -> '] | +| А | ['4 & <АО> -> ', '2 & <АД> -> '] | +--------+---------------------------------------------------------------------+ -| I | ['3 & -> <Ш>', '3 & -> <УП>'] | +| a | ['6 & -> ', '2 & -> ', '2 & <нa> -> ', '1 & | +| | -> <а>'] | +--------+---------------------------------------------------------------------+ -| В | ['6 & <СЗВ> -> ', '2 & <ВЗ> -> <РИ>'] | +| И | ['4 & <ИБ> -> ', '2 & <ИТ> -> ', '1 & <И> -> <Н>'] | +--------+---------------------------------------------------------------------+ -| Р | ['3 & <МРТ> -> ', '3 & <ТЗР> -> '] | +| я | ['6 & <для> -> ', '3 & <для> -> <11>', '3 & <для> -> ', '3 & | +| | <ься> -> < by>'] | +--------+---------------------------------------------------------------------+ -| п | ['3 & <тип> -> '] | +| 3 | ['3 & <3.> -> < He>', '2 & <31> -> ', '1 & <3> -> '] | +--------+---------------------------------------------------------------------+ -| М | ['3 & <МРТ> -> ', '2 & <ЕМ> -> <Ш>'] | +| P | ['45 & -> <ЕВР>', '3 & -> <ЕКР>'] | +--------+---------------------------------------------------------------------+ -| б | ['2 & <Об> -> <06>', '2 & <об> -> <бы>'] | +| R | ['45 & -> <ЕВР>', '3 & -> <ЕКР>', '3 & -> <ОСК>'] | +--------+---------------------------------------------------------------------+ -| к | ['3 & <фок> -> <М>'] | +| Д | ['12 & <БД> -> ', '8 & <ДО> -> ', '4 & <ЕД> -> ', '3 & | +| | <НДС> -> ', '2 & <АД> -> ', '2 & <ДС> -> ', '2 & <ФД> | +| | -> ', '1 & <Д> -> <З>'] | +--------+---------------------------------------------------------------------+ -| 5 | ['2 & <75> -> <2>'] | +| e | ['2 & -> '] | +--------+---------------------------------------------------------------------+ -| ; | ['8 & <;> -> <:>'] | +| Е | ['4 & <ЕД> -> ', '2 & <ЕН> -> <ек>'] | +--------+---------------------------------------------------------------------+ -| ы | ['1 & <ы> -> <б>'] | +| C | ['18 & <1C> -> ', '4 & <1C> -> ', '3 & -> <ОСК>', '2 | +| | & <1C> -> ', '2 & <1C> -> <С>', '2 & -> ', '2 & -> | +| | '] | +--------+---------------------------------------------------------------------+ -| 8 | ['3 & <608> -> ', '2 & <28> -> ', '2 & <28> -> <ИР>', '2 & | -| | <28> -> <Я>'] | +| Р | ['12 & <РФ> -> ', '3 & <ТЗР> -> '] | +--------+---------------------------------------------------------------------+ -| E | ['3 & -> <ЕВР>'] | +| х | ['32 & <их> -> '] | +--------+---------------------------------------------------------------------+ -| З | ['6 & <СЗВ> -> ', '3 & <БЗ> -> <653>', '3 & <ТЗР> -> ', | -| | '2 & <ВЗ> -> <РИ>'] | +| I | ['3 & -> <Ш>', '3 & -> <130>', '3 & -> ', '2 | +| | & -> ', '2 & -> <1>', '1 & -> <|>'] | +--------+---------------------------------------------------------------------+ -| ц | ['1 & <ц> -> <С>', '1 & <ц> -> <щ>'] | +| Б | ['12 & <БД> -> ', '4 & <ИБ> -> ', '3 & <БЗ> -> <653>', '2 & | +| | <НБ> -> '] | +--------+---------------------------------------------------------------------+ -| 7 | ['2 & <75> -> <2>'] | +| Т | ['3 & <ТЗР> -> ', '3 & <Тип> -> ', '2 & <ИТ> -> ', '1 | +| | & <Т> -> <Г>'] | +--------+---------------------------------------------------------------------+ -| C | ['2 & <1C> -> ', '2 & <1C> -> <С>', '2 & -> <С>'] | +| 0 | ['3 & <608> -> '] | +--------+---------------------------------------------------------------------+ -| Б | ['3 & <БЗ> -> <653>'] | +| М | ['4 & <МО> -> '] | +--------+---------------------------------------------------------------------+ -| Д | ['1 & <Д> -> <З>'] | +| у | ['2 & <ул> -> '] | +--------+---------------------------------------------------------------------+ -| й | ['2 & <й> -> <е:>'] | +| 6 | ['3 & <608> -> ', '3 & <с 6> -> '] | +--------+---------------------------------------------------------------------+ -| | | ['1 & <|> -> <1>'] | +| Л | ['4 & <ЛО> -> '] | +--------+---------------------------------------------------------------------+ -| Ц | ['1 & <Ц> -> <Т>'] | +| ь | ['3 & <ься> -> < by>'] | +--------+---------------------------------------------------------------------+ -| P | ['3 & -> <ЕВР>'] | +| - | ['1 & <-> -> <—>'] | +--------+---------------------------------------------------------------------+ -| R | ['3 & -> <ЕВР>'] | +| u | ['3 & -> '] | +--------+---------------------------------------------------------------------+ -| a | ['4 & -> <на>', '1 & -> <а>'] | +| ; | ['9 & <;> -> <:>'] | +--------+---------------------------------------------------------------------+ -| G | ['2 & -> <С>'] | +| В | ['2 & <ВЗ> -> <Ръ>'] | ++--------+---------------------------------------------------------------------+ +| ы | ['2 & <мы> -> ', '2 & <ры> -> '] | +--------+---------------------------------------------------------------------+ -| H | ['4 & -> <на>', '2 & -> <Из>'] | +| c | ['1 & -> <с>'] | +--------+---------------------------------------------------------------------+ -| V | ['3 & -> <УП>'] | +| p | ['2 & -> '] | +--------+---------------------------------------------------------------------+ -| m | ['2 & -> '] | +| ц | ['1 & <ц> -> <щ>'] | +--------+---------------------------------------------------------------------+ -| Ю | ['2 & <Ю> -> <1 >'] | +| 5 | ['2 & <75> -> <#2>'] | +--------+---------------------------------------------------------------------+ -| ф | ['3 & <фок> -> <М>'] | +| 8 | ['4 & <28> -> ', '3 & <608> -> ', '2 & <28> -> <Я >'] | +--------+---------------------------------------------------------------------+ -| ‚ | ['2 & < ‚> -> <,>'] | +| O | ['3 & -> <130>', '3 & -> <ОСК>', '2 & -> '] | +--------+---------------------------------------------------------------------+ -| Y | ['1 & -> <У>'] | +| S | ['3 & -> <130>'] | +--------+---------------------------------------------------------------------+ -| _ | ['1 & <_> -> <Х>'] | +| ч | ['1 & <ч> -> <з>'] | +--------+---------------------------------------------------------------------+ -| c | ['1 & -> <с>'] | +| K | ['3 & -> <КНМ>'] | ++--------+---------------------------------------------------------------------+ +| d | ['2 & -> ', '1 & -> <4>'] | +--------+---------------------------------------------------------------------+ -| d | ['1 & -> <4>'] | +| й | ['1 & <й> -> <:>'] | +--------+---------------------------------------------------------------------+ -| e | ['2 & -> <Из>'] | +| 7 | ['2 & <75> -> <#2>'] | +--------+---------------------------------------------------------------------+ -| o | ['2 & -> '] | +| H | ['6 & -> ', '3 & -> <КНМ>', '2 & -> '] | ++--------+---------------------------------------------------------------------+ +| V | ['3 & -> '] | ++--------+---------------------------------------------------------------------+ +| Ц | ['1 & <Ц> -> <Т>'] | +--------+---------------------------------------------------------------------+ -| y | ['1 & -> <у>'] | +| M | ['3 & -> <КНМ>'] | ++--------+---------------------------------------------------------------------+ +| № | ['6 & <№> -> '] | ++--------+---------------------------------------------------------------------+ +| G | ['2 & -> <С>'] | ++--------+---------------------------------------------------------------------+ +| | | ['1 & <|> -> <1>'] | ++--------+---------------------------------------------------------------------+ +| « | ['3 & <«_»> -> '] | ++--------+---------------------------------------------------------------------+ +| » | ['3 & <«_»> -> '] | ++--------+---------------------------------------------------------------------+ +| Э | ['2 & <Эл> -> '] | ++--------+---------------------------------------------------------------------+ +| Ю | ['2 & <ЮС> -> <1О>'] | ++--------+---------------------------------------------------------------------+ +| ж | ['2 & <же> -> '] | ++--------+---------------------------------------------------------------------+ +| X | ['2 & -> '] | ++--------+---------------------------------------------------------------------+ +| Y | ['1 & -> <У>'] | +--------+---------------------------------------------------------------------+ -| » | ['3 & <№1»> -> '] | +| _ | ['3 & <«_»> -> '] | +--------+---------------------------------------------------------------------+ -| ю | ['1 & <ю> -> <у>'] | +| — | ['1 & <—> -> <->'] | +--------+---------------------------------------------------------------------+ \ No newline at end of file diff --git a/scripts/accsum b/scripts/accsum index 1efd2a47ac37b8f777fd58074895dc33ea0cc6f1..71091a9b0697d72a503f712a4d1abec0b1cbd210 100755 GIT binary patch literal 42728 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 VEjt2%fzm(seI;?OBY`6-{tqr!208!$ literal 39280 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 z List: def __get_summary_symbol_error(path_reports: str) -> Texttable: # 1 - call accsum for get summary of all reports - accuracy_script_path = os.path.abspath(os.path.join(os.path.dirname(__file__), "accsum")) + accuracy_script_path = os.path.abspath(os.path.join(os.path.dirname(__file__), "./../accsum")) if os.path.exists(f"{path_reports}/../accsum_report.txt"): os.remove(f"{path_reports}/../accsum_report.txt") @@ -179,7 +179,7 @@ def __create_statistic_tables(statistics: dict, accuracy_values: List) -> Tuple[ def calculate_accuracy_script(tmp_gt_path: str, tmp_prediction_path: str, accuracy_path: str) -> None: # calculation accuracy build for Ubuntu from source https://github.com/eddieantonio/ocreval - accuracy_script_path = os.path.abspath(os.path.join(os.path.dirname(__file__), "accuracy")) + accuracy_script_path = os.path.abspath(os.path.join(os.path.dirname(__file__), "./../accuracy")) command = f"{accuracy_script_path} {tmp_gt_path} {tmp_prediction_path} >> {accuracy_path}" os.system(command) @@ -244,27 +244,23 @@ def __calculate_ocr_reports(cache_dir_accuracy: str, benchmark_data_path: str, c # call correction step time_b = time.time() - if USE_CORRECTION_OCR == SAGE_CORRECTION: - tmp_corrected_path = os.path.join(corrected_path, f"{img_name}_ocr.txt") - corrected_text = correction(corrector, text) - correction_times.append(time.time() - time_b) - with open(tmp_corrected_path, "w") as tmp_corrected_file: - tmp_corrected_file.write(corrected_text) - tmp_corrected_file.close() + tmp_corrected_path = os.path.join(corrected_path, f"{img_name}_ocr.txt") + if USE_CORRECTION_OCR == SAGE_CORRECTION or USE_CORRECTION_OCR == TEXT_BLOB_CORRECTION: - calculate_accuracy_script(tmp_gt_path, tmp_corrected_path, accuracy_path) - elif USE_CORRECTION_OCR == TEXT_BLOB_CORRECTION: - tmp_corrected_path = os.path.join(corrected_path, f"{img_name}_ocr.txt") - corrected_text = corrector.correct(text) - correction_times.append(time.time() - time_b) with open(tmp_corrected_path, "w") as tmp_corrected_file: + if USE_CORRECTION_OCR == SAGE_CORRECTION: + corrected_text = correction(corrector, text) + elif USE_CORRECTION_OCR == TEXT_BLOB_CORRECTION: + corrected_text = corrector.correct(text) + tmp_corrected_file.write(corrected_text) tmp_corrected_file.close() + calculate_accuracy_script(tmp_gt_path, tmp_corrected_path, accuracy_path) - calculate_accuracy_script(tmp_gt_path, tmp_corrected_path, accuracy_path) else: calculate_accuracy_script(tmp_gt_path, tmp_ocr_path, accuracy_path) + correction_times.append(time.time() - time_b) statistics = _update_statistics_by_dataset(statistics, dataset_name, accuracy_path, word_cnt) accuracy_values.append([dataset_name, base_name, psm, word_cnt, statistics[dataset_name]["Accuracy"][-1]]) @@ -279,7 +275,7 @@ def __calculate_ocr_reports(cache_dir_accuracy: str, benchmark_data_path: str, c if __name__ == "__main__": base_zip = "data_tesseract_benchmarks" - output_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "resources", "benchmarks")) + output_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), "./../../", "resources", "benchmarks")) cache_dir = os.path.join(get_config()["intermediate_data_path"], "tesseract_data") os.makedirs(cache_dir, exist_ok=True) cache_dir_accuracy = os.path.join(cache_dir, "accuracy") diff --git a/scripts/ocr_correction.py b/scripts/tesseract_benchmark/ocr_correction.py similarity index 100% rename from scripts/ocr_correction.py rename to scripts/tesseract_benchmark/ocr_correction.py diff --git a/scripts/tesseract_benchmark/requirements.txt b/scripts/tesseract_benchmark/requirements.txt new file mode 100644 index 00000000..5ef9a438 --- /dev/null +++ b/scripts/tesseract_benchmark/requirements.txt @@ -0,0 +1 @@ +textblob==0.17.1 \ No newline at end of file diff --git a/scripts/text_blob_correction.py b/scripts/tesseract_benchmark/text_blob_correction.py similarity index 100% rename from scripts/text_blob_correction.py rename to scripts/tesseract_benchmark/text_blob_correction.py From d47e280f8c4b6170621af44b4dcab5d5dab1a0c4 Mon Sep 17 00:00:00 2001 From: Nasty Date: Wed, 31 Jan 2024 12:42:36 +0300 Subject: [PATCH 4/4] Small fixes --- scripts/accsum | Bin 42728 -> 39280 bytes scripts/accuracy | Bin 51960 -> 48512 bytes .../calc_tesseract_benchmarks.py | 25 +++++++----------- 3 files changed, 9 insertions(+), 16 deletions(-) diff --git a/scripts/accsum b/scripts/accsum index 71091a9b0697d72a503f712a4d1abec0b1cbd210..1efd2a47ac37b8f777fd58074895dc33ea0cc6f1 100755 GIT binary patch literal 39280 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 Y<2qk0dlUl0rTr0N+23& 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 VEjt2%fzm(seI;?OBY`6-{tqr!208!$ diff --git a/scripts/accuracy b/scripts/accuracy index 8a16b007c40db3172ed4a30408fe3a7a90a1e250..e90f1dcf16ece459b584a3f1550938defbb8e91c 100755 GIT binary patch literal 48512 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 List: def __get_summary_symbol_error(path_reports: str) -> Texttable: # 1 - call accsum for get summary of all reports - accuracy_script_path = os.path.abspath(os.path.join(os.path.dirname(__file__), "./../accsum")) + accuracy_script_path = os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "accsum")) if os.path.exists(f"{path_reports}/../accsum_report.txt"): os.remove(f"{path_reports}/../accsum_report.txt") @@ -126,7 +126,7 @@ def __get_summary_symbol_error(path_reports: str) -> Texttable: command = f"{accuracy_script_path} {file_reports} >> {path_reports}/../accsum_report.txt" os.system(command) - accsum_report_path = os.path.join(path_reports, "../accsum_report.txt") + accsum_report_path = os.path.join(path_reports, "..", "accsum_report.txt") # 2 - parse report info with open(accsum_report_path, "r") as f: @@ -179,7 +179,7 @@ def __create_statistic_tables(statistics: dict, accuracy_values: List) -> Tuple[ def calculate_accuracy_script(tmp_gt_path: str, tmp_prediction_path: str, accuracy_path: str) -> None: # calculation accuracy build for Ubuntu from source https://github.com/eddieantonio/ocreval - accuracy_script_path = os.path.abspath(os.path.join(os.path.dirname(__file__), "./../accuracy")) + accuracy_script_path = os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "accuracy")) command = f"{accuracy_script_path} {tmp_gt_path} {tmp_prediction_path} >> {accuracy_path}" os.system(command) @@ -244,19 +244,12 @@ def __calculate_ocr_reports(cache_dir_accuracy: str, benchmark_data_path: str, c # call correction step time_b = time.time() - tmp_corrected_path = os.path.join(corrected_path, f"{img_name}_ocr.txt") - if USE_CORRECTION_OCR == SAGE_CORRECTION or USE_CORRECTION_OCR == TEXT_BLOB_CORRECTION: - + if USE_CORRECTION_OCR in (SAGE_CORRECTION, TEXT_BLOB_CORRECTION): + corrected_text = correction(corrector, text) if USE_CORRECTION_OCR == SAGE_CORRECTION else corrector.correct(text) + tmp_corrected_path = os.path.join(corrected_path, f"{img_name}_ocr.txt") with open(tmp_corrected_path, "w") as tmp_corrected_file: - if USE_CORRECTION_OCR == SAGE_CORRECTION: - corrected_text = correction(corrector, text) - elif USE_CORRECTION_OCR == TEXT_BLOB_CORRECTION: - corrected_text = corrector.correct(text) - tmp_corrected_file.write(corrected_text) - tmp_corrected_file.close() - calculate_accuracy_script(tmp_gt_path, tmp_corrected_path, accuracy_path) - + calculate_accuracy_script(tmp_gt_path, tmp_corrected_path, accuracy_path) else: calculate_accuracy_script(tmp_gt_path, tmp_ocr_path, accuracy_path) @@ -275,7 +268,7 @@ def __calculate_ocr_reports(cache_dir_accuracy: str, benchmark_data_path: str, c if __name__ == "__main__": base_zip = "data_tesseract_benchmarks" - output_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), "./../../", "resources", "benchmarks")) + output_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "..", "resources", "benchmarks")) cache_dir = os.path.join(get_config()["intermediate_data_path"], "tesseract_data") os.makedirs(cache_dir, exist_ok=True) cache_dir_accuracy = os.path.join(cache_dir, "accuracy") @@ -283,7 +276,7 @@ def __calculate_ocr_reports(cache_dir_accuracy: str, benchmark_data_path: str, c benchmark_data_path = os.path.join(cache_dir, f"{base_zip}.zip") if not os.path.isfile(benchmark_data_path): - wget.download("https://at.ispras.ru/owncloud/index.php/s/wMyKioKInYITpYT", benchmark_data_path) + wget.download("https://at.ispras.ru/owncloud/index.php/s/wMyKioKInYITpYT/download", benchmark_data_path) print(f"Benchmark data downloaded to {benchmark_data_path}") else: print(f"Use cached benchmark data from {benchmark_data_path}")