单应性Homography


前言

单应性原理被广泛应用于图像配准,全景拼接,机器人定位SLAM,AR增强现实等领域。这篇文章从基础图像坐标知识系为起点,讲解图像变换与坐标系的关系,介绍单应性矩阵计算方法,并分析深度学习在单应性方向的进展。


一、图像变换与平面坐标系的关系

1.旋转

将图形围绕原点(0,0)逆时针方向旋转 θ \theta θ角,用解析式表示为:

x ′ = x ⋅ c o s θ − y ⋅ s i n θ y ′ = x ⋅ s i n θ + y ⋅ c o s θ x'=x\cdot cos\theta-y\cdot sin\theta\\y'=x\cdot sin\theta+y\cdot cos\theta x=xcosθysinθy=xsinθ+ycosθ
在这里插入图片描述
写成矩阵乘法形式:
( x ′ y ′ ) = [ c o s θ − s i n θ s i n θ c o s θ ] ( x y ) = R ( x y ) \begin{pmatrix}x'\\y'\end{pmatrix}=\begin{bmatrix}cos\theta&-sin\theta\\sin\theta&cos\theta\end{bmatrix}\begin{pmatrix}x\\y\end{pmatrix}=R\begin{pmatrix}x\\y\end{pmatrix} (xy)=[cosθsinθsinθcosθ](xy)=R(xy)

2.平移

x ′ = x + t x y ′ = y + t y \begin{gathered} x^{\prime}=x+t_x \\ y^{\prime}=y+t_y \end{gathered} x=x+txy=y+ty

在这里插入图片描述
( x ′ y ′ ) = ( x y ) + [ t x t y ] \begin{pmatrix}x'\\y'\end{pmatrix}=\begin{pmatrix}x\\y\end{pmatrix}+\begin{bmatrix}t_x\\t_y\end{bmatrix} (xy)=(xy)+[txty]

但是现在遇到困难了,平移无法写成和上面旋转一样的矩阵乘法形式。所以引入齐次坐标 ( x , y ) ⇔ ( x , y , 1 ) (x,y)\Leftrightarrow(x,y,1) (x,y)(x,y,1),再写成矩阵形式:

( x ′ y ′ 1 ) = [ 1 0 t x 0 1 t y 0 0 1 ] ( x y 1 ) = [ I 2 × 2 T 2 × 1 0 T 1 ] ( x y 1 ) \begin{pmatrix}x'\\y'\\1\end{pmatrix}=\begin{bmatrix}1&0&t_x\\0&1&t_y\\0&0&1\end{bmatrix}\begin{pmatrix}x\\y\\1\end{pmatrix}=\begin{bmatrix}I_{2\times2}&T_{2\times1}\\0^T&1\end{bmatrix}\begin{pmatrix}x\\y\\1\end{pmatrix} xy1 = 100010txty1 xy1 =[I2×20TT2×11] xy1

其中 I 2 × 2 = [ 1 0 0 1 ] I_{2\times2}=\begin{bmatrix}1&0\\0&1\end{bmatrix} I2×2=[1001]表示单位矩阵,而 T 2 × 1 = [ t x t y ] T_{2\times1}=\begin{bmatrix}t_x\\t_y\end{bmatrix} T2×1=[txty]表示平移向量

3.刚体变换

那么就可以把把旋转和平移统一写在一个矩阵乘法公式中,即刚体变换:
( x ′ y ′ 1 ) = [ c o s θ − s i n θ t x s i n θ c o s θ t y 0 0 1 ] ( x y 1 ) = [ R 2 × 2 T 2 × 1 0 T 1 ] ( x y 1 ) \begin{pmatrix}x'\\y'\\1\end{pmatrix}=\begin{bmatrix}cos\theta&-sin\theta&t_x\\sin\theta&cos\theta&t_y\\0&0&1\end{bmatrix}\begin{pmatrix}x\\y\\1\end{pmatrix}=\begin{bmatrix}R_{2\times2}&T_{2\times1}\\0^T&1\end{bmatrix}\begin{pmatrix}x\\y\\1\end{pmatrix} xy1 = cosθsinθ0sinθcosθ0txty1 xy1 =[R2×20TT2×11] xy1

