参考博客:
旷视 R TALK:图像对齐及其应用
单应性Homograph估计:从传统算法到深度学习
1. 传统算法
大致流程:
- 提取特征点
- 特征匹配
- RANSAC 排除错误匹配
- 求解单应性(Homograph)矩阵
难点:
- 弱纹理、无纹理(特征少,难以提取)
- 低光图像、噪声干扰(特征集中在局部,对齐效果差)
- 重复纹理(特征匹配容易出错)
- 大前景干扰
- 大视差
- 深度视差(单应性变换本身的局限性)
2. 深度学习算法
2.1 Deep Image Homography Estimation(2016)
创新:
- 数据集
- 原始图像取一个矩形区域 A(蓝色框)
- 对 A 的四个顶点做一定范围(黄色框)的随机位移(红色箭头)得到一个不规则区域(不规则绿色框)
- 根据位移向量可以求得 H A B \mathrm{H^{AB}} HAB 和 H B A \mathrm{H^{BA}} HBA
- 对原图做 H B A \mathrm{H^{BA}} HBA 变换,得到矩形区域 B(矩形绿色框)
- 将 A 和 B 输入给网络求得 H A B \mathrm{H^{AB}} HAB
- 网络结构
直接预测出单应性矩阵参数比较困难,因此网络预测的是4个顶点的位移量(右边回归网络),然后再计算单应性矩阵。
文中说没有置信度会限制一些应用,就搞了左边的分类网络,将4个顶点的位移范围划分为21个区间,输出落在每个区间的概率值。
优点:
- 对弱纹理和无纹理图像优于传统算法;
缺点:
- 训练数据是人工变形得到的,真实世界图像存在内容上差异,导致对真实世界图像的对齐效果较差;
2.2 Unsupervised Deep Homography: A Fast and Robust Homography Estimation Model(2017)
创新:
- 网络结构
图(a)为2.1的监督算法,图(b)为传统算法,图(c)为此文无监督算法。
H ~ 4 p t \mathrm{\tilde{H}_{4pt}} H~4pt 为预测的4个顶点位移向量,结合4个顶点的位置坐标 C 4 p t A \mathrm{C^A_{4pt}} C4ptA,通过 Tensor DLT(Direct Linear Transform)得到单应性矩阵 H ~ \mathrm{\tilde{H}} H~;之后通过空间变换层得到图像 P ~ B \mathrm{\tilde{P}^B} P~B,并与实际图像 P B \mathrm{P^B} PB 计算光度损失(像素点间的 L1 损失)。
其中,Tensor DLT(代替 SVD 奇异值分解)和空间变换层都是为了便于梯度计算,使网络得以训练。
优点:
- 相比监督算法,对真实世界图像的对齐效果较好;
- 对图像特征的表达比较鲁棒,不像传统方法很依赖特征点;
缺点:
- 数据集主要用的航拍图像,适合单个单应性矩阵做对齐;
- 深度视差、RANSAC
2.3 Content-Aware Unsupervised Deep Homography Estimation(2019)
创新:
-
数据集
制作了一套数据集分为5大类,并为了量化评估,手工标注了5000张图像作为ground truth;- Regular(RE):纹理丰富,单平面远景适合用单个单应性矩阵对齐
- Low texture(LT):纹理少
- Low light(LL):低光图像
- Small Foregrounds(SF):小前景
- Large Foreground(LF):大前景
-
网络结构
令 β ∈ { a , b } \beta \in \{a,b\} β∈{a,b}
此文认为直接用像素值当特征不太好,通过 f ( ⋅ ) f(\cdot) f(⋅) 获取深层特征 F β F_{\beta} Fβ,并通过 m ( ⋅ ) m(\cdot) m(⋅) 生成 mask M β M_{\beta} Mβ。这里的特征和 mask 都和原图 I β I_{\beta} Iβ 分辨率相同,其中 m ( ⋅ ) m(\cdot) m(⋅) 的作用与 RANSAC 相似,生成的 mask 可以看作是特征的权重,来衡量特征的重要性,从而可以忽略一些干扰的特征(如干扰前景)。 G β = F β M β G_{\beta}=F_{\beta}M_{\beta} Gβ=FβMβ 输入给后续的单应性估计网络,同样预测4个位移向量,并通过一个线性系统得到单应性矩阵 H a b \mathcal{H}_{a b} Hab。损失计算:
min m , f , h L n ( I a ′ , I b ) + L n ( I b ′ , I a ) − λ L ( I a , I b ) + μ ∥ H a b H b a − I ∥ 2 2 \min _{m, f, h} \mathbf{L}_{\mathbf{n}}\left(I_{a}^{\prime}, I_{b}\right)+\mathbf{L}_{\mathbf{n}}\left(I_{b}^{\prime}, I_{a}\right)-\lambda \mathbf{L}\left(I_{a}, I_{b}\right)+\mu\left\|\mathcal{H}_{a b} \mathcal{H}_{b a}-\mathcal{I}\right\|_{2}^{2} m,f,hminLn(Ia′,Ib)+Ln(Ib′,Ia)−λL(Ia,Ib)+μ∥HabHba−I∥22
其中,
L n ( I a ′ , I b ) = ∑ i M a ′ M b ⋅ ∥ F a ′ − F b ∥ 1 ∑ i M a ′ M b \mathbf{L}_{\mathbf{n}}\left(I_{a}^{\prime}, I_{b}\right)=\frac{\sum_{i} M_{a}^{\prime} M_{b} \cdot\left\|F_{a}^{\prime}-F_{b}\right\|_{1}}{\sum_{i} M_{a}^{\prime} M_{b}} Ln(Ia′,Ib)=∑iMa′Mb∑iMa′Mb⋅∥Fa′−Fb∥1, i i i 表示特征图和mask中的像素索引L ( I a , I b ) = ∥ F a − F b ∥ 1 \mathbf{L}\left(I_{a}, I_{b}\right)=\left\|F_{a}-F_{b}\right\|_{1} L(Ia,Ib)=∥Fa−Fb∥1
H b a \mathcal{H}_{b a} Hba 通过将 I a I_a Ia 和 I b I_b Ib 的特征位置互换得到
损失函数前两项最小化变换后图像特征的差异,第三项是为了避免全零解最大化原始图像特征差异,第四项则是让两个单应性变换尽可能可逆。
(2021.10.25)后续发现提供的代码用torch.nn.TripletMarginLoss()
替代了论文描述的损失函数(TripletMarginLoss解析),基本就是只保留上面损失的1、3项,第4项在 utils.py 里留了个口getBatchHLoss()
;主要问题在于 mask 的训练,从 loss 分析如果 mask 是全为0那么 loss 会最低,这显然不对;mask 加入训练时,github 上说用一个小学习率微调网络,结合反向传播和数据来看,前景差异大,背景差异小,则 mask 的前景部分会更快地趋向于0,那么 mask 是有效的,但是关键在于这个数据集是分割视频生成的,背景部分差异很小,后面发现很多对齐用的公开数据集即使是背景差异也非常大,这个 mask 的策略基本就是无效的了。
优点:
- 解决 RANSAC 问题,主要避免前景干扰
缺点:
- 深度视差
2.4 DeepMeshFlow: Content Adaptive Mesh Deformation for Robust Image Registration(2019)
Mesh Flow 大致就是把图像划分为网格,每个网格对应一个单应性矩阵,从而适应图像中的不同深度平面来对齐。
创新:
-
网络结构
ResNet-34 后面连接 K K K 个分支( K = 3 K=3 K=3),每个分支从一个自适应池化层开始,并通过卷积层生成一个特定大小的 mesh flow:M 1 ′ → ( H g 16 + 1 ) × ( W g 16 + 1 ) × 2 = 2 × 2 × 2 \mathcal{M}_{1}^{\prime} \to \left(\frac{H_{g}}{16}+1\right) \times\left(\frac{W_{g}}{16}+1\right) \times 2=2 \times 2 \times 2 M1′→(16Hg+1)×(16Wg+1)×2=2×2×2
M 2 ′ → ( H g 4 + 1 ) × ( W g 4 + 1 ) × 2 = 5 × 5 × 2 \mathcal{M}_{2}^{\prime} \to \left(\frac{H_{g}}{4}+1\right) \times\left(\frac{W_{g}}{4}+1\right) \times 2=5 \times 5 \times 2 M2′→(4Hg+1)×(4Wg+1)×2=5×5×2
M 3 → ( H g + 1 ) × ( W g + 1 ) × 2 = 17 × 17 × 2 \mathcal{M}_{3} \to \left(H_{g}+1\right) \times\left(W_{g}+1\right) \times 2=17 \times 17 \times 2 M3→(Hg+1)×(Wg+1)×2=17×17×2
然后将粗尺度 M 1 ′ \mathcal{M}_{1}^{\prime} M1′ 和 M 2 ′ \mathcal{M}_{2}^{\prime} M2′ 上采样至 M 3 \mathcal{M}_{3} M3 分辨率,并融合 M 1 \mathcal{M}_{1} M1、 M 2 \mathcal{M}_{2} M2、 M 3 \mathcal{M}_{3} M3。
mesh flow 的融合通过一个场景分割网络将图像 I I I 分割为 K K K 个类别,输出大小为 ( H g + 1 ) × ( W g + 1 ) × K \left(H_{g}+1\right) \times\left(W_{g}+1\right) \times K (Hg+1)×(Wg+1)×K,融合方式是直接按分类结果选择每个点的位移向量用哪个 mesh flow 的对应值,最终得到 M ∗ \mathcal{M}^{*} M∗。之后的 loss 计算与 2.3 相同。
优点:
- 解决深度视差问题
2.5 RANSAC-Flow: generic two-stage image alignment(2020 ECCV)
创新:
- 单应性(粗对齐)与光流法(细对齐)结合
- 迭代方式做对齐
优点:
按论文中的说法,单应性对图像细节对齐的不好,而光流法对差异较大的图像无法对齐,而此方法可以对差异大的图像细节也对齐好,扬长避短地结合两种对齐方法。
- 细节对齐效果好
- 对各种差异很大图像也能对齐
- 网络基本没做什么优化就有很好的效果(论文只是训练了细对齐网络,粗对齐网络直接是迁移过来都不微调;直接用提供的模型在自己双目相机采集的小差异数据上就有很好的对齐效果)
缺点:
论文中展示的为相对效果较好(较容易对齐)的结果,下图为挑选的几种不同角度的缺点,由于最终的对齐参数为一个像素级对齐矩阵,所以主要缺陷还是与光流法类似。
-
无法判断需要对齐的部分
此例,原始图像为目标图像右上一小块区域,但是算法会尽可能将全图都对上。
-
光流法的图像局部扭曲现象
像素级对齐通常在低分率的特征图上做对齐然后插值到原图的高分辨率,目前判断扭曲现象是插值造成的。
-
前景遮挡
前景遮挡情况下的肉眼观感很差,存在大面积扭曲,不如 2.3 的效果(无视前景做对齐)。
-
慢
1660Ti的笔记本上约10s一对图像。