项目详细方案

1 引言

随着元宇宙概念的火爆以及虚拟数字技术的大迸发,在人们购买力逐步上升的今天,世界看到了“虚拟试衣”技术未来巨大的发展空间。根据 CB Insights 的预测,全球虚拟试衣间的市场规模将从 2020 年的 34 亿美元,增长至 2030 年的 193 亿美元。

虚拟试衣技术在不断地发展中和突破中,在电子商业普及和移动端用户迅速增长的阶段,如果虚拟试衣系统能提高其真实性以及对不同衣物的贴合度,将在网络时代获得巨大的市场。基于赛题方要求,我们团队开发了符合要求的虚拟试衣系统。下文中,我们将会从项目概述,系统设计,模型构建,工程化实现,项目部署,测试效果等多个维度对于相关成果进行阐述。

  • 项目概述:介绍了当前虚拟试衣技术出现的背景与市场需求,强调了我们的虚拟试衣系统的主要功能和特点,给出了赛题方要求的技术指标。

  • 系统设计:介绍了我们的系统架构和技术选择。

  • 模型构建:详细介绍了我们使用的算法和模型,以及如何进行训练和调优。

  • 工程化实现:详细介绍了如何将深度学习算法转化为实际可用的系统,并通过推理引擎将PyTorch深度学习模型进行工程化。

  • 项目部署:详细介绍了我们们如何将系统部署到实际的生产环境中(web服务器端部署和本地化可执行程序exe部署)。

  • 测试效果:展示了我们模型的生成效果图,与其他SOTA模型的对比,同时分析了我们模型的大小和推导速度

2 项目概述

2.1 项目背景

随着互联网和移动互联网的飞速发展,电子商务已成为消费者购买商品的主要方式之一。然而,网络购物的一个主要难题是消费者无法亲身试穿商品,往往需要通过图片和文字描述来评估商品的适合度。这会导致消费者难以确定最终购买的商品是否符合自己的需求,从而增加了商品退换货的风险和成本,也降低了购物的满意度。

虚拟试衣技术的出现,为解决这一难题提供了一种新的解决方案。虚拟试衣技术可以通过图像生成和人体建模技术,利用计算机生成的模型将服装或配饰实时渲染到用户的图像或视频中,让用户可以在不离开家的情况下进行试穿。这不仅提高了用户体验,还减少了用户试穿时的不便和时间成本,为消费者带来更加便利的购物体验。同时,虚拟试衣技术还可以为品牌商和零售商提供一种更直观的方式来展示其商品,增强品牌的吸引力和销售力。虚拟试衣技术已经成为了时尚行业数字化的重要一步,它将为时尚品牌和电商平台带来更多的机会和创新可能性,也将为用户提供更好的购物体验和更加便利的服务。随着技术的不断进步和应用场景的不断拓展,相信虚拟试衣技术将在未来继续发挥着重要的作用,并成为时尚行业数字化发展的重要驱动力。

经过团队的实际调研,可以将虚拟试衣应用出现的原因归结如下:

  • 顾客需求的提升:随着消费者对服装试穿的体验要求不断提升,虚拟试衣技术能够满足消费者更高的购物体验需求。此外,随着在线购物市场的迅速发展,虚拟试衣技术的应用越来越广泛。

  • 技术突破的加速:随着深度学习、计算机视觉的不断发展,虚拟试衣技术在真实性、贴合度、逼真度等方面得到了极大提升,也推动了虚拟试衣技术的广泛应用。

  • 环保和可持续性:虚拟试衣技术可以避免过多的实体试衣,减少了物流和生产环节的能耗和浪费,符合现代社会对于环保和可持续发展的要求。

  • 降低成本和提高效率:虚拟试衣技术可以降低实体试衣的成本,同时提高试衣效率,为服装企业和消费者带来了实际效益和收益。

同时,我们团队还对虚拟试衣项目市场规模进行了调研。根据多个市场研究报告显示,预计到2024年,全球虚拟试衣市场规模将超过100亿美元。随着虚拟试衣技术的不断提升和推广,虚拟试衣方案的普及将越来越广泛,吸引不断增长的消费者需求。特别是在线购物日益成为主流趋势,虚拟试衣的需求将会不断增加。下图展示了近几年虚拟试衣市场规模的统计数据:

图 2-1 近年全球虚拟试衣市场规模

2.2 项目目标

虚拟试衣项目的目标是为消费者提供一种更加方便和快捷的购物体验,使其能够在不实际去实体店试穿的情况下,轻松地预览和比较不同的服装款式,颜色和尺寸。虚拟试衣旨在改善在线购物的用户体验,同时减少物流和退货的成本,促进线上消费的增长。此外,虚拟试衣也有助于品牌提高消费者对其产品的信任度和忠诚度,改善品牌形象和增加销售量。

为了实现以上目标,团队根据万兴科技关于选题和项目说明对项目需求和系统的规格说明进行了详细的分析,我们认为该项目应该满足以下几点功能:

  • 上传用户照片:系统应该允许用户上传自己的照片以进行试衣。

  • 选择服装:系统中应该有可供用户选择的多种服装选项。

  • 尺寸适配:系统应该根据用户的身形和尺寸来对所选的服装进行适配,确保合适的紧度和长度。

  • 预览和变更:用户应该能够根据自己的需求预览和变更服装。

此外,考虑到项目在现实中的实际应用,除了基本功能外,还应满足以下的用户需求:

  • 可视化体验:用户能够在虚拟试衣系统中看到自己穿着不同款式、不同颜色的衣服,从而更好地理解服装的搭配和效果。

  • 真实感:虚拟试衣系统应具有尽可能真实的材质、光影等元素,从而给用户带来真实的试衣体验。

  • 多样性:系统应提供丰富多样的衣服选择,包括各种品牌、风格、颜色等,以满足不同用户的需求。此外,还应提供个性化定制服装的功能。

  • 操作简单:虚拟试衣系统应该操作简单、易懂,不需要太多的学习成本,以便吸引更多用户使用。

  • 交互性:系统应该便于用户进行交互,例如可以在系统中分享图片、保存购物清单等等。

  • 安全性:虚拟试衣系统应该提供足够的保密措施,以保护用户的隐私。

  • 精确性:虚拟试衣系统应该提供准确的尺寸和尺寸建议,以帮助用户选择合适的衣服。

  • 灵活性:虚拟试衣系统应该提供灵活的体验方式,例如可以在家中进行试衣、在商店中进行试衣等等,以满足不同用户的需求。

2.3 项目价值

虚拟试衣项目是近年来发展迅速的一项技术,它将人工智能、计算机视觉和虚拟现实等多种技术有机结合,在传统试衣的基础上实现了更加快速、准确和便捷的试衣体验。下文将从市场,社会,国家三个层面对项目价值进行具体分析:

  • 市场层面:

    虚拟试衣技术为时尚、服装、珠宝等行业提供了一种全新的销售方式,可以为企业吸引更广泛、更具有世界性的客户群体,从而提高企业的市场份额和竞争力。通过应用虚拟试衣技术,消费者可以在不离开家的情况下进行试衣。这意味着公司的客户群可能会变得更广泛、更有世界性。虚拟试衣技术有助于增强品牌形象,提高客户对品牌的信赖度和忠诚度。

  • 社会层面:

虚拟试衣技术有助于推动时尚行业的数字化转型,减少人们购买衣物时的误解和失望,让购物变得更加智能化、更加精准化。同时,虚拟试衣技术可以减少生产与销售过程中的资源浪费,从而有助于推动可持续发展和环境保护。

  • 国家层面:

虚拟试衣技术可以为国家的制造业、资讯科技方向带来经济利益。这种技术有帮助推动产业升级,从而增加了经济增长的可能性,并且在工业4.0时代,虚拟试衣技术有助于技术创新,促进了数字经济的发展。同时,虚拟试衣技术和智能制造技术结合,将产生更广泛的商业机遇,缓解人力资源短缺问题,更好地推进制造业转型升级。

2.4 作品简介

团队使用开源数据集VITON及在此基础上进行预处理得到的VITON_plus数据集,建立虚拟试衣算法模型,并完成模型训练、优化、工程化、部署等工作,最终产出一个本地可执行程序以及部署在服务器支持试用的Web界面(可通过此链接访问我们的网页:无忧工作室),同时测试了模型性能以及对模型的试穿效果进行了评估。值得关注的是,基于赛题方的要求,我们的模型是端到端的,只需要将人的图像和衣服的图像作为输入,而不需要人体解析图或人体姿态图等任何额外的辅助信息就可以完成虚拟试衣,具有轻量化且快速的特点,且生成效果良好。

