又拍图片管家亿级图像之搜图系统的两代演进及底层原理

又拍图片管家当前服务了千万级用户,管理了百亿级图片。当用户的图库变得越来越庞大时,业务上急切的需要一种方案能够快速定位图像,即直接输入图像,然后根据输入的图像内容来找到图库中的原图及相似图,而以图搜图服务就是为了解决这个问题。

本人有幸独立负责并实施了整个以图搜图系统从技术调研、到设计验证、以及最后工程实现的全过程。而整个以图搜图服务也是经历了两次的整体演进:从 2019 年初开始第一次技术调研,经历春节假期,2019 年 3、4 月份第一代系统整体上线;2020 年初着手升级方案调研,经历春节及疫情,2020 年 4 月份开始第二代系统的整体升级。

本文将会简述两代搜图系统背后的技术选型及基本原理。


基础概要

图像是什么?

与图像打交道,我们必须要先知道:图像是什么?

答案:像素点的集合。

比如:

左图红色圈中的部分其实就是右图中一系列的像素点。

再举例:

假设上图红色圈的部分是一幅图像,其中每一个独立的小方格就是一个像素点(简称像素),像素是最基本的信息单元,而这幅图像的大小就是 11 x 11 px 。

图像的数学表示

每个图像都可以很自然的用矩阵来表示,每个像素点对应的就是矩阵中的一个元素。

二值图像

二值图像的像素点只有黑白两种情况,因此每个像素点可以由 0 和 1 来表示。

比如一张 4 * 4 二值图像:

0 1 0 11 0 0 01 1 1 00 0 1 0

RGB 图像

红(Red)、绿(Green)、蓝(Blue)作为三原色可以调和成任意的颜色,对于 RGB 图像,每个像素点包含 RGB 共三个通道的基本信息,类似的,如果每个通道用 8 bit 表示即 256 级灰度,那么一个像素点可以表示为:

([0 .. 255], [0 .. 255], [0 .. 255])

比如一张 4 * 4 RGB 图像:

图像处理的本质实际上就是对这些像素矩阵进行计算。

搜图的技术问题

如果只是找原图,也就是像素点完全相同的图像,那么直接对比它们的 MD5 值即可。然而,图像在网络的传输过程中,常常会遇到诸如压缩、水印等等情况,而 MD5 算法的特点是,即使是小部分内容变动,其最终的结果却是天差地别,换句话说只要图片有一个像素点不一致,最后都是无法对比的。

对于一个以图搜图系统而言,我们要搜的本质上其实是内容相似的图片,为此,我们需要解决两个基本的问题:

•把图像表示或抽象为一个计算机数据•这个数据必须是可以进行对比计算的

直接用专业点的话说就是:

•图像的特征提取•特征计算(相似性计算)


第一代搜图系统

特性提取 - 图像抽象

第一代搜图系统在特征提取上使用的是 Perceptual hash 即 pHash 算法,这个算法的基本原理是什么?

如上图所示,pHash 算法就是对图像整体进行一系列变换最后构造 hash 值,而变换的过程可以理解为对图像进行不断的抽象,此时如果对另外一张相似内容的图像进行同样的整体抽象,那么其结果一定是非常接近的。

特性计算 - 相似性计算

对于两张图像的 pHash 值,具体如何计算其相似的程度?答案是 Hamming distance 汉明距离,汉明距离越小,图像内容越相似。

汉明距离又是什么?就是对应位置不同比特位的个数。

例如:

第一个值: 0 1 0 1 0第二个值: 0 0 0 1 1

以上两个值的对应位置上有 2 个比特位是不相同的,因此它们的汉明距离就是 2 。

OK ,相似性计算的原理我们知道了,那么下一个问题是:如何去计算亿级图片对应的亿级数据的汉明距离?简而言之,就是如何搜索?

在项目早期其实我并没有找到一个满意的能够快速计算汉明距离的工具(或者说是计算引擎),因此我的方案进行了一次变通。

变通的思想是:如果两个 pHash 值的汉明距离是接近的,那么将 pHash 值进行切割后,切割后的每一个小部分大概率相等。

例如:

第一个值: 8 a 0 3 0 3 f 6第二个值: 8 a 0 3 0 3 d 8

我们把上面这两个值分割成了 8 块,其中 6 块的值是完全相同的,因此可以推断它们的汉明距离接近,从而图像内容也相似。

经过变换之后,其实你可以发现,汉明距离的计算问题,变成了等值匹配的问题,我把每一个 pHash 值给分成了 8 段,只要里面有超过 5 段的值是完全相同的,那么我就认为他们相似。