而旋转矩阵 R 2 × 2 R_{2\times2} R2×2是正交矩阵 ( R R T = R T R = I ) (RR^T=R^TR=I) (RRT=RTR=I)

在这里插入图片描述

4.仿射变换

( x ′ y ′ 1 ) = [ A 2 × 2 T 2 × 1 0 T 1 ] ( x y 1 ) \begin{pmatrix}x'\\y'\\1\end{pmatrix}=\begin{bmatrix}A_{2\times2}&T_{2\times1}\\0^T&1\end{bmatrix}\begin{pmatrix}x\\y\\1\end{pmatrix} xy1 =[A2×20TT2×11] xy1

其中 A 2 × 2 = [ a 11 a 12 a 21 a 22 ] A_{2\times2}=\begin{bmatrix}a_{11}&a_{12}\\\\a_{21}&a_{22}\end{bmatrix} A2×2= a11a21a12a22 可以是任意的2x2矩阵,而R必须是正交矩阵
在这里插入图片描述
可以看到,相比刚体变换(旋转和平移),仿射变换除了改变目标位置,还改变目标的形状,但是会保持物体的“平直性(如图形中平行的两条线变换后依然平行)”。

不同A和T矩阵对应的各种基本仿射变换:

在这里插入图片描述

5.投影变换(单应性变换)

( x ′ y ′ 1 ) = [ A 2 × 2 T 2 × 1 V T s ] ( x y 1 ) = H 3 × 3 ( x y 1 ) \begin{pmatrix}x'\\y'\\1\end{pmatrix}=\begin{bmatrix}A_{2\times2}&T_{2\times1}\\V^T&s\end{bmatrix}\begin{pmatrix}x\\y\\1\end{pmatrix}=H_{3\times3}\begin{pmatrix}x\\y\\1\end{pmatrix} xy1 =[A2×2VTT2×1s] xy1 =H3×3 xy1

在这里插入图片描述
简单说,投影变换彻底改变目标的形状。

6.小结

  1. 刚体变换:平移+旋转,只改变物体位置,不改变物体形状
  2. 仿射变换:改变物体位置和形状,但是保持“平直性”(原来平行的边依然平行)
  3. 投影变换:彻底改变物体位置和形状

在这里插入图片描述

我们来看看完整投影变换矩阵各个参数的物理含义:

H 3 × 3 = [ A 2 × 2 T 2 × 1 V T s ] = [ a 11 a 12 t x a 21 a 22 t y v 1 v 2 s ] H_{3\times3}=\begin{bmatrix}A_{2\times2}&T_{2\times1}\\V^T&s\end{bmatrix}=\begin{bmatrix}a_{11}&a_{12}&t_x\\a_{21}&a_{22}&t_y\\v_1&v_2&s\end{bmatrix} H3×3=[A2×2VTT2×1s]= a11a21v1a12a22v2txtys

其中 A 2 × 2 A_{2\times2} A2×2代表仿射变换参数, T 1 × 1 T_{1\times1} T1×1代表平移变换参数。而 V T = [ v 1 , v 2 ] V^T=[v_1,v_2] VT=[v1,v2]表示一种“变换后边缘交点”关系,如:

在这里插入图片描述
至于s则是一个与 V T = [ v 1 , v 2 ] V^T=[v_1,v_2] VT=[v1,v2]相关的缩放因子
[ 1 0 t x 0 1 t y v 1 v 2 s ] ( x y 1 ) = ( x y v 1 x + v 2 y + s ) ⇔ ( x v 1 x + v 2 y + s y v 1 x + v 2 y + s ) \begin{bmatrix}1&0&t_x\\0&1&t_y\\v_1&v_2&s\end{bmatrix}\begin{pmatrix}x\\y\\1\end{pmatrix}=\begin{pmatrix}x\\y\\v_1x+v_2y+s\end{pmatrix}\Leftrightarrow\begin{pmatrix}\frac x{v_1x+v_2y+s}\\\frac y{v_1x+v_2y+s}\end{pmatrix} 10v101v2txtys xy1 = xyv1x+v2y+s (v1x+v2y+sxv1x+v2y+sy)

一般情况下都是会通过归一化使得s = 1 ,原因见下文。


二、平面坐标系与齐次坐标系

问题来了,齐次坐标到底是什么?