以下是Web页面展示图:

图 2-2 项目前端首页面展示

7656da8df12b4cd472cf13d4bf11bda

图 2-3 项目前端试衣页面展示

以下是本地化可执行程序的展示图(本地化可执行程序可以在web网页的软件下载获取):

图 2-4 项目本地化可执行程序展示

模型大小(MB)计算量(FLOPs)参数量(MB)FID
34.752.02*10^918.228.75

表 2-1 赛题方所需模型数据(模型精度格式为fp16)

此外我们的在项目开发的过程中尤其注重文档工作,构建了语雀知识库来进行开发过程的跟踪,通过知识库协作来进行团队合作与任务分配,完成了需求分析,算法调研,工程化探索,web开发的代码文档等工作。

3a7f4c27f9cee47e28cdafab8f811d5

图 2-5 团队语雀知识库截图展示

2.5 创新点与优势

模型主要是基于PF-AFN(Parser Free Appearence Flow Network)与SDAFN(Single Deformable Attention Flows Network)实现。

其中,对于PF-AFN,我们借鉴了其中知识蒸馏的思想,将教师模型(Teacher Model)的输出作为一种指导信息(tutorial),让学生模型自行选择哪部分应该使用。将最初的人的图像作为真值,而将教师输出作为学生的输入,而非用教师的结果约束学生,实现教师指导学生(Teacher tutor Student)的知识蒸馏架构。教师模型使用到了人体掩码和人体姿态信息,结果会更准确,为了把这些信息传授给学生,教师+学生串联起来,实现了端到端的自监督。这样就将一个大型、复杂的神经网络模型(教师模型)中的知识迁移到一个小型、简单的神经网络模型(学生模型),减小了模型参数,同时实现了学生模型的输入只需要人物和衣服的图片,而不需要依赖任何人体解析图或者人体姿态图等任何辅助信息,且学生模型的效果不受限于教师模型;

对于SDAFN,我们使用SDAFN作为我们的教师模型。同时我们利用其One-Stage框架的创新性构想,借鉴了其外观估计流Appearance Flow的思想(DAFlow),使用了可形变transformer(deformable transformer)做为外观估计流的主要架构,同时改进了深层特征提取器和输入输出模块,提出了SDAFN_plus作为我们学生模型的架构。值得一提的是,DAFlow是利用人和服装图像的自形变和交叉形变注意力流获得输出结果,以端到端的方式达到逼真的拟合结果。

模型创新点如下:

  1. 我们的模型为端到端单任务模型,避免了多任务模型计算开销大的缺点,加快了推导速度。

  2. 我们的模型不需要依赖人体解析图,人体姿态估计图等任何辅助信息,只需要将人的图片和衣服的图片作为输入。

(3)使用知识蒸馏的方法,我们的模型在保持高质量虚拟试衣图像生成的同时,减少了模型计算量和参数量,实现了模型轻量化。

(4)团队通过数据增强的方式,扩充了模型训练的数据集,提高了模型的鲁棒性。

(5)模型性能优异,在FID等关键指标中取得领先得分,并在衣物细节保留、人物身体拟合和边缘识别等传统虚拟试衣难点取得较好表现。

3 系统设计

项目主要分为三部分,分别是深度虚拟试衣模型的构建与训练,pytorch深度学习模型的工程化,模型的生产部署。下面是我们的系统整体架构图。

275e7a465cd381928e79f240c82a2bd

图 3-1 系统总体架构图

项目系统架构分析:

  • 深度虚拟试衣模型的构建:使用pytorch作为我们深度虚拟试衣模型的开发框架,使用开源的SDAFN模型(Single Deformable Attention Flows Network)作为我们的教师模型,重新设计构建SDAFN_plus作为我们的学生模型。

  • 训练教师模型:使用开源的VITON数据集作为我们的主要训练数据,对VITON数据集进行预处理得到人像掩码图和人体姿势图,再加上试穿衣服图片作为教师模型的输入。

  • 训练学生模型:将教师模型的输出作为我们学生模型的输入,将最初的人的图像作为真值,这样就将一个无监督的模型的训练巧妙地转换成了一个有监督的训练,且学生模型的生成效果不会受限于教师模型。

  • 学生模型训练完成后,将学生模型的权重保存为.pth。

  • 将.pth格式的模型转换成onnx格式。

  • 使用onnxruntime推理引擎进行推导,实现推导程序。

  • Web前后端部署:使用Flask作为后端框架,将Python推导程序部署到Web应用程序中。前端使用Vue框架实现用户交互和页面展示。后端使用Gunicorn容器,前端使用Nginx容器来提高Web应用程序的性能和稳定性。

  • 本地化可执行程序exe部署:使用Thinker这个Python的可视化库,将Python推导程序封装为本地可执行程序。用户可以通过双击可执行文件来打开程序,不需要安装Python环境和其他依赖库。

4 模型架构

4.1 相关工作

我们团队在项目开展初期对虚拟试衣技术进行了充分的调研,阅读了大量的技术综述与参考文献,对虚拟试衣技术的发展路径有了详细的了解,并对当前效果出众或者在虚拟试衣技术上具有里程碑意义的论文进行了阅读和讨论,下面是我们早期技术调研、论文阅读的任务分配截图和论文阅读笔记截图。

图 4-1

图 4-2

图 4-3

4.1.1 虚拟试衣技术的发展历史

在线时装行业已经受到诸如增强现实,虚拟现实,可穿戴技术和互联试衣间等最新技术创新的影响。无论是用于创建新产品目录还是为购物者提供沉浸式环境,它都可能影响电子商店并为新的易于图像编辑的可能性打开大门。

在早期,相关工作的处理主要使用三维测量和基于模型的方法,例如2012年的DRAPE: DRessing Any PErson ,2014年的Subspace Clothing Simulation Using Adaptive Bases,2017年的。然而,它们本质上是计算密集型的并且需要昂贵的成本,这对于购物者而言通常是不可接受的。而利用图像合成技术则可以降低零售商的成本。在计算机视觉中,图像生成模型(例如2014年的GAN,2016 年的PixelDTGAN等)能够生成高质量的真实感图像,已成功应用于众多应用中。

近年来,二维方法由于数据容易获取和结果逼真而受到越来越多的关注。例如2017年的有条件的类比GAN:在人像上时尚换装(CAGAN),2018年的VITON:基于映像的虚拟试穿网络,VITON使用了一个两阶段的从粗到细的策略来产生一个穿衣服的人。它首先估计粗糙的人体形状,然后用形状上下文匹配算法扭曲衣服,并根据形状细化穿衣服的人的细节。VITON同年提出来的的改进版Toward Characteristic-Preserving Image-based Virtual Try-On Network(CP-VTON),引入了卷积几何匹配器(用于几何匹配的卷积神经网络架构,2017)。2019年的Towards Multi-pose Guided Virtual Try-on Network(MG-VTON ),扩展到多姿势试穿系统,该系统需要修改人的姿势以及上身的衣服。CAGAN (有条件的类比GAN:在人像上时尚换装)提出了一种基于U-Net的GAN 方法。但是,由于这些网络无法处理较大的空间变形,因此这些方法无法产生实际的结果。大多数的试穿方法都是基于单个图像的,不过也有基于视频的虚拟试穿,例如2019年的FW-GAN: Flow-navigated Warping GAN for Video Virtual Try-on。ACGPN引入了一个额外的阶段来预测参考图像的语义布局。DCTON和ZFlow添加了更准确的描述符号,如变性或UV投影。VITON-HD提高了条件GAN结构在高分辨率图像上的性能。虽然生成的图像质量更好,但管道正变得越来越复杂,并依赖于更多的外部信息,导致了效率的降低和由不准确的中间标签造成的明显的伪影。

