Convolution Operator
Convolution VS Cross-Correlation
卷积与互相关的核心思想相同:滑动一个核(kernel)在输入图像上,在每个位置计算对应元素乘积的和。
1D
卷积:
(f∗g)[n]=m=−∞∑∞f[m]g[n−m]
互相关:
(f⋆g)[n]=m=−∞∑∞f[m]g[n+m]
2D
卷积:
(f∗g)[i,j]=m=−∞∑∞n=−∞∑∞f[i−m,j−n]g[m,n]
互相关:
(f⋆g)[i,j]=m=−∞∑∞n=−∞∑∞f[i+m,j+n]g[m,n]
Difference
卷积在滑动前会将核翻转(flip),在一维中是时间反转;互相关不翻转核。我们一般使用的是互相关运算,但是库函数称之为 convolution,实际上两者不同。
| 卷积 (Convolution) | 互相关 (Correlation) |
|---|
| 直观理解 | 滤波 (Filter) | 模板匹配 (Template matching) |
| 交换律 | Y | N |
| 结合律 | Y | N |
| 分配律 | Y | N |
| 卷积定理 | F(f∗g)=F(f)⋅F(g) (时域卷积 = 频域乘积) | F(f⋆g)=F(f)⋅F(g) (频域包含复共轭) |
Padding
Importance
- 防止输出空间尺寸缩小(spatial shrinkage),在深网络中保持尺寸一致很重要。
- 保留边缘信息。若不 padding,图像边缘像素被卷积核覆盖次数少,信息利用率低。
Padding Types
- Zero padding:以 0 填充。
- Replicate padding:以边缘像素复制填充。
Output Size
注意这是对某个方向 output size 的计算。各个方向应该分别计算。
Wout=⌊SWin+2P−K⌋+1
其中:
- Win:该方向的输入宽度。
- P:该方向每侧的填充像素数,假设两侧填充一致。
- K:该方向的卷积核宽度。
- S:该方向的步幅。
- Wout:该方向的输出宽度。
Implementation of Convolution
用循环实现卷积在 CPU/GPU 上效率低。想办法将卷积转化为矩阵乘法并使用并行可以大大提高速率。
im2col
符号定义:
| 符号 | 含义 | 维度 |
|---|
| X∈RCin×H×W | 输入特征图 | (Cin,H,W) |
| K∈RCout×Cin×K×K | 卷积核权重 | (Cout,Cin,K,K) |
| b∈RCout | 偏置向量 | (Cout,) |
| Y∈RCout×Hout×Wout | 输出特征图 | (Cout,Hout,Wout) |
| (sh,sw) | 步长 | - |
| (ph,pw) | 填充 | - |
其中输出空间尺寸:
Hout=⌊shH+2ph−K⌋+1,Wout=⌊swW+2pw−K⌋+1
令 N=Hout⋅Wout 表示输出位置的总数。
Kernel Flattening:
将每个输出通道的卷积核展平为行向量:
Wi=vec(Ki,:,:,:)⊤∈R1×(Cin⋅K2)
其中 vec(⋅) 表示按通道优先顺序展平:
vec(Ki,:,:,:)=[vec(Ki,0,:,:)⊤,vec(Ki,1,:,:)⊤,…,vec(Ki,Cin−1,:,:)⊤]⊤
堆叠所有输出通道形成权重矩阵:
W=W0W1⋮WCout−1∈RCout×(Cin⋅K2)
Patch Flattening:
对于每个输出位置 (i,j),i∈[0,Hout), j∈[0,Wout),定义对应的输入感受野:
Pi,j={(c,h,w)∣c∈[0,Cin),h∈[h0,h0+K),w∈[w0,w0+K)}
其中 (h0,w0)=(i⋅sh−ph,j⋅sw−pw)。
提取 patch 并展平为列向量:
xi,j=vec(X:,h0:h0+K,w0:w0+K)∈RCin⋅K2
im2col:
将所有输出位置对应的列向量按列拼接,形成 im2col 矩阵:
Xcol=[x0,0⋯x0,Wout−1x1,0⋯xHout−1,Wout−1]∈R(Cin⋅K2)×N
其中列索引 t=i⋅Wout+j 对应输出位置 (i,j)。
GEMM:
执行矩阵乘法并加上偏置:
Ymat=W⋅Xcol+b⋅1N⊤∈RCout×N
其中 1N∈RN 为全 1 向量,偏置通过广播机制相加。
Reconstruction:
将结果矩阵 reshape 回张量形式:
Y=reshape(Ymat,(Cout,Hout,Wout))
具体地,对于每个输出通道 cout 和空间位置 (i,j):
Ycout,i,j=[Ymat]cout,i⋅Wout+j=d=0∑Cin⋅K2−1Wcout,d⋅[Xcol]d,i⋅Wout+j+bcout=Wcout⋅xi,j+bcout
全过程:
Xim2colXcolW⋅(⋅)+bYmatreshapeY
注:
- im2col 把许多重叠 patch 展示为独立列,内存开销较大。实现时需权衡内存与速度(例如分块实现、使用 cuDNN 优化或直接使用卷积算法)。
- GEMM 高度向量化并在 GPU 上有专门加速(BLAS/cuBLAS),所以比逐点循环快很多。
Toplitz
Line Fitting
直线可以描述许多目标,因此线检测是经典任务。仅仅做边缘检测并不能直接得到直线,因为可能受到遮挡、非直线结构、多条线如何选择等。
两种思路:
- 先检测边缘,再做拟合。
- 使用投票方法(Hough Transform)或鲁棒拟合(RANSAC)。
Least Squares
若已知一系列点 (xi,yi),希望拟合直线 y=kx+m。可以用最小二乘法通过最小化残差平方和求解参数。
也即:
k,mmini=1∑n(yi−(kxi+m))2
矩阵形式:
θmin∥Aθ−y∥22⇔θmin(Aθ−y)T(Aθ−y)
其中
A=x1x2⋮xn11⋮1,θ=[km],y=y1y2⋮yn
最小二乘解析解:
θ=(A⊤A)−1A⊤y
注:
若拟合直线接近竖直,原有斜率参数不稳定。
Imperoved Least Squares
由于前述方法下,当直线竖直时,斜率无穷,最小二乘解不稳定。故我们应当使用一般直线方程求解。也即:
a,b,dmini=1∑n(axi+byi−d)2
但是为了解的唯一性(并且防止平凡解 a=b=d=0),我们可以添加约束 a2+b2+d2=1。得到矩阵形式:
hmin∥Ah∥2
其中
A=x1x2⋮xny1y2⋮yn11⋮1,h=abd,∥h∥=1
我们可以通过 SVD 求解。对矩阵 A 进行奇异值分解得:
An×3=Un×nDn×3V3×3⊤
其中 U 为 n×n 正交阵,V=v1Tv2Tv3T
为 3×3 正交阵,D=[diag{λ1,λ2,λ3}O(n−3)×3]
为类对角矩阵,包含奇异值 ∣λ1∣≥∣λ2∣≥∣λ3∣。
将 h 分解到 V 的正交标架下:
h=α1v1+α2v2+α3v3
由于 ∥h∥=1 从而 α12+α22+α32=1 :
∥Ah∥=∥UDVTh∥=∥DVTh∥=∥Dα1α2α3∥=∥λ1α1λ2α2λ3α3OT∥=(λ1α1)2+(λ2α2)2+(λ3α3)2
从而解析解为 h=±v3. 几何直观即:解为最小伸缩的方向。
RANSAC
最小二乘对异常值(outliers)非常敏感,少数严重偏离点会破坏整体拟合。
随机采样一致性算法(RANdom SAmple Consensus)可以解决这个问题。
思想是通过大量随机采样最小样本集,生成候选模型并统计内点,最终选择支持内点最多的模型。
Step of RANSAC
- 确定构成模型所需的最小样本数 s、残差阈值 δ、期望成功概率 p(或最大迭代次数 N)。
- 从数据集中随机选择 s 个样本。
- 根据所选样本拟合一个假设模型(putative model)。
- 计算所有点相对于该模型的残差(residual),并判断哪些点为内点(residual<δ)。
- 若当前模型的内点数历史最佳,则更新模型与内点集。
- 重复上述步骤 N 次。结束后,用内点集合重新拟合得到最终模型(可用最小二乘或 SVD)。
The Number of Sample
上述步骤中,选择合适的迭代次数 N 是很重要的。
假设数据集整体服从一个真实模型。我们应当使得完成迭代后,出现一次优秀抽样(抽的 s 个样本全是真实模型的内点)的概率尽量大。假设构成模型所需的最少样本数为 s,真实模型中外点比例为 e,期望出现优秀抽样的概率为 p。
则一次抽样为非优秀抽样( s 个样本中存在真实模型外点)的概率:
1−(1−e)s
N 次抽样中不存在优秀抽样的概率:
(1−(1−e)s)N=1−p
解得:
N=log(1−(1−e)s)log(1−p)
Imperovement
- 对于超参数 threshold 的选取很重要,可以动态调整进行选取。
- 由于对噪声的敏感性,仅做一次 RANSAC 不一定能建立很好的模型,但是可以排除很多 outliers。我们可以对剩下的 inliers 再做 Line Fitting(如使用 Least Squares 或者 SVD).
霍夫变换课上不做要求,此处仅简要介绍。
给定图像空间中的样本点。我们的原始任务是:找到尽可能多点经过的直线;而我们可以利用点和线的对偶关系,把图像空间中的样本点与参数空间的曲线进行一一对应。从而任务转化为:找到尽可能多直线相交的点。
我们常采用直线的法线式方程建立对偶关系:
ρ=xcosθ+ysinθ
从而图像空间的点 (x0,y0) 对应参数空间 (ρ,θ) 中的曲线 ρ=x0cosθ+y0sinθ;图像空间的点共线对应参数空间的曲线共点。
注:Hough Transform 还可以拓展到圆锥曲线,但是计算复杂度明显上升。
RANSAC VS Hough
对比:
- 本质上两者都可以视作一种 voting,但是 RANSAC 是在原始图像空间中进行 vote,而 Hough Transform 是在参数空间中进行 vote。
- RANSAC 适合单模态(single mode)问题(一般检测一条直线);而 Hough Transform 对多模态效果好(能同时检测多个直线)。
- RANSAC 鲁棒性更好,而 Hough Transform 对噪声不够鲁棒。
- RANSAC 和 Hough Transform 都有一定的超参数,RANSAC 需要选取合适的 threshold,而 Hough Transform 需要选取合适的参数空间离散程度、直线聚类参数等。
Corner Detection
Corners as Keypoints
图像的关键点应具有如下性质:
- Saliency(显著性):与周围区域有明显区别。
- Repeatability(可重复性):在不同视角/光照/尺度下能被稳定检测。
- Accurate localization(精准定位):不能是一个大范围区域。
- Quantity(数量充足):一张图片应当具有许多关键点。
角点(Corners)一般满足上述性质,是一类好的关键点。我们给出角点的数学定义,依旧使用梯度:角点处,梯度的幅值应当在两个或更多方向上取局部极大值。
Harris Detector
思想:若窗口向任意方向平移,窗口内像素强度都会显著变化,则该点可能为角点。
The Definition fo Energy
考虑一个以 (x0,y0) 为中心的窗口 N(x0,y0),平移 (u,v),窗口内像素强度的变化程度定义为该点处的能量:
Ex0,y0(u,v)=(x,y)∈N(x0,y0)∑[I(x+u,y+v)−I(x,y)]2
其中 I(⋅,⋅) 为图像强度。
使用一阶泰勒展开(假设 u,v 很小)可得:
I(x+u,y+v)−I(x,y)≈Ix(x,y)u+Iy(x,y)v
代回能量:
E(u,v)≈(x,y)∈N∑(Ix(x,y)u+Iy(x,y)v)2
利用二次型化简得:
E(u,v)≈[uv]M(x0,y0)[uv]
其中
M(x0,y0)=(x,y)∈N(x0,y0)∑[Ix2(x,y)Ix(x,y)Iy(x,y)Ix(x,y)Iy(x,y)Iy2(x,y)]
Window Function
我们可以进一步将二次型 M 表示为卷积形式。常见的有以下两种窗口:
-
Rectangle window:窗函数对窗内均匀加权,不具旋转不变性。
M(x0,y0)=[w(x0,y0)∗Ix2w(x0,y0)∗IxIyw(x0,y0)∗IxIyw(x0,y0)∗Iy2]
其中 w(x0,y0)={1,if(x,y)∈N(x0,y0)0,otherwise
-
Gaussian window:用高斯核加权,具有旋转不变性和平滑性。
M(x0,y0)=[gσ(x0,y0)∗Ix2gσ(x0,y0)∗IxIygσ(x0,y0)∗IxIygσ(x0,y0)∗Iy2]
其中高斯窗口:
gσ(x0,y0)=2πσ21exp(−2σ2x02+y02)
当然由于卷积是一种线性变换,我们可以统一写为:
M(x0,y0)=[F(x0,y0)(Ix2)F(x0,y0)(IxIy)F(x0,y0)(IxIy)F(x0,y0)(Iy2)]
其中 F(x0,y0):Rn×n→R
Eigenvalues for Classification
M 是对称正半定矩阵,可做特征值分解:
M=Q[λ100λ2]Q⊤
其中 λ1,λ2≥0 为 M 的特征值。
由此得:
E(x0,y0)(u,v)≈λ1u′2+λ2v′2
其中 [u′v′]=Q[uv].
由此可见 E(u,v) 是一个抛物面,两个特征值分别对应抛物面在主轴方向上的曲率。依据 λ1,λ2 的大小可判定点的类型:
- 平坦区域(Flat):能量在任方向都很小,也即 λ1≈0,λ2≈0。
- 边缘(Edge):沿边缘方向平移能量变化小,垂直方向平移变化大,也即一个特征值大,另一个接近 0。
- 角点(Corner):沿任意方向平移都会引起能量较大变化,也即两个特征值都大。
Corner Response Function
上述判断需要做特征分解,计算成本略高。我们使用一个近似响应函数用以判断角点。
希望角点满足:
1/k<λ1/λ2<k(1)
λ1,λ2>b(2)
令
θ=21(1)(λ1λ2−2α(λ1+λ2)2)+21(2)(λ1λ2−2t)=λ1λ2−α(λ1+λ2)2−t=detM−α(trM)2−t=(F(Ix2)F(Iy2)−F(IxIy)2)−α(F(Ix2)+F(Iy2))2−t
即为 Harris 响应。若 θ 大且为正则为角点;若 θ 负并且绝对值大则为边缘;若 θ 接近 0 则为平坦区域。
注:其中 α,t 均为超参数。
Step of Harris
Harris Detector 在实际实现中通常步骤为:
- 计算图像梯度 Ix,Iy,并计算 Ix2,Iy2,IxIy,得到与原图像同维度的三张梯度图。
- 对上述三图用高斯滤波 gσ 卷积得到三张与原图像同维度的高斯图。
- 对于像素点 (x0,y0),使用三张高斯图对应位置的三个数构成二阶对称阵,计算 θ,并进行阈值二值化 θ>0。
- 非极大值抑制(NMS) 保留局部极大值作为关键点位置。
Equivariance & Invariance
设输入信号空间 V,输出表示空间 W,信号检测函数 f:V→W。
记 T 为抽象变换集合(如平移 5 像素、旋转 π/2)。对每个 τ∈T,同时定义:
- TV(τ):V→V(τ 在输入空间的实现)
- TW(τ):W→W(τ 在输出空间的实现)
Equivariance(等变性):对输入信号做变换,输出表示也同样变换。
TW(τ)[f(X)]=f(TV(τ)(X)),∀τ∈T
Invariance(不变性):对输入信号做变换,输出表示不变。
f(X)=f(TV(τ)(X)),∀τ∈T
注:上述性质都是检测函数 f 的。
Harris Detector 的性质:
记输入图像为 A∈Rn×n。
M(x0,y0)=[F(x0,y0)(Ix2)F(x0,y0)(IxIy)F(x0,y0)(IxIy)F(x0,y0)(Iy2)]
θ=(F(Ix2)F(Iy2)−F(IxIy)2)−α(F(Ix2)+F(Iy2))2−t
Θ(A)=[θ(i,j)]∈Rn×n
以下的讨论不考虑边缘处。
-
所有的 Θ 对图像平移(Translation)等变:
记 Tu,v 表示平移 (u,v) 个像素,也即 (Tu,v(A))x,y=Ax−u,y−v。则有:
Tu,v(Θ(A))=Θ(Tu,v(A))
证明:
只需证明以下三个引理,具体证略。
- 平移与梯度可交换
Tu,v(∂x∂A)=∂x∂Tu,v(A),Tu,v(∂y∂A)=∂y∂Tu,v(A)
- 平移与代数运算可交换
Tu,v(A⋅B)=Tu,v(A)⋅Tu,v(B)
- 平移与卷积可交换
Tu,v(g∗A)=g∗Tu,v(A)
-
各向同性(Isotropic) 的 filter 产生的 Θ 对图像旋转(Rotation)等变:
记 Rϕ 表示图像旋转 ϕ 角度,即 (Rϕ(A))x,y=Ax′,y′,其中 (x′,y′) 是 (x,y) 旋转 −ϕ 后的坐标。
filter 为各向同性的核 g。
则有:
Rϕ(Θ(A))=Θ(Rϕ(A))
证明:
只需证明以下三个引理,具体证略。
- 旋转与梯度可交换
Rϕ(∂x∂A)=∂x′∂Rϕ(A),Rϕ(∂y∂A)=∂y′∂Rϕ(A)
- 旋转与代数运算可交换
Rϕ(A⋅B)=Rϕ(A)⋅Rϕ(B)
- 旋转与卷积可交换
Rϕ(g∗A)≈g∗Rϕ(A)
注:
- 约等于是因为在像素网格中考虑,旋转后必须采用插值方式计算像素值。
- kernel 的 rotation invariant 对应于 kernel convolution 的 rotation equivariant。
-
对尺度(Scale)不等变:
放大缩小 viewpoint 会导致角点检测结果变化。
注:SIFT 的 DoG 检测或 SURF 等是尺度不变的。