1 Dressing in Order: Recurrent Person Image Generation for Pose Transfer,Virtual Try-on and Outfit Editing论文介绍
论文标题截图:
这篇文章作者提出了一种按序穿衣、服装试穿图像生成框架。按序穿衣指的是,用户先选择一个模特,可以是自己的照片。然后,按顺序指定要试穿的衣服,例如,先穿T恤,再穿一件衬衫,外面再套一件夹克。
作者主要采用了基于生成对抗网络(GAN)的深度神经网络来实现图像生成任务。相关理论这里就不做介绍了,对原理感兴趣的朋友可以去看看他们的论文。下面主要介绍一下论文中实现的几个有趣的任务。
1.1 姿势变换
如上图所示,生成模型能够在保持原图人物着装不变的情况下,将原图人物的姿势变为姿势图人物的姿势。
1.2 服装试穿
如上图所示,假如你想试穿一下带帽子那位女生的服装,那么你只要把模特图换成你自己的单人照就可以。
1.3 改变衣服款型
如上图所示,生成模型能把原图的短袖变成背心款式。
1.4 纹理变换
如上图所示,生成模型能将原图上衣的纹理变换为用户输入的纹理。
除了上述任务之外,论文还有其它任务,这里就不一一列举了,感兴趣的朋友可以去看看原论文。
2 Virtual try-on PC客户端设计与实现
对于时常网购衣服的用户来说,上述任务中的试穿功能是比较实用的。但是,原论文没有提供图形用户界面来调用这些功能,普通用户操作起来很不方便。为此,我用Qt开发了一个带图形用户界面的客户端程序。但是由于时间关系,只实现了试穿功能。下面就对这个客户端做个介绍。客户端项目源码可以到我的Github下载 。
2.1 客户端操作步骤
Step1:打开客户端可以看到下图所示界面。先从Model标签页选择一张模特图片。
Step2:再点击Garment标签,这个页面虽然显示的也是模特图片,但是这些图片主要是给模型提供服装。也就是说,模型能把模特身上穿的服装分割出来。用户通过勾选图片下方的Top、Bottom复选框来指定是要上身衣服还是下身衣服。Top指上身衣服,Bottom指下身衣服。它们可以从不同图片中选择,也可以取自同一张图片。
Step3:然后用鼠标点击页面下方那个绿色按扭。随后,窗口左侧上方会显示生成结果,左侧下方会显示刚才所选择的短袖和裙子,如下图所示。
不知道你注意到没有,绿色按钮左侧有个复选框<Tuck>,当需要把上衣塞进裤子里面时,可以把它打勾。由于有些上衣本身就是短款,所以即使<Tuck>没打钩,上衣看起来也像是塞进裤子里。
2.2 客户端架构
先上图
如上图所示,客户端主要分为四层。最上层是图形用户界面,它是在QT creator开发环境下用C++开发的。但是,论文作者的图像生成模型项目是用Python写的,所以需要C++能调用Python,这里就需要用到C++调用Python的API。为了调用方便,我把整个调用过程封装成一个类,这个类就是上图所示的C++调用Python接口类,对应项目中的PyCaller类。
此外,原论文作者项目中虽然有测试类供用户调用,但是因为论文涉及的任务比较多,所以类比较复杂,用起来不方便。为此,我仅针对试穿任务另外写了一个Python类,这个类就是上图中所示的神经网络模型调用类,专供C++层调用。
最底层是论文作者的图像生成模型。模型调用成功后会输出生成的图像文件。
2.3 类的设计与思考
2.3.1 标签页面类的设计
如图-1所示,客户端界面主要由两个标签页组成。这两个标签页可分别用两个类来实现。不过,我最初是想能不能只用一个类来实现这两个标签页。后来经过思考,发现这两个页面上的items具有不同的显示逻辑。如图-1所示,在Model标签中,任何时刻只能有一个item被选中。也就是说,当已经有一个item被选中时,如果用户点击了另一个item,那么先前选中的那个item要自动取消选中。而Garment标签的显示逻辑是,允许用户同时选中两个item。在已选中两个item的情况下,如果用户点击了其它的item,则最先选中的那个item要自动取消选中。而且,Model标签和Garment标签中的item内容也不一样。Model标签中的item只需显示一张图片,如图-1所示。而Garment标签中的item除了显示图片,还要显示两个复选框,如图-2所示。
此外,Garment标签页还有一个逻辑,那就是任何时刻只能有一个Top复选框和一个Bottom复选框被勾选。当已经有Top框被勾选时,如果用户再勾选其它Top复选框,那么之前那个已勾选的Top框要取消勾选。考虑到这些不同逻辑,最后还是用两个类分别实现这两个标签页。两个标签页的类图如下所示。
如上图所示,因为两个标签页都需要显示滚动条,所以两个类都继承了QScrollArea类。
2.3.2 C++调用Python类的实现
PyCaller类内容不多,调用python层神经网络模型的代码在try_on函数里面。类成员变量m_pInstance是Python层TryOn类的实例。这个实例只在PyCaller类实例化的时候加载一次,后续调用tryon函数无需重新加载,这样可以节省不少函数运行时间。
2.4 小结
总的来说,这个客户端的主要工作是界面的设计与实现。但是麻雀虽小五脏俱全,一个人做项目,须集需求、UI、开发、运维多个角色于一身,感觉还是有点不容易的。不过,项目完成后也有点成就感。需要项目源码的朋友可以点击这里Dressing-in-order_PC-client下载。
[参考文献]
[1] Cui A, McKee D, Lazebnik S. Dressing in order: Recurrent person image generation for pose transfer, virtual try-on and outfit editing[C]//Proceedings of the IEEE/CVF international conference on computer vision. 2021: 14638-14647.