RuntimeError: An image must be set with .set_image(…) before mask prediction.

这个报错通常发生在 ComfyUI 新版中通过 Load Image 节点右键菜单直接调用 SAM Detector 时。优先排查 Load Image 里填入的图片路径是否丢了子目录,尤其是 Clipspace 图片只写了 png 文件名、没写 clipspace/ 前缀的情况。

快速结论:这个报错通常发生在 ComfyUI 新版中通过 Load Image 节点右键菜单直接调用 SAM Detector 时。优先排查 Load Image 里填入的图片路径是否丢了子目录,尤其是 Clipspace 图片只写了 png 文件名、没写 clipspace/ 前缀的情况。

适用环境:Issue 已在 Windows(D:\sd-ComfyUI 便携包)与 Linux(/data/bacek/src/ComfyUI,Python 3.12,venv 安装)两种环境复现;使用 ComfyUI Impact Pack、SAM 模型 sam_vit_b_01ec64.pth。Linux 复现环境另装有 Pillow(路径含 site-packages/PIL)和 aiohttp;其余版本号 Issue 未明确给出。

最快修复方案:更新 ComfyUI Impact Pack 与 ComfyUI 到 current Main(Issue 指出缺失子目录的 SAM 图片加载问题已在 Main 修复,修复合并于 PR #1255),然后重启 ComfyUI 并刷新浏览器。

注意事项:Issue 未给出可直接安装的具体版本号,更新时以仓库最新 Main 为准;恢复路径子目录只解决文件找不到的问题。若更新后仍报 RuntimeError: An image must be set with .set_image(...) before mask prediction.,需要提供更新后的版本号以及发送到 /sam/prepare 的文件名、类型、子目录信息,再进一步定位。

问题场景

在 ComfyUI 中加载 Load Image 节点,然后从右键菜单直接调用 Impact Pack 的 SAM Detector 进行分割检测。SAM 模型能正常加载,但准备输入图片时找不到目标文件,随后 SAM 预测阶段失败。评论补充了触发条件:把图片路径直接粘贴进 Load Image,而不是用 “Choose file to upload” 选择文件时出现;此时实际图片位于 input/clipspace/ 子目录,例如 /data/bacek/src/ComfyUI/input/clipspace/clipspace-painted-masked-22368503.png,但传给加载逻辑的路径缺少 clipspace/ 这一段。

报错原文

[Impact Pack] Loading SAM model 'D:\sd-ComfyUI\ComfyUI\models\sams\sam_vit_b_01ec64.pth'
[Impact Pack] SAM model loaded.
Exception in thread Thread-17 (async_prepare_sam):
Traceback (most recent call last):
  ...
FileNotFoundError: [Errno 2] No such file or directory: 'D:\\sd-ComfyUI\\ComfyUI\\input\\clipspace-mask-6007629.599999964.png'
...
Error handling request from 127.0.0.1
Traceback (most recent call last):
  ...
RuntimeError: An image must be set with .set_image(...) before mask prediction.

原因分析

可能原因:新版本 ComfyUI 中图片可能存放在带子目录的位置(如 input/clipspace/、temp 或 output 的嵌套路径),而 Impact Pack 早期版本调用 ComfyUI 的 LoadImage 时没有保留子目录和目录标注,只传了文件名。于是 async_prepare_sam 在 prediction 之前加载图片失败,SAM predictor 没有拿到有效图像,继续执行 mask 预测时就抛出 RuntimeError: An image must be set with .set_image(...) before mask prediction.

评论还给出了隔离验证结果:在 Main 934f9e4 上使用真实 ComfyUI LoadImage 加载 input/clipspace/ 下的图片,无论采用子目录/文件名分开传,还是 clipspace/filename.png [input] 形式,都能读到预期像素;temp 与嵌套 output 路径也通过;故意去掉 clipspace/ 则能复现 FileNotFoundError。

环境排查

  • 确认 ComfyUI Impact Pack 是否为 current Main,而非旧提交;该问题在 Main 中已由 PR #1255 修复。
  • 确认 ComfyUI 本体是否为较新版本,主线程中的 node_helpers.pillow、LoadImage.load_image 路径与新行为一致。
  • 确认 Load Image 中粘贴的图片路径是否包含完整子目录,Clipspace 图片应为 clipspace/文件名 或 clipspace/文件名 [input],而不是只有 png 文件名。
  • 确认 SAM 模型文件路径与日志一致,例如 models/sams/sam_vit_b_01ec64.pth。
  • 如仍失败,记录 Python 版本、Pillow 版本、操作系统及请求 /sam/prepare 时的文件名、类型、子目录信息。

解决步骤

  1. 将 ComfyUI Impact Pack 更新到 current Main;Issue 明确修复位于 Main,而不是某个指定版本号。
  2. 同时更新 ComfyUI 本体,避免旧版 LoadImage 行为与新版 Impact Pack 的路径传递不匹配。
  3. 重启 ComfyUI 服务。
  4. 刷新浏览器页面,重新加载工作流,避免前端仍使用旧的节点定义。
  5. 若暂时无法更新,可优先尝试在 Load Image 中改用 “Choose file to upload” 上传图片,或者把粘贴的路径补全为带子目录的写法,例如 clipspace/图片文件名.png。该规避方式来自评论中的复现条件,Issue 未将其作为正式修复验证。
  6. 再次在 Load Image 节点右键菜单调用 SAM Detector,确认不再出现 FileNotFoundError 与后续的 RuntimeError: An image must be set with .set_image(...) before mask prediction.。

验证方法

更新并重启后,用一张位于 input/clipspace/ 的图片再执行 SAM Detector:控制台不应再出现 FileNotFoundError ... clipspace...,“SAM model loaded” 之后的 prepare 阶段应正常完成,SAM 能输出 mask,而不是抛出 RuntimeError: An image must be set with .set_image(...) before mask prediction.。也可以同时用嵌套 output 或 temp 目录中的图片测试一次,确认子目录路径均能被正确保留。

参考来源

ltdrdata/ComfyUI-Impact-Pack #1003

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 31673

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注