基于素描对视频的人脸识别--haar分类器详解,haar特征,adaboost,级联强分类器,积分图,DCG

  • 背景
  • 算法总体流程
    • 1.预处理——识别出人脸并将人脸图像标准化
      • haar特征
      • 积分图——加速器
      • adaboost算法——haar分类器的训练系统
      • 筛选式强级联分类器——haar分类器的检测系统
    • 2.图像检索
    • 3.生成视频图像列表
      • 聚类
      • 重排序
      • 融合
    • 5.特征对比
      • 相关度计算
      • 计算 DCG
  • 实验
    • 数据获取
    • 算法验证设计
    • 对照实验结果分析
    • 实验结论

本文为《基于差分量化局部二值模式的人脸反欺诈算法研究》文献阅读笔记,是为了完成作业去阅读的,还要进行总结汇报答辩,所以原文中有些概念流程我没看懂的就被我删了或者改了,此博客只用于个人学习总结,不具备参考价值,文中有错误在所难免,不需要怀疑你原有的知识正确性,要错应该就是我错。再次感谢原文作者的宝贵资料(文献)。
文献链接
这是网盘地址,提取码1111
也可以到知网搜索原文查看。

背景

在公共安全领域寻找人的时候,需要用到目击者口述出的素描信息和各种视频监控中的信息进行对比。对素描的人脸识别一般有两种,把素描合成为图像进行图像之间的对比和把图像合成为素描进行素描之间的对比。但是这两种方式在转化过程中都会导致图像或素描原始信息丢失,所以人们开始通过提取图像和素描的整体特征或局部特征来比较相似度。而在对比素描和视频中的人脸时直接比较帧图像和素描的特征也不那么理想,于是文献中提出将人脸识别问题转换为人脸检索问题,将帧图像与素描图像和数据库中的人脸图像作比较按相似度分别生成帧图像列表和素描图像列表,再将各个帧图像融合生成视频图像列表,最终就能将帧图像与素描图像的比较转换为视频图像列表与素描图像列表之间的比较。该算法识别正确率得到提升。

算法总体流程

整体算法流程如图 1 所示。

1.预处理——识别出人脸并将人脸图像标准化

使用haar分类器将图像中的人脸识别出来然后提取图像中的人脸部分进行图像标准化。haar分类器 = 提取图像中的haar特征 + 运用积分图方法实现特征值加速计算+adaboost算法–haar分类器的训练系统(根据haar特征训练得到弱分类器 + 将弱分类器根据错误率分配权重合成一个强分类器 )+ 筛选式强分类器级联–haar分类器的检测系统(将各个强分类器中的弱分类器个数进行调整然后级联各个强分类器生成级联强分类器进行人脸和非人脸的判别并输出标准化之后的人脸图像)。

haar特征

这个链接是个英文PPT,个人感觉里面的图片介绍可以很好的帮助理解haar特征

参考自此博客
Haar特征值反映了图像的灰度变化情况。Haar(哈尔)特征分为三类:边缘特征、线性特征、中心特征和对角线特征。特征模板内有白色和黑色两种矩形,并定义该模板的特征值为白色矩形像素和减去黑色矩形像素和,如下图:

下图中这些每一个是一个特征模板,称为“特征原型”。
特征原型在图像子窗口中扩展(平移伸缩)得到的特征称为“矩形特征”,如下图就是上图中第一个特征原型线特征经过平移伸缩后位于20*20的窗口左下角特定位置特定大小的一个矩形特征。

