1.机器学习数据获取与准备
1.1数据预处理与探索
1.1.1 缺失值
1.1.2 重复值
1.1.3 异常值
1.1.4 数据可视化
1.1.5 特征工程
数据标准化
概念 :标准化是将数据转换为均值为0, 标准差 为1的分布,即使数据符合标准正态分布。
目的:
-
标准化的目的是让数据具有相同的尺度(即均值为0,方差为1),但不改变数据的分布形态,适合于处理有正态分布的数据。
-
标准化有助于加速一些机器学习算法的收敛,比如梯度下降算法。
-
适合于数据有正负两种不同值的场景。
应用场景:
-
特别适用于那些假设数据服从正态分布 的算法,例如:线性回归 、逻辑回归、支持向量机等。
-
当特征值的量纲不同或范围差异较大时(如年龄和收入),标准化可以让这些特征在训练中具有相同的权重。
数据 归一化 ( Normalization )
概念 :归一化是将数据压缩到特定的区间,通常是 [0, 1] 之间,或者 [-1, 1] 之间。

目的:
-
归一化的目的是将数据缩放到特定范围内,一般是 [0, 1] 或 [-1, 1],这样不同的特征值可以按比例缩小或放大。
-
适合特征之间量纲差异很大,且模型需要把不同特征映射到相同尺度上时。
应用场景:
-
归一化更适合不服从正态分布的数据,尤其是那些带有固定区间限制的场景,比如像素值(范围在 [0, 255])。
-
适用于要求数据范围一致的算法,如:**神经网络、K-近邻算法(KNN)**等。
-
特别在距离度量敏感的算法中,如KNN和K-means,归一化有助于确保每个特征在计算距离时都具有相似的权重。

独热编码
独热编码(One-Hot Encoding)是一种常见的分类数据编码方法,通常用于将分类变量转换为机器学习算法能够理解的数值形式。它的主要思想是将每个类别表示为一个二进制向量,其中只有一个元素为1,其他元素为0。
例如,假设有一个类别变量颜色
,包含三种可能的取值:红色
、蓝色
、绿色
。使用独热编码后:
-
红色
表示为[1, 0, 0]
-
蓝色
表示为[0, 1, 0]
-
绿色
表示为[0, 0, 1]
这种方法避免了分类变量之间的顺序关系(例如红色比蓝色大这种情况),适合大多数机器学习算法。
独热编码的优缺点:
-
优点:避免了类别数据之间的顺序或距离假设,使得模型不会对类别间的大小关系产生错误的理解。
-
缺点:当类别数量非常多时,可能会导致生成的特征数量增加,进而导致数据的稀疏性。
2.无监督学习算法
2.1 降维
2.1.1 PCA
PCA ( 主成分分析 , Principal Component Analysis )是一种常见的数据降维方法,主要用于减少数据集中的特征数量(维度),同时保留尽可能多的原始信息。PCA的核心思想是将高维数据投影到一个低维的空间,找到那些能解释数据最大方差的"主成分"。
为什么需要降维?
-
减少计算复杂度:在高维数据中,计算和存储的成本较高,降维可以减少这些成本。
-
缓解 过拟合:通过减少冗余特征,降低模型的复杂度,PCA有助于避免过拟合。
-
数据可视化:高维数据很难直接可视化,降维后可以将数据投影到2D或3D空间中,方便直观展示。
PCA 的核心步骤
PCA通过线性变换,将原始数据转换为新的坐标系,新的坐标轴(主成分)是数据中的重要方向。具体步骤如下:
-
数据中心化:
- 首先,将每个特征减去它的均值,使得数据的中心(均值)移动到原点。这一步非常重要,因为PCA的目标是基于方差来进行降维,中心化后的数据才能正确反映方差的大小。
-
X′=X−μX' = X - \muX′=X−μ
-
其中,XXX 是原始数据矩阵,μ\muμ 是每个特征的均值。
-
计算 协方差矩阵:
- 接下来,计算数据的协方差矩阵。协方差矩阵用来衡量各个特征之间的线性相关性。协方差矩阵的大小为 n×nn \times nn×n,其中 nnn 是特征的数量。
-
C=1m−1X′TX′C = \frac{1}{m-1} X'^T X'C=m−11X′TX′
-
其中,CCC 是协方差矩阵,mmm 是样本数量,X′X'X′ 是中心化后的数据。
-
特征值分解:
- 计算协方差矩阵的特征值 和特征向量。特征向量代表数据的主成分方向,而特征值则表示每个主成分的重要性(即解释数据方差的多少)。
-
Cvi=λiviC v_i = \lambda_i v_iCvi=λivi
-
其中,λi\lambda_iλi 是特征值,viv_ivi 是对应的特征向量。
-
选择主成分:
-
选择具有较大特征值的特征向量,作为主要的主成分。特征值越大,说明这个主成分能解释的数据方差越大,越重要。
-
通常,我们会选择能够解释95%以上方差的主成分数量。这可以通过累积特征值的比例来判断。
-
-
数据转换:
- 将原始数据投影到选定的主成分上,从而将数据从高维空间转换到低维空间。
-
Z=X′WZ = X' WZ=X′W
-
其中,ZZZ 是降维后的数据,WWW 是选定的主成分向量组成的矩阵。
PCA 的直观理解
可以把PCA看作是寻找一组新的坐标轴(主成分),这些坐标轴是根据数据的方差大小来确定的。第一主成分是数据方向上方差最大的那条轴,第二主成分是与第一主成分垂直且解释剩余方差最大的轴,依此类推。
-
第一主成分:解释了数据中方差最大的方向(最重要的特征)。
-
第二主成分:解释了数据中剩余方差的最大方向(在垂直于第一主成分的方向上)。
-
依此类推,直到选出几个主成分,保留足够的方差信息。
举例说明
假设你有一个数据集,有两个特征(x1和x2),PCA的目标是找到一个新的坐标系,在这个新的坐标系中,你可以用一个或两个新的特征来表示原始数据,而这新的特征能保留尽量多的原始信息。
-
数据分布:x1和x2有一定的相关性,PCA会找出一条新轴(第一主成分),让数据在这条轴上的投影能解释最多的方差。
-
降维:如果你只需要一个维度,你可以只选择第一主成分来表示数据,丢弃第二主成分。这样你就将数据从二维降到一维,但仍保留了尽量多的信息。
PCA 的优缺点
优点:
-
减少数据维度:PCA可以显著减少特征的数量,尤其是在特征数量远多于样本数量的情况下(高维数据)。
-
消除冗余信息:通过找到相关性高的特征并合并,可以减少特征之间的冗余。
-
提高模型效率:降低了数据的复杂度,有助于加快机器学习模型的训练和推理过程。
-
数据可视化:在高维数据中,PCA可以将数据降到2维或3维,从而方便进行可视化分析。
缺点:
-
线性方法 :PCA只能找到数据中的线性相关性,如果数据中有非线性关系,它无法很好地处理。
-
信息丢失:降维会丢失一些信息,特别是在只选择少数主成分的情况下,某些细节可能被忽略。
-
对数据标准化敏感 :PCA对特征的尺度非常敏感,因此在使用前,通常需要对数据进行标准化处理,使每个特征具有相同的均值和方差。
适用场景
-
高维数据的降维:当数据维度过高时,PCA可以有效减少特征数量,降低数据复杂度。
-
数据可视化:在分析数据时,尤其是探索性数据分析(EDA)中,PCA可以帮助将高维数据投影到2D或3D空间,便于观察数据的结构。
-
消除噪声:通过选择重要的主成分,PCA可以有效去除数据中的噪声成分。
2.2.2 t-SNE(t-分布随机邻域嵌入)
一种用于高维数据可视化的降维方法,将高维数据映射到低维空间中。
2.2.3 因子分析(Factor Analysis)
基于数据的协方差结构来发现隐藏的因子或特征。
2.2 关联规则学习
-
Apriori算法:用于发现数据中的关联规则,比如购物篮分析中找出频繁项集。
-
FP-growth(频繁模式树):通过构建模式树来加速频繁项集的挖掘过程。
2.3 聚类
K均值 聚类 (K-Means Clustering):将数据分成K个簇,数据点属于距离最近的簇中心。
层次聚类 (Hierarchical Clustering):通过层次的方式将数据进行聚类,构建一棵树状结构。
3.监督学习算法
监督学习是指使用带有标签的数据进行训练的算法。目标是通过学习输入特征(X)和输出标签(Y)之间的映射关系,预测新的输入数据的输出。监督学习可进一步分为分类和回归
2.1 线性回归

2-1 的直线可写为 y=w0+w1x。这是我们在中学阶段学过的一次函数,w1 是斜率(或者叫权重),w0 相当于在 y 轴上的截距。斜率 w1 和截距 w0 是由有监督学习的算法学到的参数,所以我们称之为学习参数。线性回归的学习参数是如何求得的呢?下面的"算法说明"部分将对此进行讲解。
另外,线性回归算法一般使用一个以上的特征变量创建模型,其中只有一个独立的特征变量的情况叫作一元回归
图 2-2a 和图 2-2b 是根据表 2-2 的数据绘制的两条不同的直线,分别是 y =0.706x +0.823,y = −0.125x +4.5。
这两条直线中的哪一条更好地表示了数据的关联性呢?我们可以通过均方误差进行定量判断。均方误差指的是目标变量和直线的差 yi −(w0+w1xi) 的平方的平均值。当存在 n 个数据时,可如下表示:
这两条直线的区别就是学习参数 w0、w1。也就是说,改变学习参数 w0、w1,那么计算出的均方误差也会发生变化。这种表示误差和学习参数之间关系的函数叫作误差函数(或损失函数)。线性回归需要在各条直线中找出使误差函数值最小的参数(更具体的计算方法请参考后文的"均方误差的最小化方法"部分)。这种计算出使误差函数值最小的参数的思路在其他有监督学习算法中也是通用的
2.1.1 误差分析
2.1.2 最大似然估计
通过已有数据来找出最可能参数的方法。它的目的是找到一组参数,使得根据这些参数计算出的数据出现的概率最大