等值匹配如何解决?这就很简单了,传统数据库的条件过滤不就可以用了嘛。

当然,我这里用的是 ElasticSearch( ES 的原理本文就不介绍了,读者可以另行了解),在 ES 里的具体操作就是多 term 匹配然后 minimum_should_match 指定匹配程度。

为什么搜索会选择 ElasticSearch ?第一点,它能实现上述的搜索功能;第二点,图片管家项目本身就正在用 ES 提供全文搜索的功能,使用现有资源,成本是非常低的。

第一代系统总结

第一代搜图系统在技术上选择了 pHash + ElasticSearch 的方案,它拥有如下特点:

pHash 算法计算简单,可以对抗一定程度的压缩、水印、噪声等影响。•ElasticSearch 直接使用了项目现有资源,在搜索上没有增加额外的成本。

当然这套系统的局限性也很明显:由于 pHash 算法是对图像的整体进行抽象表示,一旦我们对整体性进行了破坏,比如在原图加一个黑边,就会几乎无法判断相似性。

为了突破这个局限性,底层技术截然不同的第二代搜图系统应运而生。


​第二代搜图系统

特性提取

在计算机视觉领域,使用人工智能相关的技术基本上已经成了主流,同样,我们第二代搜图系统的特征提取在底层技术上使用的是 CNN 卷积神经网络。

CNN 卷积神经网络这个词让人比较难以理解,重点是回答两个问题:

CNN 能干什么?•搜图为什么能用 CNN ?

AI 领域有很多赛事,图像分类是其中一项重要的比赛内容,而图像分类就是要去判断图片的内容到底是猫、是狗、是苹果、是梨子、还是其它对象类别。

CNN 能干什么?提取特征,进而识物,我把这个过程简单的理解为,从多个不同的维度去提取特征,衡量一张图片的内容或者特征与猫的特征有多接近,与狗的特征有多接近,等等等等,选择最接近的就可以作为我们的识别结果,也就是判断这张图片的内容是猫,还是狗,还是其它。

CNN 识物又跟我们找相似的图像有什么关系?我们要的不是最终的识物结果,而是从多个维度提取出来的特征向量,两张内容相似的图像的特征向量一定是接近的。

具体使用哪种 CNN 模型?

我使用的是 VGG16 ,为什么选择它?首先,VGG16 拥有很好的泛化能力,也就是很通用;其次,VGG16 提取出来的特征向量是 512 维,维度适中,如果维度太少,精度可能会受影响,如果维度太多,存储和计算这些特征向量的成本会比较高。

向量搜索引擎

从图像提取特征向量的问题已经解决了,那么剩下的问题就是:

•特征向量如何存储?•特征向量如何计算相似性,即如何搜索?

对于这两个问题,直接使用开源的向量搜索引擎 Milvus 就可以很好的解决,截至目前,Milvus 在我们的生产环境一直运行良好。

第二代系统总结

第二代搜图系统在技术上选择了 CNN + Milvus 的方案,而这种基于特征向量的搜索在业务上也提供了更好的支持。


作者上一篇文章 Milvus 开发者专栏|以图搜图系统工程实践 已经简单的介绍过 Milvus,

这里就不再多做介绍。如你对以图搜图技术感兴趣, 你也可以阅读我们过去分享过的其他以图搜图相关内容, 或是加入 Milvus 社区交流群与我们交流:

视频|10分钟讲清楚Milvus 以图搜图、以图搜视频

直播回放| 轻松三步搭建 Milvus 以图搜图系统

Milvus实战 | 轻松搭建以图搜图系统

本文转载自公众号 Node Python Go 全栈开发,作者 rifewang

| 欢迎加入 Milvus 社区

github.com/milvus-io/milvus | 源码

milvus.io | 官网

milvusio.slack.com | Slack 社区

zhihu.com/org/zilliz-11/columns | 知乎

zilliz.blog.csdn.net | CSDN 博客

space.bilibili.com/478166626 | Bilibili