下图为两个矩形特征在左下角大小的图像中的表示(也就是说中间的haar矩形特征是位于这样一个图像窗口的中上位置如图所示大小的边缘特征,右边的haar特征是位于这样一个图像窗口的如图中上位置如图所示大小的线特征),因为haar特征反映图像的灰度变化情况,所以中间一幅表示眼睛区域的颜色比脸颊区域的颜色深,右边一幅表示鼻梁的颜色比鼻梁两侧颜色要浅。把这两个矩形特征放到人脸区域计算出来的特征值和放到非人脸区域计算出来的特征值是有差别的,我们希望这个差别越大越好,然后就可以用来区分人脸和非人脸。也就是可以把这个矩形特征的特征值设置一个阈值,然后将其放在同样窗口大小的图片中计算特征值,根据特征值与阈值的比较结果(大于或小于)判定是否是人脸。这个过程就是一个矩形特征对应的弱分类器的原理。

左边组合之后的矩形特征就是一个强分类器(具体在后文中有提到,知识觉得看到这副图应该能有个大概的概念比较有利于理解)

矩形特征可位于图像任意位置,大小也可以任意改变,所以矩形特征值是矩形模版类别、矩形位置和矩形大小这三个因素的函数。就是说将特征模板在检测窗口通过平移和缩放的方式可以产生一系列Haar矩形特征,在24*24像素大小的检测窗口内矩形特征数量可以达到16万个。这些特征由于位置和大小不同,分类效果也不同。需要快速计算这么多的特征值,就需要用到积分图。

积分图——加速器

(申明:我一开始看的时候把内容做成PPT但是没有记下参考博客地址,后来也找不到了,在此对原博客作者表示抱歉和感谢)

积分图就是只遍历一次图像就可以求出图像中所有区域像素和的快速算法,大大的提高了图像特征值计算的效率。如下图,左边为原始图像灰度图的像素值,右边为对应的积分图。

积分图主要的思想是将图像从起点开始到各个点所形成的矩形区域像素之和作为一个数组的元素保存在内存中如下图:
当要计算某个区域的像素和时可以直接索引数组的元素,不用重新计算这个区域的像素和,从而加快了计算(这有个相应的称呼,叫做动态规划算法)。积分图能够在多种尺度下,使用相同的时间(常数时间)来计算不同的特征,因此大大提高了检测速度。

Haar特征值就是两个矩阵像素和的差,同样可以在常数时间内完成。所以矩形特征的特征值计算,只与此特征矩形的端点的积分图有关,所以不管此特征矩形的尺度变换如何,特征值的计算所消耗的时间都是常量。这样只要遍历图像一次,就可以求得所有子窗口的特征值。

还有一个问题就是哪些矩形特征才是对分类器分类最有效的,矩形特征怎么样组合到一块可以更好的区分出人脸和非人脸呢,就需要用到AdaBoost算法。Adaboost算法可以用来更好地选择矩形特征的组合,而这些矩形特征的组合就构成了分类器,分类器以决策树的方式存储这些矩形特征组合。

adaboost算法——haar分类器的训练系统


参考自此博客
弱分类器
有了若干haar特征值后,需要对每一个特征 f ,训练一个弱分类器h(x,f,p,θ) 。

p只是为了固定符号为<符
如果p为1,那么表示这个弱分类器把阈值之前判断为人脸,阈值之后判断为非人脸。
如果p为-1,那么表示这个弱分类器把阈值之后判断为人脸,阈值之前判断为非人脸。

弱分类器的训练过程;

上面步骤我大概理解了一下,就是说,例如,首先计算100个样本(正样本和负样本混杂)的某个haar矩形特征的特征值,然后根据特征值大小将一百个样本排序,选择计算出的某个特征值F(我也不知道啊为啥要选两个特征值之间的数作为阈值,我觉得应该差不多吧,是不是要将每一个特征值作为一次阈值然后计算错误率,选择出错误率最低的阈值)作为阈值。计算出正样本在所有(100个)样本中的比例T+,负样本在所有样本(100个)中的比例T-,还有计算出的特征值小于阈值F的所有样本中正样本占所有样本(100个样本)的比例S+和负样本占所有样本(100个样本)的比例S-。那么,
① S+ +(T- - S-)就是阈值之前的正样本比例+阈值之后的负样本比例;
② S- +(T+ - S+)就是阈值之后的正样本比例+阈值之前的负样本比例。

