时间:2021-07-01 10:21:17 帮助过:13人阅读
是对聚类生成的树的描述,树上的每一个点都是node,只有叶子结点才是word,每张图进来提取特征,利用descriptor算特征距离,最终落到叶子上(单词),所有特征的单词构成该图片的词向量。
检索入口描述:
- <span style="color: #008080"> 1</span> <span style="color: #000000">database:
- </span><span style="color: #008080"> 2</span> <span style="color: #000000"> nEntries: 4
- </span><span style="color: #008080"> 3</span> <span style="color: #000000"> usingDI: 0
- </span><span style="color: #008080"> 4</span> <span style="color: #000000"> diLevels: 0
- </span><span style="color: #008080"> 5</span> <span style="color: #000000"> invertedIndex:
- </span><span style="color: #008080"> 6</span> <span style="color: #000000"> - <span style="color: #008000">//(wordId:0)
- </span></span><span style="color: #008080"> 7</span> <span style="color: #000000"> - { imageId:1, weight:1.6807896319101980e-03 }
- </span><span style="color: #008080"> 8</span> <span style="color: #000000"> - { imageId:2, weight:3.2497152852064880e-03 }
- </span><span style="color: #008080"> 9</span> <span style="color: #000000"> - { imageId:3, weight:3.6665308718065778e-03 }
- </span><span style="color: #008080">10</span> <span style="color: #000000"> - <span style="color: #000000"><span style="color: #008000">//(wordId:1)</span></span>
- </span><span style="color: #008080">11</span> <span style="color: #000000"> - { imageId:1, weight:4.0497295661974788e-03 }
- </span><span style="color: #008080">12</span> <span style="color: #000000"> - <span style="color: #000000"><span style="color: #008000">//(wordId:2)</span></span>
- </span><span style="color: #008080">13</span> <span style="color: #000000"> []
- </span><span style="color: #008080">14</span> <span style="color: #000000"> -
- </span><span style="color: #008080">15</span> <span style="color: #000000"> []
- </span><span style="color: #008080">16</span> <span style="color: #000000"> -
- </span><span style="color: #008080">17</span> <span style="color: #000000"> - { imageId:2, weight:3.9149658655580431e-03 }
- </span><span style="color: #008080">18</span> <span style="color: #000000"> -
- </span><span style="color: #008080">19</span> <span style="color: #000000"> - { imageId:3, weight:4.4171079458813099e-03 }
- </span><span style="color: #008080">20</span> <span style="color: #000000"> -
- </span><span style="color: #008080">21</span> <span style="color: #000000"> - { imageId:1, weight:2.0248647830987394e-03 }
- </span><span style="color: #008080">22</span> - { imageId:3, weight:4.4171079458813099e-03 }
检索入口:
根据voc字典里的描述,word id 2对应node id 21, 而node id 21对应的权值为0,也就是说word 2太普通了,在用来生成视觉词汇表的4张图里都出现了(参考中文文章里的“的”、“在”、“和”等常见词),不具有代表性, 于是根本就没有对应入口id,这是合理的。
开源出来的代码不是对相同word的入口进行加1投票,而是直接计算单词对应的所有EntryId分数,最后排序取前n个。分数可以有L1 L2 KL等几种计算方式
queryL1,C++不熟看了半天,用到map函数,注释:
- <span style="color: #008080"> 1</span> <span style="color: #0000ff">void</span> Database::queryL1(<span style="color: #0000ff">const</span> BowVector &<span style="color: #000000">vec, </span>QueryResults &ret, <span style="color: #0000ff">int</span> max_results, <span style="color: #0000ff">int</span> max_id) <span style="color: #0000ff">const</span>
- <span style="color: #008080"> 3</span> <span style="color: #000000">{
- </span><span style="color: #008080"> 4</span> <span style="color: #000000"> BowVector::const_iterator vit;
- </span><span style="color: #008080"> 5</span>
- <span style="color: #008080"> 6</span> std::map<EntryId, <span style="color: #0000ff">double</span>><span style="color: #000000"> pairs;
- </span><span style="color: #008080"> 7</span> std::map<EntryId, <span style="color: #0000ff">double</span>><span style="color: #000000">::iterator pit;
- </span><span style="color: #008080"> 8</span>
- <span style="color: #008080"> 9</span> <span style="color: #0000ff">for</span>(vit = vec.begin(); vit != vec.end(); ++<span style="color: #000000">vit)
- </span><span style="color: #008080">10</span> <span style="color: #000000"> {
- </span><span style="color: #008080">11</span> <span style="color: #0000ff">const</span> WordId word_id = vit-><span style="color: #000000">first;
- </span><span style="color: #008080">12</span> <span style="color: #0000ff">const</span> WordValue& qvalue = vit-><span style="color: #000000">second;
- </span><span style="color: #008080">13</span>
- <span style="color: #008080">14</span> <span style="color: #0000ff">const</span> IFRow& row =<span style="color: #000000"> m_ifile[word_id];
- </span><span style="color: #008080">15</span>
- <span style="color: #008080">16</span> <span style="color: #008000">//</span><span style="color: #008000"> IFRows are sorted in ascending entry_id order</span>
- <span style="color: #008080">18</span> <span style="color: #0000ff">for</span>(auto rit = row.begin(); rit != row.end(); ++<span style="color: #000000">rit)
- </span><span style="color: #008080">19</span> <span style="color: #000000"> {
- </span><span style="color: #008080">20</span> <span style="color: #0000ff">const</span> EntryId entry_id = rit-><span style="color: #000000">entry_id;
- </span><span style="color: #008080">21</span> <span style="color: #0000ff">const</span> WordValue& dvalue = rit-><span style="color: #000000">word_weight;
- </span><span style="color: #008080">22</span>
- <span style="color: #008080">23</span> <span style="color: #0000ff">if</span>((<span style="color: #0000ff">int</span>)entry_id < max_id || max_id == -<span style="color: #800080">1</span><span style="color: #000000">)
- </span><span style="color: #008080">24</span> <span style="color: #000000"> {
- </span><span style="color: #008080">25</span> <span style="color: #0000ff">double</span> value = fabs(qvalue - dvalue) - fabs(qvalue) -<span style="color: #000000"> fabs(dvalue);
- </span><span style="color: #008080">26</span>
- <span style="color: #008080">27</span> pit =<span style="color: #000000"> pairs.lower_bound(entry_id);
- </span><span style="color: #008080">28</span> <span style="color: #0000ff">if</span>(pit != pairs.end() && !(pairs.key_comp()(entry_id, pit-><span style="color: #000000">first)))
- </span><span style="color: #008080">29</span> {
- <span style="color: #008080">30</span> pit->second +=<span style="color: #000000"> value; <span style="color: #008000">//<span style="color: #008000">如果已经有entry_id,累加和</span></span>
- </span><span style="color: #008080">31</span> <span style="color: #000000"> }
- </span><span style="color: #008080">32</span> <span style="color: #0000ff">else</span>
- <span style="color: #008080">33</span> { <span style="color: #008000">//</span><span style="color: #008000">如果没有,插入此id</span>
- <span style="color: #008080">34</span> pairs.insert(pit, std::map<EntryId, <span style="color: #0000ff">double</span>><span style="color: #000000">::value_type(entry_id, value));
- </span><span style="color: #008080">35</span> <span style="color: #000000"> }
- </span><span style="color: #008080">36</span> <span style="color: #000000"> }</span>
- <span style="color: #008080">38</span> } <span style="color: #008000">//</span><span style="color: #008000"> for each inverted row</span>
- <span style="color: #008080">39</span> } <span style="color: #008000">//</span><span style="color: #008000"> for each query word
- </span><span style="color: #008080">40</span>
- <span style="color: #008080">41</span> <span style="color: #008000">//</span><span style="color: #008000"> move to vector</span>
- <span style="color: #008080">42</span> <span style="color: #000000"> ret.reserve(pairs.size());
- </span><span style="color: #008080">43</span> <span style="color: #0000ff">for</span>(pit = pairs.begin(); pit != pairs.end(); ++<span style="color: #000000">pit)
- </span><span style="color: #008080">44</span> <span style="color: #000000"> {
- </span><span style="color: #008080">45</span> ret.push_back(Result(pit->first, pit-><span style="color: #000000">second));
- </span><span style="color: #008080">46</span> <span style="color: #000000"> }
- </span><span style="color: #008080">47</span>
- <span style="color: #008080">48</span> <span style="color: #008000">//</span><span style="color: #008000"> resulting "scores" are now in [-2 best .. 0 worst]</span>
- <span style="color: #008080">50</span> <span style="color: #008000">//</span><span style="color: #008000"> sort vector in ascending order of score</span>
- <span style="color: #008080">51</span> <span style="color: #000000"> std::sort(ret.begin(), ret.end());
- </span><span style="color: #008080">52</span> <span style="color: #008000">//</span><span style="color: #008000"> (ret is inverted now --the lower the better--)</span>
- <span style="color: #008080">54</span> <span style="color: #008000">//</span><span style="color: #008000"> cut vector</span>
- <span style="color: #008080">55</span> <span style="color: #0000ff">if</span>(max_results > <span style="color: #800080">0</span> && (<span style="color: #0000ff">int</span>)ret.size() ><span style="color: #000000"> max_results)
- </span><span style="color: #008080">56</span> <span style="color: #000000"> ret.resize(max_results);
- </span><span style="color: #008080">57</span>
- <span style="color: #008080">58</span> <span style="color: #008000">//</span><span style="color: #008000"> complete and scale score to [0 worst .. 1 best]
- </span><span style="color: #008080">59</span> <span style="color: #008000">//</span><span style="color: #008000"> ||v - w||_{L1} = 2 + Sum(|v_i - w_i| - |v_i| - |w_i|)
- </span><span style="color: #008080">60</span> <span style="color: #008000">//</span><span style="color: #008000"> for all i | v_i != 0 and w_i != 0</span><span style="color: #008080">62</span> <span style="color: #008000">//</span><span style="color: #008000"> scaled_||v - w||_{L1} = 1 - 0.5 * ||v - w||_{L1}</span>
- <span style="color: #008080">63</span> <span style="color: #000000"> QueryResults::iterator qit;
- </span><span style="color: #008080">64</span> <span style="color: #0000ff">for</span>(qit = ret.begin(); qit != ret.end(); qit++<span style="color: #000000">)
- </span><span style="color: #008080">65</span> qit->Score = -qit->Score/<span style="color: #800080">2.0</span><span style="color: #000000">;
- </span><span style="color: #008080">66</span> }
开源词袋模型DBow3原理&源码
标签:gty ons 忽略 数据 and key list 函数 div