2.1.1 各种线性回归

一元回归是指独立特征变量只有一个时的线性回归,独立特征变量为两个及以上时的线性回归叫作多元回归。另外,尽管独立特征变量只有一个,但包含 x2、x3 这种特征变量的次方项的线性回归叫作多项式回归。表 2-4 列出了一元回归、多元回归、多项式回归的例子,图 2-5 展示了与这些例子相应的图形。多项式回归对于特征变量 xi 不是线性的,所以称之为"线性"回归可能让人觉得不太合适。
注:是否为线性回归不是从特征变量来看的。从学习参数(在这个例子中是 x12 和 x1 的系数)的角度来看是线性的回归,我们才称为线性回归,所以多项式回归也属于线性回归。
2.3 梯度下降
是一种优化算法,以最小化损失函数
-
目标:我们希望找到一个参数(如权重)集合,使得损失函数的值最小化。损失函数衡量模型预测与实际值之间的差距。
-
梯度:损失函数对参数的导数称为梯度。梯度指向损失函数上升最快的方向。
-
更新规则:
-
从初始参数开始,计算当前参数的梯度。
-
按照梯度的反方向更新参数。
-
-
迭代:重复上述步骤,直到损失函数收敛(即变化非常小)或达到预设的迭代次数。
-
学习率:学习率的选择至关重要。太大可能导致错过最优解,太小则可能收敛速度慢。
梯度下降的变种包括随机梯度下降(SGD)、小批量梯度下降(Mini-batch Gradient Descent)等,适用于不同的场景和需求。
注:损失函数(Loss Function)是机器学习和深度学习中用来衡量模型预测与实际结果之间差异的数学函数。它的主要作用是提供一个量化的指标来评估模型的性能。通过最小化损失函数,可以调整模型的参数以提高预测的准确性,常见的损失函数:均方误差、绝对误差
2.3.1 梯度下降公式

2.3.2 学习率

学习率的设置是一门学问,一般我们会把它设置成一个比较小的正数,0.1,0.01,0.001都是常见的设定数值。
2.3.3 全局最优化

上图显示了梯度下降的两个主要挑战:
-
若随机初始化,算法从左侧起步,那么会收到一个局部最小值,而不是全局最小值
-
若随机初始化,算法从右侧起步,那么需要经过很长一段时间才能越过Plateau(函数停滞带,梯度很小),如果停下得太早,则永远达不到全局最小值。
注:线性回归得模型MSE损失函数恰好是个凸函数,凸函数保证了只有一个全局最小值,其次是个连续函数,斜率不会发生陡峭得变化,因此即便乱走,梯度下降都可以趋近全局最小值
上图损失函数都是非凸函数,梯度下降法是有可能落到局部最小值,所以其实步长不能设置太小太稳键,那样很容易落入局部最优解。
2.3.3 梯度下降步骤

2.3.4 三种梯度下降
梯度下降分类:批量梯度下降BGD(Batch Gradient Descent),小批量梯度下降MBGD(Mini-Batch Gradient Descent),随机梯度下降SGD(Stochastic Gradient Descent)

三种梯度下降不同,体现在第二步中:
-
BGD是指每次迭代使用所有样本来进行梯度的更新
-
MBGD是指在每次迭代使用一部分样本(所有样本500个,使用其中32个样本)来进行梯度的更新
-
SGD是指每次迭代随机选择一个样本来进行梯度更新
2.4梯度下降优化
2.4.1正则化
防止过拟合。通过向损失函数增加惩罚项的方式对模型施加制约,提高模型泛化能力。
注:欠拟合:是模型无法捕捉数据的基本趋势,通常是因为模型太简单
过拟合:过拟合是指模型在训练数据上表现很好,但在新数据上表现差,通常是因为模型太复杂
2.4.1.1 岭回归
岭回归通过增加一个L2正则化项来惩罚大系数,L2正则化(Ridge):通过对模型参数的平方和进行惩罚,公式为

复杂模型过拟合的一个原因是学习参数 wi 的值太大(或太小)。

为什么正则化可以抑制学习参数变大呢?这里以下面的岭回归的误差函数为例进行说明。简单起见,这里考虑对二次线性回归应用正则化的情况:



下面来详细看一下控制正则化强度的超参数 α。图 2-10 是使用不同的 α 值时模型的可视化图形。当 α 增大时,可以看出学习参数被抑制,图形变得简单。相反,当 α 变小时,对学习参数的绝对值变大的惩罚力度变缓,模型变复杂。另外,当 α =0 时,惩罚项始终为 0,因此等同于不使用正则化的线性回归。一般来说,应一边验证误差一边对 α 进行调整,最终得到合适的 α。
2.4.1.2 Lasso回归
Lasso 回归的惩罚项是学习参数的绝对值之和,公式为

2.4.1.3 岭回归和Lasso回归区别

绿线是线性回归的误差函数,蓝线是惩罚项的相关函数。岭回归的惩罚项是学习参数的平方和,所以其图形是图 2-11a 所示的圆形;Lasso 回归的惩罚项是绝对值的和,所以其图形是图 2-11b 所示的四边形。原来的函数(线性回归的误差函数)与这些函数的交点就是带有正则化项的误差函数的最佳解。可以看出,在加入惩罚项后,图 2-11a 的岭回归的学习参数得到了抑制。图 2-11b 的 Lasso 回归 的情况与岭回归相似,学习参数同样被抑制,但学习参数w2变为了 0。
Lasso 回归计算的是函数与这种四边形函数的交点,因此具有学习参数容易变为 0 的特点。利
用这个特点,我们可以使用学习参数不为 0 的特征来构建模型,从而达到利用 Lasso 回归选择特征
的效果。这样不仅能提高模型的泛化能力,还能使模型的解释变容易。
2.4.2 归一化
归一化的目的是,使得梯度下降在不同维度xx参数(不同数量级)上,可以步调一直协同的进行梯度下降。它指的是将数据按比例缩放,使其落入特定的范围,常见的是0,1或-1到1的范围内。归一化的目的是消除不同特征之间的量纲影响,确保各个特征对模型的影响权重相对均衡,同时能够加快模型收敛速度,提高模型的准确性和稳定性

2.5 支持向量机
线性支持向量机(Linear Support Vector Machine,LSVM)处理二元分类。线性支持向量机是以间隔最大化为基准,来学习得到尽可能地远离数据的决策边界的算法。虽然该算法的决策边界与逻辑回归一样是线性的,但有时线性支持向量机得到的结果更好
训练数据中最接近决策边界的数据与决策边界之间的距离就称为间隔。
决策边界必定为直线,所以它很难对如图 2-21 所示的"每个标签的边界为曲线的数据"进行分类。

2.5.1 软间隔和硬间隔
数据可以线性分离的情况,这种不允许数据进入间隔内侧的情况称为硬间隔。但一般来说,数据并不是完全可以线性分离的,所以要允许一部分数据进入间隔内侧,这种情况叫作软间隔
基于线性支持向量机的学习结果,我们可以将训练数据分为以下 3 种。
-
与决策边界之间的距离比间隔还要远的数据:间隔外侧的数据。
-
与决策边界之间的距离和间隔相同的数据:间隔上的数据。
-
与决策边界之间的距离比间隔近,或者误分类的数据:间隔内侧的数据。
其中,我们将间隔上的数据和间隔内侧的数据特殊对待,称为支持向量。支持向量是确定决策边界的重要数据。间隔外侧的数据则不会影响决策边界的形状。
由于间隔内侧的数据包含被误分类的数据,所以乍看起来通过调整间隔,使间隔内侧不存在数据的做法更好。
但对于线性可分的数据,如果强制训练数据不进入间隔内侧,可能会导致学习结果对数据过拟合。

2-20 的左图是不允许数据进入间隔内侧的硬间隔的情况,右图是允许数据进入间隔内侧的软间隔的情况。
另外,我们在蓝色点表示的训练数据中特意加上了偏离值。
比较两个结果可以发现,使用了硬间隔的图 2-20 中的左图上的决策边界受偏离值的影响很大;
而在引入软间隔的图 2-20 中的右图上的学习结果不容易受到偏离值的影响。
在使用软间隔时,允许间隔内侧进入多少数据由超参数决定。与其他算法一样,在决定超参数时,需要使用网格搜索(grid search)和随机搜索(random search)等方法反复验证后再做决定
注:网格搜索通过穷举所有可能的超参数组合,确保找到最佳配置,但计算开销大,尤其是参数空间大时。随机搜索则随机选择参数组合,相对效率高,能在更短时间内找到可接受的结果,适合参数空间广泛的情况
2.5.2 核方法
数据映射到高维空间,使得在原始空间中不可分的数据在高维空间中可分。在这个高维空间中,训练数据
对应的点是可以线性分离的,实际的训练数据是来自于该高维空间的投影。 一旦有了这样的空间,模型就可以在高维空间中使用支持向量机来学习决策边界。最后,将高维空间的决策边界投影到由原始特征形成的向量空间上,得到决策边界。虽然构建线性分离的高维空间非常困难,但通过一个叫作核函数的函数,核方法就可以使用在高维空间中学习到的决策边界,而无须构建具体的线性分离的高维空间。

学习结果因核函数而异
核方法中可以使用的核函数多种多样。使用不同的核函数,得到的决策边界的形状也不同

注:在使用支持向量机时,首先应该用线性核函数分析数据,以获得对数据分布的初步了解。线性核的结果比较直观,有助于识别特征的重要性和数据的基本结构。而非线性核函数虽然可以学习到复杂的决策边界,但会牺牲可解释性,因此在没有明确特征知识的情况下,直接使用非线性核可能会导致难以理解的结果。总之,先从简单的线性模型入手,可以更好地指导后续的模型选择和调整
2.6 随机森林
随机森林(random forest)是将多个模型综合起来创建更高性能模型的方法