选择①和②中的最小值:
如果①大于②,分类误差就是错判的②的值,同时选择p=1,表示这个弱分类器把阈值之前判断为人脸,阈值之后判断为非人脸。这样的决定分类误差更小。
如果①小于②,分类误差就是错判的①的值,选择p=-1,表示这个弱分类器把阈值之后判断为人脸,阈值之前判断为非人脸。这样的决定分类误差更小。

最后,选择一个分类误差最小的阈值作为最优阈值就训练出这个haar矩形特征对应的最优弱分类器了。

有一些矩形特征对人脸和非人脸的区分能力很弱,也就是说这个矩形特征无论取哪个阈值判断是否是人脸,都不鞥得到很好的效果,那么这个特征就应该被舍弃。

例如,20×20 子窗口里面共78,460 个矩形特征。从78,460 个矩形特征中随机抽取了两个特征A和B,这两个特征遍历了2,706 个人脸样本(也就是本实验中的正样本)和4,381 个非人脸样本(本实验中的负样本),计算了每张图像对应的特征值,最后将特征值进行了从小到大的排序,并按照这个新的顺序表绘制了分布图。
下图为矩形特征A在人脸样本和非人脸样本中特征值的分布:


可以看出,矩形特征A在人脸样本和非人脸样本中的特征值的分布很相似,也就是说,无论设置阈值为多少,都无法用计算得到的值正确的判断出是人脸还是非人脸。比如若选择0作为阈值,规定小于0为人脸,则若计算得到特征值低于0,此分类器将其判断为了人脸,但实际是有51%左右的概率判断错误。若选-2000作为阈值,同样若计算得到的特征值小于-2000,其将这个图判定为人脸,有41%的概率判断错误。所以它区分人脸和非人脸的能力很差。(计算过程见下文)

下图为矩形特征B在人脸样本和非人脸样本中特征值的分布:


可以看出,计算人脸的矩形特征 B时,特征值基本小于0,而计算非人脸的矩形特征 B时,特征值分布在0的左右两边。比如将0作为阈值,若计算得到特征值小于0,将其判断为人脸,那么,错误率只有38%,也就是说若计算出特征值小于0的话可以粗略判断这是一个人脸图像。所以相对于矩形特征 A而言,矩形特征 B可以更好的实现对人脸分类。

计算过程:

一个弱学习器(一个特征)的要求仅仅是:它能够以稍低于50%的错误率来区分人脸和非人脸图像,因此上面提到只能在某个概率范围内准确地进行区分就已经完全足够。按照这个要求,可以把所有错误率低于50%的矩形特征都找到(适当地选择阈值,对于固定的训练集,几乎所有的矩形特征都可以满足上述要求)。每轮训练,将选取当轮中的最佳弱分类器(在算法中,迭代T 次即是选择T 个最佳弱分类器),最后将每轮得到的最佳弱分类器按照一定方法提升(Boosting)为强分类器。

训练强分类器:
我总结出的结果:
1.确定一个矩形特征f1对应的弱分类器G1(x):

2.有一堆训练样本(有正样本和负样本),初始权重相等(就是一个样本就按一个样本计算),计算出对应的特征值并用G(x)1分出正样本和负样本;
3.根据其判别结果计算分类误差e1:

4.按照分类误差确定该分类器在强分类器中的权值(系数):

5.得到强分类器中的地一个弱分类器及其权重:αG1(x)
6.更新样本权重分布:提高被上一个弱分类器错判为非人脸的样本的比重(类似于一个样本当做两个样本计算?),让下一个弱分类器着重训练它们;
7.确定一个矩形特征f2对应的弱分类器G2(x):

8.计算更新了权重的样本的特征值用弱分类器G2(x)进行判别是否是人脸;
9.根据判定结果计算分类误差;
10.根据分类误差计算弱分类器G2(x)在强分类器中的权重;
11.得到强分类器中的另一个弱分类器及其权重:αG2(x);
12.更新样本权重分布;
循环执行7–12步骤,T轮后得到T个最优弱分类器。
13.将各个弱分类器组合:


