全局视觉定位
1 引言
自主机器人是机器人研究的重点方向,定位和导航是自主机器人研究的核心问题。机器人在执行任务过程中需要确定自身当前位置,根据目标位置和当前位置之间的关系计算如何到达目的地完成任务,其中前者要解决的是自定位问题,后者是导航问题,本文主要研究前者。基于视觉的定位技术还能帮助盲人、视弱以至普通人确定自身位置。 环境模型是定位的基础。基于模型的定位方法包括基于环境三维模型和基于拓扑地图的定位方法。环境三维模型的建模过程非常复杂,特别是在室外的场景中建模可能遇到极大的困难。拓扑定位用图的形式来表示环境模型,其中图中的节点表示环境中的地点,连接节点的边表示地点之间的联系,拓扑定位目的是确定机器人当前的位置与地图中的哪个节点最近,也就是机器人处于哪个地点。
在无人驾驶中,感知、定位、规划决策、控制是四个基本的系统模块。由于当前算法还无法实现绝对的智能,因此依然需要大量的先验知识来提高模块性能、鲁棒性,以实现安全的自动驾驶。其中,高精地图是对道路及周边环境先验知识的集成。而建立在地图之上的准确定位,是判断行车状况的重要依据,为后续的感知、规划决策提供有力支撑。
用于定位的主要数据源目前主要有 GPS、激光雷达、视觉、毫米波雷达。对于视觉而言,虽然目前还没有一套产业内公认的足够可靠的定位方案,但是在这方面探索从未停止过,主要原因如下:
安全性是无人驾驶系统最重要的指标,因此大部分功能的实现,都是多源数据、不同算法结果的耦合。没有哪种传感器方案是完美的,比如 GPS RTK 作为广泛使用的方案,容易受卫星状况、天气状况、 数据链传输状况影响,在隧道内、室内和高楼密集区无法使用。再者,激光雷达虽然具有运算量小,提供深度信息,不受光照影响等优点,但信息稀疏,造价目前还十分昂贵,还不具备大批量车辆装配能力。相比较而言,摄像头提供的视觉信息,虽然会受到光照、天气影响,但是成本低,内容丰富,是目前辅助驾驶方案主要数据源,在地图定位方面也具有很大潜力。
由于主流基于视觉定位算法的核心思想一脉相承,所以本文仅从一系列重要算法框架组件角度,介绍了目前实践中最常用的、基于特征点的全局定位算法,即在地图坐标系下进行定位。本文省略了其中涉及到的优化、几何约束公式推导,旨在给同学们一个定位算法的宏观介绍,具体细节可以参考相关文献和书籍。
2 基于特征点的全局定位算法视觉全局定位,指的是根据当前图像,求出相机在地图坐标系中的 6 个自由度 (Degree of freedom, DoF) 位姿 (Pose) , 即 (x, y, z) 坐标,以及环绕三个坐标轴的角度偏转 (yaw, pitch, roll) 。目前主要可以分类为基于 3D 结构的方法、基于 2D 图像的方法、基于序列图像的方法、基于深度学习的方法。其中,基于深度学习的方法属于端到端 (End-to-end) 的方法,而其它多阶段 (Multi-stage) 非端到端方法虽然流程有所差别,但算法思路大都如 Fig 1 所示:
Figure 1: 根据查询图像,计算 2D-3D 转换矩阵,求解相机位姿
基于已建的地图,匹配历史中最相似的地图子集(图像/点云/特征点),根据匹配到的地图子集所提供的历史位姿真值、特征点坐标真值,计算点对间的变换矩阵,求解当前相机位姿。
所以,其核心包含图像描述、建图查询、特征匹配,位姿计算四个方面。这里仅仅是技术层面的宏观分类,实际算法框架不一定按照此顺序执行,而学者在研究中主要针对这些技术进行改进。整体而言,基于特征点的图像描述基本成熟,发展较少。而位姿计算由于是基于几何约束的优化问题,所以方法也较为固定。相对地,建图查询和特征匹配中改进技术较多。根据数据源不同,建图查询、匹配可以是2D-2D,2D-3D,3D-3D。2D 图像由相机得到,3D 点云可以由提供深度的双目相机、RGB-D 相机产生。
21 特征点提取
2D 图像本身是一个由亮度、色彩组成的矩阵,对视角、光照、色调变化等很敏感,直接使用十分困难。所以,一般会使用具有代表性的点进行相关计算。人们希望这样的点具有旋转、平移、尺度、光照不变性等优点。这些点称为图像的特征 (Feature) 点,包含关键点(Key-points) 和描述子 (Descriptor) 两部分。关键点表达了特征点的位置,而描述子则是对于特征点视觉特性的描述,大多为向量形式。一般而言,描述子主要是以某种模式,统计关键点周围的灰度/色彩梯度变化。一种鲁棒的描述子,在不同图像 的不同情况下,同一特征点的描述子的距离 (Distance) 应当较小。
描述子一般是人为手工设计的 (Hand-crafted features) 。经典的描述如 HOG(Histogram of oriented gradients)[1],SIFT(Scale-invariant feature transform)[2],SURF(Speeded up robust features)[3],AKAZE(Accelerated KAZE)[4] 等。
为了实时性的要求,一些计算速度更快的二值模式描述子被设计出来,如 LBP(Local binary patterns)[5],BRIEF(Binary robust independent elementary features),ORB(Oriented FAST and rotated BRIEF)[6],BRISK(Binary robust invariant scalable key-point)[7],FREAK(Fast retina key-point)[8] 等。
在深度学习流行之前,这些手工特征一直引领着整个计算视觉产业,直到今天,这些特征在那些缺少标注数据、约束较多的场景下,依然被广泛应用。下面简单介绍两类常用的描述子。
211 SIFTSIFT 描述子可以算是 CV 界最具影响力的技术之一。从关键点检测层面,主要使用高斯差分 (Difference of Gaussian, DoG) 方法检测多尺度空间上的极值点,作为关键点。而 Babaud 等人 [9] 证明了高斯平滑是唯一的能用多尺度空间平滑滤波核,为相关方法提供了充足的理论支持。
那么为什么这样的方法可以找到特征关键点呢
由于高斯核可以通过模糊的方式把图像缩放到不同尺度空间,而梯度变化较小的平滑区域在不同尺度空间的值差距较小。相反,边缘、点、角、纹理等区域则差距较大。这样通过对相邻尺度的图像做差分,最终可以算得多尺度空间的极值点。但是,不同的图像细节本身就处于不同的尺度中。比如一副人物画像中,人脸可能经过较小的模糊就会被平滑为一片,而画框的角则可能需要更大尺度的平滑才会体现出局部“极值”。
因此,如 Fig 2 所示,首先利用图像金字塔将图像先分组 (Octave) ,每组中再使用不同尺度的高斯核,形成一系列的层。这种方式比单纯地使用更多尺度的高斯核效果更好,可以检测到更多的特征点。需要注意的是,虽然 SIFT 使用了 DoG 进行关键点检测,但是其它检测方法也是可行的,并不影响 SIFT 描述子的建立。
Figure 2: 高斯差分方法
SIFT 特征点的描述子,可以理解为一种简单统计版的 HOG。如 Fig 3所示,以检测到的关键点为中心,选取周围 16 × 16 的区域,将区域再组织为 4 个 4 × 4 的块(Patch)。对每一个块,使用 8-bins 的直方图对梯度进行统计,梯度方向决定落入哪个 bin,而梯度的模决定值的大小。为了保证尺度一致性,梯度大小需要进行归一化。为了保证旋转不变性,会根据 16 × 16 的区域内的所有梯度计算出一个主方向, 所有梯度按照主方向进行旋转。最终形成 4 × 4 × 8 的 128 维向量。
Figure 3: 基于梯度分块统计的 SIFT 描述子
212 二值描述子虽然在 SIFT 提出后,又产生了一些改进算法如 SURF、AKAZE 等,但是即使放在 2019 年的今天, 依然难以保证一些场景对算法实时性的要求。例如,手持设备一般算力有限。而无人驾驶中,CPU、GPU资源需要被多个计算密集型模块同时调度。因此,效率是考察算法实用性的重要指标。
为了提高效率,一些二值描述子被学者们提出。一般地,这些方法都是在特征关键点周围进行点采 样。然后比较一对点的灰度大小,结果以 0/1 表示,形成 N 维的二进制描述向量,构成特征点的二值模式。而不同二值描述子最大的差别,主要在于特征采样模式不同、点对选取方法不同。
Figure 4: LBP 描述子采样模式
如 Fig 4所示,LBP 描述子采用对关键点周围,进行环形采样,并与中心关键点的灰度进行比较的方案。圆环上展示了灰度比较结果,黑色的点是 0,白色的点是 1。LBP 是二值描述子最简单的形式,而 ORB 改进了 BRIEF 特征,是目前比较常用的二值描述子。如 Fig 5所示,在点对选取上,与单纯使用中心点不同,ORB 采用了随机的方式,更全面地描述局部细节。但点对的相关性会比较大,从而降低描述子的判别性(Discriminative)。ORB 直接采用了贪婪法、穷举法解决这一问题,寻找相关性低的随机点对。
Figure 5: ORB 描述子点对选取模式
以上二值描述子的采样方式和点对选取方式符合人们一般直觉,而 BRISK、FREAK 等描述子则提供了更加规则化、自带尺度信息的二值模式构建方法。例如,FREAK 描述子模仿了人眼的视觉采样模式。如 Fig 6所示,每个采样点的值是红色圆圈范围内的灰度均值,蓝线则表示点对选取方案。
Figure 6: FREAK 描述子采样、点对选取摸式
二值描述子的高效率,主要体现在三个方面。
(1)二值描述子使用二进制向量作为特征描述,只需要 比较点对大小而不需要计算具体梯度。(2)两个描述子之间比较可以使用计算更快,更容易优化的汉明距离 (Hamming distance)。(3)由于每个二进制向量都对应一个十进制数,所以其本身也代了表一种模 式,而不需要像 SIFT 一样使用直方图进行表示。
二值描述子一般判别性不如 SIFT 家族描述子,但在特定场景下,配合并行化编程,可以在保证相似判别能力的同时,效率高出几十甚至百倍。
22 数据库建立与查询数据库可以理解为于地图 + 索引的集成。地图可以是由单纯的 2D 图像组成,也可以是由 3D 点云地图组成,也可以是 2D 图像和 3D 点云的结合。3D 点云地图生成主要使用三维重建的方法 SfM(Structure from motion),从时间序列的 2D 图像中推算 3D 信息。如果有双目、RGB-D 相机提供深度,可以获得 更准确的 3D 点信息。其中也包含了一些诸如关键帧(Key-frame)的选取策略,具体方法超出了本文的讨论范围,有兴趣的同学可以自行查阅相关资料。数据库的作用在于:
对于一张输入的观测图像,通过数据库,查询建图历史(图像/点云/特征点),得到当前图像最可能观测到的地图子集(图像/点云/特征点),将地图与观测信息进行匹配,计算变换矩阵,得到观测相机的位姿。
索引则是加速这一过程的关键。数据库本身往往是巨大的。以美团的小袋机器人在北京朝阳大悦城二层试运营为例,安装有 3 个深度相机,即使经过筛选,也使用了将近 8 万张 900 × 600 的。考虑到定位所需要的实时性,查询时不可能每次都和 8 万张一一对比,所以要使用索引技术加速整个算法。这方面技术与 SLAM 中的回环测试,视觉中的图像检索、位置识别等高度重合,以下仅介绍一般方法。
一张图像内有若干特征点,需要先对特征点进行编码,如 VLAD(Vector of locally aggregated descriptors) 编码,用局部描述子形成图像的全局描述。再使用索引,如 kd-tree,进行图像级查询。当然,编码和索引也可以同时进行,如层次化词袋模型(Bag-of-words,BoW)+ 正向索引 + 逆向索引的方法。
221 VLAD 编码VLAD(Vector of locally aggregated descriptors)[10],如 Fig 7所示,是一种通过聚合局部描述子形成码本 (Codebook) ,通过累加计算描述子与码词 (Word) 的距离,进行全局编码的简单方法。一个 d 维描述子 x 通过 k 个码词的码本进行编码,可以形成一个 dk 维的描述向量,向量中的值是描述子与第
k个码词在第 d 维的差。之后进行 L2 归一化,形成最后的 VLAD 向量。
Figure 7: VLAD 通过描述子与码词的距离进行编码
这里要特别提介绍一下 DenseVLAD[11] 和 NetVLAD[12] 。Torii 等人证明,DenseSIFT 在查询、匹配上都优于标准 SIFT。DenseVLAD 在四个尺度,以 2 个像素间隔的网格状采样模式,提取 SIFT 点。在全局随机采样 25M 个描述子,用 k-means 算法生成 128 个码词的码本。VLAD 向量在归一化后使用 PCA(Principal component analysis) 降维,形成最后 4096 维的 DenseVLAD 向量。如 Fig 8所示,使用DenseSIFT 匹配后的内点(绿)数量更多。
Figure 8: DenseSIFT 和标准 SIFT 特征点,匹配后内点(绿)对比
而 NetVLAD,将 VLAD 中加入了监督信息,加强 VLAD 编码的判别性。如 Fig 9所示,假设红、绿两个描述子来源于不应匹配到一起的两张。由于它们都离 VLAD 中心(×)半径较大且距离相似,经过 L2 归一化,它们编码后值也会很相似。而加入了红、绿描述子所对应不匹配的监督信息后,NetVLAD 生成的中心点(★)则可以更好地区分两个描述子,增加他们编码后的距离(半径)差。
Figure 9: NetVLAD 聚类中心(×)与 VLAD 聚类中心(★)对比。
222 BoW 编码 + 索引基于词袋模型 BoW[13, 14] 的特征编码及其设计思想在计算机视觉发展中具有举足轻重的地位,这里不再展开介绍。本文以 2D 查询图像匹配 2D 图像数据库为例,介绍一种常见的 BoW 编码、索引一体化的模型。如 Fig 10所示,词典 (Vocabulary) 生成采用层次化方法,对于数据集中的所有描述子,按树状结构进行空间划分,每一层都是由 k-means 聚类计算。最终叶子节点就相当于码词(Fig 10中有 9个码词)。
Figure 10: 带正向索引、逆向索引的层次化 BoW 模型
树的构造过程,实际上就是将原始图像编码的过程。但是编码本身并不能加快搜索过程,与 VLAD 相似,还是需要与数据库中的图像逐一比较。因此,这里设计了一种逆向索引(Inverse index) ,不需要比较编码后的向量。其原理如 Fig 11所示,对于一张查询图像 (Query image) ,将提取的描述子输入到 BoW 中,最终会落入码词叶子结点 (Visual word) k 中。而每个码词对应一个索引,记录码词 k
对于数据库中第 i
张图的权重
(Fig10)。这里权重使用 TF-IDF(Term frequency–inverse document frequency) 计算。即如果一个词 k
在某个图像 i
中出现频率高,在其它图像出现频率低,则这个词对于图像判别性较好,权重值
较高。最终通过投票 (Voting) 机制,选出匹配图像。同样需要注意的是,逆向索引不一定建立在树形结构的 BoW 上,它仅仅是提供一种快速查询的方法。
Figure 11: 通过逆向索引 + 投票机制,直接查询图像
而正向索引 (Direct Index) 的作用主要是记录构造 BoW 时,数据库的特征点都落入了哪些结点中,这样当查询到图像后,不需要计算特征点,可以直接通过索引提取特征点。
223 3D 点云查询2D 图像查询中,是先从语意层面查询图像,因此可以通过图像对特征点的空间范围进行约束。3D 点云查询没有这样的约束,所以具诸多难点。如需要考虑空间连续性,查询到的点是否都在可观测范围内等。这里仅介绍 Sattler 在 TPAMI 2016 上发表的方法 [15],经过多年的打磨,这套方法框架相对简洁、完善。由于其中的词典编码搜索步骤与上节内容有所重叠,这里仅介绍 Active Search 和 Visbility Filtering 两种机制。
Active Search 主要是为了使得匹配到的 3D 点尽可能空间中临近、有几何意义。如 Fig 12所示,红 色的点通过一系列编码、精化过程(红线),匹配到了点云中一个点。根据所提出优先排序(Prioritization) 框架,从点云中找到一个概率最大的 3D 点,并反向(蓝线)匹配查询图像中的一个对应的 2D 点。
Figure 12: Active Search
Figure 13: Visbility Filtering
Visbility Filtering 主要是为了让匹配到的点尽可能可以被相机观测到(定位是无监督的,并不能知道所匹配到的点是否正确)。这里采用的方法是在使用 SfM 建立 3D 点云地图时,同时建立一个双向可见图 (Bipartite visibility graph) 。如 Fig 13(左)所示,当一个点可以同时被两个相机观测时,则建立拓扑关系。Fig 13(中)里,蓝色的点为匹配到的点,它们从观测视角上存在冲突。通过在已有拓扑上进 行图聚类,将相机两两分组,如 Fig 13(右)。这样就可以生成新的图拓扑关系。之后通过判断每个子图(Sub-graph)间的重合情况,过滤掉那些那大概率不可见的点。
需要说明的是,虽然双目相机和 RGB-D 相机可以获取深度,查询 2D 图像也可以获得限定范围内的 3D 特征点坐标,但是由于目前技术限制,在室内材质复杂,室外大尺度场景下,深度并不可靠。所以 2D图像点和 3D 点云地图的匹配依然是一种重要的方法。
23 特征点匹配特征点匹配过程可以是在数据库查询中自适应完成的,这多见于基于 3D 结构的查询。匹配也可以是在查询后单独进行,多见于基于 2D 图像查询。特征匹配的目的是,为后续的变换矩阵计算提供匹配的点对集,实现位姿的解算。
231 经典 RANSAC随机抽样一致算法 (Random sample consensus,RANSAC)[16] 是一种经典的数据过滤、参数拟合算法。它假设数据(内点,Inliers)分布符合一定的数学模型,通过迭代计算,去除外点 (Outliers) 、噪声点, 同时获取概率上最佳的模型参数。在全局定位中,内点指正确的匹配,外点指错误的匹配,参数模型指匹配点对的空间变换矩阵。如 Fig 14所示,经过 RANSAC 算法优化后,匹配更加合理。RANSAC 所期望找到的匹配子集需要满足两个指标:内点重投影误差尽可能小;内点数量尽可能多。所以基本流程如下:
· ①采样初始子集。
· ②计算变换矩阵。
· ③ 根据变换矩阵计算匹配点的重投影误差。
· ④ 去除误差较大的点
· ⑤ 循环①-④,保留最满足指标的匹配方案。
Figure 14: (上)原始特征匹配;(下)经过 RANSAC 算法优化后的匹配
其中,初始候选匹配是根据描述子之间的距离产生的,但重投影误差则只和关键点的空间位置有关, 与描述子本身无关。具体投影矩阵方法请参考“24 位姿计算”。需要指出的是,RANSAC 算法受到原始匹 配误差和参数选择的影响,只能保证算法有足够高的概率合理,不一定得到最优的结果。算法参数主要包括阈值和迭代次数。RANSAC 得到可信模型的概率与迭代次数成正比,所得到的匹配数量和阈值成反比。因此实际使用时,可能需要反复尝试不同的参数设置才能得到较优的结果。
学者们对经典 RANSAC 算法进行了很多改进,如 Fig 15所示,提出了全局 RANSAC(Universal- RANSAC)[17] 的结构图,形成了具有普适性的 RANSAC 架构,涵盖了几乎所有的 RANSAC 的改进方 面,如预滤波、最小子集采样、由最小子集生成可靠模型、参数校验、模型精化。
Figure 15: Universal-RANSAC 通用算法框架
233 可微分 RANSAC由于手工描述子在定位领域依然表现出较高的性能,所以一些学者开始探索使用深度学习代替算法框架中的某些部分,而不是直接使用端到端的位姿估计模型完全代替传统方法。可微分 RANSAC(Differentiable RANSAC,DSAC)[18] 旨在用概率假说选择代替确定性假说选择,使得 RANSAC 过程可以被求导,流程如 Fig 16所示,其中“Scoring”步骤依然采用重投影误差作为指标,所不同的是,误差是基于整张图像而不是特征点,而原先筛选特征点匹配的过程被换为了直接以概率筛选相机位姿假设 h 的过程。虽然目 前方法局限性比较大,但 DSAC 为如何在当前无监督为主的定位算法框架中加入先验知识,提供了一种可行的思路。
Figure 16: 差分 RANSAC 算法框架
P3P 法可以看作是 PnP 法的特殊解法,如 Fig 17所示,利用三角形相似性质增加更多约束,只需要 3 对点就可以求解。其它解法还有直接线性变换法 (Direct linear transformation,DLT),EPnP(Efficient PnP) 法,和 UPnP(Uncalibrated PnP)等。相对于以上线性优化方法,非线性优化方法如Bundle Adjustment(BA) 也有着广泛的应用。BA 方法在视觉 SLAM 中是一种“万金油”的存在,可以同时优化多个变量,这样可以一定程度缓解局部误差带来的系统不鲁棒,感兴趣的同学可以翻阅相关资料更深入地进行了解。
Figure 17: 2D-3D 变换矩阵计算中的 P3P 方法
3 总结与展望
本文从图像描述、建图查询、特征匹配,位姿计算四个方面介绍了基于特征点的位姿估计算法。虽然传统视觉全局定位方法目前依然是实际应用中的首选,但是,传统方法是建立在特征点被正确定义、正确提取、正确匹配、正确观测的前提下进行的,这一前提对于视觉本身而言就是巨大的挑战。其次,由于传统方法是 multi-stage 框架,而非 end-to-end,所以中间每个环节,环节之间的交互,都需要众多参数调整,每个环节的技术都可以作为一个单独的研究方向。实际应用时,也需要加入对应具体场景的大量tricks,工程上比较复杂。
而人们对 end-to-end 方法的期望催生出了如 PoseNet,VLocNet,HourglassNet 等网络,在 benchmark上取得了不错的成绩。笔者认为目前 end-to-end 的方法还存在很多问题,主要有 loss function 缺少几何 约束,建图时位姿的 6 自由度空间并不连续,与输入空间难以形成良好映射,而且缺少相应的位姿回归、 精化机制等。不能否认,作为非线性空间最有力的建模工具,深度学习在未来会更多地出现在定位领域中。
回归到视觉定位本身,由于视觉最重要的优势就是成本低、语意丰富、使用场景限制少。因此,以视觉为主,其它低成本传感器为辅的定位融合方案在未来也将会是一个重要的课题。
参考资料
[1] Dalal, N, and B Triggs ”Histograms of oriented gradients for human detection” CVPR, 2005
[2] Lowe, David G ”Distinctive Image Features from Scale-Invariant Keypoints” IJCV, 2004
[3] Bay, Herbert, T Tuytelaars, and L V Gool ”SURF: Speeded Up Robust Features” ECCV, 2006[4] PFAlcantarilla,JNuevo,andABartoliFast explicit diffusion for accelerated features in nonlinear scale spaces BMVC, 2013
[5] Ojala, Timo ”Gray Scale and Rotation Invariant Texture Classification with Local Binary Patterns” ECCV, 2000
[6] Rublee, Ethan , et al ”ORB: An efficient alternative to SIFT or SURF” ICCV, 2011
[7] Leutenegger, Stefan , M Chli , and R Y Siegwart ”BRISK: Binary Robust invariant scalable keypoints” ICCV, 2011
[8] Alahi, Alexandre , R Ortiz , and P Vandergheynst ”FREAK: Fast retina keypoint” CVPR, 2012
[9] Witkin, A P, M Baudin, and R O Duda ”Uniqueness of the Gaussian Kernel for Scale-Space Filtering” TPAMI, 1986
[10] Jegou, Herve , et al ”Aggregating local descriptors into a compact image representation” CVPR, 2010
[11] Torii, Akihiko , et al ”24/7 place recognition by view synthesis” CVPR, 2015
[12] Arandjelovic, Relja, et al ”NetVLAD: CNN architecture for weakly supervised place recognition” TPAMI, 2017
[13] Li, Fei Fei ”A Bayesian Hierarchical Model for Learning Natural Scene Categories CVPR, 2005
[14] Galvez-Lopez, D , and J D Tardos ”Bags of Binary Words for Fast Place Recognition in Image Sequences” TRO, 2012
[15] Sattler, Torsten , B Leibe , and L Kobbelt ”Efficient & Effective Prioritized Matching for Large- Scale Image-Based Localization” TPAMI, 2016
[16] Fischler, Martin A, and R C Bolles ”Random sample consensus: a paradigm for model fitting with applications to image analysis and automated cartography” Communications of the ACM, 1981
[17] Raguram, Rahul , et al ”USAC: A Universal Framework for Random Sample Consensus” TPAMI, 2013
[18] Brachmann, Eric, et al ”DSAC —Differentiable RANSAC for Camera Localization” CVPR, 2017
Python作为一个设计优秀的程序语言,现在已广泛应用于各种领域,依靠其强大的第三方类库,Python在各个领域都能发挥巨大的作用。
下面我们就来看一下python中常用到的库:
数值计算库:
1 NumPy
支持多维数组与矩阵运算,也针对数组运算提供大量的数学函数库。通常与SciPy和Matplotlib一起使用,支持比Python更多种类的数值类型,其中定义的最重要的对象是称为ndarray的n维数组类型,用于描述相同类型的元素集合,可以使用基于0的索引访问集合中元素。
2 SciPy
在NumPy库的基础上增加了众多的数学、科学及工程计算中常用的库函数,如线性代数、常微分方程数值求解、信号处理、图像处理、稀疏矩阵等,可进行插值处理、信号滤波,以及使用C语言加速计算。
3 Pandas
基于NumPy的一种工具,为解决数据分析任务而生。纳入大量库和一些标准的数据模型,提供高效地 *** 作大型数据集所需的工具及大量的能快速便捷处理数据的函数和方法,为时间序列分析提供很好的支持,提供多种数据结构,如Series、Time-Series、DataFrame和Panel。
数据可视化库:
4 Matplotlib
第一个Python可视化库,有许多别的程序库都是建立在其基础上或者直接调用该库,可以很方便地得到数据的大致信息,功能非常强大,但也非常复杂。
5 Seaborn
利用了Matplotlib,用简洁的代码来制作好看的图表。与Matplotlib最大的区别为默认绘图风格和色彩搭配都具有现代美感。
6 ggplot
基于R的一个作图库ggplot2,同时利用了源于《图像语法》(The Grammar of Graphics)中的概念,允许叠加不同的图层来完成一幅图,并不适用于制作非常个性化的图像,为 *** 作的简洁度而牺牲了图像的复杂度。
7 Bokeh
跟ggplot一样,Bokeh也基于《图形语法》的概念。与ggplot不同之处为它完全基于Python而不是从R处引用。长处在于能用于制作可交互、可直接用于网络的图表。图表可以输出为JSON对象、HTML文档或者可交互的网络应用。
8 Plotly
可以通过Python notebook使用,与Bokeh一样致力于交互图表的制作,但提供在别的库中几乎没有的几种图表类型,如等值线图、树形图和三维图表。
9 pygal
与Bokeh和Plotly一样,提供可直接嵌入网络浏览器的可交互图像。与其他两者的主要区别在于可将图表输出为SVG格式,所有的图表都被封装成方法,且默认的风格也很漂亮,用几行代码就可以很容易地制作出漂亮的图表。
10 geoplotlib
用于制作地图和地理相关数据的工具箱。可用来制作多种地图,比如等值区域图、热度图、点密度图。必须安装Pyglet(一个面向对象编程接口)方可使用。
11 missingno
用图像的方式快速评估数据缺失的情况,可根据数据的完整度对数据进行排序或过滤,或者根据热度图或树状图对数据进行修正。
web开发库:
12 Django
一个高级的Python Web框架,支持快速开发,提供从模板引擎到ORM所需的一切东西,使用该库构建App时,必须遵循Django的方式。
13 Socket
一个套接字通讯底层库,用于在服务器和客户端间建立TCP或UDP连接,通过连接发送请求与响应。
14 Flask
一个基于Werkzeug、Jinja 2的Python轻量级框架(microframework),默认配备Jinja模板引擎,也包含其他模板引擎或ORM供选择,适合用来编写API服务(RESTful rervices)。
15 Twisted
一个使用Python实现的基于事件驱动的网络引擎框架,建立在deferred object之上,一个通过异步架构实现的高性能的引擎,不适用于编写常规的Web Apps,更适用于底层网络。
数据库管理:
16 MySQL-python
又称MySQLdb,是Python连接MySQL最流行的一个驱动,很多框架也基于此库进行开发。只支持Python 2x,且安装时有许多前置条件。由于该库基于C语言开发,在Windows平台上的安装非常不友好,经常出现失败的情况,现在基本不推荐使用,取代品为衍生版本。
17 mysqlclient
完全兼容MySQLdb,同时支持Python 3x,是Django ORM的依赖工具,可使用原生SQL来 *** 作数据库,安装方式与MySQLdb一致。
18 PyMySQL
纯Python实现的驱动,速度比MySQLdb慢,最大的特点为安装方式简洁,同时也兼容MySQL-python。
19 SQLAlchemy
一种既支持原生SQL,又支持ORM的工具。ORM是Python对象与数据库关系表的一种映射关系,可有效提高写代码的速度,同时兼容多种数据库系统,如SQLite、MySQL、PostgreSQL,代价为性能上的一些损失。
自动化运维:
20 jumpsever跳板机
一种由Python编写的开源跳板机(堡垒机)系统,实现了跳板机的基本功能,包含认证、授权和审计,集成了Ansible、批量命令等。
支持WebTerminal Bootstrap编写,界面美观,自动收集硬件信息,支持录像回放、命令搜索、实时监控、批量上传下载等功能,基于SSH协议进行管理,客户端无须安装agent。主要用于解决可视化安全管理,因完全开源,容易再次开发。
21 Magedu分布式监控系统
一种用Python开发的自动化监控系统,可监控常用系统服务、应用、网络设备,可在一台主机上监控多个不同服务,不同服务的监控间隔可以不同,同一个服务在不同主机上的监控间隔、报警阈值可以不同,并提供数据可视化界面。
22 Magedu的CMDB
一种用Python开发的硬件管理系统,包含采集硬件数据、API、页面管理3部分功能,主要用于自动化管理笔记本、路由器等常见设备的日常使用。由服务器的客户端采集硬件数据,将硬件信息发送至API,API负责将获取的数据保存至数据库中,后台管理程序负责对服务器信息进行配置和展示。
23 任务调度系统
一种由Python开发的任务调度系统,主要用于自动化地将一个服务进程分布到其他多个机器的多个进程中,一个服务进程可作为调度者依靠网络通信完成这一工作。
24 Python运维流程系统
一种使用Python语言编写的调度和监控工作流的平台,内部用于创建、监控和调整数据管道。允许工作流开发人员轻松创建、维护和周期性地调度运行工作流,包括了如数据存储、增长分析、Email发送、A/B测试等诸多跨多部门的用例。
GUI编程:
25 Tkinter
一个Python的标准GUI库,可以快速地创建GUI应用程序,可以在大多数的UNIX平台下使用,同样可以应用在Windows和Macintosh系统中,Tkinter 80的后续版本可以实现本地窗口风格,并良好地运行在绝大多数平台中。
26 wxPython
一款开源软件跨平台GUI库wxWidgets的Python封装和Python模块,是Python语言的一套优秀的GUI图形库,允许程序员很方便地创建完整的、功能健全的GUI用户界面。
27 PyQt
一个创建GUI应用程序的工具库,是Python编程语言和Qt的成功融合,可以运行在所有主要 *** 作系统上,包括UNIX、Windows和Mac。PyQt采用双许可证,开发人员可以选择GPL和商业许可,从PyQt的版本4开始,GPL许可证可用于所有支持的平台。
28 PySide
一个跨平台的应用程式框架Qt的Python绑定版本,提供与PyQt类似的功能,并相容API,但与PyQt不同处为其使用LGPL授权。
更多Python知识请关注Python自学网。
本教程 *** 作环境:windows7系统、Dell G3电脑。
人脸识别(Facial Recognition),就是通过视频采集设备获取用户的面部图像,再利用核心的算法对其脸部的五官位置、脸型和角度进行计算分析,进而和自身数据库里已有的范本进行比对,后判断出用户的真实身份。
人脸识别算法是指在检测到人脸并定位面部关键特征点之后,主要的人脸区域就可以被裁剪出来,经过预处理之后,馈入后端的识别算法。识别算法要完成人脸特征的提取,并与库存的已知人脸进行比对,完成最终的分类。
人脸识别的算法有 4 种:基于人脸特征点的识别算法、基于整幅 人脸图像的识别算法、基于模板的识别算法、利用神经网络进行识别的算法。
人脸识别算法的原理:
系统输入一般是一张或者一系列含有未确定身份的人脸图像,以及人脸数据库中的若干已知身份的人脸图象或者相应的编码,而其输出则是一系列相似度得分,表明待识别的人脸的身份。
人脸识别的三个经典算法
1、Eigenfaces(特征脸)算法
Eigenfaces是在人脸识别的计算机视觉问题中使用的一组特征向量的名称,Eigenfaces是基于PCA(主成分分析)的,所以学习Eigenfaces需要我们了解PCA的原理。
基本思想
主成分分析(PCA)是一种矩阵的压缩算法,在减少矩阵维数的同时尽可能的保留原矩阵的信息,简单来说就是将 n×m的矩阵转换成n×k的矩阵,仅保留矩阵中所存在的主要特性,从而可以大大节省空间和数据量。PCA的实现需要进行降维,也就是将矩阵进行变换,从更高的维度降到低的维度,然而PCA的降维离不开协方差矩阵。方差是描述一维数据样本本身相对于均值的偏离程度,是一种用来度量两个随机变量关系的统计量,从角度来说,其夹角越小,值越大,方向越相近,也就是越正相关。协方差矩阵度量除了是两个随机变量的关系外,还是维度与维度之间的关系,而非样本与样本之间的关系。
学习一种新的东西,尤其是知识,我们需要了解知识中的思想。我在了解和学习Eigenface算法时它的思想是图像识别首先要选择一个合适的子空间,将所有的图像集中到这个子空间中,然后在这个子空间中衡量相似性或者进行分类学习,再讲子空间变换到另一个空间中,这样的作用一是同一个类别的图像离得更近,二是不同的类别的图像会离得比较远;这样经过线性分类分开的图像在新空间就能容易分开。同时特征脸技术会寻找人脸图像分布的基本元素,即人脸图像样本集协方差矩阵的特征向量,以此来表征人脸图像。人脸图像的基本元素有很多,比如眼、面颊、唇等基本元素,这些特征向量在特征脸的图像空间中对应生成的子空间被称为子脸空间。
生成了子空间之后就要进行空间构造,那么如何进行空间构造呢?首先要寻找人脸的共性,其次是要寻找个体与共性的差异,还有就是要明白共性其实是空间,个体就是向量。利用协方差矩阵把目标集中所有人脸图像的特征值进行分解,得到对应的特征向量,这些特征向量就是“特征脸”。寻找特征向量的特性,将其进行线性组合。在以每一个特征子脸为基的空间,每个人脸就是一个点,这个点的坐标就是每一个人脸在每个特征基下的的投影坐标。
Eigenfaces算法过程
获得人脸图像数据,将每一个人脸图像矩阵按行串成一维,每个人脸就是一个向量;
将M个人脸在对应维度上加起来,然后求平均得到“平均脸”;
将每个图像都减去平均脸向量;
计算协方差矩阵;
运用Eigenfaces记性人脸识别;
算法实践过程;
训练图像
求出平均脸
获得特征子脸
进行图像重构
寻找相似度高的人脸图像。
2、FisherFace算法
FisherFace是Fisher线性判别在人脸识别的应用。线性判别分析(LDA)算法思想最早由英国统计与遗传学家,现代统计科学的奠基人之一罗纳德费舍尔(Ronald)提出。LDA算法使用统计学方法,尝试找到物体间特征的一个线性组合,在降维的同时考虑类别信息。通过该算法得到的线性组合可以用来作为一个线性分类器或者实现降维。
基本思想
线性判别分析的基本思想是:将高维的模式样本投影到低维最佳矢量空间,以达到抽取重要分类信息和压缩特征空间维度的效果,投影后保证模式样本在新的子空间有最大的类间距离、最小的类内距离,即模式在该空间中有最佳的可分离性。理论和特征脸里用到的Eigenfaces有相似之处,都是对原有数据进行整体降维映射到低维空间的方法,fisherfaces和Eigenfaces都是从数据整体入手而不同于LBP提取局部纹理特征。
对降维后的样本使用Fisher线性判别方法,确定一个最优的投影方向,构造一个一维的体征空间,将多维的人脸图像投影到 fisherfaces特征空间,利用类内样本数据形成一组特征向量,这组特征向量就代表了人脸的特征。
我们知道,该算法是在样本数据映射到另外一个特征空间后,将类内距离最小化,类间距离最大化。LDA算法可以用作降维,该算法的原理和PCA算法很相似,因此LDA算法也同样可以用在人脸识别领域。通过使用PCA算法来进行人脸识别的算法称为特征脸法,而使用LDA算法进行人脸识别的算法称为费舍尔脸法。
LDA和PCA相比:
相同:1、在降维的时候,两者都使用了矩阵的特征分解思想;2、两者都假设数据符合高斯分布。不同:1、LDA是有监督的降维方法,而PCA是无监督的。2、如果说数据是k维的,那么LDA只能降到(k-1)维度,而PCA不受此限制。3、从数学角度来看,LDA选择分类性能最好的投影方向,而PCA选择样本投影点具有最大方差的方向。Fisherfaces算法和Eigenfaces算法相比:
相同:两者均可以对数据进行降维;两者在降维时均使用了矩阵特征分解的思想。
不同:Fisherfaces是有监督的降维方法,而是Eigenfaces无监督的降维方法;Fisherfaces除了可以用于降维,还可以用于分类。
值得一提的是,FisherFace算法识别的错误率低于哈佛和耶鲁人脸数据库测试的Eigenfaces识别结果。
Fisherface算法流程
获得人脸图像数据,然后求出人脸的均值。
观察各个人脸的特征值。
进行人脸鉴定,观察人脸特征,判断是否是个人。
最后进行人脸识别。
3、LBPH(Local Binary Patter Histogram)算法
Local Binary Patterns Histograms即LBP特征的统计直方图,LBPH将LBP(局部二值编码)特征与图像的空间信息结合在一起。如果直接使用LBP编码图像用于人脸识别。其实和不提取LBP特征区别不大,因此在实际的LBP应用中,一般采用LBP编码图像的统计直方图作为特征向量进行分类识别。
原始的LBP算子定义为在33的窗口内,以窗口中心像素为阈值,将相邻的8个像素的灰度值与其进行比较,若周围像素值大于或等于中心像素值,则该像素点的位置被标记为1,否则为0。这样,33邻域内的8个点经比较可产生8位二进制数(通常转换为十进制数即LBP码,共256种),即得到该窗口中心像素点的LBP值,并用这个值来反映该区域的纹理特征。
LBPH的维度: 采样点为8个,如果用的是原始的LBP或Extended LBP特征,其LBP特征值的模式为256种,则一幅图像的LBP特征向量维度为:64256=16384维,而如果使用的UniformPatternLBP特征,其LBP值的模式为59种,其特征向量维度为:6459=3776维,可以看出,使用等价模式特征,其特征向量的维度大大减少,这意味着使用机器学习方法进行学习的时间将大大减少,而性能上没有受到很大影响。
基本思想
建立在LBPH基础上的人脸识别法基本思想如下:首先以每个像素为中心,判断与周围像素灰度值大小关系,对其进行二进制编码,从而获得整幅图像的LBP编码图像;再将LBP图像分为个区域,获取每个区域的LBP编码直方图,继而得到整幅图像的LBP编码直方图,通过比较不同人脸图像LBP编码直方图达到人脸识别的目的,其优点是不会受到光照、缩放、旋转和平移的影响。
LBPH算法“人”如其名,采用的识别方法是局部特征提取的方法,这是与前两种方法的最大区别。
LBPH 算法流程
LBP特征提取:根据上述的均匀LBP算子处理原始图像;
LBP特征匹配(计算直方图):将图像分为若干个的子区域,并在子区域内根据LBP值统计其直方图,以直方图作为其判别特征。
4、算法的复现代码
1)、EigenFaces算法
#encoding=utf-8
import numpy as np
import cv2
import os
class EigenFace(object):
def __init__(self,threshold,dimNum,dsize):
selfthreshold = threshold # 阈值暂未使用
selfdimNum = dimNum
selfdsize = dsize
def loadImg(self,fileName,dsize):
‘‘‘
载入图像,灰度化处理,统一尺寸,直方图均衡化
:param fileName: 图像文件名
:param dsize: 统一尺寸大小。元组形式
:return: 图像矩阵
‘‘‘
img = cv2imread(fileName)
retImg = cv2resize(img,dsize)
retImg = cv2cvtColor(retImg,cv2COLOR_RGB2GRAY)
retImg = cv2equalizeHist(retImg)
# cv2imshow(‘img’,retImg)
# cv2waitKey()
return retImg
def createImgMat(self,dirName):
‘‘‘
生成图像样本矩阵,组织形式为行为属性,列为样本
:param dirName: 包含训练数据集的图像文件夹路径
:return: 样本矩阵,标签矩阵
‘‘‘
dataMat = npzeros((10,1))
label = []
for parent,dirnames,filenames in oswalk(dirName):
# print parent
# print dirnames
# print filenames
index = 0
for dirname in dirnames:
for subParent,subDirName,subFilenames in oswalk(parent+’/’+dirname):
for filename in subFilenames:
img = selfloadImg(subParent+’/’+filename,selfdsize)
tempImg = npreshape(img,(-1,1))
if index == 0 :
dataMat = tempImg
else:
dataMat = npcolumn_stack((dataMat,tempImg))
labelappend(subParent+’/’+filename)
index += 1
return dataMat,label
def PCA(self,dataMat,dimNum):
‘‘‘
PCA函数,用于数据降维
:param dataMat: 样本矩阵
:param dimNum: 降维后的目标维度
:return: 降维后的样本矩阵和变换矩阵
‘‘‘
# 均值化矩阵
meanMat = npmat(npmean(dataMat,1))T
print ‘平均值矩阵维度’,meanMatshape
diffMat = dataMat-meanMat
# 求协方差矩阵,由于样本维度远远大于样本数目,所以不直接求协方差矩阵,采用下面的方法
covMat = (diffMatTdiffMat)/float(diffMatshape[1]) # 归一化
#covMat2 = npcov(dataMat,bias=True)
#print ‘基本方法计算协方差矩阵为’,covMat2
print ‘协方差矩阵维度’,covMatshape
eigVals, eigVects = nplinalgeig(npmat(covMat))
print ‘特征向量维度’,eigVectsshape
print ‘特征值’,eigVals
eigVects = diffMateigVects
eigValInd = npargsort(eigVals)
eigValInd = eigValInd[::-1]
eigValInd = eigValInd[:dimNum] # 取出指定个数的前n大的特征值
print ‘选取的特征值’,eigValInd
eigVects = eigVects/nplinalgnorm(eigVects,axis=0) #归一化特征向量
redEigVects = eigVects[:,eigValInd]
print ‘选取的特征向量’,redEigVectsshape
print ‘均值矩阵维度’,diffMatshape
lowMat = redEigVectsTdiffMat
print ‘低维矩阵维度’,lowMatshape
return lowMat,redEigVects
def compare(self,dataMat,testImg,label):
‘‘‘
比较函数,这里只是用了最简单的欧氏距离比较,还可以使用KNN等方法,如需修改修改此处即可
:param dataMat: 样本矩阵
:param testImg: 测试图像矩阵,最原始形式
:param label: 标签矩阵
:return: 与测试最相近的图像文件名
‘‘‘
testImg = cv2resize(testImg,selfdsize)
testImg = cv2cvtColor(testImg,cv2COLOR_RGB2GRAY)
testImg = npreshape(testImg,(-1,1))
lowMat,redVects = selfPCA(dataMat,selfdimNum)
testImg = redVectsTtestImg
print ‘检测样本变换后的维度’,testImgshape
disList = []
testVec = npreshape(testImg,(1,-1))
for sample in lowMatT:
disListappend(nplinalgnorm(testVec-sample))
print disList
sortIndex = npargsort(disList)
return label[sortIndex[0]]
def predict(self,dirName,testFileName):
‘‘‘
预测函数
:param dirName: 包含训练数据集的文件夹路径
:param testFileName: 测试图像文件名
:return: 预测结果
‘‘‘
testImg = cv2imread(testFileName)
dataMat,label = selfcreateImgMat(dirName)
print ‘加载标签’,label
ans = selfcompare(dataMat,testImg,label)
return ans
if __name__ == ‘__main__’:
eigenface = EigenFace(20,50,(50,50))
print eigenfacepredict(‘d:/face’,’D:/face_test/1bmp’)2)、FisherFaces算法
#encoding=utf-8
import numpy as np
import cv2
import os
class FisherFace(object):
def __init__(self,threshold,k,dsize):
selfthreshold = threshold # 阈值,暂未使用
selfk = k # 指定投影w的个数
selfdsize = dsize # 统一尺寸大小
def loadImg(self,fileName,dsize):
‘‘‘
载入图像,灰度化处理,统一尺寸,直方图均衡化
:param fileName: 图像文件名
:param dsize: 统一尺寸大小。元组形式
:return: 图像矩阵
‘‘‘
img = cv2imread(fileName)
retImg = cv2resize(img,dsize)
retImg = cv2cvtColor(retImg,cv2COLOR_RGB2GRAY)
retImg = cv2equalizeHist(retImg)
# cv2imshow(‘img’,retImg)
# cv2waitKey()
return retImg
def createImgMat(self,dirName):
‘‘‘
生成图像样本矩阵,组织形式为行为属性,列为样本
:param dirName: 包含训练数据集的图像文件夹路径
:return: 包含样本矩阵的列表,标签列表
‘‘‘
dataMat = npzeros((10,1))
label = []
dataList = []
for parent,dirnames,filenames in oswalk(dirName):
# print parent
# print dirnames
# print filenames
#index = 0
for dirname in dirnames:
for subParent,subDirName,subFilenames in oswalk(parent+’/’+dirname):
for index,filename in enumerate(subFilenames):
img = selfloadImg(subParent+’/’+filename,selfdsize)
tempImg = npreshape(img,(-1,1))
if index == 0 :
dataMat = tempImg
else:
dataMat = npcolumn_stack((dataMat,tempImg))
dataListappend(dataMat)
labelappend(subParent)
return dataList,label
def LDA(self,dataList,k):
‘‘‘
多分类问题的线性判别分析算法
:param dataList: 样本矩阵列表
:param k: 投影向量k的个数
:return: 变换后的矩阵列表和变换矩阵
‘‘‘
n = dataList[0]shape[0]
W = npzeros((n,selfk))
Sw = npzeros((n,n))
Sb = npzeros((n,n))
u = npzeros((n,1))
N = 0
meanList = []
sampleNum = []
for dataMat in dataList:
meanMat = npmat(npmean(dataMat,1))T
meanListappend(meanMat)
sampleNumappend(dataMatshape[1])
dataMat = dataMat-meanMat
sw = dataMatdataMatT
Sw += sw
print ‘Sw的维度’,Swshape
for index,meanMat in enumerate(meanList):
m = sampleNum[index]
u += mmeanMat
N += m
u = u/N
print ‘u的维度’,ushape
for index,meanMat in enumerate(meanList):
m = sampleNum[index]
sb = m(meanMat-u)(meanMat-u)T
Sb += sb
print ‘Sb的维度’,Sbshape
eigVals, eigVects = nplinalgeig(npmat(nplinalginv(Sw)Sb))
eigValInd = npargsort(eigVals)
eigValInd = eigValInd[::-1]
eigValInd = eigValInd[:k] # 取出指定个数的前k大的特征值
print ‘选取的特征值’,eigValIndshape
eigVects = eigVects/nplinalgnorm(eigVects,axis=0) #归一化特征向量
redEigVects = eigVects[:,eigValInd]
print ‘变换矩阵维度’,redEigVectsshape
transMatList = []
for dataMat in dataList:
transMatListappend(redEigVectsTdataMat)
return transMatList,redEigVects
def compare(self,dataList,testImg,label):
‘‘‘
比较函数,这里只是用了最简单的欧氏距离比较,还可以使用KNN等方法,如需修改修改此处即可
:param dataList: 样本矩阵列表
:param testImg: 测试图像矩阵,最原始形式
:param label: 标签矩阵
:return: 与测试最相近的图像文件夹,也就是类别
‘‘‘
testImg = cv2resize(testImg,selfdsize)
testImg = cv2cvtColor(testImg,cv2COLOR_RGB2GRAY)
testImg = npreshape(testImg,(-1,1))
transMatList,redVects = fisherfaceLDA(dataList,selfk)
testImg = redVectsTtestImg
print ‘检测样本变换后的维度’,testImgshape
disList = []
testVec = npreshape(testImg,(1,-1))
sumVec = npmat(npzeros((selfdsize[0]selfdsize[1],1)))
for transMat in transMatList:
for sample in transMatT:
disListappend( nplinalgnorm(testVec-sample))
print disList
sortIndex = npargsort(disList)
return label[sortIndex[0]/9]
def predict(self,dirName,testFileName):
‘‘‘
预测函数
:param dirName: 包含训练数据集的文件夹路径
:param testFileName: 测试图像文件名
:return: 预测结果
‘‘‘
testImg = cv2imread(testFileName)
dataMat,label = selfcreateImgMat(dirName)
print ‘加载标签’,label
ans = selfcompare(dataMat,testImg,label)
return ans
if __name__==“__main__”:
fisherface = FisherFace(10,20,(20,20))
ans = fisherfacepredict(‘d:/face’,’d:/face_test/8bmp’)
print ans3)、LBPH算法
#encoding=utf-8
import numpy as np
import os
import cv2
class LBP(object):
def __init__(self,threshold,dsize,blockNum):
selfdsize = dsize # 统一尺寸大小
selfblockNum = blockNum # 分割块数目
selfthreshold = threshold # 阈值,暂未使用
def loadImg(self,fileName,dsize):
‘‘‘
载入图像,灰度化处理,统一尺寸,直方图均衡化
:param fileName: 图像文件名
:param dsize: 统一尺寸大小。元组形式
:return: 图像矩阵
‘‘‘
img = cv2imread(fileName)
retImg = cv2resize(img,dsize)
retImg = cv2cvtColor(retImg,cv2COLOR_RGB2GRAY)
retImg = cv2equalizeHist(retImg)
# cv2imshow(‘img’,retImg)
# cv2waitKey()
return retImg
def loadImagesList(self,dirName):
‘‘‘
加载图像矩阵列表
:param dirName:文件夹路径
:return: 包含最原始的图像矩阵的列表和标签矩阵
‘‘‘
imgList = []
label = []
for parent,dirnames,filenames in oswalk(dirName):
# print parent
# print dirnames
# print filenames
for dirname in dirnames:
for subParent,subDirName,subFilenames in oswalk(parent+’/’+dirname):
for filename in subFilenames:
img = selfloadImg(subParent+’/’+filename,selfdsize)
imgListappend(img) # 原始图像矩阵不做任何处理,直接加入列表
labelappend(subParent+’/’+filename)
return imgList,label
def getHopCounter(self,num):
‘‘‘
计算二进制序列是否只变化两次
:param num: 数字
:return: 01变化次数
‘‘‘
binNum = bin(num)
binStr = str(binNum)[2:]
n = len(binStr)
if n = center)(1扩展知识:人脸识别算法研究的难点
人脸识别算法研究已久,在背景简单的情形下,大部分算法都能很好的处理。但是,人脸识别的应用范围颇广,仅是简单图像测试,是远远不能满足现实需求的。所以人脸识别算法还是存在很多的难点。
光照
光照问题是机器视觉中的老问题,在人脸识别中的表现尤为明显,算法未能达到使用的程度。
姿态
与光照问题类似,姿态问题也是人脸识别研究中需要解决的一个技术难点。针对姿态的研究相对比较少,多数的人脸识别算法主要是针对正面,或接近正面的人脸图像,当发生俯仰或者左右侧而比较厉害的情况下,人脸识别算法的识别率也将会急剧下降。
遮挡
对于非配合情况下的人脸图像采集,遮挡问题是一个非常严重的问题,特别是在监控环境下,往往被监控对象都会带着眼镜﹑帽子等饰物,使得被采集出来的人脸图像有可能不完整,从而影响了后面的特征提取与识别,甚至会导致人脸识别算法的失效。
年龄变化
随着年龄的变化,面部外观也在变化,特别是对于青少年,这种变化更加的明显。对于不同的年龄段,人脸识别算法的识别率也不同。
图像质量
人脸图像的来源可能多种多样,由于采集设备的不同,得到的人脸图像质量也不同,特别是对于那些低分辨率﹑噪声大﹑质量差的人脸图像如何进行有效的人脸识别是个需要关注的问题。同样的,对于高分辨图像,对人脸识别算法的影响也需要进一步研究。
样本缺乏
基于统计学习的人脸识别算法是人脸识别领域中的主流算法,但是统计学习方法需要大量的培训。由于人脸图像在高维空间中的分布是一个不规则的流行分布,能得到的样本只是对人脸图像空间中的一个极小部分的采样,如何解决小样本下的统计学习问题有待进一步的研究。
大量数据
传统人脸识别算法如PCA、LDA等在小规模数据中可以很容易进行训练学习。但是对于大量数据,这些方法其训练过程难以进行,甚至有可能崩溃。
大规模人脸识别
随着人脸数据库规模的增长,人脸算法的性能将呈现下降。
结合自身的学习、面试经验做了一个整理,对于新手来说,掌握以下知识/技能,就足以找到一份初阶的数据分析师(注意,不是数据专员,这两者是有区别的,找工作的小伙伴切记仔细分辨)的工作:
1、统计基础;
2、分析理论
3、Excel
4、SQL
5、R
6、Python
仅仅知道要学什么是不够的,还需要知道学到什么程度才是合适的,这其实才是广大新手村小伙伴最大的困惑!按照笔者的看法,以上每项技能/知识应当掌握的程度如下:
我把每个技能的熟练程度划分为5个等级,依次分别是:1、了解基本概念;2、知道基本理论/会简单 *** 作;3、熟知原理/熟练 *** 作;4、数学、逻辑论证/灵活应用;5、精通、专家/能改进、优化。对于入门者来说,上面这几个知识领域大多只需要掌握2-3的熟练程度即可。
统计基础是每个人都必须掌握的,自然是学的越深入越好,不过对于基础比较差的伙伴来说,也不必太过苛求,大约掌握信息图形化、条件概率、贝叶斯公式、相关与独立、几何分布、二项分布、泊松分布、正态分布、统计抽样、估计、置信区间、假设检验这些,就差不多了。《深入浅出统计学》是一本不错的入门书,但是仅有这一本是不够的,请务必找一本更具严谨性和系统性的教材结合使用。
分析理论也是个绕不开的问题,尤其对于很多自学的伙伴来说,这一块可能比较容易疏忽。笔者作为新手,对这部分内容其实也不熟悉,能给出的建议不多。
大多数企业的内部数据存储在传统的关系型数据库中,作为分析师不可避免的要和数据库打交道,那么SQL是数据分析必备的技能了。好在SQL语言本身非常的简单易学。笔者认为只要会写简单的查询、存储过程就可以了,推荐大家买一本《SQL必知必会》放在手边,随时翻看。
R语言和Python语言应该是当前数据分析领域的双雄了,R语言支持者众多,相关库包极为丰富;Python则胜在灵活易用,通用性更加广泛。在网上,关于这两种语言的争论也从未止息。笔者建议初学者要对这两种语言都有所了解,但选择其中一项作为自己的主力语言。对于R语言来说,学会其命令行用法、掌握基本的数据分析库包(tidyr,dplyr,ggplot2)即可;对于Python语言,需要掌握其基本语法、函数和相关库包(numpy, pandas, matplotlib, sklearn)。
可能很多伙伴经过一段时间学习以后,会对Excel这样一个工具不屑一顾,认为这是个非常低端的工具,完全不如R或者Python一般酷炫。但其实完全不该有此想法。笔者曾爬取拉钩网上数据分析这个岗位的信息并做过统计分析,在整个就业市场上,数据分析岗位对Excel技能的需求量非常之大。
除了SQL之外,Excel是数据分析岗位要求频率最高的技能。好在,这个神器其实是非常简单易学的,并且网络上存在海量的各种教程和教材,随处可得。笔者认为只要学会常见函数的使用、各类基础图表的制作以及数据透视就能满足大部分需求。推荐大家买一本《谁说菜鸟不懂数据分析》放在手边,学习疲惫之余拿出来当故事书看看。
机器学习这一块其实应该算是数据分析岗位的加分项,不一定是必须的,看具体岗位。但是现在越来越多公司的数据分析岗要求对机器学习有一定的认知,笔者认为,关于机器学习算法,能够熟悉常见算法的基本原理、了解其用途和优缺点即可。比如:分类算法里的贝叶斯、决策树、随机森林;回归算法里的线性回归、Adaboost回归;聚类算法里的K-means算法等。另外了解一下用于降维的PCA等。
每个人的情况不同,每个岗位的情况需求也不同,大家还是需要根据自己的实际情况来认真思考,安排好自己的学习方向和计划。
基于特征脸(PCA)的人脸识别方法
特征脸方法是基于KL变换的人脸识别方法,KL变换是图像压缩的一种最优正交变换。高维的图像空间经过KL变换后得到一组新的正交基,保留其中重要的正交基,由这些基可以张成低维线性空间。如果假设人脸在这些低维线性空间的投影具有可分性,就可以将这些投影用作识别的特征矢量,这就是特征脸方法的基本思想。这些方法需要较多的训练样本,而且完全是基于图像灰度的统计特性的。目前有一些改进型的特征脸方法。
比如人脸灰度照片40x40=1600个像素点,用每个像素的灰度值组成的矩阵代表这个人的人脸。那么这个人人脸就要1600 个特征。拿一堆这样的样本过来做pca,抽取得到的只是在统计意义下能代表某个样本的几个特征。
人脸识别可以采用神经网 络深度学习的思路,国内的ColorReco在这边有比较多的案例。
一, 生物信息学发展简介
生物信息学是建立在分子生物学的基础上的,因此,要了解生物信息学,就
必须先对分子生物学的发展有一个简单的了解研究生物细胞的生物大分子的结
构与功能很早就已经开始,1866年孟德尔从实验上提出了假设:基因是以生物
成分存在[1],1871年Miescher从死的白细胞核中分离出脱氧核糖核酸(DNA),
在Avery和McCarty于1944年证明了DNA是生命器官的遗传物质以前,人们
仍然认为染色体蛋白质携带基因,而DNA是一个次要的角色
1944年Chargaff发现了著名的Chargaff规律,即DNA中鸟嘌呤的量与胞嘧
定的量总是相等,腺嘌呤与胸腺嘧啶的量相等与此同时,Wilkins与Franklin
用X射线衍射技术测定了DNA纤维的结构1953年James Watson 和Francis
Crick在Nature杂志上推测出DNA的三维结构(双螺旋)DNA以磷酸糖链形
成发双股螺旋,脱氧核糖上的碱基按Chargaff规律构成双股磷酸糖链之间的碱基
对这个模型表明DNA具有自身互补的结构,根据碱基对原则,DNA中贮存的
遗传信息可以精确地进行复制他们的理论奠定了分子生物学的基础
DNA双螺旋模型已经预示出了DNA复制的规则,Kornberg于1956年从大
肠杆菌(Ecoli)中分离出DNA聚合酶I(DNA polymerase I),能使4种dNTP连接
成DNADNA的复制需要一个DNA作为模板Meselson与Stahl(1958)用实验
方法证明了DNA复制是一种半保留复制Crick于1954年提出了遗传信息传递
的规律,DNA是合成RNA的模板,RNA又是合成蛋白质的模板,称之为中心
法则(Central dogma),这一中心法则对以后分子生物学和生物信息学的发展都起
到了极其重要的指导作用
经过Nirenberg和Matthai(1963)的努力研究,编码20氨基酸的遗传密码
得到了破译限制性内切酶的发现和重组DNA的克隆(clone)奠定了基因工程
的技术基础
正是由于分子生物学的研究对生命科学的发展有巨大的推动作用,生物信息
学的出现也就成了一种必然
2001年2月,人类基因组工程测序的完成,使生物信息学走向了一个高潮
由于DNA自动测序技术的快速发展,DNA数据库中的核酸序列公共数据量以每
天106bp速度增长,生物信息迅速地膨胀成数据的海洋毫无疑问,我们正从一
个积累数据向解释数据的时代转变,数据量的巨大积累往往蕴含着潜在突破性发
现的可能,"生物信息学"正是从这一前提产生的交叉学科粗略地说,该领域
的核心内容是研究如何通过对DNA序列的统计计算分析,更加深入地理解DNA
序列,结构,演化及其与生物功能之间的关系,其研究课题涉及到分子生物学,
分子演化及结构生物学,统计学及计算机科学等许多领域
生物信息学是内涵非常丰富的学科,其核心是基因组信息学,包括基因组信
息的获取,处理,存储,分配和解释基因组信息学的关键是"读懂"基因组的核
苷酸顺序,即全部基因在染色体上的确切位置以及各DNA片段的功能;同时在
发现了新基因信息之后进行蛋白质空间结构模拟和预测,然后依据特定蛋白质的
功能进行药物设计[2]了解基因表达的调控机理也是生物信息学的重要内容,根
据生物分子在基因调控中的作用,描述人类疾病的诊断,治疗内在规律它的研
究目标是揭示"基因组信息结构的复杂性及遗传语言的根本规律",解释生命的遗
传语言生物信息学已成为整个生命科学发展的重要组成部分,成为生命科学研
究的前沿
二, 生物信息学的主要研究方向
生物信息学在短短十几年间,已经形成了多个研究方向,以下简要介绍一些
主要的研究重点
1,序列比对(Sequence Alignment)
序列比对的基本问题是比较两个或两个以上符号序列的相似性或不相似
性从生物学的初衷来看,这一问题包含了以下几个意义[3]:
从相互重叠的序列片断中重构DNA的完整序列
在各种试验条件下从探测数据(probe data)中决定物理和基因图
存贮,遍历和比较数据库中的DNA序列
比较两个或多个序列的相似性
在数据库中搜索相关序列和子序列
寻找核苷酸(nucleotides)的连续产生模式
找出蛋白质和DNA序列中的信息成分
序列比对考虑了DNA序列的生物学特性,如序列局部发生的插入,删除(前
两种简称为indel)和替代,序列的目标函数获得序列之间突变集最小距离加权
和或最大相似性和,对齐的方法包括全局对齐,局部对齐,代沟惩罚等两个
序列比对常采用动态规划算法,这种算法在序列长度较小时适用,然而对于海
量基因序列(如人的DNA序列高达109bp),这一方法就不太适用,甚至采用算
法复杂性为线性的也难以奏效因此,启发式方法的引入势在必然,著名的
BALST和FASTA算法及相应的改进方法均是从此前提出发的
2, 蛋白质结构比对和预测
基本问题是比较两个或两个以上蛋白质分子空间结构的相似性或不相似性
蛋白质的结构与功能是密切相关的,一般认为,具有相似功能的蛋白质结构一般
相似蛋白质是由氨基酸组成的长链,长度从50到1000~3000AA(Amino Acids),
蛋白质具有多种功能,如酶,物质的存贮和运输,信号传递,抗体等等氨基酸
的序列内在的决定了蛋白质的3维结构一般认为,蛋白质有四级不同的结构
研究蛋白质结构和预测的理由是:医药上可以理解生物的功能,寻找docking
drugs的目标,农业上获得更好的农作物的基因工程,工业上有利用酶的合成
直接对蛋白质结构进行比对的原因是由于蛋白质的3维结构比其一级结构
在进化中更稳定的保留,同时也包含了较AA序列更多的信息
蛋白质3维结构研究的前提假设是内在的氨基酸序列与3维结构一一对应
(不一定全真),物理上可用最小能量来解释
从观察和总结已知结构的蛋白质结构规律出发来预测未知蛋白质的结构同
源建模(homology modeling)和指认(Threading)方法属于这一范畴同源建模用
于寻找具有高度相似性的蛋白质结构(超过30%氨基酸相同),后者则用于比较
进化族中不同的蛋白质结构
然而,蛋白结构预测研究现状还远远不能满足实际需要
3, 基因识别,非编码区分析研究
基因识别的基本问题是给定基因组序列后,正确识别基因的范围和在基因组
序列中的精确位置非编码区由内含子组成(introns),一般在形成蛋白质后被丢
弃,但从实验中,如果去除非编码区,又不能完成基因的复制显然,DNA序
列作为一种遗传语言,既包含在编码区,又隐含在非编码序列中分析非编码
区DNA序列目前没有一般性的指导方法
在人类基因组中,并非所有的序列均被编码,即是某种蛋白质的模板,已
完成编码部分仅占人类基因总序列的3~5%,显然,手工的搜索如此大的基因序
列是难以想象的
侦测密码区的方法包括测量密码区密码子(codon)的频率,一阶和二阶马尔
可夫链,ORF(Open Reading Frames),启动子(promoter)识别,HMM(Hidden
Markov Model)和GENSCAN,Splice Alignment等等
4, 分子进化和比较基因组学
分子进化是利用不同物种中同一基因序列的异同来研究生物的进化,构建进
化树既可以用DNA序列也可以用其编码的氨基酸序列来做,甚至于可通过相
关蛋白质的结构比对来研究分子进化,其前提假定是相似种族在基因上具有相似
性通过比较可以在基因组层面上发现哪些是不同种族中共同的,哪些是不同的
早期研究方法常采用外在的因素,如大小,肤色,肢体的数量等等作为进化
的依据近年来较多模式生物基因组测序任务的完成,人们可从整个基因组的角
度来研究分子进化在匹配不同种族的基因时,一般须处理三种情况:
Orthologous: 不同种族,相同功能的基因
Paralogous: 相同种族,不同功能的基因
Xenologs: 有机体间采用其他方式传递的基因,如被病毒注入的基因
这一领域常采用的方法是构造进化树,通过基于特征(即DNA序列或蛋白
质中的氨基酸的碱基的特定位置)和基于距离(对齐的分数)的方法和一些传统
的聚类方法(如UPGMA)来实现
5, 序列重叠群(Contigs)装配
根据现行的测序技术,每次反应只能测出500 或更多一些碱基对的序列,
如人类基因的测量就采用了短q(shortgun)方法,这就要求把大量的较短的序列
全体构成了重叠群(Contigs)逐步把它们拼接起来形成序列更长的重叠群,直
至得到完整序列的过程称为重叠群装配从算法层次来看,序列的重叠群是一个
NP-完全问题
6, 遗传密码的起源
通常对遗传密码的研究认为,密码子与氨基酸之间的关系是生物进化历史上
一次偶然的事件而造成的,并被固定在现代生物的共同祖先里,一直延续至今
不同于这种"冻结"理论,有人曾分别提出过选择优化,化学和历史等三种学说
来解释遗传密码随着各种生物基因组测序任务的完成,为研究遗传密码的起源
和检验上述理论的真伪提供了新的素材
7, 基于结构的药物设计
人类基因工程的目的之一是要了解人体内约10万种蛋白质的结构,功能,
相互作用以及与各种人类疾病之间的关系,寻求各种治疗和预防方法,包括药物
治疗基于生物大分子结构及小分子结构的药物设计是生物信息学中的极为重要
的研究领域为了抑制某些酶或蛋白质的活性,在已知其蛋白质3级结构的基础
上,可以利用分子对齐算法,在计算机上设计抑制剂分子,作为候选药物这一
领域目的是发现新的基因药物,有着巨大的经济效益
8, 其他
如基因表达谱分析,代谢网络分析;基因芯片设计和蛋白质组学数据分析等,
逐渐成为生物信息学中新兴的重要研究领域;在学科方面,由生物信息学衍生的
学科包括结构基因组学,功能基因组学,比较基因组学,蛋白质学,药物基因组
学,中药基因组学,肿瘤基因组学,分子流行病学和环境基因组学
从现在的发展不难看出,基因工程已经进入了后基因组时代我们也有应对
与生物信息学密切相关的如机器学习,和数学中可能存在的误导有一个清楚的认
识
三, 生物信息学与机器学习
生物信息的大规模给数据挖掘提出了新课题和挑战,需要新的思想的加入
常规的计算机算法仍可以应用于生物数据分析中,但越来越不适用于序列分析问
题究竟原因,是由于生物系统本质上的模型复杂性及缺乏在分子层上建立的完
备的生命组织理论
西蒙曾给出学习的定义:学习是系统的变化,这种变化可使系统做相同工作
时更有效[4]机器学习的目的是期望能从数据中自动地获得相应的理论,通过采
用如推理,模型拟合及从样本中学习,尤其适用于缺乏一般性的理论,"噪声"
模式,及大规模数据集因此,机器学习形成了与常规方法互补的可行的方法
机器学习使得利用计算机从海量的生物信息中提取有用知识,发现知识成为可能
[5]
机器学习方法在大样本,多向量的数据分析工作中发挥着日益重要的作用,
而目前大量的基因数据库处理需要计算机能自动识别,标注,以避免即耗时又花
费巨大的人工处理方法早期的科学方法—观测和假设----面对高数据的体积,
快速的数据获取率和客观分析的要求---已经不能仅依赖于人的感知来处理了因
而,生物信息学与机器学习相结合也就成了必然
机器学习中最基本的理论框架是建立在概率基础上的,从某种意义来说,是
统计模型拟合的延续,其目的均为提取有用信息机器学习与模式识别和统计推
理密切相关学习方法包括数据聚类,神经网络分类器和非线性回归等等隐马
尔可夫模型也广泛用于预测DNA的基因结构目前研究重心包括:1)观测和
探索有趣的现象目前ML研究的焦点是如何可视化和探索高维向量数据一般
的方法是将其约简至低维空间,如常规的主成分分析(PCA),核主成分分析
(KPCA),独立成分分析(Independent component analysis),局部线性嵌套(Locally
Linear embedding)2)生成假设和形式化模型来解释现象[6]大多数聚类方法可
看成是拟合向量数据至某种简单分布的混合在生物信息学中聚类方法已经用于
microarray数据分析中,癌症类型分类及其他方向中机器学习也用于从基因数
据库中获得相应的现象解释
机器学习加速了生物信息学的进展,也带了相应的问题机器学习方法大多
假定数据符合某种相对固定的模型,而一般数据结构通常是可变的,在生物信息
学中尤其如此,因此,有必要建立一套不依赖于假定数据结构的一般性方法来寻
找数据集的内在结构其次,机器学习方法中常采用"黑箱" *** 作,如神经网络
和隐马尔可夫模型,对于获得特定解的内在机理仍不清楚
四, 生物信息学的数学问题
生物信息学中数学占了很大的比重统计学,包括多元统计学,是生物信息
学的数学基础之一;概率论与随机过程理论,如近年来兴起的隐马尔科夫链模型
(HMM),在生物信息学中有重要应用;其他如用于序列比对的运筹学;蛋白质
空间结构预测和分子对接研究中采用的最优化理论;研究DNA超螺旋结构的拓
扑学;研究遗传密码和DNA序列的对称性方面的群论等等总之,各种数学理
论或多或少在生物学研究中起到了相应的作用
但并非所有的数学方法在引入生物信息学中都能普遍成立的,以下以统计学
和度量空间为例来说明
1, 统计学的悖论
数学的发展是伴随悖论而发展的对于进化树研究和聚类研究中最显著的悖
论莫过于均值了,如图1:
图1 两组同心圆的数据集
图1是两组同心圆构成的数据集,显然,两组数据集的均值均在圆点,这也
就说明了要采用常规的均值方法不能将这两类分开,也表明均值并不能带来更多
的数据的几何性质那么,如果数据呈现类似的特有分布时,常有的进化树算法
和聚类算法(如K-均值)往往会得错误的结论统计上存在的陷阱往往是由于
对数据的结构缺乏一般性认识而产生的
2, 度量空间的假设
在生物信息学中,进化树的确立,基因的聚类等都需要引入度量的概念举
例来说,距离上相近或具有相似性的基因等具有相同的功能,在进化树中满足分
值最小的具有相同的父系,这一度量空间的前提假设是度量在全局意义下成立
那么,是否这种前提假设具有普适性呢
我们不妨给出一般的描述:假定两个向量为A,B,其中,
,则在假定且满足维数间线性无关的前提下,两个
向量的度量可定义为:
(1)
依据上式可以得到满足正交不变运动群的欧氏度量空间,这也是大多数生物信息
学中常采用的一般性描述,即假定了变量间线性无关
然而,这种假设一般不能正确描述度量的性质,尤其在高维数据集时,不考
虑数据变量间的非线性相关性显然存在问题,由此,我们可以认为,一个正确的
度量公式可由下式给出:
(2)
上式中采用了爱因斯坦和式约定,描述了变量间的度量关系后者在满足
(3)
时等价于(1),因而是更一般的描述,然而问题在于如何准确描述变量间的非线
性相关性,我们正在研究这个问题
五, 几种统计学习理论在生物信息学中应用的困难
生物信息学中面对的数据量和数据库都是规模很大的,而相对的目标函数却
一般难以给出明确的定义生物信息学面临的这种困难,可以描述成问题规模的
巨大以及问题定义的病态性之间的矛盾,一般从数学上来看,引入某个正则项来
改善性能是必然的[7]以下对基于这一思想产生的统计学习理论[8],Kolmogorov
复杂性[98]和BIC(Bayesian Information Criterion)[109]及其存在的问题给出简要介
绍
支持向量机(SVM)是近来较热门的一种方法,其研究背景是Vapnik的统计
学习理论,是通过最大化两个数据集的最大间隔来实现分类,对于非线性问题则
采用核函数将数据集映射至高维空间而又无需显式描述数据集在高维空间的性
质,这一方法较之神经方法的好处在于将神经网络隐层的参数选择简化为对核函
数的选择,因此,受到广泛的注意在生物信息学中也开始受到重视,然而,核
函数的选择问题本身是一个相当困难的问题,从这个层次来看,最优核函数的选
择可能只是一种理想,SVM也有可能象神经网络一样只是机器学习研究进程中
又一个大气泡
Kolmogorov复杂性思想与统计学习理论思想分别从不同的角度描述了学习
的性质,前者从编码的角度,后者基于有限样本来获得一致收敛性Kolmogorov
复杂性是不可计算的,因此由此衍生了MDL原则(最小描述长度),其最初只
适用于离散数据,最近已经推广至连续数据集中,试图从编码角度获得对模型参
数的最小描述其缺陷在于建模的复杂性过高,导致在大数据集中难以运用
BIC准则从模型复杂性角度来考虑,BIC准则对模型复杂度较高的给予大的
惩罚,反之,惩罚则小,隐式地体现了奥卡姆剃刀("Occam Razor")原理,近
年也广泛应用于生物信息学中BIC准则的主要局限是对参数模型的假定和先验
的选择的敏感性,在数据量较大时处理较慢因此,在这一方面仍然有许多探索
的空间
六, 讨论与总结
人类对基因的认识,从以往的对单个基因的了解,上升到在整个基因组水平
上考察基因的组织结构和信息结构,考察基因之间在位置,结构和功能上的相互
关系这就要求生物信息学在一些基本的思路上要做本质的观念转变,本节就这
些问题做出探讨和思索
启发式方法:
Simond在人类的认知一书中指出,人在解决问题时,一般并不去寻找最优
的方法,而只要求找到一个满意的方法因为即使是解决最简单的问题,要想得
到次数最少,效能最高的解决方法也是非常困难的最优方法和满意方法之间的
困难程度相差很大,后者不依赖于问题的空间,不需要进行全部搜索,而只要能
达到解决的程度就可以了正如前所述,面对大规模的序列和蛋白质结构数据集,
要获得全局结果,往往是即使算法复杂度为线性时也不能够得到好的结果,因此,
要通过变换解空间或不依赖于问题的解空间获得满意解,生物信息学仍需要人工
智能和认知科学对人脑的进一步认识,并从中得到更好的启发式方法
问题规模不同的处理:
Marvin Minsky在人工智能研究中曾指出:小规模数据量的处理向大规模数
据量推广时,往往并非算法上的改进能做到的,更多的是要做本质性的变化这
好比一个人爬树,每天都可以爬高一些,但要想爬到月球,就必须采用其他方法
一样在分子生物学中,传统的实验方法已不适应处理飞速增长的海量数据同
样,在采用计算机处理上,也并非依靠原有的计算机算法就能够解决现有的数据
挖掘问题如在序列对齐(sequence Alignment)问题上,在小规模数据中可以采用
动态规划,而在大规模序列对齐时不得不引入启发式方法,如BALST,FASTA
乐观中的隐扰
生物信息学是一门新兴学科,起步于20世纪90年代,至今已进入"后基因
组时代",目前在这一领域的研究人员均呈普遍乐观态度,那么,是否存在潜在
的隐扰呢
不妨回顾一下早期人工智能的发展史[11],在1960年左右,西蒙曾相信不出
十年,人类即可象完成登月一样完成对人的模拟,造出一个与人智能行为完全相
同的机器人而至今为止,这一诺言仍然遥遥无期尽管人工智能研究得到的成
果已经渗入到各个领域,但对人的思维行为的了解远未完全明了从本质来看,
这是由于最初人工智能研究上定位错误以及没有从认识论角度看清人工智能的
本质造成的;从研究角度来看,将智能行为还原成一般的形式化语言和规则并不
能完整描述人的行为,期望物理科学的成功同样在人工智能研究中适用并不现
实
反观生物信息学,其目的是期望从基因序列上解开一切生物的基本奥秘,从
结构上获得生命的生理机制,这从哲学上来看是期望从分子层次上解释人类的所
有行为和功能和致病原因这类似于人工智能早期发展中表现的乐观行为,也来
自于早期分子生物学,生物物理和生物化学的成就然而,从本质上来讲,与人
工智能研究相似,都是希望将生命的奥秘还原成孤立的基因序列或单个蛋白质的
功能,而很少强调基因序列或蛋白质组作为一个整体在生命体中的调控作用我
们因此也不得不思考,这种研究的最终结果是否能够支撑我们对生物信息学的乐
观呢 现在说肯定的话也许为时尚早
综上所述,不难看出,生物信息学并不是一个足以乐观的领域,究竟原因,
是由于其是基于分子生物学与多种学科交叉而成的新学科,现有的形势仍表现为
各种学科的简单堆砌,相互之间的联系并不是特别的紧密在处理大规模数据方
面,没有行之有效的一般性方法;而对于大规模数据内在的生成机制也没有完全
明了,这使得生物信息学的研究短期内很难有突破性的结果那么,要得到真正
的解决,最终不能从计算机科学得到,真正地解决可能还是得从生物学自身,从
数学上的新思路来获得本质性的动力
毫无疑问,正如Dulbecco1986年所说:"人类的DNA序列是人类的真谛,
这个世界上发生的一切事情,都与这一序列息息相关"但要完全破译这一序列
以及相关的内容,我们还有相当长的路要走
(来源 ------[InfoBioorg | 生物信息学研讨组])>
以上就是关于全局视觉定位系统研究的意义全部的内容,包括:全局视觉定位系统研究的意义、python常用到哪些库、人脸识别算法是指什么等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)