提到搜索,大家首先就会想到中国的百度、美国的谷歌。目前我们用的比较多是基于文本的搜索引擎。进入21世纪,图片在我们生活中越来越重要,就促进来图片的搜索引擎的发展。目前比较有名的图像搜索引擎厂商有:Tineye、谷歌图片搜索、百度识图搜索。
图像搜索的难点
1. 图片质量
图片在传播的过程中,为了减少图片的大小,选择进行格式转换,使用有损压缩;或者进行图像放大、缩小等操作都会引起图片的质量的下降。
2. 水印
现在是版权时代,所以图片被上传到一些网站,网站为了表示版权,都会在图片上加上自己所属的版权水印,这样也产生了噪点。
3. 速度
作为一款的图片搜索引擎,速度总不能太慢,但随着图片库越来越大,直接导致了搜索的速度下降。如何快速搜索也是目前一大热门。
4. 图片特征提取
图片特征提取是图像搜索最核心却有最困难的点。由于图片各种各样,传统的特征很难有效的表示图片的信息。我们需要一个能够丰富的表达图像信息的特征。
facenet模型
facenet是谷歌提出基于深度学习的人脸检测算法,其核心是通过深度学习有效的将图片映射到欧式空间。
1. facenet模型的结构
模型的前半部分就是一个传统的卷积神经网络(可以根据需求,使用VGG或者ResNet等模型),求L2范数获取到128纬度的特征值。本模型最大的亮度就是Triplet loss的损失函数的提出。
2. Triplet loss
(1)Triplet loss的公式
x 是输入的图片,f(x)∈Rd 是 CNN 表示后的特征向量公式为:
(2)Triplet loss思想
一般的损失函数是二元,一个是模型预测值,一个是正确值,通过不断调整模型参数达到预测值和正确值的差距最小。而Triplet loss是三元损失函数,它的目标是让类内的距离小于类间的距离。
假设我们有一个图片样本是Anchor 另二个样本分别是Positive,Negative;其中Anchor和Positive是同一个人A的人脸图片,Negative是第二个人B的人脸图片。Triplet loss的目的就是要A的二张图片Anchor和Positive 的距离 要小于A人中Anchor图片和B人中Negative图片的距离。
基于facenet的图像搜索
由于近几年数据量成指数的产生和计算能力的大幅提升,带动了deep learning的发展。
卷积神经网络对图片这种多维层次的信息的数据能够更好的去表达。在卷积神经网络中,每一层的中间数据都可以代表图片在某些纬度的信息,相比传统sift,hog,表达信息会丰富一些。
Facenet是谷歌用来解决人脸识别的深度卷积网络,由于该框架解决了图片信息到欧式空间的直接映射。所以使用facenet模型来做提特提取。
1. 三元组的选择
训练facenet,就要选择三元组。在人脸识别中,每一个人的照片至少会有2张,可以很方便的组合三元组。而在图片搜索里,每一张图片都是一个独立的个体。因此还需要生成一些图片。
训练过程中,随机选取样本图片A,然后对A图片进行旋转、尺度、噪声等变化,产生一张新的图片B,B就是A的Positive图片,可以理解为图片A和B 图片在人脸领域代表同一个人。随机从训练数据库中抽取一张非A的图片为C。C就是A的Negative图片。这样(A,B,C)就是训练过程中三元组。
2. 特征比较和优化
通过训练好的facenet模型,我们就可以得到每张图片的128纬度的特征值。将每一张图片的特征值存入数据库中,得到图片库的特征库。搜索的时候,拿到搜索图片,首先计算搜索图片的128纬度的特征值,使用欧式距离算法,通过同我们事先计算出来的特征库比较,按照距离的大小排序,即可得到最相似的图片。
由于高纬度的特征之间相似度比较的运算量会特别大,比较时间是随着我们的图片库的增大而增大。所以在图片库较大的情况下,直接去做挨个图片做欧式距离的计算是不可取的。
我们可以分层次比较。将每一张图片得到的128纬的特征值,通过设定阈值之后,可以将128纬度的浮点向量变换成01的二值向量。这样每一张图片都可以得到二层的特征值。第一层是128纬度的二值向量,第二层是128纬度的浮点向量。首先获取搜索图片第一层特征值,使用汉明距离算法,计算出同特征库的第一层最相似的若干图片,假设为100张,然后同这100张图片使用欧式距离,计算第二层的特征值距离并排序,即可得到相似图片。
图像搜索引擎的研究已经持续的很长时间了,由于之前一直没有解决图片表示的难点,一直没有突破。近些年,随着深度学习的快速发展,其有效的解决了图片有效特征提取难的问题,让图像搜索技术在生活中迅速应用起来。但是深度学习存在计算量大,硬件成本高等缺点,也制约着图像搜索引擎的普及。如何快速而有效获得图片的表示现在依然是一大研究热点方向。