14.让所有弱分类器进行加权投票表决的方法得到最终预测输出,计算最终分类错误率,如果最终错误率低于设定阈值(比如5%),那么迭代结束;如果最终错误率高于设定阈值,那么更新数据权重得到下一个弱分类器。

下图左边应该就是将各个弱分类器组合得到的一个强分类器,计算时每个弱分类器是带有各自权重的:

以下为我参考的资料:
参考自此博客
强分类器的诞生需要T轮的迭代,具体操作如下:
1.

  1. 初始化样本权重为1/N,即为训练样本的初始概率分布;
  2. 第一次迭代训练N个样本,得到第一个最优弱分类器;
  3. 提高上一轮中被误判的样本的权重;
  4. 将新的样本和上次分错的样本放在一起进行新一轮的训练。
  5. 循环执行4-5步骤,T轮后得到T个最优弱分类器。
  6. 组合T个最优弱分类器得到强分类器,组合方式如下:


adaboost分类器例子:
参考自此博客



符号函数参考自此博客

所以将弱分类器级联成强分类器的过程如下图:参考自此博客

如图所示为Adaboost分类器的整体结构。从右到左,可见最终的求和与符号函数,再看到左边求和之前,图中的虚线表示不同轮次的迭代效果,第1次迭代时,只有第1行的结构,第2次迭代时,包括第1行与第2行的结构,每次迭代增加一行结构,图下方的“云”表示不断迭代结构的省略。

第i轮迭代要做这么几件事:

新增弱分类器WeakClassifier(i)与弱分类器权重alpha(i)
通过数据集data与数据权重W(i)训练弱分类器WeakClassifier(i),并得出其分类错误率,以此计算出其弱分类器权重alpha(i)通过加权投票表决的方法,让所有弱分类器进行加权投票表决的方法得到最终预测输出,计算最终分类错误率,如果最终错误率低于设定阈值(比如5%),那么迭代结束;如果最终错误率高于设定阈值,那么更新数据权重得到W(i+1)

筛选式强级联分类器——haar分类器的检测系统

总结:
因为输入的图像一般是大图,所以我们按照对子窗口扫描计算得到G(x):

留下G(x)=1的子窗口图像,就是该强分类器判定的人脸图像区域。
计算该分类器的误检率和识别率,与开始设定的该层(该强分类器)最大可接受误检率和最小可接受检测率进行比较,若不符合,则在该强分类器中继续加入弱分类器。直到符合该层规定的最大可接受误检率和最小可接受检测率。对每一层(每一个强分类器)都这么做
更新总的误检率和检测率。(将每一层(每一个强分类器)的误检率和检测率相乘)


以下为参考内容:
强分类器的级连就是对现实世界包含多种尺寸人脸的图像进行多区域、多尺寸的检测即将图像划分多个区域,按照不同尺寸的窗口进行检测,最终输出包含人脸的子窗口图像。筛选式强分类器的级连是通过调整每个强分类器中弱分类器的个数使得最终级连分类器的检测率 D 和误识率 F 达到系统值(我们设定的值)。

参考自此博客
参考自此博客

AdaBoost训练出来的强分类器一般具有较小的误识率,但检测率并不很高。正确率就是TPR,误检率就是FPR。

假设AdaBoost分类器要实现99%的正确率,1%的误检率需要200维特征,而实现具有99.9%正确率和50%的误检率的AdaBoost分类器仅需要10维特征,那么通过级联(串行),假设10级级联,最终得到的正确率和误检率分别为(这个例子既考虑了特征个数既弱分类器个数<仅需十个>又考虑了分类器检测率<级联后还比较高,为99%>与误识率<级联后大大降低为0.1%>):

可以看到通过级联adaboost分类器能够使用较少的特征和较简单的分类器更快更好的实现分类。