传统的基于深度学习的2d虚拟试衣的算法,例如鼻祖VITON,以及后续的CPVITON,ACGPN等,大多依赖于人体解析(human parsing),也就是算法不仅仅需要待穿着的人的图像,还需要对该人进行各个部位的语义分割或者关键点提取的结果,ACGPN就是其中一个典型的例子。我们最希望的是,一个模型只需要输入目标衣服和候选人,直接输出换装结果,或者说,我们希望得到一个无需人体解析(Parser- Free,下文中使用)的模型。WUTON是Parser-Free模型中的一个经典案例,该模型使用了知识蒸馏(knowledge distillation)的方法,知识蒸馏实际上就是用教师模型(teacher model)的结果监督学生模型(student model)的过程,可以实现教师模型的知识复制到学生模型上的功能。WUTON的教师模型的输入包含目标衣服,待换装的人以及人的解析结果,而学生模型的输入只有目标衣服和待换装的人,用教师模型的输出作为真值约束学生模型的训练过程,就是WUTON的主要思想。2021年的PF-AFN则认为教师模型的输出是不适合作为真值的,因为这只是一个生成的虚拟的结果,可能存在局部的偏差或不自然,因此,更换了思路,将教师模型的输出作为一种指导信息(tutorial),自行选择哪部分应该使用。将最初的人的图像作为真值,而将教师输出作为学生的输入,而非用教师的结果约束学生,实现教师指导学生(teacher tutor student)的知识蒸馏架构,这样学生模型的生成效果不会受限于教师模型,大大提高了学生模型的性能。

4.1.2 空间变换模块

空间变换模块广泛地应用于光流估计、图像变换和目标识别任务中。在虚拟试衣中,空间转换模块主要用于使衣服匹配人的姿势。

  • VITON 利用基于薄板样条(TPS)的翘曲方法,使店内服装的变形达到更为精细的效果;

  • CP-VTON使用一个神经网络来学习TPS扭曲的变换参数,而不是使用图像描述符;

  • ClothFlow通过级联的方式引入了更密集的流预测,这使得变形的自由度更高。然而,密集流往往不够平滑。为了避免这个问题,ClothFlow使用正则化来强制平滑;

  • PFAPN则增加了一个二阶光滑约束,以实现相邻外观流的共线性,尽管提出这些约束条件是为了使服装在变形后更平滑,但模型当目标衣服与原来的衣服存在较大差异时,模型性能仍有待提高。

4.1.3 注意力机制

注意力机制是一种计算机视觉和自然语言处理中广泛应用的机制,在词句预测,机器翻译,图像分割、目标检测和图像生成等方面都取得了良好的性能,它可以在输入序列中寻找与输出相关的部分,以便更好地进行特征提取。在深度学习模型中,常常使用自注意力机制来建模序列间或像素点间的长距离依赖关系,其中每个输入元素都被视为其他元素的参考点。

然而在图像领域中,随着分辨率的提高,计算量爆炸性增加,密集的注意力机制变得难以实现。为了解决这个问题,研究人员通常使用预定义的局部注意力模式或稀疏注意力模式。在像素级图像变换中,团队在模型设计时结合了流操作对保留细节的有效性和注意力机制对精确结构估计的能力,自然而然地将稀疏注意力模式扩展到像素级图像变换中。

4.2 模型总体架构

16dd7cdc007007794979926bb33d7e6

图 4-4 模型总体架构图

现有的的虚拟试衣模型在生成真实的结果和细节方面取得了较大进展。然而,这仍是一项具有挑战性的任务,特别是在人体姿态复杂以及生成的图像与原有图像存在较大变形的情况下,大多数现有方法仍然存在错位或明显的生成痕迹,并且高质量虚拟试衣图像的生成相当多的依赖于人体解析图或者人体姿势图,如果人体解析图或者人体姿态图有误,生成质量会大大折扣,并且由于人体解析图或人体姿势图的引入,解析人体的预处理时间也会给生成速度带来不小挑战,多阶段的生成也会加大工程部署的难度,为虚拟试衣技术的真正应用带来挑战。为解决以上问题,我们团队设计了基于SDAFN与PF-AFN的虚拟试衣系统。

我们借鉴PF-AFN中中知识蒸馏的思想,将教师模型(Teacher Model)的输出作为一种指导信息(tutorial),让学生模型自行选择哪部分应该使用。将最初的人的图像作为真值,而将教师输出作为学生的输入,而非用教师的结果约束学生,实现教师指导学生(teacher tutor student)的知识蒸馏架构。教师模型使用到了人体掩码和人体姿态信息,结果会更准确,为了把这些信息传授给学生,教师+学生串联起来,实现了端到端的自监督。这样就将一个大型、复杂的神经网络模型(教师模型)中的知识迁移到一个小型、简单的神经网络模型(学生模型),减小了模型参数,同时实现了学生模型的输入只需要人物和衣服的图片,而不需要依赖任何人体解析图或者人体姿态图等任何辅助信息,且学生模型的效果不受限于教师模型;

对于SDAFN,我们使用SDAFN作为我们的教师模型。同时我们利用其One-Stage框架的创新性构想,借鉴了其外观估计流appearance flow的思想(DAFlow),使用了可形变transformer(deformable transformer)做为外观估计流的主要架构,同时改进了深层特征提取器和输入输出模块,重新设计并提出了SDAFN_plus作为我们学生模型的架构。值得一提的是,DAFlow是利用人和服装图像的自形变和交叉形变注意力流获得输出结果,以端到端的方式达到逼真的拟合结果。

需要指出的是,我们的教师网络采用的是开源的SDAFN模型,而学生网络则采用的是我们在SDAFN基础上改进优化而重新构建的SDAFN_Plus模型。

4.3 学生模型SDAFN_plus分析

图 4-5 子网络SDAFN_plus架构图

如图所示,我们改进的学生网络SDAF_plus主要有三个模块构成,分别是特征金字塔提取器,级联流估计和浅编码器与解码器。其中,服装与待试穿的人的图像首先被输入到非共享的特征金字塔提取器中;然后,在级联流估计模块中,对自形变和交叉形变注意力流进行估计;最后,利用浅编码器和解码器以及学习到的数据流,得到了最终的试穿结果。

下面分别具体介绍特征金字塔提取器,级联流估计和浅编码器与解码器这三个模块。

4.3.1 金字塔特征提取器

金字塔特征提取器是一种多尺度特征提取方法,用于解决物体尺度变化问题。在计算机视觉领域中,物体的尺度往往是不确定的,而且同一个物体在不同的尺度下有不同的表现。金字塔特征提取器通过在不同的尺度下提取特征来解决这个问题,从而可以更好地进行物体检测和识别。

图 4-6 特征金字塔提取器

金字塔特征提取器通常采用自底向上或自顶向下的方式生成多个尺度的特征图。自底向上的方法是通过在输入图像上应用一个低通滤波器来减小尺度,并对结果进行下采样来生成一系列尺度较小的图像,然后在每个尺度上提取特征。自顶向下的方法是从原始图像开始,通过上采样或插值将其尺度增加,然后在每个尺度上提取特征。两种方法都可以生成多个尺度的特征图,但自顶向下的方法通常更精细,因为它可以利用原始图像的细节信息来生成高分辨率的特征图。

金字塔特征提取器已被广泛应用于计算机视觉任务,如物体检测、语义分割和行人重识别等。

在金字塔特征提取器模块,我们的模型有两个自顶向下的金字塔特征提取器,包括一个参考分支和一个源分支,均采用自顶向下的方式生成多个尺度的特征图。其中参考分支将待试穿的人作为输入,源分支将服装图像作为输入。这两个特征提取器具有相同的特征金字塔网络(FPN)结构而且非共享参数。在特征提取器选取方面,团队分别尝试了VGG17和resnet网络,最终选取resnet网络,特征提取器的层数我们做了实验,分别选取3,4,5。最终,在模型大小,模型推导速度,生成效果等因素的综合考量下,将特征提取层层数取为3层。

我们同时做了对比实验,比较了特征提取层层数分别是3,4,5的模型测试效果。

特征提取层层数345
FID9.058.759.054

表 4-1 特征提取此器的对比试验

4.3.2 级联流估计

在虚拟试衣模型中,我们可以知道的是,对于较大的变形是难以预测的,因为目标域与源域的图像往往是不统一的,为解决这个问题,我们采用了由粗到细的级联流估计,具体操作在下文展开。

根据金字塔特征提取器提取的hierarchical reference和源特征,估计了两种类型的流和注意力图。其中,第一种是来自参考分支的Self-Flows Fields和Self-Attention Maps;第二种是来自两个分支相互作用的Cross-Flows Fields和Cross-Attention Maps。最低分辨率的特征被输入到DAFN中以预测初始Flow Field和Attention Map。

然后,它们将被级联地细化和更新。具体来说,参考特征图和源特征图首先由前一个Self- and Cross-DAFlows进行转换,这个操作称为DAWarp;然后,利用变换后的特征来预测剩余流,并得到了具有更精细的新注意力图(上述过程一直持续到n=N)。在模型的实现中,N被设置为3。

