HVideoTool

Десктопная утилита с графическим интерфейсом для обнаружения уже наложенной цензуры (мозаика, пикселизация, размытие, чёрные плашки) на картинках. Работа организована в проекты: создаёте проект (или раскадровываете ролик кнопкой «Создать из ролика…») — приложение прогоняет каждый кадр через детектор, обводит найденные области и показывает подробный список того, что нашлось на каждой картинке. Отобранные кадры можно перемещать в избранное (для сбора датасета/ примеров).

Проект

Проект — это папка со всем необходимым:

МойПроект/
├── project.json        # настройки проекта (детектор, модель, порог, движок) + метаданные
├── frames/             # картинки проекта
├── detections.json     # кэш детекций
└── collections/        # коллекции; «Избранное» — папка для отобранных кадров

Настройки (детектор / модель / порог / движок восстановления) хранятся внутри проекта — каждый проект помнит, как его настраивали. Глобальные настройки (~/HVideoTool/settings.json) задают лишь значения по умолчанию для новых проектов и список недавних. При запуске без аргументов автоматически открывается последний проект.

Инструмент для просмотра, отладки детекции и отбора кадров. Видео раскадровывает через ffmpeg (ставится автоматически с пакетом imageio-ffmpeg; системный ffmpeg из PATH используется в приоритете), либо через OpenCV.


Возможности

  • Проекты: «Создать проект…», «Открыть проект…», «Импортировать папку как проект…» (копирует картинки из обычной папки в frames/ нового проекта) и подменю «Недавние проекты».
  • Создать из ролика… — раскадровка видео в новый проект (кадры в frames/). Два режима: только ключевые кадры (в разы быстрее — декодируются лишь I-кадры) и каждый N-й кадр; опциональный даунскейл (меньше файлов и нагрузки на диск/АВ). ffmpeg идёт в комплекте (imageio-ffmpeg); системный ffmpeg из PATH — в приоритете.
  • Избранное: «★ В избранное» (Ctrl+M) перемещает выбранные кадры в папку collections/Избранное внутри проекта — для отбора кадров (мультивыбор поддерживается). Папка создаётся автоматически.
  • Картинки проекта (.jpg/.png/.bmp/.webp/.tif) — список слева.
  • Картинка с обводкой контуром найденных областей — по центру.
  • Подробная таблица детекций справа: тип, уверенность, bbox, число точек полигона. Выбор строки подсвечивает конкретную область на картинке.
  • Ленивая детекция: картинка прогоняется по двойному клику / кнопке «Рассчитать кадр», результат кэшируется.
  • Кэш детекций сохраняется в проект (см. ниже) — при повторном открытии проекта результаты подхватываются, не нужно считать заново.
  • Три режима пересчёта:
    • «Детектировать все»дозапуск: считает только ещё не посчитанные кадры (можно прерывать и продолжать);
    • «Все заново» — полная регенерация: очищает кэш и пересчитывает весь проект;
    • «Рассчитать кадр» (Space / двойной клик) — всегда пересчитывает текущий кадр.
  • Кнопка «■ Стоп» (Esc) отменяет любую текущую длинную операцию (детекция всего проекта, раскадровка ролика, импорт папки, восстановление DeepMosaics). Уже посчитанное при отмене сохраняется в кэш.
  • Навигация под картинкой: ◀ ▶ (,/.), ползунок-перемотка и переходы к кадрам с детекцией ◀/▶ ([/]). На ползунке бирюзовыми метками отмечены кадры с найденной цензурой; строки списка подсвечиваются цветом (🔴 цензура найдена, 🟢 проверено и чисто).
  • Детекция — через YOLO (модель LADA для мозаики). Порог уверенности настраивается прямо в тулбаре.
  • Выбор файла весов модели кнопкой «Модель…» (нужная модель ищется в models/ автоматически при открытии проекта).
  • Индикатор устройства в строке состояния: « CUDA» или «🖥 CPU». Клик по «CPU» показывает диагностику (почему GPU не задействован) и команды установки PyTorch с CUDA. Если CUDA недоступна, YOLO и DeepMosaics автоматически работают на CPU (медленнее, но без ошибок).

Кэш детекций

