当前位置: 首页 > news >正文

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

图片相似度对比

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博客

相关文章:

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

图片相似度对比 1、需求 假如有一个图片池,存有1亿图片。给一张目标图片,在图片池中做匹配。 判断一张图片是否在图片池中出现过。(完全一样)判断有没有相似的出现过。比如两张图相似度90,两张图片是在描述一件事情。 …...

盐城北大青鸟“北大青鸟杯”IT精英挑战赛设中心评审隆重开赛

为积极响应北大青鸟总部开展第十届“北大青鸟杯”全国IT精英挑战赛的号召,成就学员们的IT梦想,“北大青鸟杯”IT精英挑战赛(设计组)盐城卓晨中心评审于2023年5月25日下午1:00在人才大厦306教室正式开赛! ​ 赛前&a…...

Pluma 插件管理框架

1. 概述 Pluma 是一个用 C 开发的可用于管理插件的开源架构,其官网地址为:http://pluma-framework.sourceforge.net/。该架构是个轻量级架构,非常易于理解。 Pluma 架构有以下基本概念: 1)插件的外在行为体现为一个…...

Leetcode11 盛最多水的容器

Leetcode11 盛最多水的容器 来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/container-with-most-water/description 博主Github:https://github.com/GDUT-Rp/LeetCode 题目: 给定一个长度为 n…...

Java

FileOutputStream写数据的3种方式 void write(int b) //一次写一个字节的数据 void write(byte[] b) //一次写一个字节数组数据 void write(byte[] b, int off,int len) //一次写一个字节数组的部分数据 参数一:数组;参数二:起始索引 0;参数三:个数换行: windows:“\r\n” lin…...

第十四章行为性模式—策略模式

文章目录 命令模式解决的问题结构实例存在的问题适用场景 JDK源码解析 行为型模式用于描述程序在运行时复杂的流程控制,即描述多个类或对象之间怎样相互协作共同完成单个对象无法单独完成的任务,它涉及算法与对象间职责的分配。行为型模式分为类行为模式…...

Leaflet基本用法