2.6.1 决策树
决策树分类算法的基本原理。决策树通过不断分割训练数据来构建决策规则,每次分割时会选择最能减少不纯度的特征。
**不纯度:**是用来衡量数据集中标签的混杂程度。常见的不纯度指标包括基尼指数和熵。一个组的不纯度越小,意味着其中的样本标签越一致(即大部分样本属于同一类)。
表示不纯度的具体指标有很多种,本节利用基尼系数。基尼系数的计算式如下:

c 是标签的总数。
𝑝𝑖是第 𝑖类标签的样本比例,即某个标签的样本数量除以总样本数量。
如何使用基尼系数来衡量决策树分割后的不纯度,并且如何选择最佳的分割方法。
-
基尼系数:用来衡量一个数据集的标签分布的均匀程度。其值介于0和1之间,值越小表示数据越纯(标签越一致)。
-
计算基尼系数:公式中的 pi是每个标签在数据集中的比例,基尼系数越高,表示标签越杂乱。
-
加权平均基尼系数:在分割数据后,需要计算每个子集的基尼系数,并根据每个子集在总数据中所占的比例来加权。通过加权平均,得到一个整体的不纯度指标,帮助评估分割的效果。
-
选择分割方法:理想的分割方法是使得加权平均基尼系数最小,因为这意味着分割后的子集更加纯净,标签一致性更高。
e.g.
所示为使用几种不同的分割方法计算得出的加权平均基尼系数。左侧是分割前的状态,这时的基尼系数为 0.5。中间是分割后求出的基尼系数的平均值。使用分割出的每个部分的基尼系数乘以该部分所含数据的数量所占的比例,得到加权平均值。右侧是使基尼系数的平均值最小的分割方法的例子。

**分割过程:**在每一次分割中,决策树会选择一个特征,并根据该特征的某个条件将数据分为两个或多个子组。目标是使得每个子组中的标签更加一致,从而降低不纯度。
**标签一致性:**如果一个子组中的样本大多数具有相同的标签,那么这个子组的不纯度就会很小;如果子组中的样本标签分布很广,意味着包含了很多不同的标签,那么不纯度就会增大。
因此,决策树的学习过程就是通过不断选择特征和分割数据,来构建一个最终的模型,使得每个叶节点尽量纯净(包含相同类别的样本)。这有助于提高分类的准确性

2.6.2 Bootstrap 和随机选取特征值
让我们思考如何使用相同的数据训练多棵独立的决策树。这其实并不简单。机器学习从相同的数据上学习的结果基本上是一样的,即使有 100 棵决策树,如果它们的学习方法都一样,那么多数表决的结果也还是一样的。
随机森林尝试对每棵决策树的数据应用下述方法来进行训练,以使分类结果尽可能地不同。先采用 Bootstrap 方法,根据训练数据生成多个不同内容的训练数据。所谓 Bootstrap 方法,即通过对单个训练数据进行多次随机的抽样放回,"虚增"训练数据,这样就可以为每棵决策树输入不同的训练数据。然后在根据使用 Bootstrap 方法创建的训练数据训练决策树时,只随机选取部分特征值来训练决策树。通过"Bootstrap 方法"和"随机选取特征值"这两种方法,就可以训练出具有多样性的决策树


2.7 神经网络
输入层 ( Input Layer ):
输入层接收外部数据,通常每个神经元对应数据中的一个特征。输入层是神经网络的大门,负责接收外面的信息。比如你想教这个网络识别猫和狗的图片,输入层就是拿到这些图片,并把每个图片里的细节(像每个像素的颜色)输入给网络。每个"神经元"就像一个小探测器,负责感知这些细节。所以输入层每个神经元都"看"到一个特征,比如图片里的一个小点或者颜色。
隐藏层 ( Hidden Layer ):
接下来信息流进隐藏层。你可以把隐藏层想象成一群忙碌的"小工厂",它们负责处理和分析数据。每个小工厂有自己的规则,它们根据从输入层接收到的数据,做一些复杂的运算和处理,然后决定应该输出什么。为什么叫"隐藏"?因为它们不是直接跟外面的世界打交道,而是在背后默默处理数据。
在这些小工厂里,有一些"开关"(激活函数),决定信息该怎么流动。经过一层层的处理,网络越来越能看清数据里的复杂关系。神经网络有可能有很多这样的"工厂",越多的工厂意味着网络越"聪明",可以处理更复杂的问题。
最后,隐藏层里的神经元通过连接(称为权重)把信息传给下一层,它们会不断调整这些权重(就像调整工作策略一样),直到输出结果越来越准确。
用个简单的比喻,输入层像是你收到了一堆原材料(图片),隐藏层就像你带着这些原材料到工厂,工厂里的机器对这些原材料进行各种加工处理,直到你得到成品(识别出图片是猫还是狗)。
输出层 ( Output Layer ):
输出层产生网络的最终结果。在分类任务中,输出层神经元的数量通常等于分类类别的数量。输出层的输出经过特定的激活函数(如 Sigmoid 或 Softmax),转换为所需的输出形式,如概率或分类标签。
输出层(Output Layer)是网络的最后一层,用于生成最终的预测结果。输出层的神经元个数通常由任务的类别数决定。对于分类任务,输出层的设计和激活函数的选择取决于任务的具体需求:
神经元个数:
二分类任务:输出层的神经元个数为 1。常见的做法是使用 Sigmoid 激活函数,它将网络的输出映射到 [0, 1] 之间的概率值,表示样本属于某个类别的概率。
多分类任务:对于多分类任务,输出层的神经元个数与分类标签的数量相同。例如,如果有 3 个类别,输出层就有 3 个神经元。常用的激活函数是 Softmax,它会将输出转化为多个类别的概率分布。
Sigmoid 分类器:
在二分类任务中,Sigmoid 函数的输出是一个值在 [0, 1] 之间的概率。可以理解为预测属于某个类别的概率,如果该值接近 1,则表示高概率属于某个类别,接近 0 则表示属于另一个类别。因为只需判断两个类别,输出层神经元个数为 1。
2.7.1 整体架构

2.7.1 Softmax 分类器
Softmax 激活函数常用于多分类任务。它将每个神经元的输出转换为一个概率值,这些概率值的和为 1。对于二分类任务,若使用 Softmax,输出层会有 2 个神经元,对应两个类别的概率分布。
2.7.2 得分函数
2.7.3 损失函数
2.7.4 前向传播

2.7.5 反向传播

反向传播(Backpropagation)是一种在神经网络中用来训练模型的方法。用大白话来说,它就像是老师教一群学生(神经网络中的神经元)如何更好地完成一项任务(比如识别图片中的猫)的过程。
想象一下,你有很多学生,每个学生都有一个任务,就是通过看一些图片来识别出图片里是不是有猫。但是,一开始学生们都不太会做这个任务,他们需要学习。你作为老师,会给他们一些反馈,告诉他们做得好不好,以及怎么改进。
反向传播就是这个过程的自动化版本。具体来说,它包括以下几个步骤:
-
前向传播(Forward Pass):学生们(神经元)会根据他们当前的知识(权重和偏置)来尝试识别图片中的猫。他们会给出一个答案,比如"这张图片里有猫"。
-
计算损失(Loss Calculation):然后,你会告诉他们这个答案对不对。如果他们猜错了,你会告诉他们差距有多大,这就是损失(Loss)。损失越小,说明他们的答案越接近正确答案。
-
反向传播 (Backpropagation):接下来,你会告诉他们怎么改进。这个过程就是反向传播。你会从输出结果开始,逆着神经网络的结构,一层一层地回去,看看每个学生(神经元)的答案对最终结果的影响有多大。那些对错误答案影响大的学生,你会让他们多学一点,也就是调整他们的权重和偏置。
-
权重更新(Weight Update):根据你给的反馈,学生们会调整自己的知识(权重和偏置),以便下次能做得更好。
-
重复:这个过程会重复很多次,直到学生们能够准确地识别出图片中的猫,或者直到他们的进步变得非常小,这时候你就可以说他们已经学会了。
反向传播的关键点在于,它能够自动地计算出每个神经元的权重和偏置应该如何调整,以便整个网络能够更好地完成学习任务。这个过程是通过数学上的梯度下降算法来实现的,目的是最小化损失函数
2.7.6 正则化和激活函数
神经网络太强大了,所以要加正则化和drop-out 防止过拟合
- 激活函数(ReLU)
但是,线性运算的结果本身比较"单调",很难帮助模型学习到复杂的特征。激活函数(ReLU)就是来解决这个问题的。ReLU 的做法很简单粗暴:把所有小于 0 的数值变成 0,大于 0 的保持不变。通过这种"激活"操作,网络能引入非线性变换,帮助模型学到更复杂、更有层次的特征

2.7.7 drop-out

2.7.7 数据预处理
2.7.7.1 数据标准化
2.7.7.2 数据归一化
2.7.7.3 参数初始化
3.1 CNN
3.1.1 NN与CNN的区别

3.1.2 卷积核涉及的参数
3.1.2.1 步长

3.1.2.2 尺寸

弥补边界信息不充分,特征缺失的问题
3.1.2.3 卷积核个数
多少特征图就有多少卷积核
3.1.2.4 卷积参数共享
3.2 CNN
想象一下你在看图片。大多数人不会一眼看到所有细节,而是先看大的轮廓,再慢慢注意到小的细节,比如图片里是不是有个耳朵、鼻子、胡子。这种一步步发现图片里信息的过程,就是 CNN 的工作原理。
CNN 是一种专门用来"看"图片的神经网络,它能从一张图片里自动找到有用的细节,然后通过这些细节来做出判断,比如分辨出这是一只猫还是一只狗

