源代码百度云链接:http://pan.baidu.com/s/1pLTtbM7 密码:8o2r
深度学习入门选了这篇文章和相应代码,纠结了两三个月,加上师兄讲解,现在才勉强搞懂,写出来,自己总结一下,也希望其他人少走点弯路,之后还会写一篇关于本文代码的博客。由于我是从小白开始的,所以这篇文章会尽可能清楚,请大牛们不要介意我唠叨。我写的有错的地方,欢迎大家留言,我更正。
文章目的和哈希码(hashing)
讲文章目的之前,先讲一个概念,叫哈希(hashing)码。当初纠结好久,查了论文,现在就凭我自己的认知写吧,尽量直白。哈希码总的来说,就是用一串0、1码代表,在本文就是代表图片啦。文中有两种,一种叫语义哈希(Semantic Hashing)。以图1为例,给了查询图片,针对这张图生成一条语义哈希码,这条哈希码可以是32位,48位,64位等,在此以16位为例。假设生成的语义哈希码是这样0010001001011001,本文中的哈希码是保留相似性的哈希(Similarity-preserving hashing),相似图片生成的哈希码也是相似的。那么它可以对数据库中其他图片也用相同方式(后面会讲是什么方式)生成哈希码。假设还有一张图,哈希码是这样的0010001001010001,那么就可以认为这两张图片相似(只有一位哈希码不同),就得到了如下图1(5a)那样的结果。另一种叫Category-Aware哈希。这种哈希是重点。注意名字中的Category-Aware。种类已知。如下图1,给它一张图,经过吧啦吧啦的处理,它对每个种类,如下图的自行车和沙发各生成一条哈希码。一条哈希码代表自行车,那可以检索带自行车的图;另一条哈希码代表沙发,可以检索带沙发的图。文章的目的就是对多标签图片(一个图里面有多个object)生成这两种哈希码,可以用于检索。(作者给的代码里只生成哈希码,检索的代码要自己写,呜呜,就为这浪费了好几天)
图1
步骤
从一幅图到一条哈希码(语义哈希)或多条哈希码(category-aware hashing)是怎样做到的呢?分四步,第一步,把冰箱门打开;第二步,把大象放进去。。。好啦,接下来是四个步骤。先看图吧。
图2.对多标签图像生成哈希码的深度结构。先接受一张图(假设该图所在数据集一共c类),接着生成N个proposals作为输入。先经过深度卷积子网络(GoogLeNet),通过SPP方法得到N个临时特征向量(每个临时特征向量针对一个proposal)。有了临时向量,接下来有两个分支:一个分支计算区域的标签概率(见图3),另一个分支生成proposal特征。
1.四部曲之生成proposal
proposal是什么呢,就是用算法处理图像,针对object把图像分割,这样提取的特征可以代表特定目标。如下图2红色部分就是proposal。也就是算法认为哪一块可能是一个object。本文中用了Geodesic object proposals(GOP)方法生成proposal。这个方法先不细讲了,以免影响大家对文章的整体理解。总之,把图像扔给GOP方法,它会给你多个proposal,就是它认为哪里可能是一个object。这多个proposal肯定会有重叠部分,不会像图2那么理想。其实生成的proposal是坐标的形式,左上角的横纵坐标和右下角的横纵坐标四个数字代表一个proposal。
图3.proposal
2.四部曲之深度卷积子网络
GooLeNet这个网络提取图像特征效果很好,作者就以它为基础。用它提取proposals的特征。但是我前面也讲了proposals个数很多,要是用户给了一张图,你针对这张图里生成的每个proposal都用GoogLeNet这种深度网络处理一遍,那黄花菜都凉了。这里,作者用到了另一种方法Spatial Pyramid Pooling(SPP)。SPP的好处是我们可以先把整张图用GooLeNet提取特征F,然后对每个proposal,直接根据F生成固定长度的表示。(可以理解为先计算整张图的特征F,需要哪块再从F中提取相应位置特征)。
3.四部曲之标签概率计算模型
这个模型是干嘛的呢?前面不是一张图生成了多个proposal嘛,这个模型可以告诉你,每个proposal包含每个类的概率是多少。很厉害是不是,可是我们只有整幅图的标签呀,还拿图1那个自行车和沙发的图说事,根据标签,我们只知道图里有自行车和沙发,你怎么知道每个proposal有自行车或沙发的概率呢?作者用了一个厉害的办法,见图4.对一个有着N个proposals的图(c类),我们的工作是对每个proposal生成一个概率向量,这个向量有多长呢,c那么长,因为有c类呀。接下来如图4,N个proposal的概率向量就堆在一起,针对每一位,都选该列最大的拿出来,放到最后的概率向量里去。举个例子,N个proposal概率向量的第一位拿出来比,嗯,第3个proposal第一位的值最大,那就把这个值放到最后的概率向量去。这个方法叫什么cross-hypothesis max-pooling.图4最后那部分,不就可以代表整张图了么,因为你把它里面所有的proposals都包括了,正巧我们还有整幅图的标签,这就可以开始训练了呀。原谅我先不讲细节了,太痛苦。。。先讲个大致。
图4.传说中的标签概率计算模型。
4.哈希编码模型
终于要开始编码了,这部分两个任务,一个是把整幅图表示为1条哈希码,就是我们前面讲的语义哈希;另一个是表示为多条哈希码,每条哈希码和一个种类相关。种类已知哈希。(先写这些吧,过几天再陆续加)