注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

hhfighting的博客

以责人之心责己,以恕己之心恕人

 
 
 

日志

 
 
 
 

ORB-SLAM学习---vocabulary构建TemplatedVocabulary文件  

2016-10-11 08:28:18|  分类: SLAM |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
create函数是入口函数,输入参数为训练特征集。它调用HKmeansStepcreateWords() 和 setNodeWeights 三个核心函数完成视觉词典的生成。
void HKmeansStep(NodeId parent_id, const vector<pDescriptor> &descriptors, int current_level);
创建树的第current_level层:vocabulary tree的第current_level层执行k-means算法。此函数是一个迭代函数,执行完后创建了整个树。调用函数HKmeanStep(0,features,1)即完成了整个树的创建。
算法执行流程:
(1)调用initiateClusterKMpp得到初始的k个聚类中心;
(2)FORB::distance计算feature和所有聚类中心的距离(相异位数),将feature划分到最近的cluster里;m_nodes用于存储cluster。
(3)调用FORB::meanValue计算新的聚类中心。累加描述符的对应位,如果和过半,则该位为1,否则为0。这里是用标准的kmeans算法。求出新的聚类中心后,需要对特征再次进行划分,重新求聚类中心,直到收敛(分类不再发生变化)。对应程序的while{goon}部分。
(3)循环调用HKMeansStep对每个聚类进行再次细分。结束条件为达到指定的层数。

 void initiateClustersKMpp(const vector<pDescriptor> &descriptors,vector<TDescriptor> &clusters) const;
k-means++算法选择初始k个聚类中心。
  // Algorithm:
  // 1. Choose one center uniformly at random from among the data points.
  // 2. For each data point x, compute D(x), the distance between x and the nearest center (上次求解得到的聚类中心)that has already been chosen.
  // 3. Add one new data point as a center. Each point x is chosen with probability proportional to D(x)^2.
  // 4. Repeat Steps 2 and 3 until k centers have been chosen.
  // 5. Now that the initial centers have been chosen, proceed using standard k-means clustering.
步骤2: 计算距离的函数是FORB::distance(描述符1,描述符2),该函数将两个二进制描述符进行异或运算,然后统计1的个数。每次迭代仅需计算features和上个聚类中心的距离,然后和以前计算的距离进行比较,若小的话则替代以前保存的距离。程序中数据结构min_dist存储了features到所有已有聚类中心的最近距离。
步骤3: 如何选取聚类中心。求所有最小距离之和sum(min_dist中数据的和),选择一个随机数(介于0和sum之间),然后遍历min_dist,累加其值,直到和大于所取随机数终止。终止位置所对应的feature作为新的聚类中心。
void createWords()
vocabulary tree建好之后,立马调用此函数生成视觉词典。
void setNodeWeights(const vector<vector<TDescriptor> > &features);
设置节点权值。前提是树已经建好。如果加权方式是TF或Binary,权值为1;如果是IDF或TF_IDF,权值为idf部分。
inline double TemplatedVocabulary<TDescriptor,F>::score(const BowVector &v1, const BowVector &v2) const
调用ScoringObject对象中的一种score计算方法。具体使用哪个取决于加载的参数文件。
  评论这张
 
阅读(24)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018