如何处理亿级图片排重(精准排重,相似排重)

news2024/10/6 6:47:32

图片相似度对比

1、需求

假如有一个图片池,存有1亿图片。给一张目标图片,在图片池中做匹配。

  • 判断一张图片是否在图片池中出现过。(完全一样)
  • 判断有没有相似的出现过。比如两张图相似度90,两张图片是在描述一件事情。

2、需求实现方案

对于以上需求,实现思路是:将图片转成向量,存放在ES中,去做以图搜图。但是在ES中的实现以图搜图,是用KNN实现的。KNN总会返回topN结果,在图片池中,哪怕真的不存在与目标一致的图片,但是仍然会返回与之最相似的图片。

想要使用ES实现需求1很容易。因为完全相同的图片,返回的相关性分数为1。但是在搜索目标不存在的情况下,返回的结果,和给出的相关性分数,很可能和目标完全不相关,但是相似度还是大于85%。我们无法判断,是否召回结果和目标真的是相似的。所以针对需求2,对召回的结果,假如分数不为1,应该再判断一次,召回的最相关的图片,是否是和目标图片真的相似。

针对需求2,应该再使用其它的图片相似性算法,做一次校验。根据调研和测试,使用openCV,使用直方图对比方法,可以有不错的效果。根据测试效果,在以下案例中,我们可以设置相关性大于85%,来区分图片是否相似。(需要测试更多的案例,来验证最佳相似度阈值阈值)

3、ES向量检索中的问题反例

es召回效果反例:

1.以下图为搜索目标图片

2.召回的结果取top3

其中以上三张图是召回的结果,图片排序即ES召回相关性排序后的结果。假如前两张结果在图片池中不存在,召回第三张,是有问题的,不能拿来做排重。

3.以上三张图片在es中给出的分数如下:

从es给的相关性分数中,第一张图得分为1,可以用来判断完全一致没有问题。第二张图片和第三张图片,分数很相近,但是第三张图和第一张图实际的相关性并不好。假如我们想通过相关性排除第三张图,仅仅通过es返回的相关性分时,并不合适。

  1. 使用openCV测试对比两张图片的效果

针对需求2,使用ES不能满足。可以通过使用openCV,对召回的第一条结果,在分数不为1的情况下,重新做一次比对。

openCV 通过两张图片直方图的比对,得出的相关性分数,比较靠谱。至少看起来是我们想要的效果。

案例1

两张图,虽然不是一个人,但是它们都是在描述一件事情。按说应该是在描述一件事情。我们认为这两张图是相似的,相似度90以上。

openCV 计算的相关性分数

均方差(MSE): 131.44561624837127

结构相似性指数(SSIM): 5.7201094656E10

峰值信噪比(PSNR): 26.943342540382247

图片相似度(直方图): 0.8858558728156901

案例2

两张图,来源于同一个视频,不同的帧。 直观上判断,这两个是同一个事情。相似度大于95。

均方差(MSE): 123.0275316249348

结构相似性指数(SSIM): 1.909637632E9

峰值信噪比(PSNR): 27.230780502837018

图片相似度(直方图): 0.9565945992942751

案例3

虽然都是马斯克。但是这是在描述两件不同的事情。相似度应该较低。

 

均方差(MSE): 209.28278961867477

结构相似性指数(SSIM): 5.423145472E9

峰值信噪比(PSNR): 24.923468452906206

图片相似度(直方图): 0.34953414682303025

案例4

其中以下两张图,第二张图片可以使用openCV重新做比对。在es中给出相关性是85%。openCV对比的相似性为77%,可以通过设置相似度85%阈值,排除错误结果。

均方差(MSE): 185.4257086381148

结构相似性指数(SSIM): 2.40297230336E11

峰值信噪比(PSNR): 25.449104134454515

图片相似度(直方图): 0.7713211102457774

ES使用 es 8.8的KNN向量检索。

 其中openCV对比两张图相似度代码

使用openCV比对任意两张图片的相似度(亲测较准确)_水的精神的博客-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/612354.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

系统架构师之高内聚低耦合

一、概念: 标记耦合(Stamp Coupling)和数据耦合(Data Coupling)是软件设计中两种不同的耦合类型,它们之间的区别如下: 标记耦合:标记耦合是指模块之间通过参数传递标记或标识符来进…

对安装Linux的服务器进行缓存清除

安装Linux的服务器缓存过高导致服务器运行速度慢 第一步,查看当前服务器中Linux系统的状态。 命令:free -h 第二步:备份内存缓冲区中的数据到磁盘中。 命令:sync 在大多数情况下,不需要手动使用sync命令&#xff0…

跨境电商如何进行仓储物流管理?

跨境电商如何进行仓储物流管理? 01跨境电商仓储物流管理痛点在哪? 供应链不稳定:因为要涉及多个国家的生产和供应环节,跨境物流的过程中还需要遵守目的地国家和货物品类的规定,这会增加仓储和物流成本,并…

创新需求:台灯加装语音识别芯片,打造智能化生活方式

为了满足人们对于智能化生活的需求,现在有一种创新的需求——为台灯加装语音识别芯片,从而实现远程控制、语音操控等更为智能的功能。 科技行业的快速发展,使得语音识别芯片也越来越普及。它们可以使电子产品具有智能化、人性化的交互方式。…

【Java系列】MyBatis-Plus常见面试题