齐次坐标系 ( x , y , w ) ∈ P 3 (x,y,w)\in\mathbb{P}^3 (x,y,w)P3与常见的三维空间坐标系 ( x , y , z ) ∈ R 3 (x,y,z)\in\mathbb{R}^3 (x,y,z)R3不同,只有两个自由度:
( x w y w ) ⇔ ( x y w ) \begin{pmatrix}\frac xw\\\frac yw\end{pmatrix}\Leftrightarrow\begin{pmatrix}x\\y\\w\end{pmatrix} (wxwy) xyw
w w w(其中 w w w>0)对应坐标x和y的缩放尺度,当 w w w=1时:
( x y ) ⇔ ( x y 1 ) \binom xy\Leftrightarrow\begin{pmatrix}x\\y\\1\end{pmatrix} (yx) xy1
w w w=0时,对应无穷远:
( I n f I n f ) ⇔ ( x y 1 ) \binom{\mathrm{Inf}}{\mathrm{Inf}}\Leftrightarrow\begin{pmatrix}x\\y\\1\end{pmatrix} (InfInf) xy1
从二维平面上看, ( x , y , w ) (x,y,w) (x,y,w) w w w的变换在从原点到 ( x , y ) (x,y) (x,y)的蓝虚线示意的射线上滑动:
在这里插入图片描述

单应性变换

1.单应性是什么?

此处给出单应性不严谨的定义:用 [无镜头畸变] 的相机从不同位置拍摄 [同一平面物体] 的图像之间存在单应性,可以用 [投影变换] 表示 。
单应变换就是投影变换,逆投影变换是投影变换的逆

注意:单应性的严格定义与成立条件非常复杂,超出本文范围。有需要的朋友请自行查阅《Multiple View Geometry in Computer Vision》书中相关内容。
在这里插入图片描述
简单说就是:

( x l y l 1 ) = H 3 × 3 × ( x r y r 1 ) \begin{pmatrix}x_l\\y_l\\1\end{pmatrix}=H_{3\times3}\times\begin{pmatrix}x_r\\y_r\\1\end{pmatrix} xlyl1 =H3×3× xryr1
其中 ( x l , y l ) (x_l,y_l) (xl,yl)是Left view图片上的点, ( x r , y r ) (x_r,y_r) (xr,yr)是Right view图片上对应的点。

2.那么这个 H 3 × 3 H_{3\times3} H3×3单应性矩阵如何求解呢?

从更一般的情况分析,每一组匹配点 ( x i , y i ) → m a t c h ( x i ′ , y i ′ ) (x_i,y_i)\xrightarrow{match}(x_i^{\prime},y_i^{\prime}) (xi,yi)match (xi,yi)有以下等式成立:
( x i ′ y i ′ 1 ) = [ h 11 h 12 h 13 h 21 h 22 h 23 h 31 h 32 h 33 ] ( x i y i 1 ) = ( h 11 x i + h 12 y i + h 13 h 21 x i + h 22 y i + h 23 h 31 x i + h 32 y i + h 33 ) \begin{pmatrix}x'_i\\y'_i\\1\end{pmatrix}=\begin{bmatrix}h_{11}&h_{12}&h_{13}\\h_{21}&h_{22}&h_{23}\\h_{31}&h_{32}&h_{33}\end{bmatrix}\begin{pmatrix}x_i\\y_i\\1\end{pmatrix}=\begin{pmatrix}h_{11}x_i+h_{12}y_i+h_{13}\\h_{21}x_i+h_{22}y_i+h_{23}\\h_{31}x_i+h_{32}y_i+h_{33}\end{pmatrix} xiyi1 = h11h21h31h12h22h32h13h23h33 xiyi1 = h11xi+h12yi+h13h21xi+h22yi+h23h31xi+h32yi+h33
由平面坐标与齐次坐标对应关系 ( x w , y w ) ∈ R 2 ⇔ ( x , y , w ) ∈ P 3 (\frac xw,\frac yw)\in\mathbb{R}^2\Leftrightarrow(x,y,w)\in\mathbb{P}^3 (wx,wy)R2(x,y,w)P3,上式可以表示为:
x i ′ = h 11 x i + h 12 y i + h 13 h 31 x i + h 32 y i + h 33 y i ′ = h 21 x i + h 22 y i + h 23 h 31 x i + h 32 y i + h 33 x_{i}^{\prime}=\frac{h_{11}x_i+h_{12}y_i+h_{13}}{h_{31}x_i+h_{32}y_i+h_{33}}\\y_{i}^{\prime}=\frac{h_{21}x_i+h_{22}y_i+h_{23}}{h_{31}x_i+h_{32}y_i+h_{33}} xi=h31xi+h32yi+h33h11xi+h12yi+h13yi=h31xi+h32yi+h33h21xi+h22yi+h23
进一步变换为:
( h 31 x i + h 32 y i + h 33 ) ⋅ x i ′ = h 11 x i + h 12 y i + h 13 ( h 31 x i + h 32 y i + h 33 ) ⋅ y i ′ = h 21 x i + h 22 y i + h 23 (h_{31}x_i+h_{32}y_i+h_{33})\cdot x_i^{\prime}=h_{11}x_i+h_{12}y_i+h_{13}\\(h_{31}x_i+h_{32}y_i+h_{33})\cdot y_i^{\prime}=h_{21}x_i+h_{22}y_i+h_{23} (h31xi+h32yi+h33)xi=h11xi+h12yi+h13(h31xi+h32yi+h33)yi=h21xi+h22yi+h23
写成矩阵 A X = 0 AX=0 AX=0的形式:

