5 月 26 日下午,在第二十八期七牛云架构师实践日,金城教授进行了《基于手绘草图的图像检索技术研究》为题的演讲。本文是对演讲内容的整理。
相信各位一直以来都用过非常多的图像检索方法,比如我们在百度里输入一个关键词或一张照片就可以找到一张图。在这样的使用过程中,大家都会面临一个问题,那就是得到的结果可能乱七八糟,不一定是你想要的图片。
而我们的图像检索和这样的方式稍有区别,举个例子,现在我想找张素材图,这边是座山,那边是太阳,只能输入太阳、山,不能输入左边是山、右边是太阳,而且内容可能比较乱。另一种情况就是用照片搜图,通常是为了找到完全一样的或更高精度的图片时使用的,但要找到一张比较类似的就比较难,例如上传小猫的图片,出来的结果基本都是不同尺寸的图片。或者是我家女儿画画,比如画一只鞋子,然后就可以找到跟鞋子长得像的图片,从而在淘宝上找到相应的商品。也就是说,根据我女儿画的草图,可以在一个非常大的图像库里找到相应的图。
其实草图很早以来就有非常多应用了。比如上图丰子恺大师的画,很简单的几笔就能描述一个场景或一个故事。但我拿这个图去百度图像检索,搜出来的肯定不会有月亮和茶壶、一个人坐在那里。于是我们就考虑,怎么解决这个问题。
上图是最古老的古埃及象形文字,跟我们古代的经文、甲骨文非常相似,同属象形文字。这是我们做这个事情的一个有趣出发点。
上图是在印度尼西亚某个山洞里拍摄的,是一副我们先人在岩洞里画的画。左边是 3.5 万多年前的一只猪,右上角是一个人把自己的手放上去画了一张图片。这两张图虽然出现在一起,但隔了大概 4 千年。这个猪现在还能找到。
由照片可见他们写实水平还是可以的,画的样子非常像猪。那么我们不禁畅想:有没有可能找到岩画的考古现场,就能直接通过图形找到网上的照片?这是很有趣的事情。
如果说刚才的图画得还不够好,那么上图就已经很清楚了,这个动物有角,身上有很多毛,感觉绘画水平有提升。但其实这张图更早,大概距今 4 万年前,和上图一样的是,这张图现实里也有相应的动物。
而在绘画水平不够好的情况下,我们掏出手机画个画,能不能找到跟这个画相似的东西?比如小朋友到博物馆,一定非常无聊。所以我们想,有没有可能搞一个大屏幕,让孩子可以画画,画出来一个碗,然后告诉他,这个博物馆有这样的碗,这就是一个比较好玩比较酷的事情。
以上这些想法,就是我们当时做这件事情的动机。
我们看这个问题具体是什么样的?
我们自己手画的图,一看就知道,第一个是埃菲尔铁塔,中间是金字塔,最右边是有很多柱子的古罗马建筑。那能不能从库里把类似的图片找到?我们跟以前的检索有着不一样的输入方式,从而是可以找到的。在网上抓图的时候,有很多图像标签文字,而事实上百度、Google,任何搜索引擎的大部分方式,就有这张图以及文字、标签。以前在百度里做图像检索,输入标签,事实上是这张图里出现过的或者语义上相似的。通过这些文字才可以找到,但它并不知道这是一个金字塔还是什么。
我们要做的事情,就是输入图以后,找到一系列的图,里面有些是 Relevance 相关性的。然后下面打个分,1 表示是相关的,0.8 可能不是那么相关。输入这个图,正确的 Relevance 应该是 0.96 是最像的。后面的金字塔可能因为只是两边的样子比较像,所以是 0.82。我们希望输入一个草图,从一个库里找到一系列这样的图,然后按相关性排序,这是我们的任务。
我们做了一个方法,如下图所示:
它分成线上线下两个部分。离线部分有数量庞大的图像库,我们首先把其中的图片转化为类似草图一样的图,这样的图才能做有效的对比。然后我们对它提取特征,画出来的图也会在同样的网络里提取特征,两相比较就能得到一个排序。但有的时候我们觉得,这个排序不一定完全靠谱,所以我们会重新做一次排序,把真正相关的排在前面。
这里面有三个核心问题:
第一,怎么把彩图变成草图?
第二,特征怎么提取?
第三,怎么做重新排序?
我们用搜索引擎会发现,很多图像检索的结果很差。我们希望输入这个“埃菲尔铁塔”,别出来奇怪的结果,或者至少奇怪的结果排在后面。为了达到这样的目的我们是这么做的:
首先就是做到类似草图的样子,比较简单的思路就是边缘特征。目标是从照片变成像手绘一样的图。当然边缘有很多不同的方法,这是一种提取的方法,但里面还是有很多的杂质以及噪声。我们用这个方法,加强了外轮廓的概念,把相应的背景噪声和细节噪声去掉。类似于草图的生成,这是我们的第一步工作。
有了刚才的图,然后开始对它提一些特征。我们可以这么理解特征:有两张图片看上去差异非常大,但我们如果希望这两张图片是某一张图片,它一定在某个特征上是一样的,或者说把它们从一个很高维度的空间转化到一个维度空间的时候,是一个点。比如二十个幼儿园小朋友,可以分成男生、女生,虽然男生之间长得不一样,但他们的共同特征是男性。这样就从人的高位空间,直接映射到了一个一维空间。所以我们要找到一个有效特征来证明这两个东西是一样的。同时另外重要的是,如果是不一样的,在新的空间里应该尽可能远离。
接下来我们提取草图图像里的很多局部的小块,输入网络。这是里面的细节,同时整张图也很重要,我们用了一个专门的网络,把两部分得到的相应的小特征再进行整合。这个网络的特点,就是希望所有的输入经过某个网络变换以后,能得到被压缩或提取过的新特征,这个特征值通过完全相同的逆向操作能还原回来。好比一个加密和解密的过程。这样如果能做到加密以及解密,我们就认为这个特征很好地保留了原来的信息,同时又能做到一定程度的压缩。这就是一个比较好的特征。
然后我们需要做 Re-ranking optimization 重排序的优化。
传统的工作,我们可能得到这样的排序结果,有什么办法把排序做得更好?一个比较简单的方法,这几张图本身长得就很相似,可以把所有的图根据表面相似性进行聚类。这个方法如果靠谱,排在前面的图中,大部分应该确实是这个图的内容,这是我们一个假设。如果这样,就可以进行聚类。聚类以后数个数或是计算某个值,就可以判定某类比较相似,这样就可以把这类的图片权重进行调整,然后得到最终结果,有的排在前面,有的被排在后面。
比如说搜“埃菲尔铁塔”,旁边可能站着某个美女,你进行聚类,就会知道长得像埃菲尔铁塔的图会往前排,而有美女的应该会往后排,这是一个 Re-ranking 的方式。
这是青花瓷的图,我们抓了一张博物馆的图,有 9 百张照片以及 10 万张其他的照片,大概 30 个不同的样子。我们的结果,左边显示的是输入这个图以后前 8 个没有做 Re-ranking 的结果,右边的是做了 Re-ranking 以后的结果。基本效果就是输入这个图,蝴蝶就会排到很后面,碗可能也排在后面。
这个工作需要量化分析,所以我们定了一个怎么量化看效果的工作。比较简单的方式,前 8 个里有 6 个是的。我们跟其他的方法做比较,总的来说效果还是排在前面的。
做完这个事情我的研究生问我,接下来需要做什么?我说再想想这个事情还有什么可以再挖一下的。我们想了很久,发现图片或素材本身,不光有图像本身,有时候还带有标签信息、文字信息。为了把图像本身和文字信息、甚至草图本身用起来,我们又做了一个事情。
跟前面不一样,除了原图,我们还把它的草图也放进来,然后把标签也放进去。这个时候出现了不同的特征,有的是视觉上的特征,有的是跟文本相关的特征,我们需要把它融合到某个区域里。三个不同的特征,你要一起用的时候,就必须考虑怎么把它有效融合,因为它们可能是完全不一样的语义内容。
融合的思路很简单,就是怎么映射到新的空间,使得相关的内容尽可能接近。
第一就是怎么做到多模态特征的生成;
第二是怎么做到合在一起,映射到一个有效的空间里;
第三就是怎么做搜索优化。
搜索的时候我们可能只有草图的输入,它的特征提出来,跟某一个可能比较类似,也会被映射到空间里,我们就找这个空间里跟它最接近的几个。
怎么做这个特征?第一是图特征,草图也可以用刚才的方法做,第三个是文本。所以我们借鉴了自然语言理解的进展做这个事情,比如扇子,有中国的扇子,还有书法标签,每个图都可能有几个标签。这个时候,我们就做向量,把所有的标签放在这边,然后数。
拿最后的图作为一个例子,以 Chinese 这个标签做例子,我们可以生成一个向量,针对 Chinese 的第一张图有,第二张图就没有。现在要做的事情,就是把它有效融合起来,2/3 个图里有这个标签,所以我们做了特殊的权重设计,使得它能对不同的标签做加权和。这样就能对词的文本特征提取出一个相应的特征值出来。这是我们在文本方面做的工作。
现在有三个不同的特征了,然后就要找到一个合适的方法。用 MDCCA 的方法,映射到同样的一个维度空间里,使得同一个物品的三个特征在新空间里尽可能接近,而跟其他不一样物品的特征尽可能远离。
然后就是做比对。
最简单的,就是每个特征跟输入值的特征一一比较,这些特征都是在映射到新空间里的比较,然后比较完,每个特征的相似度就要乘以权重,然后加权得到最后的相似度。我们用了一个比较复杂的方法,数据库里每张图都做输入,对库里每个结果算出一个值,把这个值复制一下,然后做对比。这样不管用什么方法,都能得到一个排好序的结果。最前面的是比较靠谱的,就当作是正向值,后面几个最不像的就当负向值,然后训练比较这三个新的值,得到相似度的重新排序。然后就是做效果,我们改变了一下算分的模式,前面很简单,就是每个都求一个百分比,这次我们把错的那张图,或者不相关的图出现的位置也考虑进去了。比如我输入一张图,得到结果以后,会计算一个不一样的 Precision。相关的就是 1,不相关的就是 0。乘起来,最后得到一个 85% 左右的 AP 值。我们希望错误的图出现在越早的地方,惩罚度就越高,按这样的思路去设计。
这是我们实验输入不同的草图得到的结果。基本还是比较靠谱。有些是错的,比如多了一个脚;比如东方明珠,有个别是埃菲尔铁塔的图片;比如悉尼歌剧院,出现了向日葵。还是有很多错的地方,但是做图像检索,前面几幅图确实跟原图非常相似。后面我们也加入了跟位置相关的分析。
这是博物馆数据的结果,也有一些乱入的情况。我觉得它的本意应该是书一样的东西,但这个结果,你说它错也不能完全这样说,因为体现的是不同的特征。这是草图的,还有文本的,还有 image 本身的,特征越多,效果就越好。
活干完以后,学生又问我,这个事做完了,下面该怎么做?我们就想,图的信息用了,文字信息也用了,效果不好,那是什么原因?然后我们发现还是有 bug 的。
比如这张照片,是一只小猫躺在那里。前面的是一个个不相关的词,现在是句子,可能更接近于我们现实生活中的图像数据。比如我们发图到朋友圈,都是在为各大运营厂商提供大量的数据标签,比如你发图说陆家嘴风景好,它就会记下来。这是一个小猫,还有一个羊站在草坪上。然后有个人画了一张图,你说是猫也没有错,说是羊也没有错,但看上去,更像一只猫,有两个尖耳朵,还有胡子。这个时候就有语义的问题了,不光是简单的标签,可能是一个句子怎么做理解的问题。
我们这次就不再分复杂的文本特征或是图像本身特征或草图特征了。所以我们在文本上针对文本句子内容,提取出一系列相应的特征。然后草图进来,就只有 CNN 的特征了。然后再进行约束,一方面希望尽可能分类准确,另外希望尽可能在视觉相关性上是相关的,尽可能长得像,分得对,要达到一个平衡。也要有一个参数来平衡 loss 的内容。
我们做了加权,用了 Skip-thought Model,给定一个句子,经过某个特征提取出来以后,能生成它前面和后面的句子。这听上去好像很 bug,但各位如果对文本领域的新进展比较了解,就再也不要相信某些点评网站上的评论了。因为现在的评论都可以生成,海量的评论可以生成出来。给我一个句子、主题,就能生成一段话,告诉你这家餐厅的菜特别好吃,服务员也热情,或者说牛排好吃。现在文本领域的进展非常惊人,我们希望能用相应的文字,生成上一句、下一句,并回到原来的文字,这样提取一个比较好的语义。其他的东西,几乎没有什么变化,这里面最大的变化,就是对整句语句、文字内容进行分析。这次我们换了一个数据集,每个图片都有一个草图,同时有一句话来描述它的内容。
这是 Sketch,有 125 个不同的 object,每个有 100 张照片,请不同的人来画草图,每个飞机会找 5 个人左右来画,一共 7 万多个不同的 sketch。我们希望能输入这样的图,找到相应的结果。
这次跟前面不一样,因为这次有强的语句描述,所以我们希望尽可能 Top1 就是结果。我们得到的情况,有些图太 bug 了,什么脑洞才能画出来?这里面所有的图都是当年照着图画的,我只是抽了里面的某个 sketch,希望找到原图。事实上确实是当年画出来的,但这个结果太不一样了。还有一些不太对的结果,比如一把伞,还有海龟,我们找到的跟它也是比较类似的。总的来说效果还挺好。
我们进行比较。最上面的是 human,就是找几个学生过来,拿草图去找到底是哪张图,在 Top1 的人大概 54%。
做完以后我们又在想,是否可能把位置信息融进去。所有的检索结果,都是同一物体,现在我们希望再把不同的物体结合起来做一个内容。另外我们在做很多相关的研究,比如人脸识别和其他的一些应用。如果大家感兴趣,可以随时跟我们来交流。
今天我的演讲就到这里。非常感谢大家!
作者简介:
金城,复旦大学计算机科学技术学院教授、博士生导师金城。上海视频技术与系统工程研究中心执行副主任,上海市优秀技术带头人,主要研究方向为图像视频信息处理、分析与检索,围绕视频监控、多媒体内容挖掘与检索,互动辨识等开展相关研究。
本文转载自公众号七牛云(ID:qiniutek)。
原文链接:
https://mp.weixin.qq.com/s/MFg94HY8c4Ozeb3FhstL7w
评论