PTAMM阅读笔记之基本流程(一)
mpMap->mapLockManager.Register(this);
mpMapMaker = new MapMaker( mvpMaps, mpMap );
mpTracker = new Tracker(mVideoSource.Size(), *mpCamera, mvpMaps, mpMap, *mpMapMaker);
mpARDriver = new ARDriver(*mpCamera, mVideoSource.Size(), mGLWindow, *mpMap);
mpMapViewer = new MapViewer(mvpMaps, mpMap, mGLWindow);
mpMapSerializer = new MapSerializer( mvpMaps );
mGLWindow.SetupVideoRasterPosAndZoom();
static gvar3<int> gvnDrawAR("DrawAR", 0, HIDDEN|SILENT);
bool bDrawMap = mpMap->IsGood() && *gvnDrawMap;
bool bDrawAR = mpMap->IsGood() && *gvnDrawAR;
for(int y=0; y<lev.im.size().y; y++)
{
while( (v < lev.vCorners.size()) && (y > lev.vCorners[v].y) )
v++;
lev.vCornerRowLUT.push_back(v);
}
PTAMM阅读笔记之ID3决策树(二)
基本概念:
决策树(decision tree)是一个树结构(可以是二叉树或非二叉树)。其每个非叶节点表示一个特征属性上的测试,每个分支代表这个特征属性在某个值域上的输出,而每个叶节 点存放一个类别。使用决策树进行决策的过程就是从根节点开始,测试待分类项中相应的特征属性,并按照其值选择输出分支,直到到达叶子节点,将叶子节点存放 的类别作为决策结果。
决策树的构造:
不同于贝叶斯算法,决策树的构造过程不依赖领域知识,它使用属性选择度量来选择将元组最好地划分成不同的类的属性。所谓决策树的构造就是进行属性选择度量确定各个特征属性之间的拓扑结构。
构造决策树的关键步骤是分裂属性。所谓分裂属性就是在某个节点处按照某一特征属性的不同划分构造不同的分支,其目标是让各个分裂子集尽可能地“纯”。尽可能“纯”就是尽量让一个分裂子集中待分类项属于同一类别。分裂属性分为三种不同的情况:
1、属性是离散值且不要求生成二叉决策树。此时用属性的每一个划分作为一个分支。
2、属性是离散值且要求生成二叉决策树。此时使用属性划分的一个子集进行测试,按照“属于此子集”和“不属于此子集”分成两个分支。
3、属性是连续值。此时确定一个值作为分裂点split_point,按照>split_point和<=split_point生成两个分支。
构造决策树的关键性内容是进行属性选择度量,属性选择度量是一种选择分裂准则,是将给定的类标记的训练集合的数据划分D“最好”地分成个体类的启发式方法,它决定了拓扑结构及分裂点split_point的选择。
ID3算法:
1986年Quinlan提出的ID3算法是基于决策树学习中最重要的一种算法,PTAMM程序FAST角点检测算法使用ID3算法进行分类。决策树的生成过程也就是一个树的节点的选择过程:
从信息论知识中我们直到,期望信息越小,信息增益越大,从而纯度越高。所以ID3算法的核心思想就是以信息增益度量属性选择,选择分裂后信息增益最大的属性进行分裂。下面先定义几个要用到的概念。
设D为用类别对训练元组进行的划分,则D的熵(entropy)表示为:
其中pi表示第i个类别在整个训练元组中出现的概率,可以用属于此类别元素的数量除以训练元组元素总数量作为估计。熵的实际意义表示是D中元组的类标号所需要的平均信息量。
现在我们假设将训练元组D按属性A进行划分,则A对D划分的期望信息为:
而信息增益即为两者的差值:
ID3算法就是在每次需要分裂时,计算每个属性的增益率,然后选择增益率最大的属性进行分裂。下面我们继续用SNS社区中不真实账号检测的例子说明如何使用ID3算法构造决策树。为了简单起见,我们假设训练集合包含10个元素:
其中s、m和l分别表示小、中和大。
设L、F、H和R表示日志密度、好友密度、是否使用真实头像和账号是否真实,下面计算各属性的信息增益。
因此日志密度的信息增益是0.276。
用同样方法得到H和F的信息增益分别为0.033和0.553。
因为F具有最大的信息增益,所以第一次分裂选择F为分裂属性,分裂后的结果如下图表示:
在上图的基础上,再递归使用这个方法计算子节点的分裂属性,最终就可以得到整个决策树。
上面为了简便,将特征属性离散化了,其实日志密度和好友密度都是连续的属性。对于特征属性为连续值,可以如此使用ID3算法:
先将D中元素按照特征属性排序,则每两个相邻元素的中间点可以看做潜在分裂点,从第一个潜在分裂点开始,分裂D并计算两个集合的期望信息,具有最小期望信息的点称为这个属性的最佳分裂点,其信息期望作为此属性的信息期望
PTAMM阅读笔记之FAST角点检测(三)
PTAMM阅读笔记之查找表的使用(四)
查找表的基础知识:
函数的计算开销很大,但是把计算结果缓存起来的开销比较小时,用查找表(简称LUTs)优化这种函数的计算是一种非常好的方法。通过预先把一些常见输入的对应结果计算出来,花费不多的查找操作就能代替开销较大的运行时计算。如果查找比从头开始计算结果(或者有不断重复的相同输入)要快,那么使用查找表就能提高程序性能。由于数据请求会落在表的样本区间中,插值算法能够通过对数值附近样本取平均值产生可以接受的近似值。
一维查找表:
查找表是以其维数来定义,即把一个输出值编入索引时所必要的索引数目。最简单的查找表是以一个变量来编制和访问的,也就是1D查找表。
考虑一种对颜色的操作f(x),作用于8位的灰度图像。一种做法就是遍历图像的所有像素,为每一个像素都计算一次f(x)的值。然而,无论这个函数有多复杂,它的计算记过都只会是255种中的一种(相应于每一种不同的输入)。因此,一种替代的方法就是列出这个运算对应于每一种输入的结果,在运行时通过查找这几个表来对像素进行变换计算。假设查找整数表是高效的,同时光栅图像的像素数目多余255个,那么使用查找表会加快速度。
PTAMM之查找表:
- <span style="font-size:18px;"> unsigned int v=0;
- lev.vCornerRowLUT.clear();
- for(int y=0; y<lev.im.size().y; y++)
- {
- while( (v < lev.vCorners.size()) && (y > lev.vCorners[v].y) )
- v++;
- lev.vCornerRowLUT.push_back(v);
- }</span>
PTAMM阅读笔记之SLAM概述(五)
PTAMM阅读笔记之阶段性总结(六)
相关工作:1、摄像机校正
2、特征提取(FAST角点特征、扭曲图像的直线特征优化)
3、极线几何与极线搜索
4、RANSAC(随机采样一致)及N点算法(主要围绕5点算法)
5、Bundle Adjustment(光束平差,用于最小二乘问题的优化)
6、SLAM(同步定位与地图构建)-概率模型及EKF扩展的卡尔曼滤波
7、PTAMM的Tracking与Mapping的流程
NOTE:这里暂时忽略了特征点的重新定位,对于摄像机的高速运动及丢失,这是十分必要的。
https://blog.csdn.net/aquathinker/article/list/3