首先我们使用的python版本是3.6.5所用到的模块如下:
opencv是将用来进行图像处理和图片保存读取等操作。numpy模块用来处理矩阵数据的运算。pytorch模块是常用的用来搭建模型和训练的深度学习框架,和tensorflow以及Keras等具有相当的地位。json是为了读取json存储格式的数据。PIL库可以完成对图像进行批处理、生成图像预览、图像格式转换和图像处理操作,包括图像基本处理、像素处理、颜色处理等。argparse 是python自带的命令行参数解析包,可以用来方便地读取命令行参数。
网络模型的定义和训练
其中已经训练好的模型地址如下:
https://drive.google.com/open?id=1vQo4xNGdYe2uAtur0mDlHY7W2ZR3shWT。其中需要将其中的模型放到"https://baijiahao.baidu.com/pretrained_checkpoint"目录下。
对于数据集的存放,分为cloth_image(用来存储衣服图片),cloth_mask(用来分割衣服的mask,可以使用grabcut的方法进行分割保存),image(用来存储人物图片),parse_cihp(用来衣服语义分析的图片结果,可以使用[CIHP_PGN](
https://github.com/Engineering-Course/CIHP_PGN)的方法获得)和pose_coco(用来存储提取到的人物姿态特征数据,可以使用openpose进行提取保存为josn数据即可)。
对于模型的训练,我们需要使用到VGG19模型,网络上可以很容易下载到,然后把它放到vgg_model文件夹下。
其中提出的一种基于目标姿态和店内服装图像由粗到细的多阶段图像生成框架,首先是设计了一个解析转换网络来预测目标语义图,该语义图在空间上对齐相应的身体部位,并提供更多关于躯干和四肢形状的结构信息。然后使用一种新的树扩张融合块(tree - block)算法,将空间对齐的布料与粗糙的渲染图像融合在一起,以获得更合理、更体面的结果。其中这个虚拟试穿网络不仅不借助3D信息,可以在任意姿态下将新衣服叠加到人的对应区域上,还保留和增强了显著区域的丰富细节,如布料纹理、面部特征等。同时还使用了空间对齐、多尺度上下文特征聚集和显著的区域增强,以由粗到细的方式各种难题。
(1)其中网络主要使用pix2pix模型,其中的部分代码如下:
class PixelDiscriminator(nn.Module):def__init__(self, input_nc,ndf=64, norm_layer=nn.InstanceNorm2d):super(PixelDiscriminator,self).__init__if type(norm_layer)==functools.partial:use_bias=norm_layer.func==nn.InstanceNorm2delse:use_bias=norm_layer==nn.InstanceNorm2dself.net=nn.Sequential(nn.Conv2d(input_nc, ndf,kernel_size=1, stride=1, padding=0),nn.LeakyReLU(0.2, True),nn.Conv2d(ndf, ndf * 2,kernel_size=1, stride=1, padding=0, bias=use_bias),norm_layer(ndf * 2),nn.LeakyReLU(0.2, True),nn.Conv2d(ndf * 2, 1,kernel_size=1, stride=1, padding=0, bias=use_bias),nn.Sigmoid)defforward(self, input):return self.net(input)class PatchDiscriminator(nn.Module):def__init__(self, input_nc,ndf=64, n_layers=3, norm_layer=nn.InstanceNorm2d):super(PatchDiscriminator,self).__init__if type(norm_layer)==functools.partial: # no need to use biasas BatchNorm2d has affine parametersuse_bias=norm_layer.func==nn.InstanceNorm2delse:use_bias=norm_layer==nn.InstanceNorm2dkw=4padw=1sequence=[nn.Conv2d(input_nc, ndf, kernel_size=kw, stride=2, padding=padw),nn.LeakyReLU(0.2, True)]nf_mult=1nf_mult_prev=1# channel upfor n in range(1,n_layers): # gradually increase thenumber of filtersnf_mult_prev=nf_mult #1,2,4,8nf_mult=min(2 ** n, 8)sequence +=[nn.Conv2d(ndf *nf_mult_prev, ndf * nf_mult, kernel_size=kw, stride=2, padding=padw,bias=use_bias),norm_layer(ndf *nf_mult),nn.LeakyReLU(0.2,True)]# channel downnf_mult_prev=nf_multnf_mult=min(2 ** n_layers,8)sequence +=[nn.Conv2d(ndf *nf_mult_prev, ndf * nf_mult, kernel_size=kw, stride=1, padding=padw,bias=use_bias),norm_layer(ndf *nf_mult),nn.LeakyReLU(0.2, True)]# channel=1 (bct, 1, x, x)sequence +=[nn.Conv2d(ndf *nf_mult, 1, kernel_size=kw, stride=1, padding=padw)] # output 1 channel prediction mapsequence +=[nn.Sigmoid()]self.model=nn.Sequential(*sequence)
(2)生成器部分代码:
--
FROM 117.189.127.*