Предсказание карт глубины по одному RGB-изображению с использованием глубокого обучения
Данный проект посвящён задаче монокулярной оценки глубины — предсказанию карт глубины по одному RGB-изображению с использованием трёх различных архитектур нейронных сетей. Мы обучили и сравнили CNN- и Transformer-модели на двух реальных датасетах, чтобы понять их сильные и слабые стороны.
- На малых и средних датасетах (2000–3500 изображений) CNN-архитектуры (UNet) превосходят Transformer-модели, которым для раскрытия потенциала требуются миллионы изображений.
- Добавление второго датасета (DIODE) с другими характеристиками домена улучшило обобщающую способность моделей.
- Механизмы внимания добавляют вычислительные затраты без гарантированного улучшения на ограниченных данных.
В работе использованы два дополнительных датасета из открытых источников:
- Источник: https://cs.nyu.edu/~silberman/datasets/nyu_depth_v2.html
- Размер: 2193 обучающих + 645 валидационных изображений
- Домен: Интерьеры (ванные, спальни, кухни, офисы)
- Источник глубины: RGB-D камера Kinect
- Диапазон глубины: 0.5 – 10 метров
- Источник: https://diode-dataset.org/
- Размер: 1255 изображений
- Домен: Интерьеры + улицы
- Источник глубины: Высокоточный LiDAR + стерео
- Диапазон глубины: 0.5 – 50+ метров
Использование датасетов из разных доменов (интерьеры и смешанные сцены) позволяет оценить, насколько хорошо модели обобщаются между типами сцен, и продемонстрировать проблему доменного разрыва в задаче оценки глубины.
Реализованы и сравнены три архитектуры:
Классический энкодер-декодер со skip-соединениями.
- Энкодер: 4-стадийная CNN с MaxPool понижением
- Декодер: ConvTranspose2d повышение + конкатенация skip-соединений
- Количество признаков: [64, 128, 256, 512]
- Обоснование: Проверенная архитектура для задач плотного предсказания
U-Net, дополненный attention-гейтами на skip-соединениях.
- Дополнение: Attention-гейты фильтруют нерелевантные признаки перед конкатенацией
- Гипотеза: Внимание должно помочь фокусироваться на релевантных для глубины регионах
- Обоснование: Проверка, улучшает ли внимание оценку глубины на малых данных
Vision Transformer энкодер + CNN декодер.
- Энкодер: Patch embedding (4x4) -> 4 Transformer блока
- Декодер: 2-стадийное CNN повышение
- Количество признаков: embed_dim=32 (уменьшено для экономии памяти)
- Обоснование: Проверка, помогает ли глобальный контекст от self-attention предсказанию глубины
Модели оцениваются по трём стандартным метрикам для задач оценки глубины:
| Метрика | Описание | Лучше |
|---|---|---|
| RMSE | Среднеквадратичная ошибка | Меньше |
| MAE | Средняя абсолютная ошибка | Меньше |
| δ1 | Доля пикселей, где max(pred/gt, gt/pred) < 1.25 | Больше |
| Модель | NYU RMSE (м) | NYU MAE (м) | NYU |
DIODE RMSE (м) | DIODE MAE (м) | DIODE |
|---|---|---|---|---|---|---|
| UNet | 1.347 | 1.038 | 38.3 | 11.431 | 8.698 | 22.8 |
| Attention UNet | 1.474 | 1.128 | 35.5 | 11.376 | 8.603 | 22.9 |
| ViT Hybrid | 1.330 | 1.025 | 39.4 | 12.084 | 9.258 | 17.7 |
- U-Net: Лучшие общие метрики, чёткие границы глубины, occasional checkerboard артефакты от transposed convolutions
- Attention U-Net: Похож на U-Net, но с более гладкими предсказаниями, attention-гейты дают минимальное улучшение на малых датасетах
- ViT Hybrid: Лучшее понимание глобальной структуры, но более шумные локальные предсказания, требует значительно больше данных и вычислений
- Python 3.10+
- PyTorch 2.0+
- Рекомендуется GPU с поддержкой CUDA
# Клонировать репозиторий
git clone https://github.com/imaseriousactor/Depth-From-Focus-Image-Restoring.git
cd Depth-From-Focus-Image-Restoring
# Установить зависимости
pip install -r requirements.txt- Создайте новый Notebook на Kaggle
- Добавьте датасеты через "Add Input" (raw_data и diode_train)
- Загрузите код обучения (Ячейки 1-4)
- Запустите все ячейки последовательно
- Скачайте веса моделей из панели Output
# Обучить одну модель (изменить model_name в train.py)
python train.py
# Варианты: unet, attention_unet, vit_hybrid# Сравнить все модели и сгенерировать визуализации
python evaluate.py# Запустить интерфейс Gradio
python app/app.pyЖивое демо: \https://huggingface.co/spaces/imaseriousactor/depth-estimation-demo
Depth-From-Focus-Image-Restoring/
├── data/
│ ├── nyu_depth_dataset.py # Загрузчик NYU датасета
│ ├── diode_dataset.py # Загрузчик DIODE датасета
│ ├── convert_diode_to_hdf5.py # Конвертер DIODE формата
│ └── raw/ # Сырые данные (не в git)
│ ├── train-000000/
│ └── val/
├── models/
│ ├── unet.py # Архитектура U-Net
│ ├── attention_unet.py # Архитектура Attention U-Net
│ └── vit_hybrid.py # Архитектура ViT Hybrid
├── notebooks/
│ ├── eda_01.ipynb # Исследовательский анализ данных
│ └── outputs/ # Сгенерированные визуализации
├── checkpoints/ # Веса моделей (не в git)
├── app/
│ └── app.py # Веб-демонстрация на Gradio
├── train.py # Скрипт обучения
├── evaluate.py # Скрипт оценки
├── requirements.txt # Зависимости
├── .gitignore # Правила git ignore
└── README.md # Этот файл
| Параметр | Значение |
|---|---|
| Оптимизатор | Adam (lr=1e-4) |
| Функция потерь | L1 Loss (MAE) |
| Шедулер | ReduceLROnPlateau (patience=5, factor=0.5) |
| Batch Size | 4 (UNet/Attention UNet), 2 (ViT) |
| Размер изображения | 256x384 (UNet/Attention UNet), 128x192 (ViT) |
| Эпохи | 30 |
| Оборудование | Kaggle GPU T4 x2 |