第4章 环境搭建与工具链:Python环境配置、OpenCV、NumPy、Matplotlib、PyTorch/TensorFlow安装、GPU加速验证
说实话,很多同学在暗光增强这条路上栽的第一个跟头,不是算法太难,而是环境没搭好。我见过太多人花了两天装库,最后发现GPU根本没用上,跑一张图要半小时。嗯,这一章咱们就把这事彻底理清楚。
4.1 整体工具链概览
做暗光增强,说白了就是跟像素矩阵打交道。你需要一套趁手的工具:
- Python — 胶水语言,把一切粘起来
- NumPy — 矩阵运算的基石,图像本质就是多维数组
- OpenCV — 图像读写、预处理、后处理,一步到位
- Matplotlib — 可视化对比,调参时全靠它看效果
- PyTorch / TensorFlow — 深度学习引擎,二选一即可
- CUDA + cuDNN — GPU加速的钥匙
我个人习惯用PyTorch做研究原型,TensorFlow部署生产。但初学者选一个深入就够了,别两头都学,容易乱。
4.2 Python环境配置
我建议直接用Miniconda,别用原生Python。为什么?因为项目之间依赖隔离太重要了。我曾经在一个环境里同时做暗光增强和目标检测,结果OpenCV版本打架,浪费了一整天。
推荐方案: Miniconda + 独立虚拟环境
# 下载Miniconda(Python 3.8+)
# 创建专用环境
conda create -n lowlight python=3.9 -y
conda activate lowlight
# 验证Python版本
python --version
# 输出应为:Python 3.9.x
小技巧: 环境名用项目相关词,比如 lowlight、dark_enhance,别用 test、env1 这种。三个月后你根本记不住哪个是哪个。
4.3 核心库安装
按这个顺序装,不容易出幺蛾子。我踩过的坑都标在下面了。
4.3.1 NumPy — 矩阵运算的根基
conda install numpy
# 或
pip install numpy
# 验证
python -c "import numpy; print(numpy.__version__)"
# 建议版本:≥ 1.21.0
NumPy是后面所有库的依赖,先装它。暗光增强里,一张1920×1080的RAW图就是一个(1080, 1920, 3)的ndarray,你想想看,没有NumPy寸步难行。
4.3.2 OpenCV — 图像处理瑞士军刀
pip install opencv-python
pip install opencv-contrib-python # 包含额外模块
# 验证
python -c "import cv2; print(cv2.__version__)"
# 建议版本:≥ 4.5.0
注意: opencv-python 和 opencv-contrib-python 不要同时装,会冲突。我一般只装 opencv-python,够用了。contrib 里有些专利算法,商用要小心。
4.3.3 Matplotlib — 调参必备可视化
pip install matplotlib
# 验证
python -c "import matplotlib; print(matplotlib.__version__)"
# 建议版本:≥ 3.3.0
暗光增强里,你经常需要并排显示原图、增强图、直方图。Matplotlib的subplot功能就是干这个的。
4.4 深度学习框架安装
这里二选一。我个人的经验是:做研究用PyTorch,调试方便;做产品用TensorFlow,部署生态好。但初学者我推荐PyTorch,社区活跃,踩坑容易搜到答案。
4.4.1 安装PyTorch(推荐)
# CPU版本(先测试用)
pip install torch torchvision torchaudio
# GPU版本(去官网选对应CUDA版本)
# CUDA 11.8 示例
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
# 验证
python -c "import torch; print(torch.__version__); print(torch.cuda.is_available())"
# 如果GPU可用,输出应为:True
4.4.2 安装TensorFlow(备选)
# CPU版本
pip install tensorflow
# GPU版本
pip install tensorflow-gpu
# 验证
python -c "import tensorflow as tf; print(tf.__version__); print(tf.config.list_physical_devices('GPU'))"
# 如果GPU可用,会显示GPU设备列表
关键对比: 暗光增强任务中,PyTorch的Dynamic Graph让调试更直观,TensorFlow的SavedModel部署更省心。我建议你先用PyTorch跑通流程,再考虑迁移。
4.5 GPU加速验证
这是最容易翻车的一步。很多人装完以为GPU在工作,其实代码跑在CPU上。我曾经帮一个同学排查,他装了三遍,最后发现CUDA版本和显卡驱动不匹配。
4.5.1 检查显卡与驱动
# Windows
nvidia-smi
# Linux
nvidia-smi
# 输出示例:
# +-----------------------------------------------------------------------------+
# | NVIDIA-SMI 525.85.05 Driver Version: 525.85.05 CUDA Version: 12.0 |
# | GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
# | 0 NVIDIA RTX 3090 Off | 00000000:01:00.0 On | N/A |
# +-----------------------------------------------------------------------------+
看两个关键信息:Driver Version 和 CUDA Version。驱动版本决定了你能装哪个CUDA工具包。
4.5.2 CUDA与cuDNN安装
| 组件 | 版本要求 | 下载地址 |
|---|---|---|
| NVIDIA驱动 | ≥ 525.85.05 | NVIDIA官网 |
| CUDA Toolkit | 11.8 或 12.1 | NVIDIA Developer |
| cuDNN | 8.9.x(匹配CUDA版本) | NVIDIA Developer(需注册) |
# 验证CUDA安装
nvcc --version
# 输出应显示CUDA版本号
# 验证cuDNN(Linux)
cat /usr/local/cuda/include/cudnn_version.h | grep CUDNN_MAJOR -A 2
# 输出应显示cuDNN版本
避坑指南: 我曾经在Ubuntu 20.04上装了CUDA 12.0,结果PyTorch当时只支持到11.8,折腾了两小时。装之前一定去PyTorch官网看Supported CUDA版本。
4.5.3 完整GPU加速测试
写个小脚本,确认GPU真的在工作:
import torch
import time
# CPU测试
start = time.time()
a = torch.randn(5000, 5000)
b = torch.randn(5000, 5000)
c = a @ b
cpu_time = time.time() - start
print(f"CPU耗时: {cpu_time:.2f}秒")
# GPU测试(如果可用)
if torch.cuda.is_available():
start = time.time()
a = a.cuda()
b = b.cuda()
c = a @ b
torch.cuda.synchronize() # 等待GPU完成
gpu_time = time.time() - start
print(f"GPU耗时: {gpu_time:.2f}秒")
print(f"加速比: {cpu_time/gpu_time:.1f}x")
else:
print("GPU不可用,请检查CUDA安装")
正常来说,5000×5000矩阵乘法,GPU比CPU快20-50倍。如果加速比小于5,说明数据没在GPU上,或者驱动有问题。
4.6 环境验证清单
把所有验证命令汇总成一个脚本,跑一遍就知道环境是否就绪:
# check_env.py
import sys
import numpy as np
import cv2
import matplotlib
import torch
print(f"Python: {sys.version}")
print(f"NumPy: {np.__version__}")
print(f"OpenCV: {cv2.__version__}")
print(f"Matplotlib: {matplotlib.__version__}")
print(f"PyTorch: {torch.__version__}")
print(f"CUDA可用: {torch.cuda.is_available()}")
if torch.cuda.is_available():
print(f"GPU型号: {torch.cuda.get_device_name(0)}")
print(f"显存: {torch.cuda.get_device_properties(0).total_memory / 1e9:.1f} GB")
我的建议: 把这个脚本保存为 check_env.py,每次换机器或重装环境后先跑一遍。别问我为什么知道——我曾经在新服务器上折腾了三天,最后发现CUDA根本没装上。
4.7 常见问题与解决方案
| 问题 | 原因 | 解决方案 |
|---|---|---|
| ImportError: No module named cv2 | OpenCV未安装或环境不对 | pip install opencv-python,确认在正确环境 |
| torch.cuda.is_available() 返回 False | CUDA版本不匹配或驱动太旧 | nvidia-smi 检查驱动,重装匹配的CUDA |
| CUDA out of memory | 显存不足,batch size太大 | 减小batch size,或使用梯度累积 |
| OpenCV读取图片为None | 路径错误或图片损坏 | 用os.path.exists()检查路径,用PIL测试读取 |
| Matplotlib中文乱码 | 缺少中文字体 | 设置plt.rcParams['font.sans-serif']=['SimHei'] |
终极建议: 如果你实在搞不定GPU加速,先用CPU版本把算法跑通。暗光增强的模型一般不大,CPU也能跑,就是慢点。等环境搞定了再切GPU。别让环境问题卡住学习进度。