[ x i y i 1 0 0 0 − x i ′ x i − x i ′ y i − x i ′ 0 0 0 x i y i 1 − y i ′ x i − y i ′ y i − y i ′ ] [ h 11 h 12 h 13 h 21 h 22 h 23 h 31 h 32 h 33 ] = 0 \begin{bmatrix}x_i&y_i&1&0&0&0&-x_i^{\prime}x_i&-x_i^{\prime}y_i&-x_i^{\prime}\\0&0&0&x_i&y_i&1&-y_i^{\prime}x_i&-y_i^{\prime}y_i&-y_i^{\prime}\end{bmatrix}\begin{bmatrix}h_{11}\\h_{12}\\h_{13}\\h_{21}\\h_{22}\\h_{23}\\h_{31}\\h_{32}\\h_{33}\end{bmatrix}=0 [xi0yi0100xi0yi01xixiyixixiyiyiyixiyi] h11h12h13h21h22h23h31h32h33 =0
也就是说一组匹配点 ( x i , y i ) → m a t c h ( x i ′ , y i ′ ) (x_i,y_i)\xrightarrow{match}(x_i^{\prime},y_i^{\prime}) (xi,yi)match (xi,yi)可以获得2组方程。

3.单应性矩阵8自由度

注意观察:单应性矩阵 H H H a H aH aH其实是完全一样的(其中 a ≠ 0 a≠0 a=0)例如:
( x i ′ y i ′ 1 ) = a H ( x i y i 1 ) \begin{pmatrix}x_i^{\prime}\\y_i^{\prime}\\1\end{pmatrix}=aH\begin{pmatrix}x_i\\y_i\\1\end{pmatrix} xiyi1 =aH xiyi1
x i ′ = a h 11 x i + a h 12 y i + a h 13 a h 31 x i + a h 32 y i + a h 33 = h 11 x i + h 12 y i + h 13 h 31 x i + h 32 y i + h 33 y i ′ = a h 21 x i + a h 22 y i + a h 23 a h 31 x i + a h 32 y i + a h 33 = h 21 x i + h 22 y i + h 23 h 31 x i + h 32 y i + h 33 x_{i}^{\prime}=\frac{ah_{11}x_i+ah_{12}y_i+ah_{13}}{ah_{31}x_i+ah_{32}y_i+ah_{33}}=\frac{h_{11}x_i+h_{12}y_i+h_{13}}{h_{31}x_i+h_{32}y_i+h_{33}}\\y_{i}^{\prime}=\frac{ah_{21}x_i+ah_{22}y_i+ah_{23}}{ah_{31}x_i+ah_{32}y_i+ah_{33}}=\frac{h_{21}x_i+h_{22}y_i+h_{23}}{h_{31}x_i+h_{32}y_i+h_{33}} xi=ah31xi+ah32yi+ah33ah11xi+ah12yi+ah13=h31xi+h32yi+h33h11xi+h12yi+h13yi=ah31xi+ah32yi+ah33ah21xi+ah22yi+ah23=h31xi+h32yi+h33h21xi+h22yi+h23

