156 lines
5.4 KiB
Markdown
156 lines
5.4 KiB
Markdown
# OCR Annotator
|
||
|
||
Веб-инструмент для разметки кропов текста. Показывает изображение, вы вводите текст,
|
||
результат сохраняется в `labels.tsv` — готовый формат для дообучения TrOCR.
|
||
|
||
## Быстрый старт через Docker
|
||
|
||
### 1. Установите Docker и Docker Compose (если ещё нет)
|
||
|
||
```bash
|
||
# Ubuntu / Debian
|
||
sudo apt update
|
||
sudo apt install -y docker.io docker-compose-plugin
|
||
|
||
# Добавьте себя в группу docker (чтобы не писать sudo)
|
||
sudo usermod -aG docker $USER
|
||
newgrp docker
|
||
```
|
||
|
||
### 2. Скачайте / разархивируйте проект
|
||
|
||
```bash
|
||
# Перейдите в папку проекта
|
||
cd ocr-annotator
|
||
```
|
||
|
||
### 3. Положите ваши кропы в папку data/images
|
||
|
||
```bash
|
||
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. Запустите
|
||
|
||
```bash
|
||
docker compose up --build
|
||
```
|
||
|
||
Откройте браузер: **http://localhost:5000**
|
||
|
||
При следующих запусках (образ уже собран):
|
||
```bash
|
||
docker compose up
|
||
```
|
||
|
||
Остановить:
|
||
```bash
|
||
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
|
||
|
||
```python
|
||
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 (если нужно)
|
||
|
||
```bash
|
||
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 # ← сюда пишется разметка
|
||
```
|