统计有助于计算机视觉

时间:2012-03-16 22:58:02

标签: statistics pattern-matching computer-vision pattern-recognition

我正在进行计算机视觉领域的毕业设计,我只参加了一门课程,讨论了非常基本的概念,现在我在相当高级的课题上面临更多困难,所以我需要帮助(书,教程,课程,..等)掌握和回顾统计学中的基本思想和概念,然后深入研究计算机视觉中使用的细节(统计细节)。

2 个答案:

答案 0 :(得分:16)

您可以使用此混淆矩阵PyTorch示例来计算误报/误报等:

import torch


def confusion(prediction, truth):
    """ Returns the confusion matrix for the values in the `prediction` and `truth`
    tensors, i.e. the amount of positions where the values of `prediction`
    and `truth` are
    - 1 and 1 (True Positive)
    - 1 and 0 (False Positive)
    - 0 and 0 (True Negative)
    - 0 and 1 (False Negative)
    """

    confusion_vector = prediction / truth
    # Element-wise division of the 2 tensors returns a new tensor which holds a
    # unique value for each case:
    #   1     where prediction and truth are 1 (True Positive)
    #   inf   where prediction is 1 and truth is 0 (False Positive)
    #   nan   where prediction and truth are 0 (True Negative)
    #   0     where prediction is 0 and truth is 1 (False Negative)

    true_positives = torch.sum(confusion_vector == 1).item()
    false_positives = torch.sum(confusion_vector == float('inf')).item()
    true_negatives = torch.sum(torch.isnan(confusion_vector)).item()
    false_negatives = torch.sum(confusion_vector == 0).item()

    return true_positives, false_positives, true_negatives, false_negatives

您可以使用nn.BCEWithLogitsLoss(因此删除S型信号),并将pos_weight> 1设置为增加调用率。或使用Dice Coefficients对模型进行假阳性惩罚,以进一步优化模型,例如:

def Dice(y_true, y_pred):
    """Returns Dice Similarity Coefficient for ground truth and predicted masks."""
    #print(y_true.dtype)
    #print(y_pred.dtype)
    y_true = np.squeeze(y_true)/255
    y_pred = np.squeeze(y_pred)/255
    y_true.astype('bool')
    y_pred.astype('bool')
    intersection = np.logical_and(y_true, y_pred).sum()
    return ((2. * intersection.sum()) + 1.) / (y_true.sum() + y_pred.sum() + 1.)

IOU计算说明

  1. 计算真实阳性(TP)
  2. 计算误报(FP)
  3. 计算假阴性(FN)
  4. 交集= TP
  5. 联盟= TP + FP + FN
  6. IOU =交叉口/联盟

IOU = Intersection/Union explained computer vision

左侧是我们的基本事实,而右侧则是我们的预测。左侧突出显示的单元格指示我们正在右侧查看统计信息的类。右侧的高亮显示乳白色的真阳性,橙色的假阳性,黄色的假阴性(请注意,所有其他均为真阴性-它们被预测为单独的此类,不应基于真实的事实。 )。

对于类0,仅4x4矩阵的第一行应被预测为零。这是真实事实的相当简化的版本。实际上,零可能在矩阵中的任何位置。在右侧,我们看到1,0,0,0,这意味着第一个是假阴性,而其他三个是真阳性(对于Intersection也称为3)。从那里,我们需要找到错误地预测零的其他任何地方,并且我们注意到在第二行中发生了一次,在第四行中发生了两次,总共出现了三个误报。 为了获得并集,我们将TP(3),FP(3)和FN(1)相加得到七个。因此,此类的IOU为3/7。

如果我们对所有类别都这样做并平均IOU,则会得到:

Mean IOU = [(3/7) + (2/6) + (3/4) + (1/6)] / 4 = 0.420

您还需要了解如何提取 mAP(平均平均精度)的统计信息:

  1. https://www.youtube.com/watch?v=pM6DJ0ZZee0
  2. https://towardsdatascience.com/breaking-down-mean-average-precision-map-ae462f623a52#1a59
  3. https://medium.com/@hfdtsinghua/calculate-mean-average-precision-map-for-multi-label-classification-b082679d31be

计算协方差矩阵

变量的方差描述了值的分散程度。协方差是衡量两个变量之间依赖性的量度。

