哈希编码就如同从一组图像中学习到一种映射,
可以使图像映射至二值的哈希编码上。可以想见,这是一个困难的问题。对于这个问题,传统方法的解决思路是:先对原图像用人工提取的特征来表达,即先从原图像压缩至特征表达,然后再从特征表达映射至哈希编码。
以KSH(Supervised Hashing with Kernel)为例,其所代表的算法如下。
- 提取特征。在训练集
内共含
张图,遍历
,对第
张图提取人工特征,如HoG、SIFT等,然后将特征连接起来形成一个长向量来表达该图:
。
- 分解相似度矩阵。
- 将
按照标准的两两相似/不相似结果构建矩阵
。(即1为相似,0为不相似,则
为0和1组成的矩阵,且
为图
和图
相似与否的标注结果。)
- 将
分解成
,使得
,则
为训练集
对应的哈希编码矩阵,其第
行对应图片
的哈希编码值。
- 将
- 求得特征表达至哈希值的映射
:
。训练学习结束。
- 测试时,对应图片
,先同样提取特征表达
,再根据映射
得到其哈希编码
从以上步骤可以看出,难点集中在第(2b)步,即将相似度矩阵分解成可能的哈希编码矩阵
,并且约束
的取值为0或1。因此,研究者针对如何近似分解相似度矩阵做了大量艰苦的工作。尽管如此,传统方法还是有很大的局限性的。比如,如果训练集过大,则意味着
也会过大,分解起来会变的十分困难,甚至不可达成。
而深度学习介入后,这些局限被逐渐打破。深度学习的应用也不是一蹴而就的,在逐步尝试和摸索后,终于找到了一条简捷有力的途径。