| templates | ||
| .gitignore | ||
| app.py | ||
| docker-compose.yml | ||
| Dockerfile | ||
| README.md | ||
OCR Annotator
Веб-инструмент для разметки кропов текста. Показывает изображение, вы вводите текст,
результат сохраняется в labels.tsv — готовый формат для дообучения TrOCR.
Быстрый старт через Docker
1. Установите Docker и Docker Compose (если ещё нет)
# Ubuntu / Debian
sudo apt update
sudo apt install -y docker.io docker-compose-plugin
# Добавьте себя в группу docker (чтобы не писать sudo)
sudo usermod -aG docker $USER
newgrp docker
2. Скачайте / разархивируйте проект
# Перейдите в папку проекта
cd ocr-annotator
3. Положите ваши кропы в папку data/images
mkdir -p data/images
# Скопируйте ваши кропы:
cp /path/to/your/crops/*.jpg data/images/
# или
cp -r /path/to/your/crops/. data/images/
Поддерживаемые форматы: jpg, jpeg, png, bmp, tiff, webp
4. Запустите
docker compose up --build
Откройте браузер: http://localhost:5000
При следующих запусках (образ уже собран):
docker compose up
Остановить:
docker compose down
🤖 Авто-разметка (TrOCR)
В шапке рабочего экрана есть кнопка 🤖 Авто-разметка. Она прогоняет все неразмеченные картинки текущей подпапки через модель TrOCR и сохраняет предсказания с пометкой «авто» — то есть требуется ручная перепроверка.
- Авто-метки в списке файлов и в счётчике отмечены оранжевым и значком 🤖.
- Фильтр 🤖 Проверить показывает только авто-метки, ожидающие проверки.
- Как только вы вручную сохраняете такую метку (Enter / «Сохранить»), пометка «авто» снимается — метка становится проверенной.
- Прогресс показывается в статус-баре; разметка идёт в фоне, можно продолжать проверять уже готовые картинки.
Модель задаётся переменной TROCR_MODEL (по умолчанию raxtemur/trocr-base-ru
— TrOCR, дообученная на русский). Можно указать любую HuggingFace-модель типа
VisionEncoderDecoder, например microsoft/trocr-base-printed. При первом
запуске модель скачивается из HuggingFace и кэшируется в data/hf_cache
(переменная HF_HOME), поэтому повторные запуски быстрые.
В экспортируемый
labels.tsvпометка «авто» не попадает — там остаётся чистый форматимя_файла<TAB>текстдля дообучения TrOCR.
Горячие клавиши
| Клавиша | Действие |
|---|---|
Enter |
Сохранить и перейти дальше |
Tab |
Пропустить (без сохранения) |
Alt + → |
Следующее изображение |
Alt + ← |
Предыдущее изображение |
Результат
Файл data/labels.tsv — табуляция-разделённый файл:
crop_001.jpg Иванов И.И.
crop_002.jpg ул. Ленина, д. 5
crop_003.jpg СЧЁТ-ФАКТУРА
Скачать через интерфейс: кнопка ⬇ Экспорт TSV, или забрать прямо из папки data/labels.tsv.
Использование для дообучения TrOCR
from datasets import Dataset
from PIL import Image
import pandas as pd
# Читаем разметку
df = pd.read_csv("data/labels.tsv", sep="\t", header=None, names=["file_name", "text"])
df["image"] = df["file_name"].apply(lambda f: Image.open(f"data/images/{f}").convert("RGB"))
dataset = Dataset.from_pandas(df[["image", "text"]])
# Далее — стандартный fine-tuning TrOCR через HuggingFace Trainer
Запуск без Docker (если нужно)
pip install flask gunicorn
# для кнопки «🤖 Авто-разметка» дополнительно:
pip install torch transformers pillow sentencepiece
export IMAGES_DIR=./data/images
export OUTPUT_FILE=./data/labels.tsv
export TROCR_MODEL=raxtemur/trocr-base-ru # необязательно
python app.py
# или через gunicorn:
gunicorn --bind 0.0.0.0:5000 app:app
Структура проекта
ocr-annotator/
├── app.py # Flask backend
├── Dockerfile
├── docker-compose.yml
├── templates/
│ └── index.html # UI
└── data/
├── images/ # ← кладите сюда кропы
└── labels.tsv # ← сюда пишется разметка