使用 阿里云地理工具 获取相应的地理JSON数据,用于对地图边界绘制。 如何使用leaflet? 这里用HTML5进行操作; 因为我是用的是Leaflet库,所以要引入JavaScript 和 CSS 文件(可参考官网https://leafletjs.com/&#x…...

Unity | HDRP高清渲染管线学习笔记:示例场景解析

目录 一、HDRP入门 1.HDRP设置 1.1 HDRP配置文件中的全部设置项 1.1.1 Rendering下的Lit Shader Mode 1.1.2 Lighting 下的Volumetrics(体积光)和Screen Space Reflection(屏幕空间反射) 2.离线渲染VS实时渲染 3.Volume组件 …...

【Netty】Netty 编码器(十三)

文章目录 前言一、MessageToByteEncoder 抽象类二、MessageToMessageEncoder 抽象类总结 前言 回顾Netty系列文章: Netty 概述(一)Netty 架构设计(二)Netty Channel 概述(三)Netty ChannelHan…...

Netty和Tomcat的区别、性能对比

文章目录 一、Netty和Tomcat有什么区别?二、为什么Netty受欢迎?三、Netty为什么并发高 ? 一、Netty和Tomcat有什么区别? Netty和Tomcat最大的区别就在于通信协议,Tomcat是基于Http协议的,他的实质是一个基…...

chatgpt赋能python:Python函数调用局部变量-深入了解

Python函数调用局部变量-深入了解 函数调用局部变量是Python中的一个重要概念,特别是在大型项目中,其中多个函数共享相同变量时。在本文中,我们将深入探讨Python函数调用局部变量,并为您介绍一些实用技巧。 什么是Python函数调用…...

Android 12.0 NavigationBarView 导航栏 左边显示的修改

1.概述 在12.0定制化开发中,要求导航栏左边显示的定制化,这时需要了解导航栏的显示控制方向,然后修改显示方向 在10.0以后关于导航栏显示位置都是在DisplayPolicy.java中处理的所以查询相关的设置方法,然后修改导航栏显示方向2.NavigationBarView 导航栏 左边显示的修改的…...

Mybatis源码细节探究:二级缓存Cache对象是在什么时候创建的?

给自己的每日一句 不从恶人的计谋,不站罪人的道路,不坐亵慢人的座位,惟喜爱耶和华的律法,昼夜思想,这人便为有福!他要像一棵树栽在溪水旁,按时候结果子,叶子也不枯干。凡他所做的尽…...

【数据库】无效数据:软件测试对无效数据的处理

目录 一、无效数据的常见场景 (1)测试阶段 (2)测试方法 二、无效数据的概念 三、无效数据的影响 四、无效数据的识别 五、无效数据的处理方法 (1)拒绝无效数据 ① 拒绝无效数据的概念 ② 拒绝…...

高精度电压源如何设计出来的

高精度电压源是一种用于提供高精度电压的电子设备,通常用于测量和控制系统。高精度电压源的设计是一个复杂的过程,需要考虑多个因素,包括电路设计、元件选型、测量误差、稳定性等。下面将从电路设计和元件选型两个方面,详细介绍高…...

混合属性mix-blend-mode不生效

下面的ABCDE是混合图层,box是他们的父级,一般浏览器支持都没什问题需要注意的是,确保父元素不是透明的, 我使用的时候发现给父元素rgba设置透明度这种方式没啥作用,还得是纯色,没去深究,设置纯色…...

测试计划编写说明

第1章 引言 1.1目的 简述本计划的目的,旨在说明各种测试阶段任务、人员分配和时间安排、工作规范等。 测试计划在策略和方法的高度说明如何计划、组织和管理测试项目。测试计划包含足够的信息使测试人员明白项目需要做什么是如何运作的。另外,清晰的文档结构能使任何一个读…...

Android 12.0Recent列表不显示某个app

1.概述 在12.0 的产品定制化开发中,在点击导航栏最近任务列表时,如果做到不显示某个app 呢 一种做法是在app中直接处理 一种做法是在framework中处理 接下来看这两种处理方法 1, app中处理 为该应用AndroidManifest xml文件中主MainActivity设置属性 android:excludeFromR…...

力扣sql中等篇练习(二十七)

力扣sql中等篇练习(二十七) 1 连续两年有3个及以上订单的产品 1.1 题目内容 1.1.1 基本题目信息 1.1.2 示例输入输出 1.2 示例sql语句 # Write your MySQL query statement below WITH T as (SELECT t.product_id,t.d,count(order_id) numFROM(SELECT order_id,product_id,…...

Linux:LNMP的架构与环境配置

Linux:LNMP的架构与环境配置 一、安装 Nginx 服务1.1 安装依赖包1.2 创建运行用户1.3 编译安装1.4 优化路径1.5 添加 Nginx 系统服务 二、安装 MySQL 服务2.1安装Mysql环境依赖包2.2 创建运行用户2.3 编译安装2.4 修改mysql 配置文件2.5 更改mysql安装目录和配置文件…...

PXE装机避坑大全:从TFTP根目录设置到Kickstart无人值守的13个常见错误修复

PXE装机避坑大全:从TFTP根目录设置到Kickstart无人值守的13个常见错误修复 在企业级IT运维中,PXE(预启动执行环境)网络装机技术因其高效、自动化的特点,已成为服务器批量部署的标配方案。但看似简单的PXE部署流程背后&…...

云计算算力价格波动:行业重构与竞争新格局

云计算价格反转:从价格战到集体涨价2025年4月,阿里云率先发起价格战,京东云、腾讯云、华为云等纷纷跟进,“最高降幅达60%”的口号让行业陷入价格混战。然而,到了2026年3月,市场风向突变,谷歌云、…...

Go AI 生态实战:从单机 RAG 到分布式智能服务架构演进

Go AI 生态实战:从单机 RAG 到分布式智能服务架构演进 摘要:本文面向具备后端与架构背景的技术人员,系统讲透 Go 在 AI 应用落地中的工程化方法。文章不再停留在“调用一个模型接口”的层面,而是从 RAG 原理、服务拆分、索引构建、高并发治理、缓存策略、容错机制、可观测性…...

AI写论文超厉害!4款AI论文生成工具,解决毕业论文写作难题!

还在为撰写期刊论文而烦恼吗?面对成堆的文献、复杂的格式要求以及无休止的修改,许多学术人员常常感到效率低下。这并不奇怪!不过,不必太担心,以下将推荐4款实测有效的AI论文写作工具,它们能帮助你在论文文献…...

从豆瓣到StyleTalk:手把手教你用真实场景数据微调你的中文对话模型

从豆瓣到StyleTalk:手把手教你用真实场景数据微调你的中文对话模型 当你已经掌握了基座模型微调的基础技能,如何让模型真正理解特定领域的专业术语,或是模仿某种独特的说话风格?本文将带你深入实战,从数据清洗到效果评…...

苹果设备激活锁终极解锁指南:5步免费绕开iOS 15-16的iCloud限制

苹果设备激活锁终极解锁指南:5步免费绕开iOS 15-16的iCloud限制 【免费下载链接】applera1n icloud bypass for ios 15-16 项目地址: https://gitcode.com/gh_mirrors/ap/applera1n 还在为忘记Apple ID密码而无法使用自己的iPhone或iPad而烦恼吗?…...

多设备协同效率低?用QtScrcpy实现跨平台Android投屏与批量管理

多设备协同效率低?用QtScrcpy实现跨平台Android投屏与批量管理 【免费下载链接】QtScrcpy Android实时投屏软件,此应用程序提供USB(或通过TCP/IP)连接的Android设备的显示和控制。它不需要任何root访问权限 项目地址: https://gitcode.com/barry-ran/Q…...

深度解析BG3ModManager:博德之门3模组加载顺序重置问题的架构设计与解决方案

深度解析BG3ModManager:博德之门3模组加载顺序重置问题的架构设计与解决方案 【免费下载链接】BG3ModManager A mod manager for Baldurs Gate 3. 项目地址: https://gitcode.com/gh_mirrors/bg/BG3ModManager BG3ModManager作为《博德之门3》的核心模组管理…...

从VGG到ResNet:我是如何用PyTorch复现经典,并理解‘残差’如何拯救了深度学习的

从VGG到ResNet:用PyTorch复现经典,理解残差如何重塑深度学习 2014年ImageNet竞赛冠军VGG网络将深度卷积神经网络推向了19层的里程碑,但研究者们很快发现:单纯堆叠更多层数反而会导致模型性能下降。这种现象被称作"网络退化&q…...

Linux 内核中的内核线程:从创建到管理

Linux 内核中的内核线程:从创建到管理 引言 作为一名深耕操作系统和嵌入式开发的工程师,我深知后台任务的重要性。在系统开发中,合理的后台任务管理可以提高系统的响应性和稳定性。在 Linux 内核中,内核线程是执行后台任务的核心机…...