使用curl实现 DDColor 黑白照片修复的自动化调用
在数字档案馆、媒体资料中心甚至家庭相册数字化的过程中,一个共同的挑战浮现出来:如何高效地将成百上千张泛黄褪色的老照片还原为生动的彩色影像?传统方式依赖人工上色或图形界面操作,不仅耗时费力,还难以规模化。而如今,随着 AI 模型与 API 化部署的成熟,我们完全可以摆脱鼠标点击,转而用几行命令行脚本完成批量修复。
这其中的关键一步,就是绕过 ComfyUI 的图形界面,直接通过curl调用其底层 REST API 来驱动 DDColor 模型——一种由阿里巴巴达摩院推出的高质量黑白图像智能上色技术。这种方法看似简单,实则打通了从本地文件到 GPU 推理再到结果回传的全链路自动化路径。
DDColor 的核心优势在于它并非“随便涂点颜色”,而是基于大规模真实历史图像训练出的颜色先验知识,结合语义理解能力,对人物肤色、衣物材质、建筑结构等关键区域进行符合现实逻辑的着色。例如,在处理一张上世纪 50 年代的家庭合影时,模型能自动识别出人脸并赋予自然红润的肤色,同时将天空染成渐变蓝,草地呈现青翠绿意,而不是随机生成刺眼的紫色皮肤或粉红屋顶。这种“懂历史、识场景”的能力,正是其优于早期上色工具(如 DeOldify)的地方。
更进一步,DDColor 在 ComfyUI 中被封装为可复用的工作流节点,这意味着它的执行逻辑可以被精确描述和外部控制。ComfyUI 本质上是一个基于有向无环图(DAG)的推理引擎,每个处理步骤——从加载图像、预处理、模型推断到保存输出——都是一个独立节点,彼此通过 JSON 配置连接。当你在界面上拖拽组件构建流程时,系统其实是在生成一份结构化的指令集。这份指令集不仅可以保存分享,还能通过 HTTP 接口远程触发。
这正是curl登场的时机。
假设你有一台搭载 NVIDIA 显卡的服务器,上面运行着 ComfyUI,并已加载好ddcolor_artistic.pth模型。现在,你想让本地笔记本上的脚本自动把./input/目录下的老照片一张张上传、着色、下载。整个过程无需打开浏览器,也不用手动点击“运行”。怎么做?
首先,上传图像:
curl -X POST http://192.168.1.100:8188/upload/image \ -F "image=@./input/photo_1947.jpg"这条命令会把本地图片发送到 ComfyUI 的临时存储区。注意这里使用了-F参数模拟表单提交,这是文件上传的标准做法。服务器收到后会将其缓存,并等待后续任务引用该文件名。
接着,触发修复任务。你需要构造一个 JSON 格式的推理请求,明确指定工作流中的各个节点行为。比如:
curl -X POST http://192.168.1.100:8188/prompt \ -H "Content-Type: application/json" \ -d '{ "prompt": { "3": { "inputs": { "image": "photo_1947.jpg" }, "class_type": "LoadImage" }, "9": { "inputs": { "model_name": "ddcolor_artistic.pth", "size": 640 }, "class_type": "DDColorize" }, "15": { "inputs": { "filename_prefix": "colored/" }, "class_type": "SaveImage" } } }'这个 JSON 描述了一个微型流水线:“LoadImage”节点读取刚上传的图片,“DDColorize”节点调用模型进行上色,参数size=640控制输入分辨率(影响速度与细节平衡),最后“SaveImage”节点将结果保存至colored/目录。一旦提交,ComfyUI 就会按拓扑顺序执行这些节点。
但问题来了:你怎么知道什么时候处理完了?别忘了,GPU 推理需要时间,不能立刻下载。因此,自动化脚本必须加入状态轮询机制。可以通过查询/history接口来确认任务是否完成:
# 查询最近完成的任务 curl -s http://192.168.1.100:8188/history | jq '. | keys[] as $k | .[$k]'配合jq工具解析响应,判断特定任务 ID 是否出现在历史记录中。一旦确认完成,即可通过固定路径(如http://192.168.1.100:8188/view?filename=colored/photo_1947.png&subfolder=&type=output)下载结果。
把这些环节串起来,就能写出完整的批处理脚本:
#!/bin/bash SERVER="http://192.168.1.100:8188" INPUT_DIR="./input" OUTPUT_DIR="./output" for img in "$INPUT_DIR"/*.jpg; do [[ -f "$img" ]] || continue filename=$(basename "$img") basename="${filename%.*}" echo "正在处理: $filename" # 1. 上传图像 if ! curl -s -X POST "$SERVER/upload/image" \ -F "image=@$img" > /dev/null; then echo "❌ 上传失败: $filename" continue fi # 2. 构造并提交推理请求(可根据类型动态选择模型) cat << EOF | curl -s -X POST "$SERVER/prompt" \ -H "Content-Type: application/json" \ -d @- { "prompt": { "3": { "inputs": { "image": "$filename" }, "class_type": "LoadImage" }, "9": { "inputs": { "model_name": "ddcolor_artistic.pth", "size": 640 }, "class_type": "DDColorize" }, "15": { "inputs": { "filename_prefix": "colored/$basename" }, "class_type": "SaveImage" } } } EOF # 3. 等待最多 30 秒,轮询任务状态 timeout=30 while ((timeout > 0)); do sleep 2 timeout=$((timeout - 2)) response=$(curl -s "$SERVER/history") if echo "$response" | grep -q "$basename"; then echo "✅ 处理完成: $filename" break fi done if ((timeout <= 0)); then echo "⏰ 超时: $filename" continue fi # 4. 下载结果(简化版,实际需解析 history 获取确切文件名) curl -s "$SERVER/view?filename=colored/${basename}.png&type=output" \ -o "$OUTPUT_DIR/${basename}_color.png" done这套流程带来的改变是质的飞跃。过去,修复 100 张照片意味着至少上百次的鼠标操作和漫长的等待;而现在,一条命令启动脚本,系统便会自行完成全部交互。更重要的是,这种模式天然适合集成进更大的系统——比如 NAS 上的定时任务、CI/CD 流水线中的媒体预处理阶段,或是数字资产管理平台中的“一键增强”功能按钮。
当然,实践中也有一些经验值得注意。例如,不要盲目将size设为最大值 1280,尤其在消费级显卡(如 RTX 3060)上容易导致显存溢出。对于人像类图像,460–680已足够保留面部细节且肤色过渡自然;建筑类则建议设为960以上以展现砖石纹理。此外,若多脚本并发运行,务必确保上传的图像名称唯一,避免冲突覆盖。
安全性方面,如果 ComfyUI 暴露在公网环境,应启用基本的身份验证机制(如 Nginx 反向代理加密码保护),防止未授权访问。理想情况下,这类服务应部署在内网可信区域,仅允许特定 IP 调用。
最终你会发现,这项技术的价值远不止于“省事”。它实际上推动了 AI 应用形态的一次进化:从“工具软件”走向“服务能力”。当一个复杂的深度学习模型可以通过curl这样最基础的命令行工具调用时,就意味着它真正具备了工程化落地的能力。无论是电视台的老片修复项目,还是个人用户的家庭影集整理,都可以借助这样的自动化方案,在不增加人力成本的前提下,实现前所未有的处理效率。
未来,这条路还可以走得更远。想象一下,结合 OCR 提取照片背面的手写文字作为元数据,利用 CLIP 模型自动分类人物/风景/建筑类型并选择最优参数,再通过版本控制系统保存原始与修复后的对比——一个完整的智能影像修复平台,就这样由一个个简单的 HTTP 请求搭建而成。
而这一起点,也许只是你敲下的一行curl命令。