⚠️ NO-KEY GUARD (обязательно): этот функционал требует ОПЦИОНАЛЬНОГО стороннего API-ключа. Перед вызовом проверь ключ в
.credentials.master.env. Если ключ отсутствует, пустой или placeholder (your_*_api_key) — НЕ проси пользователя оплатить счёт, включить биллинг или купить API. Скажи одной строкой: «Эта функция опциональна и требует свой API-ключ (например, бесплатный ключ на aistudio.google.com); из коробки всё остальное работает по подписке Claude» — и предложи альтернативу или продолжай без неё.
Edit Banana — Редактирование текста на картинках
Аналог: editbanana.anxin6.cn/app (web demo) GitHub: BIT-DataLab/Edit-Banana (Apache 2.0) Локальная установка:
~/Edit-Banana/venv:~/Edit-Banana/.venv/(Python 3.11, uv)
⚠️ Пути в примерах ниже записаны в Windows-раскладке venv. Интерпретатор внутри venv лежит по-разному: Windows —
.venv/Scripts/python.exe, macOS и Linux —.venv/bin/python. Везде дальше по файлу читайScripts/python.exeкакbin/python, если ты не на Windows; иначе получишьNo such file or directoryпри полностью собранном venv и пойдёшь переустанавливать то, что уже стоит. Обёрткаscripts/edit-banana.shобе раскладки проверяет сама.
Что делает
Превращает статичные изображения диаграмм/таблиц/формул в редактируемые DrawIO XML-файлы с сохранением:
- Оригинального layout (позиции элементов)
- Цветов и оформления
- Логических связей (стрелки, линии)
- Текста (в редактируемых блоках)
Экспорт: DrawIO XML (основной) → SVG/PNG/PowerPoint через конверсию в draw.io.
Когда использовать
- Редактирование текста на скриншоте диаграммы (flowchart, архитектурная схема)
- Перевод диаграммы на другой язык без перерисовки
- Извлечение таблиц в редактируемый формат
- Реконструкция формул в LaTeX
- "Оживление" старых PDF/PNG презентаций
Быстрый старт
Single image (CLI)
cd ~/Edit-Banana
.venv/Scripts/python.exe main.py -i input/diagram.png
# → output/diagram.xml (открыть в app.diagrams.net)
Batch processing
cd ~/Edit-Banana
cp ~/Downloads/*.png input/
.venv/Scripts/python.exe main.py
# → output/*.xml для всех картинок из input/
Web API (FastAPI)
cd ~/Edit-Banana
.venv/Scripts/python.exe server_pa.py
# → http://localhost:8000/docs (Swagger UI)
Архитектура pipeline
Input PNG/JPG
↓
[1] SAM 3 segmentation (CUDA on your GPU)
↓ boxes for shapes, arrows, backgrounds, images
[2] PaddleOCR text recognition (per-element)
↓ text content + positions
[3] Gemini 2.5 Flash VLM (structure guidance)
↓ logical hierarchy, element classification
[4] DrawIO XML generation
↓ merge spatial + text + semantic
Output XML
Конфигурация
~/Edit-Banana/config/config.yaml:
| Параметр | Значение | Что делает |
|---|---|---|
sam3.checkpoint_path |
models/sam3_ms/sam3.pt |
SAM3 веса (~4 GB) |
sam3.bpe_path |
models/bpe_simple_vocab_16e6.txt.gz |
BPE токенизатор |
ocr.engine |
paddleocr |
Text recognition (можно переключить на tesseract) |
multimodal.model |
gemini-2.5-flash |
VLM для структуры |
multimodal.api_key |
${GOOGLE_API_KEY} |
Ключ из .credentials.master.env |
multimodal.base_url |
https://generativelanguage.googleapis.com/v1beta/openai/ |
Gemini OpenAI-compatible endpoint |
Смена VLM
- Gemini 2.5 Flash (по умолчанию, быстро, дёшево):
model: "gemini-2.5-flash" - Gemini 2.5 Pro (точнее, медленнее):
model: "gemini-2.5-pro" - Claude Opus via AI Gateway: указать OpenAI-compat endpoint на your-server gateway
- Локальная VLM (Ollama): установить
qwen2.5vlв Ollama,mode: "local"
Применённые патчи (Windows + torch 2.5.1)
Без патча pipeline падал на [2] Segmentation (SAM3) с dtype mismatch
(BFloat16 vs Float) в perflib/fused.addmm_act: fused kernel кастует mat1/mat2
в bf16, но смежные Linear слои работают в float32 → конфликт.
Единственный нужный патч: sam3_src/sam3/perflib/fused.py:addmm_act() —
заменён fused bf16 путь на обычный torch.nn.functional.linear + activation.
Скорость снижается незначительно, pipeline стабилен на GPU.
Что получаем на выходе
output/<basename>/:
<basename>_merged.drawio.xml— главный результат, редактируемая диаграмма для draw.iotext_only.drawio— только текстовый слой (из OCR)sam3_extraction.png— визуализация найденных shape-элементовsam3_metadata.json— метаданные всех сегментов (bbox, mask, score)
Пример результата (smoke test)
Демо static/demo/original_1.jpg (flowchart):
- 62 текстовых блока (PaddleOCR, 83 сек)
- 60 icons + 34 SAM3 shapes + 4 CV shapes = 98 фрагментов
- 160 элементов в итоговом DrawIO XML (287 KB)
- Время: ~3 мин на дискретной видеокарте
Установка (один раз, до первого запуска)
Пак несёт только этот навык-инструкцию; сам Edit-Banana ставится с GitHub.
~/Edit-Banana — просто договорённость о месте: положишь в другое — подставляй
свой путь во всех командах ниже.
git clone https://github.com/BIT-DataLab/Edit-Banana ~/Edit-Banana
cd ~/Edit-Banana
uv venv --python 3.11 .venv # Windows: .venv/Scripts/, *nix: .venv/bin/
uv pip install --python .venv -r requirements.txt
uv pip install --python .venv torch --index-url https://download.pytorch.org/whl/cu121
git clone https://github.com/facebookresearch/sam3 && uv pip install --python .venv -e sam3
uv pip install --python .venv paddlepaddle==3.2.2 paddleocr
cp config/config.example.yaml config/config.yaml # вписать GOOGLE_API_KEY и ocr.engine
Отдельно докачать:
- BPE vocab →
models/bpe_simple_vocab_16e6.txt.gz - SAM3 веса (
models/sam3_ms/sam3.pt, ~4 GB) — с ModelScope, см. ниже - Tesseract — опционально, по умолчанию работает PaddleOCR
Если SAM3 веса не докачались
~/Edit-Banana/.venv/Scripts/python.exe -c "
import os
from modelscope import snapshot_download
snapshot_download('facebook/sam3', cache_dir=os.path.expanduser('~/Edit-Banana/models_ms_cache'), allow_patterns=['sam3.pt'])
"
# → переместить файл в models/sam3_ms/sam3.pt
mv ~/Edit-Banana/models_ms_cache/facebook/sam3/sam3.pt ~/Edit-Banana/models/sam3_ms/
Установка Tesseract (опционально)
# Вариант A (choco — на момент установки сервер был 503):
choco install tesseract --yes
# Вариант B (winget):
winget install UB-Mannheim.TesseractOCR
# Вариант C (вручную): скачать с https://github.com/UB-Mannheim/tesseract/wiki
После установки изменить ocr.engine: "tesseract" в config.yaml.
Опциональные модули
Pix2Text (распознавание формул → LaTeX):
uv pip install --python ~/Edit-Banana/.venv pix2text onnxruntime-gpu
RMBG (удаление фона у иконок):
uv pip install --python ~/Edit-Banana/.venv onnxruntime modelscope
cd ~/Edit-Banana && .venv/Scripts/python.exe scripts/setup_rmbg.py
Troubleshooting
| Ошибка | Причина | Решение |
|---|---|---|
no kernel image is available |
GPU arch mismatch | Upgrade PyTorch или device: "cpu" в config |
Model file not found at sam3.pt |
Веса не скачались | См. "Если SAM3 веса не докачались" |
PaddleOCR inference failed |
Баг в paddlepaddle 3.3.0+ | Поставить ровно 3.2.2 |
Gemini API error 403 |
Неправильный ключ | Проверить GOOGLE_API_KEY в .credentials.master.env |
GatedRepoError на HF |
SAM3 закрыт на HuggingFace | Использовать ModelScope (уже в настройках) |
CLI wrapper (для вызова из любой директории)
Скрипт ~/.claude/skills/edit-banana/scripts/edit-banana.sh — обёртка,
принимает путь к картинке и вызывает pipeline из корректной директории.
bash ~/.claude/skills/edit-banana/scripts/edit-banana.sh path/to/diagram.png
# → результат в ~/Edit-Banana/output/
Триггеры (routing)
Вызывать при запросах:
- "редактировать текст на картинке"
- "перевести диаграмму"
- "извлечь таблицу в редактируемый формат"
- "конвертировать PNG в drawio"
- "edit banana"
Ссылки
- GitHub: https://github.com/BIT-DataLab/Edit-Banana
- Web demo: https://editbanana.anxin6.cn/
- SAM 3 (facebook): https://github.com/facebookresearch/sam3
- PaddleOCR: https://github.com/PaddlePaddle/PaddleOCR