3.1.1 卷积层
1.卷积层(Convolutional Layer): CNN 里面最关键的一步是卷积。卷积就像用一个小窗口在图片上"扫描",每次看一小块区域。想象你拿着一个放大镜,一块块地看图片,注意图片的细节。每个小窗口都会从局部区域提取有用的信息,比如边缘、角落等重要特征。每次移动这个小方框,你会通过某种"规则"来处理框里看到的内容,比如加权求和 也可以说线性激活,最后得出一个值。这些值会告诉你,这部分图像中有哪些重要的特征。
3.1.1.1卷积参数共享
- 为什么需要权值共享?
现在想象,如果每个节点都用不同的卷积核,也就是说,每个小方框有自己的规则,那么要处理的规则数量会变得非常大。假设我们有上百个节点,每个节点都有自己专属的"规则",那我们需要记住很多个规则(也就是权重),这会让训练变得很复杂,而且会导致模型容易"记住"而不是"学会"特征------这就是过拟合。
- 怎么解决?------权值共享!
权值共享的意思是:在同一个卷积层中,我们不让每个节点都有自己的"规则",而是所有的节点都用同一个卷积核,也就是说,用相同的"规则"去扫描图片的不同部分。
举个简单的例子:假设我们用一个方框扫描猫的图片,这个方框负责识别猫耳朵。不管我们把这个框移动到猫的左边还是右边,用的都是同一个"猫耳朵识别器"(同一个卷积核)。这样,网络只需要学习一个规则(卷积核),就可以识别出图片各个部分的猫耳朵特征。这个过程不仅能有效提取出特征,还能大大减少需要学习的参数,防止网络记住无关的细节,从而解决过拟合问题。
- 批量标准化(Batch Normalization, BN)
接下来,如果我们直接拿这些卷积结果去做下一步运算,可能会出现问题------训练时的数据和测试时的数据分布可能不同(比如某些数据偏大或偏小)。这时候,我们用批量标准化来解决问题。
**批量标准化(BN)**就像是在卷积结果上做"校准"。它会把这些结果的数值调整到一个合适的范围,让训练和测试时的数据保持一致,确保模型表现稳定。
- BN(Batch Normalization)
就像是在每次训练时,把一组数据先"洗一洗",让它们变得更加均匀整齐。这样,某些特别大的或特别小的"极端"数据对模型的影响就会变小,模型更容易学得好、学得快。
不过,因为数据本来就不一定是均匀的,只是简单地"减去平均值、再除以方差"这种处理方法可能不够好。所以,BN层引入了两个"调节器",可以对处理后的数据进行再调整,让模型更适应这些数据,从而更好地学习和优化
3.1.2池化层
池化层(Pooling Layer): 当你看完一个小区域后,可能不会需要每一个小细节。你会想:"我只关心这块区域最明显的东西。"池化就是类似的操作。它会取每一块里最重要的东西,忽略不太重要的部分,压缩图片信息,减少处理的难度。好比你看地图时,先忽略小路,关注大马路。池化层主要负责降低数据的尺寸,同时保留图片里的关键信息
常用的池化方法
- 最大池化(Max Pooling): 想象你用一个小窗口(池化核)去看图片的一小部分(比如一个 2x2 的小区域)。最大池化的意思是:在这个小区域里,你只关心最大的那个值,忽略其他的。就像你只留意最明显的部分(比如最亮的地方),而把剩下的细节丢掉。举个例子,如果你用 2x2 的窗口扫描一个区域,可能得到 4 个数字:[1, 5, 3, 8],最大池化会只取其中最大的 8,丢掉其他数字。这样做可以帮助模型专注于图片中最突出的特征。

