【打卡-Coggle竞赛学习2023年4月】图像检索与重复图像识别

news2024/10/7 3:14:49

#### 任务1:图像匹配与检索

  • 图像相似度

图像相似度是用于度量两幅图像之间相似程度的指标。图像相似度可以基于像素级别的相似度或者基于特征匹配的相似度来计算。像素级别的相似度通常是基于两幅图像的像素值来计算的,包括均方误差、结构相似性指数(SSIM)等。而基于特征匹配的相似度则是通过提取图像的特征,比如颜色、纹理、形状等,来计算图像之间的相似度。

  • 颜色直方图

颜色直方图是指统计一幅图像中每种颜色出现的频率,然后将这些频率以直方图的形式表示出来。颜色直方图相似度是一种基于颜色直方图的相似度度量方法,用于度量两幅图像之间的相似程度。计算颜色直方图相似度的方法通常包括将两幅图像的颜色直方图进行比较,比如可以计算两个直方图之间的距离或者相似度。颜色直方图相似度在图像检索、图像分类、目标识别等领域都有广泛的应用。

  • 图像检索流程

图像检索是指通过输入一张图像,然后在一个图像数据库中搜索与该图像最相似的图像。图像检索的基本流程包括图像特征提取、相似度计算和排序等步骤。

首先,通过图像特征提取方法将一张图像转换为一个向量表示。然后,通过相似度计算方法计算输入图像与数据库中所有图像之间的相似度。最后,根据相似度对所有图像进行排序,将与输入图像最相似的图像排在前面。

任务1实践步骤如下:

  • 步骤1:从实践比赛地址:https://competition.coggle.club/下载图像检索与匹配数据集
  • 步骤2:使用opencv提取单张图片的颜色直方图
  • 步骤3:提取图像数据集(dataset文件夹)和查询图片(query文件夹)所有图片的直方图
  • 步骤4:通过query的直方图向量去计算在dataset中最相似的结果。
  • 步骤5:将计算结果提交到实践比赛地址:https://competition.coggle.club/

在这里插入图片描述

import cv2
import glob
import os, sys
import pandas as pd
import numpy as np
from sklearn.preprocessing import normalize

# 计算dataset文件夹中所有图的直方图
dataset_feat = []
for path in glob.glob('./dataset/*.jpg'):
    img = cv2.imread(path, 0)
    feat = cv2.calcHist(np.array([img]), [0], None, [256], [0, 256]).flatten()
    dataset_feat.append(feat)

# 进行归一化
dataset_feat = np.array(dataset_feat)
dataset_feat = normalize(dataset_feat)

# 计算query文件夹中所有图像的直方图
query_feat = []
for path in glob.glob('./query/*.jpg'):
    img = cv2.imread(path, 0)
    feat = cv2.calcHist(np.array([img]), [0], None, [256], [0, 256]).flatten()
    query_feat.append(feat)

# 进行归一化
query_feat = np.array(query_feat)
query_feat = normalize(query_feat)

# 计算每张query图片与dataset图片的颜色直方图相似度
dis = np.dot(query_feat, dataset_feat.T)
dataset_path = np.array(glob.glob('./dataset/*.jpg'))

# 生成提交结果
pd.DataFrame({
    'source': [x.split('/')[-1] for x in dataset_path[dis.argmax(1)]],
    'query': [x.split('/')[-1] for x in glob.glob('./query/*.jpg')]
}).to_csv('submit.csv', index=None)

#### 任务2:图像局部特征提取

  • SIFT/ORB关键点

SIFT和ORB是两种常用的局部特征提取算法,它们能够从图像中提取出关键点,并对这些关键点进行描述和匹配。SIFT(Scale Invariant Feature Transform)算法通过对不同尺度和方向的高斯差分图像进行特征检测,得到具有旋转不变性和尺度不变性的关键点。

ORB(Oriented FAST and Rotated BRIEF)算法则是基于FAST关键点检测算法和BRIEF描述符的改进算法,具有快速和鲁棒性的优点。在关键点匹配时,常用的方法包括暴力匹配和基于FLANN的匹配算法。

  • 局部特征编码:局部特征编码是将局部特征向量表示为一种固定维度的向量,以便于后续的特征匹配和检索。

