write: 02/09/2025 / modified: 04/09/2025
Локальный проект, разработанный на python для внутреннего использования в организации. Представляет собой веб-приложение для оптического распознавания символов (OCR) на основе тюнингованной модели Qwen2.5-VL-3B-Instruct, интегрированной с vLLM-сервером.
Приложение поддерживает обработку изображений и PDF-файлов, предобработку изображений для улучшения качества, проверку орфографии на русском языке, а также экспорт результатов в Excel и Word.
Извлекает сложные таблицы из документов и преобразует их в таблицы в формате HTML. Распознаёт рукописный текст (если конечно это не рецепт выписанный неврологом).
Технологический стек:
FastAPI,vLLM,Pillow,OpenCV,pandas,python-docx,BeautifulSoup,pdf2image.

Результат распознавания выводится потоковым выводом. Модель запущена на 4090 Ti; средняя пропускная способность генерации: 120 токенов/с. На гифке выше показана реальная скорость распознавания таблицы с рукописным текстом.

И снова преодоление никому не нужных проблем. Существующие системы проверки орфографии мне не понравились. Поэтому были скачаны частоты словоформ и словосочетаний с «Национального корпуса русского языка».
Общий объём корпуса:
| Год | Размер |
|---|---|
| По данным на ноябрь 2011 | 192 689 044 словоформы. |
| По данным на октябрь 2023 | 374 449 975 словоформ. |
Текстовые файлы с словоформами 1-грамм, 2-грамм, 3-грамм, 4-грамм, 5-грамм были объединены в единый ngrams словарь в формате parquet.
При загрузке приложения словарь загружается в память.

После чего доступна проверка орфографии и добавление неизвестных слов в пользовательский словарь. Во первых это красиво и как по мне удобно. При нажатии на слово с ошибкой появляется выпадающий список с предложениями правильных слов.

Если слова или словоформы нет, его можно добавить в кастомный словарь.

В Word сохраняется текст с максимально приближенным форматированием оригинального документа. В Excel сохраняется структура таблицы с заголовками, столбцами и ячейками.
/process-async: Обработка файла, добавление в очередь задач (asyncio.Queue)./status/{request_id}: Статус задачи, запись в SQLite (для тестов и отладки)./status: Системный статус./save/excel, /save/word: Экспорт./check_spelling: Спеллчек./add_to_dictionary: Добавление слова.--
Приложение было написано для распознавания сканов старых документов (50-е + годы), напечатанных на печатных машинках, с чем тот же FineReader не мог справиться, как и другие аналоги. В самом начале силы были брошены на дообучение модели EasyOCR на датасете из собственных и сгенерированных синтетических данных. Улучшения в качестве распознавания были, но тратить время на нарезку и подготовку чистого датасета на собственных данных не было желания. По крайней мере, на данный момент.
--
Обложка для поста любезно нарисована старшим братом — Qwen3-235B-A22B-2507. Хвала Алибабе!
tags: python programming javascript sqlite web ai