开发者学堂课程【高校精品课-华中科技大学 -智能媒体计算:多媒体搜索现状(上)】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/811/detail/15695
多媒体搜索现状(上)
图像搜索
基于文本
使用与图像相关的文本
网页图像搜索,使用图像周围的文字
Text in URL for image filename
Text in HTML on page
文本信息跟图像之间建立联系,搜索算法实际上跟文本搜索是相同的。
与文本搜索相同
举例:
Google Image Search for “Sunset” gives
Sunset at Rocky Point in Australia
Sunset BeachOahu
Frank Smiles at Sunset
因为“sunset”出现在图像的标题中
用七八年前的百度搜索布什:
排在第一位的是一条狗。为什么搜布什会搜出来一条狗呢?把这个页面打开,讲的是布什每天早晨会遛狗。网民很感兴趣为什么这张狗的照片会排在前面,就会点一下。
当时搜索引擎为了提高图片搜索的准确性,加入了一个投票的机制,叫相关反馈。搜布什出来很多图片,如果点了这张狗的图片就默认这张是布什的可能性要大,点的人越多,它的权重越高,排序就越靠前,所以当时这张图在前面排了很久,也说明了那个时候人们对图像的内容的理解还不够准确。
在百度里面再输入天空中飞着两只小鸟,搜索的结果:
排在第一个的打开看一下:
为什么会出现这张图片?
就是因为这个文本里面出现了这样的文字。而我们真正想要的图片是蓝天白云,在天空中自由飞翔的两只小鸟。在人们对图像的内容理解不深的时候,搜索引擎利用文本是这样的。之后过去了大概十年的时间,
打开百度输入天空中飞着两只小鸟或者布什,这样的现象已经没有了:
现在已经可以基本准确的搜索到想要的图片,原来没有办法理解图片内容的时候只能通过图片周围的文字。这是一种基于文本的图像搜索。
基于标签
通过图像的标签
标签是用户手工添加
搜索时查找与查询词匹配的标签
局限
标签需要大量人力进行标注
标签的主观性很强,容易产生歧义
相同的图片,不同的人打标签可能是不一样的。即便是同一张图片,人在不同的心理状态下,描述的语言可能也不尽相同。举个例子,正在热恋之中的人,看到手拉手在一起很甜蜜的照片,描述的可能是溢美之词;相反,如果在一个失恋的状态,去给这样的图片打标签,打出来的可能就不是那种特别正面或者积极的标签。这就使得相同的图像,标签的客观性可能是不够的。
比如上图这张图片,有人可能标的是动物的名称,有的可能标的是可乐,有人标的是雪地等等。
既然文本图像有很多的问题,那么近几年人们就想能不能从视觉的内容上去找。提交一张图片,能不能找出与提交的这个图片相似的图片,也就是所谓的以图找图。
以图找图
英文 qbe,也就是 query by example。
查询输入为图像
搜索与查询图像相似的图像
比如输入这个图像:
可能与它相近的,返回来的是这样的照片:
相似度通过图像的特征计算
颜色
Color Histogram
Color Corellogram
图像描述符
Gradients at image keypoints
Quantize for “Visual words"
主要通过图像的特征,比如颜色的特征,像颜色直方图、主色、颜色分布等等。
还有图像的一些其他的描述符,比如在 MPEG7里面有很多的关于图像的描述,还可以通过纹理,形状;比如搜素香蕉,香蕉除了形状还有颜色;再比如搜红色的苹果,颜色形状一起;还可以通过搜索图像里面的一些对象比如人脸。通过检测人脸,再通过人脸识别,能够把图像里面含有人脸和含有特定人脸的图片找回来,这都是以图找图。
比如要找故宫,可以在百度里面输入故宫,它会返回这样的图片。选一张这样的图片,这是输入的样例图片:
把图片选择之后,可以通过裁剪中间的区域,提交之后下面的是百度搜索出来的与这张图片相似的结果:
这是以图找图。现在百度的以图找图比前几年好了很多。下面再看一下谷歌。
谷歌在很多年前已经实现了这样的功能。输入故宫,会出来很多结果:
把鼠标放在特定的搜索的结果的图片上,有的图片呢就会跳出来下面这样一个提示,叫搜索类似图片
点击类似图片,就返回这样的结果:
前面的图片相当于样例图片,找类似图片就是这个结果。输入的这张图片有蓝天白云,有故宫的琉璃瓦,类似的图片也都有蓝天白云和故宫的琉璃瓦。这是怎么做到的?
那个时候不让提交图片,但是搜索结果里面可以去选,也不是所有的图片都有寻找相似图片的功能。为什么搜索结果又快又准?反向实现这个过程发现,在这个机器学习的时候有一个算法叫做聚类。
聚类算法里面有一个最简单的方法叫 k means, k 均值法。K 均值法的K是可以人定义的,比如把一组数分成 K 个组。这个 K 定好以后随机的从N个数里面选择K个数,其他的数据跟N个数求差,然后把这些其他的数丢到离它最近的组里,这就是迭代。由于新的元素进去,每一个组的均值会发生改变,然后再迭代,再去找每一个数值离它最近的组。就这样反复迭代就可以把这 N 个数分到 K 个组里面。这是个非监督的机器学习算法。
但是有一个问题是 K 值需要提前知道,也就是要知道提前把它分成多少组。谷歌没有公开算法,人们发现其实就可以用K均值法,把这个 K 值取得足够大。比如当互联网上的照片分成20组的时候,每一组之间差别很大,组内也不一定相关。但是当把它分成20000组甚至2000000组的时候就可以出现精确的效果。
每一组里面的图像都特别相似。如果k值取得越大,大到一定程度的时候,K就无所谓了,就是把K的聚类方法变成了图像的分类分组。这些过程是提前做的,也就是说谷歌这个操作里面的所有结果,提前已经通过K均值算法把它划分到一组了。提前定好了是这一组,找出来的照片只要包含在这个组里,搜索相似图片,这些所有的照片都会被呈现。由于这里面的相似度是非常高的,因此谁排在前面是无所谓的。
Faces
通过寻找图像中是否有人脸。人脸的特征是非常明显的,找到人脸以后,还配有人脸库,就可以拿人脸库的已经标注过的人脸去跟图像里面检测到的人脸进行识别,就可以通过一个特定的人脸找到含有这个特定人脸的图片。
在人脸的这种正面照的情况下,准确率是足够高的,但是在侧面,也就是说人脸没有完全露出来的时候,目前这个准确度是不够高的,但是它是一种图像搜索里面早期大家研究比较多的一个方法。