另外在检测的过程中,因为TPR(正确率)较高,所以一旦检测到某区域不是目标就可以直接停止后续检测。由于在人脸检测应用中非人脸区域占大部分,这样大部分检测窗口都能够很快停止,使分类速度得到很大的提高。

检测体系是以现实中的一幅大图片作为输入,然后对图片中进行多区域,多尺度的检测,所谓多区域,是要对图片划分多块,对每个块进行检测,由于检测的时候用的照片一般都是20*20左右的小图片,所以对于大的人脸,还需要进行多尺度的检测,多尺度检测机制一般有两种策略,一种是不改变搜索窗口的大小,而不断缩放图片,这种方法显然需要对每个缩放后的图片进行区域特征值的运算,效率不高,而另一种方法,是不断初始化搜索窗口size为训练时的图片大小,不断扩大搜索窗口,进行搜索,解决了第一种方法的弱势。 无论哪一种搜索方法,都会为输入图片输出大量的子窗口图像,这些子窗口图像经过筛选式级联分类器会不断地被每一个节点筛选,抛弃或通过。
参考自此博客

2.图像检索

经过预处理过程获得标准人脸数据,然后进行图像数据检索。判断两幅图像是否相似,比较它们的图像列表比直接比较它们自身的像素特征效果要
好,进行数据检索最终是要生成人脸素描图像或人脸帧图像的图像列表: 将人脸素描图像或人脸帧图像与数据库中的字典图像进行相似度比较,按照相似度排序生成的一系列图像作为人脸素描图像或人脸帧图像的图像列表。
步骤 1 选用局部尺度分析( LDA,loacal de- mention analysis) 方法训练投影矩阵 W,通过公示Y = W^T X 计算人脸素描图像或人脸帧图像的特征值。( 其中 X 为输入图像,Y 为输出相应的特征矩阵) ;
(这一步要做的事情就是提取出人脸帧图像和素描人脸图像的某个特征,然后输出对应的特征矩阵)
步骤 2 通过欧式距离计算人脸素描图像或人脸帧图像与图像数据库中图像的相似度;(这一步就是同样计算出数据库图像的特征矩阵,再计算其与人脸帧图像和素描图像的相似度)
步骤 3 根据相似度将数据库图像由高到低进行排序,生成人脸素描图像或人脸帧图像的图像列表
(我不太搞得明白括号中为个人见解与文献作者无关)

3.生成视频图像列表

对每一幅人脸帧图像都生成了图像列表,为了充分利用帧之间的信息,需整合每一幅帧图像的图像列表,生成视频的图像列表。

流程:

  1. 聚类。对每一帧图像列表的字典图像特征矩阵进行聚类;
  2. 重新排序。 计算每一类类内相似度,并以此更新类内图像相似度,根据更新的相似度重新排序;
  3. 融合。 综合每一个字典图像在每个帧图像列表中的相似度,计算最终相似度,并依次排序生成视频的图像列表,如下图所示:

聚类

对每一帧图像列表中字典图像的特征矩阵值进行聚类分析。
聚类是一种机器学习技术,它涉及到数据点的分组。给定一组数据点,我们可以使用聚类算法将每个数据点划分为一个特定的组。理论上,同一组中的数据点应该具有相似的属性和/或特征,而不同组中的数据点应该具有高度不同的属性和/或特征。聚类是一种无监督学习的方法,是许多领域中常用的统计数据分析技术。参考自此博文

重排序

通过聚类算法之后,生成 C 类(文献中提到的算法中的一个东西我没看懂是什么)中的字典图像,重新计算其与帧图像相似度. 聚类是为了利用聚类中类内和类间的信息,对相似度进行重新计算. 因运用模糊聚类算法,图像是否属于某一类是由隶属度矩阵决定的。

融合

根据相似度的值对字典图像进行排序,融合为视频的图像列表。

5.特征对比

相关度计算

计算的是两个图像列表中的字典图像与素描或帧图像的相关度。

