发明内容
本申请提出虚拟换装方法及装置,根据用户图像的脖子关键点和服装模板图像的衣服关键点,生成用户图像和服装模板图像对应的换装效果图。仅通过对图像中的点或区域进行处理进行虚拟换装,不需要训练模型,减少了运算量,且不会依赖于训练数据,提高了虚拟换装的准确性,换装效果更加自然。
本申请第一方面实施例提出了虚拟换装方法,包括:
获取待换装的用户图像和服装模板图像;
获取所述用户图像对应的脖子关键点和所述服装模板图像对应的衣服关键点;
检测所述用户图像中的脖子是否被遮挡;
若所述用户图像中的脖子被遮挡,则根据所述脖子关键点和所述衣服关键点,利用所述服装模板图像中的脖子区域,生成所述用户图像和所述服装模板图像对应的换装效果图;
若所述用户图像中的脖子未被遮挡,则根据所述脖子关键点和所述衣服关键点,利用所述用户图像中的脖子区域,生成所述用户图像和所述服装模板图像对应的换装效果图。
在本申请的一些实施例中,所述根据所述脖子关键点和所述衣服关键点,利用所述用户图像中的脖子区域,生成所述用户图像和所述服装模板图像对应的换装效果图,包括:
根据所述脖子关键点、所述衣服关键点、所述用户图像和所述服装模板图像,对所述用户图像中的脖子区域进行修复;
根据所述脖子关键点和所述衣服关键点,对所述服装模板图像中的服装区域进行变形处理;
将变形后的所述服装模板图像的服装区域覆盖到修复后的所述用户图像中,得到换装效果图。
在本申请的一些实施例中,所述根据所述脖子关键点、所述衣服关键点、所述用户图像和所述服装模板图像,对所述用户图像中的脖子区域进行修复,包括:
根据所述脖子关键点、所述衣服关键点、所述用户图像和所述服装模板图像,生成所述用户图像中脖子的待修复区域掩膜图像;
若所述待修复区域掩膜图像中待修复区域的面积大于0,则生成所述用户图像对应的背景修复图;
根据所述待修复区域掩膜图像和所述背景修复图,对所述用户图像中的脖子区域进行修复。
在本申请的一些实施例中,所述根据所述脖子关键点、所述衣服关键点、所述用户图像和所述服装模板图像,生成所述用户图像中脖子的待修复区域掩膜图像,包括:
根据所述用户图像,获取所述用户图像中脖子区域对应的脖子掩膜图像;
根据所述脖子关键点、所述衣服关键点和所述服装模板图像,获取所述服装模板图像对应的服装掩膜图像;
根据所述脖子掩膜图像和所述服装掩膜图像,生成所述用户图像中脖子的待修复区域掩膜图像。
在本申请的一些实施例中,所述根据所述用户图像,获取所述用户图像中脖子区域对应的脖子掩膜图像,包括:
检测所述用户图像中的所有人脸关键点;
根据所述人脸关键点,对所述用户图像进行人脸对齐处理;
通过预设语义分割模型从对齐后的所述用户图像中分割出脖子区域;
生成所述脖子区域对应的脖子掩膜图像。
在本申请的一些实施例中,所述根据所述脖子关键点、所述衣服关键点和所述服装模板图像,获取所述服装模板图像对应的服装掩膜图像,包括:
将所述服装模板图像中的所述衣服关键点与所述脖子关键点对齐;
将对齐后的所述服装模板图像确定为服装掩膜图像。
在本申请的一些实施例中,所述根据所述脖子掩膜图像和所述服装掩膜图像,生成所述用户图像中脖子的待修复区域掩膜图像,包括:
根据所述脖子掩膜图像中的脖子关键点和所述服装掩膜图像中的衣服关键点,对所述脖子掩膜图像和所述服装掩膜图像进行拼接,得到拼接掩膜图像;
在所述拼接掩膜图像中确定出从服装领口边缘至脖子区域上边缘的待检测区域;
从所述待检测区域中确定出待修复区域;
生成所述待修复区域对应的待修复区域掩膜图像。
在本申请的一些实施例中,所述从所述待检测区域中确定出待修复区域,包括:
遍历所述待检测区域中每个像素点的归属图像;
筛选出归属图像既不是所述脖子掩膜图像也不是所述服装掩膜图像的所有像素点;
将筛选出的所有像素点所组成的区域确定为待修复区域。
在本申请的一些实施例中,所述从所述待检测区域中确定出待修复区域,包括:
对所述待检测区域中的每列像素,计算同一列像素中领口边缘像素点的纵坐标与脖子区域下边缘的像素点的纵坐标之间的差值;
标记出差值大于零的领口边缘像素点和脖子区域下边缘的像素点;
将标记出的所有像素点的连线围成的区域确定为待修复区域。
在本申请的一些实施例中,所述生成所述用户图像对应的背景修复图,包括:
提取所述用户图像中脖子区域的主颜色;
绘制所述主颜色对应的纯色背景图;
从所述用户图像中扣取出头颈部区域的图像;
将所述头颈部区域的图像覆盖到所述纯色背景图中,得到所述用户图像对应的背景修复图。
在本申请的一些实施例中,所述提取所述用户图像中脖子区域的主颜色,包括:
确定所述用户图像的脖子区域内包含的所有颜色值;
统计所述脖子区域中各颜色值对应的像素点数目;
将像素点数目最多的颜色值确定为所述脖子区域的主颜色。
在本申请的一些实施例中,所述根据所述待修复区域掩膜图像和所述背景修复图,对所述用户图像中的脖子区域进行修复,包括:
将所述待修复区域掩膜图像和所述背景修复图输入预设图像修复网络中,得到所述用户图像对应的修复后图像。
在本申请的一些实施例中,所述根据所述脖子关键点和所述衣服关键点,利用所述服装模板图像中的脖子区域,生成所述用户图像和所述服装模板图像对应的换装效果图,包括:
根据所述用户图像,对所述服装模板图像中的脖子区域进行颜色迁移处理;
根据所述脖子关键点,对所述服装模板图像中的脖子区域进行变形处理;
根据所述脖子关键点和所述衣服关键点,对所述服装模板图像中的服装区域进行变形处理;
将变形后的所述服装模板图像的脖子区域和服装区域覆盖到所述用户图像中,得到换装效果图。
在本申请的一些实施例中,所述根据所述用户图像,对所述服装模板图像中的脖子区域进行颜色迁移处理,包括:
提取所述用户图像中面部皮肤主颜色和第一颈部皮肤主颜色;
根据所述面部皮肤主颜色和所述第一颈部皮肤主颜色,调整所述服装模板图像的脖子区域的颜色。
在本申请的一些实施例中,所述根据所述面部皮肤主颜色和所述第一颈部皮肤主颜色,调整所述服装模板图像的脖子区域的颜色,包括:
计算所述用户图像的第一颈部面积和用户图像的面部面积的比值,并确定所述比值是否位于预设区间内;
若是,则将所述面部皮肤主颜色和所述第一颈部皮肤主颜色进行融合,并根据融合后的主颜色调整所述服装模板图像的脖子区域中每个像素点的UV通道值;
若否,且所述比值大于所述预设区间的上限值,则根据所述第一颈部皮肤主颜色调整所述服装模板图像的脖子区域中每个像素点的UV通道值;
若否,且所述比值小于所述预设区间的下限值,则根据所述面部皮肤主颜色调整所述服装模板图像的脖子区域中每个像素点的UV通道值。
在本申请的一些实施例中,所述将所述面部皮肤主颜色和所述第一颈部皮肤主颜色进行融合,并根据融合后的主颜色调整所述服装模板图像的脖子区域中每个像素点的UV通道值,包括:
分别将所述面部皮肤主颜色和所述第一颈部皮肤主颜色的颜色空间转换至YUV颜色空间下,并获取YUV颜色空间下所述面部皮肤主颜色的UV通道值和所述第一颈部皮肤主颜色的UV通道值;
根据所述面部皮肤主颜色的UV通道值和相应的权重系数,及所述第一颈部皮肤主颜色的UV通道值和相应的权重系数,确定融合主颜色的UV通道值;
将所述服装模板图像的脖子区域中每个像素点的UV通道值均替换为所述融合主颜色的UV通道值。
在本申请的一些实施例中,根据所述第一颈部皮肤主颜色调整所述服装模板图像的脖子区域中每个像素点的UV通道值,包括:
将所述第一颈部皮肤主颜色的颜色空间转换至YUV颜色空间下,并获取YUV颜色空间下所述第一颈部皮肤主颜色的UV通道值;
将所述服装模板图像的颜色空间转换至YUV颜色空间下;
将所述服装模板图像的脖子区域中每个像素点的UV通道值均替换为所述第一颈部皮肤主颜色的UV通道值。
在本申请的一些实施例中,根据所述面部皮肤主颜色调整所述服装模板图像的脖子区域中每个像素点的UV通道值,包括:
将所述面部皮肤主颜色的颜色空间转换至YUV颜色空间下,并获取YUV颜色空间下所述面部皮肤主颜色的UV通道值;
将所述服装模板图像的颜色空间转换至YUV颜色空间下;
将所述服装模板图像的脖子区域中每个像素点的UV通道值均替换为所述面部皮肤主颜色的UV通道值。
在本申请的一些实施例中,所述根据所述面部皮肤主颜色和所述第一颈部皮肤主颜色,调整所述服装模板图像的脖子区域的颜色之前,还包括:
提取所述服装模板图像的第二颈部皮肤主颜色;
根据所述第二颈部皮肤主颜色的亮度值和所述面部皮肤主颜色的亮度值,调整所述服装模板图像的脖子区域中每个像素点的亮度。
在本申请的一些实施例中,根据所述第二颈部皮肤主颜色的亮度值和所述面部皮肤主颜色的亮度值,调整所述服装模板图像的脖子区域中每个像素点的亮度,包括:
根据所述第二颈部皮肤主颜色的亮度值和所述面部皮肤主颜色的亮度值,确定亮度调整参数;
基于所述亮度调整参数调整所述服装模板图像的脖子区域中每个像素点的亮度。
在本申请的一些实施例中,所述根据所述第二颈部皮肤主颜色的亮度值和所述面部皮肤主颜色的亮度值,确定亮度调整参数,包括:
将所述第二颈部皮肤主颜色和所述面部皮肤主颜色的颜色空间均转换至HSV颜色空间下;
分别获取HSV颜色空间下所述面部皮肤主颜色的第一亮度值和所述第二颈部皮肤主颜色的第二亮度值;
根据所述第二亮度值和所述第一亮度值,计算亮度调整参数。
在本申请的一些实施例中,所述根据所述脖子关键点,对所述服装模板图像中的脖子区域进行变形处理,包括:
获取所述服装模板图像中脖子区域的脖子关键点;
根据所述用户图像对应的脖子关键点和所述服装模板图像对应的脖子关键点,确定所述服装模板图像中脖子区域变形前后的坐标映射矩阵;
根据所述脖子区域变形前后的坐标映射矩阵,对所述服装模板图像中的脖子区域进行变形处理。
在本申请的一些实施例中,所述根据所述脖子关键点和所述衣服关键点,对所述服装模板图像中的服装区域进行变形处理,包括:
根据所述脖子关键点和所述衣服关键点,确定所述服装模板图像中服装区域变形前后的坐标映射矩阵;
根据所述坐标映射矩阵对所述服装模板图像中的服装区域进行变形处理。
在本申请的一些实施例中,所述根据所述脖子关键点和所述衣服关键点,确定所述服装模板图像中服装区域变形前后的坐标映射矩阵,包括:
根据所述脖子关键点和所述衣服关键点,计算所述服装模板图像中服装区域变形前后的横坐标映射矩阵;
根据所述脖子关键点和所述衣服关键点,计算所述服装区域变形前后的纵坐标映射矩阵。
在本申请的一些实施例中,所述根据所述脖子关键点和所述衣服关键点,计算所述服装模板图像中服装区域变形前后的横坐标映射矩阵,包括:
根据每个脖子关键点的横坐标,沿水平方向将所述用户图像的宽度划分为多段第一横坐标区间;
根据每个衣服关键点的横坐标,沿水平方向将所述服装模板图像的宽度划分为多段第二横坐标区间,所述第一横坐标区间的数目与所述第二横坐标区间的数目相等;
根据所述多段第一横坐标区间和所述多段第二横坐标区间,利用线性插值和变形坐标映射函数计算所述服装模板图像中服装区域对应的横坐标映射矩阵。
在本申请的一些实施例中,所述根据所述脖子关键点和所述衣服关键点,计算所述服装区域变形前后的纵坐标映射矩阵,包括:
根据所述脖子关键点和所述衣服关键点,计算所述服装区域中每个横坐标对应的纵坐标的缩放系数;
根据所述服装模板图像的高度、所述服装区域每个坐标点的纵坐标及每个纵坐标对应的缩放系数,利用变形坐标映射函数计算所述服装区域对应的纵坐标映射矩阵。
在本申请的一些实施例中,所述根据所述脖子关键点和所述衣服关键点,计算所述服装区域中每个横坐标对应的纵坐标的缩放系数,包括:
根据每个脖子关键点的横坐标,沿水平方向将所述用户图像的宽度划分为多段第一横坐标区间;
根据所述服装模板图像的高度、所述脖子关键点和所述衣服关键点,分别计算每个衣服关键点的纵坐标对应的缩放系数;
根据所述多段第一横坐标区间和每个衣服关键点的纵坐标对应的缩放系数,利用线性插值和变形坐标映射函数计算所述服装区域中每个横坐标对应的纵坐标的缩放系数。
在本申请的一些实施例中,所述根据所述脖子关键点和所述衣服关键点,计算所述服装区域中每个横坐标对应的纵坐标的缩放系数之前,还包括:
对所述服装模板图像中所述服装区域进行整体缩放处理,缩放后所述服装模板图像中领口边界线上纵坐标最大的关键点与所述用户图像中锁骨区域位于脖子竖直中轴线上的关键点重合;
重新计算整体缩放处理后所述服装模板图像中的每个衣服关键点。
在本申请的一些实施例中,所述对所述服装模板图像中所述服装区域进行整体缩放处理,包括:
根据所述服装模板图像的高度、所述服装模板图像中领口左右两侧边界线的交点的纵坐标以及所述用户图像中锁骨区域位于脖子竖直中轴线上的脖子关键点的纵坐标,计算整体缩放系数;
根据所述服装模板图像的高度、所述服装区域每个坐标点的纵坐标及所述整体缩放系数,利用变形坐标映射函数计算所述服装区域在整体缩放处理前后的纵坐标映射矩阵。
在本申请的一些实施例中,所述重新计算整体缩放处理后所述服装模板图像中的每个衣服关键点,包括:
保持整体缩放处理后每个衣服关键点的横坐标不变;
根据所述服装模板图像的高度、所述整体缩放系数及整体缩放处理前每个衣服关键点的纵坐标,分别计算整体缩放处理后每个衣服关键点的纵坐标。
在本申请的一些实施例中,所述根据所述服装模板图像的高度、所述服装区域每个坐标点的纵坐标及每个纵坐标对应的缩放系数,利用变形坐标映射函数计算所述服装区域对应的纵坐标映射矩阵,包括:
根据所述服装模板图像的高度、所述整体缩放处理前后的纵坐标映射矩阵及每个纵坐标对应的缩放系数,利用变形坐标映射函数计算所述服装区域对应的最终的纵坐标映射矩阵。
在本申请的一些实施例中,所述根据所述坐标映射矩阵对所述服装模板图像中的服装区域进行变形处理,包括:
根据所述坐标映射矩阵包括的横坐标映射矩阵,通过预设变形算法对所述服装模板图像中的服装区域进行水平方向的变形处理;
根据所述坐标映射矩阵包括的纵坐标映射矩阵,通过所述预设变形算法对所述服装区域进行竖直方向的变形处理。
在本申请的一些实施例中,在将变形后的所述服装模板图像覆盖到所述用户图像的步骤之前,还包括:
获取所述用户图像中的头发区域的分类结果;
若所述分类结果为长发往后披类别,则根据所述服装模板图像中的衣服区域与所述头发区域判定是否需要对所述头发区域进行变形处理;
若是,则对所述用户图像中的所述头发区域进行变形处理。
在本申请的一些实施例中,所述根据所述服装模板图像中的衣服区域与所述头发区域判定是否需要对所述头发区域进行变形处理,包括:
逐列遍历所述衣服区域与所述头发区域之间相邻边缘的纵坐标差;
从所述纵坐标差中获取最大纵坐标差;
如果所述最大纵坐标差小于预设值,则确定不需要对头发区域进行变形处理;
如果所述最大纵坐标差大于所述预设值,则确定需要对头发区域进行变形处理;
其中,所述纵坐标差为所述衣服区域边缘的纵坐标减去所述头发区域下边缘的纵坐标。
在本申请的一些实施例中,所述对所述用户图像中的所述头发区域进行变形处理,包括:
将所述用户图像的人脸区域向头顶方向膨胀,以得到保护区域;
利用所述头发区域和所述保护区域确定待处理区域;
沿与所述头顶方向相反的方向对所述用户图像上的所述待处理区域进行变形处理,得到头发变形后的用户图像。
在本申请的一些实施例中,所述沿与所述头顶方向相反的方向对所述用户图像上的所述待处理区域进行变形处理,得到头发变形后的用户图像,包括:
获取所述待处理区域上每列对应的变形系数;
根据所述待处理区域上每列对应的变形系数,沿与所述头顶方向相反的方向对所述用户图像上的待处理区域进行变形处理,得到头发变形后的用户图像。
在本申请的一些实施例中,所述根据所述待处理区域上每列对应的变形系数,沿与所述头顶方向相反的方向对所述用户图像上的待处理区域进行变形处理,包括:
获取所述待处理区域上每列的最大纵坐标和最小纵坐标;
针对所述待处理区域上每列,根据所述列的最大纵坐标、最小纵坐标以及变形系数,确定所述列的变形后纵坐标;
根据所述待处理区域上每列的变形后纵坐标、最小纵坐标、最大纵坐标,对所述用户图像上的待处理区域进行变形处理。
在本申请的一些实施例中,所述获取所述待处理区域上每列对应的变形系数,包括:
获取所述头发区域上每列的最大纵坐标和最小纵坐标,以及获取所述衣服区域上每列的最小纵坐标;
针对所述头发区域上每列,利用头发区域上所述列的最大纵坐标和最小纵坐标、衣服区域上所述列的最小纵坐标,确定所述列对应的变形系数;
其中,所述待处理区域的列与所述头发区域的列相同。
在本申请的一些实施例中,所述根据所述待处理区域上每列的变形后纵坐标、最小纵坐标、最大纵坐标,对所述用户图像上的待处理区域进行变形处理,包括:
分别利用所述用户图像的宽度和高度生成第一map矩阵和第二map矩阵,以由所述第一map矩阵和所述第二map矩阵表示用户图像的横坐标和纵坐标之间的映射关系;
根据所述待处理区域上每列的变形后纵坐标、最小纵坐标、最大纵坐标进行线性插值,以更新所述第二map矩阵;
利用所述第一map矩阵和更新后的第二map矩阵对所述用户图像上的待处理区域进行变形处理。
在本申请的一些实施例中,所述利用所述头发区域和所述保护区域确定待处理区域,包括:
对所述头发区域和所述保护区域之间进行集合相减操作,以得到待处理区域。
在本申请的一些实施例中,所述检测所述用户图像中的脖子是否被遮挡,包括:
根据所述用户图像中目标区域的占比确定待检测图像;
将所述待检测图像输入已训练的脖子遮挡检测模型,以由所述脖子遮挡检测模型判定所述待检测图像中的脖子是否被遮挡。
在本申请的一些实施例中,所述根据所述用户图像中目标区域的占比确定待检测图像,包括:
检测所述用户图像中包含脖子的人脸区域作为目标区域;
确定所述目标区域的面积与所述用户图像的面积之间的占比;
如果所述占比超过占比阈值,则将所述用户图像确定为待检测图像;
如果所述占比未超过占比阈值,则从所述用户图像中抠取所述目标区域,并对抠取出的目标区域进行尺寸放大后确定为待检测图像。
在本申请的一些实施例中,所述脖子遮挡检测模型包括第一分支网络、第二分支网络、融合模块、以及输出层,所述第一分支网络与所述第二分支网络并行且独立执行;
由所述脖子遮挡检测模型判定所述待检测图像中的脖子是否被遮挡,包括:
通过所述脖子遮挡检测模型中的第一分支网络对所述待检测图像进行第一预设卷积处理,得到第一特征图;
通过所述脖子遮挡检测模型中的第二分支网络对所述待检测图像进行第二预设卷积处理,得到第二特征图;
通过所述脖子遮挡检测模型中的融合模块对所述第一特征图和所述第二特征图进行通道融合,得到融合特征图;
通过所述脖子遮挡检测模型中的输出层基于所述融合特征图获得脖子是否被遮挡的判定结果。
在本申请的一些实施例中,所述第一分支网络包括第一深度可分离卷积层和第一上采样层;
通过所述脖子遮挡检测模型中的第一分支网络对所述待检测图像进行第一预设卷积处理,得到第一特征图,包括:
通过第一深度可分离卷积层包含的一个卷积核对所述待检测图像的一个通道进行特征提取,得到单通道特征图;
通过第一上采样层包含的预设数量通道1*1卷积核对所述单通道特征图进行升维处理,得到第一特征图。
在本申请的一些实施例中,所述第二分支网络包括下采样层、第二深度可分离卷积层和第二上采样层;
通过所述脖子遮挡检测模型中的第二分支网络对所述待检测图像进行第二预设卷积处理,得到第二特征图,包括:
通过所述下采样层包含的单通道的1*1卷积核对所述待检测图像进行降维处理,得到单通道特征图;
通过第二深度可分离卷积层包含的一个卷积核对所述单通道特征图进行特征提取,得到提取特征后的单通道特征图;
通过第二上采样层包含的预设数量通道1*1卷积核对提取特征后的单通道特征图进行升维处理,得到第二特征图。
在本申请的一些实施例中,通过所述脖子遮挡检测模型中的融合模块对所述第一特征图和所述第二特征图进行通道融合,得到融合特征图,包括:
通过所述融合模块中的通道拼接层对所述第一特征图和所述第二特征图按通道进行特征图叠加,得到通道叠加后的特征图;
通过所述融合模块中的通道混合层对通道叠加后的特征图的通道叠加顺序进行打乱,得到融合特征图。
在本申请的一些实施例中,所述脖子遮挡检测模型的训练过程如下:
获取数据集,所述数据集中的样本包含正样本和负样本;
遍历所述数据集中的每一样本,将当前遍历的样本输入预先构建的脖子遮挡检测模型,以由所述脖子遮挡检测模型对所述样本进行脖子遮挡与否的预测并输出预测结果;
利用所述预测结果、正负样本平衡系数、以及样本数量平衡系数计算损失值;
在所述损失值的变化率大于变化阈值时,根据所述损失值优化所述脖子遮挡检测模型的网络参数,并调整所述正负样本平衡系数和所述样本数量平衡系数,并继续执行遍历所述数据集中的每一样本的过程,直至所述损失值的变化率低于变化阈值结束。
在本申请的一些实施例中,在获取数据集之后,所述方法还包括:
对所述数据集中的每一样本每进行一种数据增强处理,并将处理后的样本添加到所述数据集中,以扩充所述数据集。
在本申请的一些实施例中,所述调整所述正负样本平衡系数和所述样本数量平衡系数,包括:
如果所述损失值大于预设阈值,则将所述正负样本平衡系数和所述样本数量平衡系数均增大第一步长;
如果所述损失值小于预设阈值,则将所述正负样本平衡系数和所述样本数量平衡系数均增大第二步长;
其中,所述第一步长大于所述第二步长。
在本申请的一些实施例中,所述获取所述用户图像对应的脖子关键点之前,还包括:
确定样本图中由标注的脖子关键点与参考点决定的直线所具有的实际斜率;
将所述样本图输入预先构建的脖子关键点检测模型,以由所述脖子关键点检测模型进行学习,并输出脖子关键点;
利用模型输出的脖子关键点、标注的脖子关键点、以及所述实际斜率计算损失值;
在所述损失值大于预设值时,根据所述损失值优化所述脖子关键点检测模型的网络参数,并继续执行将所述样本图输入预先构建的脖子关键点检测模型的过程,直至所述损失值低于预设值结束。
在本申请的一些实施例中,所述确定样本图中由标注的脖子关键点与参考点决定的直线所具有的实际斜率,包括:
获取数据集,所述数据集中的每一样本图均包含用户头像;
针对所述数据集中每一样本图,定位所述样本图中的脖子区域;
检测所述脖子区域与衣服接触边缘的中间点确定为参考点;
在所述样本图上标注脖子关键点,并确定由标注的脖子关键点与所述参考点决定的直线所具有的实际斜率。
在本申请的一些实施例中,所述在所述样本图上标注脖子关键点,包括:
利用预设斜率确定一条经过所述参考点的直线;
将所述直线与所述脖子区域边缘之间的交点作为一个脖子关键点标注在所述样本图上;
将所述直线进行水平翻转,并将翻转后的直线与所述脖子区域边缘之间的交点作为另一个脖子关键点标注在所述样本图上;
对所述样本图上标注的脖子关键点进行微调。
在本申请的一些实施例中,所述定位所述样本图中的脖子区域,包括:
将所述样本图输入预设的分割模型,以由所述分割模型对所述样本图进行语义分割;
将语义分割结果为脖子的像素所组成的区域确定为脖子区域。
在本申请的一些实施例中,所述利用模型输出的脖子关键点、标注的脖子关键点、以及所述实际斜率计算损失值,包括:
获取模型输出的脖子关键点与标注的脖子关键点之前的位置误差;
根据所述位置误差和所述实际斜率确定损失权重;
确定携带模型输出的脖子关键点的样本图向量信息与携带标注的脖子关键点的样本图向量信息之间的欧式距离;
利用所述损失权重和所述欧式距离计算损失值。
在本申请的一些实施例中,所述方法还包括:
获取多个原始人物图像;
基于预设语义分割模型和预设抠图模型,对每个原始人物图像中各人体区域进行标注,得到训练数据集;
构建基于注意力机制的分割模型的网络结构;
根据所述训练数据集,对所述分割模型的网络结构进行训练,得到用于进行人体区域分割的图像分割模型;
通过所述图像分割模型对所述用户图像和所述服装模板图像进行人体区域分割。
在本申请的一些实施例中,所述基于预设语义分割模型和预设抠图模型,对每个原始人物图像中各人体区域进行标注,得到训练数据集,包括:
基于所述原始人物图像,采用预设语义分割模型获得所述原始人物图像各人体区域的语义分割结果;
通过预设抠图模型对所述原始人物图像对应的语义分割结果进行修正;
根据修正后的语义分割结果,标注所述原始人物图像中的各人体区域;
将标注后的原始人物图像存储在训练数据集中。
在本申请的一些实施例中,通过预设抠图模型对所述原始人物图像对应的语义分割结果进行修正,包括:
通过预设抠图模型对所述原始人物图像进行抠图处理,划分出所述原始人物图像的前景像素区域和背景像素区域;
若抠图结果指示第一像素点为背景像素,且所述语义分割结果指示所述第一像素点为前景像素,则将所述第一像素点的语义分割结果修正为背景像素;
若抠图结果指示所述第一像素点为前景像素,且所述语义分割结果指示所述第一像素点为背景像素,则确定距离所述第一像素点最近且与所述第一像素点的语义分割结果不同的目标像素点,将所述目标像素点的语义分割结果确定为所述第一像素点的语义分割结果。
在本申请的一些实施例中,所述基于所述原始人物图像,采用预设语义分割模型获得所述原始人物图像各人体区域的语义分割结果,包括:
计算对所述原始人物图像和预设语义分割模型的预设标准图像进行人脸对齐操作所要使用的仿射变换矩阵;
基于所述仿射变换矩阵对所述原始人物图像进行矩阵变换,得到所述原始人物图像对应的变换后图像;
基于所述原始人物图像和所述变换后图像,采用预设语义分割模型获得所述原始人物图像对应的语义分割结果
在本申请的一些实施例中,基于仿射变换矩阵对原始人物图像进行矩阵变换,得到所述原始人物图像对应的变换后图像,包括:
将所述仿射变换矩阵进行分解,分别得到旋转矩阵、平移矩阵及缩放矩阵;
分别基于所述旋转矩阵、所述平移矩阵及所述缩放矩阵对所述原始人物图像进行旋转、平移变换及缩放变换,得到第一变换后图像;
基于所述缩放矩阵和预设放大倍数的所述缩放矩阵对应的图像尺寸分别对所述第一变换后图像进行裁剪,得到多个第二变换后图像。
在本申请的一些实施例中,所述基于所述原始人物图像和所述变换后图像,采用预设语义分割模型获得所述原始人物图像对应的语义分割结果,包括:
基于所述原始人物图像和所述第二变换后图像,采用语义分割模型分别获得所述原始人物图像各人体区域的语义分割结果和各第二变换后图像各人体区域的语义分割结果;
根据各第二变换后图像各人体区域的语义分割结果对所述原始人物图像各人体区域的语义分割结果进行修正,获得所述原始人物图像对应的语义分割结果。
在本申请的一些实施例中,所述根据各第二变换后图像各人体区域的语义分割结果对所述原始人物图像各人体区域的语义分割结果进行修正,获得所述原始人物图像对应的语义分割结果,包括:
确定所述原始人物图像和各第二变换后图像的分割结果置信度;所述分割结果置信度与所在图像的尺寸成反比例关系;
对于原始人物图像的每个像素点,确定其所在的原始人物图像和/或各第二变换后图像的分割结果置信度,
将对应分割结果置信度最高的语义分割结果作为该像素点的语义分割结果。
在本申请的一些实施例中,所述将标注后的原始人物图像存储在训练数据集中,包括:
通过数据增强库对所述标注后的原始人物图像进行数据增强,得到增强数据集;
对增强数据集中的部分图像进行多尺度的随机裁剪,得到所述训练数据集。
在本申请的一些实施例中,根据所述训练数据集对基于注意力机制的分割模型进行训练,得到用于对人物图像进行分割的图像分割模型,包括:
将训练数据集中的样本图像输入基于注意力机制的分割模型,得到样本图像的分割结果;
根据每个样本图像的分割结果和标注信息,计算当前训练周期的整体损失值;
通过优化器和学习率调度器对每个周期训练后的基于注意力机制的分割模型进行优化。
在本申请的一些实施例中,所述计算当前训练周期的整体损失值,包括:
根据每个样本图像的分割结果和标注信息,通过交叉熵损失函数计算当前训练周期的交叉熵损失值;
根据每个样本图像的分割结果和标注信息,通过Dice损失函数计算所述当前训练周期的的Dice损失值;
根据所述交叉熵损失值和所述Dice损失值计算当前训练周期的整体损失值。
本申请第二方面的实施例提供了一种虚拟换装装置,包括:
图像获取模块,用于获取待换装的用户图像和服装模板图像;
关键点获取模块,用于获取所述用户图像对应的脖子关键点和所述服装模板图像对应的衣服关键点;
脖子遮挡检测模块,用于检测所述用户图像中的脖子是否被遮挡;
生成模块,用于若所述脖子遮挡检测模块检测出所述用户图像中的脖子被遮挡,则根据所述脖子关键点和所述衣服关键点,利用所述服装模板图像中的脖子区域,生成所述用户图像和所述服装模板图像对应的换装效果图;若所述脖子遮挡检测模块检测出用户图像中的脖子未被遮挡,则根据所述脖子关键点和所述衣服关键点,利用所述用户图像中的脖子区域,生成所述用户图像和所述服装模板图像对应的换装效果图。
本申请第三方面的实施例提供了一种电子设备,包括存储器、处理器及存储在所述存储器上并可在所述处理器上运行的计算机程序,所述处理器运行所述计算机程序以实现上述第一方面所述的方法。
本申请第四方面的实施例提供了一种计算机可读存储介质,其上存储有计算机程序,所述程序被处理器执行实现上述第一方面所述的方法。
本申请实施例中提供的技术方案,至少具有如下技术效果或优点:
在本申请实施例中,确定了用户图像中的脖子关键点和服装模板图像中的衣服关键点,对用户图像和服装模板图像中的头发区域、脸部区域、脖子区域、衣服区域等人体区域进行了分割。基于这些处理对用户图像的脖子区域进行修复,对服装模板图像中的衣服区域进行变形、对头发区域进行变形等操作,实现将服装模板图像中的衣服区域覆盖到用户图像中得到很好的换装效果。或者,对服装模板图像中的脖子区域进行颜色迁移,对服装模板图像中的脖子区域和衣服区域进行变形,对头发区域进行变形等操作,实现将服装模板图像中的脖子区域和衣服区域覆盖到用户图像中得到很好的换装效果。
本申请附加的方面和优点将在下面的描述中部分给出,部分将从下面的描述中变的明显,或通过本申请的实践了解到。
具体实施方式
下面将参照附图更详细地描述本申请的示例性实施方式。虽然附图中显示了本申请的示例性实施方式,然而应当理解,可以以各种形式实现本申请而不应被这里阐述的实施方式所限制。相反,提供这些实施方式是为了能够更透彻地理解本申请,并且能够将本申请的范围完整的传达给本领域的技术人员。
需要注意的是,除非另有说明,本申请使用的技术术语或者科学术语应当为本申请所属领域技术人员所理解的通常意义。
下面结合附图来描述根据本申请实施例提出的虚拟换装方法及装置。
虚拟换装是指将用户图像与服装模板图像结合,获得穿着服装模板图像中的衣服的新用户图片。相关技术中的虚拟换装方法,通常根据大量数据训练虚拟换装模型,通过训练得到的虚拟换装模型来进行换装。但是训练模型运算量很大,且模型容易依赖训练数据集,当测试数据与训练数据差异较大时,通过虚拟换装模型进行换装的效果很差。
基于此,本申请实施例提供了一种虚拟换装方法,该方法不通过网络模型进行虚拟换装,而是通过对用户图像和服装模板图像进行图像处理,生成对应的换装效果图。因此无需训练模型,减少了运算量。而且不会因模型依赖于训练数据集而降低换装效果,确保每次虚拟换装操作都具有很好的换装效果。
参见图1,该方法具体包括以下步骤:
步骤101:获取待换装的用户图像和服装模板图像。
在虚拟换装场景中,获取用户图像和服装模板图像。其中,用户图像可以为包括用户头颈部区域及脖子以下部分身体区域的图像,头颈部区域包括头部区域和脖子区域。服装模板图像中包括服装图像,该服装图像包括完整的领口区域及部分或完整的领口以下衣服区域。
步骤102:获取用户图像对应的脖子关键点和服装模板图像对应的衣服关键点。
首先通过预设人脸关键点检测模型检测用户图像中的所有人脸关键点,检测的人脸关键点包括用户图像中人物面部轮廓、眼睛、鼻子、嘴部、眼睛、眉毛等部位的人脸关键点。
本申请实施例中预先设置了标准人脸图像,并标注了该标准人脸图像中的所有预设标准人脸关键点。该标准人脸图像可以为五官无遮挡且两眼中心点连线与水平线平行的图像。根据用户图像对应的人脸关键点和预设标准人脸关键点,对用户图像进行人脸对齐。即将用户图像中的人脸关键点与预设的标准人脸图像中的预设标准人脸关键点对齐,具体可以将用户图像中五官的多个人脸关键点与预设的标准人脸图像中对应的标准人脸关键点对齐。例如,将用户图像的两个嘴角处、鼻尖、左右眼中心及两个眉毛中心的人脸关键点分别与预设的标准人脸图像中的对应的人脸关键点对齐。
将用户图像与预设的标准人脸图像对齐后,通过预先训练的脖子关键点检测模型来检测用户图像中的脖子关键点,该脖子关键点包括左右两侧脖子边界线与肩部相接处的两个关键点及锁骨区域位于脖子竖直中轴线上的一个关键点。如图2所示的用户图像中,脖子关键点包括左右两侧脖子边界线与肩部相接处的两个关键点p2_d和p3_d,以及锁骨区域位于脖子竖直中轴线上的关键点p1_d。
服装模板图像中也可以包括模特人脸图像,通过模特穿着服装模板的图像,用户能够更加直观地看出服装模板的穿着效果。本申请实施例预先通过预设人脸关键点检测模型检测出服装模板图像中的模特人脸图像的所有人脸关键点,在该服装模板图像中预先标注这些人脸关键点,将标注的这些人脸关键点称为预标注的虚拟人脸关键点。根据服装模板图像中预标注的虚拟人脸关键点和上述标准人脸图像中的预设标准人脸关键点,对服装模板图像进行对齐处理。即通过拉伸变形操作将服装模板图像中多个预标注的虚拟人脸关键点与对应的预设标准人脸关键点对齐。
服装模板图像中还预标注了多个衣服关键点,该衣服关键点可以包括领口左右两侧边界线的两个端点和左右两侧边界线的交点,如图3所示。以服装模板图像的左上角顶点为原点,以服装模板图像的宽为x轴,以服装模板图像的高为y轴,如图3所示,则获取的衣服关键点可以包括领口边界线左右两侧纵坐标最小的两个关键点和领口边界线上纵坐标最大的一个关键点,即图3中的p2_o、p3_o和p1_o。
将服装模板图像与预设的标准人脸图像对齐之后,根据服装模板图像中预标注的衣服关键点,从对齐处理后的服装模板图像中确定出对齐后的衣服关键点。即对齐后,依据服装模板图像中预标注的衣服关键点和对齐处理过程中的拉伸程度,重新计算对齐后每个衣服关键点的坐标。
在本步骤中将用户图像和服装模板图像均与预设的标准人脸图像对齐,使用户图像和服装模板图像中服装区域的位置姿态均符合换装处理的要求,避免因二者位置姿态相差较大导致换装效果差的情况。且本步骤中获取的脖子关键点的数目和衣服关键点的数目相等,且脖子关键点的数目和衣服关键点的数目均至少可以为3个点,本申请确定的关键点数目较少,利用很少的关键点即可完成虚拟换装,减少了计算量。
上述用于检测脖子关键点的脖子关键点检测模型的训练过程包括以下步骤A1-A5的操作。
A1:确定样本图中由标注的脖子关键点与参考点决定的直线所具有的实际斜率。
其中,通常脖子属于连接人脸与人体的关键器官,其与人体之间具有一定几何约束关系,即脖子两边相对脖子的竖直中轴线左右对称,因此通过在脖子的左右两边分别标注一个关键点,便可以决定脖子相对人脸的位置。
在一种可能的实现方式中,在获取到数据集后,针对数据集中每一样本图,定位出样本图中的脖子区域,并检测脖子区域与衣服接触边缘的中间点确定为参考点,然后在样本图上标注脖子关键点,并确定由标注的脖子关键点与参考点决定的直线所具有的实际斜率。
其中,脖子区域与衣服接触边缘的中间点可以为锁骨区域位于脖子竖直中轴线上的一个关键点。上述以参考点在样本图上标注的脖子关键点可以包括左右两侧脖子边界线与肩部相接处的两个关键点。
数据集中的每一样本图均包含用户头像,通过将脖子区域与衣服接触边缘的中间点作为参考点,脖子两边分别标注的两个脖子关键点与参考点之间会形成一个等腰三角约束关系,因此通过计算标注的脖子关键点与参考点之间的实际斜率,可以为后续的损失计算提供约束条件,以提升模型的鲁棒性。
针对定位样本图中的脖子区域的过程,在一可选的实施例中,通过将样本图输入预设的分割模型,以由分割模型对样本图进行语义分割,并将语义分割结果为脖子的像素所组成的区域确定为脖子区域。
其中,通过使用语义分割模型进行脖子区域定位,可以确保脖子区域的精度。示例性的,分割模型可以采用HRNet分割模型。
针对在样本图上标注脖子关键点,在一可选的实施例中,通过利用预设斜率确定一条经过该参考点的直线,并将该直线与脖子区域边缘之间的交点作为一个脖子关键点标注在样本图上,然后再将该直线进行水平翻转,并将翻转后的直线与脖子区域边缘之间的交点作为另一个脖子关键点标注在样本图上,最后再对样本图上标注的脖子关键点进行微调,从而完成样本图的标注。
其中,预设斜率为标注样本前根据实践预先设置的一个斜率,通过利用几何约束和斜率计算标注脖子关键点后再进行微调,可以节省标注工作量。
如图4所示,脖子区域与衣服接触边缘的中间点O,以O点为原点建立直角坐标系,利用点O和预设斜率k确定一条直线m,该直线m与脖子区域边缘之间的交点B作为一个脖子关键点,将直线m进行水平翻转后得到直线m’,将直线m’与脖子区域边缘之间的交点A作为另一个脖子关键点。
由于图像拍摄环境影响,由几何约束,斜率计算标注的脖子关键点可能存在标注误差,因此再通过人工对样本图上标注的脖子关键点进行微调后,完成样本图的最终标注。
需要补充说明的是,样本图上最终标注的脖子关键点为经过微调后的点,因此由标注的脖子关键点与参考点决定的直线具有的实际斜率与预设斜率之间存在差距。
需要进一步补充说明的是,在样本图上标注脖子关键点之后,还可以对数据集中的样本图每进行一种数据增强处理,将处理后的样本图添加到数据集中,以扩充数据集,提升模型性能。
其中,数据增强种类可以包括裁剪、翻转、变形、颜色变换、光照变换等。
A2:将样本图输入预先构建的脖子关键点检测模型,以由脖子关键点检测模型进行学习,并输出脖子关键点。
A3:利用模型输出的脖子关键点、标注的脖子关键点、以及实际斜率计算损失值。
在一种可能的实现方式中,通过获取模型输出的脖子关键点与标注的脖子关键点之前的位置误差,并根据该位置误差和实际斜率确定损失权重,然后确定携带模型输出的脖子关键点的样本图向量信息与携带标注的脖子关键点的样本图向量信息之间的欧式距离,并利用该损失权重和该欧式距离计算损失值。
其中,根据位置误差和实际斜率计算损失权重的计算公式如下:
Yn=K1*Y1+K2*Y2 (公式1)
上述公式1中,K1和K2分别为位置误差和实际斜率的权重占比,在训练过程中动态调整,Y1和Y2分别表示位置误差和实际斜率。由此可见,位置误差和实际斜率按照比例进行结合,生成最终的损失权重Yn。
携带模型输出的脖子关键点的样本图向量信息与携带标注的脖子关键点的样本图向量信息之间的欧式距离计算公式如下:
上述公式2中,a表示携带模型输出的脖子关键点的样本图向量信息,b为携带标注的脖子关键点的样本图向量信息。
利用损失权重和欧式距离计算损失值的计算公式如下:
上述公式3中,M为样本个数,N为每个样本的特征点个数,本发明中,N=2,Y
n为特征点的损失权重,
为第m个样本中第n个特征点的欧氏距离。由此可见,在计算出损失权重后,结合像素的欧氏距离即可得到最终的损失。
A4:在损失值大于预设值时,根据损失值优化脖子关键点检测模型的网络参数,并继续执行步骤A2的过程。
对于网络参数的优化过程,可以使用Adamw优化器进行优化。
A5:在损失值小于预设值时,停止训练流程。
需要补充说明的是,对于模型训练结束条件,还包含有其他指标条件,例如模型的精确率高于一定数值,召回率高于一定数值的条件,等等。
在训练数据准确阶段,通过获取标注出的脖子关键点与参考点之间的实际斜率,在训练阶段,通过使用这个实际斜率、预测结果、标注结果进行损失计算,以提升模型检测的鲁棒性和准确性。并且该模型专用于脖子关键点的检测,可以精准地预测出图像中的脖子关键点,以为后续对人脸进行的相关操作提供基础,使得人脸与脖子衔接恰当。
通过上述步骤A1-A5的操作训练得到脖子关键点检测模型之后,即可利用该脖子关键点检测模型来检测用户图像中的脖子关键点。服装模板图像中也可以包括模特的头颈部区域及服装区域,因此也可以利用脖子关键点检测模型来检测服装模板图像中的脖子区域的脖子关键点。
在利用脖子关键点检测模型检测用户图像的脖子关键点之前,可以先对接收到的用户图像进行预处理。具体地,通过对用户图像进行预设种类的数据增强处理,并确定处理后的用户图像中包含脖子的人脸区域面积占处理后的用户图像的比例,如果该比例超过预设比例,说明图像中包含脖子的人脸区域占比比较高,可以直接通过脖子检测模型来对用户图像进行检测。如果该比例未超过预设比例,说明用户图像中包含脖子的人脸区域占比低,模型有可能无法检测,则从用户图像中抠取包含脖子的人脸区域,并对抠取出的人脸区域进行尺寸放大,通过脖子关键点检测模型对放大后的人脸区域图像进行检测,以提升脖子关键点检测的准确性。
其中,通过对原始的用户图像进行预设种类的数据增强处理可以提升模型检测的鲁棒性。示例性的,该预设种类的数据增强处理可以是翻转、变形、颜色变换、光照变换等。
在一些实施例中,脖子关键点检测模型的模型结构如图5所示,通过卷积模块对待检测图像进行卷积操作,以得到基础特征图,通过线性运算层对基础特征图进行线性运算,以得到与基础特征图相似的重影特征图,通过脖子关键点检测模型中的输出层根据基础特征图和重影特征图进行脖子关键点预测。其中,待检测图像可以为用户图像或者从用户图像中抠取出的人脸区域图像放大后的图像。
其中,线性运算属于简单运算,其计算量很少,通过使用卷积模块与线性运算层的结合得到所有特征图,相对单独使用卷积操作得到相同数量特征图,具有轻量高效的特点。
在本申请的另一些实施例中,对用户图像和服装模板图像进行最终的换装操作之前,还对用户图像和服装模板图像进行人体区域分割操作,具体通过如下步骤B1-B5来进行分割。
B1:获取多个原始人物图像。
获取大量原始人物图像,每个原始人物图像中可以包括一个或多个人物区域,对于包括多个人物区域的原始人物图像,从该原始人物图像中分别截取出每个人物区域的图像,得到多个仅包括一个人物区域的原始人物图像。在截取人物区域的图像时可以仅上半身包含人脸、颈部及身体的人物图像。
具体地,原始人物图像可以是网上公开的人物图像,也可以是通过图像拍摄装置获取的人物图像,本实施例对此不做具体限定。
B2:基于预设语义分割模型和预设抠图模型,对每个原始人物图像中各人体区域进行标注,得到训练数据集。
通过上述方式获得多个原始人物图像后,可基于每个原始人物图像,采用预设语义分割模型获得所述原始人物图像各人体区域的语义分割结果。其中,预设语义分割模型可以为face-parsing模型,该模型不仅可以对人脸进行解析,准确识别五官,也可以为人体其他部分进行识别,采用该语义分割模型对人物图像进行语义分割,可快速获得较为准确人体各部位分割结果。本实施例对预设语义分割模型不做具体限定,只要其能够对原始人物图像的人体各部位进行分割即可。
可先通过预设的五官关键点检测模型检测得到该原始人物图像的多个五官关键点,根据预设标准五官关键点和该原始人物图像的多个五官关键点,获取使原始人物图像和预设标准图像进行人脸对齐所要应用的仿射变换矩阵。该预设标准图像通常为对预设语义分割模型进行训练所使用的图像,该预设标准图像的尺寸可以根据具体的预设语义分割模型进行确定。例如,对于face-parsing模型,预设标准图像的尺寸通常为512*512,也可以为224*224或226*226等。本实施例对检测的五官关键点的具体数目不做具体限定,其可以是106个或117个等。另外也可以对原始人物图像的人脸关键点进行检测,只要能够使原始人物图像和上述预设尺寸的第一图像进行对齐操作即可。
其中,预设标准五官关键点可以包括预设的左眼标准中心点、右眼标准中心点、鼻尖标准点、左嘴角标准点和右嘴角标准点等。将检测的该原始人物图像的多个五官关键点中包括的左眼中心点、右眼中心点、鼻尖点、左嘴角点和右嘴角点等分别与预设标准五官关键点包括的左眼标准中心点、右眼标准中心点、鼻尖标准点、左嘴角标准点和右嘴角标准点等进行一一对齐。例如,将该原始人物图像上的左眼中心点与左眼标准中心点对齐,将该原始人物图像上的右眼标准中心点与右眼标准中心点对齐,等等。
获得上述仿射变换矩阵之后,可基于该仿射变换矩阵对所述原始人物图像进行矩阵变换,以使原始人物图像和上述预设标准图像进行人脸对齐,以便于应用预设语义分割模型对原始人物图像进行语义分割。
具体地,可以先将所述仿射变换矩阵进行分解,以分别得到旋转矩阵、平移矩阵及缩放矩阵。然后,可以先基于平移矩阵和旋转矩阵对原始人物图像分别进行平移变换和旋转变换,其产生的误差相对较小,之后再对平移和旋转变换后的图像进行缩放变换,而缩放变换通常产生的误差相对较大。如此,先进行误差较小的平移变换和旋转变换,再进行误差较大的缩放变换,可有效降低整体变换的叠加误差,从而有效保障变换后图像的真实度。
需要说明的是,上述先进行平移变换和旋转变换,再进行缩放变换的方案只是本实施例的较佳实施方式,本实施例并不以此为限,在实际应用中,可基于旋转矩阵、平移矩阵及缩放矩阵,采用任意顺序对原始人物图像进行矩阵变换。
本实施例将原始人物图像基于上述旋转矩阵、所述平移矩阵及所述缩放矩阵进行变换后,得到第一变换后图像,该第一变换后图像可与上述预设标准图像的人脸对齐。
在得到上述第一变换后图像之后,为了得到较好的语义分割结果,可以基于一定的规律对该第一变换后图像进行裁剪,以得到一系列不同尺寸的变换后图像,然后对原始人物图像和对应的一系列变换后图像分别进行语义分割,得到该原始人物图像的语义分割结果(可记为初始语义分割结果)和对应的一系列变换后图像的语义分割结果,并根据该原始人物图像对应的一系列变换后图像的语义分割结果对其初始语义分割结果进行修正,得到该原始人物图像的语义分割结果。
在本实施例中,可基于所述缩放矩阵和预设放大倍数的所述缩放矩阵对应的图像尺寸对所述第一变换后图像进行裁剪,得到一系列不同尺寸的第二变换后图像。具体地,如图6,基于缩放矩阵对应的图像尺寸,也就是预设标准图像的尺寸,对第一变换后图像进行裁剪,可以得到图6中的中心位置最小的图像。然后基于该缩放矩阵对应的图像尺寸,按照预设放大倍数进行多次放大,直至下次放大后的图像尺寸大于原始人物图像的尺寸,如此得到多个图像尺寸,每次均比上次放大相同的倍数,采用该多个图像尺寸分别对第一变换后图像进行裁剪,即可对应每个原始人物图像得到一系列不同尺寸的第二变换后图像。
得到上述一系列不同尺寸的第二变换后图像之后,可基于所述原始人物图像及其对应的第二变换后图像,采用预设语义分割模型获得所述原始人物图像对应的语义分割结果。
采用预设语义分割模型,先基于所述原始人物图像和其对应的第二变换后图像,分别获得所述原始人物图像各人体区域的初始语义分割结果和各第二变换后图像各人体区域的语义分割结果。具体地,可依次将原始人物图像和其对应的第二变换后图像输入预设语义分割模型,得到的模型输出结果即语义分割结果。
然后,可根据各第二变换后图像各人体区域的语义分割结果对所述原始人物图像各人体区域的语义分割结果进行修正,获得所述原始人物图像对应的语义分割结果,以使得原始人物图像的语义分割结果更加准确。
基于原始人物图像的初始语义分割结果和其对应的各第二变换后图像各人体区域的语义分割结果,对于原始人物图像的每个像素点,确定其所在的原始人物图像和/或各第二变换后图像的分割结果置信度,所述分割结果置信度与所在图像的尺寸成反比例关系。
如图6,最小尺寸(即缩放矩阵对应的图像尺寸)的第二变换后图像,其可对应原始人物图像行业每一个第二变换后图像分别得到一个语义分割结果,而每一个语义分割结果可对应一个分割结果置信度。该分割结果置信度用于表示分割结果的可信度或准确度,在上述得到的所有第二变换后图像中,图像尺寸越小越接近预设分割模型训练使用的图像尺寸,所以,图像尺寸越小的第二变换后图像对应的分割结果置信度越高。
在确定原始人物图像和各第二变换后图像的分割结果置信度之后,对于原始人物图像的每个像素点,可确定其所在位置,即位于哪个或哪几个第二变换后图像上。如图6中,位于最小尺寸的第二变换后图像上的每个像素点,均同时位于所有图像(包括原始人物图像和每一个第二变换后图像)上。而位于最小尺寸的第二变换后图像外,且位于其它尺寸(图中预设放大倍数的缩放矩阵对应的图像尺寸)的第二变换后图像上的每个像素点,可位于原始人物图像和某个或某几个第二变换后图像上。而位于所有第二变换后图像之外的像素点,则仅位于原始人物图像上。
上述原始人物图像的每个像素点位于几个图像(包括变换后图像和原始人物图像)上,则对应几个分割结果置信度,可将对应分割结果置信度最高的语义分割结果作为该像素点的语义分割结果,以进一步提高预设语义分割模型对原始人物图像的语义分割结果准确度。
在一些实施方式中,鉴于语义分割模型的局限性,其可能存在一些客观误差,本实施例为进一步提高对原始人物图像的语义分割结果准确度,可通过其它识别模型或分类模型对上述原始人物图像的语义分割结果进行进一步的修正。例如,可通过抠图模型的抠图结果对上述原始人物图像对应的语义分割结果进行修正。需要说明的是,本实施例可不限于采用抠图模型的抠图结果对原始人物图像对应的语义分割结果进行修正,只要是能对人物图像的各部位进行准确分类,以能够对语义分割结果进行修正即可。
通常情况下,抠图模型能够准确识别前景像素区域和背景像素区域。即,将原始人物图像输入抠图模型,经过抠图模型的抠图处理,可准确划分出所述原始人物图像的前景像素区域和背景像素区域。
采用预设抠图模型对所述原始人物图像对应的语义分割结果进行修正时,若某一像素点的抠图结果和语义分割结果不一致,则将抠图结果作为该像素点的语义分割结果。
具体地,若抠图结果指示第一像素点为背景像素,而所述语义分割结果指示所述第一像素点为前景像素,则将所述第一像素点的语义分割结果修正为背景像素。若抠图结果指示所述第一像素点为前景像素,而所述语义分割结果指示所述第一像素点为背景像素,则确定距离所述第一像素点最近且与所述第一像素点的语义分割结果不同的目标像素点,将所述目标像素点的语义分割结果确定为所述第一像素点的语义分割结果。
在完成对原始人物图像对应的语义分割结果进行修正后,可根据修正后的语义分割结果,标注所述原始人物图像中的各人体区域。
本实施例中,为进一步提高颈部和身体(衣服)之间的分割准确度,标注同学可利用pixelannotationtools对上述多个原始人物图像进行进一步修正,具体可对衣服语义信息进行调整,将所有衣服的区域,即去掉头和脖子的剩下区域,均标记为身体,以得到标注有面部、颈部和身体的语义分割数据。
可将上述标注后的原始人物图像存储在训练数据集中,以用于对基于注意力机制的分割模型构建的网络结构进行模型训练。
本实施例中,在获得上述标注后的原始人物图像后,可通过数据增强库对所述标注后的原始人物图像进行数据增强,得到增强数据集。
具体地,可使用数据增强效果较好的数据增强应用库albumentations对原始人物图像进行增强,数据增强应用库albumentations基于高度优化的OpenCV库,其处理速度较快,可实现原始人物图像的快速数据增强。且支持同时转换图像、面具、关键点和包围框,更易于扩展到其他任务。而针对不同的图像处理任务,如分割,检测等,可以提供特有的API接口,更易于实现数据集的个性化定制。且易于添加到其它框架,比如PyTorch,尤其是在医学图像处理上效果较好。
另外,虽然使用统一尺寸的图片,更容易训练模型。但这样训练得到的模型鲁棒性会差一些,如果待分割的图片和训练使用的图片宽高比有差异,图片语义范围有差异,比如只有人脸部分,或只有脖子衣服部分。模型推理结果表现不够好。故,本实施例对增强数据集中的部分图像进行多尺度的随机裁剪,以得到更多宽高比不同、图片语义范围差异性较大的图像,并基于上述增强数据集及经过多尺度的随机裁剪后的结果,得到上述用于对基于注意力机制的分割模型构建的网络结构进行模型训练的训练数据集。
B3:构建基于注意力机制的分割模型的网络结构。
本实施例旨在构建准确度更高、处理速度更快的图像分割模型,基于该目的,对现有能够用于图像分割的网络结构进行分析研究,研究结果发现,基于注意力机制的分类网络,将其作为backbone(骨干网络),不仅可以进行分类,还可以进行目标检测、语义分割的模型迁移学习等,且该基于注意力机制的分类网络进行语义分割的效果要明显优于很多同类型网络结构,所以,本实施例基于注意力机制的网络结构来构建用于对人物图像进行人体分割的分割模型,以期达到更加准确、处理速度更快的人物图像分割结果。
本实施例在构建上述分割模型的网络结构时,采用了transformer模型的改进模型Swin-transformer模型,该Swin-transformer模型采用transformer模型的基本网络结构,且为了得到更好的图像分割结果和更加高效的图像分割模型,对ransformer模型的网络结构做了以下改进:1)引入CNN(Convolutional Neural Networks,卷积神经网络)中常用的层次化构建方式构建层次化Transformer。2)引入locality思想(局部敏感,即空间中距离较近的点映射后发生冲突的概率高,空间中距离较远的点映射后发生冲突的概率低),对无重合的window区域(无重叠数据的区域)内进行self-attention计算。
本实施例的图像分割模型的具体的网络架构采用金字塔结构或者层级结构,即将模型分成不同的层(stage)。如图7,该Swin-transformer模型的网络结构可包括图像输入层、像素块划分(Patch Partition)层以及四个计算层。其应用过程如下:
首先将人物图像自图像输入层输入至像素划分层中进行像素分块,通常每4x4相邻的像素为一个Patch,然后在通道(channel)方向展平(flatten)。以RGB三通道,尺寸[H,W,3]的人物图像为例,每个patch有4x4=16个像素,然后每个像素有R、G、B三个值,展平后是16x3=48,所以通过Patch Partition后,人物图像的shape(形状尺寸)由[H,W,3]变成了[H/4,W/4,48]。
然后进行第一层计算,先通过线性嵌入(Linear Embeding)层对每个像素的channel数据做线性变换,由每个像素B值由48变成C,即输出的人物图像的shape再由[H/4,W/4,48]变成[H/4,W/4,C]。再堆叠两个Swin Transformer Block。
然后再进行第二层计算,先通过一个Patch Merging(像素合并)层进行下采样,用于缩小分辨率,调整通道数进而形成层次化的设计,同时也能节省一定运算量。假设输入Patch Merging的是一个4x4大小的单通道特征图(feature map),Patch Merging会将每个2x2的相邻像素划分为一个patch,然后将每个patch中相同位置(同一颜色)像素给拼在一起就得到了4个feature map。接着将这四个feature map在深度方向进行concat拼接,然后在通过一个LayerNorm层。最后通过一个全连接层在feature map的深度方向做线性变化,将feature map的深度由C变成C/2。通过这个简单的例子可以看出,通过Patch Merging层后,feature map的高和宽会减半,深度会翻倍。然后,再堆叠两个Swin TransformerBlock,每次下采样可设为两倍,则在行方向和列方向上,间隔2选取像素。然后拼接在一起作为一整个张量,最后展开,此时通道数是原先的4倍,通过全连接层调整,使得通道数变为原来的2倍,输出的人物图像的shape再由[H/4,W/4,C]变成[H/4,W/4,2C]。
依次进行第三层计算及第四层计算,第三层计算和第四层计算与第二层计算基本相同,可设置堆叠相同或不同个数的Swin Transformer Block。
上述Swin Transformer Block的结构如图8,可以为图8中两种结构中的任意一种,也可以两种结构堆叠应用。其中,进入到第一个Block中的过程包括:首先特征图(上一层的输出数据)经过一个Layer Norm(LN)层,然后经过W-MSA(Windows Multi-head Self-Attention),之后进行一个连接;连接后的特征图再次经过Layer Norm层,然后经过全连接层MLP,之后进行一个连接。之后进入到第二个Block中,与进入到第一个Block的过程类似,特征图先经过一个Layer Norm层,然后经过SW-MSA,之后进行一个连接,连接后的特征图再次经过Layer Norm层,然后经过全连接层MLP,之后进行一个连接。
其中,W-MSA可以将特征图按照M*M(例如,M=2)大小划分成多个Windows,然后单独对每个Windows内部进行Self-Attention,以减少计算量。SW-MSA(Shifted WindowsMulti-Head Self-Attention,进行偏移的W-MSA),与W-MSA不同的地方在于SW-MSA存在滑动,滑动的距离可以为win_size/2。这里W-MSA和SW-MSA可以成对使用,假设第L层使用的是W-MSA,第L+1层使用的是SW-MSA,则该两个模型窗口(Windows)发生了偏移(可以理解成窗口从左上角分别向右侧和下方各偏移了若干像素)。从而能够使第L层的两个窗口信息进行交流。
需要说明的是,本实施例上述获取训练数据集的步骤(B1和B2)和构建分割模型的网络结构的步骤(B3)的具体实施顺序不做具体限定,即也可以先进行步骤B3,构建基于注意力机制的分割模型的网络结构,然后再进行步骤B1和步骤B2,其不影响对模型训练的结果。
B4:根据训练数据集,对分割模型的网络结构进行训练,得到用于进行人体区域分割的图像分割模型。
在构建了上述分割模型的网络结构之后,可以采用上述训练数据集中的数据对该模型结构进行训练,以得到分割结果准确度更高、分割效率更大的图像分割模型。
每个训练周期从训练数据集中获取的样本图像的数目可以为多个。可以将获取的样本图像输入构建的Swin Transformer模型中,该Swin Transformer模型中顺次连接的各层结构用于提取样本图像中的特征,并基于提取出的特征图像进行self-attention计算,得到样本图像的分割结果。
在一些实施方式中,样本图像中仅标注了身体和头颈标签。相对应地,分割结果中可仅包括样本图像中各区域的属于身体或属于头颈的概率。
根据上述每个样本图像的分割结果和标注信息,计算当前训练周期的整体损失值。具体地,鉴于在只有前景和背景的情况下,小目标一旦有部分像素预测错误,就会导致loss大幅度的变动,从而导致梯度变化剧烈,训练不稳定等原因,若仅应用交叉熵损失函数,则对小目标是十分不利,因此,本实施例在应用原始损失函数交叉熵损失函数之外,还使用Generalized Dice损失函数对上述Swin Transformer模型进行训练。且Dice损失和交叉熵损失可以设置预设比例,如1:1。
本实施例根据每个样本图像的分割结果和标注信息,通过交叉熵损失函数包括的公式(1)计算当前训练周期的交叉熵损失值。根据每个样本图像的分割结果和标注信息,通过Dice损失函数包括的公式(2)计算所述当前训练周期的的Dice损失值;然后,根据所述交叉熵损失值和所述Dice损失值,通过公式(3)计算当前训练周期的整体损失值。
Ltotal=λ1Lce+λ2Lgd (3)
上述公式(1)和(2)中,L
ce表示交叉熵损失值,L
gd表示Generalized Dice损失值,N表示总的像素位置数,i表示像素位置,c表示标注类别(分割结果),m表示总标注类别数,p
ic表示第i个位置的分割结果,y
ic表示第i个位置的真实标注类别,
表示第i个位置预测为真实标注类别的概率,λ
1和λ
2分贝表示L
ce和L
gd的权重(本实施例中λ
1=1,λ
2=1)。
在原有loss的基础上,引入了人像检测中每一项分割的检测权重w,每个类别的权重
根据像素面积占比进行计算,如此,可平衡各类(包括背景类)目标区域对loss的贡献。
为了进一步优化上述Swin Transformer模型,本实施例还通过优化器和学习率调度器对每个周期训练后的基于注意力机制的分割模型进行优化。具体地,可使用流行的Adamw优化器,其更容易训练出和SGD+Moment等同的模型性能,SGD+Moment需要复杂的调参。通过余弦退火学习率使模型跳出局部最优解,从而训练得到更好的模型。其中,学习率调度器公式可如公式(4)。
上述公式(4)中,ηmin表示最小学习率,ηmax表示最大学习率,Tcur为上次学习率重置后的epochs(训练轮数),Ti表示经过多少epochs(训练轮数)后学习率进行重置,当Tcur=Ti时,设置ηt=ηmin,当学习率重置后,Tcur=0时,设置ηt=ηmax。
B5:通过图像分割模型对用户图像和服装模板图像进行人体区域分割。
对于用户图像和服装模板图像,可以进行图像对齐、去噪等预处理操作,然后将用户图像和服装模板图像输入通过上述训练的图像分割模型中,该图像分割模型对输入的用户图像和服装模板图像进行图像分割,并输出用户图像和服装模板图像中各像素点属于各人体区域类别的概率。
在一种实现方式中,训练的该图像分割模型仅输出各像素点属于人体各区域的概率,人体各区域包括身体和头颈部,若某个像素点属于身体的概率大于0.5,则表明该像素点为身体区域的像素点。若某个像素点属于头颈部的概率小于0.5,则表明该像素点属于的人体区域不是身体区域,而是头颈部区域。
在本申请实施例中,对用于对人物图像进行图像分割的图像分割模型进行训练时,采用了基于预设语义分割模型和预设抠图模型对每个训练数据集的原始人物图像中各人体区域进行标注预处理,可以较为准确地确定原始人物图像的个人体部位的类别,因此该标注过程可以大幅度提高图像标注效率及标注准确性,从而有效提高训练数据集的获取效率。采用基于该标注过程获得的训练数据对基于注意力机制的分割模型的网络结构进行训练,可以提高训练得到的图像分割模型的图像分割速度和准确度,从而对于距离人脸较远的颈部和身体部位也能得到很好的分割效果。
在本申请的另一些实施例中,在对用户图像和服装模板图像进行最终的换装操作之前,还分别从用户图像和服装模板图像中抠取出人像,将抠取的人像以外的背景图像替换为预设背景图像。
在虚拟换装场景中,可能会对换装后人像所处的背景有特殊要求,如在证件照的虚拟换装场景下,可能要求换装效果图中的图像背景为蓝色、白色或红色的纯色背景。分别从用户图像和服装模板图像中抠取出人像之后,将用户图像中除抠取的人像以外的背景图像替换为预设背景图像。同样地,将服装模板图像中抠取的人像以外的背景图像替换为预设背景图像。
通过上述方式获得用户图像对应的脖子关键点以及服装模板图像对应的衣服关键点,并对用户图像和服装模板图像进行人脸对齐处理,并分别从用户图像和服装模板图像中分割出了脸部区域、头发区域、脖子区域、身体区域等人体区域。还从用户图像和服装模板图像中抠取出人像,并进行背景图像的替换。完成这些操作之后,即可利用用户图像和服装模板图像进行虚拟换装。
在虚拟换装场景中,利用用户图像中用户自己的脖子区域进行换装,换装后用户的脸部与自己的脖子在颜色和亮度上都是最自然的,换装效果会很好。但是实际应用中用户图像中的脖子区域可能会被遮挡,导致无法使用用户图像中的脖子区域进行换装,只能使用服装模板图像中模特的脖子区域进行换装。
针对这种情况,在通过本步骤进行最终的换装操作之前,还通过如下步骤103的操作来检测用户图像中的脖子是否被遮挡。
步骤103:检测用户图像中的脖子是否被遮挡,如果否,则执行步骤104,如果是,则执行步骤105。
本申请实施例训练了能够检测脖子区域是否被遮挡的脖子遮挡检测模型,具体训练过程包括:
D1:获取数据集,该数据集中的样本包含正样本和负样本。
其中,正样本指的是脖子未被遮挡,负样本指的是脖子被遮挡,例如样本中的脖子被头发或者衣服之类物体遮挡。
需要补充说明的是,在获取到包含正样本和负样本的数据集后,可以对数据集中的每一样本每进行一种数据增强处理,并将处理后的样本添加到数据集中,以扩充数据集,提升模型性能。
其中,数据增强种类可以包括裁剪、翻转、变形、颜色变换、光照变换等。
D2:遍历数据集中的每一样本,将当前遍历的样本输入预先构建的脖子遮挡检测模型,以由脖子遮挡检测模型对样本进行脖子遮挡与否的预测并输出预测结果。
D3:利用预测结果、正负样本平衡系数、以及样本数量平衡系数计算损失值。
其中,损失函数的计算公式如下:
Loss(pt)=-α(l-pt)ylog(pt) (公式1)
在上述公式1中,α表示正负样本平衡系数,0<α1,γ表示样本数量平衡系数,0<γ<5,pt表示模型预测输入样本属于正样本的概率。
需要说明的是,α和γ属于超参数,在优化网络参数的同时,也需要对这两个超参数进行更新,以起到平衡各类样本对损失计算的贡献。
由上述公式1可以看出,由于α为小于1的参数,用来平衡正负样本比例不均的问题,可以将概率较大时的损失值拉小;由于γ为大于0的参数,对于正样本,如果概率越小,表示属于难分类样本,其损失越大,因此通过γ可以减少易分类样本的影响,使得模型更关注难分类样本,起到平滑作用。
其中,通过正负样本平衡系数可以解决训练过程中正负样本不平衡的问题,通过样本数量平衡系数可以解决训练过程中难易样本不平衡的问题,从而通过使用正负样本平衡系数和样本数量平衡系数进行损失计算可以保证loss不会大幅度变动,使得模型训练能够稳定收敛。
D4:在损失值的变化率大于变化阈值时,根据损失值优化脖子遮挡检测模型的网络参数,并调整正负样本平衡系数和样本数量平衡系数,并继续执行步骤D2的过程。
其中,脖子遮挡检测模型的网络参数的优化可以采用预设优化器进行优化,例如Adamw优化器。
在一种可能的实现方式中,对于正负样本平衡系数和样本数量平衡系数的调整过程,可以通过设置一个阈值来调整两个系数的调整步长,即如果损失值大于预设阈值,则将正负样本平衡系数和样本数量平衡系数均增大第一步长,如果损失值小于预设阈值,则将正负样本平衡系数和样本数量平衡系数均增大第二步长。
其中,第一步长大于第二步长,也就是说,损失值比较高时,两个系数的调整幅度比较大,损失值比较低时,两个系数的调整幅度变小。
D5:在损失值的变化率小于变化阈值时,结束训练流程。
本领域技术人员可以理解的是,对于模型训练结束条件,还包含有其他指标条件,例如模型的精确率高于一定数值,召回率高于一定数值的条件,这些指标条件均属于常规模型训练结束条件,并不形成对本发明保护范围的限定。
至此完成模型训练过程,由于通过正负样本平衡系数可以解决训练过程中正负样本不平衡的问题,通过样本数量平衡系数可以解决训练过程中难易样本不平衡的问题,因此通过使用正负样本平衡系数和样本数量平衡系数进行损失计算可以保证loss不会大幅度变动,使得模型训练能够稳定收敛。
训练得到脖子遮挡检测模型后,通过如下步骤E1和E2的操作来检测用户图像中的脖子区域是否被遮挡。
E1:根据用户图像中目标区域的占比确定待检测图像。
其中,待检测图像为适合脖子遮挡检测模型准确预测的输入图像。
在一种可能的实现方式中,通过检测用户图像中包含脖子的人脸区域作为目标区域,并确定目标区域的面积占所述用户图像的面积之间的占比,如果该占比超过占比阈值,说明图像中包含脖子的人脸占比高,背景影响小,可以直接将所述用户图像确定为待检测图像,如果该占比未超过占比阈值,说明图像中包含脖子的人脸占比低,背景影响大,模型有可能无法准确检测,则从所述用户图像中抠取目标区域,并对抠取出的目标区域进行尺寸放大后确定为待检测图像,以提升模型检测准确性。
需要补充说明的是,在确定待检测图像之前,可以通过对用户图像进行预设种类的数据增强处理,以提升模型检测的鲁棒性。
示例性的,该预设种类可以是翻转、变形、颜色变换、光照变换等。
E2:将待检测图像输入已训练的脖子遮挡检测模型,以由脖子遮挡检测模型判定待检测图像中的脖子是否被遮挡。
脖子遮挡检测模型的结构如图9所示,通过第一分支网络对待检测图像进行第一预设卷积处理,得到第一特征图,同时通过第二分支网络对待检测图像进行第二预设卷积处理,得到第二特征图,然后通过融合模块对第一特征图和第二特征图进行通道融合,得到融合特征图,并通过输出层基于融合特征图获得脖子是否被遮挡的判定结果。
其中,脖子遮挡检测模型中的第一分支网络与第二分支网络并行且独立执行,并且每个分支网络执行的均是简单的卷积处理,另外模型中的融合模块也只是按照通道进行融合,计算耗时少,因此本发明提出的脖子遮挡模型通过两个分支分别并行独立提取特征后再融合,不仅可以提取到丰富的特征信息,而且执行耗时少,使得模型具有轻量高效特点。
示例性的,输出层可以采用全连接层实现脖子是否被遮挡的分类计算。
在一种可能的实现方式中,如图9所示,第一分支网络包括第一深度可分离卷积层和第一上采样层,对于对待检测图像进行第一预设卷积处理的过程,先通过第一深度可分离卷积层包含的一个卷积核对待检测图像的一个通道进行特征提取,得到单通道特征图,然后通过第一上采样层包含的预设数量通道1*1卷积核对单通道特征图进行升维处理,得到第一特征图。
其中,第一深度可分离卷积层通过使用一个卷积核随机选择一个通道进行深度可分离卷积,以提取特征信息,并输出该通道的特征图,第一上采样层通过使用多通道的1*1卷积核将提取的单通道特征图进行升维处理,以输出与输入图像相同通道数量的第一特征图。
由此可见,第一上采样层使用的1*1卷积核的通道数量为输入图像的通道数量。
在一种可能的实现方式中,如图9所示,第二分支网络包括下采样层、第二深度可分离卷积层和第二上采样层;对于对待检测图像进行第二预设卷积处理的过程,先通过下采样层包含的单通道的1*1卷积核对待检测图像进行降维处理,得到单通道特征图,再通过第二深度可分离卷积层包含的一个卷积核对该单通道特征图进行特征提取,得到提取特征后的单通道特征图,最后通过第二上采样层包含的预设数量通道1*1卷积核对提取特征后的单通道特征图进行升维处理,得到第二特征图。
其中,由于输入第二深度可分离卷积层的特征图已经为单通道,因此第二深度可分离卷积层通过使用一个卷积核对该通道进行深度可分离卷积,以提取特征信息,并输出提取特征后的特征图,第二上采样层通过使用多通道的1*1卷积核将提取特征后的特征图进行升维处理,以输出与输入图像相同通道数量的第二特征图。
由此可见,第二上采样层使用的1*1卷积核的通道数量也为输入图像的通道数量。
在一种可能的实现方式中,如图9所示,融合模块包括通道拼接层和通道混合层,对于对第一特征图和第二特征图进行通道融合的过程,先通过融合模块中的通道拼接层对第一特征图和所述第二特征图按通道进行特征图叠加,得到通道叠加后的特征图,然后通过通道混合层对通道叠加后的特征图的通道叠加顺序进行打乱,得到融合特征图。
其中,在通过通道拼接层按照通道叠加特征图后,再通过通道混合层随机打乱通道叠加顺序,以提升模型鲁棒性。
由上述描述的脖子遮挡检测模型处理过程可以看出,两个并列的分支网络分别进行不同的卷积处理,实现特征提取,而后再进行融合,相对于现有使用的CNN网络架构,减少了计算能力消耗,有利于迁移至移动端实现。
通过上述方式检测出用户图像中的脖子区域是否被遮挡,通过使用一种专属于脖子遮挡检测的深度学习模型,来精准地预测图像中的脖子是否被遮挡,从而能够为后续换装操作提供参考,确保在用户图像的脖子区域被遮挡的情况下不使用用户图像的脖子区域进行换装,以确保能够得到较佳的换装效果。并且通过根据用户图像中目标区域的占比确定输入模型的待检测图像,以减小图像背景对模型准确度的影响,使得模型输出结果更准确。
步骤104:根据脖子关键点和衣服关键点,利用用户图像中的脖子区域,生成用户图像和服装模板图像对应的换装效果图。
通过上述方式若检测出用户图像中的脖子区域未被遮挡,则根据脖子关键点和衣服关键点,利用用户图像中的脖子区域,生成用户图像和服装模板图像对应的换装效果图。具体通过如下步骤F1-F3的操作进行换装。
F1:根据脖子关键点、衣服关键点、用户图像和服装模板图像,对用户图像中的脖子区域进行修复。
本步骤具体通过如下F11-F13的操作来对脖子区域进行修复。
F11:根据脖子关键点、衣服关键点、用户图像和服装模板图像,生成用户图像中脖子的待修复区域掩膜图像。
首先根据用户图像,获取用户图像中脖子区域对应的脖子掩膜图像。具体地,获得用户图像后,通过预设人脸关键点检测模型检测用户图像中的所有人脸关键点,基于人脸关键点对用户图像进行人脸对齐处理。对齐处理后通过预设语义分割模型或上文中训练得到的图像分割模型从用户图像中分割出脖子区域。预设语义分割模型可以为HRNet、FCN(Fully Convolution Network,全卷积网络)、U-Net等模型。
以HRNet模型为例,预设语义分割模型可以使用hrnet经过迁移学习训练,使用并行连接高分辨率到低分辨率的子网,因此能够保持高分辨率。hrnet使用重复的多尺度融合,利用相同深度和相似级别的低分辨率表示来提高高分辨率表示,使得高分辨率表示对于姿态的估计也很充分,从而使得预设语义分割模型对脖子区域的分割表现出更精准的预测能力,hrnet网络架构如图10所示。
通过预设语义分割模型获得用户图像中的脖子区域之后,生成脖子区域对应的脖子掩膜图像。具体地,根据分割出的脖子区域的轮廓线上每个像素点的坐标,在空白纹理图中绘制出与该脖子区域形状和尺寸相同的掩膜区域,将该掩膜区域内每个像素点的像素值均设置为预设值,得到用户图像中脖子区域对应的脖子掩膜图像。该预设值可以为255、253、248等。
在脖子掩膜图像中与脖子区域形状、尺寸相同的掩膜区域内像素点的像素值均为预设值,该掩膜区域外的像素点的像素值均为0。
对于服装模板图像,根据脖子关键点、衣服关键点和服装模板图像,获取服装模板图像对应的服装掩膜图像。具体地,获得用户图像和服装模板图像,并将用户图像与预设的标准人脸图像对齐后,采用上文训练的脖子关键点检测模型识别对齐后的用户图像中的脖子关键点。该脖子关键点至少包括沿脖子竖直方向的中轴线左右对称的两个脖子关键点,且这两个脖子关键点可以为脖子与肩部相接位置处的两个关键点。将服装模板图像中的衣服关键点与脖子关键点对齐,衣服关键点为服装模板图像中服装领口处沿服装竖直方向上的中轴线左右对称的两个领口关键点,且这两个领口关键点为服装领口左右两侧与脖子相接处的两个最高点。将对齐后的服装模板图像确定为服装掩膜图像。
在另一种实现方式中,可以根据服装模板图像中服装区域的轮廓上每个像素点的坐标,在空白纹理图中利用坐标索引的方式绘制出与服装模板图像中服装区域形状、尺寸均相同的轮廓区域,将该轮廓区域内每个像素点的像素值均设置为预设值,得到服装掩膜图像。该预设值可以为255、252、248等。
在服装掩膜图像中与服装区域形状、尺寸相同的轮廓区域内像素点的像素值均为预设值,该轮廓区域外的像素点的像素值均为0。
通过上述方式获得脖子掩膜图像和服装掩膜图像之后,根据脖子掩膜图像和服装掩膜图像,生成用户图像中脖子的待修复区域掩膜图像。具体地,根据脖子掩膜图像中的脖子关键点和服装掩膜图像中的衣服关键点,对脖子掩膜图像和服装掩膜图像进行拼接,得到拼接掩膜图像。
由于服装掩膜图像中的衣服关键点已与脖子掩膜图像中的脖子关键点对齐,因此衣服关键点包括的左右两个领口关键点的坐标与脖子关键点包括的左右两个脖子关键点的坐标相同。因此将服装掩膜图像中的左右两个衣服关键点与脖子掩膜图像中左右两个脖子关键点对应重合,即可将服装掩膜图像与脖子掩膜图像拼接在一起,得到的拼接掩膜图像中脖子掩膜区域的下方拼接上了服装掩膜区域。
然后在拼接掩膜图像中确定出从服装领口边缘至脖子区域上边缘的待检测区域。在拼接掩膜图像中确定出脖子区域的上边界,以及确定出服装领口的上边界,绘制一个外接矩形,该外接矩形为将脖子区域的上边界及服装领口的上边界同时涵盖在内的最小矩形。将该外接矩形确定为待检测区域,然后从待检测区域中确定出待修复区域。
在一种实现方式中,遍历待检测区域中每个像素点的归属图像。从待检测区域中筛选出归属图像既不是脖子掩膜图像也不是服装掩膜图像的所有像素点,将筛选出的所有像素点所组成的区域确定为待修复区域。若未筛选出任何像素点,则表明脖子区域完整,待修复区域的面积为0。
在另一种实现方式中,对待检测区域中的每列像素,计算同一列像素中领口边缘像素点的纵坐标与脖子区域下边缘的像素点的纵坐标之间的差值。标记出差值大于零的领口边缘像素点和脖子区域下边缘的像素点,将标记出的所有像素点的连线围成的区域确定为待修复区域。若每一列像素中领口边缘像素点的纵坐标与脖子区域下边缘的像素点的纵坐标之间的差值均为0,则表明脖子区域完整,待修复区域的面积为0。
通过上述任一方式确定出待修复区域之后,生成待修复区域对应的待修复区域掩膜图像。具体可以根据待修复区域的轮廓上每个像素点的坐标,在空白纹理图中以坐标索引的方式绘制出形状、尺寸与待修复区域均相同的轮廓区域,将该轮廓区域内每个像素点的像素值均设置为预设值,得到待修复区域掩膜图像。预设值可以为255、252、248等。
在待修复区域掩膜图像中待修复区域对应的轮廓区域内的像素点的像素值均为预设值,该轮廓区域外的每个像素点的像素值均为0。
若通过上述任一方式确定出待修复区域的面积为0,则生成的待修复区域掩膜图像即为空白纹理图。
本申请基于用户图像获得了脖子掩膜图像,基于服装模板图像获得了服装掩膜图像,利用脖子掩膜图像和服装掩膜图像生成了待修复区域掩膜图像。给出了待修复区域的准确计算方式,使得基于虚拟换装的脖子修复的目标性更强,后续仅对待修复区域进行修复,不会影响用户图像中原有的脖子区域,提高对脖子区域修复的准确性,进而改善换装效果。
通过本步骤的方式生成待修复区域掩膜图像之后,还判断待修复区域掩膜图像中待修复区域的面积是否大于0,如果是,则通过步骤F12和F13的方式对待修复区域进行修复之后再进行换装操作。如果待修复区域掩膜图像中待修复区域的面积为0,则表明用户图像中原有的脖子区域是完整的,不需要进行修复,则不再执行后续步骤F12和F13,将服装模板图像中的预设领口关键点与用户图像中的脖子关键点对齐之后,直接进行后续操作。
F12:若待修复区域掩膜图像中待修复区域的面积大于0,则生成用户图像对应的背景修复图。
当步骤F11确定待修复区域掩膜图像中的待修复区域的面积大于0,表明用户图像中原有的脖子区域不完整,需要进行修复。此时先生存用户图像对应的背景修复图。
首先提取用户图像中脖子区域的主颜色。具体地,确定用户图像的脖子区域内包含的所有颜色值。统计脖子区域中各颜色值对应的像素点数目。将像素点数目最多的颜色值确定为脖子区域的主颜色。
然后绘制脖子区域的主颜色对应的纯色背景图,从用户图像中扣取出头颈部区域的图像,将头颈部区域的图像覆盖到纯色背景图中,得到用户图像对应的背景修复图。
在将头颈部区域的图像覆盖到纯色背景图中时,可以依据头颈部区域中每个像素点的坐标,利用坐标索引的方式将头颈部区域的图像覆盖到上述纯色背景图中,以使头颈部区域在得到的背景修复图中所处的位置与在用户图像中所处的位置相同。
通过上述方式得到的背景修复图中,带有修复区域,脖子区域周围的图片内容,要么是用户图像中原本的脖子区域,要么是基于脖子主颜色绘制的背景色,均与脖子修复相关。如此能够避免与脖子不相关的区域(如衣服区域)对图像修复及虚拟换装的不良影响,确保对脖子区域修复的准确性。
F13:根据待修复区域掩膜图像和背景修复图,对用户图像中的脖子区域进行修复。
通过步骤F11获得待修复区域掩膜图像,通过步骤F12获得背景色为脖子的主颜色的背景修复图之后,将待修复区域掩膜图像和背景修复图输入预设图像修复网络中,得到用户图像对应的修复后图像。
其中,预设图像修复网络可以为CR-Fill网络,CR-Fill网络的网络结构为由粗到细的体系结构,类似于DeepFillv2中的体系结构,但CA Layer被移除,应用了CR Loss进行训练。粗网络和精细网络是卷积编码器-解码器类型的网络。扩张的卷积层用于扩大感受野。在所有卷积和扩张卷积层中使用门控卷积。粗网络将缺失像素设置为零的不完整图像和指示缺失区域的二进制掩码作为输入,并生成初始预测。然后精细化网络将该初始预测作为输入,并输出最终的修复后图像,CR-Fill网络的网络架构如图11所示。
通过上述方式获得用户图像对应的修复后图像,之后将预设领口关键点已经与用户图像对应的脖子关键点对齐的服装模板图像覆盖到修复后图像中,得到换装效果图。
为了更直观地看出本申请实施例提供的图像修复方法对虚拟换装效果的影响,下面结合附图进行说明。如图12所示,图12示出了不对脖子区域进行修复,直接进行虚拟换装的效果图。当原始用户图像中的服装的衣领较高时,将服装模板图像中衣领较低的服装直接覆盖到用户图像中,则原有服装的部分衣领无法被服装模板遮挡,在脖子区域漏出部分原有服装,如图12中矩形框处所示,导致换装效果差。
而通过本申请实施例提供的方法,从原有图像中获取脖子掩膜图像,从服装模板图像中获取服装掩膜图像,基于脖子掩膜图像和服装掩膜图像确定出待修复区域掩膜图像。并生成背景色为脖子的主颜色的背景修复图。根据待修复区域掩膜图像和背景修复图,通过预设图像修复网络生成修复后图像,然后再利用修复后的用户图像进行虚拟换装,得到的换装效果如图13所示。在图13中矩形框所示的区域即为图像修复的区域,对比图12和图13能够直观地看出,通过本申请实施例对脖子区域进行修复,之后再进行虚拟换装操作,得到的换装效果图中不会漏出原有服装的衣领,使换装操作更加精准,效果更加自然。
为了便于进一步理解本申请实施例提供的图像修复方法,下面结合附图再次说明本申请的控制流程。如图14所示,获得用户图像和服装模板图像后,使用五官关键点对用户图像进行人脸对齐,然后检测用户图像中脖子两侧指定的脖子关键点。基于对齐后的用户图像获得脖子掩膜图像。对于服装模板图像,根据服装模板图像中的预设领口关键点与用户图像中的脖子关键点对齐,然后从对齐后的服装模板图像中获得服装掩膜图像。利用脖子掩膜图像和服装掩膜图像,确定出待修复区域掩膜图像。从对齐后的用户图像中提取出脖子区域的主颜色。根据用户图像和脖子区域的主颜色,生成背景修复图。然后根据待修复区域掩膜图像和背景修复图,获得修复后图像。之后将对齐后的服装模板图像覆盖到修复后图像中,得到换装效果图。
基于用户图像对应的脖子掩膜图像和服装模板图像对应的服装掩膜图像,确定出了待修复区域掩膜图像。给出了待修复区域的准确计算方式,使得基于虚拟换装的脖子修复的目标性更强,后续仅对待修复区域进行修复,不会影响用户图像中原有的脖子区域,提高对脖子区域修复的准确性。生成了背景色为脖子的主颜色的背景修复图,能够避免与脖子不相关的区域(如衣服区域)对图像修复的不良影响,确保对脖子区域修复的准确性,使修复后待修复区域的颜色及纹理都与用户图像中原有的脖子区域的颜色和纹理相近,修复后脖子区域完整且纹理过渡自然。在修复后图像的基础上进行虚拟换装,换装后脖子区域不会存在不完整或被遮挡的情况,能够得到很好的换装效果。
F2:根据脖子关键点和衣服关键点,对服装模板图像中的服装区域进行变形处理。
由于服装模板图像中的模特与用户图像中的人像胖瘦不同,因此在进行最终的换装操作之前,还对服装模板图像中的服装区域进行变形处理,以使服装区域与用户图像吻合,从而提高换装效果。
首先根据脖子关键点和衣服关键点,确定服装模板图像中服装区域变形前后的坐标映射矩阵。本申请利用变形坐标映射函数来确定服装区域变形前后的坐标映射函数,首先初始化变形坐标映射函数,初始化的时候默认不变形,即变形后的横坐标和变形前的横坐标一致,变形后的纵坐标和变形前的纵坐标一致。变形坐标映射函数表示形式为一个二维矩阵,第一个下标为纵坐标,第二个下标为横坐标。若某个点纵坐标为j,横坐标为i,则map[j,i]表示其映射前的坐标。为计算方便,本申请实施例将横坐标映射和纵坐标映射分开计算,横坐标映射函数计为map_x,纵坐标映射函数计为map_y。
本步骤具体通过如下步骤F21和F22的操作来确定变形前后的坐标映射矩阵,包括:
F21:根据脖子关键点和衣服关键点,计算服装模板图像中服装区域变形前后的横坐标映射矩阵。
根据每个脖子关键点的横坐标,沿水平方向将用户图像的宽度划分为多段第一横坐标区间。其中,第一横坐标区间的数目为脖子关键点的数目加1。
如图2所示的用户图像中,该用户图像所处的坐标系如图2所示,用户图像的左上角顶点为原点。按p2_d、p1_d和p3_d三个脖子关键点的横坐标,可以将用户图像的宽度w划分为4段第一横坐标区间。划分出的4段第一横坐标区间从左到右依次为[0,p2_d[‘x’])、[p2_d[‘x’],p1_d[‘x’])、[p1_d[‘x’],p3_d[‘x’])和[p3_d[‘x’],w)。
根据每个衣服关键点的横坐标,沿水平方向将服装模板图像的宽度划分为多段第二横坐标区间。其中,第二横坐标区间的数目为衣服关键点的数目加1。由于脖子关键点的数目与衣服关键点的数目相等,因此第一横坐标区间的数目也与第二横坐标区间的数目相等。
如图3所示的服装模板图像,按p2_o、p1_o和p3_o三个脖子关键点的横坐标,可以将用户图像的宽度w划分为4段第二横坐标区间。划分出的4段第二横坐标区间从左到右依次为[0,p2_o[‘x’])、[p2_o[‘x’],p1_o[‘x’])、[p1_o[‘x’],p3_o[‘x’])和[p3_o[‘x’],w)。
对于划分出的多段第一横坐标区间和多段第二横坐标区间,第一横坐标区间的数目与第二横坐标区间的数目相等,且二者一一对应。即用户图像中从左到右第一个第一横坐标区间与服装模板图像中从左到右第一个第二横坐标区间对应,用户图像中的第二个第二横坐标区间与服装模板图像中第二个第二横坐标区间对应,如此一一对应。
例如,图2中的[0,p2_d[‘x’])与图3中的[0,p2_o[‘x’])对应,图2中的[p2_d[‘x’],p1_d[‘x’])与图3中的[p2_o[‘x’],p1_o[‘x’])对应,图2中的[p1_d[‘x’],p3_d[‘x’])与图3中的[p1_o[‘x’],p3_o[‘x’])对应,图2中的[p3_d[‘x’],w)与图3中的[p3_o[‘x’],w)对应。
对于用户图像中的一个第一横坐标区间及服装模板图像中相对应的第二横坐标区间,相当于具备了用户图像中横坐标为该第一横坐标区间的起始横坐标和横坐标为该第一横坐标区间的截止横坐标的两个点,假设将起始横坐标对应的点称为A点,将截止横坐标对应的点称为B点。同样地,相当于具备了服装模板图像中横坐标为该第二横坐标区间的起始横坐标和横坐标为该第二横坐标区间的截止横坐标的两个点,假设将服装模板图像中起始横坐标对应的点称为A’点,将截止横坐标对应的点称为B’点。则A点为服装区域变形后A’点对应的点,B点为服装区域变形后B’点对应的点。
即对于相互对应的第一横坐标区间和第二横坐标区间,相当于获得了变形前后相互对应的两对坐标点,则根据这两对坐标点能够确定一条直线,基于该直线进行线性插值,能够得到第二横坐标区间两端点之间的每个点的横坐标在用户图像中对应的点的横坐标。
例如,图2中的[0,p2_d[‘x’])与图3中的[0,p2_o[‘x’])对应,则相当于具有了用户图像中的点(0,y1)、(p2_d[‘x’],y1),此处y1可以为p2_d的纵坐标。以及获得了服装模板图像中的(0,y2)、(p2_o[‘x’],y2),此处y2可以为p2_o的纵坐标。其中,服装区域变形后点(0,y2)会变为点(0,y1),点(p2_o[‘x’],y2)会变为点(p2_d[‘x’],y1)。根据这四个点确定一条直线,利用线性插值的方式确定出纵坐标均为y2,且横坐标在0至p2_o[‘x’]之间的各个点,在变形后每个点的横坐标。
按照上述方式对于用户图像中划分出的每一段第一横坐标区间和服装模板图像中划分出的每一段第二横坐标区间,都可以采用线性插值的方式来确定服装模板图像中每个横坐标对应的变形后的横坐标。即根据多段第一横坐标区间和多段第二横坐标区间,利用线性插值和变形坐标映射函数计算服装模板图像中服装区域对应的横坐标映射矩阵。
例如,对于图2和图3中横坐标区间的划分方式,对每一段都采用线性插值方式,并使用numpy工具包可将4段的坐标映射过程合并写作下面的公式:
map_x[:,:]=np.interp(np.arange(w),[0,p2_d[‘x’],p1_d[‘x’],p3_d[‘x’],w-1],[0,p2_o[‘x’],p1_o[‘x’],p3_o[‘x’],w-1])
其中,w为用户图像和服装模板图像的宽度,interp(*)表示线性插值函数。
本步骤利用少数几个关键点(如3个关键点)将图像的横坐标划分多个横坐标区间,利用服装模板图像中的衣服关键点与用户图像中的脖子关键点的映射关系,通过线性插值的方式确定出服装模板图像中其他横坐标在用户图像中对应的变形后的横坐标,并采用变形坐标映射函数表达出变形前后横坐标的映射关系。如此只通过很少的关键点,利用简单的几何关系即可确定出变形前后的横坐标映射矩阵,计算量很小,能够快速准确地确定出变形前后的横坐标的映射关系。
F22:根据脖子关键点和衣服关键点,计算服装区域变形前后的纵坐标映射矩阵。
在一种实现方式中,首先根据脖子关键点和衣服关键点,计算服装区域中每个横坐标对应的纵坐标的缩放系数。
具体地,根据每个脖子关键点的横坐标,沿水平方向将用户图像的宽度划分为多段第一横坐标区间。划分方式与步骤S2中的划分方式相同,如图2中可以划分出4段第一横坐标区间从左到右依次为[0,p2_d[‘x’])、[p2_d[‘x’],p1_d[‘x’])、[p1_d[‘x’],p3_d[‘x’])和[p3_d[‘x’],w)。
然后根据服装模板图像的高度、脖子关键点和衣服关键点,分别计算每个衣服关键点的纵坐标对应的缩放系数。服装模板图像的高度与用户图像的高度相等。脖子关键点与衣服关键点的数目相等,且一一对应。例如,左侧脖子边界线上的脖子关键点与衣领左侧边界线的端部的衣服关键点对应,右侧脖子边界线上的脖子关键点与衣领右侧边界线的端部的衣服关键点对应,锁骨区域位于脖子竖直中轴线上的脖子关键点与衣领左右两侧边界线相交处的衣服关键点相对应。
对于相互对应的脖子关键点和衣服关键点,服装模板图像的高度减1,再减去该衣服关键点的纵坐标,得到第一差值。服装模板图像的高度(或用户图像的高度)减1,再减去对应的脖子关键点的纵坐标,得到第二差值。计算第一差值和第二差值的比值,该比值即为该衣服关键点的纵坐标对应的缩放系数。
例如,假设服装模板图像和用户图像的高度均为h。对于图2和图3中相互对应的脖子关键点和衣服关键点,如图2中的脖子关键点p2_d和图3中的衣服关键点p2_o,则衣服关键点p2_o的纵坐标对应的缩放系数为(h-1-p2_o[‘y’])/(h-1-p2_d[‘y’])。同样地,图3中的衣服关键点p1_o的纵坐标对应的缩放系数为(h-1–p1_o[‘y’])/(h-1–p1_d[‘y’])。衣服关键点p3_o的纵坐标对应的缩放系数为(h-1–p3_o[‘y’])/(h-1–p3_d[‘y’])。
通过上述方式计算出每个衣服关键点的纵坐标对应的缩放系数之后,根据用户图像中划分的多段第一横坐标区间和每个衣服关键点的纵坐标对应的缩放系数,利用线性插值和变形坐标映射函数计算服装区域中每个横坐标对应的纵坐标的缩放系数。
对于用户图像中划分的每个第一横坐标区间,每个区间的起始点的横坐标和截止点的横坐标都分别对应于一个纵坐标的缩放系数。对于一个第一横坐标区间,根据起始点的横坐标及其对应的缩放系数,以及截止点的横坐标及其对应的缩放系数,能够确定该第一横坐标区间对应的一条直线,基于该直线进行线性插值,能够得到该第一横坐标区间两端点之间的每个点的横坐标下纵坐标对应的缩放系数。
例如,图2中的第一横坐标区间[p2_d[‘x’],p1_d[‘x’]),起始点的横坐标p2_d[‘x’]对应的纵坐标的缩放系数为(h-1-p2_o[‘y’])/(h-1-p2_d[‘y’])。截止点的纵坐标p1_d[‘x’]对应的纵坐标的缩放系数为(h-1–p1_o[‘y’])/(h-1–p1_d[‘y’])。根据p2_d[‘x’]与(h-1-p2_o[‘y’])/(h-1-p2_d[‘y’]),以及p1_d[‘x’]与(h-1–p1_o[‘y’])/(h-1–p1_d[‘y’]),确定一条直线。基于该直线进行线性插值,能够得到p2_d[‘x’]与p1_d[‘x’]之间每个横坐标对应的纵坐标的缩放系数。
按照上述方式对于用户图像中划分出的每一段第一横坐标区间及区间端点对应的纵坐标的缩放系数,都可以采用线性插值的方式来确定每个第一横坐标区间内部每个横坐标对应的纵坐标的缩放系数。
例如,对于图2中划分的4个第一横坐标区间,对每一段都采用线性插值方式,并使用numpy工具包可将4段的线性差值过程合并写作下面的公式:
scale2=np.interp(np.arange(w),[0,p2_d[‘x’],p1_d[‘x’],p3_d[‘x’],w-1],[1,(h-1-p2_o[‘y’])/(h-1-p2_d[‘y’]),(h-1-p1_o[‘y’])/(h-1-p1_d[‘y’]),(h-1-p3_o[‘y’])/(h-1-p3_d[‘y’]),1])
其中,w为用户图像的宽度,interp(*)表示线性插值函数。
通过上述方式计算出服装模板图像中服装区域中每个横坐标对应的纵坐标的缩放系数,之后根据服装模板图像的高度、服装区域每个坐标点的纵坐标及每个纵坐标对应的缩放系数,利用变形坐标映射函数计算服装区域对应的纵坐标映射矩阵。
具体地利用如下的赋值公式来表示服装区域对应的纵坐标映射矩阵:
map_y[:,:]=h-1-map_y[:,:]*scale2[np.newaxis,:]
其中,h为用户图像和服装模板图像的高度,scale2为每个横坐标对应的纵坐标的缩放系数,等号右边的map_y[:,:]为变形前服装区域中每个点的坐标,等号左边的map_y[:,:]为变形后服装区域中每个点的坐标。变形前后服装区域中每个点的横坐标不变,纵坐标发生了改变。
在另一些实施例中,在通过上述方式计算服装区域中每个横坐标对应的纵坐标的缩放系数之前,考虑到在虚拟换装场景中,用户图像中的领口区域,很可能与服装模板图像中的领口区域相差较大。如用户图像的衣服为高领的,服装模板图像中的衣服领口较低;或者,用户图像中的衣服领口较低,而服装模板图像中的衣服领口较高。因此可以基于服装模板图像中领口左右两侧边界线相交处的衣服关键点与用户图像中锁骨区域位于脖子竖直中轴线上的脖子关键点,先对服装区域进行整体缩放处理,缩放后服装模板图像中领口边界线上纵坐标最大的关键点与用户图像中锁骨区域位于脖子竖直中轴线上的关键点重合。
首先根据服装模板图像的高度、服装模板图像中领口左右两侧边界线的交点的纵坐标以及用户图像中锁骨区域位于脖子竖直中轴线上的脖子关键点的纵坐标,计算整体缩放系数。将服装模板图像的高度减一,再减去服装模板图像中领口左右两侧边界线的交点的纵坐标,得到第三差值。将服装模板图像的高度减一,再减去用户图像中锁骨区域位于脖子竖直中轴线上的脖子关键点的纵坐标,得到第四差值。计算第三差值与第四差值之间的比值,该比值即为整体缩放系数。
例如,假设用户图像和服装模板图像的高度均为h,图2中锁骨区域位于脖子竖直中轴线上的脖子关键点为p1_d,图3中领口左右两侧边界线的交点为p1_o,则整体缩放系数为(h-1–p1_o[‘y’])/(h-1–p1_d[‘y’])。
通过上述方式计算出整体缩放系数后,还根据服装模板图像的高度、服装区域每个坐标点的纵坐标及整体缩放系数,利用变形坐标映射函数计算服装区域在整体缩放处理前后的纵坐标映射矩阵。具体通过下述公式来计算整体缩放处理前后的纵坐标映射矩阵:
map_y[:,:]=(h-1-np.arange(h))[:,np.newaxis]*scale1
其中,h为图像高度,scale1为整体缩放系数。
通过上述方式计算出整体缩放系数,并确定出整体缩放处理前后的纵坐标映射矩阵之后,重新计算整体缩放处理后服装模板图像中的每个衣服关键点。具体地,保持整体缩放处理后每个衣服关键点的横坐标不变。根据服装模板图像的高度、整体缩放系数及整体缩放处理前每个衣服关键点的纵坐标,分别计算整体缩放处理后每个衣服关键点的纵坐标。
对于任意一个衣服关键点,首先将服装模板图像的高度减一,再减去整体缩放处理前该衣服关键点的纵坐标,计算得到的差值与整体缩放系数之间的比值。再利用服装模板图像的高度减一后再减去上述计算的比值,最终得到的差值即为整体缩放处理后该衣服关键点的纵坐标。
例如,对于图3中的衣服关键点p2_o、p1_o和p3_o,假设服装模板图像的高度为h,整体缩放系数为scale1。则整体缩放处理后p2_o的纵坐标变为h-1-(h-1-p2_o[‘y’])/scale1。p1_o的纵坐标变为h-1-(h-1-p1_o[‘y’])/scale1=p1_d[‘y’]。p3_o的纵坐标变为h-1-(h-1-p3_o[‘y’])/scale1。
通过上述方式重新计算出整体缩放处理后的每个衣服关键点的坐标,之后可以利用前文所述的方式,根据用户图像中的脖子关键点和重新计算的衣服关键点,计算服装区域中每个横坐标对应的纵坐标的缩放系数,此处计算过程与前文相应过程相同,在此不再赘述。
之后根据服装模板图像的高度、上述计算的整体缩放处理前后的纵坐标映射矩阵及每个纵坐标对应的缩放系数,利用变形坐标映射函数计算服装区域对应的最终的纵坐标映射矩阵。最终的纵坐标映射矩阵的公式为:
map_y[:,:]=h-1-map_y[:,:]*scale2[np.newaxis,:]
其中,h为用户图像和服装模板图像的高度,scale2为依据整体缩放处理后的衣服关键点计算的每个横坐标对应的纵坐标的缩放系数。等号右边的map_y[:,:]为整体缩放处理前后的纵坐标映射矩阵,等号左边的map_y[:,:]为变形后服装区域中每个点的坐标。变形前后服装区域中每个点的横坐标不变,纵坐标发生了改变。
在本申请中利用较少的脖子关键点和衣服关键点,基于相互对应的脖子关键点和衣服关键点之间的几何关系,利用线性插值和变形坐标映射函数计算出了变形前后的横坐标映射矩阵和纵坐标映射矩阵,以很小的计算量准确地计算出了服装区域变形前后的坐标映射矩阵。且在计算纵坐标映射矩阵之前可以先对服装区域进行整体缩放,再计算每个横坐标对应的纵坐标的缩放系数,使对服装区域的变形处理更加细化,提高服装区域变形的精度,从而使变形后的服装区域与用户图像更加吻合,提高虚拟换装效果。
上述对服装区域的整体缩放处理可以只是虚拟处理,即不真正地对服装区域进行缩放,而只是计算出整体缩放系数,整体缩放处理后新的衣服关键点及整体缩放处理前后的纵坐标映射矩阵,进而根据这些参数计算出最终的变形前后的坐标映射矩阵。
然后根据计算出的变形前后的横坐标映射矩阵和纵坐标映射矩阵,对服装模板图像中的服装区域进行变形处理。具体地,根据坐标映射矩阵包括的横坐标映射矩阵,通过预设变形算法对服装模板图像中的的服装区域进行水平方向的变形处理。根据坐标映射矩阵包括的纵坐标映射矩阵,通过预设变形算法对服装区域进行竖直方向的变形处理。
上述预设变形算法可以包括重映射函数opencvremap,将步骤F21和F22计算出的横坐标映射矩阵、纵坐标映射矩阵以及服装模板图像输入opencvremap函数中,输出变形后的服装模板图像。
变形后的服装模板图像中的每个衣服关键点都与用户图像中相对应的脖子关键点的坐标相同,且服装模板图像中除衣服关键点外的其他像素点的坐标也都发生了相应变化。变形后的服装模板图像与用户图像高度吻合,依据变形后的服装模板图像生成服装区域对应的服装掩膜,按照服装掩膜将变形后的服装模板图像覆盖到用户图像中,得到换装效果图。
如图15所示,根据图2所示的用户图像和图3所示的服装模板图像,对图3中的服装区域进行变形处理后,将变形后的服装区域覆盖到图2中得到的换装效果图。从图15中可以看出对服装区域进行变形之后再进行虚拟换装,能够使得服装区域与用户图像高度吻合,得到了很好的换装效果。
为了便于理解本申请实施例提供的服装变形过程,下面结合附图进行说明。如图16所示,首先获取用户图像和服装模板图像,分别对用户图像和服装模板图像进行对齐。然后检测用户图像中的脖子关键点,以及获取服装模板图像中的衣服关键点。根据衣服关键点和脖子关键点,计算服装y方向上的整体缩放系数scale1。根据脖子关键点将用户图像划分为多段第一横坐标区间,根据衣服关键点将服装区域划分为多段第二横坐标区间。在scale1的基础上计算y方向对应的纵坐标映射矩阵。以及根据划分的多段第一横坐标区间和第二横坐标区间,计算x方向对应的横坐标映射矩阵。利用横坐标映射矩阵和纵坐标映射矩阵对服装模板图像中的服装区域进行变形,得到变形后的服装模板图像。
根据用户图像中的脖子关键点和服装模板图像中的衣服关键点,确定服装区域变形前后的坐标映射矩阵,利用该坐标映射矩阵进行变形。巧妙的利用变形前后的几何关系,基于很少的关键点,采用线性插值和变形坐标映射函数计算服装区域变形前后的坐标映射矩阵,利用坐标映射矩阵对服装区域进行变形。既确保了服装变形具有很好的变形效果,又大大简化了服装变形的运算量,提高了服装变形的处理速率。
F3:将变形后的服装模板图像的服装区域覆盖到修复后的用户图像中,得到换装效果图。
通过步骤F1对用户图像的脖子区域进行修复,以及通过步骤F2对服装模板图像中的服装区域进行变形,之后将变形后的服装模板图像的服装区域覆盖到修复后的用户图像中,使得变形后的服装模板图像中的衣服关键点与脖子修复后的用户图像中的对应的脖子关键点重合,得到换装效果图。
先对用户图像中的脖子区域进行修复,能够避免换装后脖子区域不完整的情况。对服装模板图像中的服装区域进行变形,能够使得服装区域与用户图像高度吻合。基于脖子修复后的用户图像和服装区域变形后的服装模板图像进行虚拟换装,能够得到最佳的换装效果。
步骤105:根据脖子关键点和衣服关键点,利用服装模板图像中的脖子区域,生成用户图像和服装模板图像对应的换装效果图。
若步骤103中检测用户图像中脖子区域是否被遮挡,检测结果为脖子区域被遮挡,则无法通过上述步骤104的方式来进行虚拟换装。而是需要采用服装模板图像中模特的脖子区域进行换装。具体通过如下G1-G4的操作来进行换装。
G1:根据用户图像,对服装模板图像中的脖子区域进行颜色迁移处理。
首先提取用户图像中面部皮肤主颜色和第一颈部皮肤主颜色。
获得用户图像和服装模板图像后,可以对该用户图像和服装模板图像进行适当预处理,如数字转换、降噪等,以便于后续主颜色的提取。
先通过预设语义分割模型或前文训练的用于进行人体区域分割的图像分割模型,识别用户图像的面部区域和脖子区域,再在面部区域提取用户图像的面部皮肤主颜色,在脖子区域提取第一颈部皮肤主颜色。
对于用户图像的面部区域,可以先确定面部区域内包含的所有色度值,再统计面部区域中各色度值对应的像素点数目,并将面部区域内像素点数目最多的色度值确定为面部区域对应的面部皮肤主颜色。同理,对于第一颈部区域,可以先确定第一颈部区域包含的所有色度值,再统计第一颈部区域中各色度值对应的像素点数目,然后将第一颈部区域内像素点数目最多的色度值确定为第一颈部区域对应的颈部皮肤主颜色。
由于要使用服装模板图像中的模特的脖子区域进行换装,则换装后换装效果图中包含了用户的脸部区域及模特的脖子区域,而用户的脸部区域和模特的脖子区域的颜色可能存在较大差异,使换装效果不佳。因此通过上述方式获得用户图像的面部皮肤主颜色和第一颈部皮肤主颜色之后,根据面部皮肤主颜色和第一颈部皮肤主颜色,调整服装模板图像的脖子区域的颜色,以使服装模板图像中模特的脖子颜色与用户图像中的脸部区域的颜色之间过渡更加自然,提高换装效果。
对于上述皮肤主颜色,其可以采用多种颜色空间进行表达,比如RGB、YUV等,鉴于YUV颜色空间下图像的亮度信号Y和色度信号U、V是分离的,可以单独替换该颜色空间下,图像的亮度值Y或色彩值UV,从而实现对图像颜色的调整,并使得调整后的颜色更加真实自然。所以本实施例中采用YUV颜色空间下的主颜色,并对服装模板图像的脖子区域中每个像素点的UV通道值进行调整,既达到了很好的颜色迁移效果,使得换装效果图中的脸部和脖子看起来更加真实自然,又能实现较高的处理速度。
在对服装模板图像的脖子区域中每个像素点的UV通道值进行调整时,理论上,直接将用户图像的面部区域的颜色和第一颈部区域的颜色迁移到服装模板图像上是比较理想的状态,可以保证换装效果图中的脸部和脖子之间自然过渡。但是实际应用中,很多情况下用户图像的第一颈部区域面积比较小,无法实现理想中的颜色迁移效果。本实施例为进一步解决这种情况,在第一颈部区域面积比较小时,基于用户图像脸部区域颜色对服装模板图像的脖子区域中每个像素点的UV通道值进行调整。
具体地,可以先计算用户图像的第一颈部面积和用户图像的面部面积的比值,并确定该比值是否位于预设区间内;若是,则将面部皮肤主颜色和第一颈部皮肤主颜色进行融合,并根据融合后的主颜色调整服装模板图像的脖子区域中每个像素点的UV通道值;若否,且比值大于预设区间的上限值,则根据第一颈部皮肤主颜色调整服装模板图像的脖子区域中每个像素点的UV通道值;若否,且比值小于预设区间的下限值,则根据面部皮肤主颜色调整服装模板图像的脖子区域中每个像素点的UV通道值。
需要说明的是,本实施例对预设区间的具体取值不作具体限定,本领域技术人员可根据实际情况进行确定,例如,可以是[0.2,0.3],[0.25,0.32],[0.18,0.26]等。
上述将面部皮肤主颜色和第一颈部皮肤主颜色进行融合时,可分别将面部皮肤主颜色的颜色空间和第一颈部皮肤主颜色的颜色空间转换至YUV颜色空间下,并获取YUV颜色空间下面部皮肤主颜色的UV通道值和第一颈部皮肤主颜色的UV通道值。然后根据面部皮肤主颜色的UV通道值和相应的权重系数,及第一颈部皮肤主颜色的UV通道值和相应的权重系数,确定融合主颜色的UV通道值。
其中,面部皮肤主颜色的UV通道值对应的权重系数和第一颈部皮肤主颜色的UV通道值对应的权重系数的和可以等于1,且权重系数可与上述用户图像的第一颈部面积和面部面积的比值具有对应关系。具体地,假设面部皮肤主颜色的UV通道值对应的权重系数为a,第一颈部皮肤主颜色的UV通道值对应的权重系数为b,用户图像的第一颈部面积和面部面积的比值为k,则a+b=1,且k值越大,则b的取值越大,a的取值越小。
需要说明的是,上述权重系数的确定只是本实施的较佳实施方式,本实施例并不以此为限,只要能将面部皮肤主颜色和第一颈部皮肤主颜色进行融合即可,例如,两个权重系数也可以为定值,且二者的和也可以小于1,或稍大于1。
在确定了上述融合主颜色(即融合后的主颜色)的UV通道值之后,可以将服装模板图像的脖子区域中每个像素点的UV通道值均替换为融合主颜色的UV通道值,从而实现对服装模板图像的颈部区域的颜色调整。
在用户图像的第一颈部面积和用户图像的面部面积的比值大于预设区间的上限值时,直接利用第一颈部皮肤主颜色调整服装模板图像的脖子区域的颜色。可以先将第一颈部皮肤主颜色的颜色空间转换至YUV颜色空间下,并获取YUV颜色空间下第一颈部皮肤主颜色的UV通道值。然后将服装模板图像的颜色空间也转换至YUV颜色空间下,并将服装模板图像的脖子区域中每个像素点的UV通道值均替换为第一颈部皮肤主颜色的UV通道值。
同理,在用户图像的第一颈部面积和用户图像的面部面积的比值小于预设区间的下限值时,利用用户图像的面部皮肤主颜色调整服装模板图像的脖子区域的颜色。可以先将面部皮肤主颜色的颜色空间转换至YUV颜色空间下,并获取YUV颜色空间下面部皮肤主颜色的UV通道值。然后将服装模板图像的颜色空间也转换至YUV颜色空间下,并将服装模板图像的脖子区域中每个像素点的UV通道值均替换为面部皮肤主颜色的UV通道值。
本申请一些实施例中,在根据面部皮肤主颜色和第一颈部皮肤主颜色,调整服装模板图像的脖子区域中每个像素点的UV通道值之前,可以对用户图像的整体亮度进行调整,然后基于调整亮度后的用户图像,进行YUV空间颜色转换,并获取上述面部皮肤主颜色的UV通道值和第一颈部皮肤主颜色的UV通道值,以及调整服装模板图像的脖子区域中每个像素点的UV通道值等。如此可使换装后的换装效果图的整体亮度过渡自然,且脸部颜色和脖子颜色及二者之间的过渡区域更加真实自然。
在对用户图像的整体亮度进行调整时,可先提取服装模板图像中模特的颈部皮肤主颜色(以下称为第二颈部皮肤主颜色),然后根据第二颈部皮肤主颜色的亮度值和面部皮肤主颜色的亮度值,调整服装模板图像的脖子区域中每个像素点的亮度值。如此,基于服装模板图像中模特的颈部亮度和用户图像的面部皮肤的亮度对服装模板图像的脖子区域的亮度进行整体调整,可以保证整体亮度的协调性和真实性。
上述根据第二颈部皮肤主颜色的亮度值和面部皮肤主颜色的亮度值,调整服装模板图像的脖子区域中每个像素点的亮度值时,可以先根据第二颈部皮肤主颜色的亮度值和面部皮肤主颜色的亮度值,确定亮度调整参数,然后基于该亮度调整参数调整服装模板图像的颈部区域中每个像素点的亮度值。
其中,亮度参数调整可以是一个大于0的任意数值,其可以根据第二颈部皮肤主颜色的亮度值和面部皮肤主颜色的亮度值确定,本实施例对其具体取值不作具体限定。在一些实施方式中,上述亮度调整参数可以为第二颈部皮肤主颜色的亮度值和面部皮肤主颜色的亮度值的比值,也可以为与该比值相关其它参数,例如比值的平方,比值开根号等。
基于该亮度调整参数调整服装模板图像的脖子区域中每个像素点的亮度值,通常可理解为,将服装模板图像的脖子区域中每个像素点的亮度值均乘以该亮度调整参数。
本实施例通过设置亮度调整参数,对服装模板图像的脖子区域的每个像素点的亮度值进行调整时,还可通过对亮度调整参数的调整,实现对迁移图像的脖子区域的每个像素点的亮度值的进一步调整,例如,对于靠近下巴的脖子区域,在实际情况下,由于下巴对光线的遮挡,颜色通常会偏暗,则可适当减小亮度调整参数;对于远离下巴的脖子区域,在实际情况下,由于皮肤反光的原因,颜色通常会偏亮,则可适当增大亮度调整参数,以使得脖子区域的皮肤颜色更加真实。
具体地,根据第二颈部皮肤主颜色的亮度值和面部皮肤主颜色的亮度值确定亮度调整参数时,可以将第二颈部皮肤主颜色和面部皮肤主颜色的颜色空间均转换至HSV(Hue,Saturation,Value)颜色空间下,然后分别获取HSV颜色空间下面部皮肤主颜色的第一亮度值和第二颈部皮肤主颜色的第二亮度值,并根据该HSV颜色空间下的第二亮度值和第一亮度值,计算亮度调整参数。
对于HSV颜色空间,H表示图像的色调,S表示图像的饱和度,V表示图像的亮度。不同于RGB和CMY等颜色空间都是面向硬件的,HSV颜色空间是面向用户的,其模型参数(H、S、V)是根据人观察色彩的生理特征而提出的,而人的视觉***对亮度的敏感度要强于色彩值,所以,采用HSV颜色空间下的亮度值计算亮度调整参数,可以使得调整后的结果更加准确,更便于人的视觉***进行观察。可以理解的是,采用HSV颜色空间下的参数计算亮度调整参数只是本实施例的一种较佳实施方式,本实施例并不以此为限,只要能够通过亮度计算确定亮度调整参数即可。
需要说明的是,上述在调整服装模板图像的脖子区域中每个像素点的UV通道值之前对用户图像的整体亮度进行调整的方案,只是本实施例的较佳实施方式,本实施例并不以此为限,只要能通过亮度调整使服装模板图像的脖子区域和用户图像中的面部区域之间的亮度分布看起来更加真实自然即可。例如,也可以在调整服装模板图像的脖子区域中每个像素点的UV通道值之后,再根据用户图像的面部亮度和模特图像的脖子亮度,对服装模板图像的整体亮度进行调整。
为了便于理解本申请实施例提供的方法,下面结合附图进行说明。如图17所示,服务器先从用户的终端设备获取其上传的用户图像和服装模板图像,然后通过人脸识别技术进行用户图像和服装模板图像的人脸对齐操作,通过基于hrnet网络的分区模型对用户图像和服装模板图像进行人体区域分割,得到用户图像的面部区域和第一颈部区域,以及服装模板图像的第二颈部区域。然后基于该面部区域、第一颈部区域及第二颈部区域分别提取面部皮肤主颜色、第一颈部皮肤主颜色及第二颈部皮肤主颜色。并根据面部区域的颜色亮度和第二颈部区域的颜色亮度对用户图像的整体亮度进行调整,之后基于调整后用户图像的面部皮肤主颜色和第一颈部皮肤主颜色进行颜色融合,并得到融合后的主颜色UV通道值,并将服装模板图像的脖子区域中每个像素点的UV通道值均替换为该融合后的主颜色UV通道值,从而实现用户图像的颜色迁移,最后,可以将经过颜色迁移过后生成的图像,返回至服务调用方(即客户端)。其中,若服务器检测到用户图像不合格(比如图像模糊,面部不全等),可以在客户端界面显示用户图像不合格,请重新上传用户图像的字样。
基于用户图像和服装模板图像,提取用户图像中面部皮肤主颜色和第一颈部皮肤主颜色,根据面部皮肤主颜色和第一颈部皮肤主颜色,调整服装模板图像的脖子区域的颜色,达到了很好的颜色迁移效果,尤其对于用户图像中颈部区域面积相对较小的情况下,可使得换装后的脸部和脖子看起来更加真实自然,仅对UV通道值进行调整,计算量小,能够实现较高的处理速度,便于在客户端相关服务的运行。
G2:根据用户图像的脖子关键点,对服装模板图像中的脖子区域进行变形处理。
通过前文训练的脖子关键点检测模型获取服装模板图像中脖子区域的脖子关键点。然后根据用户图像对应的脖子关键点和服装模板图像对应的脖子关键点,确定服装模板图像中脖子区域变形前后的坐标映射矩阵。与步骤F2中确定服装区域变形前后的坐标映射矩阵相似,同样分别获取水平方向的横坐标映射矩阵和竖直方向的纵坐标映射矩阵。然后根据脖子区域变形前后的坐标映射矩阵,对服装模板图像中的脖子区域进行变形处理。即根据脖子区域变形前后的横坐标映射矩阵,对服装模板图像中脖子区域进行水平方向的变形处理。以及根据脖子区域变形前后的纵坐标映射矩阵,对服装模板图像中脖子区域进行竖直方向的变形处理。
变形处理后服装模板图像中模特的脖子区域的脖子关键点的坐标与用户图像中对应的脖子关键点的坐标相同,且模特的脖子区域的尺寸及形状与用户图像中用户自己完整的脖子区域的尺寸及形状相近。如此利用模特的脖子区域进行换装时能够获得更好的换装效果。
G3:根据脖子关键点和衣服关键点,对服装模板图像中的服装区域进行变形处理。
本步骤的操作与步骤F2中对服装模板图像中的服装区域进行变形的过程相同,在此不再赘述。
G4:将变形后的服装模板图像的脖子区域和服装区域覆盖到用户图像中,得到换装效果图。
通过步骤G1对服装模板图像的脖子区域进行颜色迁移,通过步骤G2对服装模板图像中的脖子区域进行变形,以及通过步骤G3对服装模板图像中的服装区域进行变形,之后将变形后的服装模板图像的脖子区域和服装区域覆盖到修复后的用户图像中,使得变形后的服装模板图像中的脖子区域与用户图像中的脸部区域相接,得到换装效果图。如此该换装效果图中包含用户图像中原有的头部区域、服装模板图像中变形后的脖子区域以及变形后的服装区域。
由于将变形后的服装模板图像的脖子区域和服装区域覆盖到用户图像之后,脖子区域与脸部区域相接的部位可能存在一定的偏差影响换装效果。因此在另一些实施例中,将变形后的服装模板图像的脖子区域和服装区域覆盖到用户图像之后还从原始的用户图像中获取用户的脸部区域或脸部的皮肤区域,将获取的脸部区域或脸部的皮肤区域再次覆盖到换装效果图的脸部,得到最终的换装效果图。
在本申请的一些实施例中,用户图像中的头发区域也可能对换装效果造成影响,例如在图18(a)所示的长发且往后披的情况下,将服装模板图像覆盖到用户图像中,换装效果图(如图18(b)所示)中头发区域与服装区域之间可能会存在间隔,使换装效果不自然。因此在执行步骤F3或G4之前,还需要对用户图像中的头发区域进行分类,并依据头发区域的分类结果采取一定措施来消除头发区域对换装效果的影响。
在虚拟换装场景下,若原图片是短发,则头发区域不需要进行拉伸变形,即可得到很好的换装效果。若原图片是长发披到前面的,将服装模板图片换装覆盖到原图片中后,头发区域和服装区域之间不会出现缝隙,因此头发区域不需要进行拉伸变形,即可得到很好的换装效果。原图片是长发披到后面的情况,换妆后头发和服装之间可能会出现缝隙,在此情况下若将头发区域进行拉伸变形,可以改善换装效果,因此这种情况需要单独考虑,用户左右肩膀两侧,头发前披或后披,或者头发缕到一边,这些情况均需要单独考虑。
基于上述换装场景中不同头发类别对换装效果的不同影响,本申请实施例中将头发类别划分为短发(头发不超过肩部的上边界)、左侧向前披发、右侧向前批发、左侧向后披发、右侧向后批发共5种类别。通过预设的分类模型来识别用户图像对应的头发类别。在虚拟换装场景下,若输出的用户图像对应的头发类别为左侧向后批发和/或右侧向后批发,则在换装之前,可以先对向后批发的一侧头发区域进行拉伸变形,然后再将服装模板图像覆盖到拉伸变形后的用户图像中,从而能够避免换装后衣服区域与头发区域之间存在缝隙,提高换装效果。
若检测出用户图像中的头发区域的分类结果为短发或头发前披,则不需要对头发区域进行特殊处理,执行步骤F3或G4即可。若检测出的分类结果为长发往后披类别,则考虑到在换装场景中,还可能存在服装模板图像中的服装比用户图像中的服装靠上的情况,即使执行换装处理,服装模板会将头发覆盖一部分,二者之间不会有缝隙,这样就不需要对头发区域进行变形处理,因此需要进一步根据服装模板图像中的衣服区域与头发区域判定是否需要对头发区域进行变形处理。
其中,对于根据服装模板图像中的衣服区域与头发区域进一步判定是否需要对头发区域进行变形处理的过程,在一种可能的是实现方式中,通过逐列遍历衣服区域与头发区域之间相邻边缘的纵坐标差,并从纵坐标差中获取最大纵坐标差,如果最大纵坐标差小于预设值,说明服装区域会将头发覆盖一部分,则确定不需要对头发区域进行变形处理,如果最大纵坐标差大于预设值,则确定需要对头发区域进行变形处理。
其中,衣服区域上的纵坐标是以所属服装模板图像的左上角为原点建立的直角坐标系取值,头发区域上的纵坐标是以所属用户图像的左上角为原点建立的直角坐标系取值,并且服装模板图像与用户图像的大小一致,因此纵坐标差为衣服区域边缘的纵坐标减去头发区域边缘的纵坐标。
举例说明,对于某一列,如果衣服区域边缘的纵坐标小于头发区域边缘的纵坐标,二者之间的坐标差小于0,说明该列上的服装像素会覆盖到头发上,如果衣服区域边缘的纵坐标大于头发区域边缘的纵坐标,二者之间的坐标差大于0,说明该列上的服装像素不会覆盖到头发上。
由此可见,上述预设值可以设置为0。
若通过上述方式确定出需要对头发区域进行变形处理,则通过如下步骤I1-I4的操作来对头发区域进行变形。
I1:定位用户图像中的头发区域和人脸区域。
通过对用户图像中的头发和人脸进行语义分割,以定位出头发区域和人脸区域。其中,头发区域由标签类别为头发的像素组成的区域,如图19中的图(a)所示的白色区域为头发区域,人脸区域由标签类别为人脸的像素组成的区域,包括耳廓和整个人脸围起来的区域,如图19中的图(b)所示的白色区域为人脸区域。
I2:将用户图像的人脸区域向头顶方向膨胀,以得到保护区域。
其中,通过将人脸区域向头顶方向膨胀,如图20所示的保护区域,该保护区域能够将无需处理的头顶区域覆盖掉。
需要补充说明的是,以换装场景为例,如果图像中的用户头发为短发(即头发不过肩),或者为长发前披(左右两边均为前披),即使执行换装处理,由于短发本身与服装之间有缝隙或者长发本身搭在服装前面,因此换装后头发与服装之间仍然保持原来样式,并不会影响换装效果,此时便不需要对头发进行变形处理;如果图像中的用户头发为长发后披,那么对于单边长发后披,换装后单边头发与服装之间有缝隙,对于双边长发后披,换装后双边头发与服装均有缝隙,此时便会影响换装效果,因此只要有一边头发为后披,就需要进行变形处理。
I3:利用头发区域和保护区域确定待处理区域。
其中,由于保护区域覆盖了不需要处理的头发区域,因此通过对完整的头发区域和保护区域采用特殊的相减操作,便可获得待处理区域。
在一可选的实施例中,可以对头发区域和保护区域之间进行集合相减操作,以得到待处理区域。如图21所示,为对图19中图(a)和图20之间进行集合相减操作后获得的保护区域,也即位于耳廓下方的头发区域。
I4:沿与头顶方向相反的方向对用户图像上的待处理区域进行变形处理,得到头发变形后的用户图像。
在一种可能的实现方式中,通过获取待处理区域上每列对应的变形系数,进而根据待处理区域上每列对应的变形系数,沿与头顶方向相反的方向对用户图像上的待处理区域进行变形处理,得到头发变形后的用户图像。
其中,与头顶方向相反的方向即为对待处理区域向下变形处理。在对每列头发区域进行处理时,变形系数越大,对应该列的头发会处理的越长,变形系数越小,对应该列的头发处理的短些。
在一可选的实施例中,针对获取待处理区域上每列对应的变形系数的过程,通过获取头发区域上每列的最大纵坐标和最小纵坐标,以及获取衣服区域上每列的最小纵坐标,然后针对头发区域上每列,利用头发区域上所述列的最大纵坐标和最小纵坐标、衣服区域上所述列的最小纵坐标,确定所述列对应的变形系数。
其中,待处理区域的列与头发区域的列相同,因此头发区域上每列对应的变形系数,即为待处理区域上每列对应的变形系数。或者说由于待处理区域属于头发区域的一部分区域,因此待处理区域上的列均属于头发区域上的列。
可选的,某列对应的变形系数的计算公式如下:
scale=(min_y_cloth-min_y_hair)/(max_y_hair-min_y_hair) (公式1)
在上述公式1中,scale为变形系数,min_y_cloth为衣服区域上所述列的最小纵坐标(也即衣服肩膀边缘上的纵坐标),max_y_hair和min_y_hair分别为头发区域上所述列的最大纵坐标和最小纵坐标(也即头顶纵坐标和发尾纵坐标)。
在一可选的实施例中,针对沿与头顶方向相反的方向对用户图像上的待处理区域进行变形处理的过程,通过获取待处理区域上每列的最大纵坐标和最小纵坐标,然后针对待处理区域上每列,根据所述列的最大纵坐标、最小纵坐标以及变形系数,确定所述列的变形后纵坐标,最后根据待处理区域上每列的变形后纵坐标、最小纵坐标、最大纵坐标,对用户图像上的待处理区域进行变形处理。
其中,某列的变形后纵坐标计算公式如下:
end_h_new=start_h+(end_h-start_h)*scale (公式2)
上述公式2中,end_h_new为该列的变形后纵坐标,start_h为该列的最小纵坐标,end_h为该列的最大纵坐标,scale为该列的变形系数。
也就是说,待处理区域上的某列纵坐标范围为(start_h,end_h),经处理后该列纵坐标范围变为(start_h,end_h_new)。
在一种可能的实现方式中,针对根据待处理区域上每列的变形后纵坐标、最小纵坐标、最大纵坐标,对待处理区域进行变形处理的过程,分别利用用户图像的宽度和高度生成第一map矩阵和第二map矩阵,以由第一map矩阵和第二map矩阵表示用户图像的横坐标和纵坐标之间的映射关系,然后根据待处理区域上每列的变形后纵坐标、最小纵坐标、最大纵坐标进行线性插值,以更新第二map矩阵,并利用第一map矩阵和更新后的第二map矩阵对用户图像上的待处理区域进行变形处理。
其中,由于列方向不需要进行处理,因此第一map矩阵不需要更新。
在具体实施时,可以通过初始化opencvremap的坐标映射函数方式获得第一map矩阵和第二map矩阵,坐标映射函数如下所示:
map_x=np.zeros((h,w),dtype=np.float32)
map_y=np.zeros((h,w),dtype=np.float32)
map_x[:,:]=np.arange(w)
map_y[:,:]=np.arange(h)[:,np.newaxis]
其中,前两个函数用来初始化出两个大小为h*w均为0的map矩阵,h为用户图像的高度,w为用户图像的宽度,并且map矩阵中的每个元素值类型为浮点类型。
如图22所示,对于第一map矩阵map_x中,每一行元素的取值为0到w-1,对于第二map矩阵map_y,每一列元素的取值为0到h-1。
可选的,对第二map矩阵map_y的进行更新的线性插值函数如下:
map_y[start_h:end_h_new,col]=
np.interp(np.arange(start_h,end_h_new),
[start_h,end_h_new],[start_h,end_h])
其中,end_h_new为变形后纵坐标,start_h为最小纵坐标,end_h为最大纵坐标。
由上述线性插值函数可以看出,更新的是第二map矩阵中表示待处理区域每列的纵坐标取值。
需要补充说明的是,在得到头发处理后的用户图像之后,通过将衣服区域覆盖到头发变形后的用户图像上,得到换装图像。
如图23所示,图23中的图(a)为换装前的原图像,图(c)为执行换装处理之后的图像,在换装前,原图像中的用户为长发后披,经过上述步骤I1至步骤I4的流程处理之后,将服装模板图像上的衣服区域按照坐标对应关系覆盖到图像上实现换装,由图(c)可以看出,在头发与服装之间没有出现缝隙。
在定位出头发区域和人脸区域后,通过将人脸区域向头顶方向膨胀得到保护区域,保护区域包含不需要处理的头发区域,从而通过定位出的头发区域和保护区域获得待处理区域,然后再沿与头顶方向相反的方向对用户图像上的待处理区域进行变形处理,获得头发变形后的用户图像。
进一步地,当应用在换装场景中时,将人脸区域向头顶方向膨胀将不需要处理的头发覆盖掉,留下待处理区域,从而后续沿向下方向对待处理区域进行变形处理后,即使执行换装处理,头发区域与服装之间也不会出现缝隙,可以确保换装后服装与头发的无缝衔接。
为了便于理解头发变形处理在换装过程中应用,下面结合附图进行说明。如图24所示,接收用户上传的用户图片和服装模板图片,对用户图片和服装模板图片均进行对齐处理,使得对齐后的用户图片和服装模板图片大小一致,并且两张图片中的人体均对齐,然后对用户图片中的头发进行分类,得到分类结果,并定位服装模板图片中的衣服区域,如果分类结果为短发或者头发前披,则不需要进行变形处理,可以直接将衣服区域按照坐标对应关系覆盖到用户图片上实现换装;如果分类结果为长发后披,则定位用户图片中的头发区域和人脸区域,并根据衣服区域和头发区域进一步判定是否需要对头发区域进行变形处理,在判定需要变形处理时,将人脸区域向头顶方向膨胀得到保护区域,然后利用头发区域和保护区域确定待处理区域,并沿与头顶方向相反的方向对用户图片上的待处理区域进行变形处理,得到头发变形后的用户图片,最后将衣服区域按照坐标对应关系覆盖到头发处理后的用户图片上实现换装。
基于上述描述可知,在换装场景中,通过对用户图片中的头发区域进行分类,在分类结果为长发后披时,再根据服装模板图片中的衣服区域与头发区域判定是否需要对头发区域进行变形处理,如果判定需要,则通过将人脸区域向头顶方向膨胀以将不需要处理的头发区域覆盖得到保护区域,然后利用保护区域和头发区域得到待处理区域,再沿与头顶方向相反的方向对用户图片上的待处理区域进行变形处理,获得头发变形后的用户图片,进而再将衣服区域覆盖到用户图片上实现换装,由于头发区域已经完成拉伸变形,因此换装后,头发与服装之间不会出现缝隙,换装效果比较好。
通过上述方式在头发类别为长发往后披时对头发区域进行变形处理,之后执行步骤F3或G4的操作完成换装,得到换装效果图。
通过本申请根据用户图像和服装模板图像完成换装之后,可以将效果图缩放为预设尺寸,如证件照通常有规定的尺寸。缩放为预设尺寸之后即得到了最终的图像,将该最终的图像返回给用户。
在本申请的另一些实施方式中,用户上传的用户图像可能不需要进行换装操作,例如在证件照场景中用户上传的用户图像中的服装本身就是符合要求的正装,用户未选定需要换装的服装模板图像,则可以只将用户上传的用户图像缩放为预设尺寸即可。
在另一些实施方式中,还预先配置好了换装场景下用户图像所需符合的预设条件,接收到用户上传的用户图像后,首先判断用户图像是否符合预设条件,若符合则通过本申请的实施方式对用户图像进行换装、尺寸缩放等处理。若确定用户图像不符合预设条件,则返回用户图像不符合要求的提示信息,以便用户重新上传满足要求的用户图像。
上述预设条件是与具体的换装场景相关的,例如在证件照场景中,该预设条件可以包括用户图像中需包含完整的人脸区域及至少部分的脖子区域等。
在本申请实施例中,确定了用户图像中的脖子关键点和服装模板图像中的衣服关键点,对用户图像和服装模板图像中的头发区域、脸部区域、脖子区域、衣服区域等人体区域进行了分割。基于这些处理对用户图像的脖子区域进行修复,对服装模板图像中的衣服区域进行变形、对头发区域进行变形等操作,实现将服装模板图像中的衣服区域覆盖到用户图像中得到很好的换装效果。或者,对服装模板图像中的脖子区域进行颜色迁移,对服装模板图像中的脖子区域和衣服区域进行变形,对头发区域进行变形等操作,实现将服装模板图像中的脖子区域和衣服区域覆盖到用户图像中得到很好的换装效果。
本申请实施例还提供一种虚拟换装装置,用于执行上述任一实施例提供的虚拟换装方法。如图25所示,该装置包括:
图像获取模块201,用于获取待换装的用户图像和服装模板图像;
关键点获取模块202,用于获取用户图像对应的脖子关键点和服装模板图像对应的衣服关键点;
脖子遮挡检测模块203,用于检测用户图像中的脖子是否被遮挡;
生成模块204,用于若脖子遮挡检测模块检测出用户图像中的脖子被遮挡,则根据脖子关键点和衣服关键点,利用服装模板图像中的脖子区域,生成用户图像和服装模板图像对应的换装效果图;若脖子遮挡检测模块检测出用户图像中的脖子未被遮挡,则根据脖子关键点和衣服关键点,利用用户图像中的脖子区域,生成用户图像和服装模板图像对应的换装效果图。
生成模块204,用于根据脖子关键点、衣服关键点、用户图像和服装模板图像,对用户图像中的脖子区域进行修复;根据脖子关键点和衣服关键点,对服装模板图像中的服装区域进行变形处理;将变形后的服装模板图像的服装区域覆盖到修复后的用户图像中,得到换装效果图。
还包括:脖子修复模块,用于根据脖子关键点、衣服关键点、用户图像和服装模板图像,生成用户图像中脖子的待修复区域掩膜图像;若待修复区域掩膜图像中待修复区域的面积大于0,则生成用户图像对应的背景修复图;根据待修复区域掩膜图像和背景修复图,对用户图像中的脖子区域进行修复。
脖子修复模块,用于根据用户图像,获取用户图像中脖子区域对应的脖子掩膜图像;根据脖子关键点、衣服关键点和服装模板图像,获取服装模板图像对应的服装掩膜图像;根据脖子掩膜图像和服装掩膜图像,生成用户图像中脖子的待修复区域掩膜图像。
脖子修复模块,用于检测用户图像中的所有人脸关键点;根据人脸关键点,对用户图像进行人脸对齐处理;通过预设语义分割模型从对齐后的用户图像中分割出脖子区域;生成脖子区域对应的脖子掩膜图像。
脖子修复模块,用于将服装模板图像中的衣服关键点与脖子关键点对齐;将对齐后的服装模板图像确定为服装掩膜图像。
脖子修复模块,用于根据脖子掩膜图像中的脖子关键点和服装掩膜图像中的衣服关键点,对脖子掩膜图像和服装掩膜图像进行拼接,得到拼接掩膜图像;在拼接掩膜图像中确定出从服装领口边缘至脖子区域上边缘的待检测区域;从待检测区域中确定出待修复区域;生成待修复区域对应的待修复区域掩膜图像。
脖子修复模块,用于遍历待检测区域中每个像素点的归属图像;筛选出归属图像既不是脖子掩膜图像也不是服装掩膜图像的所有像素点;将筛选出的所有像素点所组成的区域确定为待修复区域。
脖子修复模块,用于对待检测区域中的每列像素,计算同一列像素中领口边缘像素点的纵坐标与脖子区域下边缘的像素点的纵坐标之间的差值;标记出差值大于零的领口边缘像素点和脖子区域下边缘的像素点;将标记出的所有像素点的连线围成的区域确定为待修复区域。
脖子修复模块,用于提取用户图像中脖子区域的主颜色;绘制主颜色对应的纯色背景图;从用户图像中扣取出头颈部区域的图像;将头颈部区域的图像覆盖到纯色背景图中,得到用户图像对应的背景修复图。
脖子修复模块,用于确定用户图像的脖子区域内包含的所有颜色值;统计脖子区域中各颜色值对应的像素点数目;将像素点数目最多的颜色值确定为脖子区域的主颜色。
脖子修复模块,用于将待修复区域掩膜图像和背景修复图输入预设图像修复网络中,得到用户图像对应的修复后图像。
生成模块204,用于根据用户图像,对服装模板图像中的脖子区域进行颜色迁移处理;根据脖子关键点,对服装模板图像中的脖子区域进行变形处理;根据脖子关键点和衣服关键点,对服装模板图像中的服装区域进行变形处理;将变形后的服装模板图像的脖子区域和服装区域覆盖到用户图像中,得到换装效果图。
还包括:颜色迁移模块,用于提取用户图像中面部皮肤主颜色和第一颈部皮肤主颜色;根据面部皮肤主颜色和第一颈部皮肤主颜色,调整服装模板图像的脖子区域的颜色。
颜色迁移模块,用于计算用户图像的第一颈部面积和用户图像的面部面积的比值,并确定比值是否位于预设区间内;若是,则将面部皮肤主颜色和第一颈部皮肤主颜色进行融合,并根据融合后的主颜色调整服装模板图像的脖子区域中每个像素点的UV通道值;若否,且比值大于预设区间的上限值,则根据第一颈部皮肤主颜色调整服装模板图像的脖子区域中每个像素点的UV通道值;若否,且比值小于预设区间的下限值,则根据面部皮肤主颜色调整服装模板图像的脖子区域中每个像素点的UV通道值。
颜色迁移模块,用于分别将面部皮肤主颜色和第一颈部皮肤主颜色的颜色空间转换至YUV颜色空间下,并获取YUV颜色空间下面部皮肤主颜色的UV通道值和第一颈部皮肤主颜色的UV通道值;根据面部皮肤主颜色的UV通道值和相应的权重系数,及第一颈部皮肤主颜色的UV通道值和相应的权重系数,确定融合主颜色的UV通道值;将服装模板图像的脖子区域中每个像素点的UV通道值均替换为融合主颜色的UV通道值。
颜色迁移模块,用于将第一颈部皮肤主颜色的颜色空间转换至YUV颜色空间下,并获取YUV颜色空间下第一颈部皮肤主颜色的UV通道值;将服装模板图像的颜色空间转换至YUV颜色空间下;将服装模板图像的脖子区域中每个像素点的UV通道值均替换为第一颈部皮肤主颜色的UV通道值。
颜色迁移模块,用于将面部皮肤主颜色的颜色空间转换至YUV颜色空间下,并获取YUV颜色空间下面部皮肤主颜色的UV通道值;将服装模板图像的颜色空间转换至YUV颜色空间下;将服装模板图像的脖子区域中每个像素点的UV通道值均替换为面部皮肤主颜色的UV通道值。
颜色迁移模块,用于提取服装模板图像的第二颈部皮肤主颜色;根据第二颈部皮肤主颜色的亮度值和面部皮肤主颜色的亮度值,调整服装模板图像的脖子区域中每个像素点的亮度。
颜色迁移模块,用于根据第二颈部皮肤主颜色的亮度值和面部皮肤主颜色的亮度值,确定亮度调整参数;基于亮度调整参数调整服装模板图像的脖子区域中每个像素点的亮度。
颜色迁移模块,用于将第二颈部皮肤主颜色和面部皮肤主颜色的颜色空间均转换至HSV颜色空间下;分别获取HSV颜色空间下面部皮肤主颜色的第一亮度值和第二颈部皮肤主颜色的第二亮度值;根据第二亮度值和第一亮度值,计算亮度调整参数。
还包括:脖子变形模块,用于获取服装模板图像中脖子区域的脖子关键点;根据用户图像对应的脖子关键点和服装模板图像对应的脖子关键点,确定服装模板图像中脖子区域变形前后的坐标映射矩阵;根据脖子区域变形前后的坐标映射矩阵,对服装模板图像中的脖子区域进行变形处理。
还包括:服装变形模块,用于根据脖子关键点和衣服关键点,确定服装模板图像中服装区域变形前后的坐标映射矩阵;根据坐标映射矩阵对服装模板图像中的服装区域进行变形处理。
服装变形模块,用于根据脖子关键点和衣服关键点,计算服装模板图像中服装区域变形前后的横坐标映射矩阵;根据脖子关键点和衣服关键点,计算服装区域变形前后的纵坐标映射矩阵。
服装变形模块,用于根据每个脖子关键点的横坐标,沿水平方向将用户图像的宽度划分为多段第一横坐标区间;根据每个衣服关键点的横坐标,沿水平方向将服装模板图像的宽度划分为多段第二横坐标区间,第一横坐标区间的数目与第二横坐标区间的数目相等;根据多段第一横坐标区间和多段第二横坐标区间,利用线性插值和变形坐标映射函数计算服装模板图像中服装区域对应的横坐标映射矩阵。
服装变形模块,用于根据脖子关键点和衣服关键点,计算服装区域中每个横坐标对应的纵坐标的缩放系数;根据服装模板图像的高度、服装区域每个坐标点的纵坐标及每个纵坐标对应的缩放系数,利用变形坐标映射函数计算服装区域对应的纵坐标映射矩阵。
服装变形模块,用于根据每个脖子关键点的横坐标,沿水平方向将用户图像的宽度划分为多段第一横坐标区间;根据服装模板图像的高度、脖子关键点和衣服关键点,分别计算每个衣服关键点的纵坐标对应的缩放系数;根据多段第一横坐标区间和每个衣服关键点的纵坐标对应的缩放系数,利用线性插值和变形坐标映射函数计算服装区域中每个横坐标对应的纵坐标的缩放系数。
服装变形模块,用于对服装模板图像中服装区域进行整体缩放处理,缩放后服装模板图像中领口边界线上纵坐标最大的关键点与用户图像中锁骨区域位于脖子竖直中轴线上的关键点重合;重新计算整体缩放处理后服装模板图像中的每个衣服关键点。
服装变形模块,用于根据服装模板图像的高度、服装模板图像中领口左右两侧边界线的交点的纵坐标以及用户图像中锁骨区域位于脖子竖直中轴线上的脖子关键点的纵坐标,计算整体缩放系数;根据服装模板图像的高度、服装区域每个坐标点的纵坐标及整体缩放系数,利用变形坐标映射函数计算服装区域在整体缩放处理前后的纵坐标映射矩阵。
服装变形模块,用于保持整体缩放处理后每个衣服关键点的横坐标不变;根据服装模板图像的高度、整体缩放系数及整体缩放处理前每个衣服关键点的纵坐标,分别计算整体缩放处理后每个衣服关键点的纵坐标。
服装变形模块,用于根据服装模板图像的高度、整体缩放处理前后的纵坐标映射矩阵及每个纵坐标对应的缩放系数,利用变形坐标映射函数计算服装区域对应的最终的纵坐标映射矩阵。
服装变形模块,用于根据坐标映射矩阵包括的横坐标映射矩阵,通过预设变形算法对服装模板图像中的服装区域进行水平方向的变形处理;根据坐标映射矩阵包括的纵坐标映射矩阵,通过预设变形算法对服装区域进行竖直方向的变形处理。
还包括:头发变形处理,用于获取用户图像中的头发区域的分类结果;若分类结果为长发往后披类别,则根据服装模板图像中的衣服区域与头发区域判定是否需要对头发区域进行变形处理;若是,则对用户图像中的头发区域进行变形处理。
头发变形处理,用于逐列遍历衣服区域与头发区域之间相邻边缘的纵坐标差;从纵坐标差中获取最大纵坐标差;如果最大纵坐标差小于预设值,则确定不需要对头发区域进行变形处理;如果最大纵坐标差大于预设值,则确定需要对头发区域进行变形处理;其中,纵坐标差为衣服区域边缘的纵坐标减去头发区域下边缘的纵坐标。
头发变形处理,用于将用户图像的人脸区域向头顶方向膨胀,以得到保护区域;利用头发区域和保护区域确定待处理区域;沿与头顶方向相反的方向对用户图像上的待处理区域进行变形处理,得到头发变形后的用户图像。
头发变形处理,用于获取待处理区域上每列对应的变形系数;根据待处理区域上每列对应的变形系数,沿与头顶方向相反的方向对用户图像上的待处理区域进行变形处理,得到头发变形后的用户图像。
头发变形处理,用于获取待处理区域上每列的最大纵坐标和最小纵坐标;针对待处理区域上每列,根据列的最大纵坐标、最小纵坐标以及变形系数,确定列的变形后纵坐标;根据待处理区域上每列的变形后纵坐标、最小纵坐标、最大纵坐标,对用户图像上的待处理区域进行变形处理。
头发变形处理,用于获取头发区域上每列的最大纵坐标和最小纵坐标,以及获取衣服区域上每列的最小纵坐标;针对头发区域上每列,利用头发区域上列的最大纵坐标和最小纵坐标、衣服区域上列的最小纵坐标,确定列对应的变形系数;其中,待处理区域的列与头发区域的列相同。
头发变形处理,用于分别利用用户图像的宽度和高度生成第一map矩阵和第二map矩阵,以由第一map矩阵和第二map矩阵表示用户图像的横坐标和纵坐标之间的映射关系;根据待处理区域上每列的变形后纵坐标、最小纵坐标、最大纵坐标进行线性插值,以更新第二map矩阵;利用第一map矩阵和更新后的第二map矩阵对用户图像上的待处理区域进行变形处理。
头发变形处理,用于对头发区域和保护区域之间进行集合相减操作,以得到待处理区域。
脖子遮挡检测模块203,用于根据用户图像中目标区域的占比确定待检测图像;将待检测图像输入已训练的脖子遮挡检测模型,以由脖子遮挡检测模型判定待检测图像中的脖子是否被遮挡。
脖子遮挡检测模块203,用于检测用户图像中包含脖子的人脸区域作为目标区域;确定目标区域的面积与用户图像的面积之间的占比;如果占比超过占比阈值,则将用户图像确定为待检测图像;如果占比未超过占比阈值,则从用户图像中抠取目标区域,并对抠取出的目标区域进行尺寸放大后确定为待检测图像。
脖子遮挡检测模型包括第一分支网络、第二分支网络、融合模块、以及输出层,第一分支网络与第二分支网络并行且独立执行;脖子遮挡检测模块203,用于通过脖子遮挡检测模型中的第一分支网络对待检测图像进行第一预设卷积处理,得到第一特征图;通过脖子遮挡检测模型中的第二分支网络对待检测图像进行第二预设卷积处理,得到第二特征图;通过脖子遮挡检测模型中的融合模块对第一特征图和第二特征图进行通道融合,得到融合特征图;通过脖子遮挡检测模型中的输出层基于融合特征图获得脖子是否被遮挡的判定结果。
第一分支网络包括第一深度可分离卷积层和第一上采样层;脖子遮挡检测模块203,用于通过第一深度可分离卷积层包含的一个卷积核对待检测图像的一个通道进行特征提取,得到单通道特征图;通过第一上采样层包含的预设数量通道1*1卷积核对单通道特征图进行升维处理,得到第一特征图。
第二分支网络包括下采样层、第二深度可分离卷积层和第二上采样层;脖子遮挡检测模块203,用于通过下采样层包含的单通道的1*1卷积核对待检测图像进行降维处理,得到单通道特征图;通过第二深度可分离卷积层包含的一个卷积核对单通道特征图进行特征提取,得到提取特征后的单通道特征图;通过第二上采样层包含的预设数量通道1*1卷积核对提取特征后的单通道特征图进行升维处理,得到第二特征图。
脖子遮挡检测模块203,用于通过融合模块中的通道拼接层对第一特征图和第二特征图按通道进行特征图叠加,得到通道叠加后的特征图;通过融合模块中的通道混合层对通道叠加后的特征图的通道叠加顺序进行打乱,得到融合特征图。
脖子遮挡检测模块203,用于获取数据集,数据集中的样本包含正样本和负样本;遍历数据集中的每一样本,将当前遍历的样本输入预先构建的脖子遮挡检测模型,以由脖子遮挡检测模型对样本进行脖子遮挡与否的预测并输出预测结果;利用预测结果、正负样本平衡系数、以及样本数量平衡系数计算损失值;在损失值的变化率大于变化阈值时,根据损失值优化脖子遮挡检测模型的网络参数,并调整正负样本平衡系数和样本数量平衡系数,并继续执行遍历数据集中的每一样本的过程,直至损失值的变化率低于变化阈值结束。
脖子遮挡检测模块203,用于对数据集中的每一样本每进行一种数据增强处理,并将处理后的样本添加到数据集中,以扩充数据集。
脖子遮挡检测模块203,用于如果损失值大于预设阈值,则将正负样本平衡系数和样本数量平衡系数均增大第一步长;如果损失值小于预设阈值,则将正负样本平衡系数和样本数量平衡系数均增大第二步长;其中,第一步长大于第二步长。
还包括:脖子关键点检测模块,用于确定样本图中由标注的脖子关键点与参考点决定的直线所具有的实际斜率;将样本图输入预先构建的脖子关键点检测模型,以由脖子关键点检测模型进行学习,并输出脖子关键点;利用模型输出的脖子关键点、标注的脖子关键点、以及实际斜率计算损失值;在损失值大于预设值时,根据损失值优化脖子关键点检测模型的网络参数,并继续执行将样本图输入预先构建的脖子关键点检测模型的过程,直至损失值低于预设值结束。
脖子关键点检测模块,用于获取数据集,数据集中的每一样本图均包含用户头像;针对数据集中每一样本图,定位样本图中的脖子区域;检测脖子区域与衣服接触边缘的中间点确定为参考点;在样本图上标注脖子关键点,并确定由标注的脖子关键点与参考点决定的直线所具有的实际斜率。
脖子关键点检测模块,用于利用预设斜率确定一条经过参考点的直线;将直线与脖子区域边缘之间的交点作为一个脖子关键点标注在样本图上;将直线进行水平翻转,并将翻转后的直线与脖子区域边缘之间的交点作为另一个脖子关键点标注在样本图上;对样本图上标注的脖子关键点进行微调。
脖子关键点检测模块,用于将样本图输入预设的分割模型,以由分割模型对样本图进行语义分割;将语义分割结果为脖子的像素所组成的区域确定为脖子区域。
脖子关键点检测模块,用于获取模型输出的脖子关键点与标注的脖子关键点之前的位置误差;根据位置误差和实际斜率确定损失权重;确定携带模型输出的脖子关键点的样本图向量信息与携带标注的脖子关键点的样本图向量信息之间的欧式距离;利用损失权重和欧式距离计算损失值。
还包括:人体区域分割模块,用于获取多个原始人物图像;基于预设语义分割模型和预设抠图模型,对每个原始人物图像中各人体区域进行标注,得到训练数据集;构建基于注意力机制的分割模型的网络结构;根据训练数据集,对分割模型的网络结构进行训练,得到用于进行人体区域分割的图像分割模型;通过图像分割模型对用户图像和服装模板图像进行人体区域分割。
人体区域分割模块,用于基于原始人物图像,采用预设语义分割模型获得原始人物图像各人体区域的语义分割结果;通过预设抠图模型对原始人物图像对应的语义分割结果进行修正;根据修正后的语义分割结果,标注原始人物图像中的各人体区域;将标注后的原始人物图像存储在训练数据集中。
人体区域分割模块,用于通过预设抠图模型对原始人物图像进行抠图处理,划分出原始人物图像的前景像素区域和背景像素区域;若抠图结果指示第一像素点为背景像素,且语义分割结果指示第一像素点为前景像素,则将第一像素点的语义分割结果修正为背景像素;若抠图结果指示第一像素点为前景像素,且语义分割结果指示第一像素点为背景像素,则确定距离第一像素点最近且与第一像素点的语义分割结果不同的目标像素点,将目标像素点的语义分割结果确定为第一像素点的语义分割结果。
人体区域分割模块,用于计算对原始人物图像和预设语义分割模型的预设标准图像进行人脸对齐操作所要使用的仿射变换矩阵;基于仿射变换矩阵对原始人物图像进行矩阵变换,得到原始人物图像对应的变换后图像;基于原始人物图像和变换后图像,采用预设语义分割模型获得原始人物图像对应的语义分割结果
人体区域分割模块,用于将仿射变换矩阵进行分解,分别得到旋转矩阵、平移矩阵及缩放矩阵;分别基于旋转矩阵、平移矩阵及缩放矩阵对原始人物图像进行旋转、平移变换及缩放变换,得到第一变换后图像;基于缩放矩阵和预设放大倍数的缩放矩阵对应的图像尺寸分别对第一变换后图像进行裁剪,得到多个第二变换后图像。
人体区域分割模块,用于基于原始人物图像和第二变换后图像,采用语义分割模型分别获得原始人物图像各人体区域的语义分割结果和各第二变换后图像各人体区域的语义分割结果;
根据各第二变换后图像各人体区域的语义分割结果对原始人物图像各人体区域的语义分割结果进行修正,获得原始人物图像对应的语义分割结果。
人体区域分割模块,用于确定原始人物图像和各第二变换后图像的分割结果置信度;分割结果置信度与所在图像的尺寸成反比例关系;对于原始人物图像的每个像素点,确定其所在的原始人物图像和/或各第二变换后图像的分割结果置信度,将对应分割结果置信度最高的语义分割结果作为该像素点的语义分割结果。
人体区域分割模块,用于通过数据增强库对标注后的原始人物图像进行数据增强,得到增强数据集;对增强数据集中的部分图像进行多尺度的随机裁剪,得到训练数据集。
人体区域分割模块,用于将训练数据集中的样本图像输入基于注意力机制的分割模型,得到样本图像的分割结果;根据每个样本图像的分割结果和标注信息,计算当前训练周期的整体损失值;通过优化器和学习率调度器对每个周期训练后的基于注意力机制的分割模型进行优化。
人体区域分割模块,用于根据每个样本图像的分割结果和标注信息,通过交叉熵损失函数计算当前训练周期的交叉熵损失值;根据每个样本图像的分割结果和标注信息,通过Dice损失函数计算当前训练周期的的Dice损失值;根据交叉熵损失值和Dice损失值计算当前训练周期的整体损失值。
本申请的上述实施例提供的虚拟换装装置与本申请实施例提供的虚拟换装方法出于相同的发明构思,具有与其存储的应用程序所采用、运行或实现的方法相同的有益效果。
本申请实施方式还提供一种电子设备,以执行上述虚拟换装方法。请参考图26,其示出了本申请的一些实施方式所提供的一种电子设备的示意图。如图26所示,电子设备8包括:处理器800,存储器801,总线802和通信接口803,所述处理器800、通信接口803和存储器801通过总线802连接;所述存储器801中存储有可在所述处理器800上运行的计算机程序,所述处理器800运行所述计算机程序时执行本申请前述任一实施方式所提供的虚拟换装方法。
其中,存储器801可能包含高速随机存取存储器(RAM:Random Access Memory),也可能还包括非不稳定的存储器(non-volatile memory),例如至少一个磁盘存储器。通过至少一个通信接口803(可以是有线或者无线)实现该装置网元与至少一个其他网元之间的通信连接,可以使用互联网、广域网、本地网、城域网等。
总线802可以是ISA总线、PCI总线或EISA总线等。所述总线可以分为地址总线、数据总线、控制总线等。其中,存储器801用于存储程序,所述处理器800在接收到执行指令后,执行所述程序,前述本申请实施例任一实施方式揭示的所述虚拟换装方法可以应用于处理器800中,或者由处理器800实现。
处理器800可能是一种集成电路芯片,具有信号的处理能力。在实现过程中,上述方法的各步骤可以通过处理器800中的硬件的集成逻辑电路或者软件形式的指令完成。上述的处理器800可以是通用处理器,包括中央处理器(Central Processing Unit,简称CPU)、网络处理器(Network Processor,简称NP)等;还可以是数字信号处理器(DSP)、专用集成电路(ASIC)、现成可编程门阵列(FPGA)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件。可以实现或者执行本申请实施例中的公开的各方法、步骤及逻辑框图。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等。结合本申请实施例所公开的方法的步骤可以直接体现为硬件译码处理器执行完成,或者用译码处理器中的硬件及软件模块组合执行完成。软件模块可以位于随机存储器,闪存、只读存储器,可编程只读存储器或者电可擦写可编程存储器、寄存器等本领域成熟的存储介质中。该存储介质位于存储器801,处理器800读取存储器801中的信息,结合其硬件完成上述方法的步骤。
本申请实施例提供的电子设备与本申请实施例提供的虚拟换装方法出于相同的发明构思,具有与其采用、运行或实现的方法相同的有益效果。
本申请实施方式还提供一种与前述实施方式所提供的虚拟换装方法对应的计算机可读存储介质,请参考图27,其示出的计算机可读存储介质为光盘30,其上存储有计算机程序(即程序产品),所述计算机程序在被处理器运行时,会执行前述任意实施方式所提供的虚拟换装方法。
需要说明的是,所述计算机可读存储介质的例子还可以包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他光学、磁性存储介质,在此不再一一赘述。
本申请的上述实施例提供的计算机可读存储介质与本申请实施例提供的虚拟换装方法出于相同的发明构思,具有与其存储的应用程序所采用、运行或实现的方法相同的有益效果。
需要说明的是:
在此处所提供的说明书中,说明了大量具体细节。然而,能够理解,本申请的实施例可以在没有这些具体细节的情况下实践。在一些实例中,并未详细示出公知的结构和技术,以便不模糊对本说明书的理解。
类似地,应当理解,为了精简本申请并帮助理解各个发明方面中的一个或多个,在上面对本申请的示例性实施例的描述中,本申请的各个特征有时被一起分组到单个实施例、图、或者对其的描述中。然而,并不应将该公开的方法解释成反映如下示意图:即所要求保护的本申请要求比在每个权利要求中所明确记载的特征更多的特征。更确切地说,如下面的权利要求书所反映的那样,发明方面在于少于前面公开的单个实施例的所有特征。因此,遵循具体实施方式的权利要求书由此明确地并入该具体实施方式,其中每个权利要求本身都作为本申请的单独实施例。
此外,本领域的技术人员能理解,尽管在此所述的一些实施例包括其它实施例中所包括的某些特征而不是其它特征,但是不同实施例的特征的组合意味着处于本申请的范围之内并且形成不同的实施例。例如,在下面的权利要求书中,所要求保护的实施例的任意之一都可以以任意的组合方式来使用。
以上所述,仅为本申请较佳的具体实施方式,但本申请的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本申请揭露的技术范围内,可轻易想到的变化或替换,都应涵盖在本申请的保护范围之内。因此,本申请的保护范围应以所述权利要求的保护范围为准。