文向东
(贵州师范大学数学科学学院,贵阳550001)
抠图技术是将图像中特定的目标区域精细提取出来的一种技术。除原始图像外,抠图算法还需要用到三分图,在三分图中,图像像素被分为了三个类别:目标区域像素,背景区域像素和未知区域像素。目标区域像素和背景区域像素是用户标注的部分已知类别像素。抠图算法需要确定未知区域中像素的类别归属。目前,多数算法基于这样的模型假设[1],即图像未知区域的像素C的实际取值满足公式:C=αF+(1-α)B,F是该位置前景图取值,B是该位置背景图取值,α是图像透明度,取值介于0与1之间。在这个公式中,C是已知的,F和B还有α都是未知的,要通过各种抠图算法来推测。
迄今为止抠图算法由传统算法和具有人工智能AI的深度学习算法组成。传统算法走到今天,都是在采样算法和传播算法的基础上发展,或者是将采样算法和传播算法相结合。
采样算法有代表性的是最早由Mishima等人[2]进行的蓝屏抠图、Yung-Yu Chuang等人提出了贝叶斯抠图算法[3]、Gastal E SL等人提出的共享采样抠图算法[4]和Ehsan-Shahrian等人提出的加权颜色与纹理抠图算法[5],后来Ehsan-Shahrian等人又在2013年提出了综合采样抠图算法[6],后来Levent Karacan在Image matting with KL-divergence based sparse sampling一文中提出利用KL-散度[7]对采样算法进行了改进。采样算法有一个缺点就是要求三分图做得较精细,才会有一个较好的抠图结果,为弥补这一缺点,Johnson J等人在Sparsecodesasalphamatte一文中利用稀疏编码抠图[8],应用传播算法作为后期处理,提高了最终抠图结果的质量。
传播算法比较有代表的是Jian Sun等人在2004年提出泊松抠图算法[9]和与之类似由L.Grady在2005年提出随机游走算法[10]。还有Anat Levin于2008年提出的封闭式抠图算法[11]和Zheng等人在2009年提出学习抠图算法[12]。传播算法的缺点是要求图像局部平滑,所以它对毛发较多的图像会产生较差的抠图结果[13]。
将采样算法和传播算法相结合的最初代表有鲁棒抠图算法[14](Robust Matting)和Y Aksoy提出的一种基于信息流[15]的抠图算法。但相结合做得最有代表性的是2010年由Eduardo S.L.Gastal和Manuel M.Oliveira发表的Rear-Time Alpha Matting[16]算法。这个算法不仅考虑:①所取样本的最小色彩失真,②还结合颜色的能量变化,进行图像的空间统计,最后结合,③像素点欧氏距离,④像素值RGB之间的差值距离,采取样本精修及局部平滑的手段,对最终前景和背景颜色进行判断。在此以后的传统算法,都是在此基础上稍加变化,在上述的四个方向中的某个方向稍加改进和突破,万变不离其宗。
而以神经网络为代表的深度学习算法,到目前为止已是相当成熟。最初有Donghyeon Cho等人提出的DCNN抠图算法[17],该算法将封闭式抠图[18]的阿尔法图、KNN抠图[19]的阿尔法图、归一化的自然图像作为神经网络的输入进行训练,将真实阿尔法图作为神经网络的期望输出。还有沈小勇等人针对人物肖像的自动抠图算法[20],它利用卷积神经网络制作导向图,利用封闭式抠图算法对图像进行抠图。而最有代表性的还是由Ning Xu、Brian Price、Scott Cohen、Thomas Huang做的Deep Image Matting[21],创建了一个包含49300张训练图像和1000张测试图像的大型图像匹配数据集,它利用网站http://www.alphamatting.com[22]提供的样本进行了测试,测试结果证明它的抠图效果较传统方法的抠图结果已是有很大的提高。这里值得一提的是,Adobe在其发布的Photoshop 2020中的抠图功能中,引入深度学习算法,取代原来版本的传统算法,对一些以前抠图比较困难的图形(例如发丝等),都能够得到良好的抠图效果。
其实,不管是传统算法和深度学习算法,都存在一个问题就是,遇到高分辨率大尺寸的图像(这里一般指分辨率在1000×1000以上的,甚至分辨率在10000×10000左右的)时,计算量相当大,要在大众配置的台式电脑、便携电脑和手机等设备上直接进行这种大尺寸图像抠图基本上不可能,所以当大家研究抠图问题的时候,都回避高分辨率大尺寸这类图像。
因为这是一个惯例,当低分辨率小尺寸图像(这里指分辨率在1000×1000以下的)的抠图实验成功后,就证明了抠图算法实际上是行得通的,那么对那些高分辨率大尺寸的图像的抠图问题,要在大众配置的台式电脑、便携电脑和手机等设备上解决,只是时间上的问题。事实上,矛盾在对立中发展,当科技发展机器进步到普通的台式电脑,便携电脑和手机等设备能解决当今这类高分辨率大尺寸图像的抠图问题后,又会有新的更大更高清的图像问题无法在大众的电脑上解决。因此,在目前,如果有办法解决这类高分辨率大尺寸的图像在普通大众机器上的抠图问题,是有现实意义的。
表1 网站http://www.alphamatting.com提供测试用的输入图像的大小列表
到目前为止到目前为止,对抠图问题的研究主要重点还是在算法上,但都局限于低分辨率小尺寸图像。例如网站http://www.alphamatting.com[22]列出的几乎所有抠图算法训练和测试用到的输入图像及抠图结果,全部是在像素800×720的低分辨率像素以内,其中用到的最大像素的测试输入图像是elephant,它的大小是800×671像素。尽管网站http://www.alphamatting.com也提供了对应的高分辨率图像下载,这些输入的图像最高分辨率达到3908×2600像素,如表1,但迄今为止,这个网站暂不接受对这些高分辨率图像的测试结果的提交和评估,更无法提供这些高分辨率的输入图像的测试评估数据。而如果是分辨率达到10000×10000的高分辨率以上的大尺寸图像,短时间内更是不可能直接用来做抠图的实验使用。
对于传统抠图算法,有很多文章做过总结或综述,都是基于采样和基于传播两种方法的各种变化及各种结合。其中李卓婷在对三种典型传统的数字图像抠图方法[23]进行比较后得出,输入图像的大小对抠图速率的快慢起着决定性的影响。这个很好理解,图像增大了,要处理的采样像素对象或传播像素对象就多了,耗费的时间自然就多。
而事实上是,大多数传统算法为了便于统计和计算未知区域像素与纯前景像素和纯背景像素之间的权重关系,都用到了拉普拉斯的大型矩阵运算,造成计算量庞大,计算的时候耗费巨大的电脑内存。
例如李卓婷在对三种典型的数字图像抠图方法[23]一文中详细讲解了传播算法中拉普拉斯矩阵的构成,利用像素点之间的权重关系构成拉普拉斯矩阵,拉普拉斯矩阵是稀疏对称的N*N正定矩阵,其中N是图像中所有节点(像素点)的数量[23]。这就告知拉普拉斯矩阵是一个比较大的矩阵。
而传统算法里面比较经典的KNNMatting算法[19],它在聚类拉普拉斯算子LC=(D-A)T(D-A)和拉普拉斯算子L=D-A(其中A是相似矩阵,Aij=k(i,j)是定义的内核函数,D是对角矩阵两者中,放弃了有利于更好图聚类的聚类拉普拉斯算子,选择了运行时间更快100倍的拉普拉斯算子,但如果对于高分辨率大尺寸的图像,这样大的拉普拉斯算子,依然难使运行时间快起来。
又如黎平[24]为了研究采样算法与传播算法的结合,还构建了采样算法的拉普拉斯矩阵,结合采样算法与传播算法提出了权重控制抠图算法。为较好地控制采样算法与传播算法的抠图力度,将采样算法与传播算法施加一组归一化权重[24],引入参数λ和公式:L=λLdata+(1-λ)Llap,其中,L是拉普拉斯矩阵,Ldata是采样算法构建的拉普拉斯矩阵,Llap是传播算法构建的拉普拉斯矩阵,λ是平衡采样算法与传播算法的权重参数。并提出拉普拉斯矩阵每个元素Lij代表了图像中i位置像素与j位置像素的相似度[24]。这样等于每计算一个拉普拉斯矩阵L,要先计算两个拉普拉斯矩阵Ldata和Llap,计算量较其他普通算法提高了。
魏毅等人更是提出的联合抠图方法[25],构建的联合相似矩阵则是更加巨大,它由两个图像的拉普拉斯矩阵组合构成,是一个图像的拉普拉斯矩阵四倍,计算量超大。
其他近几年来凡是涉及到研究传统算法的文献,基本上都沿用了使用拉普拉斯矩阵算子计算的方法。例如有沈洋等人的闭形式方法[26]、聂栋栋等人的改进的KNN抠图技术[27]、王洁等人的最小移动二乘抠图[28]、邓爽等人的复杂环境下基于信息融合的视频实时抠像算法[29]、戚骏的自然图像抠图算法研究与优化[30]和谈业静的面向运动模糊图像抠图的K近邻抠图改进算法研究[31]等,不胜枚举。
如果对于高分辨率大尺寸图像,其本身和对应的三分图都很大,会造成用来计算的拉普拉斯矩阵巨大,例如一张普通单反相机拍出的高分辨率大尺寸图像,分辨率为6000×4000,它要构建的拉普拉斯矩阵就有24000,000×24000,000那么大,虽然是稀疏矩阵,但也造成相应的矩阵运算超级巨大,造成了对计算机内存资源爆炸性需求,这就使得在一般机器上运行时内存耗尽或者耗时过长难以忍受;甚至是不能运行。
对于深度学习抠图算法,考虑到做卷积的深度和次数及整个网络结构运行效率(机器运行效率),在训练学习模型时也尽量不使用高分辨率大尺寸图像。
典型的深度学习抠图算法有两种代表:
一种是以Ning Xu、Brian Price、Scott Cohen、Thomas Huang做的Deep Image Matting[21]为代表。如图1,整个网络结构由编码-解码阶段和细化阶段组成,编码网络采用14个卷积层加5个max-pooling层,解码网络为了加速进行了一定地缩小,只有6个卷积层和5个反池化层,细化阶段有4个卷积层。总共是24个卷积层和10个池化层。它训练用的是320×320分辨率的小尺寸图像,它也利用网站http://www.alphamatting.com[22]提供像素800×700以内的图像进行了测试,例如测试了的图像elephant,它的大小是800×671像素。网站http://www.alphamatting.com也提供了大分辨率的图像,例如同样的elephant有2988×2508像素图像提供,但网站没有该算法对它进行测试的数据。从理论上讲,它训练和测试也可以用到高分辨率大尺寸图像,但同样一张2988×2508像素elephant图像,像素是800×671的14倍,如果输入网络,对于同样的卷积核,经过24次卷积和10次池化,耗费的时间将是800×671像素图像的476倍。如果输入的分别是Plant图像的高低分辨率图像,则耗费的时间将相差816倍。这仅仅是一张图像多耗费的时间,输入多张图像进行训练或测试,将要耗费的时间还更久更多。另外,如果将分辨率太高尺寸太大的图像输入这样的深度学习网络结构,会影响机器一次可容忍的内存数量或并行运算的效率。特别是对一些普通的大众的计算机,多数机器没有GPU辅助运算,运行起来将相当困难。
图1 Deep Image Matting网络模型
许多其他的深度学习的抠图网络结构,都与这个网络类似。
最近的有Wang Y等人在Deep Propagation Based Image Matting[32]一文中用到的模型,与Deep Image Matting网络模型基本相同,尽管它提出了一个新奇的基于深度传播的图像抠图框架,融合了三大模块,训练时的参数维度要更少,但它依然逃不开众多的卷积和池化。文中提到它测试图像用的是600×800分辨率的小尺寸图像,在充分利用Intel MKL-optimized Caffe优化模式的基础下,用CPU进行测试一张图像耗费的时间大约是7.4秒。可以想象,如果测试一张6000×8000分辨率的高清图像,将要耗费约100倍的时间,这还是在特定的实验室电脑上,在普通的常用机器上,时间无法估算。
类似的还有Shaofan Cai等人在Deep Propagation Based Image Matting[33]一文中提到的新型抠图方法AdaMatting,它将抠图区分为trimap adaptation和alphaestimation两个任务,并证明了这一区分对于提升基于CNN的抠图方法至关重要。于是它的解码阶段分成了两部分,这无疑增加了卷积层和反池化层,从而增加运行时间。
还有陈振鹏的基于单样本学习的数字抠图算法研究[34]也是基于这个网络结构进行研究,训练样本都是320×320分辨率的小尺寸图像,测试样本可以稍偏大,但测试的时间自然就偏多,如对太大的图像进行测试,在等待的时间上将不能容忍。
另一种深度学习抠图算法是在模型中将若干个卷积层做成可分离的卷积模块的形式。
例如Zhang Y等人在A Late Fusion CNNfor Digital Matting[35]一文中提到的模型,便用到了DenseNet算法块及它的解码块。如图2。虽然DenseNet算法将所有层直接连接起来,避免了梯度消失的问题,但它一个块中存在太多的卷积层,与第一种深度学习抠图算法来比,没有本质的区别。文中还提到:由于内存的限制,我们在训练时要求图像的长边小于800。文中提到的电脑配置是(Intel Xeon E5-2682 CPU,32GRAM,8张NVIDIA Tesla P100显卡)顶级豪华配置。
还有许征波等人基于多任务深度学习的快速人像自动抠图的研究[36],文中也用到类似的网络模型,以达到快速对人像(小尺寸人像照)的抠图功能,本质上也是用到了多次的卷积和池化,要做到快速,并不适于高分辨率大尺寸图像。
总之,现在的深度学习抠图算法都离不开多次的卷积和池化,就主要只针对低分辨率小尺寸图像,运行起来对机器都要求甚高,多数要借助CPU的多核和多GPU来辅助运行。
另外,对于深度学习抠图算法的这样的网络结构,要有大批的高分辨率大尺寸的图像做样本,也存在一个样本难找,成本偏大的问题。
图2 ALate Fusion CNNfor Digital Matting
总结前面的现状与问题,我们发现,对于大众普通的电脑,目前还没有针对高分辨率大尺寸的图像良好有效的办法,从理论上看,要想解决高分辨率大尺寸抠图在一般机器上的运行,可以从两方面入手:
(1)从抠图算法角度,构造面向大尺寸高分辨率图像的抠图机制,而这个机制的主要思想就是化大为小,化一个大图并行为多个小图串行。
(2)从充分利用硬件角度,利用当前机器的多核和多GPU进行并行计算。
当然也可以两者相结合,考虑到(2)对于目前的机器发展状况来看,只能起到辅助的作用,因此可以专注于第(1)方面。主要靠软件系统的串行处理算法,做成一个GUI界面的抠图应用。当然也可以稍加利用(2),一起来最终解决高分辨率大尺寸图像的抠图问题。在当前这个抠图算法不断发展的过程中,如果有办法同时解决这类高分辨率大尺寸的图像在普通大众机器上的抠图问题,是有现实意义的,而且这个意义随着抠图算法的研究和发展,将一直伴随,它将给其他同类问题带来启发。