需要说明的是,对于DAWarp操作,如下图所示,DAFlow学习了各种可能的流,将Flow Fields和Attention操作同时应用于特征和图像。在特性方面,源或参考特性被有效地集成到期望的目标位置:

公式中为参考位置p的第k个采样位置, 表示DAFlow的弯曲特征。在图像层面上,合并多个扭曲的图像丰富了生成的可能性,并被重新组合成具有合理结构和真实纹理的新图像。其中,颈部和手臂的部分是真实生成的,并不在原始图像中。此外,Warp操作应用双线性插值操作,使估计的偏差得以优化与反向传播。

4.3.3 浅编码器与解码器

浅编码器将图像从RGB图像投影到高维空间,并且利用最终估计的流和注意力图,将高维特征空间中的参考人和服装图像与DAWarp进行变换和合并(变换操作与上文提到的DAWarp操作类似);然后将合并后的结果输入到一个浅解码器中,得到最终的试穿结果。浅编码器和解码器都有两个卷积层,没有下采样操作。值得说明的是,服装图像和参考人图像共享相同的编码器和解码器。实验验证,浅编码器-解码器结构可以有效提高像素级表示能力与流生成质量。

4.4 模型训练

4.4.1 训练平台

模型训练环境如下表所示:

训练平台模型框架显存显卡
Ubuntupytorch24G*23080Ti*2

表4-2 训练环境参数

在训练时,初始学习率设为0.00005,每迭代30轮变为之前的0.2倍。在模型优化器方面,我们选择adamw,该优化器在机器视觉问题有较好的泛化性能。相比于l2优化器,Adamw在相同迭代轮数下有着更好的准确率。

IMG_256

图 4-7

4.4.2 数据集

模型训练采用virtual-tryon领域公认的viton公开数据集,并使用了翻转 (flip)、旋转 (rotation)、缩放 (scale)、裁剪 (crop)、移位 (translation)等方法增强数据集。数据增强有助于增强模型泛化能力,并且可以大幅降低过拟合程度。

拼图片23332-000001_0_000001_0(5)_000001_0(4)_000001_0(2)_000001_0(1)

图 4-8 数据增强示例图,第一列为原图,后四列由对第一列随机裁剪,旋转得到

对于教师模型SDAFN的训练,需要额外的人体掩码图和人体姿态估计图,所以我们首先对VITON数据集进行预处理,得到VITON_plus数据集,其中包含了所有人像的掩码图和人像的姿势图,以及对衣服进行预处理得到的分理出衣服背景的衣服前景分割图。

图 4-9 数据集文件目录

图 4-10 人像掩码图

图 4-11 人体姿态图

图 4-12 服装前景分割图

对于学生模型的训练,只需要将VITON原始人像和原始衣服作为输入,不需要任何额外的辅助信息。

WPS图片拼图

图 4-13 原始人像和衣服

4.4.3 训练过程

  • 知识蒸馏

知识蒸馏与迁移学习在模型优化中有很重要的应用。一般地,大模型往往是单个复杂网络或者是若干网络的集合,拥有良好的性能和泛化能力,而小模型因为网络规模较小,表达能力有限。因此,可以利用大模型学习到的知识去指导小模型训练,使得小模型具有与大模型相当的性能,参数数量大幅降低,从而实现模型压缩与加速。

原理介绍如下图所示:

图 4-14 知识蒸馏原理图

  • 训练过程

(1)教师模型训练

首先,我们使用开源的SDAFN作为教师模型,用预处理后的VITON_plus数据集对教师模型进行训练,使其能够在各种任务上表现出色。在训练过程中,使用了翻转,剪切数据增强,正则化等方法提高模型生成效果。

(2)学生模型训练

项目主要采用模型蒸馏训练学生模型。在蒸馏的过程中,我们将原始大模型称为教师模型(teacher),新的小模型称为学生模型(student)。

学生模型的架构采用我们改进优化后提出的SDAFN_plus,其只需要人物图像和衣服图像作为输入,而不要任何其他的辅助信息。

与传统的蒸馏方法不同的是,我们将最初的人的图像作为真值,而将教师输出作为学生的输入,而非用教师的结果约束学生,实现教师指导学生(teacher tutor student)的知识蒸馏架构。教师模型使用到了人体掩码和人体姿态信息,结果会更准确,为了把这些信息传授给学生,教师+学生串联起来,实现了端到端的自监督。这样就将一个大型、复杂的神经网络模型(教师模型)中的知识迁移到一个小型、简单的神经网络模型(学生模型),减小了模型参数,同时实现了学生模型的输入只需要人物和衣服的图片,而不需要依赖任何人体解析图或者人体姿态图等任何辅助信息,且学生模型的效果不受限于教师模型。

值得注意的是学生模型训练时教师模型的参数不再进行更新。我们在训练学生模型时同样采用了三个阶段:

  1. 在第一阶段,我们使用分割出衣服前景的衣服图进行训练,使模型可以获得一定的衣服分割的知识。

  2. 在第二阶段,我们在原始的衣服图上进行训练以进行调优,原始的衣服图像为白色背景。

  3. 第三阶段,由于我们将教师模型的输出作为学生模型的输入,所以我们可以使教师模型生成不同图片来作为学生模型的输入,我们以此来改变和扩大学生模型训练的数据集

实验表明我们采用三个阶段训练的学生模型相比一阶段训练的模型鲁棒性更强,抗干扰能力更强,拥有更好的性能指标和生成效果。

  1. 模型效果对比

从表格4-3可以看出,我们的模型使用基于知识蒸馏的训练方法,可以大幅减少模型体积,同时保留教师模型高性能表现。

模型名称模型大小模型评价指标(FID)on VITON数据集
传统多任务模型(CP- VTON)200MB30.50
SDAFN(教师模型)356MB10.97
SDAFN_plus(学生模型)64MB(fp32)8.74

表 4-3

5 工程化实现

5.1 工程化实现的整体框架

对于深度学习模型来说,模型部署指让训练好的模型在特定环境中运行的过程。相比于软件部署,模型部署会面临更多的难题。运行模型所需的环境难以配置。深度学习模型通常是由一些框架编写,比如 PyTorch、TensorFlow。由于框架规模、依赖环境的限制,这些框架不适用于生产环境。深度学习模型的结构通常比较庞大,需要大量的算力才能满足实时运行的需求。模型的运行效率需要优化。因为这些难题的存在,模型部署不能靠简单的环境配置与安装完成。经过工业界和学术界数年的探索,模型部署有了一条流行的流水线,即先在深度学习框架中训练原始模型,再转换为中间表示,经过优化后部署在推理引擎运行。这一流水线能解决部署中的两大问题,一是使用框架和推理引擎中间表示,二是通过中间表示的网络结构优化和推理引擎对运算的底层优化,提高模型运算效率。

下图为我们工程化实现的整体框架图:

未命名文件-6

图 5-1 工程化整体框架图

首先对保存下来的pth模型进行处理,剔除梯度,只保存模型的权重,得到后处理过后的pth,然后使用pytorch内置函数导出为onnx格式,将精度格式为fp32的onnx模型分别截断为fp16,量化为int8格式,最后使用onnxruntime推理引擎推导模型。

5.2 模型转换

5.2.1 pth模型的后处理

为了训练过程的方便,在训练过程中保存chekpoints时我们将模型的权重和梯度,当前的学习率,训练轮数一并保存下来了,模型参数的梯度和学习率,当前的训练轮数在模型断点训练时十分有用,但在模型推导时并不会发挥作用,而且还会增加模型存储空间的占用,延长推理时模型的加载时间,所以我们首先对pth模型进行后处理,剔除了对于推理无作用的梯度,只保留模型的权重,以方便后面对pth模型的转换。

5.2.2模型的导出

WechatIMG99

图 5-2 模型转换示意图

在模型导出过程中,我们选用ONNX来进行模型中间表示。ONNX (Open Neural Network Exchange)是 Facebook 和微软在2017年共同发布的,用于标准描述计算图的一种格式。目前,在数家机构的共同维护下,ONNX 已经对接了多种深度学习框架和多种推理引擎。因此,如图4-4所示,ONNX 被当成了深度学习框架到推理引擎的桥梁。就像编译器的中间语言一样,由于各框架兼容性不一,我们通常用ONNX来作为便于在各个主流深度学习框架中迁移模型的中间表达格式。

