第4章 环境搭建与工具链:Python环境配置、OpenCV、NumPy、Matplotlib、PyTorch/TensorFlow安装、GPU加速验证

说实话,很多同学在暗光增强这条路上栽的第一个跟头,不是算法太难,而是环境没搭好。我见过太多人花了两天装库,最后发现GPU根本没用上,跑一张图要半小时。嗯,这一章咱们就把这事彻底理清楚。

4.1 整体工具链概览

做暗光增强,说白了就是跟像素矩阵打交道。你需要一套趁手的工具:

  • Python — 胶水语言,把一切粘起来
  • NumPy — 矩阵运算的基石,图像本质就是多维数组
  • OpenCV — 图像读写、预处理、后处理,一步到位
  • Matplotlib — 可视化对比,调参时全靠它看效果
  • PyTorch / TensorFlow — 深度学习引擎,二选一即可
  • CUDA + cuDNN — GPU加速的钥匙

我个人习惯用PyTorch做研究原型,TensorFlow部署生产。但初学者选一个深入就够了,别两头都学,容易乱。

暗光增强工具链架构 Python 3.8+ NumPy OpenCV Matplotlib PyTorch 或 TensorFlow CUDA + cuDNN NVIDIA GPU (算力 ≥ 6.0) 💡 安装顺序很重要 先装CUDA → cuDNN → Python → 深度学习框架 → 其他库 顺序错了容易版本冲突

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。别让环境问题卡住学习进度。