复现深度学习论文的第一步永远是搭建合适的开发环境。我花了三天时间反复测试不同硬件和软件组合,最终总结出这套兼容性最强的配置方案。先说说硬件要求:原作者使用的是NVIDIA显卡,实测GTX1050确实会出现显存不足的问题(训练时直接报CUDA out of memory),建议至少RTX2060以上显卡。我分别在RTX3060笔记本和RTX4090台式机上测试过,后者训练速度能快3倍左右。
软件环境配置分三个关键步骤:
conda env create -f environment.yaml时会自动安装基础依赖,但这里有个坑要注意——原环境文件里的pytorch版本可能和你的CUDA不兼容。比如我的服务器装的是CUDA11.7,就需要手动调整torch安装命令:bash复制conda install pytorch==1.8.1 torchvision==0.9.1 torchaudio==0.8.1 cudatoolkit=11.7 -c pytorch
bash复制pip install opencv-python-headless scikit-image
python -c "import torch; print(torch.cuda.is_available())"必须返回True,否则后续所有操作都无法进行。如果报错,大概率是CUDA版本不匹配,需要重装对应版本的pytorch。官方提供了百度网盘下载链接(提取码:1tap),但下载速度可能较慢。我整理了备用下载方式:
dense/:处理密集雾气的场景NH/:自然雾气数据集专用indoor/和outdoor/:分别针对室内外场景优化下载后需要严格按照以下目录结构放置:
code复制Dehamer
|- ckpts
|- dense
|- PSNR1662_SSIM05602.pt
|- NH
|- PSNR2066_SSIM06844.pt
|- indoor
|- PSNR3663_ssim09881.pt
|- outdoor
|- PSNR3518_SSIM09860.pt
常见问题排查:
ls -l ckpts/NH/查看文件权限,必要时执行chmod 644 PSNR2066_SSIM06844.pt虽然官方提供了预训练模型,但实际应用中我们常需要针对特定场景微调。以下是完整训练流程:
数据准备:
RESIDE标准数据集,目录结构示例:code复制data
|- train_NH
|- hazy
|- 1.png
|- clear
|- 1.png
|- valid_NH
|- hazy
|- 101.png
|- clear
|- 101.png
启动训练(关键参数详解):
bash复制CUDA_VISIBLE_DEVICES=0,1 python src/train.py \
--dataset-name custom \
--train-dir ./data/train_NH/ \
--valid-dir ./data/valid_NH/ \
--ckpt-save-path ./ckpts/custom \
--batch-size 4 \
--train-size 512 512 \
--valid-size 512 512 \
--loss l1+l2 \
--plot-stats
训练技巧:
batch-size和train-sizeloss曲线,正常情况应该在前100epoch快速下降--plot-stats会生成训练过程可视化图表完成训练后,可以通过三种方式验证模型效果:
bash复制CUDA_VISIBLE_DEVICES=0 python src/test_PSNR.py --dataset-name NH
输出会包含PSNR和SSIM指标,我的RTX3060上NH数据集得分PSNR=20.66,SSIM=0.6844
bash复制python src/test_image.py -i input_hazy.jpg -o output_dehazed.jpg
python复制import cv2
from src.models import Dehamer
model = Dehamer(ckpt_path='ckpts/NH/PSNR2066_SSIM06844.pt')
cap = cv2.VideoCapture('input.mp4')
while cap.isOpened():
ret, frame = cap.read()
if not ret: break
output = model.dehaze(frame)
cv2.imshow('Dehazed', output)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
效果优化技巧:
dense模型indoor模型cv2.convertScaleAbs(output, alpha=1.2, beta=10)微调亮度和对比度在复现过程中我遇到过各种报错,这里分享几个典型问题的解决方法:
CUDA out of memory:
--resize 512参数src/config.py中的MAX_DIM值TypeError: expected Tensor as element 0:
pip install numpy==1.21.6模型加载失败:
torch.load(ckpt_path, map_location='cpu')检查模型是否完整边缘模糊问题:
test_image.py中调整padding=32参数cv2.detailEnhance()增强细节对于想深入理解算法原理的同学,建议重点阅读论文中的3D Position Embedding部分,这是Dehamer区别于传统去雾方法的核心创新点。我在实现时发现,其位置编码方式能有效保留远距离像素间的关联,这对处理大雾场景特别关键。