从Pytorch到ONNX在本质上是一种语言的翻译,但ONNX只记录不考虑控制流的静态图,通过使用trace方法,给定一组输入,再实际执行一遍模型,即把这组输入对应的计算图记录下来,保存为 ONNX 格式。在转换完成后,可使用Netron来可视化ONNX模型,查看包括输入输出和每个算子的信息。每个算子记录的信息包括算子属性、图结构、权重。算子属性信息即图中 attributes 里的信息,对于卷积来说,算子属性包括了卷积核大小(kernel_shape)、卷积步长(strides)等内容。这些算子属性最终会用来生成一个具体的算子。图结构信息指算子节点在计算图中的名称、邻边的信息。根据每个算子节点的图结构信息,就能完整地复原出网络的计算图。权重信息指的是网络经过训练后,算子存储的权重信息。对于卷积来说,权重信息包括卷积核的权重值和卷积后的偏差值。

5.2.3 导出代码

我们使用pytoch自带的torch.onnx.export函数将pth模型导出为onnx格式。

1torch.onnx.export(sdafnet_plus, (person_input, clothes_input),
2saved_model_path,
3do_constant_folding=True, # 是否执行常量折叠优化
4opset_version=16,
5verbose=True, input_names=['person', 'clothes'],
6output_names=['outcome'])
  • torch.onnx.export: 这是调用torch.onnx模块的export函数将PyTorch模型转换为ONNX格式的函数。
  • sdafnet_plus: 这是要转换为ONNX格式的PyTorch模型。
  • saved_model_path: 这是导出的ONNX模型的保存路径。
  • do_constant_folding: 这个参数控制是否在导出时执行常量折叠优化,将模型中的常量计算成一个常量,以减少计算的开销。
  • opset_version: 这个参数指定所使用的ONNX版本号。
  • verbose: 这个参数控制导出过程中是否打印输出。
  • input_names: 这个参数是模型输入的名称,用于在导出模型时标识模型的输入。
  • output_names: 这个参数是模型输出的名称,用于在导出模型时标识模型的输出。

用torch导出的模型有时候参数过多,不利于查看。查找资料onnxsim可以简化模型,让显示更加自然。

如,reshap层的导出,红框中细节参数被显示出现。默认导出:

IMG_256

图 5-3 简化前示意图

使用onnxsim 可以让结构更加简洁,具体执行方式如下:

  1. 安装onnxsim包
  2. pip install onnx-simplifier
  3. 加载onnx文件,simplify处理后重新保存,代码如下:
  4. from onnxsim import simplify
  5. onnx_model = onnx.load(output_path) # load onnx model
  6. model_simp, check = simplify(onnx_model)
  7. assert check, “Simplified ONNX model could not be validated”
  8. onnx.save(model_simp, output_path)
  9. print(‘finished exporting onnx’)
  10. 使用netron对模型进行可视化查看,结果导出如下:

IMG_256

图 5-4 简化后示意图

使用onnxsim工具对导出的onnx模型进行简化,不仅能使onnx模型的结构更加清晰明了,也可以使减少模型大小,对于我们的学生模型而言,经过onnxsim的处理后大概减少了4MB。

5.2.4 Bug修复

在模型转换阶段,我们遇到了pytorch内部torch.repeat_interleave()函数bug,该bug 导致模型导出后某一具体节点维度不匹配,但在模型导出阶段并未提示错误(该bug已由pytorch开发社区解决,预计于之后版本修复)。

我们成功使用上述转换代码将pth模型转换为了onnx 格式,但我们在后续推理中发现onnx模型存在错误,推理时显示multi_add(19)这个节点的输入和输出维度不匹配,经过debug,我们使用netron这个可视化工具可视化导出的onnx模型,找到了出问题的节点,然后与代码中的操作进行匹配,发现是pytoch中torch.repeat_interleave()这个函数的导出出了问题,经过不懈的查找,我们发现这是pytoch发行版中一个仍未解决的bug,这个函数的导出对onnx算子的映射出现了错误,我们在pytorch社区中找到了解决的方法,此bug 2022年12月已被社区解决,但我们当时使用的时候最新的pytorch发行版仍未修正此bug,我们尝试了从github社区的最新pytorch源码重新编译安装以解决此bug,同时我们发现使用tensor.shape,tensor.view与tensor.repeat这几个函数组合以实现和torch.repeat.interleave这个函数一样的功能。

为解决该bug,我们重写了该函数torch.repeat_interleave(),以实现其基本功能。

torch.repeat_interleave()是PyTorch中用于重复张量元素的一个函数。它的输入参数包括:input(类型:torch.Tensor)- 输入张量,repeats(类型:int或torch.Tensor)- 每个元素的重复次数,以及可选参数dim(类型:int)- 重复的维度。

1att_maps = torch.repeat_interleave(att_maps, out_ch, 1)

具体代码修改如下:

 1att_maps_1c = att_maps.shape[0]
 2# 计算变量att_maps的第一维大小,即att_maps_1c
 3 att_maps_2c = att_maps.shape[1]
 4# 计算变量att_maps的第二维大小,即att_maps_2c
 5att_maps_3c = att_maps.shape[2]
 6# 计算变量att_maps的第三维大小,即att_maps_3c
 7att_maps_4c = att_maps.shape[3]
 8# 计算变量att_maps的第四维大小,即att_maps_4c
 9att_maps =att_maps.view(-1, 1, att_maps_3c, att_maps_4c)
10# 将变量att_maps的形状改为(-1, 1, att_maps_3c, att_maps_4c)
11att_maps= att_maps.repeat(1, out_ch, 1, 1).view(att_maps_1c,-1, att_maps_3c, att_maps_4c)
12# 将变量att_maps重复out_ch次,然后改变形状为(att_maps_1c, -1, att_maps_3c, att_maps_4c)

经过测试,我们发现使用tensor.shape,tensor.view与tensor.repeat这几个函数组合实现torch.repeat_interleave()的功能,可以使模型的推导速度加快,此节点的运算速度可以提升约20%。

5.3 模型量化

量化(Quantization)是指将高精度浮点数(如float32)表示为低精度整数(如int8)的过程,从而提高神经网络的效率和性能。

图 5-5 量化示意图

5.3.1 Fp16量化

FP16量化是一种对浮点数进行压缩的技术,将32位浮点数压缩为16位.如图4-4所示,FP16比FP32表示位数减少一半,对模型进行fp16量化可以在不牺牲模型性能的情况下,显著减少模型的存储和计算成本。fp16量化可以将模型中的权重和激活值从32位浮点数减少到16位浮点数,从而减少了模型的内存占用和计算复杂度。此外,fp16量化还可以提高模型的运行速度和功耗效率,特别是在移动设备和嵌入式设备上。

OnnxMlTools是一个用于处理ONNX模型的Python库,它提供了一组工具和API,使用户能够读取、创建、转换、优化和运行ONNX模型。该库支持多种深度学习框架(如TensorFlow、PyTorch、Caffe2等)和多种硬件平台(如CPU、GPU、TPU等),并且可以将ONNX模型转换为其他格式(如TensorFlow、PyTorch、CoreML等)。此外,OnnxMlTools还支持模型的可视化、优化和解析,并且可以在不同的编程语言(如C++、Java、python等)中使用。总之,OnnxMlTools是一个非常强大的工具,可以帮助深度学习开发人员更好地管理和使用ONNX模型。

我们使用OnnxMITools这个库进行fp16量化,实现截断的核心代码:

1import onnxmltools
2from onnxmltools.utils.float16_converter import convert_float_to_float16onnx_model = onnxmltools.utils.load_model(input_onnx_model)
3onnx_model = convert_float_to_float16(onnx_model)
4onnxmltools.utils.save_model(onnx_model, output_onnx_model)

这段代码使用了onnxmltools库中的float16_converter模块,用于将输入的ONNX模型中的浮点数类型转换为半精度浮点数类型。

  • 第1行导入了onnxmltools库。
  • 第2行从onnxmltools.utils.float16_converter模块中导入了convert_float_to_float16函数,用于将浮点数类型转换为半精度浮点数类型,并使用load_model函数加载输入的ONNX模型。
  • 第3行使用convert_float_to_float16函数将ONNX模型中的浮点数类型转换为半精度浮点数类型。
  • 最后使用onnxmltools.utils.save_model函数将转换后的ONNX模型保存到指定的输出路径。

5.3.2 Int8量化

我们在模型量化阶段尝试了FP16和int8两种量化形式,最终比较选择了FP16量化后的模型,这里简短介绍一下我们所做的int8量化工作。Int8量化分为动态量化与静态量化。