即点 ( x i , y i ) (x_i,y_i) (xi,yi)无论是经过 H H H还是 a H aH aH映射,变化后都是 ( x i ′ , y i ′ ) (x_i^\prime,y_i^\prime) (xi,yi)
如果使 a = 1 h 33 a=\frac1{h_{33}} a=h331那么有:
H ′ = a H = [ h 11 h 33 h 12 h 33 h 13 h 33 h 21 h 33 h 22 h 33 h 22 h 33 h 31 h 33 h 32 h 33 1 ] = [ h 11 ′ h 12 ′ h 13 ′ h 21 ′ h 22 ′ h 23 ′ h 31 ′ h 32 ′ 1 ] \begin{gathered}H^{\prime}=aH=\begin{bmatrix}\frac{h_{11}}{h_{33}}&\frac{h_{12}}{h_{33}}&\frac{h_{13}}{h_{33}}\\\frac{h_{21}}{h_{33}}&\frac{h_{22}}{h_{33}}&\frac{h_{22}}{h_{33}}\\\frac{h_{31}}{h_{33}}&\frac{h_{32}}{h_{33}}&1\end{bmatrix}=\begin{bmatrix}h_{11}^{\prime}&h_{12}^{\prime}&h_{13}^{\prime}\\h_{21}^{\prime}&h_{22}^{\prime}&h_{23}^{\prime}\\h_{31}^{\prime}&h_{32}^{\prime}&1\end{bmatrix}\end{gathered} H=aH= h33h11h33h21h33h31h33h12h33h22h33h32h33h13h33h221 = h11h21h31h12h22h32h13h231
所以单应性矩阵H虽然有9个未知数,但是只有8个自由度。
在求H时一般添加约束 h ˉ 33 = 1 \bar{h}_{33}=1 hˉ33=1(也有用
h 11 2 + h 12 2 + … + h 33 2 = 1 \sqrt{h_{11}^2+h_{12}^2+\ldots+h_{33}^2}=1 h112+h122++h332 =1约束),所以还有 h 11 ∼ h 32 h_{11}\sim h_{32} h11h32共8个未知数。由于一组匹配点 ( x i , y i ) → m a t c h ( x i ′ , y i ′ ) (x_i,y_i)\xrightarrow{match}(x_i^{\prime},y_i^{\prime}) (xi,yi)match (xi,yi)对应2组方程,那么只需要 n = 4 n=4 n=4组不共线的匹配点即可求解 H H H的唯一解。
下图为手机拍摄,有镜头畸变:
在这里插入图片描述
OpenCV已经提供了相关API,代码和变换结果如下。

import cv2
import numpy as np

im1 = cv2.imread('left.jpg')
im2 = cv2.imread('right.jpg')
src_points = np.array([[581, 297], [1053, 173], [1041, 895], [558, 827]])
dst_points = np.array([[571, 257], [963, 333], [965, 801], [557, 827]])

H, _ = cv2.findHomography(src_points, dst_points)
h, w = im2.shape[:2]
im2_warp = cv2.warpPerspective(im2, H, (w, h))

在这里插入图片描述

可以看到:

  1. 红框所在平面上内容基本对齐,但受到镜头畸变影响无法完全对齐;
  2. 平面外背景物体不符合单应性原理,偏离很大,完全无法对齐。

4.传统方法估计单应性矩阵

一般传统方法估计单应性变换矩阵,需要经过以下4个步骤:

  1. 提取每张图SIFT/SURF/FAST/ORB等特征点
  2. 提取每个特征点对应的描述子
  3. 通过匹配特征点描述子,找到两张图中匹配的特征点对(这里可能存在错误匹配)
  4. 使用RANSAC算法剔除错误匹配
  5. 求解方程组,计算Homograph单应性变换矩阵

示例代码如下:

#coding:utf-8
 
# This code only tested in OpenCV 3.4.2!
import cv2 
import numpy as np
 
# 读取图片
im1 = cv2.imread('left.jpg')
im2 = cv2.imread('right.jpg')
 
