Локальная система извлечения структурированных данных из ТТН (товарно-транспортных накладных) без отправки документов во внешние облачные сервисы.
Проект ориентирован на демонстрационный и прикладной сценарий: загрузка скана/фото ТТН, получение промежуточного распознавания и формирование итогового JSON для дальнейшей интеграции.
- Что умеет проект
- Архитектура
- Структура репозитория
- Демо-видео
- Результаты проверки качества
- Установка и запуск с нуля (Windows / macOS / Linux)
- Запуск тестов
- Известные ограничения
- Дополнительная документация
- Локально обрабатывает сканы и фотографии ТТН.
- Поддерживает извлечение ключевых полей и табличных блоков по шаблону.
- Показывает промежуточный Markdown-результат от визуальной модели.
- Формирует итоговый JSON (через локальный LLM-слой для нормализации и структурирования).
- Позволяет скачать результат в формате JSON из интерфейса.
В репозитории фактически представлены два контура обработки:
-
Основной (актуальный) VLM-пайплайн
Streamlit UI -> Qwen2-VL -> Markdown -> Ollama (qwen2.5:14b) -> JSON. -
Legacy OCR-пайплайн (MVP, для совместимости и экспериментов)
OpenCV preprocessing -> PaddleOCR -> rule-based parsing.
- Веб-интерфейс на
Streamlit. - Пользователь выбирает шаблон документа, загружает изображение и запускает разбор.
- Визуальная модель
Qwen2-VL-2B-Instructполучает изображение + строгий промпт. - Далее отдельным шагом запускается нормализация результата в JSON.
- Используется
transformers-модельQwen/Qwen2-VL-2B-Instruct. - Генерация настроена в детерминированном режиме (
temperature=0.0,do_sample=False) для снижения галлюцинаций. - Выход модели сначала хранится как Markdown/текстовый промежуточный слой.
- Используется локальный endpoint Ollama в OpenAI-совместимом формате (
http://localhost:11434/v1). - Модель
qwen2.5:14bполучает Markdown и преобразует его в целевой JSON. - На выходе: JSON-объект + сырой текст ответа модели (для отладки).
OpenCV-предобработка (контраст, grayscale и т.д.).PaddleOCRдля распознавания текста.- Эвристики и fuzzy matching для:
- выделения регионов таблиц;
- распознавания заголовков и строк;
- извлечения полей свободного текста.
Этот контур полезен как fallback/исследовательский baseline и как база для unit-тестов.
src/app.py— основной Streamlit UI и запуск VLM/LLM пайплайна.src/llm_parser.py— преобразование промежуточного текста в JSON через Ollama.src/table_parser.py— парсинг таблиц и полей на OCR-результатах.src/services.py— legacy OCR-пайплайн.src/config.pyиsrc/config_ttn_sample_*.py— шаблоны и конфигурации полей/таблиц.tests/— тесты и фикстуры.docs/ttn_samples/— примеры ТТН.docs/media/— демонстрационные материалы.Analysis_and_structure.md— аналитика и архитектурные решения.Roadmap.md— план работ.
Демонстрация работы проекта доступна по внешней ссылке:
По внутренней проверке на 20 ТТН:
- Успешный разбор: 97%.
- Основной поток обработки в целом работает стабильно.
Наиболее частые источники оставшихся ошибок:
- Английские названия иногда распознаются на русском языке
(смешение кириллицы/латиницы в OCR/VLM-слое). - Неточности форматирования JSON
(например, кавычки без корректного экранирования в промежуточном ответе модели).
Ниже полная пошаговая инструкция для чистой машины.
GitPython 3.10+(рекомендуется 3.10/3.11)pipOllama(для локального LLM-слоя JSON-структурирования)- Достаточно RAM/VRAM для запуска VLM-модели (минимум зависит от конфигурации устройства)
git clone https://github.com/DakariLuin/local-ttn-parser.git
cd local-ttn-parserpython -m venv .venv
.venv\Scripts\Activate.ps1Если политика выполнения блокирует активацию:
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUserpython3 -m venv .venv
source .venv/bin/activatecd src
pip install --upgrade pip
pip install -r requirements.txtВ проекте используются дополнительные пакеты для VLM/LLM-контура (
torch,transformers,openai,qwen-vl-utils).
При необходимости установите их явно:pip install torch transformers openai qwen-vl-utils
- Установите Ollama:
- Windows: https://ollama.com/download
- macOS: https://ollama.com/download
- Linux:
curl -fsSL https://ollama.com/install.sh | sh
- Убедитесь, что сервис Ollama запущен.
- Загрузите модель для JSON-структурирования:
ollama pull qwen2.5:14bИз директории src:
streamlit run app.pyПосле запуска откройте URL из терминала (обычно http://localhost:8501).
- Откройте веб-интерфейс Streamlit.
- Выберите шаблон документа в боковой панели.
- Загрузите изображение ТТН (
png/jpg/jpeg). - Нажмите "Начать разбор".
- Проверьте промежуточный Markdown.
- Нажмите "Сформировать JSON".
- Скачайте результат через "Скачать JSON".
Из корня проекта:
python -m unittest tests/test_table_pipeline.py- Качество зависит от качества скана/фото и читаемости таблиц.
- Сложные случаи смешанной кириллицы/латиницы могут ухудшать точность полей.
- Иногда требуется пост-валидация JSON перед отправкой в downstream-системы.
- Производительность и стабильность VLM-контура зависят от ресурсов машины.
Проект можно использовать как локальный фундамент для автоматизации разбора первичной логистической документации с фокусом на конфиденциальность и расширяемость.