Руководство пользователя
Автоматизация и CLI
Проект предоставляет два интерфейса для автоматизации запуска экспериментов, которые делают работу с фреймворком удобнее и приближают его к полноценной библиотеке.
Интерфейс |
Назначение |
Когда использовать |
|---|---|---|
|
Запуск по конфигурационному файлу |
Воспроизводимые эксперименты, автоматизация |
|
Быстрые команды из терминала |
Тестирование, быстрые операции, генерация конфигов |
Установка зависимостей CLI
pip install pyyaml jsonschema click
Или через optional-зависимости:
pip install -e ".[cli]"
run.py — Автоматизация через конфигурационные файлы
Главный скрипт для автоматического запуска пайплайна. Пользователь создаёт конфиг один раз, а потом запускает одной командой. Идеален для воспроизводимых экспериментов.
Базовый запуск
# Запуск по конфигу
python run.py --config configs/basic_deconvolution.yaml
# С переопределением директории результатов
python run.py --config configs/experiment.yaml --output-dir my_results/
# С генерацией LaTeX-отчёта
python run.py --config configs/experiment.yaml --generate-report
# Dry-run: проверка без выполнения (показывает план)
python run.py --config configs/experiment.yaml --dry-run
# Только валидация конфигурации
python run.py --config configs/experiment.yaml --validate-only
# Подробный вывод (уровень DEBUG)
python run.py --config configs/experiment.yaml --verbose
Аргументы командной строки
Аргумент |
Короткий |
Описание |
|---|---|---|
|
|
Путь к конфигу (обязательный) |
|
|
Переопределение директории результатов |
|
— |
Генерировать LaTeX-отчёт |
|
— |
Проверка без выполнения |
|
— |
Только валидация конфига |
|
|
Подробный вывод (DEBUG) |
Структура конфигурационного файла (YAML)
# Метаданные эксперимента
experiment:
name: "My Experiment"
description: "Описание эксперимента"
# Входные данные
input:
images_folder: "images/original" # Папка с оригинальными изображениями
blurred_folder: "images/distorted" # Папка со смазанными (для mode: process)
color: false # true — цветные, false — ч/б
# Режим загрузки:
# "all" — все изображения из images_folder (для full_process)
# "bind" — конкретные пары оригинал + смазанное
# "bind_state" — загрузка из ранее сохранённого JSON
load_mode: "bind"
# Связи (для load_mode: "bind")
bindings:
- original: "images/original/airplane.png"
blurred: "images/distorted/airplane_blurred.png"
kernel: "images/kernel_data/kernel.npy" # опционально
filter_description: "gaussian_blur" # опционально
# Путь к JSON (для load_mode: "bind_state")
# bind_state_path: "dataset/dataset.json"
# Выходные директории
output:
restored_folder: "results/restored"
data_folder: "results/data"
kernel_folder: "results/kernels"
# Режим обработки
processing:
# "process" — восстановление по связям (оригинал + смазанное)
# "full_process" — полный пайплайн: фильтры → восстановление → анализ
mode: "process"
metadata: true # Сохранять метаданные
unique_paths: true # Генерировать уникальные пути
# Алгоритмы (минимум один обязателен)
algorithms:
- name: "vabid" # Краткое имя из реестра
params:
max_iter: 100
kernel_size: 21
- name: "custom" # Пользовательский алгоритм
module: "my_module.my_algo" # Полный путь к модулю
class_name: "MyAlgorithm" # Имя класса
params:
param1: value1
# Цепочки фильтров (для mode: "full_process")
filters:
- chain:
- type: "defocus_blur"
params:
psf: "gaussian" # PSF-функция: gaussian, uniform, ring и др.
param: 5.0
- type: "gaussian_noise"
params:
param: 10.0
# Генерация отчёта
report:
generate: false
format: "latex"
output_path: "results/report.tex"
Подробнее о каждой секции конфигурации — в разделе Конфигурационные файлы.
Доступные алгоритмы (реестр)
Имя |
Категория |
Описание |
|---|---|---|
|
classic |
Алгоритм Richardson-Lucy |
|
classic |
EM-алгоритм для слепой деконволюции |
|
classic |
MAP с регуляризацией (alternating minimization) |
|
bayesian |
Вариационная байесовская с TV априори |
|
bayesian |
Байесовская с разными экспозициями |
|
bayesian |
Разреженная байесовская деконволюция |
|
variational |
Вариационный подход к оценке параметров |
|
variational |
Вариационный байесовский подход (Likas2004) |
|
variational |
Вариационная со Student’s-t |
|
sparse |
Компрессивная байесовская деконволюция |
Доступные фильтры
Имя |
Описание |
Требует PSF |
|---|---|---|
|
Размытие вне фокуса (2D) |
Да |
|
Размытие в движении (1D) |
Да |
|
Криволинейное размытие (B-spline) |
Нет |
|
Свёртка с ядром из .npy файла |
Нет |
|
Аддитивный гауссовский шум |
Нет |
|
Пуассоновский шум |
Нет |
|
Импульсный шум (соль и перец) |
Нет |
|
Сглаживание средним |
Нет |
|
Медианное сглаживание |
Нет |
|
Гауссово сглаживание |
Нет |
|
Билатеральный фильтр |
Нет |
PSF-функции (для defocus_blur и motion_blur)
Имя |
Описание |
|---|---|
|
Гауссовское распределение |
|
Равномерное (диск / прямоугольник) |
|
Линейно убывающее (конус / треугольник) |
|
Кольцевое распределение |
|
Экспоненциально убывающее |
Готовые конфиги
В папке configs/ находятся готовые примеры:
basic_deconvolution.yaml— базовый пример с режимомprocessmedical_imaging.yaml— обработка медицинских изображений (режимfull_process)satellite_images.yaml— обработка спутниковых снимков (режимfull_process)experiment_template.json— полный шаблон в JSON со всеми полями
Что генерирует run.py
После запуска в директории результатов создаются:
results/
├── restored/ # Восстановленные изображения
├── data/ # CSV-таблицы с метриками (PSNR, SSIM)
├── kernels/ # Восстановленные ядра размытия
├── metadata.json # Метаданные эксперимента (конфиг, время, платформа)
└── report.tex # LaTeX-отчёт (при --generate-report)
cli.py — Интерфейс командной строки
CLI-интерфейс для быстрых операций без конфигурационных файлов.
Справка
python cli.py --help
python cli.py <команда> --help
Команды
1. process — Быстрая обработка одного изображения
# Обработка изображения алгоритмом VABID
python cli.py process --input image.jpg --algorithm vabid
# С указанием смазанного изображения и параметров
python cli.py process \
--input original.png \
--blurred blurred.png \
--algorithm richardson_lucy \
--params '{"max_iter": 50, "kernel_size": 15}'
# Цветной режим с указанием выходной директории
python cli.py process -i photo.png -a vabid --color -o my_results/
# С ядром размытия
python cli.py process -i orig.png -b blur.png -k kernel.npy -a vabid
2. run — Запуск по конфигурации (аналог run.py)
# Запуск по конфигу
python cli.py run --config configs/experiment.yaml
# Dry-run (проверка без выполнения)
python cli.py run -c configs/experiment.yaml --dry-run
# Только валидация
python cli.py run -c configs/experiment.yaml --validate-only
# С генерацией отчёта
python cli.py run -c configs/experiment.yaml --generate-report
3. generate-config — Генерация конфига из шаблона
# Базовый шаблон (YAML)
python cli.py generate-config --template basic --output my_config.yaml
# Медицинский шаблон (JSON)
python cli.py generate-config -t medical -f json -o config.json
# Спутниковый шаблон
python cli.py generate-config -t satellite -o satellite.yaml
# Пустой шаблон (для заполнения вручную)
python cli.py generate-config -t empty
Доступные шаблоны: basic, medical, satellite, empty.
4. view-config — Просмотр конфига в табличном виде
# Табличный вид (по умолчанию)
python cli.py view-config configs/experiment.yaml
# В формате LaTeX
python cli.py view-config configs/experiment.yaml --format latex
# В формате JSON
python cli.py view-config configs/experiment.yaml --format json
# В формате YAML
python cli.py view-config configs/experiment.yaml --format yaml
5. interactive — Интерактивный режим для новичков
python cli.py interactive
Режим пошагово задаёт вопросы:
Название и описание эксперимента
Входные данные (папка, режим загрузки, связи)
Выбор алгоритмов из списка
Настройка фильтров (для full_process)
Параметры вывода
Предпросмотр конфигурации
Действие: запустить / сохранить / оба / отменить
6. list-algorithms — Список доступных алгоритмов
# Табличный вид
python cli.py list-algorithms
# В формате LaTeX
python cli.py list-algorithms --format latex
7. list-filters — Список доступных фильтров
python cli.py list-filters
python cli.py list-filters --format latex
Автодополнение команд (Tab completion)
Для включения автодополнения в оболочке:
Bash:
eval "$(_CLI_COMPLETE=bash_source python cli.py)"
Zsh:
eval "$(_CLI_COMPLETE=zsh_source python cli.py)"
Fish:
_CLI_COMPLETE=fish_source python cli.py | source
Для постоянного автодополнения добавьте соответствующую строку в .bashrc, .zshrc или config.fish.
Сборка документации (docs/tools/build_docs.py)
Утилита build_docs.py автоматизирует генерацию HTML-документации из исходного кода и Markdown-файлов.
Требования
pip install ".[docs]"
Запуск
python docs/tools/build_docs.py
Скрипт выполняет два шага:
Генерация API — вызывает
sphinx-apidoc --separateдля создания.rstфайлов из docstrings модулей вsrc/. Все существующие.rst(кромеindex.rst) удаляются и пересоздаются.Сборка HTML — вызывает
sphinx-build -b htmlдля компиляции документации вdocs/_build/html/.
Результат: docs/_build/html/index.html.
Ручная сборка
Если нужен контроль над отдельными шагами:
sphinx-apidoc --separate -o docs/source src/
sphinx-build -b html docs/source docs/_build/html
Важно
Скрипт удаляет и пересоздаёт все
.rstфайлы вdocs/source/(кромеindex.rst) — не храните ручные правки в автогенерируемых.rst.Markdown-файлы (
.md) вdocs/source/включаются через MyST-Parser автоматически и не затрагиваются.
Использование как Python-библиотеки
Восстановление одного изображения
from blinddeconv.processing import Processing
proc = Processing(
images_folder="images/original",
blurred_folder="blurred",
restored_folder="restored",
color=False,
)
# Связывание оригинала с искажённым
proc.bind(
original_image_path="images/original/airplane.png",
blurred_image_path="images/distorted/airplane_blurred.png",
original_kernel_path="images/kernel_data/kernel.npy",
filter_description="convolved_kernel",
)
# Восстановление
from blinddeconv.algorithms.blind_deconvolution.our_company.variational.vabid import VABID
algo = VABID(max_iter=100, kernel_size=21)
proc.process(algorithm_processor=algo, metadata=True)
# Визуализация
proc.show()
Сравнение нескольких алгоритмов
proc = Processing(color=False)
proc.bind("original.png", "blurred.png", "kernel.npy", "gaussian_blur")
from blinddeconv.algorithms.blind_deconvolution.our_company.variational.vabid import VABID
from blinddeconv.algorithms.blind_deconvolution.our_company.classic.richardson_lucy import RichardsonLucy
for algo in [VABID(max_iter=100, kernel_size=21),
RichardsonLucy(max_iter=50, kernel_size=15)]:
proc.process(algo, metadata=True)
proc.show()
proc.get_table("comparison.csv", display_table=True)
Полный пайплайн (фильтры + восстановление)
from blinddeconv.processing import Processing
from blinddeconv.filters.blur import DefocusBlur
from blinddeconv.filters.distributions import gaussian_distribution
from blinddeconv.filters.noise import GaussianNoise
proc = Processing(images_folder="images/original", color=False)
proc.read_all()
filters = [
[DefocusBlur(psf=gaussian_distribution, param=5.0),
GaussianNoise(param=10.0)],
[DefocusBlur(psf=gaussian_distribution, param=3.0),
GaussianNoise(param=5.0)],
]
methods = [algo1, algo2]
proc.full_process(filters=filters, methods=methods)
Оптимизация гиперпараметров
algo = VABID(max_iter=100, kernel_size=21)
result = proc.process_hyperparameter_optimization(
algorithm_processor=algo,
param_ranges={"max_iter": (50, 500), "kernel_size": (11, 31)},
n_trials=50,
metric="PSNR",
)
print(f"Лучшие параметры: {result.best_params}")
print(f"Лучший PSNR: {result.best_value:.2f} dB")
Сохранение и загрузка состояния
# Сохранение
proc.save_bind_state("dataset/my_experiment.json")
# Загрузка в другом сеансе
proc2 = Processing(color=False)
proc2.load_bind_state("dataset/my_experiment.json")
proc2.show()
Очистка данных
proc.clear_restored() # Удалить восстановленные
proc.unbind_restored() # Убрать связи с восстановленными
proc.clear_output() # Удалить файлы + сброс
proc.clear_all() # Полная очистка
proc.clear_output_directory() # Очистка директорий (с подтверждением)