- Python 100%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
View → Tag Browser… opens a window to search the bundled tags.db. TagDb (tag_db.py) gained: - search(query, source, category_code, limit): prefix search sorted by count, uses idx_tag_name. SQL LIKE wildcards _ and % in the query are escaped, so danbooru underscores are matched literally (long_hair no longer matches long-hair). - aliases_for(tag_id): aliases that resolve to this tag. - categories_for_source / category_name: category lookups. TagBrowserDialog: - prefix search with debounce; filter by source (danbooru / e621) and category (the category list refreshes when the source changes). - results table: tag / category / count (formatted with thousands separator) / source, sorted by count desc, capped at 300. - selecting a row shows the incoming aliases on the right; double-click an alias to search its canonical form. - buttons: copy tag to clipboard, or insert into the current image's caption (deduped, written in the existing caption format, cache refreshed). Available from the menu when a dataset with tags.db is open. Co-Authored-By: GLM-5.1 <noreply@z.ai> |
||
| app | ||
| .gitignore | ||
| main.py | ||
| README.md | ||
| requirements.txt | ||
SD Dataset Viewer
Просмотрщик датасетов для обучения LoRA (Stable Diffusion и подобные). Позволяет одновременно видеть изображение и его подпись (caption), перемещаться по всему датасету с вложенными папками и сетевыми расположениями, а также редактировать теги с автодополнением и массовыми операциями.
Возможности
- Два вида:
- Галерея — дерево файловой системы слева (со списком дисков и миниатюрами изображений) и сетка миниатюр справа с фильтром по имени файла или тегам.
- Просмотр — крупное изображение + редактор подписи + навигация вперёд/назад. Двойной клик по миниатюре открывает просмотр.
- Режим сравнения эпох (
Файл → Сравнение эпох…) — отдельный режим для сравнения версий одного сэмпла из разных эпох обучения LoRA. См. ниже. - Навигация по файловой системе:
- корень дерева — список дисков (кнопка «Компьютер»);
- кнопка «↑ Вверх» для подъема на уровень;
- двойной клик по папке в дереве — раскрыть и просканировать как датасет;
- кнопка «Обзор…» или ввод пути в строку + Enter — открыть датасет.
- В дереве сортировка: директории сверху, затем файлы по алфавиту (без учёта регистра).
- Форматы подписей (автоопределение по расширению рядом с изображением):
.txt— текст подписи целиком (теги через запятую)..toml— поляcaptionиtags..json/.jsonl— объект с полямиcaptionиtags.
- Сетевые папки и UNC-пути (
\\server\share\...) поддерживаются напрямую. - Вложенные папки сканируются рекурсивно.
- Автодополнение тегов из частотного словаря текущего датасета — подсказки сортируются по популярности тега в датасете.
- Массовые операции по выбранному диапазону или всему датасету:
- добавить тег;
- удалить тег;
- заменить тег (с возможностью удаления, если новый пустой).
- Фильтр кропов в галерее — выпадающий список «Все файлы / Только кропы /
Без кропов» для показа или сокрытия обрезков (
{name}_cropN). Комбинируется с текстовым фильтром по имени/тегам. - VLM-теггинг (
🤖 VLM тегив просмотре) — пересоздание подписей через локальную VLM (LM Studio / llama.cpp, OpenAI-совместимый API). После кропа можно запустить теггинг для новых обрезок; результат показывается для проверки и правки перед сохранением. См. ниже. - Валидация и нормализация тегов по
tags.db(danbooru/e621): проверка тегов на существование в выбранном источнике, замена алиасов каноническими именами, удаление ненайденных/deprecated. По одному файлу —🔍 Проверить тегив просмотре; по всему датасету —🔍 Нормализовать тегив галерее. См. ниже. - Браузер тегов (
Вид → Браузер тегов…) — поиск поtags.dbс фильтром по источнику (danbooru/e621) и категории, частота (count) и список алиасов, ссылающихся на тег. Найденный тег можно скопировать или вставить в подпись текущего изображения.
Настройки датасета и VLM-теггинг
Настройки хранятся в корне датасета в dataset_config.json (кнопка
⚙ Настройки в галерее или меню Файл → Настройки датасета…):
- Целевая SD-модель (Illustrious-XL, NoobAI-XL, Pony, Animagine, SDXL, SD 1.5, Flux.1, Custom) — влияет на стиль тегов в промпте.
- Инструкции — свободный текст пожеланий («danbooru tags, без рейтингов, английский» и т.п.).
- VLM endpoint и модель — для LM Studio по умолчанию
http://localhost:1234/v1. Кнопка «Проверить» стучится в/v1/modelsи подставляет первую доступную модель. - Temperature, Max tokens, флаг «передавать старые теги» модели для фильтрации/дополнения.
VLM-теггинг
- В просмотре: 🤖 VLM теги — запрос для текущего изображения. После ответа модели открывается диалог со старыми и новыми тегами — можно отредактировать (есть кнопка «← Вернуть старые») и сохранить.
- После кропа приложение предлагает запустить теггинг для всех новых обрезок по очереди.
- В запросе участвуют: целевая модель, инструкции, опционально старые теги
и само изображение (base64). Поддерживаются любые OpenAI-совместимые
сервера с vision (LM Studio, llama.cpp server с
--mmproj, Ollama с OpenAI-эндпоинтом и т.п.). Сетевых вызовов наружу не делается.
Валидация и нормализация тегов (tags.db)
Файл tags.db (SQLite, ~25 МБ) содержит дамп тегов и алиасов danbooru и e621:
таблицы tag, alias, category, source. Положите его рядом с приложением
или укажите путь в «Настройках датасета». Источник тегов выбирается там же:
auto (по целевой модели — danbooru для Illustrious/NoobAI/Pony/Animagine/
SDXL/SD1.5, none для Flux/Custom), либо явно danbooru / e621 / none.
- 🔍 Проверить теги (в просмотре) — для текущего изображения открывается отчёт: каждый тег помечается как ✓ валиден / → алиас / ✗ не найден / ⚠ deprecated (e621, категория invalid). Показан канонический вариант, категория и count. Опции (чекбоксы): применить алиасы, удалить ненайденные, удалить deprecated, убрать дубликаты. Превью результата — перед сохранением.
- 🔍 Нормализовать теги (в галерее) — то же по выбранному диапазону или всему датасету, с прогресс-баром.
Все lookups идут через индексы SQLite (idx_tag_name, idx_alias_tag), 1000
файлов обрабатываются за пару секунд. Алиасы раскрываются в канонические имена
(1girls → 1girl, high_res → highres и т.п.), что повышает стабильность
обучения под конкретный тег-сортс.
Браузер тегов
Вид → Браузер тегов… — поиск тегов по tags.db (нужен открытый датасет, для
которого найден tags.db).
- Поиск по буквенному префиксу (использует индекс
idx_tag_name; символы_и%в запросе экранированы, т.к. danbooru-имена содержат_). - Фильтр по источнику (danbooru / e621) и категории (general, artist, copyright, character, meta, species…). Список категорий обновляется под выбранный источник.
- В таблице: тег, категория, count (частота), источник. Сортировка по убыванию count.
- При выборе тега справа — список алиасов, которые раскрываются в этот
тег (например для
1girlэто1girls,sole_female). Двойной клик по алиасу — поискать его как канонический. - Кнопки «📋 Копировать тег» и «↧ Вставить в подпись» (добавляет тег к подписи текущего изображения в просмотре, без дубликатов).
- Сохранение с подтверждением при переходе, горячая клавиша
Ctrl+S. - Кроп/ресайз (
✂ Кроп…в режиме просмотра) — интерактивная рамка поверх изображения: drag — двигать, колесо — размер. Цель — прямоугольник с двумя сторонами (по умолчанию 1536×1536), есть пресеты популярных размеров SDXL и кнопка↔для swap W/H. Aspect рамки всегда равен аспекту цели, поэтому при ресайзе нет искажений. Можно сделать несколько обрезок — каждая сохраняется как{name}_crop{N}.{ext}в ту же папку с переносом подписи из исходника (в тот же формат txt/toml/json/jsonl). После кропа галерея автоматически пересканируется.
Кроп/ресайз изображений
В режиме просмотра нажмите ✂ Кроп… (несохранённая подпись сначала
сохраняется — она перенесётся в обрезки).
- Поверх исходного изображения — прямоугольная рамка. Drag внутри рамки — двигает её, колесо мыши — масштаб (aspect сохраняется).
- Цель задаётся двумя сторонами W × H вручную (spinbox'ы 64–8192) или
пресетом из списка (1536×1536, 1024×1024, 1152×896, 896×1152, 1216×832,
832×1216, 1344×768, 768×1344, 1536×640, 640×1536, 512×512). Кнопка
↔меняет W и H местами (портрет ↔ ландшафт). - Aspect рамки всегда = W : H, поэтому при ресайзе до цели нет искажений.
- Справа — превью целевого прямоугольника.
- «Сохранить обрезку» — создаёт файл
{name}_crop{N}.{ext}в той же папке (номерNподбирается свободным) и копирует подпись исходника в тот же формат ({name}_crop{N}.txt/.toml/.jsonl). Можно сохранить ещё одну обрезку — счётчик покажет, сколько сохранено. - «Готово» закрывает диалог; галерея автоматически пересканируется.
Кроп и ресайз через Pillow (LANCZOS), расширение сохраняется как у исходника.
Режим сравнения эпох
Отдельный режим для выбора лучшей эпохи обучения LoRA. Откройте папку, в которой каждая подпапка — отдельная эпоха:
compare_root/
mt_lora-000001/ ← Epoch 1
scene_001.png
scene_002.png
mt_lora-000002/ ← Epoch 2
scene_001.png ← тот же промпт/сид, другая LoRA
scene_002.png
...
baseline/ ← папка без trailing-номера показывается как есть
Как пользоваться:
- Сэмплы сопоставляются по одинаковому имени файла между эпохами.
- Слева — список сэмплов (помечаются ★ при наличии голоса) и статистика по эпохам с прогресс-баром голосов.
- В центре — сетка версий всех эпох для текущего сэмпла. Отметьте галочками лучшие версии (можно несколько за один сэмпл).
- Двойной клик по версии — полноразмерный просмотр с зумом
(
Ctrl + колесо мыши), навигация между эпохами стрелками← / →. - Навигация по сэмплам — кнопки или стрелки
← / →. - Голоса сохраняются в
votes.jsonв корне сравнения (атомарно) и переживают перезапуск; файл можно коммитить в репозиторий или делиться.
Номер эпохи извлекается из trailing-цифр имени папки (mt_lora-000007 → 7);
папки без номера сортируются после нумерованных.
Горячие клавиши (в режиме просмотра)
| Клавиша | Действие |
|---|---|
← / ↑ / PageUp |
предыдущее изображение / сэмпл |
→ / ↓ / PageDown |
следующее изображение / сэмпл |
Ctrl+S |
сохранить подпись |
Ctrl+Enter |
сохранить и перейти к следующему |
Esc |
вернуться в галерею |
Ctrl + колесо мыши |
зум изображения |
Стрелки листают только когда фокус не в поле редактирования подписи.
Установка
pip install -r requirements.txt
Требуется Python 3.10+. Для TOML на Python 3.10 пакет tomli ставится
автоматически как зависимость PySide6; на Python 3.11+ используется
встроенный tomllib.
Запуск
python main.py
Затем: Файл → Открыть папку… (или кнопка на панели галереи) и выбрать корень датасета.
Форматы файлов подписей
Для изображения image.png ищется первый существующий файл:
image.txt → содержимое = подпись (теги через запятую)
image.toml → caption = "...", tags = [...]
image.json → {"caption": "...", "tags": [...]}
image.jsonl → одна строка: {"caption": "...", "tags": [...]}
При редактировании подпись сохраняется в тот же формат, в котором файл уже
существовал. Если файла подписи не было, создаётся .txt.
Структура проекта
main.py — точка входа (+ настройка плагинов Qt)
app/
caption_io.py — чтение/запись txt/toml/jsonl
dataset.py — скан папок, кэш тегов, массовые операции
dataset_config.py — настройки датасета (dataset_config.json)
thumbnail_loader.py — ленивая загрузка миниатюр в фоновом потоке
tag_completer.py — поле редактора с автодополнением
gallery_view.py — дерево папок + сетка миниатюр
image_label.py — QLabel с зумом (общий для detail и сравнения)
detail_view.py — просмотр: изображение + редактор + навигация
batch_ops_dialog.py — диалог массовых операций
crop_dialog.py — диалог кропа/ресайза
vlm_client.py — клиент к локальной VLM (OpenAI-совместимый API)
dataset_settings_dialog.py — диалог настроек датасета
vlm_result_dialog.py — проверка/правка тегов после VLM
tag_db.py — lookups/валидация/нормализация тегов по tags.db
tag_check_dialog.py — отчёт по тегам + опции нормализации (одиночный)
tag_normalize_dialog.py — опции нормализации (массовая)
tag_browser_dialog.py — браузер тегов (поиск/алиасы/count)
compare_model.py — модель режима сравнения эпох + votes.json
compare_view.py — UI режима сравнения + полноразмерный просмотр
main_window.py — главное окно, стек видов, меню
thumb_filesystem_model.py — модель дерева с асинхронными миниатюрами