这里只是图像搜索入门级的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)。

因为通常预训练模型都是通过ImageNet训练得到的,所以他的特征粒度比较大(特征不完备),那么对于比较狭窄或者要求粒度比较细(如:仅仅在人脸,水果,蔬菜等)的检索问题,我们可以通过自己的数据来调整分类器,然后再在训练好的模型中提取特征,一般情况下我们应该使特征数量远大于训练时的类别数,这样获取的特征才能有更紧凑表示数据的能力,在特征检索的过程中能有更好的精度,当然还有其他算法如:用代价函数优化类间距和类内距。

PS: 本质上人脸识别1:N的问题就是特征搜索问题,物体搜索可参考人脸识别中论文算法。

图像检索

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

2022更新

最近看了一篇基于深度学习的图像搜索论文,觉得不错:Combination of Multiple Global Descriptors for Image Retrieval

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

  1. 流媒体视频服务:快速搭建一个简单的流媒体视频服务(一)

    快速搭建一个简单的流媒体视频服务 前言 系统组成 RTMP协议简介 Red5 概述 Red5 服务器搭建 前言 最近自己在研究有关于流媒体播放的技术,网上资料甚少.出于开源精神以及在查阅资料得到各位大 ...

  2. 使用SpringBoot一小时快速搭建一个简单后台管理(增删改查)(超详细教程)

    最近也是临近期末了,各种的期末大作业,后台管理也是很多地方需要用到的,为了方便大家能快速上手,快速搭建一个简单的后台管理,我花了两天时间整理了一下 我会从0开始介绍,从数据库的设计到前端页面的引入最后 ...

  3. 快速搭建一个简单的SSM框架

    1.准备工作 mysql数据库 idea工具 说明:本次是搭建一个SSM框架,首先要确保电脑配置好1.8以上的JDK(因为1.8以下的jdk某些东西不支持),mysql数据库直接使用不方便可以安装一个 ...

  4. 使用SpringBoot一小时快速搭建一个简单后台管理(后端篇)

    不好意思让大家久等啦,最近也是因为学期末了,事情多了一点,所以更新的比较慢,请大家谅解下~ 好了话不多说,进入今天的教程环节 本次案例一共两篇文章教学: (第一篇):数据表设计,前端框架引入和编写前端 ...

  5. Jenkins——如何快速搭建一个简单的基于 Jenkins 的持续集成环境

    首先,在Jenkins官网(http://jenkins-ci.org/)上,下载所需要用的Jenkins版本.我们都是Windows系统,下载Windows版的即可.下载下来之后,进行安装,一步一步 ...

  6. 快速搭建一个简单的周报管理系统

    简易周报管理系统 实验环境测试 环境 mysql 8.0.15 mvn -v :Maven 3.6.3 java -version:Java 1.8 IDE: IDEA 2019 tomcat 9.0 ...

  7. test.php创建,基于phpstudy简单快速搭建一个php程序

    原标题:基于phpstudy简单快速搭建一个php程序 人人都是程序员,希望在零碎的阅读时间里,给您一些技术提升. 1 安装phpstudy 通过以下链接download.csdn.net/downl ...

  8. [Django快速开发1]搭建一个简单的博客系统(1)

    系列文章目录 Django快速开发0快速搭建环境并得到django项目的hello world 文章目录 系列文章目录 前言 从Django的模型层开始书写 定义文章模型: 使用脚本向sqlite3中 ...

  9. 如何快速搭建一个属于自己的网站?

    随着互联网的发展,网站建设的技术也越来越成熟,建站的方式也愈加丰富和多样.同时,互联网时代,无论是组织还是个人,无论是大企业还是小社团,拥有一个属于自己的网站,必不可少. 可是,不同的组织.不同的人, ...

最新文章

  1. PL/SQL导入/导出dmp文件-Oracle表空间不一致
  2. 使用自定义UISlider控制View亮度
  3. 下载anaconda前需要卸载python吗_anaconda安装与卸载
  4. linux centos 安装配置tftp服务器
  5. dell笔记本电脑驱动_笔记本电脑摄像头打不开,怎么办?总结经验(基于摄像头本身是完好的)...
  6. Java但中获取时间将时间转换成字符串格式(年月日格式)
  7. 电脑动态壁纸_每日壁纸—水彩插画少女动漫手机高清无水印壁纸第二波
  8. java中的多态与继承_【Java学习笔记之十六】浅谈Java中的继承与多态
  9. python语言三大基本控制结构_Python基础(4) 控制结构
  10. Git for Windows 国内下载站
  11. Unity3d优化文章
  12. php里建立数据库和表,PHP 创建数据库和表 | w3cschool菜鸟教程
  13. 如何为Swift进行宏定义
  14. javaEE(3)_servlet基础
  15. 时间操作(JavaScript版)—页面显示格式:年月日 时分秒 星期
  16. Spring Security Oauth2系列(一)
  17. 重磅出炉!KCon 黑客大会 2019 演讲议题正式公布
  18. android 获得ram大小,Android中获取(RAM)总运存大小和可用运存大小
  19. 一分钟读懂互联网广告竞价策略
  20. 爱江山更爱美人服务器维修,微信爱江山更爱美人修改版-微信爱江山更爱美人VIP满级修改版预约 v1.0.0-友情手机站...

热门文章

  1. C语言笔记第02章:三大基本结构
  2. PIL.image保存图片
  3. docker logs
  4. 一篇文章带你了解,App 测试工具
  5. Android Studio学习开发笔记--基础
  6. Spark Streaming与流处理
  7. “泰迪杯”挑战赛 - 通过Java实现中央空调系统的数据分析与控制策略
  8. 安全刻不容缓「GitHub 热点速览 v.21.50」
  9. 5月6日(Lambda)LCAC第十三次会议重要信息摘取
  10. Docker下centos7镜像安装中文支持