By Chu Zhou, Minggui Teng, Yufei Han, Chao Xu, Boxin Shi
Haze, a common kind of bad weather caused by atmospheric scattering, decreases the visibility of scenes and degenerates the performance of computer vision algorithms. Single-image dehazing methods have shown their effectiveness in a large variety of scenes, however, they are based on handcrafted priors or learned features, which do not generalize well to real-world images. Polarization information can be used to relieve its ill-posedness, however, real-world images are still challenging since existing polarization-based methods usually assume that the transmitted light is not significantly polarized, and they require specific clues to estimate necessary physical parameters. In this paper, we propose a generalized physical formation model of hazy images and a robust polarization-based dehazing pipeline without the above assumption or requirement, along with a neural network tailored to the pipeline. Experimental results show that our approach achieves state-of-the-art performance on both synthetic data and real-world hazy images.
- Linux Distributions (tested on Ubuntu 18.04).
- NVIDIA GPU and CUDA cuDNN
- Python >= 3.7
- Pytorch >= 1.1.0
- cv2
- numpy
- tqdm
- tensorboardX (for training visualization)
python execute/infer_full.py -r checkpoint/full.pth --data_dir <path_to_input_data> --result_dir <path_to_result_data> default
https://drive.google.com/drive/folders/1FwO--21K9GmsS6iGNm44tHMfAoDn6fNs?usp=sharing
Since the file format we use is .npy
, we provide scrips for visualization:
- use
scripts/visualize_polarized_img.py
to visualize the polarized hazy images - use
scripts/visualize_img.py
to visualize the unpolarized hazy images and synthetic results - use
scripts/visualize_real_img.py
to visualize real results
Note that in our code implementation, the network input contains three components: {I_alpha, I_hat, delta_I_hat}
:
I_alpha
: three polarized hazy imagesI_hat
: the calculated unpolarized hazy imagedelta_I_hat
: the calculated unpolarized hazy image multiplied by the degree of polarization
So, we should preprocess the data first to get the network input:
-
for synthetic images (training and inference)
- use
scripts/preprocess_cityscapes.py
to preprocess the Cityscapes Dataset (require leftImg8bit, gtFine, and leftImg8bit_transmittanceDBF) for generating{image, depth, segmentation}
(or choose other source dataset if you want) - use
scripts/make_dataset.py
to generate the synthetic dataset from{image, depth, segmentation}
- use
-
for real images (inference only)
- use
scripts/make_real_dataset_from_raw_format.py
to generate the real dataset from images (in.raw
format) captured by a polarization camera (Lucid Vision Phoenix polarization camera (RGB) in our paper)
- use
-
stage1 (Transmitted light estimation):
python execute/train.py -c config/subnetwork1.json
-
stage2 (Original scene radiance reconstruction):
python execute/train.py -c config/subnetwork2.json
-
finetune the entire network:
python execute/train.py -c config/full.json --T_model_checkpoint_path <path_to_stage1_checkpoint> --R_model_checkpoint_path <path_to_stage2_checkpoint>
- All config files (
config/*.json
) and the learning rate schedule function (MultiplicativeLR) atget_lr_lambda
inutils/util.py
could be edited
If you find this work helpful to your research, please cite:
@inproceedings{NEURIPS2021_5fd0b37c,
author = {Zhou, Chu and Teng, Minggui and Han, Yufei and Xu, Chao and Shi, Boxin},
booktitle = {Advances in Neural Information Processing Systems},
editor = {M. Ranzato and A. Beygelzimer and Y. Dauphin and P.S. Liang and J. Wortman Vaughan},
pages = {11487--11500},
publisher = {Curran Associates, Inc.},
title = {Learning to dehaze with polarization},
url = {https://proceedings.neurips.cc/paper/2021/file/5fd0b37cd7dbbb00f97ba6ce92bf5add-Paper.pdf},
volume = {34},
year = {2021}
}