GPEN自动化脚本编写:结合Shell实现定时修复任务实战
1. 为什么需要自动化脚本?
你有没有遇到过这样的情况:每天要处理几十张客户发来的老照片,每张都要手动上传、调参、点击增强、下载保存?重复操作不仅耗时,还容易出错。更麻烦的是,有些照片必须在固定时间前交付——比如每周一上午9点前要给摄影工作室提交修复好的样片。
GPEN本身功能强大,但WebUI交互模式天然不适合批量、定时、无人值守的任务。这时候,Shell脚本就是最轻量、最可靠、最易维护的解决方案。它不依赖额外框架,不增加系统负担,几行命令就能把“人手操作”变成“后台自动运行”。
本文不讲复杂原理,只聚焦一件事:如何用最简单的Shell脚本,让GPEN真正为你打工。你会学到:
- 怎么绕过WebUI,直接调用GPEN核心处理能力
- 如何让脚本自动监控文件夹、识别新图、触发修复
- 怎么设置定时任务,让修复工作在凌晨2点安静完成
- 遇到失败时怎么自动记录、跳过、重试,不卡死
所有操作都在Linux服务器上完成,无需改GPEN源码,不装新软件,5分钟就能跑起来。
2. 核心思路:绕过界面,直连处理引擎
GPEN WebUI本质是一个前端界面,背后真正干活的是Python服务进程。我们不需要打开浏览器,只要让脚本“假装”是WebUI发来的请求,就能触发图像处理。
关键发现:GPEN WebUI启动后,会在本地监听一个HTTP端口(默认http://127.0.0.1:7860),所有按钮点击最终都转化为API调用。通过分析网络请求,我们能还原出最简调用方式——用curl发送表单数据,直接提交图片和参数。
这就意味着:
不用模拟鼠标点击或网页解析
不依赖Selenium等重量级工具
脚本体积小、启动快、失败好排查
完全复用GPEN已有的模型和参数逻辑
下面这个命令,就是整个自动化的起点:
curl -X POST "http://127.0.0.1:7860/api/predict/" \ -F "data=[\"/path/to/input.jpg\", 80, \"strong\", 60, 70, false]" \ -F "fn_index=0"它等价于你在WebUI的「单图增强」页上传了input.jpg,设置了强度80、模式强力、降噪60、锐化70、关闭肤色保护——然后点了「开始增强」。
注意:fn_index=0对应Tab1(单图增强)的处理函数;fn_index=1才是批量处理。我们先从最稳定的单图模式入手。
3. 实战脚本:三步构建可运行的修复机器人
我们写一个名为auto_gpen.sh的脚本,放在GPEN项目根目录下(与run.sh同级)。它要做三件事:监控输入文件夹 → 发送处理请求 → 保存并归档结果。
3.1 脚本完整代码(含详细注释)
#!/bin/bash # ================================ # GPEN 自动化修复脚本 | by 科哥 # 功能:监控 input/ 目录,自动处理新图片 # 输出:results/ 目录下按日期归档,保留原始名 # ================================ # 配置区 —— 只需修改这里 INPUT_DIR="input" # 待处理图片存放目录(相对路径) OUTPUT_BASE="results" # 结果根目录 GPEN_URL="http://127.0.0.1:7860" # GPEN服务地址 DEFAULT_STRENGTH=80 # 默认增强强度(0-100) DEFAULT_MODE="strong" # 默认模式:natural / strong / detail DEFAULT_DENOISE=60 # 默认降噪强度 DEFAULT_SHARPEN=70 # 默认锐化程度 LOG_FILE="gpen_auto.log" # 运行日志 # 创建必要目录 mkdir -p "$INPUT_DIR" "$OUTPUT_BASE" "$LOG_FILE" # 日志函数 log() { echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" | tee -a "$LOG_FILE" } # 检查GPEN服务是否就绪(最多等60秒) wait_for_gpen() { log "等待GPEN服务启动..." for i in $(seq 1 60); do if curl -s --head --fail "$GPEN_URL" >/dev/null; then log "✓ GPEN服务已就绪" return 0 fi sleep 1 done log "✗ GPEN服务未响应,退出" exit 1 } # 处理单张图片 process_image() { local img_path="$1" local filename=$(basename "$img_path") local name_only="${filename%.*}" local ext="${filename##*.}" # 构建输出路径:results/YYYYMMDD/input_filename.png local today=$(date +%Y%m%d) local output_dir="$OUTPUT_BASE/$today" mkdir -p "$output_dir" log "→ 开始处理:$filename" # 发送API请求(关键:用curl -F 上传文件 + 参数) response=$(curl -s -X POST "$GPEN_URL/api/predict/" \ -F "data=[\"$img_path\", $DEFAULT_STRENGTH, \"$DEFAULT_MODE\", $DEFAULT_DENOISE, $DEFAULT_SHARPEN, false]" \ -F "fn_index=0" \ -F "session_hash=$(date +%s)" 2>/dev/null) # 解析返回的JSON,提取输出图片路径 # GPEN返回格式示例:{"data":["/root/gpen/outputs/outputs_20260104233156.png"],"duration":18.23} output_img=$(echo "$response" | grep -o '"outputs_[^"]*\.png"' | tr -d '"') if [ -n "$output_img" ] && [ -f "$output_img" ]; then # 重命名并移动到结果目录 local final_output="$output_dir/${name_only}_enhanced.png" cp "$output_img" "$final_output" log "✓ 处理完成:$final_output" # 清理GPEN临时输出(避免堆积) rm -f "$output_img" # 归档原图到 processed/ 目录 mkdir -p "processed" mv "$img_path" "processed/" else log "✗ 处理失败:$filename,响应:$(echo "$response" | head -c 100)" # 失败图片移入 failed/ 目录,便于人工检查 mkdir -p "failed" mv "$img_path" "failed/" fi } # 主循环:持续监控 main_loop() { log "=== GPEN自动化修复启动 ===" wait_for_gpen while true; do # 查找所有支持的图片(忽略隐藏文件和已处理的) for img in "$INPUT_DIR"/*.jpg "$INPUT_DIR"/*.jpeg "$INPUT_DIR"/*.png "$INPUT_DIR"/*.webp; do if [ -f "$img" ]; then process_image "$img" fi done # 每30秒检查一次新文件 sleep 30 done } # 启动主循环 main_loop3.2 脚本使用四步法
准备环境
确保GPEN已正常运行(执行/bin/bash /root/run.sh),且能通过http://127.0.0.1:7860访问。创建输入目录并放图
mkdir -p /root/gpen/input # 把要修复的照片复制进去,例如: cp ~/Downloads/photo1.jpg /root/gpen/input/赋予脚本执行权限并运行
chmod +x /root/gpen/auto_gpen.sh nohup /root/gpen/auto_gpen.sh > /dev/null 2>&1 &nohup确保终端关闭后脚本继续运行,&后台执行。查看效果
几十秒后,检查results/目录下是否生成了带日期的子文件夹,里面是_enhanced.png文件。同时原图已从input/移走,进入processed/。
小技巧:脚本会自动创建
gpen_auto.log日志,遇到问题第一时间看它,比翻浏览器控制台快10倍。
4. 进阶实战:定时任务 + 失败重试 + 多参数策略
上面的脚本解决了“有无”的问题,现在升级为“好用”的生产级方案。
4.1 用crontab实现精准定时
想让修复任务每天凌晨2点自动运行?不用改脚本,用系统定时器:
# 编辑当前用户定时任务 crontab -e添加这一行(每天2:00执行一次,处理当天input/里所有图):
0 2 * * * cd /root/gpen && /bin/bash auto_gpen.sh --once >> /root/gpen/cron.log 2>&1注意:我们给脚本加了个--once参数,让它只扫描处理一次就退出(避免常驻)。只需在脚本开头加几行判断:
# 在 main_loop() 函数上方添加 if [[ "$1" == "--once" ]]; then # 只处理一次,不循环 for img in "$INPUT_DIR"/*.jpg "$INPUT_DIR"/*.jpeg "$INPUT_DIR"/*.png "$INPUT_DIR"/*.webp; do [ -f "$img" ] && process_image "$img" done exit 0 fi4.2 智能参数策略:按文件名自动适配
不是所有照片都该用同一套参数。老照片要强力修复,高清人像只需自然优化。我们在文件名里加标签,脚本自动识别:
| 文件名示例 | 自动应用参数 |
|---|---|
old_photo_1985.jpg | 强度100,模式strong,降噪80 |
portrait_highres.png | 强度60,模式natural,锐化50 |
wedding_group.webp | 强度75,模式detail,肤色保护true |
修改process_image()函数中的参数读取部分:
# 替换原来的 DEFAULT_* 变量赋值 if [[ "$filename" == *"old_"* ]]; then strength=100; mode="strong"; denoise=80; sharpen=60; protect_skin=false elif [[ "$filename" == *"portrait_"* ]]; then strength=60; mode="natural"; denoise=20; sharpen=50; protect_skin=true elif [[ "$filename" == *"wedding_"* ]]; then strength=75; mode="detail"; denoise=40; sharpen=70; protect_skin=true else strength=$DEFAULT_STRENGTH; mode=$DEFAULT_MODE; denoise=$DEFAULT_DENOISE; sharpen=$DEFAULT_SHARPEN; protect_skin=false fi # 后续 curl 命令中,把 false 改为 $protect_skin这样,你只需重命名文件,脚本就懂你的意图。
4.3 失败重试机制:三次机会,不轻易放弃
网络抖动或GPU显存不足可能导致单次失败。加入简单重试逻辑(在process_image函数内):
for attempt in {1..3}; do response=$(curl -s -X POST ... ) output_img=$(echo "$response" | grep -o '"outputs_[^"]*\.png"' | tr -d '"') if [ -n "$output_img" ] && [ -f "$output_img" ]; then # 成功,跳出循环 break fi if [ $attempt -lt 3 ]; then log " 第 $attempt 次尝试失败,2秒后重试..." sleep 2 fi done5. 效果验证与避坑指南
别急着部署,先做三件事验证脚本可靠性:
5.1 快速验证清单
| 检查项 | 方法 | 预期结果 |
|---|---|---|
| GPEN服务可达 | curl -I http://127.0.0.1:7860 | 返回HTTP/1.1 200 OK |
| API基础调用 | 手动执行一次curl命令(见2.2节) | 返回JSON含"outputs_*.png"路径 |
| 脚本语法正确 | bash -n auto_gpen.sh | 无报错 |
| 权限正常 | ./auto_gpen.sh --once | 日志显示处理过程,results/生成文件 |
5.2 生产环境必改的三个配置
绝对路径替换相对路径
脚本中所有input/、results/改为/root/gpen/input、/root/gpen/results,避免因执行目录不同导致路径错误。日志轮转防爆盘
在crontab中加一行,每天零点压缩旧日志:0 0 * * * cd /root/gpen && gzip -9 "gpen_auto.log.$(date -d 'yesterday' +\%Y\%m\%d).log" 2>/dev/null || true内存监控保稳定
GPEN吃内存,加个守护检查(放入脚本末尾):# 每5分钟检查内存,超90%则重启GPEN (while true; do mem=$(free | awk 'NR==2{printf "%.0f", $3*100/$2 }') if [ "$mem" -gt 90 ]; then log " 内存使用率 $mem%,重启GPEN..." pkill -f "python.*gradio" /bin/bash /root/run.sh >/dev/null 2>&1 & fi sleep 300 done) &
6. 总结:从手动点击到全自动流水线
回看整个过程,我们没碰GPEN一行源码,没装任何新库,只靠Linux自带的curl、bash、cron,就完成了:
- 零交互处理:图片扔进文件夹,结果自动生成
- 精准定时调度:按天/周/月自动执行,不占白天资源
- 智能参数适配:通过文件名标签,自动匹配最优参数组合
- 健壮错误处理:失败自动重试、归档、记录,不中断流程
- 生产就绪保障:内存监控、日志轮转、路径固化
这才是AI工具落地的真实模样——技术服务于人,而不是让人适应技术。当你把重复劳动交给脚本,才能把精力留给真正需要创造力的地方:比如研究怎么让修复后的照片更有艺术感,或者设计新的应用场景。
下一步,你可以尝试:
▸ 把脚本封装成systemd服务,开机自启
▸ 接入微信通知,处理完成自动发消息提醒
▸ 用Python重写核心逻辑,支持更复杂的条件判断
但请记住:最强大的自动化,永远是那个今天就能跑起来的版本。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。