如何快速搭建一个简单图像搜索引擎

来源:互联网 发布:单晶叶片 知乎 编辑:程序博客网 时间:2024/05/29 18:57

    这里只是图像搜索入门级的note,要更好的架设一个完整的图像搜索引擎,可以参考:图像处理,图像识别(计算机视觉),机器学习领域中的论文。

图像特征

    图像常用的特征大概包括了:颜色特征、纹理特征、形状特征、空间关系特征。而如何合理的提取图像特征是制约图像搜索或者其他图像识别相关任务的关键问题。

    传统(或者非学习)的图像特征算法,比较常见的有:SIFT算法及其变种,指纹算法函数,bundling features算法,hash算法(phash...)等,这些算法的实现大多数都可以在opencv库中找到,这些算法都或多或少的缺点,尤其在图像搜索精度方面,在大规模的图像搜索上也许还看的过去,在小样本下的图像搜索精度就比较差劲了。

    其实图像特征一提取那么搜索也就简单了,无非是度量矩阵的相似度,更高的相似度排的更前面,且根据相似度的阀值过滤掉不太相似的图片。当然其中有一些计算复杂度的问题,如果单纯的根据KNN(K-Nearest Neighbors)来排序的话,速度会异常的慢,计算复杂度为O(n^2),我们可以先通过聚类(Cluster)算法先将部分图片聚类产生类中心(或者根据已有的分类中心),然后将其他图片划分到聚类中心去。检索的时候先将检索图片到各个类中心的距离作对比,划分到K个最近的类中心,再在该K个类中作KNN,那么计算复杂度会降低很多,或者使用基于Kd-tree的最近邻搜索也许更快。

图像预处理

   图像预处理大概包括了以下几个过程:

   1. 图像损坏检查并删除
   2. 图像格式转换为3通道类型,即转换为我们常说的jpg格式(灰度图为1通道,png为4通道,jpg为3通道)
   3. 图像缩放为固定格式的大小(如:[224,224,3])
   4. 图像平滑去噪,如:中值滤波,算术平均滤波等等

    ...

特征提取

    这里的特征提取算法,主要是使用深度神经网络(混合其他特征应该会更好),因为深度网络模型的训练是非常耗时的,加上调整参数可能需要几周的时间,所以这里我们使用预训练(pretrained)模型来提取图像特征。本人的另一篇文章: 使用mxnet的预训练模型(pretrained model)分类与特征提取 已经写了如何通过mxnet来作图像的特征提取,也可以通过其他框架(如:tensorflow)来做特征提取,要稍微复杂一点,这里不赘述。特征可存储为text文本格式或者类似于numpy(numpy.save,numpy.load)直接保存矩阵(比较少的情况),或sql,nosql(lmdb,mongodb)。

    PS:因为通常预训练模型都是通过ImageNet训练得到的,所以他的特征粒度比较大(特征不完备),那么对于比较狭窄或者要求粒度比较细(如:仅仅在各种水果中)的检索问题,我们可以通过自己的数据来调整分类器,然后再在训练好的模型中提取特征。

图像检索

    图像检索,在上面已经提过了,距离计算通常可以使用cosine相似度和欧几里得距离。如何就是排序得到TopN的相似图像。


0 0
原创粉丝点击