Outline
- template matching
- classification
Template matching
针对一个未知物体的识别,直觉的做法就是:将其与已知的数据库中数据做对比。做对比的方法包括:
- 欧式距离
d = ∥ F − G ∥ = ∑ y = 1 q ∑ x = 1 p [ f ( x , y ) − g ( x , y ) ] 2 d = \| F - G \| = \sum_{y=1}^{q} \sum_{x=1}^{p} \left[ f(x, y) - g(x, y) \right]^2 d=∥F−G∥=y=1∑qx=1∑p[f(x,y)−g(x,y)]2
其中: F F F 为待识别图像, G G G 为数据库中的图像, f ( x , y ) f(x, y) f(x,y) 和 g ( x , y ) g(x, y) g(x,y) 为图像像素的灰度值。
存在问题:即使图像很相似,但是亮度和对比度不同,也会导致距离很大。
解决方案:将图像归一化
f n ( x , y ) = f ( x , y ) − μ f σ f f_n(x, y) = \frac{f(x, y) - \mu_f}{\sigma_f} fn(x,y)=σff(x,y)−μf
其中: μ f \mu_f μf 为图像的均值, σ f \sigma_f σf 为图像的标准差。
所以欧式距离转化为:
d n = ( f n − g n ) T ( f n − g n ) d_n = (f_n - g_n)^T (f_n - g_n) dn=(fn−gn)T(fn−gn)
- 相关系数
γ = ( f − m f ) T ( g − m g ) ∥ f c ∥ ∥ g c ∥ \gamma = \frac{( \mathbf{f} - m_f )^T ( \mathbf{g} - m_g )}{ \| \mathbf{f}_c \| \| \mathbf{g}_c \| } γ=∥fc∥∥gc∥(f−mf)T(g−mg)
其中: m f m_f mf 和 m g m_g mg 为图像的均值向量, f c \mathbf{f}_c fc 和 g c \mathbf{g}_c gc 为图像的中心化向量。 ∥ f c ∥ \| \mathbf{f}_c \| ∥fc∥ 为模长。
可知: γ \gamma γ 的取值范围为 [ − 1 , 1 ] [-1, 1] [−1,1], γ \gamma γ 越大,图像越相似。
本质上是cosine相似度的一种变形。
将图片与已知的图片一一比较,也可以看作是一个分类的过程。因为每个物体包含很多张图片,将图片与物体关联,实际上也是将图片分到这个“物体”类中。
分类方法
-
k nearest neighbor 方法
- 已知训练样本集合 x 1 , x 2 , . . . , x n {x_1, x_2, ..., x_n} x1,x2,...,xn, 其中每个样本都有标签。测试样本为 x x x。
- 计算 x x x 与每个训练样本的距离,找到距离最小的 k k k 个样本。
- 这 k k k 个样本中出现次数最多的标签,作为 x x x 的标签。
存在问题:
- 如果训练样本集有很多样本,则对比测试样本与每个样本的距离的计算成本很高
- 对训练样本通常会overfitting, 泛化性不好
解决方案1:
-
不与每个样本对比距离,仅与分类中心做对比
G k = arg min j ∥ f − μ j ∥ { G_k = \arg\min_j \left\| \mathbf{f} - \mu_j \right\| } Gk=argjmin∥f−μj∥其中 μ j \mu_j μj 为第 j j j 类样本的中心, f \mathbf{f} f 为测试样本特征向量
但仍存在问题:
解决方案2:
-
归一化距离,马氏距离 Mahalanobis distance
μ j = 1 q j ∑ x i ∈ ω j x i { \mu_j = \frac{1}{q_j} \sum_{x_i \in \omega_j} x_i } μj=qj1xi∈ωj∑xiΣ j = 1 q j ∑ x i ∈ ω j ( x i − μ j ) ( x i − μ j ) T = 1 q j ∑ x i ∈ ω j x i x i T − μ j μ j T { \Sigma_j = \frac{1}{q_j} \sum_{x_i \in \omega_j} (x_i - \mu_j)(x_i - \mu_j)^T } = \frac{1}{q_j} \sum_{x_i \in \omega_j} x_i x_i^T - \mu_j \mu_j^T Σj=qj1xi∈ωj∑(xi−μj)(xi−μj)T=qj1xi∈ωj∑xixiT−μjμjT
d M a j = ( x − μ j ) T Σ j − 1 ( x − μ j ) { d_{Maj} = ( \mathbf{x} - \mu_j )^T \Sigma_j^{-1} ( \mathbf{x} - \mu_j ) } dMaj=(x−μj)TΣj−1(x−μj)
如果每一个类别的样本都服从高斯分布,则最小马氏距离分类器是最好的分类器。
但仍存在问题:
如果样本存在很多个类别,且每个类别内的数据很少,则会导致协方差矩阵不满秩,无法求逆,计算结果不稳定。解决方法:引入类间和类内分布
-
类内散布矩阵
S w = 1 q ∑ j = 1 c q j Σ j { S^w = \frac{1}{q} \sum_{j=1}^{c} q_j \Sigma_j } Sw=q1j=1∑cqjΣj -
类间散布矩阵
S b = 1 q ∑ j = 1 c q j ( μ j − μ ) ( μ j − μ ) T { S^b = \frac{1}{q} \sum_{j=1}^{c} q_j (\mu_j - \mu)(\mu_j - \mu)^T } Sb=q1j=1∑cqj(μj−μ)(μj−μ)T -
类内和类间散布矩阵
S t = Σ w + Σ b { S^t = \Sigma^w + \Sigma^b } St=Σw+Σb
马氏距离主要考虑类内距离,可以用 S w S^w Sw代替协方差矩阵 Σ \Sigma Σ。
d = ( x − μ ) T S w ( x − μ ) { d = (\mathbf{x} - \mu)^T S^w (\mathbf{x} - \mu) } d=(x−μ)TSw(x−μ)