PTAMM阅读笔记 PTAMM阅读笔记之基本流程(一) PTAMM阅读笔记之ID3决策树(二) PTAMM阅读笔记之FAST角点检测(三) PTAMM阅读笔记之查找表的使用(四) PTAMM阅读笔记之SLAM概述(五) PTAMM阅读笔记之阶段性总结(六)

PTAMM阅读笔记之基本流程(一)

程序运行基本流程:
Step1: System::System(){
 1、注册一系列命令、添加相对应的功能按钮。
 2、 创建摄像机 mpCamera = new ATANCamera("Camera"); 实现的功能包括:加载camera.cfg配置文件中的摄像机内参(mvFocal[0]、mvFocal[1]、mvCenter[0]、mvCenter[1])及摄像机扭曲变形参数mdW、设置黑白图像及彩色图像尺寸、计算从图像坐标系到z=1屏幕投影及相应像素大小、找出在z=1平面内的边界四边形并计算线性投影所需参数。
3、 创建Map、MapMaker、Tracker、ARDriver、MapViewer、MapSerialize。
      mpMap = new Map();
     mvpMaps.push_back( mpMap );
     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 );
4、初始化游戏菜单及相应功能按钮。
}
NOTE: VideoSource.cc中的代码主要是用于Capture图像信息,与PTAMM中所用到的算法没有必然联系,因此可以依据自己的需要进行更改。
Step2: System::Run(){//初始化时mbDone = false; 
1、判断Map是否被其他进程锁定或是否处于编辑锁定状态,无关紧要,暂不讨论。
        if(bWasLocked)  {
        mpTracker->ForceRecovery();}
2、PTAMM程序中涉及到两种图像(黑白图像和彩色图像),其中黑白图像用于处理追踪相关等功能,彩色图像用于最终的显示。采集上述两种图像: mVideoSource.GetAndFillFrameBWandRGB(mimFrameBW, mimFrameRGB);
3、第一帧时,初始化ARDriver:mpARDriver->Init();这里主要用于生成纹理标识及FrameBuffer,与OpenGL相关, 后面补充。
4、设置窗口相关属性:
      mGLWindow.SetupViewport();
      mGLWindow.SetupVideoOrtho();
      mGLWindow.SetupVideoRasterPosAndZoom();
5、DrawMap及DrawAR状态变量的判断:
      static gvar3<int> gvnDrawMap("DrawMap", 0, HIDDEN|SILENT);
      static gvar3<int> gvnDrawAR("DrawAR", 0, HIDDEN|SILENT);
      bool bDrawMap = mpMap->IsGood() && *gvnDrawMap;
      bool bDrawAR = mpMap->IsGood() && *gvnDrawAR;
6、开始追踪黑白图像: mpTracker->TrackFrame(mimFrameBW, !bDrawAR && !bDrawMap); 将获取到的黑白图像转换成用于追踪的关键帧结构: mCurrentKF.MakeKeyFrame_Lite(imFrame); 这里需要说明的是,PTAMM中关键帧采用“ 多层级金字塔形式进行存储与处理pyramid ”, 究竟是什么意思,后面学习会进行补充。 只需要明白每一个层级是上一个层级的下采样即可,然后针对于各个层级进行FAST角点检测,每一个层级的阈值有所不同。最后生成按列角点查询表,便于以后近邻角点的查询任务:
      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);
     }
7、更新小图片用于旋转估计,后面仅使用关键帧结构的图像进行处理-->通过判断mbDraw状态为true,绘制0级金字塔图像 及角点(这里的角点可能暂不绘制)。
8、通过判断还没有map生成,初始化map: TrackForInitialMap(); 生成图状态查询,对应于界面中的SpaceBar, TRAIL_TRACKING_NOT_STARTED。 进入 TrailTracking_Start(); 随后点击SpaceBar两次,initialStereInformation,绘制网格等。
}

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之查找表:

  1. <span style="font-size:18px;">      unsigned int v=0;  
  2.       lev.vCornerRowLUT.clear();  
  3.       for(int y=0; y<lev.im.size().y; y++)  
  4.     {  
  5.       while( (v < lev.vCorners.size()) && (y > lev.vCorners[v].y) )  
  6.         v++;  
  7.       lev.vCornerRowLUT.push_back(v);  
  8.     }</span>  
