Exploring Image Warp via Deep Learning
Outline
- Review image warp from traditional and deep learning perspectives
- Explore image warp via deep learning
--Deep rectangling for image stitching: A learning baseline(CVPR2022 oral) - Extended applications of rectangling
1. Review image warp from traditional and deep learning perspectives
image warp
该技术可以使得图片按照某一种既定的目的,变成自己想要的形状,区别于一般的图像生成任务,比如图像补全、换脸等。
这些任务会引入新的图像内容,而image warp变形后的图像,它的内容则完全来自于它的原图本身。
以下为几个例子:
- Image stitching 图像拼接
普通相机的FOV(视场角)有限,单张图像没办法囊括太多的图像信息,image warp可以把有限FOV图像拼接成更大FOV图像。 - Wide-angle portrait correction 广角人像校正
广角相机的FOV更广一些,但是图像边缘部分出现拉伸或者扭曲现象,尤其时人脸靠近图像边缘时,image warp可以矫正畸变的人脸。 - Fisheye image rectification 鱼眼图像校正
相对于广角相机,鱼眼图像的FOV更大,甚至超过180°,代价是它的图像内容发生巨大的畸变,尤其时边缘部分,比如建筑的边缘由直线变成了曲线,image warp可以把鱼眼图像的直线校正为曲线。 - Image retarget/Image resize 图像缩略/图像拉伸
当想要修改图像的长宽比例时,如果使用OpenCV自带的函数,图中的景物会被明显的压缩并且被拉伸,得到一种很不自然的视觉效果,image warp可以在image resize过程当中避免拉伸或者压缩等不自然的一些畸变,使得整体看起来景物和原始图像保持一致。
以图像拼接为例,传统方法VS深度学习方法,深入体会image warp在这两种视角下的不同之处
- 传统方法:
1)首先进行特征检测,借助传统手工设计的特征检测方法,比如SIFT、ORB等。
2)然后对检测到的特征点进行匹配,使用RANSAC算法剔除一些局外点,并且估计出一个全局的单应变换矩阵,用这个矩阵对图像进行warp操作,最后得到拼接结果。
--Automatic panoramic image stitching using invariant features. IJCV, 2007.
近些年传统的图像拼接方法,在特征检测阶段,也会引入一些更丰富的传统特征,比如说LSD算法?检测到的直线段;还会再全局单应矩阵变形的基础上再进行一个局部的mesh变形的操作;甚至还会在最后对图像进行融合的时候采用一个拼接缝的seam carving的操作来获得一个更加自然的结果。这样来看整个拼接过程非常复杂。 - 深度学习方法:
1)第一步是图像对齐,它直接用一个卷积神经网络比较暴力的估计出Homography(单应矩阵)对应的8个参数,其实估计的不是8个参数,但是我们可以理解为它直接暴力的估计出它的一个等价的它的8个参数。
2)第二步是图像重建阶段,使warp后的图像进入Enconder-Decoder网络,最后重建出一个拼接图,类似于一个图像融合的过程。整个深度学习的拼接框架整体看来只有两步,比较简单。
--Unsupervised deep image stitching: Reconstructing stitched features to images. TIP, 2021.
以广角人像为例,传统方法VS深度学习方法,深入体会image warp在这两种视角下的不同之处
- 传统方法:
单幅图像输入,假设给定(97°-FOV)广角图像,图像边缘的人脸明显发生了畸变。
1)传统的方法一般首先用Stereographic projection(球极投影)将原图中的人脸畸变做一个初步的矫正。
2)但是这种校正有个代价就是背景中靠近边缘的这些直线段会发生一个弯曲,这时候需要通过一个Optimized mesh(优化网格)的方式使得背景中弯曲的直线能够得到矫正,在优化网格的过程中,一般也是使用传统的LSD算法提取直线段对它们进行一定的优化。
3)同时它会通过某种手段检测到人脸区域的mask(Subject mask of (Input(97°-FOV))),保证在优化过程中人脸区域不被进一步的发生改变。最后人脸区域得到矫正,并且背景区域能够保持的一个图片。
从以上的描述也可看到,传统方法步骤较多。
--Distortion-free wide-angle portraits on camera phones. SIGGRAPH, 2019. - 深度学习方法:
讲者说,第一个深度学习的方法2021年提出,工作框架相当暴力。
整体是一个Encoder-Decoder架构,输入一张图片,通过这样一个架构,直接回归估计出一个光流图,然后使用光流图对原图进行一个warp操作,即得到一个矫正后的人脸图。
它把所有这些传统方法里边要做的过程全部都让深度神经网络自己来学。
--Practical wide-angle portraits correction with deep structured models. CVPR, 2021.
从这两个例子我们可以看到,无论是多幅图像warp的图像拼接,还是说单幅图像的warp的人像矫正,传统方法需要手工设计的特征来提取特征点,比如SIFT、ORB等,也可能使用LSD算法检测直线段?,并且步骤比较多。
而深度学习方法通过合适的建模,将最难的部分交给卷积神经网络自己来学习,步骤比较简单,也不需要人工设计特征,它的特征往往从数据集中自己学出,但是它也有一个缺陷,就是需要构建一个数据集。
2. Explore image warp via deep learning
--Deep rectangling for image stitching: A learning baseline(CVPR2022 oral)
接下来带着以上总结的经验来image rectangling上验证一下,从0到1使用深度学习实现的CVPR2022的一个工作。
image rectangling(图像矩形化),有研究过图像拼接的可能对这个任务相对熟悉一点,图像矩形化的输入往往是一个具有不规则形状的图片,比如说由拼接得到的全景图的边界非常的不规则,具有一些锯齿状,而这些边界会直接影响到视觉体验,而rectangling就是将这些不规则的边界变成一个规则的矩形的一个image warp方法。
其实我们第一时间想到的是一个图像裁剪的方法,就是说在图像当中找到一个最大的内接矩形,然后对图像进行一个裁剪,这样就能得到一个矩形图片,但这样带来一个问题就是裁剪后的图片可能会丢失掉原图中的某些信息。
另一个方法就是图像补全,图像补全可以对全景图周围的白色的无效像素进行一个预测填充,先不考虑填充的内容是否自然,即使说非常自然,但这种填充的内容往往是基于预测的,在一些高度安全的场景中并不可靠,比如自动驾驶中并不能适用。
相对来说,图像矩形化则不改变图像内容,不增加也不减少图像内容,而直接对原始的输入图片进行一个拉伸的效果,进行一个拉伸变形得到一个矩形图片。
The pipeline of traditional rectangling
这个方法主要分为两步:
1)第一步在不规则的图片上找到一个初始的网格形状mesh。
在第一步中,为了找到初始的网格形状mesh,首先用到了image resize中非常经典的seam carving工作,它会在输入图像中插入许多长短可能不一致并且感知上最不明显的一些类似于拼接缝一样的连续的直线,通过不断的插入这种直线,使得原来这种不规则的图片变成一个矩形,但这个矩形图片会带来一些畸变,但这样有一个好处就是把图像变成了一个矩形,因此我可以直接放置一个刚性的mesh到这个矩形图片当中,随后它反向的抽掉了刚才插入的这些拼接缝,随后就能得到一个能够准确地贴合原始不规则边界的一个mesh。
2)随后它会优化一个能量函数找到一个全局的一个最优的一个矩形的mesh形状,然后从一个初始的网格到最终的网格做一个mesh的warp操作,最后就能实现一个矩形化的一个效果。
随后它定义了一系列的能量函数,通过优化这个能量函数来使得mesh产生一定的形变,最后变成一个矩形的mesh,最后通过一个warp操作就得到了一个矩形化的结果。
--Rectangling panoramic images via warping. SIGGRAPH, 2013.
再把传统方法简单总结一下,它有两步,第一步Local warping(局部的warp),它会得到一个初始的mesh,第二步Global warping(全局的warp),它会得到一个优化后的目标mesh。
但是我们看初始的mesh和最终的mesh它都是一个不规则形状,这样有一个问题就是在warp的过程中没有办法进行一个矩阵的加速,只能通过一个像素级的一个暴力的循环实现。
而在深度学习当中,一个模型往往需要部署到gpu里面去,并且训练一个模型往往需要几十万次甚至上百万次的迭代,因此如果用原来这种warp方式来在深度学习里面实现它的话,可能训练一次模型就可能需要十几天甚至几个月的时间。
因此我们直接预先定义好一个目标mesh,这个mesh是一个刚性的mesh,现在要做的就是预测一个初始的mesh,这样的话如果我们得到了这个初始mesh,我们最后就可以用矩阵运算的方式,对图像进行一个反向的warp插值,由于这个网格是刚性的,插值速度会很快。
而如何预测这个初始的mesh呢?与之前讲的拼接、人像矫正的例子相似,我们把这些最困难的部分直接交给网络比较暴力的来学习得到。
以上简单说了一下深度学习的一个简单的思路,下面看看具体怎么一步一步实现CVPR2022的工作。
对于深度学习来说,它是一个数据驱动的方法。
1)Step 1: Build a dataset.
收集大量的全景图片,拼接图,随后应用传统的矩形化方法对它进行一个矩形化的操作得到一个矩形化的结果,矩形化的结果当作训练样本中的label,这样就简答构建了一个数据集。
这样构建的一个数据集有一个致命的缺点,它完全来自于传统的方法,可能神经网络训练出的模型的性能最多只能逼近传统的方法,它不能达到传统的方法,更别说超过传统的算法。
为了解决这一点,使用一个巧妙的方法,我们用传统方法进行矩形化时,不保留这些label,相反保留矩形化时的这些warp操作。
随后对矩形的图片进行warp逆变换,得到类似于拼接的合成图片。这时候可能会有疑问warp函数从另一组图片中得到,而做逆变换的时候又是对另外的图像做逆变换,明显warp函数和图片内容不对应。为了解决这个问题,使用同一个warp函数对十几张二十张图片做一个逆变换,在这些图片中选出一到两张看起来没有畸变、感知上最自然的图像作为数据集的输入,这样构建了大概6000多个样本。
数据集的一些Input、Mask、Label。Mask是0/1的图,就是需要矩形化出去的部分用黑色的像素表示,原图这种模拟的拼接图的有效内容的部分用白色的像素表示。
2)Step 2: Design loss functions.
首先要搭建一个网络的baseline,因为网络的框架可能会直接影响到一些性能,这个时候就想搭建一个最简单的baseline来验证我们这个东西到底能不能work,所以只采用了大概几层卷积和几层全连接来组成一个最简单的一个回归网络来暴力的预测初始的网格的一个mesh形状,随后将之前定义好的一个刚性的目标mesh形状和预测的初始mesh组合就能得到一个warp函数,能够对拼接图进行warp得到一个矩形的结果。
其实传统的方法在优化mesh的过程中是对能量函数进行一个优化,而深度学习方法往往是对损失函数进行一个优化,而这两种其实有一定的关联性,我们希望能够从传统方法的能量函数设计中获得一些启发。
首先回顾一下传统方法优化的能量函数:
该能两函数由三个项组成,是形状保持项,是直线保持项,是边界保持项。
Line-preserving term:
这里讲者只列了一个公式,它的公式比较复杂没有全部列完,只是明白物理意义即可。这个直线保持项希望图片拼接图中的直线最后变为矩形图之后这个直线依然是一条直线,不会变成一个折现/曲线,并且拼接图中平行的直线矩形化后依然是平行的,为了实现这一点,作者使用LSD算法检测图像中的直线段,随后每个直线段可以使用两个端点来表示,而每个端点属于mesh中的某一个网格,它就可以用这个网格中最近的4个顶点来把它线性表出,通过这种方式它就把一个直线保持的问题转化成一个优化mesh形状的一个问题。
Shape-preserving term:
形状保持项约束mesh中的网格矩形化后的两个网格之间尽量会采用一种相似的变换,这种相似的变换比较简单,它只包含了常见的平移、旋转、还有缩放,而作者不希望它采用更复杂的仿射或者单应变换,这些变换可能会带来更多的畸变。
Boundary term:
边界项则是约束原来这个不规则的边界,最后它变成一个矩形。
受到了传统方法的启发,对照了传统方法的三个能量项,设计了三个损失函数:
内容项(Content term):
由于深度学习方法有数据集,我们知道数据集的label,所以对于这一项很好构建,在这儿用了一个像素级的L1 loss和感知层面的L2 loss,具体来说就是用了VGG19网络当中的某一层作为提取感知特征的一个工具来约束,就是我们希望最后矩形的结果它除了像素上尽量保持一致以外,它感知上比较明显的区域,就语义上比较显著的这些区域也应该尽可能和label保持一致。 网格项(Mesh term):
我们把它分为了一个网格内部项和网格之间的保持项:
网格内部项:
其中:
对网格内的约束是约束的网格中的每一条边,每一条边的长度需要大于一个阈值,这是因为假如没有这个约束,这个预测的网格形状可能会非常小,而我们最终预先定义好的网格形状是一个固定大小的,这样就有可能导致原图里边的图像内容最后矩形化后的形状会发生剧烈的变大,这样的化难免会出现畸变,为了避免出现这样的效果,我们就约束网格的大小,通过约束每条边来避免网格太小。 网格之间项:
这个约束的是mesh中相邻的横向的或者纵向的3个顶点,需要尽可能的共线,这是因为用mesh对图像进行变形的过程中,通常一个长直线可能会被mesh分成很多个直线段,而如果说最后变形的mesh的角度变化太大了,则可能导致这个直线直接变成了一个折线,为了避免这样的发生加了这个网格之间的约束。 边界项(Boundary term):
对图像的边界进行约束,对于这个约束,我们是从数据当中mask这里面来实现的,这个mask是一个0/1的图,如果我们矩形化的结果非常理想的话,那如果我们用同样的矩形化函数对这个mask进行矩形化,这个mask也应该是一个全白的图像才对,因此基于这个点建立了最后的边界项。
2)Step 3: Design the network architecture.
这个阶段中,只是用了一个比较简单的一个残差回归的策略。具体来说,我们把拼接图和mask作为我们的输入,通过几个卷积提取一个特征,通过一个回归网络回归出一个初始的mesh;这个mesh就能和最终的mesh形成一个初始的warp操作,用初始的warp对特征进行warp操作,就能得到warp后的特征图;在warp后的特征图上进一步回归mesh,这个时候回归的mesh就是残差的mesh;这个残差的mesh加上初始的mesh就得到一个最终的mesh,就能形成一个最终要得到的一个矩形化的一个函数,最后能得到一个矩形的结果。
讲者说,他们最开始还采用了比较复杂的方式,比如也借用LSD算法?,在图像中进行一个直线段的检测,然后对检测到的直线段中的两个端点的4个坐标当成点圆来处理,用点圆处理当中的MLP,最后将它们和RGB的特征做一个融合;甚至说用这种典型的这些特征对他们的一些模型参数做一些预训练,做一些对比学习;发现这些都不太起作用,最后发现这种最简单的残差回归的方式反而是一个最有效的。
Experiments
首先实验在数据集上对损失函数做了验证,验证每一项损失函数是有用的。
随后对网格的分辨率进行了一个效用实验,尝试了不同分辨率的网格,可能做传统mesh的觉得他们的mesh分辨率特别低,但是实际上从实验结果来看这个分辨率是最优的,而且即使对于传统算法的网格分辨率太高性能也不一定好,因为假如我们假设有一条长直线,在8×6的mesh中可能被分成了3段,而如果在16×12的mesh中可能有6段,那如果我们想约束它这个矩形化后的结果,这个长直线段矩形化后依然是一条直线的话,那约束6个短直线的难度会比约束3个短直线的难度难很多,所以说mesh的分辨率越高越可能产生一些畸变,尤其是在一些特征纹理不是太丰富的场景当中。
然后对刚刚网格结构中提到的残差回归预测的这种方式做了一个效用实验,结果表明也是有提升。
对残差回归设计的结构进行一个定性的一个效用实验,可以看到如果没有残差预测模块的话,一开始预测的mesh的形状可能导致最终矩形化后图像上有一些不平整的边缘,而如果有这样一个残差预测模块,它会在这个不平整的边缘的基础上进一步的优化这个图像最后得到一个更为平整的一个矩形边缘。
进行了一个定量的对比试验,做矩形化工作的比较少,所以能对比的方法比较少,主要以何凯明的方法进行一个对比,指标上有PSNR、SSIM、FID,FID是一个测量一个感知相似性的一个指标,它越低越好,可以看到讲者的算法远超传统算法的性能。讲者分析远超传统算法的原因可能是因为矩形化这个任务不一定非要接近于label,它可能矩形化出一个合理的结果即可,它可能会带有一些像素点的一些偏移,可能物体位置的一些偏移,但是它的景物、它的内容是不畸变的,那这个矩形化的结果其实就是合理的,所以说这个指标不太能客观反映这个性能。因此,讲者做了无参的盲图像质量评估,在盲图像质量评估中,讲者的算法也是明显比传统算法性能更好。此外,讲者做了UL(无监督学习)的研究,分析了UL中更喜欢讲者算法和传统算法的比例。
接下来是一些定性的一些实验,毕竟矩形化是一个比较偏向于人眼感知的这样一个视觉任务,希望它在人眼上、视觉系统上能够更受欢迎一些。这个例子是一个直线结构比较丰富的场景,为什么选用这个场景呢?因为传统的算法的内容保持项只有直线保持这一条约束,而对于一些非直线一些场景的话,它可能就无法保持图像内容,就会发生一些明显的畸变,所以现在直线场景比较丰富的建筑物的场景下对比一下方法的性能。讲者后续讲解了诸多实验...
3. Extended applications of rectangling
Image resize:
Fisheye distortion rectification + rectangling:
Rotation + rectangling:
A simple summary of different solution in image warp
Traditional method:
- Multiple steps.
- Traditional features.
- No dataset.
Deep learning method:
- Less steps.
- Deep learning features.
- Dataset.
传统warp论文
Image stitching: APAP, Auto stitch
Image resize: Seam carving
Wide-angle portrait correction:
--Distortion-free wide-angle portraits on camera phones. SIGGRAPH, 2019.
TIP, 2021. 有人Follow该工作继续往下做?
序列图像拼接,累计误差如何解决?
拼接一系列图片,累计误差其实没有太多办法可以解决,也许可以找到一个最优的平面,或者说多幅图像拼接,每个图都往第一个图视角上拼的话可能会有一个累计的一个warp的透视畸变,但是找到一个适中的视角的话可能会比较好。
这是传统的拼接,而目前深度学习的拼接好像还没怎么见过拼接多幅图像的,就是任意视角多幅图像的方法。\
通过warp做数据增强的工作?
有2D的warp,有3D的warp,讲者说CVPR2022有一个3Dwarp做图像增强的工作类似于一些3D的一些渲染,2D的也可以做图像增强,比如图像的翻转其实就是一种warp操作,甚至说图像的一个Homography变换其实也是一个操作。
矩形化其实可以实现resize
矩形化其实是一个优化网格的一个过程,比如说原来就是一个矩形图片,那现在定义好了一个resize后的边界,它可能更小,还可能更大,把这个边界定义好了之后用矩形化优化能量的方式就可以使得原来的mesh的形状慢慢的逐渐的变成贴近刚才预先定义好的一个边界的形状,而目前深度学习的矩形化方法,就是讲者实现的这个,其实是对image resize不太好实现的,这个是一部分数据集的原因,有这样的一个问题。
如何实现无监督的矩形化呢?
讲者说他也比较想知道,哈哈哈哈,讲者觉得理论上是可行的, 因为传统的算法是从一个能量优化的角度,它的内容保持项其实就是一个直线保持项,设计了一个直线保持项这样一个能量项,保证图像的内容比较自然,而深度学习其实也需要找到这样一个关系,找到这样一个函数项,其实就能实现一个矩形化的效果,但是目前好像没有找到,其实这种传统的方法,比如拼接、resize、人像矫正,目前都陆陆续续有一些半监督或者说无监督的方法出现。
这个矩形化可以用在全景拍摄复原吗?
全景图像变成矩形?,讲者希望问题再明确一些,不太知道想问什么,我敲到这里也不知道想问什么,哈哈哈真无聊。
特征点提取方法对不同结果有影响吗?
当然有影响,比如图像拼接,或者说单应矩阵的一个估计,更基础的任务,不同的特征点检测的方法,甚至说不同的参数的阈值的选择, 它都会对最终的结果有很大的影响。而且现在不一定是特征点的,比如说现在很多传统的算法都比较流行用LSD检测到的直线段作为一个直线特征,进一步增强它的一个效果。
这种矩形化的能提高分类任务的成功率吗?
这里也展示了一些例子,原来的图像具有一些不规则的边界,而矩形化的结果有一些规则的边界,在这种情况下成功率确实是有提升的。
原始资料地址:
极市直播第93期|CVPR22 Oral-聂浪:用深度学习探索图像变形:以图像拼接矩形化为例
如有侵权联系删除 仅供学习交流使用