- 平均池化(Mean Pooling):(不常用) 平均池化的做法是:在同样的小区域里,不是只取最大值,而是计算这些数值的平均值。比如在 2x2 的窗口里看到 [1, 5, 3, 8],平均池化会计算这些数的平均值 (1+5+3+8)/4 = 4.25,结果是这个小区域的代表值。
池化的好处
-
降维:池化的作用是减少数据的尺寸。比如一张大图片,通过池化后变得更小,但仍然保留了最重要的信息。这样可以加快神经网络的计算速度,同时减少模型的复杂度。
-
鲁棒性:池化层能让网络对图片的微小变化(比如光线变化、图片稍微移动等)更加"不敏感"。因为池化层关心的是一个区域的整体特征,而不是某个具体的像素,所以即使图片中某些像素稍微变化,池化后的结果也不会有太大影响。这让模型对图像的小噪声或变化更加"稳定"。
-
无参数:池化层不需要额外的学习参数。它不像卷积层需要学习滤波器,只是做简单的数学运算(取最大值或平均值),所以不会增加模型的复杂性。
**3.全连接层(Fully Connected Layer):**当 CNN 把图片的所有局部特征都提取出来后,最后一步是全连接层。它就像把所有"线索"汇总起来,做出最终的决定。比如通过耳朵、鼻子、眼睛的形状来判断这张图片是猫还是狗。
3.2 ResNet 网络
ResNet 网络的设计就像是修了一条超级长的楼梯,但它聪明地在楼梯上安了"电梯"------当某些楼梯段不太有用时,它会让你直接坐电梯跳过去,不用一步步爬。
具体来说,普通的深度网络层数多了,容易遇到两个问题:学不动了(梯度消失) ,或者学得越多越差(网络退化) 。ResNet 通过加入残差项来解决这些问题。
用大白话来说,残差项就像是给网络加了"备用通道"。当网络越来越深时,模型可能无法学到新知识或出现"学习疲劳"。这个时候,残差项就像是一个"捷径",如果某些层没学到什么新东西,信息可以直接跳过这些层,传给后面的层。这就保证了即使网络很深,模型依然能正常学习,不会被"拖垮"。
简单点讲,ResNet 帮助模型更聪明地处理复杂的任务,不会因为太复杂就卡住。
3.3 DenseNet
每层都能看到前面所有层的输出:在 DenseNet 中,每一层都直接连接到之前的所有层。这就像每个楼层都有一个透明的窗户,可以看到下面所有楼层的情况,这样每一层都能利用之前层学到的信息。
避免梯度消失问题:因为每一层都能看到之前的输出,所以信息在网络中传递得更顺畅,有助于解决深度网络中的梯度消失问题。换句话说,模型更容易学习到有用的特征。
参数利用率高:DenseNet 减少了冗余的参数,因为每层使用的特征都是所有前面层的输出,而不是每层都学相同的东西。这就像一个团队中的每个人都能共享所有的经验,而不是重复做同样的工作,能更有效地利用资源。
增强特征重用:每层的输出都可以被后续层直接使用,增加了特征的重用。这就像你在做一道复杂的菜时,可以随时用到前面切好的材料,避免了重复的工作,让整个过程更高效。
Dense Block 的特点:Dense Block 是 DenseNet 中的一个基本模块,其中每一层都能直接连接到之前所有层的输出。随着层数的增加,输入的特征数量会变得很大,这会导致模型的参数量激增,变得很复杂,训练起来也更困难。
引入瓶颈层 :为了控制参数的增加,DenseNet-B 在每个 Dense Block 的 3×3 卷积之前加入了一个 1×1 卷积 (称为瓶颈层)。这个操作的目的就是减少输入的特征数量,简单说,就是把特征"压缩"一下,这样可以降低模型的复杂度,同时还能结合不同通道的特征。
过渡层的作用 :在 DenseNet-C 网络中,除了瓶颈层,Dense Block 之间还引入了一个 过渡层(Transition Layer),包含一个1×1卷积层和一个池化层。这个层的作用是进一步处理特征,具体来说:
-
特征压缩:过渡层的瓶颈层将每个 Dense Block 的输出特征数量压缩到原来的四分之一(假设每层输出特征数量为 k,就变成了 4k)。
-
特征下采样:由于 Dense Block 内的每层需要保证特征图的尺寸一致,为了能够融合这些特征,同时还要控制特征的数量,所以需要用池化层对特征图进行下采样,降低它们的尺寸。
3.4 Googlenet网络
Inception 模块:GoogleNet 引入了名为 Inception 的模块,这是一种特殊的结构。每个 Inception 模块都包含多个不同尺寸的卷积核(比如 1x1、3x3 和 5x5),它们同时处理输入信息。这样,网络可以在不同的尺度上捕捉特征,而不是仅仅使用一种卷积尺寸。
更少的参数:与一些之前的网络相比,GoogleNet 通过使用 1x1 卷积来减少参数量。这种卷积可以用于降低输入特征图的维度,从而减少计算量,保持模型的高效性。
全局平均池化:在输出层,GoogleNet 使用了全局平均池化,而不是传统的全连接层。这种方法通过对每个特征图进行平均处理,进一步降低了参数量并减少了过拟合的风险。
性能优异:GoogleNet 在 2014 年的 ImageNet 大规模视觉识别挑战赛中获得了第一名,证明了它在图像识别任务中的卓越性能。
3.5 Alexnet
缺点:
-
计算资源需求大:
- 尽管AlexNet利用了GPU加速,但相比当时的其他传统模型,它对计算资源的需求仍然非常大,训练时间长,且需要大量的内存。这对资源有限的研究者或工程项目是一大挑战。
-
模型参数多:
- AlexNet的网络结构中有大量的参数需要学习,特别是在全连接层中。这样虽然提高了模型的表现力,但也带来了容易过拟合的问题,并增加了模型的存储和计算成本。
-
无法处理特别大或特别小的输入图像:
- AlexNet对输入图像的尺寸是固定的(224×224)。如果图像过大或过小,都需要进行缩放,这可能导致图片信息丢失或畸变,进而影响模型的识别效果。
-
不适合处理特别长序列数据:
- AlexNet专注于图像识别,尽管它在处理二维图像上的表现优异,但在处理像视频、语音、文本等其他类型的数据(比如时序数据)时,它并不适用。
-
模型较重:
- 相比后来的轻量化模型(例如MobileNet或SqueezeNet),AlexNet的架构相对复杂且庞大,不太适合部署在资源有限的设备上,如手机或嵌入式设备。
3.6 vgg
VGG的基本思路是:使用非常小的卷积核(3×3),但堆叠更多的卷积层 。常见的VGG模型包括 VGG16 和 VGG19,分别表示使用了16层和19层(包括卷积层和全连接层)。
具体结构:
-
卷积层(Convolutional Layers):
-
VGG模型的卷积层使用的是3×3的卷积核,并且每次卷积都保持图像的宽度和高度不变。卷积操作后紧接着是ReLU激活函数,来增加非线性。
-
这种较小的卷积核比AlexNet中的较大卷积核(11×11或5×5)要细致得多,能够捕捉更微小的特征,但通过多层堆叠实现了同样的感受野(即一次性"看到"图片更大区域的能力)。
-
-
池化层(Pooling Layers):
- 在卷积层之后,通常会加入池化层(一般是2×2的最大池化)。池化层的作用是减小图像的尺寸,减少计算量和参数,同时保留重要的特征。
-
全连接层(Fully Connected Layers):
-
在经过几层卷积和池化后,最终的特征图会被"展开"为一个一维的向量,进入全连接层进行分类。这部分是直接用来判断图像内容的关键步骤。
-
VGG模型通常有三层全连接层,最后一层输出预测结果,比如判断图片是狗、猫还是其他物体。
-
-
输出层:
- 最后是Softmax层,用来将全连接层的输出转换为不同类别的概率分布,最终得出预测的类别。
VGG16的具体层数:
-
卷积层:13层
-
全连接层:3层
-
总层数:16层
VGG模型的优点
-
结构简单且深度深:
- VGG模型虽然深,但每一层的设计非常统一,所有卷积核都是3×3,这使得网络的设计简单,容易理解和实现。
-
更好的特征提取:
- 通过堆叠多个小卷积核,VGG网络能够逐步从图像中提取更丰富、更复杂的特征。比起使用较大的卷积核,3×3的卷积核能够更精细地捕捉图像中的细节。
-
可迁移性强:
- 由于VGG结构的标准化,它的预训练模型能够很好地迁移到其他任务中,成为许多计算机视觉任务的基础。即使是当前的模型,许多仍然会以VGG作为基础网络。
-
强大的分类能力:
- VGG16和VGG19在ImageNet等数据集上表现非常出色,特别是VGG16,它广泛用于各种图像识别任务。
VGG模型的缺点
-
计算量大,参数多:
- VGG模型的参数数量非常庞大,尤其是在全连接层中,VGG16的参数量达到138M(约1.38亿)。如此多的参数导致训练时间较长,计算资源需求高。
-
容易过拟合:
- 由于参数量庞大,VGG模型更容易出现过拟合问题,尤其在数据量不足时。这需要使用Dropout等正则化技术来缓解。
-
模型比较大:
- VGG模型的存储需求比较高,占用的内存较大。比如VGG16的模型文件大约在500MB左右,这在资源受限的设备上不太适用。
-
效率相对较低:
- 虽然VGG能提供很好的分类准确率,但其计算效率相对较低。由于卷积层较多,模型在推理时耗费较多计算资源,因此不太适合实时性要求高的应用场景。
4.图像处理技术
4.1图像缩放与归一化(Scaling and Normalization)
-
图像缩放:将图像调整到指定尺寸(如224x224),常用于确保输入到卷积神经网络的图像大小一致。
-
归一化:将像素值归一化到[0, 1]范围,通常在训练深度学习模型时进行
4.2 灰度化(Grayscale Conversion)
- 将彩色图像转换为灰度图像,减少模型计算的复杂性。这对于不需要颜色信息的任务(如边缘检测)非常有效。
4.3图像增强(Image Augmentation)
图像增强是一种生成更多训练样本的技术,可以有效防止过拟合。常用方法有:
-
旋转(Rotation)
-
平移(Translation)
-
缩放(Scaling)
-
剪切(Shearing)
-
翻转(Flip)
-
高斯噪声(Gaussian Noise):通过在图像上加噪声来增加鲁棒性。
-
亮度、对比度调整(Brightness, Contrast Adjustment)
4.4 图像裁剪(Cropping)
- 从图像中裁剪出一部分,这种方法常用于数据增强和背景噪声较多的图像处理中。
4.5 图像平滑与锐化(Smoothing and Sharpening)
-
平滑(Smoothing):通常用低通滤波器(如高斯滤波器)去除图像中的噪声-去除图像中的细节部分,使得图像更加平滑。
-
锐化(Sharpening):使用高通滤波器来增强图像中的细节和边缘,使得图像更加清晰。
注:
- 低通滤波器是一种电子滤波装置,它的主要功能是允许低于特定截止频率的信号通过,同时抑制或阻断高于该截止频率的信号。这种滤波器在多个领域和应用中都非常有用,包括音频处理、图像处理、通信系统等。
低通滤波器的工作原理
低通滤波器的工作原理基于电容和电感的频率特性。电容对高频信号的阻抗较低,而对低频信号的阻抗较高;电感则相反,对低频信号的阻抗较低,对高频信号的阻抗较高。因此,低通滤波器可以利用这些元件的特性来允许低频信号通过,同时阻止高频信号。
- 高通滤波器(High-pass filter,简称HPF)是一种允许高频信号通过,同时抑制或阻断低频信号的电子滤波装置。它与低通滤波器相反,后者允许低频信号通过而阻止高频信号。高通滤波器在音频、视频、图像处理、通信系统等多个领域都有广泛的应用。
高通滤波器的工作原理
高通滤波器通常由电感和电容组成。电感对低频信号的阻抗较高,而对高频信号的阻抗较低;电容则相反,对低频信号的阻抗较低,对高频信号的阻抗较高。因此,高通滤波器利用这些元件的特性来允许高频信号通过,同时阻止低频信号。
4.6 边缘检测(Edge Detection)
- 边缘检测是图像处理中的重要技术,用来识别图像中的边缘。常用的方法有Canny、Sobel和Laplacian算子。
4.6.1 Canny 边缘检测
-
Canny 是一个聪明的"侦探",专门负责找图片里的"边缘"(比如物体轮廓)。它的做法很细致,先把图片模糊一点(去掉噪点),然后找到变化最大的地方(亮暗变化很快的地方),这些地方通常就是物体的边缘。最后,它还会筛选出那些真正重要的边缘,忽略一些小的或不重要的细节。
-
应用场景:Canny 在很多场景下用来检测物体轮廓,比如物体识别、图像分割等。
4.6.2 Sobel 算子
-
Sobel 就像是个"变化感应器",它通过计算图片里像素值的变化情况,来找出哪些地方变化很大,比如从黑变成白。这些大的变化通常意味着图片里有"边缘"或者"轮廓"。它会分别水平和垂直检查,所以能够检测出图片中的横线、竖线或者斜线。
-
应用场景:Sobel 常用于检测图片中的粗略边缘或边界,简单、快速,适合初步的边缘检测。
4.6.3 Laplacian 算子
-
Laplacian 是一个"二次变化感应器"。它不只是看简单的亮度变化,还会找那些变化得非常快的地方。换句话说,它更"敏感",能找出那些从暗到亮的突然跳跃,这通常也是图片的边缘或者细节部分。和 Sobel 不同的是,Laplacian 是同时看水平、垂直和斜方向的变化。
-
应用场景:Laplacian 用于检测更细致的边缘,能捕捉到比 Sobel 算子更多的细节,但也可能引入更多的噪声。
总结:
-
Canny 是最全面的,它不但找边缘,还能去噪和筛选出重要的边缘。
-
Sobel 是简单、快速的边缘检测工具,适合初步检测。
-
Laplacian 对细微的边缘和变化非常敏感,能找到更多细节,但可能会带来更多的噪声。
4.7 图像分割(Image Segmentation)
- 将图像划分为多个区域或对象,使得每个像素都属于某个特定的类别。常用的分割技术包括阈值分割 、基于区域的分割 、语义分割 和实例分割。
4.7.1. 阈值分割
阈值分割就是把图片中的每个像素跟某个数值(阈值)比大小。如果一个像素的亮度高于这个阈值,就把它归为一类(比如"前景");如果低于阈值,就归为另一类(比如"背景")。简单来说,就像你看一张黑白图片,决定什么是亮的,什么是暗的。
应用场景:适合处理简单的对比度较高的图片,比如区分白色裂纹和黑色背景。
4.7.2.基于区域的分割
-
这就像在图片里划分地盘。你先选一个像素点,然后从它开始扩展,看周围相邻的像素是不是和它相似(比如颜色或亮度差不多)。如果相似,就把这些像素归为一个"区域"。最终把整张图片划分成多个类似的小区域。
-
应用场景:用来找出相似的像素块,适合图像比较复杂、有多个相似部分的情况。
4.7.3 语义分割
-
语义分割是让计算机明白"这个像素属于什么东西"。它会给图像中的每个像素贴上标签,比如"这部分是公路,那部分是车,另一部分是树"。但它不区分"这是哪辆车",只在意这类像素属于"车"这个概念。
-
应用场景:用于自动驾驶、医学图像处理等场景,能标记出不同种类的物体。
4.7.4 实例分割
-
实例分割比语义分割更精细一些。它不仅告诉你"这是车",还会告诉你"这是第一辆车,那是第二辆车"。也就是说,不仅区分物体的类别,还区分每个物体的"实例"。
-
应用场景:用于需要区分每个物体的场景,如自动驾驶中分辨每辆车或每个人。
总的来说,阈值分割 和基于区域的分割 属于传统的图像处理方法,而语义分割 和实例分割是现代深度学习的应用,能够处理更复杂的任务。
4.7.5颜色空间转换(Color Space Transformation)
- 图像可以从一种颜色空间转换到另一种,比如从RGB转换到HSV、YCbCr、LAB等,这可以帮助模型更好地提取特定的颜色特征。
4.7.6 图像去噪(Image Denoising)
- 从图像中去除噪声,可以使用中值滤波(Median Filtering) 、均值滤波(Mean Filtering) 、双边滤波
(Bilateral Filtering)等。
注:
4.7.6.1 中值滤波(Median Filtering)
原理: 中值滤波是一种非线性的数字滤波技术,它将图像中每个像素的值替换为其邻域像素值的中值。这种方法对于去除椒盐噪声(salt-and-pepper noise)非常有效,因为它不会像线性滤波器那样模糊图像的边缘。
椒盐噪声:椒盐噪声(Salt-and-Pepper Noise)是一种常见的图像噪声,它表现为图像中随机出现的黑色(椒)和白色(盐)像素点。这种噪声通常是由于图像传感器、传输信道、解码处理等引起的,特别是在图像的采集、传输过程中,由于电磁干扰或数据丢失,导致某些像素值被错误地设置为最大值(白色)或最小值(黑色)
优点:
-
能有效去除椒盐噪声。
-
保持边缘信息,不会导致图像模糊。
缺点:
-
对于高斯噪声的去除效果不如线性滤波器。
-
计算量较大,因为需要对每个像素的邻域进行排序。
4.7.6.2 均值滤波(Mean Filtering)
原理: 均值滤波是一种线性滤波技术,它将图像中每个像素的值替换为其邻域像素值的平均值。这种方法简单且易于实现,但会导致图像模糊,尤其是在噪声较多的情况下。
优点:
-
实现简单,计算量小。
-
对于高斯噪声有较好的去除效果。
缺点:
-
会模糊图像的边缘。
-
对于椒盐噪声的去除效果不如中值滤波。
注:高斯噪声(Gaussian Noise)
高斯噪声,也称为正态分布噪声,是一种统计噪声,其概率密度函数服从高斯分布(正态分布)。这种噪声通常由热噪声、散粒噪声、电子设备的内部噪声等引起。
产生原因:
热噪声:由电子设备的热运动引起。
散粒噪声:由光的粒子性引起,如图像传感器中的光子噪声。
电子设备的内部噪声。
特点:
概率密度函数服从高斯分布,即正态分布。
噪声值在均值周围呈对称分布,标准差(σ)控制噪声的强度。
影响:
导致图像出现随机的亮度和颜色变化。
影响图像的清晰度和质量。
|----------|--------------------------------|----------------------------------|
| 特性 | 椒盐噪声(Salt-and-Pepper Noise) | 高斯噪声(Gaussian Noise) |
| 定义 | 随机出现的黑白点噪声 | 概率密度服从高斯分布的噪声 |
| 产生原因 | 图像传感器故障、传输信道干扰等 | 热噪声、散粒噪声、电子设备内部噪声 |
| 特点 | - 随机性<br>- 极端值(0或255) | - 概率密度函数服从高斯分布<br>- 对称分布 |
| 影响 | - 影响图像视觉质量<br>- 对图像处理算法有负面影响 | - 导致图像出现随机亮度和颜色变化<br>- 影响图像清晰度 |
| 处理方法 | - 中值滤波<br>- 其他方法:均值滤波、双边滤波 | - 均值滤波<br>- 双边滤波<br>- 高斯滤波 |
10. 直方图均衡化(Histogram Equalization)
- 用于增强图像对比度,特别是当图像对比度较低时,通过调整直方图的分布,使得图像中的细节更加明显。
11. 傅里叶变换(Fourier Transform)
- 将图像从空间域转换到频率域,常用于频率分析、图像滤波和压缩。
想象一下,你有一张图片,这张图片是由很多不同颜色和亮度的小点组成的,这些小点我们称之为像素。现在,如果你想了解这张图片里都有哪些颜色和亮度的模式,你可以用一种叫做傅里叶变换的魔法工具。
这个工具可以把图片从我们熟悉的空间域(就是图片上每个像素的位置)转换成一个我们不那么熟悉的频率域。在频率域里,图片不再是由像素组成,而是由一系列的波动或者模式组成,这些波动我们称之为频率。
你可以把这个过程想象成用一个特殊的筛子去筛沙子。在这个筛子上,有很多不同大小的洞,这些洞就代表了不同的频率。当你把沙子(图片)倒在这个筛子上,小洞会留下小颗粒(高频,细节),大洞会留下大颗粒(低频,整体趋势)。通过观察留在筛子上的沙子,你就可以知道原来的沙子里都有哪些大小的颗粒。
在傅里叶变换中,高频的部分代表了图片中快速变化的细节,比如边缘和纹理;而低频的部分则代表了图片中缓慢变化的部分,比如整体的亮度和颜色。
所以,傅里叶变换就是把图片从我们直观看到的样子,转换成了一种描述图片中不同波动模式的语言。这样做的好处是,我们可以更容易地分析和处理这些模式,比如去除不需要的波动(滤波),或者把图片压缩得更小,但又不失去重要的信息。
12. 超分辨率(Super-resolution)
- 利用深度学习技术生成比原始图像分辨率更高的图像,这对医学图像、卫星图像等有重要应用
4.模型的选择和评估
4.1 模型的选择
4.1.1 模型拟合情况
4.1.2 避免欠拟合和过拟合的方式
(1)增加数据量:
- 更多的训练数据可以帮助模型更好地泛化,因为模型会有更多的样本来学习更广泛的模式,而不是依赖于特定的训练样本。
(2)正则化(Regularization):
-
正则化是在损失函数中添加一个惩罚项,防止模型的参数过大,从而避免模型过于复杂。
-
L1 正则化(Lasso):在损失函数中加入参数权重的绝对值和,促使部分不重要的特征权重趋近于0,实现特征选择。
-
L2 正则化(Ridge):在损失函数中加入参数权重的平方和,限制权重的增长,使得模型不太复杂。
-
(3)合理切分数据
4.2 模型训练技巧
4.2.1 K折交叉验证
K折交叉验证(K-Fold Cross-Validation)**是一种常用的模型评估和验证技术,它可以帮助有效评估模型的性能,避免过拟合或欠拟合。其核心思想是将数据集划分为K个部分,轮流将其中一部分作为验证集,其余部分作为训练集,从而更全面地测试模型的表现。
K折交叉验证的步骤:
-
划分数据集:
- 将整个数据集随机打乱后,平均划分为K个子集(folds)。这些子集通常是大小相同的。
-
模型训练与评估:
-
进行K次训练和评估。在每次训练中,选择其中1个子集作为验证集,剩下的 K−1K-1K−1 个子集作为训练集。
-
重复这一过程K次,每次选择不同的子集作为验证集。
-
-
计算平均性能:
- 在K次训练与评估之后,将所有验证集上的性能指标(如准确率、均方误差等)进行平均,得到最终的模型评估结果。
举例说明:
假设我们进行5折交叉验证(K=5),过程如下:
-
将数据集划分为5个子集:D1,D2,D3,D4,D5D_1, D_2, D_3, D_4, D_5D1,D2,D3,D4,D5。
-
进行5次训练和评估:
-
第1次:使用 D2,D3,D4,D5D_2, D_3, D_4, D_5D2,D3,D4,D5 作为训练集,D1D_1D1 作为验证集。
-
第2次:使用 D1,D3,D4,D5D_1, D_3, D_4, D_5D1,D3,D4,D5 作为训练集,D2D_2D2 作为验证集。
-
第3次:使用 D1,D2,D4,D5D_1, D_2, D_4, D_5D1,D2,D4,D5 作为训练集,D3D_3D3 作为验证集。
-
第4次:使用 D1,D2,D3,D5D_1, D_2, D_3, D_5D1,D2,D3,D5 作为训练集,D4D_4D4 作为验证集。
-
第5次:使用 D1,D2,D3,D4D_1, D_2, D_3, D_4D1,D2,D3,D4 作为训练集,D5D_5D5 作为验证集。
-
-
最终,计算这5次评估结果的平均值,作为模型的最终性能。
优点:
-
减少偏差:K折交叉验证可以充分利用数据集的每个样本,使模型在训练和评估时都尽可能使用全部数据,避免了数据划分导致的偶然性。
-
减少过拟合风险:由于模型在每次迭代中都会用不同的数据进行训练和验证,交叉验证有助于评估模型的泛化能力。
-
更全面的评估:K次评估结果平均后,能更加稳定地反映模型在不同数据集上的表现。
缺点:
-
计算成本较高:K折交叉验证需要进行K次模型训练,训练时间较长,特别是在处理大规模数据或复杂模型时计算成本较高。
-
模型复杂度管理:每次训练都需要建立新的模型,如果模型复杂度较高,可能导致资源消耗增加。
常见的变体:
-
留一法交叉验证(LOO, Leave-One-Out Cross-Validation):
- 这是K折交叉验证的极端形式,其中 K=NK = NK=N(数据集的样本数量)。每次选择一个样本作为验证集,剩下的 N−1N-1N−1 个样本作为训练集。留一法可以保证每个样本都被用于验证,但计算开销较大。
-
留P法交叉验证(Leave-P-Out Cross-Validation):
- 类似于留一法,但每次留出P个样本作为验证集,剩余的样本作为训练集。
-
嵌套交叉验证(Nested Cross-Validation):
- 在模型调优时,嵌套交叉验证使用内层交叉验证来选择最佳超参数,外层交叉验证来评估最终模型性能。适用于模型选择和超参数调优过程中,避免数据泄漏。
K折交叉验证的应用场景:
-
小数据集:当数据量较小时,K折交叉验证可以有效避免过拟合,并充分利用所有数据进行训练和验证。
-
模型选择:在进行模型选择和比较时,K折交叉验证提供了稳定的评估指标,帮助选择性能最好的模型。
-
超参数调优:在调整模型的超参数时,K折交叉验证可以帮助评估不同参数设置的性能,选择最优的超参数。
如何选择K值:
-
K=5或K=10 是常用的选择,通常可以在计算开销和评估稳定性之间取得平衡。根据实验和研究,5折和10折交叉验证往往能提供较为可靠的结果。
-
K=LOO(留一法):适用于小规模数据集,但计算开销非常大。
-
K值越大,每次验证集越小,模型的训练效果会越好,但验证效果可能不稳定。
4.2.2 参数网格
通过系统地遍历指定的超参数组合,网格搜索帮助找到模型的最佳超参数配置,以提高模型的性能
网格搜索的步骤
-
定义超参数网格:
-
为每个需要优化的超参数定义一个取值范围,形成一个超参数网格。例如,假设我们要优化一个随机森林模型的超参数:
-
n_estimators
(树的数量):[50, 100, 150] -
max_depth
(树的最大深度):[None, 10, 20] -
min_samples_split
(内部节点再划分所需的最小样本数):[2, 5, 10]
-
-
这将形成一个包含不同超参数组合的网格。
-
-
训练模型:
-
对于网格中的每个超参数组合,训练模型,并使用交叉验证评估模型的性能。
-
每个组合都会生成一个评估结果(如准确率、均方误差等)。
-
-
选择最佳组合:
优点
缺点
变体
-
根据评估结果选择性能最佳的超参数组合,通常根据验证集上的表现(如最高准确率或最低误差)来进行选择。
-
全面性:
- 网格搜索遍历所有可能的超参数组合,确保找到最优解。
-
简单易用:
- 由于是穷举搜索,算法简单且易于实现,尤其适合小规模参数空间。
-
可解释性:
- 由于每个组合都进行了评估,能够很清楚地知道每个参数对模型性能的影响。
-
计算成本高:
- 当超参数的取值范围和数量增加时,网格搜索的计算开销会迅速增加,尤其是在训练时间较长的模型时。
-
不适用于大规模超参数空间:
- 对于参数较多且每个参数取值范围大的情况,网格搜索可能无法在合理的时间内完成训练。
-
对超参数范围敏感:
- 如果未能合理选择超参数的范围,可能导致错过最佳参数配置。
-
随机搜索(Random Search):
- 随机搜索随机选择超参数组合进行评估,相比网格搜索更高效,尤其是在超参数空间较大时。随机搜索往往可以在相对较少的试验次数中找到比较好的超参数组合。
-
4.3 模型评价指标
4.3.1 分类