ONNXRuntime 中的量化是指 ONNX 模型的 8 bit 线性量化。在量化过程中,浮点实数值映射到 8 bit 量化空间,其形式为:

VAL_fp32 = Scale * (VAL_quantized - Zero_point)

Scale 是一个正实数,用于将浮点数映射到量化空间,计算方法如下:

  • 对于非对称量化:
1scale = (data_range_max - data_range_min) / (quantization_range_max - quantization_range_min)
  • 对于对称量化:
1scale = abs(data_range_max, data_range_min) * 2 / (quantization_range_max - quantization_range_min)

Zero_point 表示量化空间中的零。重要的是,浮点零值在量化空间中可以精确地表示。这是因为许多 CNN 都使用零填充。如果在量化后无法唯一地表示 0,则会导致精度误差。

ONNXRuntime 支持两种模型量化方式:

  • 动态量化:对于动态量化,缩放因子(Scale)和零点(Zero Point)是在推理时计算的,并且特定用于每次激活。因此它们更准确,但引入了额外的计算开销
  • 静态量化:对于静态量化,它们使用校准数据集离线计算。所有激活都具有相同的缩放因子(Scale)和零点(Zero Point)

以下是我们进行动态量化的核心代码:

 1**import** onnxruntime as ort
 2**from** onnxruntime.quantization **import** QuantizationMode, QuantizationParameters
 3model_path = "path/to/your/model.onnx"
 4sess = ort.InferenceSession(model_path)
 5qparams = QuantizationParameters(
 6force_fusions=True,
 7use_external_data_format=False,
 8symmetric_weight=True,
 9symmetric_activation=True,
10weight_scale=0.5,
11activation_scale=0.2,
12quantization_mode=QuantizationMode.IntegerOps
13)

首先通过指定模型路径来创建一个推理会话,然后设置QuantizationParameters的各个参数,包括force_fusions(是否强制融合操作)、use_external_data_format(是否使用外部数据格式)、symmetric_weight(是否对权重进行对称量化)、symmetric_activation(是否对激活进行对称量化)、weight_scale(权重量化的缩放因子)、activation_scale(激活量化的缩放因子)和quantization_mode(量化模式)。最后,这些参数可以用于对模型进行量化。

下面是我们进行静态量化的核心代码:

 1input_model_path = '../onnx/epoch129-batch-1-fp32.onnx' # 输入onnx模型
 2output_model_path = '../onnx/epoch129-batch-1-int8.onnx' # 输出模型名
 3calibration_dataset_path = '../data/VITON/VITON_test/test_img' # 校准人像数据集图像地址
 4cloth_dataset_path = '../data/VITON/VITON_test/clothes' # 校准衣服数据集图像地址
 5# 用于校准数据加载,注意这个方法里面需要做图像一些操作,与pytorch训练的时候加载数据操作一致
 6dr = DataReader(calibration_dataset_path, cloth_dataset_path, input_model_path)
 7# 开始量化
 8quantize_static(input_model_path,
 9output_model_path,
10dr,
11quant_format=QuantFormat.QDQ,
12per_channel=False,
13weight_type=QuantType.QInt8)

5.4 模型推断

推理引擎是一种软件工具,用于运行机器学习模型的推理(预测)过程。它可以将训练好的模型输入到系统中进行推理,通过计算得出模型的预测结果。推理引擎通常具有高效、可扩展、低延迟等特点,能够满足大规模、高并发的推理需求。

ONNX Runtime 是一种高性能、跨平台的推理引擎,它支持多种硬件平台,包括 CPU、GPU 和 FPGA 等,并且可以与多种编程语言和框架(如 C++、Python、TensorFlow、PyTorch 等)进行集成。ONNX Runtime 还支持多种模型格式,包括 ONNX、TensorFlow、Keras、MXNet 等,可以方便地加载和运行各种机器学习模型。

我们选择 ONNX Runtime 作为我们模型推理引擎的主要原因是它具有以下优势:

  • 高性能:ONNX Runtime 采用了多种优化技术,包括 JIT 编译、自动调度、张量融合等,可以在多种硬件平台上获得高效的推理性能。
  • 跨平台:ONNX Runtime 支持多种硬件平台和操作系统,可以方便地在不同的环境中部署和运行。
  • 多框架支持:ONNX Runtime 支持多种机器学习框架和模型格式,可以方便地与不同的工具和库进行集成。
  • 社区支持:ONNX Runtime 是一个开源项目,拥有庞大的社区支持和贡献者,可以获得及时的技术支持和更新。

综上所述,选择 ONNX Runtime 作为推理引擎可以帮助开发者实现高效、跨平台、多框架的机器学习模型部署和推理,所以我们选择onnxruntime作为我们的推理引擎。

2470528-20220307221855862-1121104331

图 5-6 ONNXRuntime 总览

为了使模型实现真正的端到端处理,我们先使用opencv处理输入的图片,使其可以被模型处理。

具体处理逻辑如下,通过调研得知,cv2.dnn.blobFromImage函数可很方便的对图像进行预处理,包括减均值,比例缩放,裁剪,交换通道等,并返回一个4通道的blob,用于神经网络的输入。

 1person_img = cv2.imread(args.input_person)
 2# cv2.imshow('image', person_img)
 3cloth_img = cv2.imread(args.input_cloth)
 4# 读到的是BGR数据,该方法不能读取带中文路径的图像数据。
 5# 对读入的图片裁剪到指定比例
 6ratio = 256.0 / 192.0
 7inp_h, inp_w, _ = person_img.shape
 8current_ratio = inp_h / inp_w
 9**if** current_ratio > ratio:
