ChromeDriver与自动化脚本:实现DDColor老照片批量修复
在数字影像修复领域,一个常见的矛盾日益凸显——模型能力越来越强,但操作流程却依然繁琐。比如,你手握基于扩散模型的高保真着色算法 DDColor,能将泛黄的老照片还原出鲜活色彩,可每次处理都得手动打开 ComfyUI 界面、加载工作流、上传图片、点击运行……面对成百上千张家庭相册或档案资料,这种重复劳动显然不可持续。
有没有办法让整个过程“自己跑起来”?答案是肯定的。通过ChromeDriver + Selenium实现对 Web 界面的自动化控制,我们可以把原本依赖人工干预的操作封装成脚本,真正实现“一键批量修复”。
从人工点击到自动执行:为什么选择浏览器自动化?
ComfyUI 是一款基于节点式工作流的图形化 AI 工具,它没有原生的批量 API 接口(至少在标准部署中),其核心交互方式是通过浏览器访问本地服务端口(如http://127.0.0.1:8188)。这意味着,如果你想批量处理任务,就必须模拟用户行为:上传文件、触发按钮、等待结果。
这正是Selenium + ChromeDriver的用武之地。
ChromeDriver 是 Google 官方为 Chrome 浏览器提供的驱动程序,配合 Selenium 框架,可以编程控制浏览器完成各种操作。虽然它最初用于前端测试,但在当前场景下,反而成了打通“AI 模型”和“工程效率”的关键桥梁。
我们不需要修改 ComfyUI 源码,也不需要搭建复杂的后端服务,只需写几行 Python 脚本,就能让它替我们“代劳”所有点击和上传动作。
DDColor 工作流的本质:不只是上色
DDColor 并非简单的滤镜式着色工具,而是一个基于条件扩散模型的智能推理系统。它的强大之处在于能够结合语义信息预测合理的颜色分布,尤其擅长还原人脸肤色、衣物材质和建筑纹理。
在 ComfyUI 中,这一过程被拆解为多个可视化节点:
Load Image:读取灰度图DDColor-ddcolorize:调用预训练模型进行着色推理Save Image:输出彩色图像
这些节点通过.json工作流文件组织起来,形成完整的执行链路。用户只需加载对应的工作流(例如DDColor人物黑白修复.json或DDColor建筑黑白修复.json),再传入图像即可生成结果。
但问题来了:如果每张图都要手动加载一次工作流,效率极低。更理想的方式是——固定工作流,动态更换输入图像,而这正是自动化脚本能轻松实现的部分。
自动化脚本设计:如何让浏览器“自己干活”
以下是一段经过实战验证的 Python 脚本,使用 Selenium 控制 Chrome 浏览器自动完成 DDColor 修复任务:
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.chrome.service import Service from selenium.webdriver.chrome.options import Options import time import os # 配置无头浏览器选项 chrome_options = Options() chrome_options.add_argument("--headless=new") chrome_options.add_argument("--no-sandbox") chrome_options.add_argument("--disable-dev-shm-usage") chrome_options.add_argument("--disable-gpu") # 设置 ChromeDriver 路径(请根据实际位置调整) driver_path = "/usr/local/bin/chromedriver" service = Service(executable_path=driver_path) # 启动浏览器实例 driver = webdriver.Chrome(service=service, options=chrome_options) try: # 访问本地 ComfyUI 服务 driver.get("http://127.0.0.1:8188") time.sleep(5) # 等待页面初始化 # 加载工作流文件(仅需一次) workflow_file = os.path.abspath("DDColor人物黑白修复.json") file_input = driver.find_element(By.CSS_SELECTOR, "input[type='file']") load_button = driver.find_element(By.XPATH, "//button[text()='Load']") file_input.send_keys(workflow_file) load_button.click() time.sleep(3) # 等待工作流加载完成 # 遍历图像目录,批量处理 image_folder = "./input_photos" output_dir = "./output_results" for filename in os.listdir(image_folder): if filename.lower().endswith((".jpg", ".jpeg", ".png")): image_path = os.path.abspath(os.path.join(image_folder, filename)) # 定位图像上传控件并上传新图片 img_upload = driver.find_element(By.XPATH, "//input[@name='image' and @type='file']") img_upload.send_keys(image_path) time.sleep(2) # 点击运行按钮 run_button = driver.find_element(By.ID, "run-button") run_button.click() print(f"正在处理: {filename}") time.sleep(30) # 根据 GPU 性能和图像尺寸调整等待时间 print("全部修复任务已完成!") finally: driver.quit()关键点解析
无头模式运行
使用--headless=new参数启动 Chrome,避免弹出窗口干扰,适合后台长时间运行。元素定位策略
- 文件上传控件通常隐藏在<input type="file">中,可通过 CSS 选择器精准定位。
- “Load” 和 “Run” 按钮建议使用文本匹配(如//button[text()='Load'])或稳定 ID,避免因 UI 更新导致脚本失效。等待机制设计
time.sleep()是最简单的方式,但在生产环境中建议替换为显式等待(WebDriverWait),提高鲁棒性。例如:
```python
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.ID, “run-button”)))
```
- 错误处理增强
实际项目中应加入异常捕获、重试逻辑和日志记录,防止某一张图失败导致整体中断。
系统架构与运行流程
整个自动化系统的组件协作如下:
[输入图像] ↓ [Python 脚本] → [ChromeDriver] → [Headless Chrome] ↓ [ComfyUI Web UI] ↓ [PyTorch + GPU 推理] ↓ [输出图像]各环节职责清晰:
- Python 脚本:主控制器,负责调度任务、管理文件路径、处理异常。
- ChromeDriver:通信中介,将高级指令翻译为浏览器可识别的操作。
- ComfyUI:承载 DDColor 模型的实际运行环境。
- GPU 推理引擎:执行神经网络计算,完成图像着色。
这种设计的优势在于非侵入性——无需改动原有平台结构,即可实现自动化扩展。
实践中的注意事项与优化建议
显存与分辨率权衡
DDColor 对显存有一定要求,尤其是处理高分辨率图像时。根据经验:
- 人物类图像:建议输入尺寸控制在460–680px,既能保留面部特征,又不会因过度放大引发伪影。
- 建筑类图像:推荐960–1280px,以充分展现纹理细节。
可在脚本中集成图像预处理步骤,自动缩放后再上传:
from PIL import Image def resize_image(img_path, target_size): with Image.open(img_path) as img: img.thumbnail((target_size, target_size), Image.LANCZOS) img.save(img_path, format=img.format)版本兼容性陷阱
ChromeDriver 必须与本地 Chrome 浏览器版本严格匹配,否则会报错session not created。查看版本命令:
google-chrome --version chromedriver --version若不一致,需前往 ChromeDriver 官方下载页 获取对应版本。也可通过自动化工具(如webdriver-manager)动态管理:
from webdriver_manager.chrome import ChromeDriverManager service = Service(ChromeDriverManager().install())提升稳定性的小技巧
- 关闭沙箱模式:在 Linux 服务器或 Docker 环境中,添加
--no-sandbox参数。 - 禁用共享内存限制:Docker 默认
/dev/shm太小,添加--disable-dev-shm-usage可避免崩溃。 - 设置超时重试:对网络延迟或模型卡顿的情况,加入最多 3 次重试机制。
应用场景拓展:不止于老照片修复
这套方法的价值不仅限于 DDColor,任何基于 Web 界面的 AI 工具都可以采用类似思路实现自动化:
| 工具类型 | 示例 | 是否适用 |
|---|---|---|
| 图像生成 | Fooocus、Stable Diffusion WebUI | ✅ |
| 视频处理 | RIFE Viewer、DAIN Web Demo | ✅ |
| 语音合成 | Coqui TTS Web GUI | ✅ |
| 文档分析 | Gradio 构建的 OCR 工具 | ✅ |
只要界面开放、操作可预测,就能用 Selenium 模拟完成批量任务。
对于机构级应用,如博物馆数字化、影视资料修复、家谱影像整理等,该方案能显著降低人力成本,提升处理一致性。
写在最后:自动化不是终点,而是起点
将 ChromeDriver 用于 AI 工具控制,看似“曲线救国”,实则是当前生态下的务实之选。许多优秀的开源模型仍以 Web UI 形式提供,缺乏标准化 API,而浏览器自动化恰好填补了这一空白。
未来,随着更多工具暴露 RESTful 接口或支持 CLI 调用,我们可以进一步升级架构——引入任务队列(如 Celery)、构建监控面板、对接对象存储,打造真正的全自动 AI 流水线。
但在此之前,掌握 Selenium 这类“轻量级自动化武器”,已经足以让我们在日常工作中赢得巨大效率优势。
技术的意义,从来不只是“能不能做到”,而是“能不能让更多人高效地做到”。而这套方案,正是通向那个目标的一小步。