Milvus x 又拍图片管家亿级图像搜图系统相关推荐

  1. 基于Flink+Alink构建全端亿级实时用户画像系统

    用户画像,作为一种勾画目标用户.联系用户诉求与设计方向的有效工具,用户画像在各领域得到了广泛的应用. 用户画像最初是在电商领域得到应用的,在大数据时代背景下,用户信息充斥在网络中,将用户的每个具体信息 ...

  2. 基于 Milvus 的以图搜图系统 2.0

    Milvus 以图搜图 1.0 版本自发布以来便受到广大用户的欢迎.近日,Zilliz 推出了 Milvus 以图搜图系统 2.0 版.本文将介绍 Milvus 以图搜图系统 2.0 版的主要更新内容 ...

  3. python+milvus实现一个以图搜图系统

    目录 引言 说明 准备数据 训练数据 安装minlvus(docker-compose方式) python集成milvus+towhee python后端启动方式 启动前端 查询数据 引言 当您听到& ...

  4. Torch、Java、Milvus快速搭建以图搜图系统

    Torch.Java.Milvus快速搭建以图搜图系统 1 原理概述 以图搜图大致原理(口水话版) 以图搜图,即通过一张图片去匹配数据库中的图片,找到最相似的N张图.在我们普通的搜索系统中,文字匹配的 ...

  5. 京东亿级流量电商系统JVM模型参数预估方案

    1. 需求分析 大促在即,拥有亿级流量的电商平台开发了一个订单系统,我们应该如何来预估其并发量?如何根据并发量来合理配置JVM参数呢? 假设,现在有一个场景,一个电商平台,比如京东,需要承担每天上亿的 ...

  6. 干货分享!京东亿级流量电商系统JVM模型参数预估方案

    1. 需求分析 大促在即,拥有亿级流量的电商平台开发了一个订单系统,我们应该如何来预估其并发量?如何根据并发量来合理配置JVM参数呢? 假设,现在有一个场景,一个电商平台,比如京东,需要承担每天上亿的 ...

  7. 太强了,300分钟撸一个基于redis的亿级用户高并发系统

    对于双十一这种高并发.大流量的场景一般都会用到缓存抗住大并发,市面上缓存框架用的最多的无疑就是Redis了,Redis作为稳居世界排名第一的KV内存数据库,同时也是最受欢迎的分布式缓存中间件,是应对高 ...

  8. 透明图片怎么发给别人_如何在网上 1 分钟就搜到高清优质图片?这 3 个搜图网站一定要收藏好...

    一图胜千言,如果你的工作经常和图片打交道,那你一定明白这句话的重要性! ​ 比如,你要准备一个演讲,但 PPT 里却一直找不到合适的配图,凸显不出高大上: 比如,你要给公众号推文配图,但百度出来的图片 ...

  9. 11款相似图片搜索引擎推荐,以图搜图将不再是难事

    你想凭着一张现有图片找出它的原始图片,或者是凭着一张小的缩略图找出原始大图吗? 下面的十一款搜索引擎可以帮你实现,以图找图,以图搜图,以图片搜索相似的图片. 1.http://tineye.com/ ...

最新文章

  1. 7岁自学微积分,31岁获得菲尔兹奖,智商230,也曾因为玩游戏耽误学业!
  2. 如何让企业引起对网站运营优化的重视程度呢?
  3. 计算机安装与维修 等级,电脑升级究竟要怎么升级?维修多年的老师傅说出其中答案!...
  4. 轻量级RTSP服务SDK
  5. 关于解决Permission is only granted to system apps
  6. 您企业的邮件系统够安全吗
  7. 解决BLOB/TEXT column can‘t have a default value query问题
  8. c++ qml 数组_【QML与C++混合编程】用QVariantList传递数组类型成员
  9. JavaScript console.log导致错误:“不赞成在主线程上使用同步XMLHttpRequest…”
  10. IPTV的QoE评价方法
  11. Oracle的权限角色及用户
  12. C++原型模式和模板模式
  13. python表白程序-python告白程序
  14. dw怎么打开html模板,Dreamweaver怎样使用网页模板及修改模板
  15. 微信手机端调试抓包总结与问卷星手机端的自动化
  16. 离散实验五 判断关系R 是否为等价关系(给定 R 的关系矩阵,据此判断所给关系 R 是否为等价关系)
  17. 组态王 6.55 启停plc_成套设备PLC编程深圳PLC编程
  18. 【黑马程序员pink老师前端】HTML综合案例(二)
  19. Nodejs 使用 Buffer 将图片转为 base64
  20. AVD安卓模拟器黑屏

热门文章

  1. 江苏大学计算机专业江苏排名,江苏大学优势专业排名,2021年江苏大学最好的专业排名...
  2. 史上最全| 14种自动化分拣系统合集|拿走!
  3. 一分钟彻底清除电脑中的垃圾
  4. 浙江省计算机哪些专科学校好,浙江计算机网络技术大专有哪些
  5. APP开发完后升级是否需要费用?
  6. python语言和sql语言的区别_SQL和Python的集合操作对比:适合的就好!
  7. GAMIT解算加载电离层文件
  8. 烤仔说 | 探险队员烤仔,出发!
  9. vector中push_back()和emplace_back()的区别
  10. Linux vi 经验总结