Результаты детекции сохраняются в корне проекта в файл detections.json. Это даёт:

  • возобновление между сессиями — открыли проект повторно, готовые детекции сразу на месте (метки на ползунке и подсветка строк восстанавливаются);
  • дозапуск — «Детектировать все» пропускает уже посчитанные кадры;
  • отказоустойчивость — при отмене/закрытии посчитанное не теряется.

Кэш помечен «удостоверением» детектора (детектор + модель + порог conf/imgsz). Если открыть проект другим детектором, чужой кэш не загружается (чтобы не выдавать старые результаты за текущие). Полностью пересчитать — кнопка «Все заново».

Ключи внутри файла — имена файлов, поэтому кэш переживает перемещение/ переименование проекта. Хранится результат одного детектора за раз: посчитали одним, переключились на другой и посчитали — кэш перезапишется.

Восстановление (расцензуривание)

Кнопка «Расцензурить кадр» восстанавливает найденные области на текущем кадре, «Показать оригинал/результат» переключает вид, «Сохранить результат» пишет <имя>_restored.jpg рядом с кадром. Движок выбирается в меню Файл → Движок восстановления….

Пакетный прогон по диапазону. Кнопки «Расцензурить все» (дозапуск — пропускает уже сделанные) и «Все заново» обрабатывают все кадры проекта в фоне и пишут результаты в папку restored/ проекта (имена кадров сохраняются; папка держится отдельно от frames/, чтобы результаты не попадали обратно в список кадров). Прогресс, отмена («■ Стоп») и предпросмотр текущего кадра работают как при детекции.

Расцензуривание — только через DeepMosaics (код встроен в приложение, vendored, GPL-3.0; ставить отдельно не нужно — требуются только веса и желательно GPU NVIDIA/CUDA). Два движка:

  • DeepMosaics — картинка — реальное генеративное удаление мозаики покадрово.
  • DeepMosaics — видео (BVDNet)временно́й движок: использует соседние кадры (окно ±2 кадра с шагом 3) и собственный предыдущий результат для когерентности на роликах. Из-за рекуррентности обрабатывает непрерывный диапазон по порядку — т.е. запускайте его через «Расцензурить все» (одиночный «Расцензурить кадр» сведётся к окну из одного кадра). Нужна видеомодель clean_youknow_video.pth.

На аниме качество ограничено (модели обучены на реальном видео).

Настройка DeepMosaics

Нужны только веса — положите их в models/deepmosaics/ (папка в .gitignore, веса большие, ~92 МБ). Скачать: официальная папка (Google Drive, Baidu код 1x0a):

  • clean_youknow_resnet_9blocks.pth — картиночная clean-модель (движок «картинка»);
  • clean_youknow_video.pth — видеомодель BVDNet (движок «видео», соседние кадры);
  • mosaic_position.pth — локатор мозаики (должен лежать рядом, нужен обоим).

Затем в приложении: Файл → Движок восстановления…, выберите движок (DeepMosaics — картинка или видео) и модель из выпадающего списка (наполняется из models/deepmosaics — для видеодвижка показываются только clean_*_video.pth; есть «Обзор…» для файла в другом месте) и GPU id (-1 = CPU). Если веса в models/deepmosaics — работает сразу; модель грузится один раз, дальше кадры считаются быстро.

Какую модель брать: для покадрового движка — картиночную clean_youknow_resnet_9blocks.pth; для временно́го — видео clean_youknow_video.pth (она запускается только пакетно, «Расцензурить все», т.к. ей нужны соседние кадры). Если на кадре нет мозаики, результат = исходный кадр.

Код DeepMosaics (GPL-3.0) лежит в core/restore/_deepmosaics/ и поэтому весь проект распространяется под GPL-3.0. Запускается на современных torch 2.x/ numpy 2.x (проверено). LADA (видеомодель, лучшее качество на реальном видео) пока не подключён.

Что НЕ делает (осознанно вне области задачи)

  • Не генерирует изображения через диффузию (никакого ControlNet/SDXL).
  • Не детектирует «контент, который следовало бы зацензурить» (NSFW) — ищем именно уже наложенную цензуру.
  • Полноценное генеративное восстановление пока не подключено (см. выше).