# 计算SURF特征点和对应的描述子,kp存储特征点坐标,des存储对应描述子
surf = cv2.xfeatures2d.SURF_create()
kp1, des1 = surf.detectAndCompute(im1, None)
kp2, des2 = surf.detectAndCompute(im2, None)
 
# 匹配特征点描述子
bf = cv2.BFMatcher()
matches = bf.knnMatch(des1, des2, k=2)
 
# 提取匹配较好的特征点
good = []
for m,n in matches:
    if m.distance < 0.7*n.distance:
        good.append(m)
 
# 通过特征点坐标计算单应性矩阵H
# (findHomography中使用了RANSAC算法剔初错误匹配)
src_pts = np.float32([kp1[m.queryIdx].pt for m in good]).reshape(-1,1,2)
dst_pts = np.float32([kp2[m.trainIdx].pt for m in good]).reshape(-1,1,2)
H, mask = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC, 5.0)
matchesMask = mask.ravel().tolist()
 
# 使用单应性矩阵计算变换结果并绘图
h, w, d = im1.shape
pts = np.float32([[0,0], [0,h-1], [w-1,h-1], [w-1,0]]).reshape(-1,1,2)
dst = cv2.perspectiveTransform(pts, H)
img2 = cv2.polylines(im2, [np.int32(dst)], True, 255, 3, cv2.LINE_AA)
 
draw_params = dict(matchColor = (0,255,0), # draw matches in green color
                   singlePointColor = None,
                   matchesMask = matchesMask, # draw only inliers
                   flags = 2)
 
im3 = cv2.drawMatches(im1, kp1, im2, kp2, good, None, **draw_params)

在这里插入图片描述
相关内容网上资料较多,这里不再重复造轮子。需要说明,一般情况计算出的匹配的特征点对 ( x i , y i ) → m a t c h ( x i ′ , y i ′ ) (x_i,y_i)\xrightarrow{match}(x_i^{\prime},y_i^{\prime}) (xi,yi)match (xi,yi)数量都有 n ≫ 4 n\gg4 n4,此时需要解超定方程组(类似于求解线性回归时数据点的数量远多于未知数)。

深度学习在单应性方向的进展

1.HomographyNet(深度学习end2end估计单应性变换矩阵)

HomographyNet是发表在CVPR 2016的一种用深度学习计算单应性变换的网络,即输入两张图,直接输出单应性矩阵 H H H

在这里插入图片描述
在之前的分析中提到,只要有4组 ( x i , y i ) ⟶ m a t c h ( x i ′ , y i ′ ) (x_i,y_i)\stackrel{match}{\longrightarrow}(x_i',y_i') (xi,yi)match(xi,yi)匹配点即可计算 H 3 × 3 H_{3\times3} H3×3的唯一解。相似的,只要有4组 ( △ x i , △ y i ) (\triangle x_i,\triangle y_i) (xi,yi)也可以计算出 H 3 × 3 H_{3\times3} H3×3唯一解:

