研究 03 · 计算机视觉 · 虚拟穿戴
虚拟试穿应用,用于为肖像装扮
2021·本科生研究生我实现了 Android 应用与服务器之间的流程:用户选择人物照片和服装后,服务器返回虚拟试衣图像。
- 1选择人像照片和服装
从您的 Android 应用程序向人们发送照片和服装 ID
- 2人体解析、姿态、服装遮罩
以 ACGPN 输入格式组织
- 3生成穿着效果图
Flask 服务器返回到应用程序
ACGPN、人体解析、姿态估计公共模型相结合的集成实现
直接分配的角色和结果
- 已分配角色
- 已配置虚拟穿戴模型所需的输入预处理和服装遮罩,并将 Flask 上传 API 与 Kotlin 和 Retrofit Android 客户端连接起来。
- 成果
- 我创建了一个集成工作流程,该流程接收人像照片和选定的服装,进行预处理,生成服装搭配图像,并将结果返回给应用程序。生成模型以及姿态和身体解析模型均已复用,而直接实现的部分包括输入配置、掩码处理以及服务器和应用程序之间的连接。
我内部实施和分析的内容
- 人体解析、姿态、服装遮罩,组织成 ACGPN 输入格式
- 使用 OpenCV GrabCut 生成服装掩模
- Flask上传、结果返回API
- Kotlin、Retrofit Android 客户端连接
基于研究 · 公开模型
- ACGPN虚拟穿戴模型
- 人体解析、姿态估计、公共模型
实验结果与试错
已验证从上传到返回佩戴结果的过程,并分析了蒙版错误
公开代码运行 · VITON-HD测试图像(CC BY-NC 4.0) · 人脸马赛克 · 以下时间为CPU实验值
通过服务器上传 API 获取试穿图像时发现,40 件服装中有 13 件的 GrabCut 矩形超出图像范围,导致掩码扩散到背景。
- Apple M1 Pro CPU
- PyTorch
- 公开模型权重
- 服务器上传API运行

- 13 / 40 套带遮罩的服装与背景混色
- 0.93 → 0.96修改方框后遮罩 IoU
- 4.9秒每个请求的 CPU 使用率中位数
问题及解决方案
问题虚拟穿戴模型不仅需要肖像照片,还需要以特定格式提供的姿势、身体部位和服装区域照片。
已解决。公开的人体解析和姿态估计模型的输出已调整为 ACGPN 输入格式,并添加了使用 GrabCut 创建服装遮罩的预处理步骤。
问题对于用户而言,直接处理多个模型的文件输入/输出过程过于复杂。
已解决。我们配置 Flask 上传 API 来运行预处理和推理并返回结果图像,并将 Android 客户端连接到 Retrofit。
问题如果背景混入服装蒙版中,生成的服装和躯干可能会模糊不清。
补充实验在运行公开代码时,我发现 GrabCut 的初始矩形超出了图像边界;在把矩形限制在图像内的对比实验中,掩码 IoU 中位数从 0.929 提高到 0.957。
实验对比及详细结果
| 项目 | 结果 | 状态 |
|---|---|---|
| 每个请求的处理时间 | 中位数 4.90 秒(四分位数 3.57–6.57 秒) | 40 个请求,CPU |
| 其中,ACGPN 已生成 | 中位数 2.27 秒 | 相同对象被选中40次 |
| 相同服装恢复 SSIM | 平均值 0.869 · 中位数 0.884 | 20 人 |
| GrabCut掩膜IoU | 中位数 0.929 → 0.957 | 40 套服装 · 代码原样 → 将矩形转换为图像 |
已观察到的原因和剩余任务
- GrabCut 矩形错误
矩形 (1, 1, w, h) 超出图像边界,仅在顶部和左侧留下一条背景线索,并且在 40 套服装中的 13 套中,遮罩模糊地融入背景。
- 三种故障类型
如果遮罩与背景混色,躯干部分会模糊;如果袖长发生变化,手臂上会出现残影;如果长度不同,则原始服装图案会保留在下摆下方。
- 如何读取SSIM
与原始值相比,重新穿上相同服装后的值。由于服装外部的输入直接使用,因此得分较高,无法与 ACGPN 纸质值进行比较。
- 数据和重量
VITON 数据受限于分发,因此使用 VITON-HD 测试图像,并发布 ACGPN 和 OpenPose 权重用于非商业研究用途。
读取结果的条件
- 集成实现,并非图像质量或速度的提升
- 使用公开权重运行数十张测试图像所得结果
- 不显示产品级性能或商业运营状态
