ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Grounding DINO安装避坑指南:从环境配置到报错解决

Grounding DINO安装避坑指南:从环境配置到报错解决 刚开始接触Grounding DINO的人多少都有点被它的效果惊艳到输入一句“a dog on the grass”它能把图里所有符合描述的物体框出来更关键的是不需要预先定义类别。但惊艳归惊艳轮到自己在本地环境里把它跑起来的时候各种安装报错直接能把人整崩溃。最近我恰好在一台新的工作机上从零配这个环境前前后后踩了三类典型的坑依赖包装不上、编译报错、权重文件加载异常。这篇就把整个排查过程、以及最终怎么绕过去的方法完整记录下来。无论你是第一次装Grounding DINO还是装到一半被某个报错卡死照着下面的思路走大概率能省下半天时间。1. 先说清楚Grounding DINO到底要什么样的环境1.1 这不是一个“独立包”依赖链比想象中长Grounding DINO本身是魔搭社区和IDEA开源出来的开放世界目标检测模型核心是基于Transformer的架构在COCO和RefCOCO等数据集上做了预训练。它的代码仓库其实是一个完整的PyTorch项目而不是一个简简单单的pip install grounding-dino就能搞定的包。这意味着你不仅要装模型本身的依赖还要装它依赖的底层库其中最关键的就是segment-anything。很多人在安装时报错根源就是没有意识到这个依赖链的长度。我最初以为只要把仓库clone下来然后pip install -r requirements.txt就完事了结果第一步就卡在segment-anything没有正确安装导致后面很多模块导入的时候直接报ModuleNotFoundError。这里建议你在开始之前先明确一点Grounding DINO需要的是一个带有特定版本PyTorch、特定版本CUDA的Python环境而不是一个全局的Python环境否则各种版本冲突能让你怀疑人生。1.2 Python版本与CUDA的匹配是第一个坑根据Grounding DINO仓库的说明它推荐Python 3.8到3.10PyTorch版本建议在1.13以上当然你也可以用更新版本的PyTorch但必须要保证CUDA版本和PyTorch编译时用的CUDA版本兼容。这句话看起来很简单实际操作时很多报错都出在这里。比如你系统里装的是CUDA 12.1但PyTorch是cuda11.8编译的那么在加载模型时可能不会直接报“CUDA版本不对”而会出现一些莫名其妙的内存错误或者算子不存在错误。我建议安装前先跑一下这几条命令确认当前环境的状态python --version nvidia-smi python -c import torch; print(torch.__version__, torch.version.cuda)第一条看Python版本第二条看系统驱动支持的CUDA版本第三条看PyTorch实际使用的CUDA版本。这里有个小经验nvidia-smi显示的CUDA版本是驱动支持的最高版本不代表你的PyTorch只能用这个版本但PyTorch的CUDA版本不能高于驱动支持的版本否则会报错。所以通常我们选择PyTorch的CUDA版本时要比驱动支持的版本低一个主版本或者一样这样比较稳。1.3 conda环境创建的完整命令为了避免把系统Python环境搞乱我强烈建议用conda创建独立环境。下面是经过验证的完整创建流程conda create -n grounding-dino python3.8 conda activate grounding-dino然后安装PyTorch这里以CUDA 11.8为例pip install torch2.1.2 torchvision0.16.2 torchaudio2.1.2 --index-url https://download.pytorch.org/whl/cu118如果你的显卡比较新比如30系、40系CUDA 11.8通常没问题如果是老显卡建议降低到CUDA 11.3或11.6对应PyTorch版本也降下来。不要盲目追新稳定才是第一位的。2. 典型报错现场一pip安装时的“No matching distribution found”2.1 报错截图还原与原因拆解安装Grounding DINO依赖时最容易遇到的第一类报错是这样子的ERROR: Could not find a version that satisfies the requirement segment-anything1.0 (from versions: none) ERROR: No matching distribution found for segment-anything1.0看到“No matching distribution found”很多人第一反应是包名写错了但其实segment-anything这个包名的确存在它发布在PyPI上。真正的问题是这个包对Python版本和操作系统环境比较敏感如果你用的Python版本过高比如3.11或者3.12就会找不到对应版本的wheel包于是pip直接告诉你“无匹配版本”。另一个常见原因是网络环境对PyPI的访问不通畅pip在超时后就认为这个包不存在。解决思路有两个方向一是降低Python版本到3.8或3.10二是换一个国内pip镜像源。这里以清华源为例直接在pip命令后面加上镜像配置pip install segment-anything -i https://pypi.tuna.tsinghua.edu.cn/simple如果你不想每次打那么长一串可以全局配置pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple注意清华源在一些极少数情况下同步会滞后如果你发现某个包在官方源有但清华源没有可以临时用官方源安装或者用阿里源试试。这类问题没有固定解随机应变即可。2.2 换源与版本锁定的正确姿势除了segment-anythingGrounding DINO的requirements.txt里还有很多包比如transformers、einops、opencv-python等等。你如果一次性让pip解析全部依赖很容易出现版本冲突。我建议不要直接pip install -r requirements.txt而是分步安装先把关键依赖装好再装剩下的。我的实际顺序是pip install torch torchvision pip install opencv-python pip install matplotlib pip install scipy pip install einops pip install timm pip install transformers pip install segment-anything分步安装的好处是如果某一步失败了你能立刻定位到具体是哪个包的问题而不是看着一长串依赖解析日志发呆。同时Grounding DINO对transformers的版本是有要求的建议用4.3.1左右太新的版本可能会导致后面加载模型时报key mismatch这个后面会详细说。2.3 一个容易被忽视的“乱码not found”情况我还在网上看到有人安装时报了一个非常奇怪的错屏幕上出现类似“有个乱码not found”的信息实际上这种情况大多是shell编码问题或者某个依赖包在安装时输出了一些非UTF-8的日志导致控制台显示乱码。解决方法很简单把终端编码切到UTF-8Linux或macOS下运行export LANGen_US.UTF-8Windows下运行chcp 65001。如果乱码出现在包的日志里那一般是某个系统依赖缺失例如libgl1常见于OpenCV安装后的导入阶段而不是安装阶段。3. 典型报错现场二编译时报错gcc、ninja、aiohttp等3.1 “Failed to build xxx”到底在失败什么当你把前面几个依赖都装好下一步是安装Grounding DINO核心代码。克隆仓库后需要执行pip install -e .这个命令会把当前目录下的包以可编辑模式安装。很多人在这一步遇到编译错误因为Grounding DINO中有一些C扩展比如qdim之类的算子需要编译器来编译。如果你的系统没有安装gcc、g或make就会直接报错Failed to build groundingdino ERROR: Could not build wheels for groundingdino, which is required to install pyproject.toml-based projects出现这个报错说明你缺的是编译工具链而不是代码本身的问题。这类问题在Windows上尤其常见因为Windows默认没有gcc。而在Linux上只要装过build-essential基本就不会有这个问题。3.2 安装系统依赖的实操命令Linux下安装编译工具链sudo apt update sudo apt install build-essential cmake ninja-buildmacOS下xcode-select --install brew install cmake ninjaWindows下最省事的办法是安装Visual Studio Build Tools并且在安装时勾选“C桌面开发”组件。装完之后重新打开终端再跑pip install -e .大概率就能顺利通过。如果你担心是ninja的问题也可以禁用ninja用默认的make但速度会慢一些。方式是在setup.py里强制指定不使用ninja或者安装时临时环境变量。不过一般情况下我建议保留ninja因为编译更快而且不容易卡住。3.3 一个容易被忽略的权限问题dism 740这类报错的本质这里插一个题外话但也是很常见的现象很多安装报错表面上看起来和Grounding DINO无关比如“dism 安装输入法报错740”或者“vbajet32.dll 拒绝访问 (0x5)”甚至“gx works3 安装报错 vbajet32.dll 拒绝访问”。这些报错虽然不同的软件都会出现但本质上只有一个原因权限不足。Windows下安装程序时经常需要管理员权限然而某些IDE或终端并没有以管理员身份运行导致写入系统目录或者注册表时被拒绝。回到Grounding DINO的安装如果你是在Windows下并且遇到了“Permission denied”或者“拒绝访问”的报错可以先确认终端是不是以管理员身份打开的。有时候不是管理员终端但安装包写入site-packages时因为目录权限而失败这时候你只需要以管理员身份重新打开终端即可不需要去改什么奇怪的环境变量。又或者你的系统上装了某些安全软件拦截了对特定目录的写入这种情况就需要在安全软件里添加信任。说到底安装过程中的很多报错并不神秘先把权限问题排除掉能少踩一半的坑。检查权限的方式很简单在终端里输入以下命令python -c import os; print(os.geteuid() if hasattr(os, geteuid) else admin)Windows没有geteuid所以会打印“admin”这是正常现象但你得确认当前终端是否真以管理员身份打开。4. 典型报错现场三模型权重下载与加载问题4.1 Hugging Face下载卡住、超时依赖装好编译通过接下来就是下载模型权重。Grounding DINO的权重通常来自Hugging Face比如ShilongLiu/GroundingDINO。如果你直接运行仓库里提供的demo脚本它可能会自动从Hugging Face下载权重但这个过程经常会卡在下载阶段因为网络连接不稳定。这种问题不能靠反复重试硬扛更好的做法是手动下载权重文件然后在代码里指定本地路径。具体来说在groundingdino/config/目录下有很多配置文件你需要在配置里找到权重文件的路径或者直接在运行命令时用--config和--weights参数指定。以我常用的命令为例python demo/inference_on_a_image.py \ --config_file groundingdino/config/GroundingDINO_SwinT_OGC.py \ --weights /path/to/groundingdino_swint_ogc.pth \ --image_path /path/to/image.jpg \ --text_prompt a cat这里--weights后面就是手动下载好的权重路径。如果你还没有权重文件先想办法把它下载到本地然后记住这个路径。注意路径中不要有中文也不要有多余空格有些人在这一步莫名其妙报错就是因为路径里有中文导致的解码问题。4.2 手动下载权重并把路径写对手动下载权重时如果你能直接通过网页下载就最省事如果下载速度慢可以考虑使用镜像站或者等网络状况好的时候再下。下载完成后要确认文件的后缀名是.pth并且文件大小符合预期比如swint版本的权重大约在700MB左右如果只有几百KB那肯定是下载到错误页面了这种情况需要删掉重下。一个很实用的检查方法是用Python加载一下权重文件import torch ckpt torch.load(groundingdino_swint_ogc.pth, map_locationcpu) print(type(ckpt))如果报错提示文件不存在或者格式不对那说明路径有问题或者下载不完整。如果打印出来是一个字典就说明文件是正常的。4.3 加载权重时“key mismatch”的解决权重下载好了加载时却可能报“key mismatch”甚至“Missing key(s)”的警告。这个问题多半是transformers版本不兼容导致的。Grounding DINO依赖的BertModel来自transformers如果版本太新预训练模型的modeling_bert.py结构发生了变化导致模型加载时一些key对不上。解决方法有几种把transformers降到4.3.1这是Grounding DINO仓库里说明的版本。如果不想降级可以在加载权重时加上strictFalse参数让PyTorch忽略缺失的key。但我不建议直接strictFalse因为那会让部分权重没有加载影响模型效果。还是降级transformers最稳妥。执行pip install transformers4.3.1装完之后最好重启一下终端确保新的版本生效然后再跑demo。5. 实操全过程从零装一个能跑demo的Grounding DINO5.1 分步安装加验证命令这里放一份我验证过的完整安装流程只要你按顺序执行基本可以避免大部分报错。首先克隆仓库git clone https://github.com/IDEA-Research/GroundingDINO.git cd GroundingDINO然后创建conda环境并激活conda create -n groundingdino python3.8 conda activate groundingdino安装PyTorch这里以CUDA 11.8为例pip install torch2.1.2 torchvision0.16.2 --index-url https://download.pytorch.org/whl/cu118安装依赖建议分成几个阶段pip install opencv-python matplotlib scipy einops timm pip install transformers4.3.1 pip install segment-anything1.0安装Grounding DINO本体pip install -e .编译完成后可以运行一个小测试来验证python -c from groundingdino.models import build_model; print(import ok)如果没有任何输出错误说明模块导入成功。5.2 跑通自带的demo接下来跑demo。首先要准备一张测试图片比如一张猫的图片然后运行python demo/inference_on_a_image.py \ --config_file groundingdino/config/GroundingDINO_SwinT_OGC.py \ --weights /path/to/groundingdino_swint_ogc.pth \ --image_path /path/to/cat.jpg \ --text_prompt a cat这里的--text_prompt就是你要检测的文本描述。如果能跑出一张画着框的图片并且命令行打印出检测框坐标那就说明安装成功了。如果报错大概率是权重路径问题或者transformers版本问题回头检查第4节里的几个点。5.3 安装后需要留意的环境变量安装成功不代表万事大吉。当你重启电脑或切换终端后可能会发现程序又跑不起来了这时先检查环境变量。Grounding DINO在读取配置时有时候会用到PYTHONPATH如果你是用conda环境需要确保当前环境被激活。另外如果你改了segment-anything的安装路径也可能导致Python导入失败。建议把仓库根目录加入PYTHONPATH作为备用方案export PYTHONPATH/path/to/GroundingDINO:$PYTHONPATH这个命令只在当前终端有效如果你不想每次手动配置可以把它写入conda环境的激活脚本里这里就不展开了网上有现成教程。6. 常见问题速查表与其他“奇葩报错”6.1 整理一个速查表以下是我在实际安装过程中遇到的典型报错、原因以及解决方案整体整理成了一个表。你在遇到问题时可以直接对照查询不用翻太多文档。报错信息可能原因解决方法No matching distribution found for segment-anythingPython版本过高、pip源不通换Python 3.8/3.10换pip镜像源Failed to build groundingdino缺少gcc、ninja编译工具链安装build-essential、ninja-buildPermission denied/拒绝访问 (0x5)权限不足或安全软件拦截用管理员身份打开终端添加信任目录ModuleNotFoundError: No module named groundingdino没有执行pip install -e .在仓库目录执行该命令Key mismatch when loading weightstransformers版本不兼容安装transformers4.3.1RuntimeError: CUDA out of memory显存不足或batch size太大减小图片尺寸使用CPU模式测试Hugging Face下载超时网络连接不稳定手动下载权重本地路径加载乱码not found终端编码问题或系统库缺失设置UTF-8编码安装libgl1CUDA内存溢出的问题其实很常见尤其当你用高分辨率图片测试时。解决方法是把图片resize到短边不超过800像素或者使用--cpu参数如果代码支持强行用CPU推理虽然后者速度会慢但至少能验证安装是否成功。6.2 这类报错的共性规律与排查思路安装Grounding DINO时遇到的报错百分之八十都可以归结为三个原因依赖版本不匹配、编译工具缺失、权限不足。很多人会陷入一个误区就是看到报错信息后直接去搜报错内容然后照着别人的方案一通操作结果是按了葫芦起了瓢最后环境彻底改乱了。我自己的排查经验是先分阶段判断如果报错发生在pip install阶段优先检查Python版本、pip源、依赖版本如果报错发生在pip install -e .阶段优先检查编译工具和CUDA版本如果报错发生在运行阶段优先检查权重路径、transformers版本、显存大小。按这种思路排查比大海捞针要高效得多。另外还有一个细节值得注意在Windows上如果终端用的是PowerShell某些命令语法和Linux Bash不一样比如$env:PYTHONPATH的写法。为了防止这类问题我建议Windows用户在安装时直接使用Anaconda Prompt这样很多命令能保持一致至少不再因为shell语法问题而白白增加排查成本。6.3 最后再分享一个小技巧安装完Grounding DINO之后如果你想后续和Segment Anything结合做“检测加分割”建议不要自己手动再装一遍SAM而是直接使用Grounding DINO仓库里提供的segment-anything集成接口。因为那个接口对bbox和mask的组织方式做了适配直接调用比你自己单独装SAM再写后处理要省事得多。另外首次加载模型时会有一段权重初始化时间这是正常现象不要因为等待太久就以为卡死了。我在实际使用中一般会把模型初始化放到程序启动阶段而不是每张图都初始化一次不然重复加载权重会非常影响开发效率。装这个模型确实容易让人烦躁但只要把Python版本、PyTorch版本、transformers版本和编译工具这几大件对齐剩下的就是按部就班跑脚本的问题。希望上面这些踩坑记录能帮你少走弯路。
返回列表