你大概用过那些在线AI修图网站——上传图片等几秒背景没了。或者老照片变清晰了。好用是好用但有两个问题一是免费版有水印或限制次数二是你的图片要上传到别人的服务器。如果是证件照、商业图、客户资料你不确定它们拿你的图干了什么。今天我们来说怎么把AI修图工具部署到自己的VPS上。三个功能去背景、超分辨率放大、老照片修复。CPU就能跑不需要显卡。最后套一个网页前端打开浏览器拖图进去就能用。三个工具各干一件事首先我们先认识一下要部署的三个东西rembg—— 去背景。上传一张图它把主体抠出来背景变透明。效果接近remove.bg但完全本地运行。人像、商品、动物都能抠发丝级别的细节也能处理。Real-ESRGAN—— 超分辨率放大。把模糊的低清图放大2倍或4倍同时补细节。你有一张500px宽的旧图放大到2000px还是清晰的。对做电商的人特别有用——平台要求主图800px以上但你只有手机随便拍的小图。GFPGAN—— 人脸修复。专门修老照片里糊掉的人脸。爷爷辈的黑白照片脸全花了GFPGAN能把五官恢复出来。效果有时候挺震撼的。三个都是开源项目都有Docker支持。下面一个一个来部署。准备工作VPS要求看到这里的应该都知道怎么选的吧2核CPU / 2G内存起步。这些模型跑在CPU上处理一张图大概5-15秒取决于图片大小和CPU性能。不快但能接受——你自己用又不用排队。装好Docker之前已经装过的话跳过curl-fsSLhttps://get.docker.com|bash建个目录放项目文件mkdir-p/home/ai-image-toolkitcd/home/ai-image-toolkit第一个工具rembg去背景rembg自带HTTP服务器模式Docker部署最简单。创建docker-compose.ymlservices:rembg:image:danielgatis/rembgcommand:sports:-5000:5000restart:alwayscommand: s就是让rembg以服务器模式启动监听5000端口。启动dockercompose up-d等它拉镜像大概几百MB第一次慢一点跑起来后测试一下# 下载一张测试图curl-otest.jpg https://upload.wikimedia.org/wikipedia/commons/thumb/3/3a/Cat03.jpg/240px-Cat03.jpg# 调rembg去背景curl-XPOST-Ffiletest.jpghttp://localhost:5000-otest_no_bg.png打开test_no_bg.png如果猫还在、背景变透明了就成功了。rembg的API很简单POST一个图片文件到http://localhost:5000它返回一张去背景的PNG。第二个工具Real-ESRGAN放大Real-ESRGAN没有像rembg那样开箱即用的HTTP服务需要自己包一层。写个小Flask应用。创建realesrgan-api目录和文件mkdir-prealesrgan-apicdrealesrgan-apiDockerfileFROM python:3.11-slim RUN apt-get update apt-get install -y git ffmpeg libgl1 libglib2.0-0 rm -rf /var/lib/apt/lists/* RUN pip install flask realesrgan basicsr opencv-python numpy torch torchvision --index-url https://download.pytorch.org/whl/cpu WORKDIR /app COPY app.py . EXPOSE 5001 CMD [python, app.py]注意--index-url https://download.pytorch.org/whl/cpu—— 装CPU版的PyTorch不装CUDA省空间。app.pyfromflaskimportFlask,request,send_fileimportioimportosfromrealesrganimportRealESRGANerfrombasicsr.archs.rrdbnet_archimportRRDBNet appFlask(__name__)# 初始化模型懒加载第一次请求时加载upsamplerNonedefget_upsampler():globalupsamplerifupsamplerisNone:modelRRDBNet(num_in_ch3,num_out_ch3,num_feat64,num_block23,num_grow_ch32,scale4)upsamplerRealESRGANer(scale4,model_pathNone,# 自动下载modelmodel,tile0,tile_pad10,pre_pad0,halfFalse,cpu_modeTrue)returnupsamplerapp.route(/,methods[POST])defupscale():iffilenotinrequest.files:returnNo file,400filerequest.files[file]scalerequest.form.get(scale,2)importcv2importnumpyasnp# 读取图片img_bytesfile.read()imgcv2.imdecode(np.frombuffer(img_bytes,np.uint8),cv2.IMREAD_COLOR)# 放大upsamplerget_upsampler()output,_upsampler.enhance(img,outscaleint(scale))# 返回_,bufcv2.imencode(.png,output)returnsend_file(io.BytesIO(buf.tobytes()),mimetypeimage/png)if__name____main__:app.run(host0.0.0.0,port5001)回到项目根目录在docker-compose.yml里加上realesrganservices:rembg:image:danielgatis/rembgcommand:sports:-5000:5000restart:alwaysrealesrgan:build:./realesrgan-apiports:-5001:5001restart:always启动dockercompose up-d--buildReal-ESRGAN的镜像比较大PyTorch 模型文件第一次build可能要10分钟左右。跑起来后测试curl-XPOST-Ffiletest.jpg-Fscale2http://localhost:5001-otest_upscaled.png对比原图和放大后的图应该能看到明显变清晰。做个网页前端后端API有了但每次用curl传图太反人类。写个简单的HTML页面拖图进去点按钮就行。在项目目录创建web/index.html!DOCTYPEhtmlhtmllangzh-CNheadmetacharsetUTF-8metanameviewportcontentwidthdevice-width, initial-scale1.0titleAI图片工具箱/titlestyle*{margin:0;padding:0;box-sizing:border-box;}body{font-family:system-ui,sans-serif;background:#f5f5f5;padding:20px;}.container{max-width:900px;margin:0 auto;}h1{text-align:center;margin-bottom:10px;}.tabs{display:flex;gap:10px;margin-bottom:20px;justify-content:center;}.tab{padding:10px 24px;background:white;border:2px solid #ddd;border-radius:8px;cursor:pointer;}.tab.active{background:#2563eb;color:white;border-color:#2563eb;}.upload-area{border:2px dashed #ccc;border-radius:12px;padding:40px;text-align:center;background:white;cursor:pointer;transition:border-color 0.3s;}.upload-area:hover{border-color:#2563eb;}.upload-area.dragover{border-color:#2563eb;background:#eff6ff;}input[typefile]{display:none;}.btn{display:block;width:100%;padding:12px;margin-top:16px;background:#2563eb;color:white;border:none;border-radius:8px;font-size:16px;cursor:pointer;}.btn:hover{background:#1d4ed8;}.btn:disabled{background:#999;cursor:not-allowed;}.result{margin-top:20px;display:none;}.result img{max-width:100%;border-radius:8px;}.compare{display:flex;gap:20px;flex-wrap:wrap;}.compare div{flex:1;min-width:300px;}.compare h3{margin-bottom:8px;}.loading{text-align:center;padding:20px;color:#666;}.scale-select{margin:10px 0;}/style/headbodydivclasscontainerh1AI图片工具箱/h1divclasstabsdivclasstab activedata-toolrembg去背景/divdivclasstabdata-toolrealesrgan超分辨率放大/div/divdivclassupload-areaiduploadAreap点击或拖拽图片到这里/pinputtypefileidfileInputacceptimage/*/divdivclassscale-selectidscaleSelectstyledisplay:none;label放大倍数/labelselectidscaleoptionvalue22倍/optionoptionvalue44倍/option/select/divbuttonclassbtnidprocessBtndisabled处理/buttondivclassloadingidloadingstyledisplay:none;处理中请稍候CPU模式可能需要5-15秒.../divdivclassresultidresultdivclasscomparedivh3原图/h3imgidoriginalImg/divdivh3结果/h3imgidresultImg/div/divaclassbtniddownloadBtndownloadresult.png下载结果/a/div/divscriptletcurrentToolrembg;letcurrentFilenull;consttabsdocument.querySelectorAll(.tab);constuploadAreadocument.getElementById(uploadArea);constfileInputdocument.getElementById(fileInput);constprocessBtndocument.getElementById(processBtn);constloadingdocument.getElementById(loading);constresultdocument.getElementById(result);constscaleSelectdocument.getElementById(scaleSelect);tabs.forEach(tab{tab.addEventListener(click,(){tabs.forEach(tt.classList.remove(active));tab.classList.add(active);currentTooltab.dataset.tool;scaleSelect.style.displaycurrentToolrealesrgan?block:none;});});uploadArea.addEventListener(click,()fileInput.click());uploadArea.addEventListener(dragover,e{e.preventDefault();uploadArea.classList.add(dragover);});uploadArea.addEventListener(dragleave,()uploadArea.classList.remove(dragover));uploadArea.addEventListener(drop,e{e.preventDefault();uploadArea.classList.remove(dragover);if(e.dataTransfer.files[0])handleFile(e.dataTransfer.files[0]);});fileInput.addEventListener(change,e{if(e.target.files[0])handleFile(e.target.files[0]);});functionhandleFile(file){currentFilefile;constreadernewFileReader();reader.onloade{document.getElementById(originalImg).srce.target.result;};reader.readAsDataURL(file);processBtn.disabledfalse;result.style.displaynone;}processBtn.addEventListener(click,async(){if(!currentFile)return;processBtn.disabledtrue;loading.style.displayblock;result.style.displaynone;constformDatanewFormData();formData.append(file,currentFile);leturl/api/currentTool;if(currentToolrealesrgan){formData.append(scale,document.getElementById(scale).value);}try{constresawaitfetch(url,{method:POST,body:formData});constblobawaitres.blob();constresultUrlURL.createObjectURL(blob);document.getElementById(resultImg).srcresultUrl;document.getElementById(downloadBtn).hrefresultUrl;result.style.displayblock;}catch(err){alert(处理失败err.message);}finally{processBtn.disabledfalse;loading.style.displaynone;}});/script/body/html前端通过/api/rembg和/api/realesrgan调后端Nginx负责转发。Nginx反代把所有东西串起来nano/etc/nginx/conf.d/image-tools.confserver { listen 80; server_name img.你的域名.com; # 前端页面 location / { root /home/ai-image-toolkit/web; index index.html; } # rembg去背景API location /api/rembg { proxy_pass http://127.0.0.1:5000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; client_max_body_size 20M; } # Real-ESRGAN放大API location /api/realesrgan { proxy_pass http://127.0.0.1:5001; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; client_max_body_size 20M; proxy_read_timeout 120s; # 放大处理慢超时调长 } }注意两个细节client_max_body_size 20M允许上传大图proxy_read_timeout 120s防止放大处理时间过长被Nginx断连。nginx-tnginx-sreload certbot--nginx-dimg.你的域名.com实际效果打开https://img.你的域名.com你会看到一个简洁的页面去背景测试拖一张商品图进去点处理。5秒后右边出来一张透明背景的PNG。发丝、商品边缘、半透明部分都处理得不错。和remove.bg免费版效果差不多但没有水印、没有次数限制。超分辨率放大测试拖一张500px的小图进去选2倍点处理。10秒后出来一张1000px的图细节明显比直接拉伸好。文字变清晰了噪点也压下去了。4倍放大效果更明显但处理时间更长15-20秒。CPU模式下速度不快但你自己用又不是跑商业服务等10秒能接受。加个人脸修复可选GFPGAN的部署思路和Real-ESRGAN一样——写个Flask API包一层。但GFPGAN和Real-ESRGAN共用PyTorch环境可以放在同一个Docker容器里。如果你想加这个功能在realesrgan的app.py里加一个/face路由引入GFPGAN的模型处理就行。GitHub上GFPGAN的文档很清楚照着改不难。为了避免文章太长这里不展开。核心思路就是每个AI模型写个Flask路由Nginx加个location转发前端加个tab。成本和限制说实话讲讲局限速度CPU处理一张图5-20秒。如果你要批量处理100张图等去吧。有GPU的话比如租GPU VPS速度能快10倍但成本也高10倍。内存rembg占约500MBReal-ESRGAN占约1.5GBPyTorch 模型。2G内存的VPS跑着勉强建议4G以上。效果上限这些开源模型的效果肯定是不如商业API的如Stability AI的放大服务。但如果你只是对个人使用、电商主图、社交媒体图片来说完全够用了。适合谁用个人开发者、内容创作者。如果你是专业设计师还是用Photoshop 商业插件更靠谱。这个工具箱的定位是免费、私有、够用不是替代专业工具。到这一步我们的的VPS上又多了一个能用的AI工具。打开网页拖图进去去背景或放大下载结果。不用注册、不用看广告、不用担心图片被拿去训练。整个工具箱的架构也简单三个Docker容器rembg realesrgan 可选GFPGAN 一个HTML页面 Nginx转发。想加新功能同样的套路——找个开源模型包个API加个tab。