方法1:BoW(Bag of Words)模型是一种常见的局部特征编码方法,将局部特征向量表示为一组视觉词汇的直方图。

方法2:VLAD(Vector of Locally Aggregated Descriptors)和Fisher Vector则是基于BoW模型的改进算法,能够更加准确地描述局部特征的分布和空间结构。

  • 关键点匹配与相似度计算

关键点匹配是图像匹配的一项基本任务,通常用于在两幅图像中寻找相同或相似的物体、场景等。匹配的过程可以通过比较两幅图像的局部特征来实现,其中每个关键点都对应着一个特征向量,可以通过计算这些向量之间的距离或相似度来评估它们之间的匹配程度。

常见的关键点匹配方法包括暴力匹配和基于FLANN的匹配。暴力匹配方法简单直观,对于每个关键点,将其与另一幅图像中的所有关键点进行比较,选取距离最近的关键点作为其匹配点。FLANN(Fast Library for Approximate Nearest Neighbors)的匹配方法则采用了近似最近邻算法,能够在保证匹配准确率的同时大幅降低计算时间。

RANSAC(Random Sample Consensus)是一种经典的估计模型参数的算法,其主要应用于数据中包含噪声或异常值的情况下,通过随机采样和假设验证的方式来估计模型。在RANSAC算法中,首先从匹配的关键点对中随机选择一组样本,然后使用这组样本计算出一个模型参数。接着,使用这个模型参数对所有关键点对进行预测,并将与预测结果差距较小的关键点对视为符合模型的关键点对。最后,根据符合模型的关键点对的数量来评估该模型参数的好坏,若该模型参数符合预设的阈值,则认为该模型参数可用于描述这组关键点的匹配关系。

任务2实践步骤如下:

  • 步骤1:使用sift或orb提取图片的关键点,对对提取的关键点进行匹配。

  • 步骤2:对任务1中直方图计算得到的相似图,使用sift或orb进行过滤

    • 计算query和dataset中所有的直方图特征
    • 对query每张图计算与其对应的Top10相似的dataset图
    • 对每个Top10图使用sift或orb进
    • 行过滤,选择匹配关键点最多的作为结果
      在这里插入图片描述
  • 【选做】步骤3:对图片sift或orb使用bow或vlad进行全局编码,然后query与dataset最相似的图片

  • 步骤4:将计算结果提交到实践比赛地址:https://competition.coggle.club/

  • 参考资料:

    • https://docs.opencv.org/4.x/dc/dc3/tutorial_py_matcher.html
    • https://yongyuan.name/blog/CBIR-BoW-for-image-retrieval-and-practice.html

#### 任务3:深度全局特征:

CNN/VIT模型特征提取:介绍CNN和VIT模型在图像特征提取中的应用,包括如何利用预训练模型提取图像的全局特征。

CLIP模型特征提取:讲解CLIP模型的原理和应用,包括如何将图像和文本的特征嵌入到同一个向量空间中,以及如何利用CLIP模型进行图像检索和分类。

深度全局特征的优缺点:讨论深度全局特征和传统算法的差异,包括特征表达能力、泛化能力、计算效率等方面。

  • 步骤1:使用CNN模型预训练模型(如ResNet18)提取图片的CNN特征,计算query与dataset最相似的图片
  • 步骤2:使用VIT模型预训练模型提取图片特征,计算query与dataset最相似的图片
  • 步骤3:使用CLIP模型预训练模型提取图片特征,计算query与dataset最相似的图片
  • 步骤4:分别将每种思路的计算结果提交到实践比赛地址:https://competition.coggle.club/
import torch
from torch.utils.data.dataset import Dataset
import torchvision.models as models
import torchvision.transforms as transforms

# 加载CNN模型
device = 'cuda' if torch.cuda.is_available() else 'cpu'
model = models.resnet50(True)
model.fc = torch.nn.Identity()
model = model.to(device)

# 加载VIT模型
device = 'cuda' if torch.cuda.is_available() else 'cpu'
model = models.vit_b_16(weights=torchvision.models.ViT_B_16_Weights)
model.heads = torch.nn.Identity()
model = model.to(device)