上述代码实现了将角点坐标存入1D按列查找表中。首先,角点的个数是不确定的,但是im.size是有限的,因此将角点按列存储,方便后续计算中进行查询,即每一个纵坐标对应一个角点。这里查找表中存入的是角点的索引值。

PTAMM阅读笔记之SLAM概述(五)

1、同时定位与地图创建允许机器人在未知环境中,依靠自身所带的传感器递增式地创建环境地图,并同时给出机器人所在位置。
2、移动机器人的定位有两种类型:全局定位/绝对定位(Global/Absolute Localization)位置跟踪(Position Tracking)
全局定位:给定环境地图,在没有其他先验信息的情况下,机器人依靠自身所带来的传感器获得的信息确定其在地图中的位置。全局定位用来解决“Lost Robot”问题,对机器人位置进行初始化。全局定位必须要求有一个预先知道的环境地图。匹配技术或数据关联方法常用于移动机器人全局定位,通过比较当前的局部地图信息与全局地图信息,确定机器人的位置。但是由于环境的近似性和对称性,一般的匹配方法不能保证有效地解决全局定位问题。目前,基于贝叶斯滤波技术的概率方法成为解决全局定位问题的流行方法。通过递归地计算在机器人位置空间上的概率分布,来确定机器人在工作环境中最可能的位置。
位置跟踪:基于一定的初始信息,对机器人的位置进行跟踪估计。一般地,可将机器人位姿看作是系统状态,运用滤波技术对机器人的位姿进行滤波估计。最常用的方法是卡尔曼滤波。卡尔曼滤波是一种经典的线性最优递归估计算法。它将机器人的位姿表示为一个高斯概率分布函数,均值方差即为机器人的位姿估计及其估计误差。卡尔曼滤波只能处理高斯线性问题,但是机器人的运动方程及观测方程一般都是高度分线性的,这大大限制了卡尔曼滤波算法的应用。因此,运用各种不同的近似技术进行次优的滤波估计成为重要的定位手段
3、同时定位与地图创建(SLAM)
SLAM的动机在于不需要先验地图而能精确定位,并且它维持的地图能够随环境的变化进行扩展和自适应。SLAM通过机器人的传感器探测环境特征,然后由机器人的位姿估计特征位置,并把地图特征存入地图。当特征被重复观测时,特征位置的不确定性逐渐降低,此时可用这些特征位置去提高机器人的位姿估计,使得能够得到收敛的位姿估计与环境地图
****当机器人探索位置区域得到特征的相对观测时,所有特征位置的估计都是相关的,因为他们都是基于共同的机器人位姿估计误差****
****相关性是得到满足收敛性估计结果的关键因素,处理过程中特征相关性维持的越好,将会得到更好的结果。****
****基于状态空间的SLAM实际上是一个联合状态向量的估计问题,该联合状态向量包括机器人的位姿x观测到的的静态特征的位置m。在这种比较特殊的结构中,过程模型/运动模型(Process Model/Motion Model)只影响机器人位姿状态,而观测模型(Observation Model)只和单个机器人位姿特征有关。****
****几乎所有的状态估计算法都会遇到数据关联的问题。SLAM中,数据关联用来建立观测与地图中已有特征的关系,但是由于机器人位姿的不确定、特征密度的变化、环境中动态目标的干扰及观测中虚假成分的存在使得关联是一个非常困难、复杂的过程。数据关联算法包含以下两个基本方面:(1)用来检验传感器观测地图特征相容性的条件;(2)从满足相容性的特征中挑出最佳匹配的选择标准。****
****延时地图创建:只有距离和方位的单个信息不足以确定一个特征的位置,需要机器人多个位置的多个测量才能确定。但是,单个测量产生了一个分高斯分布特征,而多个测量后需要得到一个近似的高斯分布。为了得到近似的高斯分布特征位置估计,可以采用延时初始化,并在延迟的时间段积累测量数据。这种延时策略的思想是通过积累信息,延时做出决策以提高鲁棒性。为了保证延时数据的一致性,需要在状态向量中以增广的方式记录每一观测时刻的机器人位姿,并采用一个辅助向量来记录对应每一个机器人位姿的观测。****
****环境地图模型:典型的环境地图表示方法为特征地图,环境模型为由特征点构成的环境地图,每个特征点用它在全局坐标系中的位置Li来表示。因此,环境地图可表示为M=[L1,L2...Ln]。由于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

猜你喜欢

转载自blog.csdn.net/danmeng8068/article/details/80726783