10center_h = inp_h // 2
11out_h = inp_w * ratio
12start = int(center_h - out_h // 2)
13end = int(center_h + out_h // 2)
14person_img = person_img[start:end, ...]
15**else**:
16center_w = inp_w // 2
17out_w = inp_h / ratio
18start = int(center_w - out_w // 2)
19end = int(center_w + out_w // 2)
20person_img = person_img[:, start:end, :]
21person_img = cv2.dnn.blobFromImage(person_img, 1.0 / 127.5, (192, 256), mean=(127.5, 127.5, 127.5), swapRB=True)
22cloth_img = cv2.dnn.blobFromImage(cloth_img, 1.0 / 127.5, (192, 256), mean=(127.5, 127.5, 127.5), swapRB=True)

ONNX Runtime是直接对接ONNX的跨平台机器学习推理加速器,基于ONNX的模型推断非常方便和高效,ONNXRuntime可以直接读取并运行.onnx文件, 而不需要再把 .onnx 格式的文件转换成其他格式的文件。只需要加载数据和模型,调用runtime进行推理即可。

 1sess_options = onnxruntime.SessionOptions()
 2sess_options.intra_op_num_threads = 4
 3sess_options.execution_mode = onnxruntime.ExecutionMode.ORT_SEQUENTIAL
 4sess_options.graph_optimization_level = onnxruntime.GraphOptimizationLevel.ORT_ENABLE_ALL
 5onnx_session = onnxruntime.InferenceSession(model_path)
 6inputs = (person_img, cloth_img)
 7output_name = onnx_session.get_outputs()[0].name
 8input_name1 = onnx_session.get_inputs()[0].name
 9input_name2 = onnx_session.get_inputs()[1].name
10outputs = onnx_session.run(None, {input_name1: inputs[0], input_name2: inputs[1]})

6 模型部署

我们的模型分别采用了服务器端的Web部署和本地化的可执行程序exe部署两种部署方式,其中服务器端的Web部署我们采用了前后端分离的开发策略,前端使用Vue框架,后端使用Flask框架。同时后端使用Gunicorn容器,前端使用Nginx容器来提高Web应用程序的性能和稳定性。

Web端模型部署在http://47.92.51.188:81/((可通过此链接访问我们的网页:无忧工作室)),本地化的可执行程序也可以从Web页面上获取下载链接。

6.1 web部署整体框架图

图 6-1 Web流程图

6.2 web前端部署

为了更好的展现模型效果,前端页面包括四个部分:首页,试衣体验,视频介绍和软件下载。

在首页,我们将展示自主设计的团队logo及virtual-tryon介绍动画,展示虚拟试衣的技术背景和我们的模型特色。

在试衣体验部分,我们提供现成的测试集供用户体验虚拟试衣,并为用户上传测试数据提供参考,用户可自己选择人物和衣物图进行上传,后台推理程序会返回推理结果并展示给用户。

在视频介绍部分,我们将通过视频的方式介绍虚拟试衣的背景,我们模型的算法以及网页和本地化可执行程序的使用方法,在软件下载部分我们提供可执行的exe程序供用户本地运行。

6.2.1 目录结构与文件

前端部署项目目录结构如下:

图 6-2 前端项目目录结构图

在上图目录结构中:

  • idea目录储存IntelliJ IDEA项目的配置信息。
  • dist目录是打包后的文件,用于服务器端上传部署。
  • jsconfig.json用于配置VS Code的JavaScript语言服务。
  • node_modules:包含项目依赖的所有npm包。
  • public:包含静态资源,如HTML文件、图标和CSS文件。
  • src:包含项目源代码,如Vue组件、JavaScript文件和CSS文件。
  • static:包含静态资源,如图片和视频。
  • vue.config.js:用于配置Vue CLI。

6.2.2 项目构建与打包

(1) 环境配置

安装Node.js,作为前端工程化项目运行的基础环境;安装Vue和Vue CLI,用于快速构建Vue工程项目;安装nrm 镜像管理工具切换镜像并安装npm。

(2) 项目开发

网页基于Vue.js框架进行开发。Vue.js是一款流行的JavaScript前端框架,旨在更好地组织与简化Web开发。Vue所关注的核心是MVC模式中的视图层,同时,它也能方便地获取数据更新,并通过组件内部特定的方法实现视图与模型的交互。

我们通过使用Vue.js的模板用于创建虚拟试衣网站,需要指明的是:

  • TryOn.vue主要定义试衣体验界面展示逻辑与用户交互;
  • WelcomeTo.vue主要定义首页展示与交互;
  • TryOn.vue和WelcomeTo.vue两个文件都存compoents路径下。
  • 在public目录下:编写使用flexBox布局的HTML页面,创建一个垂直滚动的图像列表。创建CSS 文件,定义HTML元素的样式,例如定义元素周围空间,控制元素外观和布局,控制元素背景颜色,显示方式等。
  • 在stitic目录下:存放静态文件,包括示例虚拟试衣数据集,展示视频等。

6.3 web后端部署

后端项目目录如下:

图 6-3 后端项目目录图

在上图目录中:

  • Main.py 为主程序,提供了后端程序的调用,并定义了后端的接口,获取用户上传的图片,经过调用处理后返回给用户生成的试衣图片
  • Process.py 处理文件储存逻辑,返回文件名去除扩展名的部分。
  • onnx目录下储存部署在onnxruntime推理中的FP16量化模型
  • Virtual_TryON.py对输入图片进行裁剪至指定比例,随后设置onnx对话的参数,调用run方法,得到模型的输出结果

6.4 项目服务器环境部署

图 6-4 服务器环境部署

团队选用阿里云centos作为服务器部署端,在配置规则中开放81端口用于服务访问。

在技术选型方面,由于nginx服务器性能优秀,运行稳定,故选择nginx作为前端框架。

(1)环境配置

首先安装nginx前置环境,并上传nginx,修改对应路径名称即可。

(2)配置文件修改

修改nginx.conf配置文件,将监听端口改为81,并将 root和index改为virtual-tryon项目所在dist目录。使用后台启动命令再次启动Nginx,即可完成前端web页面部署。

7 模型测试

7.1 实际效果图展示

在生成图中,可以看到模型对人物和衣服的拟合效果较好,衣物细节得以保留,且能很好的贴合人物身形,在下图中可以发现,我们的模型甚至能对孕妇做出较好的试衣效果,与此同时,我们相较之其他模型,我们的实际效果也极为出色。

需要指出的是,效果展示图中,左一是输入人像,左二是试穿服装,右一是试穿结果。

pictures

图 7-1 效果展示

下面是我们的模型与目前比较出名的backbone(CP-VTON,PFAFN,SDAFN)的效果对比:

a349e1d7d702a6840dae20d1eb33201

7-2a 模型对比图

wps

图 7-2b 模型对比图

7.2 评价指标

根据赛题方的要求,项目采用FID作为模型的评价指标。

需要指明的是,FID指的是Fréchet Inception Distance。其基本思想是直接考虑生成数据和真实数据在feature层次的距离,不再额外的借助分类器,因此来衡量生成图片和真实图片的距离。FID 从原始图像的计算机视觉特征的统计方面的相似度来衡量两组图像的相似度,这种视觉特征是使用 Inception v3 图像分类模型计算的得到的。分数越低代表两组图像越相似,或者说二者的统计量越相似,FID 在最佳情况下的得分为 0.0,表示两组图像相同。

下图为图像失真程度提高与FID分数之间关系:

640

图 7-3 FID与图像失真程度关系

FID的计算公式如下:

Screenshot 2023-04-06 235604

下面的表格为模型的FID指标与一些SOTA模型的比较:

methodsCP-VTONCloth-FlowACGPNSDAFNPF-AFNours
VITON(FID)24.4314.4315.6712.0510.098.75

表 7-1 FID测试指标

可以看出的是,我们的模型的FID较之目前先进的虚拟试衣模型,数据指标都是处于领先地位。

7.3 模型大小分析

我们采用知识蒸馏的方法训练学生模型,在保留高质量生成效果的同时大大减少了模型的参数量,同时通过改变学生模型金字塔特征提取层的层数来调节模型大小,并且我们的模型不依赖于人体解析图等任何辅助信息,不需要其他模型作为辅助,工程化部署的大小只有我们自己一个模型的大小,大大减少了参数量,以下是我们不同精度格式模型的大小以及生成效果的FID指标:

  • 特征提取层为五时,pytorch模型原始大小为143MB,FID指标为9.084
  • 特征提取层为四时,pytorch模型原始大小为104MB,FID指标为8.749,经过我们工程化处理,模型大小控制为53MB(精度格式fp16)
  • 特征提取层为三时,pytorch模型原始大小为64MB,FID指标为9.05,经过我们的工程化处理后,模型大小控制为34.75MB(精度格式为fp16)

在工程化时我们同样进行了模型的int8静态量化,但int8静态量化后的模型生成效果失真较为严重,而特征提取层为三的fp16模型在控制模型大小的同时,仍然保留了高质量的生成效果,所以我们选用34.75MB的fp16模型作为我们最后部署的对象。

7.4 推理速度分析

我们采用了一系列策略来加速我们的推导速度

图 7-4 推理加速策略分析

  • 我们的模型为端到端单任务模型,避免了多任务模型计算开销大的缺点,加快了推导速度,推理时间只相当于PF-AFN一阶段的推理时间。

  • 我们的模型只需要将原始的衣服图像和人的图像作为输入,对数据进行预处理简单,数据预处理只需要将图片进行裁剪和均值归一化,模型推导的预处理时间几乎可以忽略不计,大大加快了我们的推理速度。

  • 我们使用onnxruntime推理引擎推导onnx模型,工程化后也大大加快了我们的推导速度,实现了推理不等待,效果立即出。

  • 推导程序使用多线程编程,最大化的利用cpu硬件条件,提高推理速度。

  • 我们部属的云服务器使用的是阿里云,其使用因特尔至强处理器,openvino推理框架对因特尔至强处理器有特殊的优化,相比onnxruntime推理引擎可以将推导时间缩短20%左右,我们尝试使用openvino推理框架重写推导程序部署在云服务器上,改善我们网页的使用体验(无忧工作室)

8 项目总结

8.1 团队简介与团队文化

8.1.1 团队简介

团队五名成员皆是重点大学本科生,团队成员深知,团队分工情况与团队合作能力直接决定了一个项目或者一项工作的成功或者失败。 每一个成员可以根据自己能力的突出点去承担一部分工作。在每个责任块中,模糊上下级的概念,不存在领导与被领导的关系,而是集思广益、汇聚智慧的新团队合作模式。每个人都有责任义务去完成分内工作,并且在团队成员需要帮助时及时援助,也欢迎每个人提出自己的想法,大家对于不同的想法进行集中讨论,综合实践最后采用最优解法。 在整个工作开展过程中,我们团队自 2022 年 12 月至 2023 年 4 月始终坚持短期,中期,长期多种形式的组内交流会。确保贯穿项目始终能够全体成员进度步调统一,有新思想涌入并发生碰撞,不停审视反思团队近期执行状况,调整团队前进的方向。

8.1.2 团队文化

团队给队伍取名为无忧工作室,首先是我们希望团队所研究的虚拟试衣实验能够切实地为未来虚拟试衣行业做出一定贡献,改善用户的在线购衣体验,让网上购衣不再困难忧心。其次,我们的团队是一个团结友爱的大家庭,不同专业的同学在团队中扮演着不同的角色,有不同的分工,我们共同面对困难,不放弃不退缩,想尽一切办法克服困难完成目标,正是这种团队协作精神,让我们的项目顺利进展,没有后顾之忧。

团队LOGO以无忧工作室开头两个首字母的大写结合而成,寓意无忧工作室是一个紧密结合的整体,团队的成功离不开每个成员的辛苦付出,LOGO右侧以黄底衬出“无忧工作室”五个字,简洁明了,与开头字母相呼应。

8.2 项目规划

8.2.1 进度计划

本项目在2022年12底立项组队,至2023年4月15日提交项目材料,总计约四个月时间。无忧工作室团队的具体进度安排如下表所示:

项目阶段起止时间任务安排
项目选题阶段2022.12.20-2022.1.5赛题调研,结合团队优势选定赛题
技术选型阶段2022.1.5-2022.2.1阅读业内前沿算法相关论文,结合赛题选定技术路线
模型复现阶段2022.2.5-2022.3.1根据论文方法,优化模型结构并训练
模型测试阶段2022.3.1-2022.3.10优化提升模型性能,降低模型大小
web页面设计阶段2023.2.20.1-2023.3.5实现web页面的设计与代码编写
前后端本地部署阶段2023.3.10-2023.3.20前后端代码整合与测试,实现前后端的本地化部署
前后端服务器端部署2023.3.20-2023.3.23实现前后端的服务器端部署与测试
第一次阶段性总结2023.3.23对目前团队工作成果的总结回顾,给出作品后续优化方向
项目优化与文档收集2023.3.23-2023.3.30对总结提出的问题进行解决优化,收集团队汇总开发文档
文档编写与排版2023.4.1-2023.4.5完成项目文档初稿
文档修订与完善2023.4.5-2023.4.10修订完善文档初稿,完成开发文档
PPT编排与Web页面更新2023.4.10-2023.4.14设计实现展示PPT,在web页面上传项目文档
项目提交2023.4.15核验项目所有材料并提交

表 8-1 项目进度安排

8.2.2 开发文档管理

在项目开发期间,团队共编写相关技术文档35篇,总字数超5万字。为实现开发共享与技术交流,团队采用在线工作台模式,形成文档共享知识库,打造体系化的知识管理,极大提高了项目开发和文档编写效率。

8.2.3 团队分工

团队技术结构如下所示:

图 8-1 团队技术结构图

成员分工如下所示:

姓名职务分工介绍
成员1队长团队配置,人员管理,项目进度控制,任务分配 组织小组会议,对关键项目节点(如模型确定)进行评审和决议 主要负责模型部分落地实现 负责各个项目阶段的评审
成员2成员1.参与模型技术选型与论文阅读 2.参与模型训练工作 3.参与数据集收集与扩充 4.负责项目web端部署;参与撰写项目文档
成员3成员参与模型技术选型与论文阅读 负责web前端页面设计与交互 参与编写web框架
成员4成员1参与模型技术选型与论文阅读 2.参与模型架构调整;负责项目文档设计与撰写
成员5成员负责web页面设计 负责页面动画、logo、及页面背景制作 负责ppt设计与展示

表 8-2 成员分工图

8.3项目总结

从22年12月份组队到23年4月份项目提交,团队成员合作无间,分工明确,圆满完成了赛题所需工作,但难免有不足之处,我们的项目仍有以下可以改进和完善之处:

  • 模型大小

目前效果较好的模型为FP6截断版本,大小为56MB,仍有优化空间。可以通过以下方法进一步缩小模型:

(1)剪枝:通过删除模型中的一些权重或神经元来减少模型大小。例如L1正则化、L2正则化、结构化剪枝等。

(2)量化:将模型中的浮点数参数转换为较小的整数,从而减少模型大小。这种方法可以通过使用一些量化算法来实现,例如线性量化、非线性量化、混合精度量化等。

(3)低秩分解:通过将卷积层或全连接层分解为多个较小的矩阵来减少模型大小。这种方法可以通过使用一些低秩分解算法来实现,例如SVD分解、CP分解、Tucker分解等。

  • 模型准确率

(1)增加训练数据量,可以通过数据增强的方式来实现。

(2)调整模型的超参数,学习率、batch size等来调整模型性能。

(3)在模型大小与准确率之间取得较好的平衡。

就目前情况而言,虚拟试衣的应用场景主要是在线电商或数字营销,提升用户感官体验和交互体验。此外,虚拟试衣还可以应用于展厅、展馆、大型商场、超市等场景,吸引流量,快速试衣,让顾客体验到新颖高科技的购物模式,也节省购物时间。在未来,团队会尝试将该项目多方应用结合,助力元宇宙发展,使其与日常生活的融入更加贴近。

9 参考文献

  1. Bertiche, H., Madadi, M., Escalera, S.: Cloth3d: clothed 3d humans. In:European Conference on Computer Vision. pp. 344–359. Springer (2020)

  2. Bhatnagar, B.L., Tiwari, G., Theobalt, C., Pons-Moll, G.: Multi-garment net: Learning to dress 3d people from images. In: Proceedings of the IEEE/CVF international conference on computer vision. pp. 5420–5430 (2019)

  3. Chang, A.X., Funkhouser, T., Guibas, L., Hanrahan, P., Huang, Q., Li, Z.,Savarese, S., Savva, M., Song, S., Su, H., et al.: Shapenet: An information-rich 3d model repository. arXiv preprint arXiv:1512.03012 (2015)

  4. Choi, S., Park, S., Lee, M., Choo, J.: Viton-hd: High-resolution virtual try-on via misalignment-aware normalization. In: Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition. pp. 14131–14140 (2021)

  5. Chopra, A., Jain, R., Hemani, M., Krishnamurthy, B.: Zflow: Gated appearance flow-based virtual try-on with 3d priors. In: Proceedings of the IEEE/CVF InternationalConference on Computer Vision. pp. 5433–5442 (2021)

  6. Dong, H., Liang, X., Shen, X., Wang, B., Lai, H., Zhu, J., Hu, Z., Yin, J.: Towards multi-pose guided virtual try-on network. In: Proceedings of the IEEE/CVF International Conference on Computer Vision. pp. 9026–9035 (2019)

  7. Duchon, J.: Splines minimizing rotation-invariant semi-norms in sobolev spaces. In:Constructive theory of functions of several variables, pp. 85–100. Springer (1977)

  8. Feng, Y., Wu, F., Shao, X., Wang, Y., Zhou, X.: Joint 3d face reconstruction and dense alignment with position map regression network. In: Proceedings of the European conference on computer vision (ECCV). pp. 534–551 (2018)

  9. Ge, C., Song, Y., Ge, Y., Yang, H., Liu, W., Luo, P.: Disentangled cycle consistency for highly-realistic virtual try-on. In: Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition. pp. 16928–16937 (2021)

  10. Ge, Y., Song, Y., Zhang, R., Ge, C., Liu, W., Luo, P.: Parser-free virtual try-on via distilling appearance flows. In: Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition. pp. 8485–8493 (2021)

  11. Gong, K., Liang, X., Zhang, D., Shen, X., Lin, L.: Look into person: Self-supervised structure-sensitive learning and a new benchmark for human parsing. In: Proceedings of the IEEE conference on computer vision and pattern recognition. pp. 932–940 (2017)

  12. Goodfellow, I., Pouget-Abadie, J., Mirza, M., Xu, B., Warde-Farley, D., Ozair, S.,Courville, A., Bengio, Y.: Generative adversarial nets. Advances in neural informationprocessing systems 27 (2014)

  13. G¨uler, R.A., Neverova, N., Kokkinos, I.: Densepose: Dense human pose estimation in the wild. In: Proceedings of the IEEE conference on computer vision and patternrecognition. pp. 7297–7306 (2018)

  14. Han, X., Hu, X., Huang, W., Scott, M.R.: Clothflow: A flow-based model for clothed person generation. In: Proceedings of the IEEE/CVF International Conference on Computer Vision. pp. 10471–10480 (2019)

  15. Han, X., Wu, Z., Wu, Z., Yu, R., Davis, L.S.: Viton: An image-based virtual try-on network. In: Proceedings of the IEEE conference on computer vision and pattern recognition. pp. 7543–7552 (2018)

  16. He, K., Zhang, X., Ren, S., Sun, J.: Deep residual learning for image recognition. In:Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition(CVPR) (June 2016)