正协方差意味着当第二变量的值也很大时,第一变量的值就很大。负协方差表示相反的含义:一个变量的大值与另一个变量的小值相关。

协方差值取决于变量的大小,因此很难对其进行分析。可以使用更容易解释的相关系数。相关系数就是归一化的协方差。

enter image description here

正协方差意味着一个变量的较大值与另一个变量的较大值相关联(左)。负协方差意味着一个变量的大数值与另一个变量的小数值相关联(右)。 协方差矩阵是一个汇总一组向量的方差和协方差的矩阵,它可以告诉您很多有关变量的信息。对角线对应于每个向量的方差: enter image description here

矩阵A及其协方差矩阵。对角线对应于每个列向量的方差。让我们检查方差的公式: enter image description here

向量的长度为n,向量的平均值为x̄。例如,A的第一列向量的方差为: enter image description here

这是我们协方差矩阵的第一个单元格。对角线上的第二个元素对应于第二列向量与A的方差,依此类推。

注意:从矩阵A提取的向量对应于A的列。

其他单元格对应于来自A的两个列向量之间的协方差。例如,第一列和第三列之间的协方差位于协方差矩阵中,作为列1和行3(或列3和列3)。第1行): enter image description here

协方差矩阵中的位置。列对应于第一个变量,行对应于第二个变量(或相反)。 A的第一列和第三列向量之间的协方差是第1列和第3行中的元素(或相反=相同的值)。

让我们检查A的第一列向量和第三列向量之间的协方差是否等于-2.67。两个变量X和Y之间的协方差公式为: enter image description here

在最后一个示例中,变量X和Y是第一列向量和第三列向量。让我们分解一下这个公式,以确保它非常清晰: enter image description here

  1. 和符号(Σ)表示我们将迭代向量的元素。我们将从第一个元素(i = 1)开始,然后计算X的第一个元素减去向量X的平均值: enter image description here

  2. 将结果乘以Y的第一个元素减去向量Y的平均值:enter image description here

  3. 针对向量的每个元素重复该过程,并计算所有结果的总和:enter image description here

  4. 除以向量中元素的数量。

示例-我们从矩阵A开始: enter image description here

我们将计算第一和第三列向量之间的协方差: enter image description hereenter image description here

其中x̄= 3,ȳ= 4和n = 3,所以我们有: enter image description here

代码示例-

使用NumPy,可以使用函数np.cov计算协方差矩阵。

值得注意的是,如果希望NumPy将列用作向量,则必须使用参数rowvar = False。另外,bias = True除以n而不除以n-1。

首先创建数组:

import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

A = np.array([[1, 3, 5], [5, 4, 1], [3, 8, 6]])

现在,我们将使用NumPy函数计算协方差:

np.cov(A, rowvar=False, bias=True)

用点积查找协方差矩阵

还有另一种计算A的协方差矩阵的方法。您可以将A围绕0居中。从向量的每个元素中减去向量的均值,得到一个向量均值为0的向量。自己移调,然后除以观察数。

让我们从一个实现开始,然后我们将尝试理解与前面的等式的链接:

def calculateCovariance(X):
    meanX = np.mean(X, axis = 0)
    lenX = X.shape[0]
    X = X - meanX
    covariance = X.T.dot(X)/lenX
    return covariance

print(calculateCovariance(A))

输出:

array([[ 2.66666667, 0.66666667, -2.66666667],
       [ 0.66666667, 4.66666667, 2.33333333],
       [-2.66666667, 2.33333333, 4.66666667]])

两个向量之间的点积可以表示为: enter image description here

它是向量的每个元素的乘积之和: enter image description here

如果我们有矩阵A,则A及其转置之间的点积将为您提供一个新的矩阵: enter image description here

可视化数据和协方差矩阵

为了获得有关协方差矩阵及其有用性的更多见解,我们将创建一个函数以将其与2D数据一起可视化。您将能够看到协方差矩阵与数据之间的链接。

如上所述,此函数将计算协方差矩阵。它将创建两个子图-一个用于协方差矩阵,另一个用于数据。 Seaborn的heatmap()函数用于创建颜色的渐变-小值将用浅绿色着色,大值将用深蓝色着色。我们选择了一种调色板颜色,但您可能更喜欢其他颜色。数据表示为散点图。