4.3.2 回归

4.3.3聚类
轮廓系数(Silhouette Coefficient):
- 轮廓系数衡量了每个点与其簇内其他点的相似性和与最近簇的相似性,取值范围为[-1, 1]。值越接近1表示聚类效果越好。
Davies-Bouldin指数:
- Davies-Bouldin指数是各个簇之间的相似度与簇内的相似度的比率,值越小表示聚类效果越好。
Calinski-Harabasz指数(方差比准则):
- 该指数是簇间方差与簇内方差的比值,值越大表示聚类效果越好。
同质性(Homogeneity):
- 衡量聚类结果中每个簇是否仅包含同一类别的样本。值为1表示完美同质性。
完整性(Completeness):
- 衡量同一类别的样本是否被聚成同一簇。值为1表示完美完整性。
互信息(Mutual Information):
- 衡量聚类结果与真实标签之间的相关性,值越大表示聚类结果越好。
目标检测
1.先验框
在深度学习中,尤其是在目标检测领域,"先验框"(Anchor Box)是指在进行目标检测时,模型预先设定的一些候选框(bounding boxes)。这些框的大小和长宽比是根据数据集中的目标物体的典型尺度和形状来设定的。先验框帮助模型更好地定位目标,因为它提供了一些初步的"猜测",让模型能够快速调整并找到正确的目标位置。
先验框的工作原理:
-
设定尺寸和比例:通过对数据集中的目标进行分析,确定一些常见的目标尺寸和比例(如长方形、正方形等)。
-
生成候选框:在图片的每个位置上,通常会生成多个不同尺寸和比例的先验框。
-
与实际目标匹配:通过计算每个先验框与图像中实际目标之间的重叠程度(通常使用IoU,即交并比),找到最匹配的先验框。
-
预测目标类别和位置:模型根据匹配度较高的先验框,进一步调整框的位置、尺寸,并预测框内的目标类别。