计算 DCG

假设我们在Google上搜索一个词,然后得到5个结果。我们对这些结果进行3个等级的区分:Good(好)、Fair(一般)、Bad(差),然后赋予他们分值分别为3、2、1,假定通过逐条打分后,得到这5个结果的分值分别为3、2 、1 、3、 2。

reli :第 i 位结果的得分
p:搜索得到的结果个数
DCG=3+(1+1.26+1.5+0.86)=7.62
IDCG(ideal DCG),就是理想的DCG
理想的排序应该是3 、3 、2 、2 、1,那么IDCG=3+3+1.26+1+0.43=8.69
nDCG=DCG/IDCG=7.62/8.69=0.88(百度百科:DCG)

应用在本文中,如果 2 个图像列表 A 和 B 进行比对,A 把 B 作为 IDCG,同时 B 把 A 作为IDCG,这样分别计算出 nDCG( A,B) 和 nDCG( B,A) ,列表A 和 B 最终的相似度由 nDCG( A,B) 和 nDCG( B,A) 的平均值确定。

实验

数据获取

实验需要用到的实验数据包括两类:
相同的〈素描,视频〉数据:素描和视频代表的是同一个人
不同的〈素描,视频〉数据:指素描和视频代表不同的人

算法验证设计

验证算法有效性的过程就是计算人脸素描与人脸视频列表之间相似度的过程。对于相同的〈素描,视频〉数据,如果相似度最大视频刚好是实验数据中与人脸素描配对的视频,则算法正确识别; 对于不同的〈素描,视频〉数据,如果相似度最大视频刚好是实验数据中与人脸素描配对的视频, 则算法错误接受。

对照实验结果分析

设计对照实验: 比较人脸视频分析融合系统( FaceVACS,face video analysis combined system) 与本文算法在素描对于视频的人脸识别的效果。 应用 FaceVACS 实现基于素描—视频人脸识别的方式是: 将素描与视频中的每一帧图像进行相似度比对,计算每一帧的平均相似度作为素描和视频之间的相似度。

实验结论


从表 1 对比实验数据可以看出,对比 FaceVACS 对素描—视频数据进行人脸识别,所提出的设计在正确识别率有相应提高,而等错误率大大下降。

