Архитектура системы
Модульная структура
BlindDeconvolution — модульный фреймворк для исследования методов слепой деконволюции изображений. Архитектура построена по принципу фасада: центральный класс Processing делегирует операции специализированным модулям.
Проект построен по модульному принципу с центральным классом-фасадом Processing:
┌──────────────────────────────────────────────────────────────┐
│ Processing (Facade) │
│ │
│ ┌────────────────────────────────────────────────────────┐ │
│ │ Core Modules │ │
│ │ ┌──────────┐ ┌──────────┐ ┌───────────┐ ┌──────────┐ │ │
│ │ │ Reader │ │ Display │ │ Restore │ │ Pipeline │ │ │
│ │ └──────────┘ └──────────┘ └───────────┘ └──────────┘ │ │
│ │ │ │
│ │ ┌──────────┐ ┌──────────┐ ┌───────────┐ ┌──────────┐ │ │
│ │ │ Filter │ │ Clear │ │ Tables │ │ Prep │ │ │
│ │ └──────────┘ └──────────┘ └───────────┘ └──────────┘ │ │
│ └────────────────────────────────────────────────────────┘ │
│ │
│ ┌────────────────────────────────────────────────────────┐ │
│ │ Optimization & Analysis │ │
│ │ ┌────────────────────────┐ ┌────────────────────────┐ │ │
│ │ │ HyperparamOptimizer │ │ ParetoFrontAnalyzer │ │ │
│ │ └────────────────────────┘ └────────────────────────┘ │ │
│ └────────────────────────────────────────────────────────┘ │
└──────────────────────────────────────────────────────────────┘
│ │ │
▼ ▼ ▼
┌───────────┐ ┌────────────┐ ┌─────────────┐
│ filters/ │ │ algorithms/│ │ core.py │
│ • blur │ │ • our_co. │ │ utils.py │
│ • noise │ │ • 3rd_party│ │ metrics.py│
│ • smooth │ │ • octave/ │ │ image.py │
│ • denoise│ │ • cython/ │ └─────────────┘
└───────────┘ └────────────┘
Основные компоненты
1. Processing — центральный класс (фасад)
Модуль: blinddeconv.processing.core
Единая точка входа для всех операций. При инициализации автоматически создаёт все рабочие директории и подключает модули.
Параметр |
По умолчанию |
Назначение |
|---|---|---|
|
|
Директория с оригиналами |
|
|
Директория со смазанными |
|
|
Директория с восстановленными |
|
|
Директория для CSV/метаданных |
|
|
|
|
|
Директория для ядер |
Внутренние модули:
Атрибут |
Класс |
Назначение |
|---|---|---|
|
|
Загрузка изображений, создание связей |
|
|
Визуализация результатов |
|
|
Предобработка (выравнивание гистограмм) |
|
|
Экспорт метрик в CSV |
|
|
Очистка связей и файлов |
|
|
Применение фильтров |
|
|
Восстановление (один алгоритм) |
|
|
Полный пайплайн (фильтры + восстановление) |
|
|
Оптимизация гиперпараметров |
|
|
Парето-анализ |
2. Image — связь изображений
Модуль: blinddeconv.processing.utils
Ключевая структура данных. Хранит граф связей между оригиналом, смазанными вариантами, восстановленными результатами и метриками.
Image (связь)
│
├── original_path ← Путь к оригиналу
│
├── blurred_path ← Буфер (текущее смазанное)
├── blurred_array[] ← Сохранённые смазанные варианты
│ ├── filters{} ← Описания фильтров
│ ├── blurred_psnr{} ← PSNR смазанных
│ ├── blurred_ssim{} ← SSIM смазанных
│ └── original_kernels{} ← Ядра (GT PSF)
│
└── Для каждого (blurred_path, algorithm_name):
├── restored_paths{} ← Восстановленные изображения
├── kernel_paths{} ← Восстановленные ядра
├── psnr{} ← PSNR восстановленных
└── ssim{} ← SSIM восстановленных
3. DeconvolutionAlgorithm — базовый класс алгоритмов
Модуль: blinddeconv.algorithms.base
Абстрактный класс, определяющий интерфейс для всех алгоритмов деконволюции:
process(image) → (restored, kernel)— обработка изображенияchange_param(params)— изменение гиперпараметровget_param() → [(name, value), ...]— получение текущих параметровget_name() → str— название алгоритмаget_timer() → float— время последнего запуска
4. FilterBase — базовый класс фильтров
Модуль: blinddeconv.filters.base
Абстрактный класс для фильтров искажений:
filter(image) → image— применение фильтраdescription() → str— описание для файловой системыget_type() → str— тип фильтра ("blur","noise","denoise")
5. Система расширений (extensions)
Модуль: blinddeconv.processing.extensions
Расширения наследуют ProcessingExtension и добавляют специализированный функционал:
HyperparameterOptimizer— байесовская оптимизация гиперпараметров через Optuna (TPE, Random, GP, NSGA-II)ParetoFrontAnalyzer— многокритериальный анализ с построением 3D фронта Парето
Организация исхожного кода алгоритмов
algorithms/
├── base.py # DeconvolutionAlgorithm (ABC)
├── blind_deconvolution/
│ ├── our_company/ # Собственные реализации
│ │ ├── bayesian/ # Байесовские методы
│ │ │ ├── vbbid_tv.py # VBBID_TV
│ │ │ ├── bbd_deip.py # BBD_DEIP
│ │ │ └── sb_bid_pe.py # SB_BID_PE
│ │ ├── classic/ # Классические методы
│ │ │ ├── richardson_lucy.py # RichardsonLucy
│ │ │ ├── expectation_maximization.py # EM
│ │ │ └── alternating_minimization.py # MAP
│ │ ├── variational/ # Вариационные методы
│ │ │ ├── vabid.py # VABID (Likas2004)
│ │ │ ├── vapibe.py # VAPIBE
│ │ │ └── vbsk_sid_st.py # VBSK_SID_ST
│ │ └── sparse/ # Разреженные методы
│ │ ├── vbc_bid.py # VBC_BID
│ │ └── pbtvgr.py # PBTVGR
│ └── third_party_company/ # Внешние обёртки
├── nonblind_deconvolution/ # Не-слепая деконволюция
├── kernel_estimation/ # Оценка ядра
├── octave/ # Octave/MATLAB-обвязка
└── unsorted/ # Экспериментальные
Организация фильтров
Модуль |
Фильтры |
Тип |
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
(PSF-функции) |
Вспомогательные скрипты
Модуль |
Класс |
Назначение |
|---|---|---|
|
|
Автоматическая генерация датасета с комбинациями фильтров |
|
|
Генерация ядер размытия (PSF) для экспериментов |
Система автоматизации
Два интерфейса для автоматизации в корне проекта:
Файл |
Назначение |
Зависимости |
|---|---|---|
|
Запуск пайплайна по YAML/JSON-конфигу |
|
|
CLI-интерфейс (click) для быстрых команд |
|
Подробнее — в разделах Конфигурационные файлы и Руководство пользователя.
Паттерны проектирования
Facade —
Processingскрывает сложность подсистем за единым интерфейсом.Strategy —
DeconvolutionAlgorithmиFilterBaseпозволяют подменять алгоритмы без изменения клиентского кода.Template Method —
ModuleProcessPipeline.full_process()определяет скелет пайплайна, делегируя шаги подметодам.Registry —
run.pyсодержит реестры (ALGORITHM_REGISTRY,FILTER_REGISTRY) для динамического создания экземпляров по имени.Extension —
ProcessingExtension(ABC) позволяет подключать новый функционал без изменения ядра.