Refactor HVideoTool to exclusively use YOLO for detection and DeepMosaics for restoration: removed classic CV and composite detectors, updated configuration and UI accordingly. Enhanced documentation in README and CLAUDE.md to reflect these changes, including new batch processing capabilities and device diagnostics.

This commit is contained in:
Leonid Pershin
2026-06-07 06:16:05 +03:00
parent cc518cc3e6
commit 9c471ca701
17 changed files with 798 additions and 676 deletions
+66 -57
View File
@@ -64,9 +64,10 @@
кадрам с детекцией ◀/▶ (`[`/`]`). На ползунке **бирюзовыми метками** отмечены кадры
с найденной цензурой; строки списка **подсвечиваются цветом** (🔴 цензура найдена,
🟢 проверено и чисто).
- Переключение **детектора** (`classic` / `yolo` / `combined`) и **порога**
уверенности прямо в тулбаре — удобно сравнивать.
- Выбор файла весов модели кнопкой **«Модель…»**.
- Детекция — через **YOLO** (модель LADA для мозаики). Порог уверенности
настраивается прямо в тулбаре.
- Выбор файла весов модели кнопкой **«Модель…»** (нужная модель ищется в `models/`
автоматически при открытии проекта).
- **Индикатор устройства** в строке состояния: «⚡ CUDA» или «🖥 CPU». Клик по «CPU»
показывает диагностику (почему GPU не задействован) и команды установки PyTorch с
CUDA. Если CUDA недоступна, YOLO и DeepMosaics автоматически работают на CPU
@@ -96,14 +97,24 @@
`<имя>_restored.jpg` рядом с кадром. Движок выбирается в
меню **Файл → Движок восстановления…**.
Два движка:
**Пакетный прогон по диапазону.** Кнопки **«Расцензурить все»** (дозапуск — пропускает
уже сделанные) и **«Все заново»** обрабатывают **все кадры проекта** в фоне и пишут
результаты в папку **`restored/`** проекта (имена кадров сохраняются; папка держится
отдельно от `frames/`, чтобы результаты не попадали обратно в список кадров). Прогресс,
отмена (**«■ Стоп»**) и предпросмотр текущего кадра работают как при детекции.
- **Инпейнт (cv2)** — по умолчанию, без модели и GPU. ⚠️ *Заполняет* область по
окружению, но **не реконструирует** скрытые детали (замазывает, а не раскрывает).
- **DeepMosaics** — реальное генеративное удаление мозаики. Код **встроен** в
приложение (vendored, GPL-3.0), ставить его отдельно не нужно — требуются только
**веса** и (желательно) **GPU NVIDIA/CUDA**. На аниме качество ограничено (модели
обучены на реальном видео).
Расцензуривание — только через **DeepMosaics** (код **встроен** в приложение, vendored,
GPL-3.0; ставить отдельно не нужно — требуются только **веса** и желательно **GPU
NVIDIA/CUDA**). Два движка:
- **DeepMosaics — картинка** — реальное генеративное удаление мозаики **покадрово**.
- **DeepMosaics — видео (BVDNet)** — **временно́й** движок: использует **соседние кадры**
(окно ±2 кадра с шагом 3) и собственный предыдущий результат для когерентности на
роликах. Из-за рекуррентности обрабатывает **непрерывный диапазон по порядку** — т.е.
запускайте его через **«Расцензурить все»** (одиночный «Расцензурить кадр» сведётся к
окну из одного кадра). Нужна **видеомодель** `clean_youknow_video.pth`.
На аниме качество ограничено (модели обучены на реальном видео).
### Настройка DeepMosaics
@@ -112,18 +123,20 @@
([Google Drive](https://drive.google.com/drive/folders/1LTERcN33McoiztYEwBxMuRjjgxh4DEPs),
Baidu код `1x0a`):
- **`clean_youknow_resnet_9blocks.pth`** — картиночная clean-модель;
- **`mosaic_position.pth`** — локатор мозаики (должен лежать рядом).
- **`clean_youknow_resnet_9blocks.pth`** — картиночная clean-модель (движок «картинка»);
- **`clean_youknow_video.pth`** — видеомодель BVDNet (движок «видео», соседние кадры);
- **`mosaic_position.pth`** — локатор мозаики (должен лежать рядом, нужен обоим).
Затем в приложении: **Файл → Движок восстановления… → DeepMosaics**, выберите **модель
из выпадающего списка** (наполняется из `models/deepmosaics`; есть «Обзор…» для файла в
другом месте) и GPU id (`-1` = CPU). Если веса в `models/deepmosaics` — работает сразу;
модель грузится один раз, дальше кадры считаются быстро.
Затем в приложении: **Файл → Движок восстановления…**, выберите движок (**DeepMosaics —
картинка** или **видео**) и **модель из выпадающего списка** (наполняется из
`models/deepmosaics` — для видеодвижка показываются только `clean_*_video.pth`; есть
«Обзор…» для файла в другом месте) и GPU id (`-1` = CPU). Если веса в `models/deepmosaics`
— работает сразу; модель грузится один раз, дальше кадры считаются быстро.
> **Важно:** берите именно **картиночную** модель `clean_youknow_resnet_9blocks.pth`.
> Видеомодель `clean_youknow_video.pth` (BVDNet) покадрово **не работает** — ей нужен
> соседний кадр (приложение это распознаёт и подскажет). Если на кадре нет мозаики,
> результат = исходный кадр.
> **Какую модель брать:** для покадрового движка — **картиночную**
> `clean_youknow_resnet_9blocks.pth`; для временно́го — **видео** `clean_youknow_video.pth`
> (она запускается только пакетно, «Расцензурить все», т.к. ей нужны соседние кадры). Если
> на кадре нет мозаики, результат = исходный кадр.
>
> Код DeepMosaics (GPL-3.0) лежит в `core/restore/_deepmosaics/` и поэтому **весь
> проект распространяется под GPL-3.0**. Запускается на современных `torch 2.x`/
@@ -143,8 +156,8 @@ Baidu код `1x0a`):
- **ОС:** Windows 11 x64 (основная целевая платформа).
- **Python:** 3.11+.
- **GPU (опционально):** NVIDIA + CUDA для YOLO-детектора. CPU-режим работает, но
медленный. Для `classic` детектора ни torch, ни GPU не нужны.
- **GPU (опционально):** NVIDIA + CUDA для YOLO-детектора и DeepMosaics. CPU-режим
работает, но медленный (особенно DeepMosaics / временно́й BVDNet).
## Установка
@@ -153,12 +166,11 @@ git clone https://github.com/mrleo1nid/HVideoTool.git
cd HVideoTool
python -m venv .venv
.\.venv\Scripts\Activate.ps1
pip install -e .
pip install -e ".[yolo]"
```
Этого достаточно для `classic` детектора — **PyTorch/CUDA не требуются**. Они
нужны только для YOLO/комбинированного детектора (см.
[Модель детектора](#модель-детектора)).
Детекция (YOLO) и расцензуривание (DeepMosaics) требуют **PyTorch** — установите его
отдельно под вашу CUDA (см. [Модель детектора](#модель-детектора)).
## Запуск
@@ -166,29 +178,23 @@ pip install -e .
# Без аргументов — открывается последний проект (или создайте/откройте новый в тулбаре)
python -m hvideotool
# Необязательно: сразу открыть проект / переопределить детектор и модель (по умолчанию)
python -m hvideotool "C:\path\to\МойПроект" --detector yolo --model models\lada_mosaic_detection_model_v4_accurate.pt
# Необязательно: сразу открыть проект и указать модель YOLO
python -m hvideotool "C:\path\to\МойПроект" --model models\lada_mosaic_detection_model_v4_accurate.pt
```
Выбор детектора, путь к модели и порог сохраняются в `~/HVideoTool/settings.json`
и применяются при следующем запуске.
Путь к модели и порог сохраняются в `~/HVideoTool/settings.json` и применяются при
следующем запуске.
---
## Модель детектора
Интерфейс детектора абстрагирован (`core/detection/base.py`), детектор
выбирается в тулбаре (или флагом `--detector`):
- `classic` — эвристический classic-CV детектор (`core/detection/classic_cv.py`).
Различает `mosaic` / `blur` / `black_bar`, без весов и без GPU.
**Приблизительный**: на реальном видео даёт много ложных срабатываний, заточен
скорее под рисованный/аниме контент — но и там ненадёжен.
- `yolo` — ML-детектор на базе [Ultralytics](https://github.com/ultralytics/ultralytics)
(`core/detection/yolo.py`). **Сегментационная** модель — маски превращаются в
контуры. Рекомендуемые веса — [**LADA mosaic detection**](https://huggingface.co/ladaapp/lada).
- `combined``CompositeDetector`: YOLO (мозаика) + classic-CV (плашки/размытие),
результаты объединяются с дедупликацией по IoU.
Детекция — **только YOLO** (интерфейс абстрагирован в `core/detection/base.py`):
ML-детектор на базе [Ultralytics](https://github.com/ultralytics/ultralytics)
(`core/detection/yolo.py`), **сегментационная** модель — маски превращаются в
контуры. Рекомендуемые веса — [**LADA mosaic detection**](https://huggingface.co/ladaapp/lada).
(Старый эвристический classic-CV детектор и комбинированный режим удалены — давали
много ложных срабатываний.)
> **⚠️ Берите правильную модель.** Для YOLO нужна модель **детекции цензуры**
> (LADA `lada_mosaic_detection_model_v4_accurate.pt`). Если по ошибке указать
@@ -207,7 +213,7 @@ python -m hvideotool "C:\path\to\МойПроект" --detector yolo --model mod
```powershell
python scripts\training\gen_mosaic_dataset.py --input C:\clean_frames --output dataset_mosaic
python scripts\training\train_mosaic.py --data dataset_mosaic\data.yaml --epochs 100
# затем: тулбар → Детектор yolo → «Модель…» → runs\segment\mosaic\weights\best.pt
# затем: тулбар → «Модель…» → runs\segment\mosaic\weights\best.pt
```
Установка YOLO-детектора:
@@ -219,11 +225,11 @@ pip install torch torchvision --index-url https://download.pytorch.org/whl/cu121
curl.exe -L -o models\lada_mosaic_detection_model_v4_accurate.pt `
"https://huggingface.co/ladaapp/lada/resolve/main/lada_mosaic_detection_model_v4_accurate.pt?download=true"
python -m hvideotool --detector yolo --model models\lada_mosaic_detection_model_v4_accurate.pt
python -m hvideotool --model models\lada_mosaic_detection_model_v4_accurate.pt
```
> **⚠️ Лицензия.** Ultralytics YOLO и веса LADA — **AGPL-3.0**. Classic-CV детектор
> от этого свободен.
> **⚠️ Лицензия.** Ultralytics YOLO и веса LADA — **AGPL-3.0**; код DeepMosaics —
> **GPL-3.0**. Поэтому весь проект распространяется под **GPL-3.0**.
---
@@ -243,14 +249,17 @@ hvideotool/
├── imageio.py # unicode-safe чтение/запись картинок (Windows-пути)
├── project.py # Project: раскладка (project.json/frames/detections.json/collections) + настройки
├── video/frame.py # Frame (картинка BGR + индекс + pts) — вход детектора
── detection/
├── base.py # Detector (ABC): detect(frame) -> list[Detection]
├── factory.py # build_detector(config) -> classic/yolo/combined
├── types.py # Detection (+ to_dict/from_dict), CensorType
├── cache.py # сохранение/загрузка кэша детекций (detections.json в проекте)
── classic_cv.py # эвристический детектор (mosaic/blur/black_bar)
├── yolo.py # YOLO-детектор (Ultralytics, маски→полигоны)
── composite.py # CompositeDetector: объединение детекторов
── detection/ # только YOLO
├── base.py # Detector (ABC): detect(frame) -> list[Detection]
├── factory.py # build_detector(config) -> yolo
├── types.py # Detection (+ to_dict/from_dict), CensorType
├── cache.py # сохранение/загрузка кэша детекций (detections.json)
── yolo.py # YOLO-детектор (Ultralytics, маски→полигоны)
└── restore/ # только DeepMosaics
── base.py # Restorer (ABC): restore() + restore_sequence() + .temporal
├── factory.py # build_restorer -> deepmosaics | deepmosaics_video
├── deepmosaics.py # движки «картинка» (покадрово) и «видео» (BVDNet)
└── _deepmosaics/ # встроенный код DeepMosaics (GPL-3.0)
```
Детекция синхронная (по клику/по кнопке «Детектировать все»); тяжёлый YOLO на CPU
@@ -264,9 +273,9 @@ hvideotool/
| Язык | Python ≥ 3.11 |
| GUI | PySide6 (Qt 6) |
| Обработка картинок | OpenCV / NumPy |
| Детектор (без весов) | classic-CV эвристика (без GPU) |
| Детектор (ML) | Ultralytics YOLO + PyTorch/CUDA (LADA) |
| Детектор | Ultralytics YOLO + PyTorch/CUDA (веса LADA) |
| Расцензуривание | DeepMosaics (встроен) + PyTorch/CUDA |
## Лицензия
TBD.
**GPL-3.0** — из-за встроенного кода DeepMosaics (GPL-3.0); веса/код YOLO LADA — AGPL-3.0.