问题列表 Q1:MyBatis-Plus是什么?它有什么优点? MyBatis-Plus是MyBatis框架的一个扩展库,它提供了一系列方便的API和工具,可以简化常见的数据库操作。MyBatis-Plus的优点包括: 提高开发效率:My…

第1章:SpringMVC简介

一、SpringMVC 1.Java语言学习流程 2.SpringMVC的主要内容 二、SpringMVC简介 1.什么是MVC MVC是一种软件架构的思想,将软件按照模型,视图,控制器划分M:Model,模型层,指工程中的JavaBean,作用…

用Python构建大数据推荐系统:一个世界500强企业的成功案例

推荐系统是大数据时代的利器,它能够为企业提升用户体验、增加用户粘性、促进销售转化、提高营销效率等。但是,搭建一个成功的推荐系统并不容易,它需要综合考虑多方面的因素,并根据业务场景、用户需求、数据变化等不断地进行迭代和…

Nginx:Tomcat部署及优化(一)

Nginx:Rewrite 一、Tomcat介绍1.1 Tomcat 简介1.2 Tomcat 核心的组件1.2.1 什么是 servlet1.2.2 什么是 JSP 1.3 Tomcat 功能组件结构1.3.1 Container 结构分析 1.4 Tomcat 请求过程 二、Tomcat 服务部署三、Tomcat 虚拟主机配置四、Tomcat多实例部署 一、Tomcat介绍…

带你学透SQL语言的核心——DML操作

0️⃣写在前面 DML(Data Manipulation Language)是SQL语言的核心部分,其主要用于对数据库的数据进行增删改查。在学习数据时,学习DML操作是必不可少的一部分。 文章目录 0️⃣写在前面1️⃣添加数据2️⃣修改数据3️⃣删除数据4️…

chatgpt赋能python:Python教程:如何取出一个三位整数123的各个位并输出?

Python教程:如何取出一个三位整数123的各个位并输出? 如果您正在学习Python编程语言,那么您一定会遇到需要处理数字的情况。Python是一种非常方便的语言,可以帮助您轻松地提取一个三位整数的各个位数,并将其输出。在本…

Hopfield神经网络与受限波尔兹曼机

神经网络可分为两大类: 一类是多层神经网络、卷积神经网络:可用于模式识别另一类是相互连接型网络:可通过联想记忆去除输入数据中的噪声。 深度学习目录: 自适应线性单元 (Widrow and Hoff, 1960)神经认知机 (Fukushima, 1980)…

海睿思分享 | 企业如何加强采购风险控制

企业运营的主要流程,不会因为企业人员规模或者业务规模大小的差异,而出现巨大的差异。千万亿市值的上市公司、不足百人的新兴公司,面对的经营风险本质上不会有明显的区别。今天我们一起分享企业经营管理中常见的风险应对策略。 对于企业而言…

专业分析┃微电子专业介绍及发展前瞻

不知道提到微电子,你最先想到的是什么?芯片?卡脖子?摩尔定律? 因为近两年芯片被限制的原因,大家经常可以从各路媒体上看到“芯片”一词。微电子作为一个学科,简单的说,就是研究如何…

C++,Qt部分面试和笔试题

面试这么多次,C这块基础太差了,乘着还有印象总结下相关的面试问答和笔试题,后续会不断更新内容 目录 问答题1.计算机网络七层体系结构2.C中关键字static和const的使用3.QList和QVector for循环输出速度比较4.构造函数能否为虚函数5.谈谈你对面…

【Mysql】 表的增删查改

文章目录 【Mysql】表的增删查改Create --创建数据Retireve -- 读取数据select 列where条件order by -- 结果排序limit -- 分页 Update -- 更新数据Delete -- 删除数据deletetruncate -- 截断表 插入查询结果聚合函数group by 子句 【Mysql】表的增删查改 CRUD : Create(创建)…

成熟GPT小程序源码分享,快速搭建GPT小程序

本文中分享成熟的GPT小程序源码,帮助你快速搭建自己的GPT小程序。 GPT小程序源码介绍 GPT小程序源码是一套成熟的GPT编程框架,可以帮助你快速开发高质量的GPT小程序。该源码包含了丰富的功能模块和优秀的编程实践,可以帮助你轻松实现GPT小程…

【无标题】如何借助项目管理软件 降低人为误操作风险

在项目管理工具中,权限管理功能对于数据安全的重要性非常高,通常情况下,权限管理是指在软件系统中对用户或用户组进行授权和访问控制的过程。在项目管理软件中,权限管理涉及到谁可以访问、修改或删除项目数据的问题。 以下几方面…

一文学会MySQL四种安装方式

目录 🍁rpm方式安装 🍀下载软件包 🍀前置配置 🍀安装MySQL 🍁yum方式安装 🍀下载软件包 🍀安装MySQL 🍁二进制方式安装 🍀下载软件包 🍀安装MySQL &#x1f3…

pyhon的运算符和字符串格式化方式

pyhton的变量类型 这里可以值得一提的是,python是一种弱类型的语言,使用的感觉有些像C的auto变量类型,定义变量不需要写类型名字,只需要变量名就会自动匹配 # int a 10 # float b 10.333 # string c "nihao" # dic…

Linux Shell 实现一键部署mariadb10.11

mariadb MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可 MariaDB的目的是完全兼容MySQL,包括API和命令行,使之能轻松成为MySQL的代替品。在存储引擎方面,使用XtraDB来代替MySQL的Inno…