Менять движок распознавания или оставить прежний

Разбор замера от 31 августа 2026 года: пять документов заказчика прочитаны дважды — привычным вариантом («Как сейчас») и вторым, PaddleOCR. Здесь сведены оба счёта — насколько верно прочитан сам текст и насколько верно значения легли в нужные ячейки, — скорость, вес и итоговое решение.

Оставляем прежний

На документах заказчика PaddleOCR читает в 15 раз хуже по тексту (88,8% против 6,1%) и в 41 раз хуже по попаданию в ячейки (85,7% против 2,1%). Он быстрее на 38 секунд на всём наборе (12%), но за это приложение тяжелеет на 1325 МБ. Выигрыш в скорости не окупает потерю качества: из 47 товарных строк набора PaddleOCR не собрал верно ни одной, привычный вариант собрал 29.

Решение исполнено: второй вариант с рабочей страницы убран, приложение читает документы прежним движком, как и до замера. Все числа этого замера сохранены здесь — если выйдет новая модель для русского языка или в наборе появятся документы другого качества, замер повторим по той же методике.

88,8% / 6,1%
верно прочитан текст: как сейчас / PaddleOCR
85,7% / 2,1%
значение попало в нужную ячейку: как сейчас / PaddleOCR
318 с / 280 с
время на все восемь страниц набора
+1325 МБ
прибавка веса приложения от второго варианта

Два разных счёта — и зачем они оба

«Верно прочитан текст» — значение эталона нашлось в распознанном где угодно на странице: движок правильно разобрал буквы и цифры. «Попало в нужную ячейку» — то же значение стоит там, где ему положено в товарной таблице. Разница между этими числами — потери на раскладке по ячейкам, а не на чтении. Оба счёта идут по одним правилам проекта, знаменатель один и тот же — 329 значений пяти эталонов, ничего из счёта не выбрасывается.

ДокументСтраниц Значений
в эталоне
Верно прочитан текст Попало в нужную ячейку Время
Как сейчасPaddleOCR Как сейчасPaddleOCR Как сейчасPaddleOCR
Пример 12140135 (96,4%)18 (12,9%)133 (95,0%)7 (5,0%)110 с82 с
Пример 223520 (57,1%)0 (0,0%)16 (45,7%)0 (0,0%)44 с46 с
Пример 3172 (28,6%)0 (0,0%)0 (0,0%)0 (0,0%)26 с35 с
Пример 412116 (76,2%)0 (0,0%)16 (76,2%)0 (0,0%)36 с30 с
Пример 52126119 (94,4%)2 (1,6%)117 (92,9%)0 (0,0%)102 с86 с
Итого8329 292 (88,8%) 20 (6,1%) 282 (85,7%) 7 (2,1%) 318 с280 с

Привычный вариант точнее на всех пяти документах и в тексте, и в ячейках; документа, где PaddleOCR был бы точнее, в наборе нет. Потери на раскладке по ячейкам у привычного варианта — 10 значений из 329: прочитано верно, но попало не в ту клетку. У PaddleOCR таких 13 — но у него до раскладки почти ничего и не доходит.

По каким именно значениям ошибается каждый вариант

Сумма по всем 47 товарным строкам набора: сколько значений каждого вида прочитано верно.

Значение строкиВсего в эталонах Как сейчасPaddleOCR
наименование4731 (66,0%)1 (2,1%)
количество4743 (91,5%)18 (38,3%)
цена4744 (93,6%)0 (0,0%)
стоимость без НДС4743 (91,5%)1 (2,1%)
сумма НДС4742 (89,4%)0 (0,0%)
стоимость с НДС4742 (89,4%)0 (0,0%)
ставка НДС4747 (100,0%)0 (0,0%)

Ставку НДС привычный вариант находит во всех строках, тяжелее всего ему даётся наименование товара — 31 из 47: длинные названия шин с латиницей, цифрами и дробями он часто рвёт или путает буквы. У PaddleOCR единственное заметное число — «количество» (18 из 47): это однозначные числа вроде «4», они совпадают с эталоном и случайно, так что засчитывать это как умение читать нельзя.

Отдельно: перекошенный лист («Пример 2»)

Это тот самый документ, на котором перекос виден глазом (1c6c0fac-f82a-4219-be4b-4918653068f4.pdf): фотография счёта-фактуры на две страницы, снятая под углом, строки таблицы уходят вниз, вертикальные линии завалены. Оба варианта читали его после одной и той же подготовки страницы — выпрямления и чистки.

Что смотримКак сейчасPaddleOCR
Время чтения двух страниц44 с 46 с
Найдено кусков текста на странице79 38
Ячеек с текстом 220 228
Знаков прочитано2980 2038
Верно прочитан текст (из 35 значений) 20 (57,1%) 0 (0,0%)
Попало в нужную ячейку 16 (45,7%) 0 (0,0%)
Товарных строк найдено (из 5) 5 0
Значение строкиВсегоКак сейчасPaddleOCR
наименование520
количество550
цена540
стоимость без НДС510
сумма НДС510
стоимость с НДС520
ставка НДС550

Что здесь видно. Привычный вариант на перекошенном листе держится хуже, чем на ровных сканах (57,1% текста против 96,4% на «Примере 1»), но структуру документа не теряет: находит все 5 товарных строк, во всех пяти верно читает количество и ставку НДС, а вот денежные колонки на наклонных строках разъезжаются — стоимость без НДС и сумму НДС он взял верно только в одной строке из пяти. Типичная ошибка — прилипший к числу мусор от соседней клетки: «21'666!67» вместо 21 666,67. PaddleOCR на этом же листе не прочитал ни одного значения из 35 и потерял все 5 товарных строк: вместо текста он выдаёт похожие на слова наборы букв («poaавeц» вместо «Продавец», «нивероагьный» вместо «Универсальный»).

Вывод по перекошенному листу тот же, что и по набору: замена движка эту проблему не решает. Перекос мешает обоим вариантам, но у привычного остаётся что править руками, а у второго — нечего.

Скорость и вес

Что мерялиКак сейчасPaddleOCRРазница
Все восемь страниц набора318 с280 с −38 с
Самый тяжёлый документ («Пример 1», 2 страницы) 110 с82 с −28 с
Перекошенный лист («Пример 2», 2 страницы) 44 с46 с +2 с
Вес библиотек приложения286 МБ 1596 МБ+1310 МБ
Вес моделей чтения0 МБ15 МБ +15 МБ
Сборка приложения (установка + загрузка моделей) 9 с 91 с +82 с
Первое чтение после запуска приложениябез задержки +50 с+50 с

Разница по скорости неровная: на трёх документах PaddleOCR быстрее, на двух — медленнее, в том числе на перекошенном листе. Вес — цена постоянная: он платится при каждой сборке и каждом запуске, независимо от того, пользуются вторым вариантом или нет.

Почему решение именно такое

Куда дальше

Полный текст по всем 2798 ячейкам обоих вариантов лежит на странице замера одной таблицей — её можно открыть в Excel.