深入理解DBOW3算法(二)

上文我们介绍了DBOW3的使用方法和DEMO,本文将开始介绍DBOW的相关概念

1.词带库的数据格式

%YAML:1.0
---
vocabulary:
   k: 9
   L: 3
   scoringType: 0
   weightingType: 0
   nodes:
      - { nodeId:1, parentId:0, weight:0.,
          descriptor:dbw3 0 32 218 95 126 252 59 222 127 244 189 204 254 173 127 255 39 113 246 245 253 226 236 195 178 238 243 251 39 139 38 183 47 123  }
      - { nodeId:2, parentId:0, weight:0.,
          descriptor:dbw3 0 32 90 184 182 178 171 248 56 71 175 23 142 185 172 190 70 222 167 55 235 145 22 73 178 241 155 119 94 123 130 68 175 94  }
      - { nodeId:3, parentId:0, weight:0.,
          descriptor:dbw3 0 32 109 117 157 101 188 79 71 184 114 170 174 72 215 115 73 50 145 212 108 106 105 240 249 14 237 255 101 52 72 243 66 32  }
      - { nodeId:4, parentId:0, weight:0.,
          descriptor:dbw3 0 32 11 223 99 221 118 147 255 119 93 72 94 230 57 238 182 100 126 235 151 205 229 186 36 255 118 127 170 128 63 140 241 253  }
      - { nodeId:5, parentId:0, weight:0.,
          descriptor:dbw3 0 32 34 237 18 158 221 197 190 238 159 0 216 3 236 250 44 64 217 251 3 195 86 43 90 255 61 54 143 107 17 30 189 142  }
      - { nodeId:6, parentId:0, weight:0.,
          descriptor:dbw3 0 32 220 52 189 247 168 126 93 154 190 255 151 61 223 255 75 123 167 215 253 19 189 69 251 34 219 243 127 149 160 241 135 83  }
      - { nodeId:7, parentId:0, weight:0.,
          descriptor:dbw3 0 32 120 188 156 250 169 237 81 143 187 63 164 25 191 247 64 26 129 247 237 16 58 75 218 51 219 211 85 123 192 64 135 42  }
      - { nodeId:8, parentId:0, weight:0.,
          descriptor:dbw3 0 32 37 103 105 69 116 15 239 120 117 160 251 78 211 65 157 48 120 204 86 110 201 178 109 30 102 172 161 4 109 187 82 160  }
      - { nodeId:9, parentId:0, weight:0.,
          descriptor:dbw3 0 32 46 180 224 91 253 125 208 223 91 255 189 29 74 253 94 60 221 222 247 21 190 122 251 211 95 95 213 255 215 204 222 215  }
      - { nodeId:676, parentId:9, weight:0.,
          descriptor:dbw3 0 32 42 180 60 219 253 245 221 111 159 127 189 31 138 252 62 133 205 155 223 149 190 111 123 215 63 95 222 255 215 76 223 247  }
      - { nodeId:677, parentId:9, weight:0.,
          descriptor:dbw3 0 32 111 182 240 91 239 125 250 216 123 127 63 61 78 253 222 191 183 207 255 55 151 115 187 241 95 127 65 239 222 231 207 87  }
      - { nodeId:678, parentId:9, weight:0.,
          descriptor:dbw3 0 32 41 173 224 89 253 221 244 255 95 237 188 24 170 252 214 180 217 202 214 28 158 122 247 247 63 93 21 127 211 140 222 238  }
      - { nodeId:679, parentId:9, weight:0.,
          descriptor:dbw3 0 32 114 246 108 52 122 11 153 253 27 255 181 253 74 125 142 19 159 213 213 37 184 70 201 31 94 95 125 247 111 172 134 243  }
      - { nodeId:680, parentId:9, weight:0.,
          descriptor:dbw3 0 32 186 178 236 93 73 95 209 127 119 255 247 31 106 157 70 63 205 156 255 132 174 254 255 149 95 251 209 247 107 140 86 255  }
      - { nodeId:681, parentId:9, weight:0.,
          descriptor:dbw3 0 32 110 164 176 90 221 125 214 202 219 183 189 11 74 248 93 190 217 219 239 51 62 107 218 243 31 94 69 127 215 125 94 134  }
      - { nodeId:682, parentId:9, weight:0.,
          descriptor:dbw3 0 32 46 37 232 170 220 117 219 216 19 237 189 141 147 237 95 8 221 222 215 247 158 98 250 146 127 93 173 253 213 255 214 210  }
      - { nodeId:683, parentId:9, weight:0.,
          descriptor:dbw3 0 32 47 118 224 147 237 61 252 203 91 255 61 159 200 236 223 174 157 75 243 157 183 118 254 210 30 95 213 255 207 255 218 215  }
      - { nodeId:684, parentId:9, weight:0.,
          descriptor:dbw3 0 32 62 180 242 114 215 255 112 107 123 175 253 57 110 249 78 156 189 191 215 16 62 251 216 215 31 223 21 127 227 76 206 143  }
      - { nodeId:757, parentId:684, weight:1.0986122886681098e+00,
          descriptor:dbw3 0 32 120 188 240 113 209 255 80 239 123 175 108 24 106 121 70 20 153 254 196 16 62 122 216 31 127 255 21 119 227 64 206 142  }
      - { nodeId:758, parentId:684, weight:1.0986122886681098e+00,
          descriptor:dbw3 0 32 38 180 240 66 255 123 242 75 123 171 185 56 78 249 76 188 191 159 255 48 150 51 248 210 31 220 17 127 199 79 198 135  }
      - { nodeId:759, parentId:684, weight:1.0986122886681098e+00,
          descriptor:dbw3 0 32 56 180 210 49 211 255 112 107 123 175 233 57 110 249 78 148 185 191 196 16 62 251 144 31 27 247 21 119 227 68 206 143  }
      - { nodeId:760, parentId:684, weight:1.0986122886681098e+00,  words:
.........      
      - { wordId:0, nodeId:19 }
      - { wordId:1, nodeId:20 }
      - { wordId:2, nodeId:21 }
      - { wordId:3, nodeId:22 }
      - { wordId:4, nodeId:23 }
      - { wordId:5, nodeId:24 }
      - { wordId:6, nodeId:25 }
      - { wordId:7, nodeId:26 }
      - { wordId:8, nodeId:27 }
      - { wordId:9, nodeId:28 }
      - { wordId:10, nodeId:29 }
      - { wordId:11, nodeId:30 }
      - { wordId:12, nodeId:31 }
      - { wordId:13, nodeId:32 }
      - { wordId:14, nodeId:33 }
      - { wordId:15, nodeId:34 }
      - { wordId:16, nodeId:35 }
      - { wordId:17, nodeId:36 }
      - { wordId:18, nodeId:37 }
      - { wordId:19, nodeId:38 }
      - { wordId:20, nodeId:39 }
      - { wordId:21, nodeId:40 }
      - { wordId:22, nodeId:41 }
      - { wordId:23, nodeId:42 }
      - { wordId:24, nodeId:43 }
      - { wordId:25, nodeId:44 }
      - { wordId:26, nodeId:45 }
      - { wordId:27, nodeId:46 }
      - { wordId:28, nodeId:47 }

可以看到词袋树的存储方式使用YAML格式文件进行存储.

其中vocabulary开始的4行为词袋库的参数(分支数\层数\算分方式\权重),从node行开始显示树的每个节点,比如上式中的

{ nodeId:1, parentId:0, weight:0.,
          descriptor:dbw3 0 32 218 95 126 252 59 222 127 244 189 204 254 173 127 255 39 113 246 245 253 226 236 195 178 238 243 251 39 139 38 183 47 123  }

表示该树的节点Id为1,父Id为0(0表示根节点),权重为0,该节点的图像描述子向量为

0 32 218 95 126 252 59 222 127 244 189 204 254 173 127 255 39 113 246 245 253 226 236 195 178 238 243 251 39 139 38 183 47 123

因为在cv::mat中存储的描述子数据结构为1*32的数组,每个元素类型为UCHAR,所以显示了32个8位无符号整型数的十进制表示

再举一个例子:

      - { nodeId:757, parentId:684, weight:1.0986122886681098e+00,
          descriptor:dbw3 0 32 120 188 240 113 209 255 80 239 123 175 108 24 106 121 70 20 153 254 196 16 62 122 216 31 127 255 21 119 227 64 206 142  }

这里的这个节点是有权重的,即1.0986122886681098e+00

读者可能有疑问了,为什么有些节点权重为0,有些节点权重不为0,这里解释两点:

1.对于非叶子节点,他们的权重必然是0

2.即使是叶子节点,其权重也可能为0,因为按照IDF的计算公式,该节点可能在每一张参与聚类的图像里出现过,那么我们认为该节点信息量为0,即权重为0

再看下面的格式:

   words:
      - { wordId:0, nodeId:19 }
      - { wordId:1, nodeId:20 }

可知,对于叶子节点,我们不仅给它配置了NodeId,同时也配置了wordId,注意,wordId是按照顺序对属于叶子层的word逐个进行从0开始编码的,这里的word就是我们词袋库单词的概念

2.TF-IDF的物理意义

TF-IDF(term frequency–inverse document frequency)是一种用于信息检索与数据挖掘的常用加权技术。TF意思是词频(Term Frequency),IDF意思是逆文本频率指数(Inverse Document Frequency)。它本质上表征了一个word在整个数据库中的重要性,每个word的权重 wi w i 计算公式为:

wi=TFiIDFi w i = T F i ∗ I D F i

其中第 i i 个word的IDF计算公式为:
IDFi=lnNNi

其中 N N 表示一共参与计算数据库的图像数,Ni表示多少张图像含有第 i i 个word,因此假设所有图像都包含了该word,则
IDFi=0
即该word的信息量为0,因为所有的图像都包含了该word,所以使用该word计算图像相似度毫无作用.
TFi=nin T F i = n i n
表示在某一张图像中,第 i i 个word出现了ni次,这张图像的总word数为 n n ,因此TFi本质上是表征了对于某一张图像,究竟某个单词出现的概率.而 TFiIDFi T F i ∗ I D F i 则表示了对于一个word,应该出现的频率.若 IDFi=0 I D F i = 0 ,该word的权重为0,若 IDFi0 I D F i ≠ 0 ,则我们希望该word在当前图像中出现的概率越高越好,那样就会有更好的区分度.需要注意的是,生成的词袋树只有IDF,没有TF,TF是对之后生成的词带向量才会计算,这个概念非常关键

3.对词带算分公式的解释

在DBOW3中,调用

double score(const BowVector &a, const BowVector &b)

API进行对相似度进行算分,本质就是对图像描述子的直方图进行比较相似性,考虑到BowVector的维度并不相等,比如v1含有100个元素,v2只含有40个元素.在此,作者并没有将权重等于0的word也算进去,因为这对算分意义不大,同时也增加了CPU计算量(多进行了N次for循环),作者在此采用非常巧妙的方式进行分数计算,公式详见文献Scalable Recognition with a Vocabulary Tree 公式(5)

qd1=i|qidi|1=i|di=0|qi|1+i|qi=0|di|1+i|di0,qi0|qidi|1=q1+d1+i|di0,qi0(|qidi|1|qi|1|di|1)=2+i|di0,qi0(|qidi|1|qi|1|di|1) ‖ q − d ‖ 1 = ∑ i | q i − d i | 1 = ∑ i | d i = 0 | q i | 1 + ∑ i | q i = 0 | d i | 1 + ∑ i | d i ≠ 0 , q i ≠ 0 | q i − d i | 1 = ‖ q ‖ 1 + ‖ d ‖ 1 + ∑ i | d i ≠ 0 , q i ≠ 0 ( | q i − d i | 1 − | q i | 1 − | d i | 1 ) = 2 + ∑ i | d i ≠ 0 , q i ≠ 0 ( | q i − d i | 1 − | q i | 1 − | d i | 1 )

该公式本质上是将一一对应相减后,对差值向量做1范数的操作降成只对权重不为0的元素做减法运算,其中 i|di=0|qi|1 ∑ i | d i = 0 | q i | 1 i|qi=0|di|1 ∑ i | q i = 0 | d i | 1 提出了权重为0的对应的另外一个向量的元素1范数,之后对 i|di0,qi0|qidi|1 ∑ i | d i ≠ 0 , q i ≠ 0 | q i − d i | 1 提取出了权重不等于的剩余部分,凑成完整的 =q1 = ‖ q ‖ 1 d1 ‖ d ‖ 1 ,因为之前做过归一化,因此1范数为1,这里的代码部分之后我会继续讲解

本文主要介绍了词带库算法中几个关键的概念,这几个概念对于后面的代码部分理解至关重要,下一篇将会介绍数据库格式

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值