先说结论:单目深度估计这事,模型本身早就不是瓶颈了,真正卡住大家的往往是环境。Depth-Anything-3(后面我简称 DA-3)能从一张普通 RGB 图直接推出逐像素深度图,在三维重建、机器人抓取、背景虚化这些场景里都是硬需求,但很多同学拿到代码后在 Windows 11 上一跑就是一堆报错。这篇保姆级教程我用 VSCode 加 Conda 这套组合,把从零搭建 DA-3 运行环境的完整流程拆开揉碎,配合命令、截图级别的解释和常见报错的修复思路,保证你跟着走完就能出自己的第一张深度图。
这篇文章适合这么几类人看:想快速验证深度估计效果的产品原型工程师、做毕设需要跑深度模型的学生、以及被 Windows 下 Python 环境折腾到崩溃的入门 CV 玩家。我会把每一步为什么要这么做讲清楚,而不是只丢给你一堆命令。
1. 项目认知与环境决策:先搞清楚要装什么
1.1 Depth-Anything-3 到底是干什么的
深度估计分两种:双目和多目靠视差算深度,单目只凭一张图猜深度。听起来很玄,但 DA-3 这类模型已经把这件事做到了非常成熟的程度。你给它一张普通照片,它会在每个像素上输出一个深度值,近的亮、远的暗,生成一张和原图同样尺寸的深度图。不管是做视频人像背景虚化、给二维图片加三维视差,还是给机械臂提供抓取参考,这张深度图都是关键输入。
DA-3 严格来说是 Depth-Anything 系列的新版本。这个系列的特点是训练数据覆盖面大、对室内室外各种场景泛化能力不错,而且模型有大中小多种尺寸可选,小模型在没有独显的机器上也能跑。这也是我推荐大家在 Windows 上折腾它的原因:不像某些最新大模型必须靠服务器,DA-3 的小规格版本在普通消费级显卡上就能玩得动。
1.2 为什么偏偏选 Conda + VSCode 这套组合
很多人会觉得,我装个 Python 然后 pip install 一下不就行了,为什么还要专门引入 Conda?我这里说一个真实踩坑场景:你昨天在系统 Python 里装了某个项目的依赖,今天跑 DA-3 又装了一批新版 torch 和 numpy,结果 torch 要求 numpy 小于 2.0,另一个项目又要 numpy 2.1,两个项目直接打架。如果你不懂虚拟环境,最后的归宿基本是重装系统。
Conda 的价值就是给你每个项目一个独立的小房间,python 版本、依赖版本全隔离。深度学习项目尤其吃这套,因为 PyTorch 和 CUDA 的版本绑定关系非常敏感,稍微错一位就容易出问题。VSCode 则是轻量、免费、插件生态成熟,选中 Conda 环境后写代码、跑脚本、看日志全在一个窗口搞定。Windows 11 自带的终端和 VSCode 集成终端配合也顺畅,只要注意一下 PowerShell 执行策略就行,后面会讲。
我的建议是不要用 Anaconda,那个太大了,自带一堆你用不到的包。Miniconda 只保留核心的 conda 命令和 Python,干净利落。
1.3 先做环境体检:显卡、驱动与 CUDA 版本
安装之前一定要查三样东西:显卡型号、驱动版本、CUDA 支持情况。Windows 11 下按Ctrl + Shift + Esc打开任务管理器,切到“性能”选项卡,左边最下面如果有“GPU”,点一下就能看到显卡型号。然后打开一个终端,输入:
nvidia-smi如果提示“不是内部或外部命令”,说明 NVIDIA 驱动没装好,或者驱动装完没有把路径加进环境变量。正常情况下你会看到这样几行关键信息:
- Driver Version:驱动版本,比如 551.86
- CUDA Version:这个不是说你装了 CUDA 工具包,而是当前驱动最高支持的 CUDA 版本,比如 12.4
Python 环境里的 PyTorch 用到的 CUDA runtime 不一定需要和驱动版本完全一致,驱动版本小于等于这个数就行。比如 nvidia-smi 显示 CUDA Version 12.4,那么你装 CUDA 11.8 或 12.1 的 PyTorch 都能跑。
如果你没有 NVIDIA 显卡,只有核显,也不用放弃,装 CPU 版 PyTorch 照样能出深度图,就是速度慢几倍到几十倍。小尺寸模型出一张 640x480 的深度图,GPU 零点几秒,CPU 可能要十几秒,但至少能学。
版本搭配我这里给一个比较稳的组合,大家可以直接照着选:
| 软件 | 推荐版本 | 说明 |
|---|---|---|
| Python | 3.11 | PyTorch 对 3.11 支持成熟,第三方包兼容性好 |
| Conda | Miniconda 最新版 | 不要用 Anaconda |
| VSCode | 最新 Stable | 安装时勾选“添加到 PATH” |
| PyTorch | 2.x | 具体版本根据 CUDA 选 |
| CUDA Toolkit | 11.8 或 12.1 | 通过 PyTorch 安装,不需要单独装全量 CUDA |
这里单独解释一个误区:很多人以为跑深度学习必须单独装 NVIDIA CUDA Toolkit,实际上 PyTorch 的 pip 包会自带所需的 CUDA 运行库。你只要确保显卡驱动足够新,然后用对应的 pip 命令装 torch 就行,环境变量都不需要额外配置。Windows 上很多报错都是因为多装了一套 CUDA,导致 DLL 版本冲突。所以我们的原则是:驱动装好,剩下交给 PyTorch。
2. 环境搭建实操:Miniconda 安装与 VSCode 搭配
2.1 下载安装 Miniconda
这一步没什么技术含量,但选项容易选错。去官网下载 Windows 64 位安装包,如果官网下载慢,用清华镜像站的 Anaconda 安装包目录里也有 Miniconda 安装包。双击安装,注意这三个选项:
- 安装模式选择“Just Me”,不要选“All Users”,后者在后续创建环境和写文件时容易出现权限问题。
- 安装路径建议用默认,或者改成 D:\Miniconda3 这种纯英文路径,尽量不要带空格和中文。虽然 Conda 一般能处理带空格的路径,但部分编译型 Python 包在安装时会拿路径去拼接,空格就成炸弹了。
- 安装过程中有一个“Add Miniconda3 to my PATH environment variable”的复选框,很多教程会让你勾选。我的建议是看自己需求,如果勾选了,在 Windows Terminal 里就能直接用 conda,省事;但如果系统里已经装了别的 Python,后续可能出现 conda 和 python 命令互相抢占的混乱。我自己的习惯是不勾选,用 Anaconda Prompt 来执行 conda 相关操作,VSCode 里选解释器时直接能识别,不影响使用。
安装完成后,打开开始菜单里的“Anaconda Prompt (Miniconda3)”,你会看到行首有(base),说明进入了 conda 的基础环境。如果不想每次打开终端都自动激活 base,执行:
conda config --set auto_activate_base false我个人建议关掉,尤其是要在一台机器上多个项目切换的时候,裸终端不自动进任何环境是最干净的。
2.2 配置 conda 国内镜像源,否则你会在下载时崩溃
这一步强烈建议在安装完 Miniconda 后立刻做。Windows 上 conda 默认源在国外,创建 Python 环境时下载 Python 解释器包经常慢到怀疑人生,甚至直接HTTP 000 CONNECTION FAILED。在 Anaconda Prompt 里依次执行:
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ conda config --set show_channel_urls yes这些命令会把清华源写到C:\Users\你的用户名\.condarc文件里。注意执行顺序,--add是加在列表前面的,所以越晚加的优先级越高,我习惯把 main 和 free 各加一遍,覆盖面比较广。完成后你可以用conda info查看 channel 列表确认是否生效。
配好源再装环境,速度会有质的提升。如果你在下载某些包时发现清华源里没有,再临时从 conda-forge 装也不迟,但不要一开始就把 conda-forge 放在最高优先级,因为它的包更新频繁,有时候会和主源产生冲突。
2.3 VSCode 安装与插件配置
VSCode 直接官网下载 System Installer 版,安装时有两处建议勾选:“添加到 PATH”和“在文件资源管理器上下文菜单中启用代码操作”,这样你在项目文件夹上右键可以直接“Open with Code”。
装完以后打开插件面板,搜 Python,安装微软官方那个ms-python.python扩展。这个扩展会自动带上 Pylance,代码补全和类型检查都靠它。如果英文界面不习惯,再搜 Chinese Language Pack 装一下,重启 VSCode 就是中文了。
这一步不要装太多花里胡哨的插件,对于跑 DA-3 来说,Python 插件加自带终端完全够用。后面我们创建好 conda 环境后,在 VSCode 里按Ctrl+Shift+P,输入Python: Select Interpreter,选择da3环境,才能保证你运行脚本时用的是正确环境。
3. 创建 DA-3 运行环境并安装依赖
3.1 使用 conda 创建独立的深度估计专用环境
环境隔离是整套流程的核心。在 Anaconda Prompt 里执行:
conda create -n da3 python=3.11 -y这条命令会创建一个名为 da3 的独立环境,Python 版本锁定 3.11。为什么不是最新的 3.12 或 3.13?因为深度学习依赖链整体节奏偏保守,PyTorch 对新 Python 版本的支持往往要滞后几个月,第三方编译包里很容易找不到匹配 3.13 的 wheel 文件。3.11 是当前综合兼容性最好的版本,这也是为什么清华源那条热搜里大家都推荐python=3.11。
创建完成后激活环境:
conda activate da3这时候行首会从(base)变成(da3)。然后检查一下命令指向:
where python where pip在 Windows 上,这两条命令会列出所有 python.exe 和 pip.exe 的路径。你要确保排在前面的是你的 conda 环境路径,比如D:\Miniconda3\envs\da3\python.exe。如果第一个还是系统 Python,说明激活没成功,或者 PATH 顺序有问题。这个检查很重要,我见过太多人环境看起来激活了,但 pip 装的包实际进了全局 Python,导致后面No module named 'torch'。
3.2 安装 PyTorch:CPU 版还是 GPU 版,怎么选
PyTorch 是跑 DA-3 最关键也最容易出错的依赖。强烈不建议用conda install pytorch,因为 conda 默认源里的 PyTorch 版本更新慢,Windows 下的 cudatoolkit 依赖还容易搞出版本连锁问题。我统一用 pip 去装。
先升级 pip 到最新版:
python -m pip install --upgrade pip然后打开 PyTorch 官网的 Get Started 页面,选择 Windows、Pip、你的 CUDA 版本,它会生成安装命令。如果你不确定自己该用哪个 CUDA 版本,我给出两条常见命令:
CUDA 11.8(兼容性最广):
pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118CUDA 12.1(适合新显卡):
pip install torch torchvision --index-url https://download.pytorch.org/whl/cu121如果你想用 CPU 版(没独显或只想先学流程):
pip install torch torchvision --index-url https://download.pytorch.org/whl/cpu这里要解释一下--index-url的作用:PyTorch 的 GPU 版本比较大,几个 G 都很正常,直接 pip install torch 会默认从 PyPI 拉取,而 PyPI 上默认的 torch 版本可能带有 CUDA 库的绑定,但不一定是你想要的版本组合。指定--index-url可以精确拿到对应 CUDA 的 wheel。如果你发现 PyTorch 官方下载源速度太慢,可以临时把 scoop 换成国内镜像?其实 PyTorch 的官方 wheel 源一般还好,实在不行再给 pip 配一个清华 PyPI 镜像,但只针对其他小包,torch 这个包我一般还是从官方源拉,稳定性优先。
装完以后验证 GPU 是否可用:
python -c "import torch; print(torch.__version__); print(torch.cuda.is_available())"如果输出第二行是True,恭喜,你的 PyTorch 能吃到显卡。如果是False,说明装的是 CPU 版,或者驱动、CUDA 版本不匹配。不要急着抱怨,先nvidia-smi看一眼驱动版本,再去对照 PyTorch 要求的 CUDA 版本。
3.3 拉取 DA-3 仓库并安装剩余依赖
现在到了真正接触 DA-3 项目代码的环节。打开项目文件夹,用 VSCode 打开终端,确保当前处于 da3 环境,然后:
git clone https://github.com/你的DA3仓库地址.git如果 GitHub 克隆速度感人,也可以直接在网页端下载 ZIP 包,解压到本地。这里有一个我反复强调的建议:项目路径不要放在带中文、空格或特殊符号的目录下。比如D:\project\depth_anything_3就很稳,C:\Users\张三\桌面\深度估计项目就容易出问题,因为很多 C++ 扩展在链接头文件时会用诡异的方式拼接路径,中文目录名直接导致编译失败。
进入项目目录后,一般仓库里会有一个requirements.txt。安装前先看一下内容,确认里面有没有 torch 和 torchvision,如果有,并且你已经在 3.2 步装好了,建议先把这两行注释掉再装,否则 pip 可能会擅自把你的 torch 版本改成它自己要求的版本。安装命令:
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple加上-i参数可以临时使用清华 PyPI 镜像,下载速度会快很多。如果你平时用 pip 比较多,可以干脆在用户目录下创建pip.ini文件配置默认源,Windows 的路径是C:\Users\你的用户名\AppData\Roaming\pip\pip.ini,写入:
[global] index-url = https://pypi.tuna.tsinghua.edu.cn/simpleDA-3 的模型权重一般体积不小,官方仓库的 README 会写明下载方式。很多模型权重放在 HuggingFace 上,下载困难是常见问题。如果你遇到权重下载到一半中断、或者连接失败,可以临时设置环境变量把 HuggingFace 的下载端点切到国内镜像站:
set HF_ENDPOINT=https://hf-mirror.com然后重新运行模型下载脚本或 HuggingFace 相关命令。设置好后,权重下载会顺畅很多。注意这个设置只对当前终端窗口有效,每次打开新终端如果还想用镜像站,需要重新设置。
权重文件下载完成后,务必确认它的文件名和路径和你运行脚本时预期的一致。最常见的情况是仓库脚本写死了要从checkpoints/depth_anything_3.pth加载,但你下载的文件名带了一长串日期或 commit hash,结果找不到文件,直接FileNotFoundError。我一般会先看一眼运行的命令或配置里的--encoder参数,再手动把权重重命名成预期文件名放进去。
4. 跑通第一个深度图:从图片到深度图的完整过程
4.1 先用官方推理脚本走通流程
不管 DA-3 仓库里给的是run.py还是infer.py,核心参数一般是图片路径和输出路径。以最常见的调用方式为例,在项目根目录下运行:
python run.py --img-path assets/examples --outdir outputs有些版本还会让你指定模型大小,比如--encoder vitb表示 base 模型,vits是小号模型,vitl是大号模型。第一次运行建议先用小模型,速度更快,报错也更好排查,等完全跑通了再换大模型提升精度。
跑完后在outputs目录里会生成对应图片的深度图。看一下输出文件名,如果后缀是.pfm,这是一种保留浮点精度的深度图格式,可以用专门的查看器或者后续脚本转成伪彩色 PNG。如果脚本直接输出.png的彩色深度图,那就更方便,直接看图。
这里我要提醒一个新手容易忽略的点:DA-3 这类模型对输入图片分辨率不是无限制的。如果输入一张超大的几千万像素照片,很可能直接爆显存。官方一般有--input-size参数,我建议先从 518 这种小尺寸开始,跑通了再慢慢往上加。这也是后面性能调优的基础。
4.2 如果你不想用官方脚本,可以写一个更可控的推理代码
官方脚本封装程度高,但有时候你想自定义输入输出的逻辑,比如多张图循环处理、在深度图上叠加原图、或者把深度图保存成不同格式。这时候自己写一个 Python 脚本更自由。下面这段代码用一种非常通用的 Transformers Pipeline 方式加载深度估计模型,适合快速验证,也适合不想折腾仓库内部代码的同学:
import cv2 import numpy as np from PIL import Image from transformers import pipeline # 模型名称按官方仓库说明替换,DA-3 或 Depth-Anything 系列的 HF 模型格式基本一致 pipe = pipeline("depth-estimation", model="LiheYoung/depth-anything-small-hf") image = Image.open("input.jpg").convert("RGB") result = pipe(image) # 查看返回结果的关键字段 print(result.keys()) depth_map = result["depth"] # PIL 灰度图,0 表示近,255 表示远(不同模型可能相反) # 转成 numpy 数组 depth_np = np.array(depth_map, dtype=np.float32) / 255.0 # 保存为 16 位 PFM(传统深度图格式,信息无损) def save_pfm(path, image): h, w = image.shape with open(path, "wb") as f: f.write(b"PF\n%d %d\n-1.0\n" % (w, h)) f.write(image.astype("<f4").tobytes()) save_pfm("output_depth.pfm", depth_np) # 保存伪彩色 PNG(方便人眼查看) color_map = cv2.applyColorMap((depth_np * 255).astype(np.uint8), cv2.COLORMAP_INFERNO) cv2.imwrite("output_color.png", color_map)用 Transformers Pipeline 的好处是依赖少、封装统一,模型下载和推理逻辑都帮你处理好了。缺点是比直接跑仓库源码多一层封装,速度有轻微损失。如果你追求极致性能和可控性,还是以仓库官方脚本为准,这段代码适合先快速看效果。
4.3 深度图输出怎么理解
拿到深度图后,很多人会困惑:为什么我的图是亮暗颠倒的?这取决于模型训练时定义的深度排序,不少模型输出的是近处亮、远处暗,也有反过来的。这不影响深度信息的正确性,你只要知道像素间的相对大小代表相对远近就行。
绝对深度和相对深度是另一个概念。DA-3 这类模型默认输出的是相对深度,也就是说,同一张图里的深度值是彼此相对比较得来的,不代表真实的米制距离。如果你需要真实距离,要么用已知深度标定,要么在场景里放一个已知尺寸的参照物来换算。这一点在做三维重建时尤其重要,很多人拿着相对深度图去换算点云坐标,结果形状是出来了,尺度全不对。
5. 报错与修复:Windows 11 下最常踩的坑
5.1 conda 创建环境时 HTTP 000 或下载速度太慢
这个基本是网络源问题,解决办法前面已经说过:配置清华源。如果配置完还是慢,检查一下C:\Users\你的用户名\.condarc文件,看看是不是被之前的一些教程写入了奇怪的 URL 地址。直接把文件内容清掉,重新用命令添加 channel 即可。
还有一些情况是 SSL 证书校验失败,此时不要图省事去关闭 SSL 验证,那样后续还会引发各种安全性和稳定性问题。检查一下机器时间是否正确、是否装了某些安全软件拦截了 conda 的网络请求。
5.2 conda 命令不是内部或外部命令
如果在 Windows Terminal 或 PowerShell 里输入 conda 提示找不到,多半是安装时没勾选“添加到 PATH”。最简单的解决办法不是手动去改环境变量,而是直接用开始菜单里的 Anaconda Prompt。这个快捷方式会自动初始化 conda 路径。
如果你坚持要在 PowerShell 里用 conda,需要先执行一次初始化:
conda init powershell然后重启终端,它会修改你 PowerShell 的 profile 文件,加入 conda 初始化脚本。如果你看到红色文字提示“无法加载文件,因为在此系统上禁止运行脚本”,这是 PowerShell 执行策略的问题,执行:
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser这个命令的作用是允许本地脚本运行,同时要求网络下载的脚本必须有签名,安全性可控,比直接用 Unrestricted 要稳。
5.3 No module named 'torch',但自己明明装过
遇到这个报错,第一反应不要去找 torch 安装教程,而是检查当前运行的 Python 解释器是不是你装 torch 的那个环境。在 VSCode 终端里运行:
where python where pip如果第一条路径指向全局 Python,而你是在 da3 环境里安装的 torch,那必然找不到。这种问题 90% 出现在 VSCode 里没有正确选择解释器。按Ctrl+Shift+P,输入Select Interpreter,把当前项目解释器切到da3。终端如果显示的是(base),先执行conda activate da3。
记住一个判断技巧:终端行首的环境名是(da3),但where python指向的如果不是 envs\da3 目录,说明 conda 激活和 PATH 顺序出了问题,而不是 torch 的问题。
5.4 RuntimeError: CUDA out of memory
这个报错出现在显存不够的时候。DA-3 的大模型在 8GB 显存的卡上,如果输入分辨率稍微大一点,直接 OOM 很正常。几个解决办法依次尝试:
- 调小输入尺寸,比如从 518 降到 384,或者用原图的半分辨率。
- 用小尺寸模型,把 encoder 从 large 换成 small,显存占用能降一个量级。
- 在推理时使用半精度,能把显存占用降低接近一半。如果官方推理脚本支持
--precision float16就直接指定,不支持的话在加载模型后调用model.half(),再把输入张量也转成half(),注意输出时要转回 float32 再做后续处理。
在 Windows 上还有一个显存问题容易被忽略:别的程序占用。浏览器开了一堆标签页,或者后台有别的深度学习进程在跑,显存就已经被占了很多。跑深度图前可以先看一眼nvidia-smi的显存占用情况,确认有足够空余。
5.5 UnicodeDecodeError 或 GBK 编码报错
Windows 默认的代码页是 GBK,但很多深度学习项目的脚本写死了 UTF-8。于是你运行脚本时读到一个含中文的配置文件,或者打印日志时遇到特殊字符,就报类似'gbk' codec can't decode byte 0x...的错误。
临时解决办法是在运行 Python 命令前设置环境变量:
set PYTHONUTF8=1如果想让整个系统少点编码问题,可以打开 Windows 11 的“设置 -> 时间和语言 -> 语言和区域 -> 管理语言设置 -> 更改系统区域设置”,勾选“Beta 版:使用 Unicode UTF-8 提供全球语言支持”,然后重启。这个操作是系统级的,对兼容性有一定影响,有些老软件界面会乱码,但 Python 生态基本受益。我个人更推荐只对当前项目设置 PYTHONUTF8,避免影响其他软件。
5.6 cv2.imread 读不了中文路径,读取结果是 None
OpenCV 的imread到现在都不支持中文路径,这是 C++ 底层的问题,不是你的代码错了。解决办法是用imdecode配合np.fromfile:
import cv2 import numpy as np def imread_unicode(path): data = np.fromfile(path, dtype=np.uint8) return cv2.imdecode(data, cv2.IMREAD_COLOR)写入中文路径也一样,用cv2.imencode加tofile:
def imwrite_unicode(path, img): ext = "." + path.rsplit(".", 1)[-1] ret, buf = cv2.imencode(ext, img) buf.tofile(path)如果你已经在前面把项目路径改成了纯英文,这个坑大概率能避开。但保不齐你测试用的图片放在桌面,桌面路径往往就含中文用户名,所以这个工具函数建议留一份。
5.7 运行时报错:module compiled against API version 0xf but this version of numpy is 0xe
这个报错是典型的 numpy 版本不匹配。PyTorch 或 OpenCV 是在旧版本 numpy 下编译的,而你环境中装了新版 numpy,二进制接口对不上。解决办法是降低 numpy 版本:
pip install "numpy<2.0"现在很多深度学习项目还在依赖 numpy 1.x 的接口,直接装 numpy 2.x 会触发各种奇奇怪怪的错误。你在创建环境时如果没锁版本,装完 requirements.txt 后建议顺手执行:
python -c "import numpy; print(numpy.__version__)"如果显示 2.x,并且后面运行报错,就降回 1.26.4 这个版本。这个版本兼容性很好,是深度学习项目的常见默认版。
5.8 缺少 Microsoft Visual C++ Redistributable,运行报 DLL 加载失败
Python 的很多包,包括 PyTorch、OpenCV,在 Windows 上都依赖系统级的 C++ 运行库。如果你在运行 torch 相关代码时遇到DLL load failed while importing torch或者提示找不到msvcp140.dll,基本就是系统里缺Microsoft Visual C++ Redistributable。去微软官网搜索“Visual C++ Redistributable”,下载vc_redist.x64.exe安装,然后重启电脑。这个运行库是很多软件共用的,装一次以后很多项目都受益。
要区分一下:Visual C++ Redistributable 和 Visual Studio Build Tools 是两回事。如果你只是跑代码,装 Redistributable 就够。只有你从源码编译 Python 扩展时才需要 Build Tools。在 Windows 上跑 DA-3 一般用不到编译步骤,所以别被一些帖子误导去装一整套十几 GB 的 Visual Studio。
5.9 权重文件下载不完整或找不到
DA-3 这类模型的权重文件少则几百 MB,多则几个 GB。下载过程中如果网络不稳定,很容易下到一半断掉,但你用浏览器下载时它不一定会报错,只是文件字节数不对。加载权重时就会报Missing key(s) in state_dict或者unexpected key之类的错误。
排查思路很直接:先看权重文件的大小和官方标注是否一致,再用 Python 加载看一下:
python -c "import torch; print(torch.load('checkpoints/xxxx.pth', map_location='cpu').keys())"如果你的权重是从镜像站重新下载的,对比一下文件哈希值基本就能定位问题。另外建议下载后第一时间把权重文件挪到项目内的 checkpoints 目录,避免之后脚本相对路径找不到。
5.10 VSCode 里运行脚本时终端自动退出了 conda 环境
这个问题非常隐蔽。你在 Anaconda Prompt 里激活 da3 环境,然后打开 VSCode,发现终端里不是(da3)而是(base),或者干脆没有环境名。这是因为 VSCode 的终端默认使用 PowerShell 或 CMD,它不继承外部终端的 conda 环境状态。
解决办法是在 VSCode 里打开终端后,手动执行:
conda activate da3如果你希望 VSCode 每次打开终端自动进入某个环境,可以把启动命令写进终端的 shell profile 里。对 PowerShell,编辑$PROFILE,加入:
conda activate da3但我不推荐把某个环境设为全局默认,因为不同项目可能需要不同环境。更稳妥的做法是在项目根目录创建.vscode/settings.json,写入:
{ "python.defaultInterpreterPath": "D:/Miniconda3/envs/da3/python.exe", "terminal.integrated.defaultProfile.windows": "PowerShell" }然后每次打开终端手动激活,或者在选择解释器时让 VSCode 自动加载环境。总之,多看一眼终端行首的环境名,能避免很多“明明装了却找不到包”的问题。
6. 性能优化与后续扩展:让深度图真正用起来
6.1 批量处理多张图片的脚本
如果你要处理一个文件夹里几百张图,一条条输命令肯定不现实。官方脚本如果支持输入文件夹路径,那直接指定文件夹就行。如果不支持,自己写个循环脚本,本质就是把 4.2 的代码包在一层循环里:
from pathlib import Path import cv2 import numpy as np from PIL import Image from transformers import pipeline pipe = pipeline("depth-estimation", model="LiheYoung/depth-anything-small-hf") input_dir = Path("input_images") output_dir = Path("output_images") output_dir.mkdir(exist_ok=True) for img_path in input_dir.glob("*.jpg"): image = Image.open(img_path).convert("RGB") result = pipe(image) depth_np = np.array(result["depth"], dtype=np.float32) / 255.0 colorized = cv2.applyColorMap((depth_np * 255).astype(np.uint8), cv2.COLORMAP_INFERNO) cv2.imwrite(str(output_dir / f"{img_path.stem}_depth.png"), colorized)用pathlib处理路径在 Windows 下会更安全,尽量避免手写字符串拼接。多张图一起跑的时候,建议加入小段 sleep 控制节奏,尤其是首次加载模型时,前几张图会很慢,后面就顺了。
6.2 半精度推理与显存优化
如果你的显卡显存只有 6GB 或 8GB,又想用大模型,半精度是目前最直接的优化手段。在 Transformers Pipeline 里,可以通过传torch_dtype=torch.float16来实现:
import torch from transformers import pipeline pipe = pipeline( "depth-estimation", model="LiheYoung/depth-anything-small-hf", torch_dtype=torch.float16, device=0, )注意两点:半精度推理的结果精度会略降,但对深度图这种视觉任务影响不大;另外半精度在 CPU 上可能反而变慢,所以只在 GPU 上用。输出时要把张量转回 float32 再做归一化和保存,否则有些图像处理库会出问题。
还有一个实用的技巧:如果你的模型支持--input-size参数,从 518 改成 384,显存占用会下降很多,深度图质量肉眼几乎看不出差别。有时候为了跑大批量数据,优先保证不 OOM 比追求那一点点精度更重要。
6.3 深度图再往后的玩法:点云与三维场景
跑出深度图后,你顺手就可以做很多有意思的事。把深度图和原始 RGB 图结合,利用相机内参 K 矩阵,可以把每个像素映射到三维空间,生成点云。配合 Open3D 这种库,几十行代码就能在 Windows 上可视化一个彩色三维场景。
大概思路是先根据深度图生成每个像素的三维坐标:
import open3d as o3d import cv2 import numpy as np depth = cv2.imread("output_depth.png", cv2.IMREAD_UNCHANGED).astype(np.float32) / 255.0 color = cv2.imread("input.jpg") h, w = depth.shape fx, fy, cx, cy = 500, 500, w / 2, h / 2 rows, cols = np.mgrid[0:h, 0:w] z = depth x = (cols - cx) * z / fx y = (rows - cy) * z / fy points = np.stack((x, y, z), axis=-1).reshape(-1, 3) colors = color.reshape(-1, 3) / 255.0 pcd = o3d.geometry.PointCloud() pcd.points = o3d.utility.Vector3dVector(points) pcd.colors = o3d.utility.Vector3dVector(colors) o3d.io.write_point_cloud("output.ply", pcd)注意这里的 fx、fy 是相机内参的焦距参数,必须和你的输入图像拍摄设备匹配才有意义。如果就是从网上下载的普通图片,没有内参信息,你可以先随便填一个值看看结构,但不要拿去当真。相对深度图没有尺度信息,点云会在某个方向上被拉伸或压缩,这是正常现象。
用深度图还能玩虚拟背景虚化、给视频加视差、做简单的前后景分割。一旦你跑通 DA-3 的流程,这些扩展都是差不多的套路:拿到深度图,再用 OpenCV 或 Open3D 做后续处理。Windows 11 下只要你的 Python 环境干净,这些库基本不会冲突。
我自己在 Windows 上折腾这类模型的习惯是:先跑通最简单的 demo,再逐步加需求,避免一次性把环境搞复杂。最后再分享一个小技巧,保存深度图时尽量先保留一份 16 位 PFM 或原始浮点数据,再转成给人类看的伪彩色 PNG。因为伪彩色图已经损失了大量深度信息,你后面如果想换配色、做分析或者生成点云,原始的浮点数据才是唯一无损的来源。这一步做对了,能让你少重跑很多次推理。