# 加载CLIP模型
import clip
# https://github.com/openai/CLIP
device = "cuda" if torch.cuda.is_available() else "cpu"
model, preprocess = clip.load("ViT-B/32", device=device)

在这里插入图片描述
在这里插入图片描述

提取图片特征的代码可参考:

https://www.kaggle.com/code/finlay/shopee-products-matching-image-part-english

#### 任务4:孪生网络

孪生网络是一种由两个相同结构的神经网络组成的模型,其目的是将两个输入数据映射到一个共同的向量空间中,并计算它们之间的相似度或距离。它通常用于图像匹配、人脸识别、语义匹配等任务中。

  • 步骤1:构建三元组数据集,分别为<图片A,图片A’>和<图片B,图片B’>的组合,此时图片A和A’分别进行不同的数据增强;
  • 步骤2:加载CNN模型,定义二分类损失函数
  • 步骤3:训练孪生网络,记录损失曲线
  • 步骤4:计算query与dataset最相似的图片,提交到实践比赛地址:https://competition.coggle.club/

参考代码:

https://github.com/owruby/siamese_pytorch/blob/master/train.py

这个其实需要我们先预训练一个siamese_pytorch网络,然后使用这个model进行推理

在这里插入图片描述

#### 任务5:对比损失

对比损失的目标是将同类实例之间的距离最小化,不同类实例之间的距离最大化,而三元组损失则是将同类实例之间的距离最小化,并将不同类实例之间的距离最大化。

在SimCLR中,模型通过学习对同一个图像的多个视角进行编码,从而生成不同的表示形式,这些表示形式被设计成相互一致的,以使得相同实例的不同视角编码之间的距离最小化。

类似地在SimCSE中,模型通过学习对同一个句子的多个视角进行编码,从而生成不同的表示形式,这些表示形式被设计成相互一致的,以使得相同实例的不同视角编码之间的距离最小化

  • 步骤1:编写SimCLR和SimCSE对比损失函数。
  • 步骤2:在模型中加入Dropout,训练时加入数据增强。
  • 步骤3:利用Dropout和数据增强得到不同的样本,如样本A分别正向传播2次,得到图片A和图片A’。
  • 步骤4:重复步骤孪生网络的训练过程。
  • 步骤5:计算query与dataset最相似的图片,提交到实践比赛地址:https://competition.coggle.club/

参考链接:

  • https://blog.csdn.net/qq_27590277/article/details/128195782
  • https://zhuanlan.zhihu.com/p/368353121

#### 任务6:特征压缩与扩展查询

PQ量化(Product Quantization)是一种压缩和加速高维向量相似性搜索的技术,通常用于图像和视频检索领域。PQ量化将高维向量划分成多个较小的子向量,并对每个子向量使用独立的编码器进行编码,从而将高维向量转换为一系列的子编码。这些子编码通常被存储在内存中,并通过查询相似性搜索引擎进行搜索。

特征PCA白化是一种预处理技术,它将输入数据的协方差矩阵进行特征分解,并将其变换为一个对角矩阵,然后将原始数据进行线性变换,使得变换后的数据的协方差矩阵为单位矩阵。这样做的好处是可以去除数据中的冗余信息和相关性,并且提高数据的稳定性和可解释性。

  • 步骤1:对query与dataset特征进行白化进行处理。从新计算query与dataset最相似的图片,提交到实践比赛地址:https://competition.coggle.club/
  • 步骤2:使用PCA对特征query与dataset特征降维到100/200。分别从新计算query与dataset最相似的图片,提交到实践比赛地址:https://competition.coggle.club/

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

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

相关文章

被遗忘的Java关键字:transient

前言 今天在看项目代码时候&#xff0c;看到了下面这样一行代码&#xff0c;用transient修饰了一个变量&#xff0c;主要作用是做一个全局开关。说实话我是第一次看到这个关键字。激发了我的好奇心&#xff0c;所以就了解一下这是何方神圣。 /*** 全局开关*/public static tran…

Linux第三章

