zoukankan      html  css  js  c++  java
  • Instance-Aware Hashing for Multi-Label Image Retrieval 解析

    源代码百度云链接: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条哈希码,就是我们前面讲的语义哈希;另一个是表示为多条哈希码,每条哈希码和一个种类相关。种类已知哈希。(先写这些吧,过几天再陆续加)

     

     

     

     

     

     

     

     

     

  • 相关阅读:
    Spring Boot 使用 Dom4j XStream 操作 Xml
    Spring Boot 使用 JAX-WS 调用 WebService 服务
    Spring Boot 使用 CXF 调用 WebService 服务
    Spring Boot 开发 WebService 服务
    Spring Boot 中使用 HttpClient 进行 POST GET PUT DELETE
    Spring Boot Ftp Client 客户端示例支持断点续传
    Spring Boot 发送邮件
    Spring Boot 定时任务 Quartz 使用教程
    Spring Boot 缓存应用 Memcached 入门教程
    ThreadLocal,Java中特殊的线程绑定机制
  • 原文地址:https://www.cnblogs.com/mafang/p/5932700.html
Copyright © 2011-2022 走看看