原文英文链接: AutoHair: fully automatic hair modeling from a single image
Overview:
该文章首次提出了基于单张图片,在无需用户交互输入情况下,快速重建3D头发模型的方法。该方法的核心包括:
- 基于深度学习网络的发型解析算法,支持基于单张2D肖像头发图片,输出头发的2D分割掩码图(Mask),以及生长方向描述。为支持神经网络的训练,构建了手动标注的2D发型图片库,标注信息包括了头发分割掩码图、生长方向图、基于聚类方法得到的头发分类类型;
- 3D头发模型库。基于少量3D发型扩展生成大量不同类型的3D头发模型库。数据库包含了3D头发模型、正向(front-view)头发分割图、不同角度的渲染图,以及发型生长方向图等元数据;
- 基于数据驱动发型匹配和头发建模方法,支持2D头发图片到3D头发模型的快速搜索匹配,以及基于分割模版和头发生成信息,自动拟合变形得到与2D输入形状一致的3D头发模型。
该方法的整体流程如下图所示:
解析器训练
步骤一:构建肖像发型的2D图片库,并手工标注头发分割图和头发生长方向。
步骤二:根据头发的空间分布,使用基于K-means聚类将头发库中的图片划分为给定的类型,并标注其头发类型(论文中采用四种类型)。
步骤三:根据标注的头发类型,训练R-CNN头发分类器,学习头发的分类。
步骤四:针对训练库中的每种类型的头发子集,分别训练独立的头发解析DCNN+CRFs网络,联合学习头发区域和生长方向。
3D头发库扩展
步骤一:清洗公开数据集中的3D头发模型,包括头发模型的对齐、剔除悬空的头发缕、拆分过宽的头发缕。
步骤二:扩展数据集,通过在不同头发模型之间替换和混合发束,合成新的头发模型。
步骤三:依据头发正视图掩码大小排序头发模型,并渲染3D头发模型得到头发区域图和方向图。
运行阶段
步骤一:根据训练得到的头发分类器,预测输入图像中头发的类型。
步骤二:根据头发的类型,调用对应类型的头发解析网络,输出头发分割区域图以及生长方向。
步骤三:通过头发分割图和生长方向图联合搜索3D头发库,匹配最相近的头发模型。
步骤四:对匹配候选头发模型依据轮廓进一步精细化变形,并细化成发丝,得到与输入2D头发对应的3D头发模型。
3D头发生成可应用于众多的领域,包括肖像立体化(portrait pop-ups)、发型迁移、虚拟头发试戴与编辑、浮雕3D打印、头发重打光(Relighting)、头发物理仿真等领域。
Hair Image Parsing
解析2D头发的目的是输出对应的头发掩码图和生长方向,用于后期的3D头发模型检索、几何变形和发丝细化。
由于复杂的几何结构和外观表现,很难准确的分割头发区域。常用基于经验假设的分割方法存在各种缺陷:
- 基于头发分布在人脸两侧假设的方法,对长头发难以处理;
- 基于头发颜色特定分布假设的方法,在环境光照、染发以及复杂混合背景等情况下,稳定性较差;
- 基于头发像素在局部高频变化假设的方法,较难处理黑发以及低分辨率图像。
由于无法找到一种通用的经验方法满足头发精确分割,可以采用end-to-end的深度学习方法。目前深度学习方法对于任意类型头发的分割也存在边界不准确和错误的情况。该文提出了针对不同类型发型,分别训练特定的分割网络,提高了头发分割的精度。具体来说,先通过聚类方法将头发训练图片分为若干类型(无需手动标注头发类型),得到标签后再训练一个分类网络用于预测新图片的头发类型。针对每种头发类型,训练头发分割网络。将新图片输入到与其头发类型对应的分割网络中,得到精确的头发分割图。
Preprocessing Training Images
该文从Flickr上爬取约10万张人脸肖像头发图片作为头发分割训练数据集,并进行如下预处理操作:
- 图像选择:选取2万张高分辨率,包括清晰的人脸和头发图片,去除过度遮挡、以及光照不充分和过份风格化的图片。
- 头发分割:采用基于笔刷的交互式工具分割和抠图工具PaintSelection,获取每张图的二值发型区域图。
- 方向引导:在发型的分割区域内,通过在方向分界处绘制笔刷,将分割区域进一步划分为不同的子区域。每个子区域保持了一致而连续的发丝生长方向,并通过单个笔刷标记该区域的头发生长方向。扩散笔刷标记方向到整个子区域,并与逐像素的非方向朝向图[1]结合,得到最终的方向图。将方向范围离散化到四个区块(例如,, , , ),根据头发生长方向,计算每个头发像素所属的方向区域,并为像素指定区域标记,从而生成头发的方向标记图。发型区域外的像素指定一个特殊的标记,因此图像中每个像素在方向标记图中有唯一的标示符。
经过手工处理的每张训练图片均包含两个标记图:二进制的分割掩码图描述头发的区域,以及方向标记图描述离散化的逐像素发丝生长方向。全局的发型生长方向图与局部的非方向朝向图结合可以解决发丝方向的歧义性。由于局部的非方向朝向图可以由图像信息计算得到,算法只需要确定像素的方向符号,因此一个粗略的方向标记图即可较好的描述全局发型生长方向。(通过结合由图像信息推算得到的合成得到全局方向图,因此用更少数据的描述全局方向即可)
Computing Hair Distribution Classes
发型形状和分布的巨大差距导致难以精确的分割头发。该文依据图像空间中头发在人脸周围的空间分布情况,聚类为若干头发类型。根据每种类型分别定制特定的分割模型,提高头发分割的效果。
通过聚类方法确定头发类型的步骤为:
步骤一:使用人脸检测工具,获取图像中人脸的关键点。依据关键点对整幅图像刚性变化,将图像中人脸对齐到参考脸部坐标系统,以矫正缩放以及旋转方向上的差异。
步骤二:以人脸中心点为原点,构建极坐标系,并构建包含个块(bin)(该文选择16个块)的环形分布直方图(circular distribution histogram)。每个直方图块中包含了极坐标系下落在该块角度范围的头发像素的个数。对直方图进行单位归一化,作为该头发的分布特征向量。
步骤三:依据K-means算法将头发类聚类为4种基本类型。聚类过程种采用基于范式的推土机距离(Earth Mover's Distance, EMD)计算两个头发特征向量和的距离:
其中是索引为和的直方图块之间(bin)的环形距离:
头发经过聚类分割的效果图如下所示:
聚类的目的在于确定训练集中头发的类型,用于头发分类器以及相关类型头发分割模型的训练。运行测试阶段,会依据头发分类器来确定输入图片中头发的类型,而不会使用聚类方法确定头发类型。
Computing the Hierarchical Network
训练阶段
根据手工标注的发型图片,以及自动聚类得到的头发类型信息,用于训练头发分类器、发型区域预测器和发型生长方向预测器。
头发分类器采用R-CNN网络结构,通过数据集的发型区域和发型类型信息微调得到。
发型区域预测器和发型生长预测器均采用VGG16网络结构。原始模型基于ImageNet数据集训练,输出1000类的预测。修改输出为稠密的一元(unary)标记输出。其中头发区域预测标记可取值为两个,用于标示头发区域还是非头发区域;生长方向预测一元输出可取五个值,分别描述头发的四个生长方向和标识位于头发外。
解析阶段
完成头发分类器、头发分割器和头发生长预测器后,即可按照自顶向下(top-down)的方式完成发型的解析过程。
具体流程如下:
步骤一:通过人脸检测方法获取输入图像中的人脸检测框,依据检测框位置和大小,估算20组头发的典型候选区域。
步骤二:每个发型候选区通过旋转、缩放等操作后,生成一组头发备选区。在备选区域内使用训练得到的头发分类器,估计区域内头发的类型。综合选择得分最高的类型为最终类型。
步骤三:依据具体的发型,选择对应的头发分割器输出降采样的头发概率图。升采样输出图,并使用全连接的条件随机场(Conditional Random Field, CRF)避免分割结果过于光滑。最终分割输出与输入图同尺寸,包含半透明通道的头发区域图。
步骤四:依据具体的发型,选择对应的头发生长预测器,输出稀疏的像素方向标记。升采样输出图,并与直接计算得到的无方向像素朝向图结合,得到与输入图同尺寸的头发生长预测图。
头发解析的整体流程如下所示:
利用人脸检测框预估头发的候选区,避免的传统RCNN提取proposal所需要的较大计算量。此外通过限定头发的类型,提高了头发分割的准确性。
Hair Model Exemplars
利用3D头发数据集辅助头发建模是一种数据驱动(data-driven)的方法,由于数据集中包含了头发结构的先验结构信息,该类方法可以用于提高重建的效果。该文提出的3D头发数据集主要用于发型图片的检索,确定发型的大致形状和结构,用于下一步的头发丝细化,而非用于深度学习网络的训练。
在文献[4]中,头发融合是在用户使用笔刷指定头发大致方向后进行,用户需要等待时间。在本文头发的重组融合移至预计算阶段,避免了用户交互以及实时计算开销。通过穷尽式的组合方式构建大量的合理发型样本。
Preprocessing
原始3D头发数据集包含了从互联网下载的300多个典型的3D头发模型。头发模型由大量独立的细多边形带(polygon strips)组成,描述了方向和长度一致的一束头发,头发束的生长方向被编码存储在参数化纹理坐标中。所有头发模型均被对齐到一个标准的3D人头参考模型。
在进一步处理前,需要对头发几何数据进行清理:
- 剔除悬空多边形带:对于起始端没有连接到头皮而悬空的头发多边形带,查找与其末端在空间上最接近,并且起始端固定到头皮的相邻多边形带。将两者光滑连接,构成一个更长的而且连接到头皮的多边形带。
- 过宽多边形带分解:对于宽度超过指定预值(该文设置为人头模型半径的1/10)的多边形带,沿宽度方向均匀的对半细分,直到细分多边形带宽度都满足指定的预值。
Populating the Exemplars
为了扩展头发数据集的类型,将初始状态的多边形带聚合为若干组,重新组装这些组合成新的头发模型。
模型分解 :为了方便聚类处理,将每个多边形带简化定义为一个描述中心线的等间距多边形线及平均半径。针对每个头发模型,通过如下聚类公式将多边形带聚类为内间距最小的若干组多边形带束:
最终,每个头发模型的多边形带被划分为10组多边形聚类。
模型组合 :模型组合在每对3D头发模型样本之间进行,两个模型分别定义为目标模型和源模型。重组过程穷举测试的头发多边形带聚类。对于每个多边形带聚类,不改变位置将其融合到目标模型中(在预处理中已经将所有的头发模型对齐到同一个人头模型),得到新组合。从中剔除由于引入而导致头发三维朝向冲突的多边形带聚类,得到最终的合成头发。此外,为了避免目标和源模型差别太大而导致重组效果不自然,强制要求用于融合的多边形带聚类的边界形状不能与目标发型相差太大(实现中定义为两者边界距离不超过头部模型半径的30%)。
逐一轮询每对头发模型,穷举源模型的每条多边形带聚类进行组合,头发模型库数量由300扩充到4万,极大丰富了头发模型的类型。
Organization
计算每个头发模型在人头模型遮挡正视图(frontal view)下的投影图,并按照投影图面积的升序排列组织头发模型。这种组织方式支持在较早期根据头发分割面积进行剔除,从而提高检索匹配效率。
此外针对每个头发模型渲染如下的缩略图(thumbnail),用于进一步匹配:
- 区域缩略图:发型在头部遮挡后投影到图像平面的二值区域图。为了避免边界影响,采用高斯滤波器光滑处理。
- 方向缩略图:类似区域缩略图,将多边形的发型方向(方向向量XYZ映射为颜色通道RGB)作为颜色进行投影渲染。
为了支持非正向的输入图像,在俯仰和左右旋转两个方向的区间内,均匀的采样6个角度,得到组缩略图(包含和)。所有缩略图降采样到的分辨率便于高效存储和检索。
Data-Driven Hair Modeling
给定包含头发的肖像图像,通过图像解析计算,得到头发区域图和头发生长预测图。依据图像解析结果,在头发3D合成数据集{}中检索匹配若干候选模型。候选模型根据头发边界对应关系进行变形和改进,得到与输入图片中头发最相似的3D模型。根据头发生长信息对最佳相似模型进行细化,得到最终精细的3D发丝模型。
Image-Based Candidate Search
根据输入图像重建3D头发的第一步即在3D头发数据集中搜索相似的头发模型。由于数据集中头发模型数量较多,逐一比较效率太低。由于不同发型之间结构和形状差异较大,可以通过两步早期测试排除差异过大的头发模型,提高搜索效率。具体步骤如下:
- 面积测试:检测输入图像中脸部的特征点,依据特征点将输入图像对齐到脸部参考坐标系下。比较输入图中头发区域面积与数据集中模型的头发区域,只有面积位于区间的头发模型保留参与下一步的匹配。
- 缩略图匹配:对所有通过面积测试的头发模型,比较其缩略图(, )与输入图的解析缩结果(, )(原文前半部分并未出现此符号,推断是由解析结果降采样得到分辨率)。只有同时匹配发型区域边界和内部结构(例如头发像素生长方向)的模型,才会被保留。对于输入图为非正向视图,(, )为预计算的头发模型缩略图矩阵中,与输入图中人脸角度最接近的缩略图。匹配度计算公式为:
其中,表示的边界距离场[5]。表示两个区域图之间的差异区域。方向图和之间的差异定义为像素方向差之和:
算法仅保留满足和的模型为最终的匹配模型
实验过程中,对于典型的肖像图片,通常选择5~40个候选匹配模型。若匹配候选模型大于50,为保证算法效率只保留最小的50个模型。
Hair Shape Deformation
候选匹配模型需要进行变形使其能更好的与输入图片中头发匹配。具体的,首先计算头发模型的图像投影轮廓与图片中头发轮廓的对应关系,然后通过全局光滑插值计算两个发型区域的对应关系,最后基于全局对应关系,变形和优化3D头发模型,使之与输入图片中发型更为接近。
边界匹配:对每个候选区模型,通过人脸关键点将其对齐到输入图片中人脸角度,并且渲染输出与输入图片分辨率一致的区域图和方向图(, )。在头发模型投影轮廓和输入图片头发区域轮廓上分别均匀的采样200和2000个点,得到2D点序列集合和。两个轮廓上的任意采样点及其外法线分别表示为()和()。
计算两组采样点的对应关系来匹配两个轮廓。通过最小化如下匹配代价函数,可以得到与最匹配的点:
其中能量项和描述点和边的匹配质量,定义分别如下:
包含两项,用于避免匹配点的距离和朝向误差过大;用于尽量保证原始边通过映射后长度保持不变。
该优化函数通过隐式马尔可夫模型(Hidden Markov Model, HMM)框架下的Viteri算法求解。具体的,采样点集合和被视作HMM模型中的状态(states)和观察(observations)量集合。所求解的最小映射对应状态与观测集合张成的Trellis表中的最优路径。
区域映射:依据边界对应关系,通过使用薄板样条曲线(Thin-Plate-Spline, TPS)将边界对应关系插值到区域内的所有像素,得到区域之间的全局映射关系:
其中,为点经变形函数,对应位于输入图像头发区域中的点。为的二阶偏导数的Frobenius范数,用于表示该函数的光滑程度。实验中权重设置为1000。
变形优化:得到全局映射关系后,通过优化如下的能量函数,计算每个模型顶点变形后的顶点
其中,为3D头发模型的顶点集合。为顶点经过函数变形后的位置,其中只对XY坐标变形,Z值保持不变(由上一步得到是2D空间的变形函数,保证投影一致)。为基于余弦公式的离散Laplacian算子,为顶点的Laplacian坐标的模长,权重实验中取值为1。公式中第一项抑制三维顶点变形与变形函数计算的变形位置的偏差(完全一致能够保证头发区域投影与2D头发区域一致),第二项为Laplacian正则项,保证变形过程中保留局部几何特征。该目标函数可以通过非精确的高斯-牛顿方法(inexact Gauss-Newton)进行优化。
对每个匹配候选模型进行上述操作。经过变形后,候选模型更接近输入图片中发型。下图显示了经过头发模型变形后的效果图:
其中,图b描述了输入图(图a)头发区域与候选头发模型(图c)投影后头发区域及对应关系。图d描述了经过变形处理后的头发模型,更加接近输入图中的发型。
Final Hair Generation
给定变形后的候选头发模型集{},采用前面章节介绍的缩略图匹配方法,从集合中选择与输入图发型方向最一致的模型作为最终的头发模型。
将最终候选模型在模型包围盒空间内转化为一个三维空间方向场,并以指定的方向以及头皮法线作为约束,将方向扩散到整个发型内部。自头皮均匀采样,并按照发型方向生成10,000条发丝。生成的发丝再依据方向场变形[4]得到最终效果。
Reference
[1] Structure-aware hair capture
[2] AutoHair: fully automatic hair modeling from a single image
[3] AutoHair: fully automatic hair modeling from a single image (SIGGRAPH 2016 Presentation)
[4] Single-view hair modeling using a hairstyle database
[5] Detailed Human Shape and Pose from Images