haar分类器详解(Haar特征,积分图,adaboost算法,筛选式级联分类器),DCG介绍 --文献阅读报告《基于素描对视频的人脸识别研究》相关推荐

  1. java斐波那契查找_详解Java Fibonacci Search斐波那契搜索算法代码实现

    一, 斐波那契搜索算法简述 斐波那契搜索(Fibonacci search) ,又称斐波那契查找,是区间中单峰函数的搜索技术. 斐波那契搜索采用分而治之的方法,其中我们按照斐波那契数列对元素进行不均等 ...

  2. python人脸识别opencv_Python基于Opencv来快速实现人脸识别过程详解(完整版)

    前言 随着人工智能的日益火热,计算机视觉领域发展迅速,尤其在人脸识别或物体检测方向更为广泛,今天就为大家带来最基础的人脸识别基础,从一个个函数开始走进这个奥妙的世界. 首先看一下本实验需要的数据集,为 ...

  3. 国密算法Go语言实现(详解)(九) ——SM2(椭圆曲线公钥密码算法)

    国密算法Go语言实现(详解)(九) --SM2(椭圆曲线公钥密码算法) 原创代码:https://github.com/ZZMarquis/gm 引用时,请导入原创代码库.本文仅以注释方式详解代码逻辑 ...

  4. 国密算法Go语言实现(详解)(十) ——SM2(椭圆曲线公钥密码算法)

    国密算法Go语言实现(详解)(十) --SM2(椭圆曲线公钥密码算法) 原创代码:https://github.com/ZZMarquis/gm 引用时,请导入原创代码库.本文仅以注释方式详解代码逻辑 ...

  5. Paxos算法细节详解(一)--通过现实世界描述算法

    Paxos算法细节详解(一)--通过现实世界描述算法 Paxos分析 最近研究paxos算法,看了许多相关的文章,概念还是很模糊,觉得还是没有掌握paxos算法的精髓,所以花了3天时间分析了libpa ...

  6. 蚂蚁金服张洁:基于深度学习的支付宝人脸识别技术解秘-1

    蚂蚁金服张洁:基于深度学习的支付宝人脸识别技术解秘(1) 2015-08-13 10:22 于雪 51CTO 字号:T | T 用户身份认证是互联网金融发展的基石.今年三月,在德国汉诺威举办的IT展览 ...

  7. 论文盘点:性别年龄分类器详解

    ©PaperWeekly 原创 · 作者|孙裕道 学校|北京邮电大学博士生 研究方向|GAN图像生成.情绪对抗样本生成 引言 年龄和性别在社会交往中起着基础性的作用.随着社交平台和社交媒体的兴起,自动 ...

  8. opencv python考勤_Python基于Opencv来快速实现人脸识别过程详解(完整版)

    前言 随着人工智能的日益火热,计算机视觉领域发展迅速,尤其在人脸识别或物体检测方向更为广泛,今天就为大家带来最基础的人脸识别基础,从一个个函数开始走进这个奥妙的世界. 首先看一下本实验需要的数据集,为 ...

  9. python模块cv2人脸识别_Python基于Opencv来快速实现人脸识别过程详解(完整版)

    前言 随着人工智能的日益火热,计算机视觉领域发展迅速,尤其在人脸识别或物体检测方向更为广泛,今天就为大家带来最基础的人脸识别基础,从一个个函数开始走进这个奥妙的世界. 首先看一下本实验需要的数据集,为 ...

最新文章

  1. 【BZOJ】3301: [USACO2011 Feb] Cow Line(康托展开)
  2. c# mysql fill_C#里sqlDataAdapter.fill(DataSet,String)的用法
  3. 对DBF的操作建议用微软的驱动和新的链接字符串。
  4. 向有环的环形链表中插入新节点
  5. MyEclipse使用总结——设置MyEclipse开发项目时使用的JDK
  6. 大话设计模式—状态模式
  7. mysql 阿里云 优化_MySQL性能优化速记
  8. 第一章 对象引论02
  9. RMS Server打开或关闭日志记录
  10. Excel中复杂跨行跨列数据
  11. 软件GUI测试中的关注点
  12. xp系统怎么定时锁定计算机,电脑怎么设置自动锁屏_XP系统电脑怎么设置自动锁屏...
  13. python语料库_Python-使用NLTK创建新的语料库
  14. 装配区5s管理制度推行办法
  15. 幼儿 Android App,中国幼儿园在线app
  16. JVM学习笔记(12) 垃圾回收-垃圾回收相关算法
  17. xp设置系统时间同步服务器,xp设置时间同步服务器
  18. Caicloud 开源 Nirvana:让 API 从对框架的依赖中涅槃重生
  19. 【金猿产品展】诸葛用户数据分析平台(Insight)——聚焦业务场景数据应用价值挖掘,赋能精细化运营...
  20. Spark系列之SparkSubmit提交任务到YARN

热门文章

  1. duilib-CComboUI执行SelectItem无效果排查
  2. linux dvd写入u盘工具,Windows 7 USB/DVD Download Tool(用于制作Windows 7启动U盘)
  3. Ionic2:创建App启动页滑动欢迎界面
  4. 网易我的世界服务器物品列表,网易我的世界所有物品的英文 | 手游网游页游攻略大全...
  5. 关于防止微信投票刷票行为的一些思考
  6. 如何编译Fate-Serving
  7. dvd管理系统c语言,俱乐部DVD管理系统――C语言
  8. Hive调优之 严格模式
  9. java+springboot企业仓库进销存管理系统的设计与实现
  10. 接口【四】继承父类并实现多个接口