def plotDataAndCov(data):
ACov = np.cov(data, rowvar=False, bias=True)
print 'Covariance matrix:\n', ACov

fig, ax = plt.subplots(nrows=1, ncols=2)
fig.set_size_inches(10, 10)

ax0 = plt.subplot(2, 2, 1)

# Choosing the colors
cmap = sns.color_palette("GnBu", 10)
sns.heatmap(ACov, cmap=cmap, vmin=0)

ax1 = plt.subplot(2, 2, 2)

# data can include the colors
if data.shape[1]==3:
    c=data[:,2]
else:
    c="#0A98BE"
ax1.scatter(data[:,0], data[:,1], c=c, s=40)

# Remove the top and right axes from the data plot
ax1.spines['right'].set_visible(False)
ax1.spines['top'].set_visible(False)

不相关的数据

现在有了图函数,我们将生成一些随机数据以可视化协方差矩阵可以告诉我们的内容。我们将从使用NumPy函数np.random.normal()从正态分布中提取的一些数据开始。

此函数需要均值,标准差和分布的观察次数作为输入。我们将创建两个300个观测值的随机变量,标准偏差为1。第一个变量的平均值为1,第二个变量的平均值为2。如果我们从正态分布中随机抽取两组300个观测值,则两个向量均为不相关。

np.random.seed(1234)
a1 = np.random.normal(2, 1, 300)
a2 = np.random.normal(1, 1, 300)
A = np.array([a1, a2]).T
A.shape

注1:由于原始形状为(2,300),并且我们希望将观察点数作为行(因此形状为(300,2)),所以我们用.T换位数据。

注2:我们使用np.random.seed函数来提高可重复性。下次运行单元时,将使用相同的随机数。让我们检查数据的外观:

A[:10,:]

array([[ 2.47143516, 1.52704645],
       [ 0.80902431, 1.7111124 ],
       [ 3.43270697, 0.78245452],
       [ 1.6873481 , 3.63779121],
       [ 1.27941127, -0.74213763],
       [ 2.88716294, 0.90556519],
       [ 2.85958841, 2.43118375],
       [ 1.3634765 , 1.59275845],
       [ 2.01569637, 1.1702969 ],
       [-0.24268495, -0.75170595]])

好的,我们有两个列向量;现在,我们可以检查分布是否正常:

sns.distplot(A[:,0], color="#53BB04")
sns.distplot(A[:,1], color="#0A98BE")
plt.show()
plt.close()

enter image description here 我们可以看到分布具有相等的标准偏差,但均值不同(1和2)。这正是我们所要的。

现在,我们可以使用函数绘制数据集及其协方差矩阵:

plotDataAndCov(A)
plt.show()
plt.close()


Covariance matrix:
[[ 0.95171641 -0.0447816 ]
 [-0.0447816 0.87959853]]

enter image description here

我们可以在散点图上看到这两个维度是不相关的。请注意,我们有一维的平均值为1(y轴),另一维的平均值为2(x轴)。

此外,协方差矩阵显示每个变量的方差非常大(大约1),而列1和2的协方差很小(大约0)。因为我们确保两个向量是独立的,所以这是相干的。相反的情况不一定正确:covariance of 0 doesn’t guarantee independence

相关数据

现在,让我们从另一列中指定一列来构造依赖数据。

np.random.seed(1234)
b1 =  np.random.normal(3, 1, 300)
b2 = b1 + np.random.normal(7, 1, 300)/2.
B = np.array([b1, b2]).T
plotDataAndCov(B)
plt.show()
plt.close()


Covariance matrix:
[[ 0.95171641 0.92932561]
 [ 0.92932561 1.12683445]]

enter image description here 二维关系在散点图上可见。我们可以看到一条线可以用来从x预测y,反之亦然。协方差矩阵不是对角线(对角线之外有非零像元)。这意味着维度之间的协方差不为零。

从此时开始,使用协方差矩阵,您可以进一步研究以下内容:

  1. 平均归一化
  2. 标准化或规范化
  3. 美白
  4. 零位居中
  5. 解相关​​
  6. 重新缩放

答案 1 :(得分:0)

我假设你想要一些关于模式识别和机器学习领域的东西。如果是这样,我喜欢this book,这是一个很好的介绍,并谈谈有关CV的应用程序。不过,它还假设您具有概率论的一些基本知识。如果不这样做,我建议this book