智慧衣橱虚拟试穿实践从占位 UI到 Sophnet 双图图生图的落地思考一、写在前面做智慧衣橱时产品页面上最早写的是AI 试穿 / 图生图 · 接入中。很长一段时间里我把试穿和小衣对话助手混在一起想——以为在聊天框里发一张衣服图大模型说几句搭配建议就算AI 试衣了。后来明白虚拟试穿本质上是图像问题不是文本问题。- 对话大模型输入文字 → 输出文字或附带描述- 虚拟试穿输入 人物图 服装图 → 输出 一张新的合成图这在技术分类上属于 图生图Image-to-Image 或 条件图像编辑以人物照为底用服装图和 Prompt 作为条件让扩散模型生成穿上这件衣服的效果图。专用 VTONVirtual Try-On扩散模型如 IDM-VTON效果最好但需要 GPU 或海外 API。我们团队当时 只有 Sophnet 平台的 API Key没有阿里云 DashScope 原厂 Key也没有 Replicate 账号。于是做了一个务实选择用 Sophnet 上的 Qwen-Image-Edit-2509 做双图 Prompt的近似试穿——不是严格意义上的 VTON但在工程上能跑通、能演示、能写进论文而且和现有 Key 兼容。二、近似试穿2.1 三种路线我们选了中间那条路线做法难度效果A. 专用 VTONIDM-VTON 等双图模型高GPU/海外 API最好B. 图像编辑 / 图生图双图 「穿上这件衣服」Prompt中够用不稳定C. 纯文生图只描述衣服不喂服装图低衣服对不上我们走的是 B在 Sophnet 文档里Qwen-Image-Edit-2509 支持 13 张参考图 编辑指令任务类型标注为 I2I图生图这和让人物穿上某件衣服的需求是对齐的。2.2 和专用 VTON差在哪里心里要有数图生图近似试穿 不保证- 服装纹理 1:1 还原Logo、条纹可能糊- 人脸 100% 不变偶发换脸感- 复杂姿态下的遮挡关系但它 能保证- 端到端链路App 选图 → 后端 → 云 API → 结果 URL → 展示- 和衣橱数据打通服装图可直接来自已录入单品-基于图生图条件编辑的近似虚拟试穿后续可升级为专用 VTON三、整体架构Key 绝不进 App个人理解里移动端 AI 接入的第一原则是API Key 只放服务端。Android VirtualTryOnScreen│ Multipart: person_image garment_image│ Header: Authorization: Bearer 登录 JWT▼FastAPI /api/v1/ai/tryon│ 鉴权 → 存图 → tryon_service.run_tryon()▼Sophnet Qwen-Image-Edit-2509│ 异步任务创建 → 轮询 → 取 results[0].url▼backend/uploads/tryon/ → App 用 Coil 加载 result_url令试穿单独一个页面1. 图生图慢常 30120 秒不适合在聊天气泡里干等2. 两张图 轮询交互更像工具而不是对话3. 以后换 VTON 模型只改 tryon_service.pyApp 协议不变四、后端实现4.1 接口设计简单、可演示、可扩展FastAPI 路由节选pythonapp.post(/api/v1/ai/tryon, response_modelTryOnResponse)async def ai_tryon(user_id: Annotated[int, Depends(current_user_id)],person_image: UploadFile File(...),garment_image: UploadFile File(...),) - TryOnResponse:# 校验 image/ → 落临时文件 → run_tryon()...return TryOnResponse(payload)响应里我刻意加了 mode 字段- providerSophnet 图生图成功- demo未配置 Key或调用失败时回显人物图这是个人很看重的一点没有 Key 的日子也要能答辩演示 UI。Demo 不是造假而是工程上的 降级策略Graceful Degradation。4.2 核心双图顺序 Prompt 设计Sophnet 文档写得很清楚input.images 支持 13 张图多图时按数组顺序且 输出宽高比以最后一张为准。因此我们的顺序是pythonimages: [garment_data_uri, person_data_uri]# 图1 服装图2 人物 → 输出比例跟人物走Prompt 是反复试出来的可放 .env 覆盖pythonDEFAULT_TRYON_PROMPT (参考图1中的服装单品让图2中的人物自然穿上该服装。保持图2的人脸、发型、体态、背景不变服装贴合身体写实摄影风格高清。)DEFAULT_NEGATIVE_PROMPT (模糊低质量变形的脸多余的手指文字水印卡通插画风格服装错位头部替换背景突变)思考 Prompt 写图1 / 图2是和数组顺序绑定的若以后改成人物在前、服装在后Prompt 必须一起改否则模型会懵。4.3 异步任务创建 轮询Sophnet 图片接口是 异步 的POST 返回 taskId再 GET 查状态直到 SUCCEEDED。创建任务节选pythonpayload {model: Qwen-Image-Edit-2509,input: {prompt: prompt,negative_prompt: negative,images: [garment_data_uri, person_data_uri],},parameters: {size: 12801280,watermark: False,prompt_extend: True,save_to_jpeg: True,},}r client.post(SOPHNET_IMAGE_TASK_URL, headers{...}, jsonpayload)task_id output[taskId]轮询逻辑个人实现要点pythonwhile time.time() deadline:r client.get(f.../task/{task_id}, headers{...})status output.get(taskStatus, ).upper()if status SUCCEEDED:return output[results][0][url]if status in (FAILED, CANCELED):raise RuntimeError(...)time.sleep(2) # 默认 2 秒一轮最多 180 秒响应体有时包在 output 里有时在 result 里我写了 _unwrap_output() 做兼容避免联调时明明成功却解析失败。图生图失败时不向 App 抛 500而是 print 日志 降级 demo。用户至少能看到人物回显和错误提示而不是整页崩溃。4.4 环境变量.envenvTRYON_PROVIDERsophnetSOPHNET_API_KEY你的KeyTRYON_MODELQwen-Image-Edit-2509TRYON_API_BASE_URLhttps://www.sophnet.com/api/open-apis/projects/easyllms/imagegenerator/taskTRYON_POLL_MAX_SEC180Sophnet 文档[视觉模型](https://www.sophnet.com/docs/component/vision_model.html)五、Android 端实现与思考5.1 页面VirtualTryOnScreen交互我设计成三步尽量像工具不像聊天1. 选人物照相册2. 选服装图相册 或 衣橱横滑选单品3. 点生成试穿效果→ 展示 result_url实现的衣橱联动服装图不必重新拍直接用 DataStore 里已有 imageUri形成我的衣橱 → 试穿预览闭环。5.2 上传Retrofit MultipartkotlinMultipartPOST(api/v1/ai/tryon)suspend fun tryOn(Part personImage: MultipartBody.Part,Part garmentImage: MultipartBody.Part,): TryOnResponseDtoAiRepository 里从 content:// 读字节和上传头像同一套路kotlinsuspend fun virtualTryOn(personUri: Uri, garmentUri: Uri): TryOnResponseDto {val personPart uriToPart(personUri, person_image, person.jpg)val garmentPart uriToPart(garmentUri, garment_image, garment.jpg)return api.tryOn(personPart, garmentPart)}5.3 超时图生图 ≠ 登录接口普通接口 readTimeout 20s图生图单独 aiApi() 拉到 120s。这是实际联调时得到的经验——异步轮询在后端做但整次 HTTP 仍可能接近一分钟。5.4 登录与游客试穿接口复用 JWT。游客点击生成会引导登录——既是安全防刷 API也是产品逻辑试穿算深度功能。六、联调步骤1. cd backend pip install httpx uvicorn main:app --host 0.0.0.0 --port 80802. .env 填 SOPHNET_API_KEY3. Android local.propertiesWARDROBE_API_BASE_URLhttp://10.0.2.2:8080/模拟器4. App 登录 → 搭配 → AI 实验室 → AI 试穿 / 虚拟上身5. 人物照 服装图 → 生成6. 成功modeprovider未配 Keymodedemo 回显人物图七、效果与局限效果- 认清试穿 图生图没有硬塞进 LLM 聊天- 服务端代理 KeyJWT 鉴权- 演示降级 真实模式用 mode 区分- Sophnet 双图 I2I 与现有 Key 兼容零 GPU局限- 效果随 Prompt、照片质量波动大- 专用 VTON 在衣服还原度上仍明显更好- 大图 Base64 上传尚未做压缩/去背景预处理- 轮询在后端同步阻塞高并发时要改 task 队列若继续迭代我会按这个顺序1. 上传前缩放到短边 768、服装图去背景2. 后端改异步POST 返回 task_idApp 轮询3. 有余力再换 Replicate IDM-VTON 或万相试衣专用接口八、总结本项目的虚拟试穿模块是在智慧衣橱场景下对图生图Image-to-Image技术的一次工程实践客户端采集人物照与服装单品图经 FastAPI 服务端调用 Sophnet 平台的 Qwen-Image-Edit-2509 图像编辑模型通过双图输入与自然语言编辑指令生成近似上身效果。该方案属于 条件图像编辑式近似试穿与专用 VTON 扩散模型相比实现成本更低便于在课程项目中完成端到端验证API 密钥部署于服务端移动端仅传输业务图片与 JWT兼顾安全与可扩展性。