当你上传一张生活照,瞬间换上标准的蓝、白或红底,这背后不仅仅是一个按钮的点击,而是一个由 Flask 驱动的后端系统,正静静地在云端完成复杂的 AI 处理与图片合成。

上一期我分享了 《一个前端仔的闲暇之作:聊聊我上架的小程序》,介绍了证件照小程序的构思、前端实现和上线过程。很多朋友在评论区追问:“AI抠图是怎么实现的?”、“后端具体怎么搭的?”今天,我就来填上这个坑,聊聊从“纯前端+云开发”走向 “自建轻量后端” 的技术转变。

01 为什么转向自建后端?

上一期提到,最初为了快速验证,我直接用了微信云开发。云开发在初期确实省心,但随着用户增加,尤其是 AI抠图这个核心功能 的使用频率上升,我开始感觉到掣肘。

云函数存在调用冷启动的问题,而关键的外部AI API调用不仅有成本,还涉及数据传输和响应时间的不可控。

于是,我开始思考:能否将最核心、最消耗资源的 AI 处理环节,放在一个自己完全可控的环境里?这样既能提升处理速度,又能降低长期成本,还能真正学习并掌控后端服务的全链路。

这个想法,最终催生了项目的 第二期:用Flask搭建一个专门处理图片的后端服务。

02 技术选型:追求轻量与高效

作为前端开发者,我的后端选型标准很简单:快速上手、易于维护、社区资源丰富。基于这几点,我搭建了以下技术栈:

  • Flask (3.0.3):一个轻量级的 Python Web 框架,足够灵活,没有太多“约定俗成”的束缚,正适合我这种后端“轻熟手”。

  • rembg (2.0.57):本期主角,一个基于深度学习的、专门用于移除图片背景的 Python 库。它的特点就是 “开箱即用”

  • Pillow (10.4.0):Python 图像处理的事实标准库,负责背景更换、尺寸裁剪、图片合成等核心操作。

  • onnxruntime (1.19.2):rembg 依赖的推理引擎,高效执行训练好的AI模型。

  • pytest (8.3.3):保证后端代码健壮性的关键,为关键接口和函数编写测试。

03 核心实现:四步拆解图片处理流水线

整个后端的核心逻辑,是一条清晰的图片处理流水线。当用户从前端小程序上传一张图片后,后端会依次执行以下步骤:

第一步,接收与校验。 一个定义清晰的 Flask 路由 /api/process-id-photo 负责接收 POST 请求。这里会校验文件类型(仅允许 jpg、png)、文件大小(限制在5MB以内),并进行初步的安全清洗。

第二步,魔法发生:rembg 一键抠图。 校验通过后,图片被送入核心的 remove_background 函数。在这里,rembg 的强大和简单体现得淋漓尽致。

from rembg import remove
from PIL import Image
import io

def remove_background(input_image_bytes):
    """使用rembg移除图片背景,返回透明背景的PIL Image对象"""
    output_bytes = remove(input_image_bytes)  # 核心就是这一行
    return Image.open(io.BytesIO(output_bytes))

是的,移除背景的核心代码,几乎只需要一行rembg.remove() 函数接收图片的二进制数据,返回的已经是处理好的、背景透明的 PNG 图片二进制流。这极大地简化了开发流程。

第三步,自由换装:Pillow 合成新背景。 拿到透明底的人像后,结合用户选择的背景色(如标准蓝色 #2952CC),用 Pillow 创建一个新画布,将人像粘贴上去。

from PIL import Image, ImageDraw

def apply_background(transparent_img, bg_color_hex):
    """为透明底人像应用纯色背景"""
    # 创建与透明图同尺寸的纯色背景
    bg = Image.new('RGB', transparent_img.size, bg_color_hex)
    # 将透明人像(RGBA模式)作为蒙版粘贴到背景上
    bg.paste(transparent_img, (0, 0), transparent_img)
    return bg

第四步,精准裁剪:生成目标尺寸。 最后,根据用户选择的证件照类型(如“一寸照”),从预设的尺寸配置字典中获取对应的像素宽高和 DPI,进行精确裁剪和分辨率设置。

size_presets = {
    '1cun': {'width': 295, 'height': 413, 'dpi': 300},  # 一寸照
    'id_card': {'width': 358, 'height': 441, 'dpi': 350}, # 身份证
    # ... 更多尺寸
}

04 进阶与保障:性能、安全与测试

一个可用的服务是基础,一个稳定可靠的服务才是目标。为此,我在几个方面做了额外工作:

性能优化: Rembg 模型在首次加载时较慢。我通过在服务启动时 预加载模型 来解决这个问题,确保后续所有请求的处理速度都很快。同时,为耗时较长的处理接口设置了合理的 超时时间

安全加固: 对上传的图片内容进行了二次校验,防止上传非图片文件。所有处理均在内存中进行,处理完成后立即删除临时数据,不落盘,最大限度保护用户隐私。

代码质量: 使用 pytest 为核心函数(如图片处理函数)和 API 接口编写了单元测试和集成测试。这让我在后续优化 rembg 模型参数或调整裁剪逻辑时,可以非常放心地进行重构。

05 AI时代的开发感悟

回顾这次后端开发,最大的感触就是 AI 时代的基础设施已经如此易用

一方面,是 rembg 这样的封装良好的 AI 库,它把复杂的 U²-Net 深度学习模型变成了一个简单的函数调用,让普通开发者无需理解背后原理也能快速集成强大的 AI 能力。

另一方面,在整个编码过程中,AI 编程助手 起到了“超级加速器”的作用。从 Flask 应用骨架的搭建、Pillow 复杂图像操作代码的编写,到处理边界情况和编写 pytest 测试用例,大部分代码都是在与 AI 的对话和迭代中生成的。

我的角色,更多地从“码农”转向了 “技术方案的设计师和质检员”:明确我要什么,理解 AI 生成的代码,然后将其组装、调试成一个稳定运行的系统。


Flask 后端上线后,小程序的处理速度明显提升,单次处理成本也大幅下降。项目的技术架构也从前端的单点突破,变成了前后端各司其职的 “小全栈”

从灵光一闪的想法,到前端界面的实现,再到后端服务的构建,这个小小的“证件照工具”也算是我个人技术栈的一次完整实践。

它不完美,但很实在。或许,这就是我们这代开发者的小确幸:能用越来越高效的工具,独立地把一个想法从头到尾变成现实。

小程序仍在运行,如果你有需要,随时可以体验。后台那个用 Flask 和 rembg 搭建的小服务,正在安静地等待着下一张需要处理的图片。

成品展示如下👇

链接:#小程序://简照/1HfMPIIyxfwikAa

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