文章目录 前言一、Linux的root用户1.用户和用户组2.查看权限控制信息3.chmod命令4.chown命令 总结 前言 一、Linux的root用户 无论是Windows、MacOS、Linux均采用多用户的管理模式进行权限管理。在Linux系统中&#xff0c;拥有最大权限的账户名为&#xff1a;root&#xff08;…

QGIS数据可视化学习笔记03——地理解析(地址解析,地理编码......)和数据上图

一、地理解析 百度百科传送门&#xff1a;https://baike.baidu.com/item/%E5%9C%B0%E7%90%86%E7%BC%96%E7%A0%81/2890260 简单来说&#xff0c;就是名称对应QGIS中经纬度等坐标的转换&#xff0c;比如给出北京朝阳公园&#xff0c;你在QGIS中转换为对应的经纬度坐标&#xff0c…

企业网站注册攻略,告别烦恼!

业网站的注册过程可能对于一些初创企业来说比较繁琐&#xff0c;但它是推广企业品牌的重要途径之一。本文将为您介绍企业网站注册的攻略&#xff0c;帮助您更加高效地完成注册过程。 步骤&#xff1a; 1、确定网站类型&#xff1a;在开始注册之前&#xff0c;企业需要确定网站…

ASEMI代理ADI亚德诺ADG5412BRUZ-REEL7车规级芯片

编辑-Z ADG5412BRUZ-REEL7芯片参数&#xff1a; 型号&#xff1a;ADG5412BRUZ-REEL7 开态电阻&#xff1a;9.8Ω 电源断开漏电流&#xff1a;0.05 nA 输入高电压&#xff1a;2V 输入低电压&#xff1a;0.8V 输入电流&#xff1a;0.002μA 数字输入电容&#xff1a;2.5 …

Bean作用域与生命周期

日升时奋斗&#xff0c;日落时自省 目录 1、Bean的作用域问题 1.1、Lombok 1.2、修改Bean对象 2、作用域定义 2.1、Bean的6种作用域 2.1.1、singleton 2.1.2、prototype 2.1.3、request 2.1.4、session 2.1.5、appliction&#xff08;了解&#xff09; 2.1.6、webs…

I2C驱动框架介绍以及Linux下sht20驱动开发温湿度传感器获取温湿度

文章目录 一、I2C驱动框架&#xff08;1&#xff09;I2C驱动框架介绍&#xff08;2&#xff09;I2C总线驱动介绍【1】i2c_adapter结构体【2】i2c_algorithm结构体【3】I2C总线驱动工作介绍 &#xff08;3&#xff09;I2C设备驱动介绍【1】i2c_client结构体【2】i2c_driver结构体…

Docker容器---Harbor私有仓库部署与管理

Harbor私有仓库部署与管理 一、Harbor概述二、Harbor特性三、Harbor构成四、Harbor构建Docker私有仓库1、部署docker-compos2、下载或上传 Harbor 安装程序3、启动Harbor4、查看Harbor启动镜像5、浏览器访问创建一个新项目6、通过127.0.0.1来登录和推送镜像7、在客户端上传镜像…

【JavaScript】动态表格

&#x1f38a;专栏【 前端易错合集】 &#x1f354;喜欢的诗句&#xff1a;更喜岷山千里雪 三军过后尽开颜。 &#x1f386;音乐分享【如愿】 大一同学小吉&#xff0c;欢迎并且感谢大家指出我的问题&#x1f970; &#x1f354;介绍 就是在输入框中输入数字后&#xff0c;再按…

Linux安装mysql(5.7解压版)

Linux服务器安装软件时&#xff0c;建议安装解压版&#xff0c;将文件安装在自己指定的目录。安装版一般会将软件安装在Linux默认的目录&#xff0c;如/usr/local/&#xff0c;配置文件在/etc/&#xff0c;日志在/logs&#xff0c;安装目录比较分散&#xff0c;特别是不熟悉该软…

RabbitMQ --- SpringAMQP

一、简介 SpringAMQP是基于RabbitMQ封装的一套模板&#xff0c;并且还利用SpringBoot对其实现了自动装配&#xff0c;使用起来非常方便。 SpringAmqp的官方地址&#xff1a;Spring AMQP SpringAMQP提供了三个功能&#xff1a; 自动声明队列、交换机及其绑定关系 基于注解的监…