{ ( △ x 1 , △ y 1 ) ( △ x 2 , △ y 2 ) ( △ x 3 , △ y 3 ) ( △ x 4 , △ y 4 ) → H = [ h 11 h 12 h 13 h 21 h 22 h 23 h 31 h 32 1 ] \begin{cases}(\triangle x_1,\triangle y_1)\\(\triangle x_2,\triangle y_2)\\(\triangle x_3,\triangle y_3)\\(\triangle x_4,\triangle y_4)\end{cases}\to H=\begin{bmatrix}h_{11}&h_{12}&h_{13}\\h_{21}&h_{22}&h_{23}\\h_{31}&h_{32}&1\end{bmatrix} (x1,y1)(x2,y2)(x3,y3)(x4,y4)H= h11h21h31h12h22h32h13h231

其中 △ x i = x i − x i ′ \triangle x_i=x_i-x_i^{\prime} xi=xixi △ y i = y i − y i ′ \triangle y_i=y_i-y_i^{\prime} yi=yiyi
在这里插入图片描述
分析到这里,如果要计算 H H H,网络输出可以有以下2种情况:

  1. Regression:网络直接输出 ( △ x 1 , △ y 1 ) ∼ ( △ x 4 , △ y 4 ) (\triangle x_1,\triangle y_1)\sim(\triangle x_4,\triangle y_4) (x1,y1)(x4,y4)共8个数值 这样设置网络非常直观,使用L2损失训练,测试时直接输出8个float values,但是没有置信度confidence。即在使用网络时,无法知道当前输出单应性可靠程度。
  2. Classification:网络输出 ( △ x 1 , △ y 1 ) ∼ ( △ x 4 , △ y 4 ) (\triangle x_1,\triangle y_1)\sim(\triangle x_4,\triangle y_4) (x1,y1)(x4,y4)共8个数值的量化值+confidence这时将网络输出每个 △ x i \triangle x_i xi △ y i \triangle y_i yi量化成21个区间,用分类的方法判断落在哪一个区间。训练时使用Softmax损失。相比回归直接输出数值,量化必然会产生误差,但是能够输出分类置信度评判当前效果好坏,更便于实际应用。

另外HomographyNet训练时数据生成方式也非常有特色。

首先在随机 p p p​位置获取正方形图像块Patch A
然后对正方形4个点进行随机扰动,同时获得4组 ( △ x i , △ y i ) (\triangle x_i,\triangle y_i) (xi,yi)

再通过4组 ( △ x i , △ y i ) (\triangle x_i,\triangle y_i) (xi,yi)计算 H A B H^{AB} HAB
最后将图像通过 H A B = ( H A B ) − 1 H^{AB}=(H^{AB})^{-1} HAB=(HAB)1变换,在变换后图像 p p p位置获取正方形图像块Patch B
那么图像块A和图像块B作为输入,4组 ( △ x i , △ y i ) (\triangle x_i,\triangle y_i) (xi,yi)​作为监督Label,进行训练
在这里插入图片描述
可以看到,在无法提取足够特征点的弱纹理区域,HomographyNet相比传统方法确实有一定的优势:
在这里插入图片描述

2.Spatial Transformer Networks(直接对CNN中的卷积特征进行变换)

其实早在2015年,就已经有对CNN中的特征进行变换的STN结构。

在这里插入图片描述
假设有特征层 U U U,经过卷积变为¥V¥,可以在他们之间插入STN结构。这样就可以直接学习到从特征 U U U上的点 ( △ x i u , △ y i u ) (\triangle x_i^u,\triangle y_i^u) (xiu,yiu)的仿射变换。

( x i u y i u ) = T θ ( G i ) = A θ ⋅ ( x i u y i u 1 ) = [ θ 11 θ 12 θ 13 θ 21 θ 22 θ 23 ] ( x i u y i u 1 ) \begin{pmatrix}x_i^u\\y_i^u\end{pmatrix}=T_\theta(G_i)=A_\theta\cdot\begin{pmatrix}x_i^u\\y_i^u\\1\end{pmatrix}=\begin{bmatrix}\theta_{11}&\theta_{12}&\theta_{13}\\\theta_{21}&\theta_{22}&\theta_{23}\end{bmatrix}\begin{pmatrix}x_i^u\\y_i^u\\1\end{pmatrix} (xiuyiu)=Tθ(Gi)=Aθ xiuyiu1 =[θ11θ21θ12θ22θ13θ23] xiuyiu1

其中 A θ A_{\theta} Aθ对应STN中的仿射变换参数。STN直接在特征维度进行变换,且可以插入轻松任意两层卷积中。

3.DELF: DEep Local Features(深度学习提取特征点与描述子)

之前提到传统方法使用SIFT和Surf等特征点估计单应性。显然单应性最终估计准确度严重依赖于特征点和描述子性能。Google在ICCV 2017提出使用使用深度学习提取特征点。
在这里插入图片描述

考虑到篇幅,这里不再展开DELF,请有兴趣的读者自行了解相关内容。

三、关于OpenCV图像坐标系的问题

在这里插入图片描述
需要说明的是,在上述分析中使用的是 ( x , y ) (x,y) (x,y)坐标系,但是在OpenCV等常用图像库中往往使用图像左上角为原点的 ( x c o l , y r o w ) (x_{col},y_{row}) (xcol,yrow)的像素坐标系,会导致OpenCV中的Homograph矩阵与上述推导有一些差异。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

沮丧的迈克尔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值