人工智能里的计算机视觉,动手第一步往往不是算法,而是环境搭建。我见过太多人在 Windows、Mac 或 Linux 上装环境时翻车,import cv2 直接报错,torch.cuda.is_available() 永远返回 False,最后卡在安装上连一行代码都没跑起来。这章把“环境搭建”这件事拆开讲清楚,目标不是给你一份复制粘贴就能完事的命令清单,而是让你理解每一步在做什么、为什么这个版本和你那个版本不匹配,以及三套系统之间有什么通用套路。适合刚入门计算机视觉的同学,也适合在本地开发、服务器部署之间反复横跳的工程师。
1. 为什么你总在环境这一步翻车:CV 环境的核心矛盾
1.1 计算机视觉应用对环境的依赖远比普通 Web 开发复杂
很多人学计算机视觉前写过 Python 脚本,觉得环境有什么好搭的?装个 Python,pip install 几个包不就行了?真不是。
一个典型的 CV 项目,至少牵扯到:Python 解释器、NumPy 这类数值计算库、OpenCV 或 Pillow 图像库、PyTorch 或 TensorFlow 深度学习框架,以及背后的 GPU 驱动、CUDA 加速层。再往上,还可能有摄像头采集、视频解码、图像显示窗口、模型部署框架。这么多组件叠在一起,版本之间是互相约束的。
我习惯用一个类比:普通 Web 脚本只需要一口锅,煮熟就行;计算机视觉是个完整厨房,灶台、锅、刀具、食材、火候全都得对上。灶台是操作系统和驱动,锅是 Python 环境,刀具是各种库,火候是 CUDA 和 GPU 加速配置。任何一个环节出了问题,菜就做不出来,而且报错往往不是“我没装好”,而是“我装了 A,结果 B 不认”。
1.2 先分清楚四层依赖:系统、驱动、框架、库
绝大多数环境问题,都是因为下面这四层没对齐:
- 系统层:Windows、macOS、Linux。系统决定了驱动怎么装、编译器是什么、路径规则长什么样。
- GPU 驱动层:NVIDIA 驱动负责让系统识别显卡。Windows 和 Linux 需要手动装,macOS 通常由系统更新统一管理。
- 加速层:NVIDIA 上叫 CUDA + cuDNN,AMD 上叫 ROCm,Apple Silicon 上叫 MPS。深度学习框架通过这一层调用显卡。
- 应用层:Python、conda 虚拟环境、PyTorch、OpenCV、NumPy 等工具库。
环境搭建的本质,就是把这四层“对齐”。CUDA 和显卡驱动有对应的支持关系,PyTorch 的安装包也有针对不同 CUDA 版本编译的 wheel,OpenCV 又要求特定的 Python 版本和 NumPy 兼容版本。任何一环错位,都会出现“看起来装好了,一跑就挂”的玄学问题。
1.3 跨平台的统一策略:虚拟环境 + 明确版本清单
既然环境依赖这么复杂,我们就不能靠“凭感觉装最新版”来解决问题。我的习惯是:一开始就固定一份版本清单,然后严格按照清单在三个平台上重建环境。
比如,你可以在项目根目录放一个 environment.yml 或 requirements.txt,里面写清楚:
code复制python=3.10
pytorch=2.1.0
torchvision=0.16.0
opencv-python=4.9.0.80
pillow=10.1.0
numpy=1.26.2
matplotlib=3.8.2
这套清单在 Windows、macOS、Linux 上都可以复现。虚拟环境保证不同项目之间不互相污染,版本清单保证同一个项目在不同机器上表现一致。后面所有章节,都会围绕这个思路展开。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 开工之前先定方案:工具链与版本选型
2.1 用 Miniconda 而不是 Anaconda 或系统自带 Python
如果你问我环境管理工具用哪个,我的答案很明确:Miniconda 或 Mambaforge。Anaconda 预装了几百个包,体积动不动几个 GB,对新手其实不友好——你以为方便,实际上里面很多包版本互相牵扯,出了问题很难排查。系统自带的 Python 更不用说了,它是给操作系统用的,你往里 pip install 一堆深度学习包,迟早破坏系统环境。
Miniconda 只带 conda 和 Python,需要什么装什么。它另外一个好处是跨平台一致:Windows、Mac、Linux 上都有对应的安装包,命令几乎一模一样。如果你觉得 conda 默认的依赖求解太慢,可以换成 mamba 作为底层求解器,或者直接用 Mambaforge 发行版,环境构建速度快很多。
另外强调一点:在 conda 虚拟环境里,尽量不要用 sudo pip 或系统 Python 直接装包。你要确保 which python 指向的是当前虚拟环境里的解释器,而不是 /usr/bin/python 或 /usr/local/bin/python。这个习惯能避免 80% 的玄学问题。
2.2 深度学习框架选型:以 PyTorch 为首选
计算机视觉领域现在的生态,PyTorch 是绝对的主流。原因不只是它好用,而是整个生态都围绕它转:HuggingFace 的模型、Ultralytics 的 YOLO、OpenMMLab 的检测/分割工具链、各类论文复现代码,几乎都是 PyTorch 优先。TensorFlow 仍然有存量项目,但新项目我基本不会推荐。
选型直接决定环境搭建方式。PyTorch 官方会根据 CUDA 版本发布不同的安装命令,CPU 版本、CUDA 11.8 版本、CUDA 12.1 版本各不相同。在 Mac 上,PyTorch 不用 CUDA,而是用 Apple 的 MPS 后端。你的框架选择变了,后面的安装命令就是另一套。
我给你的建议是:如果刚入门,直接上 PyTorch 2.x。它比 1.x 更快,API 更现代,对新手也友好。
2.3 图像处理与视觉库的搭配
除了深度学习框架,计算机视觉还离不开图像处理库。我的标配是:
- OpenCV:主力,读图、缩放、滤波、边缘检测、特征点提取都用它。安装包名是
opencv-python,导入名是cv2。 - Pillow:轻量图像 IO,处理图像格式转换、缩略图很方便。
- scikit-image:做图像算法实验时很顺手。
- Albumentations:做数据增强,训练模型时几乎必备。
需要注意,OpenCV 有两个常用包:opencv-python 和 opencv-python-headless。前者带 GUI 模块,可以在桌面上弹窗显示图像;后者不带 GUI,适合服务器和无界面环境。如果你在 Linux 服务器上 pip install opencv-python,经常会遇到 libGL.so.1 找不到的问题,换成 opencv-python-headless 就好了。
2.4 如何确定版本组合:别直接装最新版
很多人习惯 pip install opencv-python,觉得最新版一定最好。实际上在 CV 领域,“最新版”不一定兼容你的环境。比如 PyTorch 2.1 可能要求 NumPy 1.26 以上,而 OpenCV 某个旧版本又可能和 NumPy 1.26 冲突。所以,版本组合比单个版本更重要。
我通常这样确定:先去 PyTorch 官网看安装命令生成器,选择你的系统和 CUDA 版本,它会生成准确的 pip install 命令;再去看 OpenCV release notes,找到和当前 Python 版本兼容的版本。不要嫌麻烦,这一步省下的一小时,可能就是你后面踩坑的一整天。
3. Windows 环境搭建:按“驱动→框架→验证”的顺序来
3.1 确认你的显卡与驱动
Windows 是很多新手的第一台电脑,同时也是最容易踩坑的平台。第一步先去确认显卡。
打开命令行,输入:
code复制nvidia-smi
如果能看到显卡列表和驱动版本,说明你有 NVIDIA 显卡并且驱动正常。注意右上角显示的 CUDA Version 是当前驱动最高支持的 CUDA 版本,不代表你已经装了 CUDA。比如显示 CUDA Version: 12.1,意味着你最多可以跑 CUDA 12.1 的 PyTorch。
如果你没有 NVIDIA 显卡,也没关系。先安装 CPU 版 PyTorch,学习用完全够。等以后有 GPU 了再重新创建环境,几分钟的事。
3.2 安装 Miniconda 并创建独立环境
到 Miniconda 官网下载 Windows 安装包,建议选择 Python 3.10 对应的版本。安装时一路默认,有一步问是否加入 PATH,我建议勾选,方便命令行直接使用 conda。如果不勾选,也可以用 Anaconda Prompt。
安装完重开一个终端,执行:
code复制conda create -n cv python=3.10 -y
conda activate cv
如果 conda activate cv 报错或命令不存在,先执行:
code复制conda init powershell
然后重开终端。Windows 的 PowerShell 默认不给脚本执行权限,conda init 会帮你配置好。
3.3 安装 PyTorch GPU 版与 OpenCV
在 Windows 上,我推荐一个省事的路子:不要一开始就手动装 CUDA Toolkit,先装 PyTorch,因为它自带的安装包里已经包含了 CUDA runtime 和 cuDNN。只要你的显卡驱动版本足够新,一般就能直接跑起来。
PyTorch 官方安装命令大概是:
code复制pip install torch==2.1.0 torchvision==0.16.0 --index-url https://download.pytorch.org/whl/cu118
注意:cu118 表示 CUDA 11.8 对应的版本。如果你前面看到驱动支持 CUDA 12.x,可以换成 cu121。然后安装图像库:
code复制pip install opencv-python==4.9.0.80 pillow==10.1.0 matplotlib==3.8.2
如果官方源下载慢,可以临时换成开源镜像站,但 PyTorch 的 --index-url 参数建议保留官方地址,避免 CUDA wheel 不匹配。
3.4 验证环境是否装上 GPU
装完别急着写项目,先跑一句验证:
bash复制python -c "import torch, cv2; print(torch.__version__, torch.cuda.is_available(), cv2.__version__)"
如果输出 2.1.0 True 4.9.0,说明 GPU 可用;如果 torch.cuda.is_available() 返回 False,不要慌,后面有专门一节讲排查。
另外,CPU 版用户看到 False 是正常的,因为你没装 GPU 版。
3.5 Windows 特有的坑:路径、杀毒、DLL
Windows 上有三个坑我几乎每次都要提醒:
第一,项目路径和 conda 环境路径里不要有中文、空格、特殊符号。C:\Users\张三\cv_project 这种路径,轻则编译失败,重则 DLL 加载失败。
第二,Windows Defender 或其他杀毒软件可能把 OpenCV 或 PyTorch 的某些 DLL 误报隔离。如果出现莫名其妙的 DLL load failed,先把项目目录加入杀毒白名单,再重新安装相关包。
第三,DLL load failed 还有可能是缺少 Microsoft Visual C++ 运行库。去微软官网下载最新的 “Visual C++ Redistributable” 装一遍,再重装 OpenCV 就能解决。
4. macOS 环境搭建:Apple Silicon 走 MPS,别硬套 CUDA
4.1 先看清楚芯片:Intel 还是 Apple Silicon
macOS 和 Windows/Linux 的最大区别是没有 NVIDIA GPU,所以 CUDA 这条路在 Mac 上走不通。Apple Silicon 芯片,比如 M1、M2、M3、M4,可以通过 PyTorch 的 MPS 后端调用 GPU 加速。
先确认你的芯片型号。点左上角苹果图标 -> “关于本机”,或者在终端输入:
code复制uname -m
输出 arm64 就是 Apple Silicon,输出 x86_64 就是 Intel。这个区别决定了你下载的 Miniconda 安装包以及环境里某些包的原生二进制版本。
4.2 安装 Miniconda 与 Xcode Command Line Tools
macOS 上我同样推荐 Miniconda。下载时一定要选 Apple Silicon 版本的安装包,否则会装成 x86_64 环境,性能吃亏。
另外,很多包在 Mac 上需要编译,而编译依赖 Xcode Command Line Tools。终端执行:
code复制xcode-select --install
弹出窗口点安装即可。如果缺失这个工具,你 pip install 时经常会看到 “error: command 'clang' failed with exit status 1”。
4.3 创建环境并安装 PyTorch(MPS 版)与 OpenCV
在 Mac 上,PyTorch 安装不需要指定 CUDA 版本,直接装默认包就行,它自带 MPS 支持:
code复制conda create -n cv python=3.10 -y
conda activate cv
pip install torch==2.1.0 torchvision==0.16.0
pip install opencv-python==4.9.0.80 pillow==10.1.0 matplotlib==3.8.2
验证 MPS 是否可用:
bash复制python -c "import torch; print(torch.backends.mps.is_available())"
如果输出 True,你就可以在训练代码里写 device = "mps",和 CUDA 的用法几乎一样。遇到个别算子不支持时,设置环境变量 PYTORCH_ENABLE_MPS_FALLBACK=1 可以回退到 CPU。
4.4 macOS 权限与 OpenCV 窗口的问题
macOS 对摄像头和麦克风有严格隐私控制。如果你的 CV 项目要调用摄像头,第一次运行时系统会弹窗询问是否允许终端访问摄像头,必须在“系统设置 -> 隐私与安全性 -> 摄像头”里允许对应的终端程序。
还有一个很多人遇到的坑:OpenCV 的 cv2.imshow 在 macOS 上有时会崩,尤其是从 Jupyter Notebook 或非主线程调用时。我的做法是:脚本里尽量用 cv2.imwrite 保存结果图,而不是弹窗显示。真要交互式看效果,用 VSCode 的图片预览或者 Jupyter 内嵌显示更稳定。
4.5 别让 Homebrew 和 conda 打架
macOS 用户很喜欢用 Homebrew 装 Python,但这会让环境非常混乱。Homebrew 适合装 ffmpeg、cmake 这类系统级工具,但 Python 环境管理交给 conda 就好。如果你发现 which python 指向 /opt/homebrew/bin/python,说明当前终端没有激活 conda 环境,优先 conda activate cv 而不是去改 Homebrew 的 Python。
5. Linux 环境搭建:服务器上最稳的组合拳
5.1 为什么生产环境基本都选 Linux
如果你的目标是做真实的计算机视觉项目,或者以后要到服务器/集群上跑训练,Linux 是绕不开的。原因很现实:云服务器基本是 Linux,大部分深度学习镜像基于 Ubuntu,Docker 容器在 Linux 上性能损耗最小。另外,Linux 无桌面环境更轻量,内存全部留给训练。
推荐 Ubuntu 20.04 或 22.04 LTS。不是说不可以用其他发行版,只是遇到问题时,用 Ubuntu 你能搜到的解决方案最多。
5.2 安装 NVIDIA 驱动与 CUDA 的正确姿势
Linux 上最容易翻车的是驱动安装。我的建议分两步:
先装驱动。新装的 Ubuntu 执行:
code复制sudo apt update && sudo apt upgrade -y
sudo ubuntu-drivers autoinstall
sudo reboot
重启后运行 nvidia-smi,能看到显卡信息就是驱动正常。
再装 CUDA。这里有个技巧:如果你只是用 PyTorch 跑模型,只需要 NVIDIA 驱动,不需要手动安装完整 CUDA Toolkit,因为 PyTorch 的 wheel 自带 CUDA runtime。你直接按下一节创建环境、pip install torch 即可。
只有当你需要自己编译 CUDA 扩展、编译 OpenCV 的 CUDA 版本时,才需要安装 CUDA Toolkit。这种场景下我建议用 NVIDIA 官方 apt 仓库安装,而不是网上随便找 runfile,这样后续卸载和升级都干净。
5.3 用 conda 环境隔离项目依赖
Linux 服务器上系统自带的 Python 通常归 apt 管理,不要动它。每个项目建一个 conda 环境是最稳妥的:
code复制conda create -n cv python=3.10 -y
conda activate cv
pip install torch==2.1.0 torchvision==0.16.0 --index-url https://download.pytorch.org/whl/cu118
pip install opencv-python-headless==4.9.0.80 pillow==10.1.0 matplotlib==3.8.2
看到区别了吗?我用了 opencv-python-headless,因为服务器通常没有显示器,带 GUI 的 OpenCV 会报 libGL.so.1 找不到。如果你的服务器偶尔要显示图像,可以装 libgl1 libglib2.0-0:
code复制sudo apt install -y libgl1 libglib2.0-0
这时再装 opencv-python 也不迟。
5.4 远程开发时怎么验证环境
服务器一般是无界面或者通过 SSH 访问的。不要想着 cv2.imshow 弹窗,那不现实。我的验证方法很简单:跑一段脚本,读一张图,做几个处理,保存到文件,再确认输出日志。
远程训练还有一个常见痛点:CPU 版本的 PyTorch 在 Linux 上性能本身没问题,但如果你有 GPU 却装成了 CPU 版,训练速度会慢得离谱。验证时一定要检查 torch.cuda.is_available()。
5.5 多版本 CUDA 共存
Linux 服务器上经常需要同时跑多个项目,有的依赖 CUDA 11.8,有的要 CUDA 12.1。不建议反复重装,可以安装多个 CUDA Toolkit 到不同目录,然后通过环境变量切换:
code复制export PATH=/usr/local/cuda-12.1/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-12.1/lib64:$LD_LIBRARY_PATH
或者用 update-alternatives 管理默认版本。这个操作对新手有点复杂,但只要你需要维护多项目环境,早晚会遇到。
6. 三平台通用的自检脚本与排错手册
6.1 一段脚本验证环境的关键项
装完环境别急着跑模型,建议先跑这个自检脚本:
python复制import platform
import sys
import numpy as np
import torch
import cv2
print("系统:", platform.system(), platform.machine())
print("Python:", sys.version.split()[0])
print("NumPy:", np.__version__)
print("PyTorch:", torch.__version__)
print("OpenCV:", cv2.__version__)
if torch.cuda.is_available():
print("CUDA:", torch.version.cuda, torch.cuda.get_device_name(0))
elif hasattr(torch.backends, "mps") and torch.backends.mps.is_available():
print("MPS: available")
else:
print("Accelerator: CPU")
运行后你应能明确看到:当前系统、Python 版本、各库版本、加速方式。这个脚本名字就叫 check_env.py,可以放在每个项目根目录。
6.2 用一张真实图片跑通完整图像流程
自检脚本只能验证“能导入”,我还建议再跑一个完整流程,确认 OpenCV 能正常读图和处理。
python复制import cv2
import numpy as np
# 生成一张纯色图像
img = np.zeros((480, 640, 3), dtype=np.uint8)
img[:, :] = (114, 128, 250) # BGR颜色
# 缩放、灰度、边缘检测
resized = cv2.resize(img, (320, 240))
gray = cv2.cvtColor(resized, cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray, 100, 200)
cv2.imwrite("output.jpg", edges)
print("保存成功,图像尺寸:", edges.shape)
如果这个脚本能在你的平台输出正常,说明 OpenCV 的 IO 和基本图像处理链路是通的。
6.3 高频报错与解决方案对照表
我把各种平台上高频遇到的报错整理成了表格,方便查阅:
| 报错信息 | 可能原因 | 解决方案 |
|---|---|---|
ModuleNotFoundError: No module named 'torch' |
没装 PyTorch 或环境没激活 | conda activate cv,然后按官方命令安装 |
ImportError: DLL load failed |
Windows 缺少 VC++ 运行库或包损坏 | 安装 Visual C++ Redistributable,重装包 |
libGL.so.1: cannot open shared object file |
无头服务器装了带 GUI 的 OpenCV | 换成 opencv-python-headless,或安装 libgl1 |
CUDA error: no kernel image is available |
显卡驱动和 PyTorch 的 CUDA 版本不匹配 | 升级显卡驱动,或换成与驱动匹配的 CUDA 版 PyTorch |
AssertionError: Torch not compiled with CUDA enabled |
装了 CPU 版 PyTorch 却想用 GPU | 重新安装对应 CUDA 版本的 PyTorch |
Killed |
内存或显存不足,系统杀进程 | 减小 batch size,或换 CPU/共享内存运行 |
zsh: permission denied |
终端没有权限执行文件 | chmod +x,或以当前用户运行 |
conda: command not found |
conda 未初始化 | 执行 conda init bash 或 conda init powershell |
这张表不是全部,但覆盖了新手 80% 的报错场景。
6.4 资源不足时的临时调整
训练或者跑模型时,如果报 CUDA out of memory,并出现 Killed,不一定是代码问题,更多是资源分配没做好。我常用的两个临时手段:
- 设置环境变量:
export PYTORCH_CUDA_ALLOC_CONF=max_split_size_mb:128,这是 PyTorch 官方建议的内存碎片优化方案。 - 把数据预处理线程数调小:
num_workers=0或2,避免多个子进程抢占内存。
这些都不是长久之计,但能让你在环境没问题的情况下先把实验跑通。
7. 让环境可复现:从个人实验到团队项目
7.1 用 environment.yml 锁定完整环境
如果你只是自己学习,requirements.txt 就够了。但一旦要换电脑、换服务器,或者跟同学同事协作,建议用 conda 的 environment.yml 把环境完整导出来:
code复制conda env export > environment.yml
这个文件会记录所有包的精确版本,包括 pip 安装的包。对方拿到后:
code复制conda env create -f environment.yml
就能还原出一个几乎一摸一样的环境。注意 conda env export 导出的是当前平台相关的包,如果你需要跨平台,可能需要手动精简文件,只保留关键依赖。
7.2 统一 pip 和 conda 的下载源
团队协作时,如果每个人用不同的下载源,光依赖解析不一致就能折腾半天。我建议把公共配置写进 .condarc 和 pip.conf,放到项目里或用户的 home 目录,规定统一使用官方源或你所在团队信任的开源镜像站。
但要提醒一句:PyTorch 的 CUDA 版本安装命令里 --index-url 不要乱改,因为不同 index 的 wheel 可能没有对应 CUDA 版本。其他包用公共源一般没问题。
7.3 分清 conda、pip、系统包的边界
很多人喜欢混着用包管理器。conda 装一部分,pip 装一部分,系统 apt 又装一部分,最后环境乱到没法维护。我的原则是:
- 在一个 conda 虚拟环境里,优先用 conda 装能 conda 安装的包,conda 没有的再用 pip。
- 不要在 conda 虚拟环境里用
sudo pip,更不要用系统 apt 装 Python 包。 - 每次创建环境后,先
which python确认解释器路径。
这个边界守住了,环境基本不会乱。
7.4 在 IDE 和 Jupyter 里连接环境
代码写到一半想在 IDE/Notebook 里跑,结果告诉你有 20 个包缺失,原因往往是 IDE 选错了解释器。VSCode 里按 Ctrl+Shift+P,输入 “Python: Select Interpreter”,选择你的 cv 环境;PyCharm 则是在 Settings -> Project -> Python Interpreter 里添加 conda 环境。
Jupyter 想用这个环境,需要先装上内核:
code复制python -m ipykernel install --user --name cv --display-name "CV"
之后在 Jupyter 里就能看到名为 “CV” 的内核。
7.5 我自己的一个小习惯
我现在每开一个 CV 项目,都会在项目根目录下放一个 env.sh 或 setup.bat,里面写好创建环境、安装依赖的完整命令。新机器上拉代码后,先跑一遍这个脚本,五分钟还原环境。这个习惯看起来不起眼,但它帮我省掉了大量“换电脑后重启项目”的重复劳动。环境搭建这件事,一次性做扎实,比后面不停修修补补舒服得多。
