如何快速搭建一个简单图像搜索引擎
2017-08-08 08:43
435 查看
搜索引擎图像搜索深度网络
2017-03-03 13:38
313人阅读 评论(0)收藏举报
分类:
machine learning(15)
版权声明:本文为博主原创文章,未经博主允许不得转载。
目录(?)[+]
这里只是图像搜索入门级的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的相似图像。相关文章推荐
- 如何快速搭建一个简单图像搜索引擎
- Jenkins——如何快速搭建一个简单的基于 Jenkins 的持续集成环境
- 如何快速地搭建一个简单的网站(Appserv+MySQL)
- 如何从头搭建一个搜索引擎_简易的网页框架web.py
- (扫盲贴)如何搭建一个简单的本地PHP服务器-WAMP基础指南
- 手把手教你如何搭建一个自己的安卓快速开发框架之带你做自己的APP(四)
- 如何搭建一个简单的本地node.js服务器
- 【Head First Servlets and JSP】笔记6:什么是响应首部 & 快速搭建一个简单的测试环境
- 用 Matlab GUI搭建一个简单的CBIR图像检索系统(二)
- 【自动驾驶】如何利用深度学习搭建一个最简单的无人驾驶系统
- 如何快速搭建一个完整的移动直播系统?
- mybaits入门---快速搭建一个简单的mybatis项目
- 手把手教你如何搭建一个自己的安卓快速开发框架之带你做自己的APP(二)
- 如何搭建一个简单的服务器
- 如何简单便捷的搭建一个网站 - 基于Django
- 快速搭建一个简单的spring+maven工程
- 如何快速构建一个简单的程序
- 如何搭建一个站内搜索引擎(一) 第1章 写在最前
- 如何快速搭建一个maven