代码随想录算法训练营第四十二天|01背包问题,你该了解这些!、01背包问题,你该了解这些! 滚动数组 、416. 分割等和子集

文章目录 01背包问题&#xff0c;你该了解这些&#xff01;01背包问题&#xff0c;你该了解这些&#xff01; 滚动数组416. 分割等和子集 01背包问题&#xff0c;你该了解这些&#xff01; 题目链接&#xff1a;代码随想录 二维数组解决0-1背包问题 解题思路&#xff1a; 1.dp…

tensorflow ---gpu的环境配置

1. CUDA配置&#xff1a; 先鼠标右键查看对应的CUDA的版本&#xff1a; 2.安装CUDA&#xff1a; 1.点击 CUDA去官网来下载安装包。 这里我选择的是我电脑支持的9.0的版本&#xff1a; 2.下载CUDA安装包&#xff1a; 3. 安装CUDA的过程&#xff1a; 自定义安装路径&#xff…

RabbitMQ --- 简介、快速入门

一、初识MQ 1.1、同步和异步通讯 微服务间通讯有同步和异步两种方式&#xff1a; 同步通讯&#xff1a;就像打电话&#xff0c;需要实时响应 异步通讯&#xff1a;就像发邮件&#xff0c;不需要马上回复 两种方式各有优劣&#xff0c;打电话可以立即得到响应&#xff0c;但…

【论文精度(李沐老师)】Deep Residual Learning for Image Recognition

Deep Residual Learning for Image Recognition 残差连接主要干的一个事情是&#xff1a; 如果你新加的层不能让你的模型变好的时候&#xff0c;因为有残差连接的存在&#xff0c;可以使新加的那些层不会学到任何东西。 Abstract &#xff08;提出问题&#xff09;深的神经网…

STM32-HAL-定时器(无源蜂鸣器的驱动)

文章目录 一、蜂鸣器的介绍二、常用的无源蜂鸣器的电路三、测试准备四、初始化片上外设4.1 初始化定时器4的通道2为PWM输出模式4.2 编写驱动代码4.3 Logic分析仪查看波形4.4 代码分析 一、蜂鸣器的介绍 有源蜂鸣器&#xff1a; 有源蜂鸣器内部有一个发声电路,也就是“源”&…

程序员那些“越早知道越好的”道理

目录 程序员那些“越早知道越好的”道理1、学会阅读文档2、学会调试代码3、学会使用版本控制工具4、学会编写测试代码5、学会提问6、学会使用搜索引擎7、学会读懂源代码 程序员那些“越早知道越好的”道理 作为一名程序员&#xff0c;有很多话想对新手说&#xff0c;因为这些话…

ctr特征重要性建模:FiBiNetFiBiNet++模型

FiBiNET&#xff08;Feature Importance and Bilinear feature Interaction NETwork&#xff09;为推荐系统的CTR模型提出了一些创新方向&#xff1a; 引入一个SENet模块&#xff0c;可以动态学习特征的重要性&#xff1b;引入一个双线性模块&#xff08;Bilinear-Interaction…

在当前互联网行情下,Android想转音视频开发,会有前景吗?

前言 近年来&#xff0c;由于三年疫情的影响&#xff0c;很多公司都开始陆陆续续的在裁员&#xff0c;Android开发工作岗位也是&#xff0c;可能有些从事Android开发的朋友还没有意识到&#xff0c;Android开发岗位正在变少&#xff0c;求职者&#xff0c;僧多粥少&#xff0c…

数据可视化大屏电商数据展示平台开发实录(Echarts柱图曲线图、mysql筛选统计语句、时间计算、大数据量统计)

数据可视化大屏电商数据展示平台 一、前言二、项目介绍三、项目展示四、项目经验分享4.1 翻牌器4.1.1 翻牌器-今日实时交易4.1.2.翻牌器后端统计SUM函数的使用 4.2 不同时间指标的数据MySql内部的时间计算 4.3 实时交易播报MySql联表查询和内部遍历循环 4.4 每日交易量4.4.1.近…