1.YOLO系列
2.2D-3D配准算法
2.1 Structure from Motion
是一种从多张二维图像中恢复三维结构和相机运动的技术。它的基本思想是通过分析多张不同视角的二维图像,提取并匹配特征点,进而利用这些匹配点重建出场景的三维结构和拍摄相机的运动轨迹
好的,我来详细解释一下Structure from Motion(SfM)技术。
1. SfM的基本概念
Structure from Motion(SfM)是一种从多张二维图像中恢复三维结构和相机运动的技术。它的核心思想是通过分析多张不同视角的二维图像,提取并匹配特征点,进而利用这些匹配点重建出场景的三维结构和拍摄相机的运动轨迹。
2. SfM的主要流程
2.1 特征点检测(Keypoint Detection)
-
目的:从每张图像中提取具有显著特征的点,这些点在图像中容易被识别和匹配。
-
常用算法:SIFT(尺度不变特征变换)、SURF(加速稳健特征)、ORB(定向快速和旋转不变BRIEF)等。
-
步骤:
-
选择图像中的关键点,这些点通常是角点或纹理丰富的区域。
-
计算每个关键点的描述符,描述符是一个向量,用于唯一标识该关键点。
-
2.2 特征点匹配(Matching Keypoints)
-
目的:在不同的图像之间找到对应的特征点对。
-
常用算法:FLANN(快速最近邻搜索)匹配器、BFMatcher(暴力匹配器)等。
-
步骤:
-
使用描述符匹配算法,找到在不同图像中具有相似描述符的点对。
-
通过一定的策略(如 Lowe's ratio test)筛选出可靠的匹配点对。
-
2.3 基础矩阵计算(Fundamental Matrix Calculation)
-
目的:计算基础矩阵,描述两个图像之间的几何约束关系。
-
公式:基础矩阵 \( F \) 满足 \( x'^T F x = 0 \),其中 \( x \) 和 \( x' \) 是匹配点对在两个图像中的齐次坐标。
-
步骤:
-
使用RANSAC(随机抽样一致性)算法,从匹配点对中随机选择8对点,计算基础矩阵。
-
通过多次迭代,选择使内点数最多的矩阵作为最终的基础矩阵。
-
2.4 本质矩阵计算(Essential Matrix Calculation)
-
目的:在相机内参已知的情况下,将基础矩阵转换为本质矩阵。
-
公式:本质矩阵 \( E \) 满足 \( x'^T E x = 0 \),其中 \( E = K'^T F K \),\( K \) 和 \( K' \) 是相机的内参矩阵。
-
步骤:
-
使用相机内参矩阵 \( K \) 和 \( K' \) 将基础矩阵 \( F \) 转换为本质矩阵 \( E \)。
-
通过SVD(奇异值分解)方法,确保本质矩阵的秩为2。
-
2.5 相机位姿恢复(\[R\|t\] Decomposition)
-
目的:从本质矩阵中分解出相机的相对位姿,即旋转矩阵 \( R \) 和平移向量 \( t \)。
-
步骤:
-
使用SVD分解本质矩阵 \( E \),得到 \( E = U \Sigma V^T \)。
-
通过特定的公式计算旋转矩阵 \( R \) 和平移向量 \( t \):
- \[
- R = U W V^T, \quad t = U \begin{bmatrix} 0 \\ 0 \\ 1 \end{bmatrix}
- \]
- 其中 \( W = \begin{bmatrix} 0 & -1 & 0 \\ 1 & 0 & 0 \\ 0 & 0 & 1 \end{bmatrix} \)。
-
2.6 三角测量(Triangulation)
-
目的:利用多视角的点对和已估计的相机位姿,通过三角测量恢复三维空间中关键点的实际位置。
-
步骤:
-
对于每对匹配点,使用相机的投影矩阵 \( P \) 和 \( P' \) 进行三角测量。
-
通过线性最小二乘法或非线性优化方法,计算出三维点的坐标。
-
2.7 构建三维结构(3D Structure Construction)
-
目的:将所有恢复的三维点组合成稀疏的三维点云模型,描述场景的基本结构。
-
步骤:
-
将所有三角测量得到的三维点存储在一个点云数据结构中。
-
可以进一步使用稠密重建方法(如MVS)生成更详细的三维模型。
-
3. SfM的应用
3.1 虚拟现实(VR)和增强现实(AR)
-
应用:通过SfM技术重建三维场景,为用户提供沉浸式体验。
-
例子:在AR应用中,用户可以通过手机摄像头拍摄周围环境,SfM技术可以实时重建环境的三维结构,以便在环境中叠加虚拟物体。
3.2 机器人导航
-
应用:帮助机器人识别和导航未知环境。
-
例子:机器人在未知环境中行驶时,通过SfM技术重建环境的三维结构,帮助机器人规划路径和避障。
3.3 考古学
-
应用:用于重建古代遗址的三维模型,帮助考古学家更好地研究和保护文物。
-
例子:考古学家可以使用SfM技术从多张遗址照片中重建遗址的三维模型,以便更详细地研究遗址的结构和历史。
4. SfM的策略
4.1 增量式SfM
-
流程:
-
选择两张图像进行初始化,计算基础矩阵和本质矩阵,恢复初始相机位姿。
-
逐张添加图像,每次添加一张新图像时,更新相机位姿和三维点云。
-
通过Bundle Adjustment优化整个重建结果,减少累积误差。
-
-
优点:适用于无序图像数据集,能够逐步构建三维模型。
-
缺点:计算量较大,容易出现累积误差。
注:Bundle Adjustment(BA)是一种在视觉重建中用于优化相机参数和三维点位置的技术,以获得最佳的三维重建结果。其核心是最小化重投影误差,即通过调整相机姿态和特征点的空间位置,使得从每一个特征点反射出的光线在调整后能够汇聚到相机光心,从而实现对多段相机的位姿和位姿下的路标点的空间坐标进行优化
4.2 全局式SfM
-
流程:
-
一次性将所有图像进行配准,计算全局基础矩阵和本质矩阵。
-
通过全局优化方法(如Bundle Adjustment)一次性恢复所有相机位姿和三维点云。
-
-
优点:能够一次性得到全局最优解,重建结果更准确。
-
缺点:计算复杂度高,对内存和计算资源要求高。
4.3 层级式SfM
-
流程:
-
将图像进行分组,每组进行配准和重建。
-
对上一步的结果进行进一步配准和重建,逐步构建全局三维模型。
-
-
优点:结合了增量式和全局式的优点,能够处理大规模图像数据集。
-
缺点:实现复杂,需要多次优化和配准。
5. 常用的SfM工具
5.1 COLMAP
-
功能:COLMAP是一个通用的SfM和MVS管道,具有图形和命令行界面。
-
特点:
-
支持有序和无序图像集合的重建。
-
提供完整的SfM和MVS流程,包括特征点检测、匹配、相机位姿估计、三角测量和稠密重建。
-
优化算法(如Bundle Adjustment)能够提高重建精度。
-
-
使用步骤:
-
数据采集:拍摄多张不同角度的图像。
-
安装与启动:下载并编译COLMAP,启动GUI界面。
-
自动重建:选择"Reconstruction" -> "Automatic reconstruction",配置相关参数。
-
稀疏重建:COLMAP首先进行稀疏重建,生成稀疏的三维点云。
-
稠密重建:使用MVS模块进行稠密重建,生成高分辨率的表面模型。
-
-
SfM(Structure from Motion):简单来说,就是通过多张照片来"拼凑"出一个三维场景的结构。就像你拿着相机围着一个东西转一圈,拍很多张照片,然后用这些照片来"还原"出这个东西在空间里的样子。比如你拍了一堆照片,里面有房子、树木、山等等,SfM就能帮你大概知道这些东西在空间里是怎么分布的,哪个在前哪个在后,大概有多远等等。
-
MVS(Multi-View Stereo):这个是在SfM的基础上更进一步,它不仅要知道场景的大致结构,还想得到更详细的三维信息,比如物体表面的凹凸、细节等等。就好比你不仅要知道房子在哪儿,还想看清房子的窗户是什么形状,墙上的砖块是怎么排列的等等。
COLMAP就是一个专门用来做SfM和MVS的工具,就像一个功能很强大的"拼图软件"。
- 通用的管道:你可以把它想象成一个流水线,你把一堆照片扔进去,这个流水线就会按照一定的步骤,先用SfM的方法大致"拼"出一个三维场景的框架,然后再用MVS的方法在这个框架的基础上,把细节都填充进去,最后给你一个比较完整、详细的三维模型。
注:
1. SfM(Structure from Motion)
-
定义:SfM是从多张照片中"拼凑"出一个三维场景的结构。就像你拿着相机围着一个东西转一圈,拍很多张照片,然后用这些照片来"还原"出这个东西在空间里的样子。
-
输出:SfM的输出通常是一些稀疏的三维点(点云),这些点代表了场景中一些关键的位置。比如你拍了一堆照片,里面有房子、树木、山等等,SfM就能帮你大概知道这些东西在空间里是怎么分布的,哪个在前哪个在后,大概有多远等等。
2. MVS(Multi-View Stereo)
-
定义:MVS是在SfM的基础上更进一步,它不仅要知道场景的大致结构,还想得到更详细的三维信息,比如物体表面的凹凸、细节等等。
-
输入:MVS的输入是SfM生成的稀疏点云和原始照片。
-
输出:MVS的输出是一个更密集的点云,这个点云包含了更多的细节信息。比如你不仅要知道房子在哪儿,还想看清房子的窗户是什么形状,墙上的砖块是怎么排列的等等。
3. 泊松表面重建(Poisson Surface Reconstruction)
-
定义:泊松表面重建是一种从点云数据生成平滑的三维表面模型的方法。想象一下,你有一堆散乱的点,这些点代表了一个物体的表面,但它们只是一个个孤立的点,没有连成一个完整的表面。泊松表面重建就是把这些点连成一个光滑的、完整的三维模型。
-
输入:泊松表面重建的输入是MVS生成的密集点云。
-
输出:泊松表面重建的输出是一个平滑的、水密的三维表面模型。这个模型可以用于各种应用,比如动画、游戏、虚拟现实等等。
5.2 OpenMVG
-
功能:OpenMVG是一个开源的多视角立体几何库,用于处理多视角几何问题。
-
特点:
-
提供SfM所需的特征提取和匹配方法。
-
实现完整的SfM工具链,包括校正、参数估计、重建和表面处理等。
-
支持多种相机模型和优化算法。
-
-
使用步骤:
-
安装与编译:使用CMake进行构建,并通过Visual Studio打开生成的解决方案进行编译。建议与OpenCV一起编译,以确保所有依赖关系正确设置。
-
特征点检测与匹配:使用OpenMVG提供的命令行工具进行特征点检测和匹配。
-
SfM重建:使用SfM模块进行稀疏重建,生成三维点云。
-
MVS重建:使用MVS模块进行
-
1. 视频输入并进行预处理
视频输入:首先,从视频源(如摄像头、视频文件等)获取视频帧。这些帧将作为后续处理的基础。
预处理:
-
图像校正:对图像进行去噪、白平衡调整、对比度增强等操作,以提高图像质量。
-
图像缩放:将图像缩放到合适的分辨率,以减少计算量并提高处理速度。
-
图像裁剪:去除图像中不必要的部分,保留感兴趣区域。
2. 利用计算机视觉技术(如SIFT)进行特征点提取
SIFT(Scale-Invariant Feature Transform)算法:
-
目的:提取图像中的特征点,这些特征点在图像缩放、旋转、亮度变化等情况下保持不变。
-
特点:具有尺度不变性、旋转不变性,能够适应视角变化、仿射变换和噪声干扰。
SIFT算法的具体步骤:
-
尺度空间的建立:
-
通过高斯金字塔生成不同尺度的图像,每个尺度的图像通过高斯模糊处理。
-
生成高斯差分(DoG)图像,用于检测关键点。
-
注:
高斯金字塔是什么
高斯金字塔是一种多分辨率图像表示方法,用于图像处理和计算机视觉领域。它通过对原始图像进行一系列的高斯平滑和下采样操作,生成一组不同分辨率的图像
生成高斯金字塔的步骤
-
高斯平滑:首先,对原始图像进行高斯模糊处理。高斯模糊就是用一个高斯核(一个权重矩阵)对图像进行加权平均,使图像变得模糊。这样做的目的是减少图像的高频细节,保留主要的结构。
-
下采样:然后,对平滑后的图像进行下采样,即减少图像的分辨率。通常的做法是删除所有的偶数行和列,使图像的尺寸减半。
-
重复操作:将下采样后的图像再次进行高斯平滑和下采样,重复这个过程,生成一系列不同分辨率的图像,这些图像就构成了高斯金字塔。
高斯金字塔的结构
-
组(Octave):高斯金字塔由多组金字塔构成,每组包含若干层。第一组的图像分辨率最高,后续每组的图像分辨率依次减半。
-
层(Interval):每组内有多层图像,每层图像的尺寸相同,但平滑程度不同。后一层图像的高斯平滑因子是前一层图像平滑因子的 k倍。
-
关键点检测:
-
在DoG图像中,通过比较相邻像素的值,检测出局部极值点,这些极值点作为关键点。
-
通过一系列的筛选和验证,去除边缘响应和低对比度的关键点。
-
-
关键点描述:
-
对每个关键点,计算其周围区域的梯度方向直方图,生成描述符。
-
描述符是一个128维的向量,用于唯一标识该关键点。
-
3. 使用SFM算法匹配特征点,生成三维点云数据
SfM(Structure from Motion)算法:
-
目的:从多张二维图像中恢复三维结构和相机运动轨迹。
-
核心流程:
-
特征点提取与匹配:使用SIFT等算法提取特征点,并在不同图像之间进行匹配。
-
基础矩阵计算:使用RANSAC算法和归一化八点法估计基础矩阵 \( F \),排除离群点。
-
本质矩阵计算:在相机内参已知的情况下,将基础矩阵 \( F \) 转换为本质矩阵 \( E \)。
-
相机位姿恢复:从本质矩阵 \( E \) 中分解出相机的旋转矩阵 \( R \) 和平移向量 \( t \)。
-
三角测量:利用多视角的点对和已估计的相机位姿,通过三角测量恢复三维空间中关键点的实际位置。
-
稀疏重建:将所有恢复的三维点组合成稀疏的三维点云模型。
-
4. 2D-3D点云配准
2D-3D点云配准:
-
目的:将2D图像中的特征点与3D点云中的点进行匹配,进一步优化相机位姿和三维结构。
-
方法:
-
特征点匹配:使用最近邻方法(如FLANN或BFMatcher)在2D图像和3D点云之间找到匹配点对。
-
PnP算法:利用匹配点对,通过PnP(Perspective-n-Point)算法估计相机的位姿。
-
优化:使用Bundle Adjustment优化相机位姿和三维点云,减少重投影误差。
-
5. 深度学习模型重建3D
深度学习模型重建3D:
-
目的:利用深度学习模型从稀疏点云生成更详细的三维模型。
-
方法:
-
数据准备:将稀疏点云数据输入到深度学习模型中。
-
模型训练:使用卷积神经网络(CNN)或生成对抗网络(GAN)等模型,学习从稀疏点云到稠密点云的映射关系。
-
模型推理:通过训练好的模型,生成高分辨率的三维点云或网格模型。
-