Требования

  • ОС: Windows 11 x64 (основная целевая платформа).
  • Python: 3.11+.
  • GPU (опционально): NVIDIA + CUDA для YOLO-детектора и DeepMosaics. CPU-режим работает, но медленный (особенно DeepMosaics / временно́й BVDNet).

Установка

git clone https://github.com/mrleo1nid/HVideoTool.git
cd HVideoTool
python -m venv .venv
.\.venv\Scripts\Activate.ps1
pip install -e ".[yolo]"

Детекция (YOLO) и расцензуривание (DeepMosaics) требуют PyTorch — установите его отдельно под вашу CUDA (см. Модель детектора).

Запуск

# Без аргументов — открывается последний проект (или создайте/откройте новый в тулбаре)
python -m hvideotool

# Необязательно: сразу открыть проект и указать модель YOLO
python -m hvideotool "C:\path\to\МойПроект" --model models\lada_mosaic_detection_model_v4_accurate.pt

Путь к модели и порог сохраняются в ~/HVideoTool/settings.json и применяются при следующем запуске.


Модель детектора

Детекция — только YOLO (интерфейс абстрагирован в core/detection/base.py): ML-детектор на базе Ultralytics (core/detection/yolo.py), сегментационная модель — маски превращаются в контуры. Рекомендуемые веса — LADA mosaic detection. (Старый эвристический classic-CV детектор и комбинированный режим удалены — давали много ложных срабатываний.)

⚠️ Берите правильную модель. Для YOLO нужна модель детекции цензуры (LADA lada_mosaic_detection_model_v4_accurate.pt). Если по ошибке указать обычную COCO-модель (yolo11n-seg.pt), она будет детектить людей/предметы и помечать их как unknown — это и есть «шум». Файл LADA лежит в models/.

Домен важен. Модель LADA обучена на реальном видео (JAV); на части рисованного/аниме контента работает, на части — плохо. Хорошего публичного YOLO-детектора цензуры для аниме нет — это потребовало бы обучения своей модели.

Своя модель мозаики для аниме. Можно обучить YOLO11-seg на синтетике (накладываем мозаику на чистые кадры → авторазметка) и подключить .pt в наш YoloDetector без изменений кода. Инструменты — в scripts/training/:

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
# затем: тулбар → «Модель…» → runs\segment\mosaic\weights\best.pt

Установка YOLO-детектора:

pip install -e ".[yolo]"
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 --model models\lada_mosaic_detection_model_v4_accurate.pt

⚠️ Лицензия. Ultralytics YOLO и веса LADA — AGPL-3.0; код DeepMosaics — GPL-3.0. Поэтому весь проект распространяется под GPL-3.0.


Архитектура (кратко)

hvideotool/
├── __main__.py              # точка входа + CLI (всё опционально)
├── app.py                   # инициализация QApplication
├── config.py                # настройки: пороги детекции, оверлей, детектор/модель
├── settings_store.py        # дефолты новых проектов + последний/недавние → settings.json
├── ui/
│   ├── main_window.py       #   окно: список файлов | картинка | таблица детекций
│   ├── image_view.py        #   отрисовка картинки + оверлей-контуры (QPainter)
│   └── marker_slider.py     #   ползунок-перемотка с метками кадров с детекцией
└── core/
    ├── imageio.py           #   unicode-safe чтение/запись картинок (Windows-пути)
    ├── project.py           #   Project: раскладка (project.json/frames/detections.json/collections) + настройки
    ├── video/frame.py       #   Frame (картинка BGR + индекс + pts) — вход детектора
    ├── 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 заметно медленнее, чем на CUDA. Длинные операции можно прервать кнопкой «■ Стоп» (Esc), а результаты кэшируются на диск — см. Кэш детекций.

Технологический стек

Компонент Выбор
Язык Python ≥ 3.11
GUI PySide6 (Qt 6)
Обработка картинок OpenCV / NumPy
Детектор Ultralytics YOLO + PyTorch/CUDA (веса LADA)
Расцензуривание DeepMosaics (встроен) + PyTorch/CUDA

Лицензия

GPL-3.0 — из-за встроенного кода DeepMosaics (GPL-3.0); веса/код YOLO LADA — AGPL-3.0.

S
Description
No description provided
Readme
615 KiB
Languages
Python 100%