【打卡】图像检索与重复图像识别1,2

news/2024/7/21 4:51:55 标签: 计算机视觉, 图像处理, 人工智能

Part4 图像检索与匹配

背景介绍

随着互联网上的图像数量不断增长,图像检索和匹配技术已成为许多视觉搜索引擎的核心技术,能够提高搜索结果的准确性和覆盖范围。图像检索和匹配是计算机视觉领域的重要研究方向之一,其主要目的是从大规模的图像库中快速准确地找到与查询图像相似或相同的图像。

环境配置

实践环境建议以Python3.7+,且需要安装如下库:

numpy
pandas
opencv
pytorch

学习打卡

任务名称 难度/分值
任务1:图像匹配与检索 低/1
任务2:基础局部特征提取 中/2
任务4:深度全局特征 中/3
任务3:深度局部特征 高/3
任务5:孪生网络与自监督 高/3
任务6:特征压缩与加速 高/3
打卡地址:https://shimo.im/forms/I1HSpXlDwYkWYPiQ/fill

实践比赛地址:https://competition.coggle.club/

任务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)

print(dataset_feat.shape)
# 计算每张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


http://www.niftyadmin.cn/n/216638.html

相关文章

使用开发者工具等跳过付费墙

使用开发者工具等方法跳过付费墙 参考于: https://bbarrows.com/posts/how-to-get-around-paywalls-with-debug-tools Everyone Hates Paywalls 每个人都讨厌付费墙 像csdx网站,不登录看不到之后的内容 下面是一些方法跳过付费墙 (1) 视图滚动 Chrome…

城市供排水综合安全监管信息平台方案

目 录 一、供排水管网GIS子系统.... 1 1.1、供排水管网GIS子系统... 1 1.1.1、GIS基本功能... 1 1.1.2、底图服务... 4 1.1.3、数据标注服务... 4 1.1.4、路径分析服务... 5 1.1.5、协同制图服务... 5 1.1.6、专题模型服务... 6 1.1.7、遥感影像服务... 6 1.1.8、三维地图服务.…

排序-时间复杂度

技巧:先处理 内层 一次排序,在处理外面 直接插入排序 升序 最坏(遇到降序):O(N^2) 等差数列 123…(n-1) (n^2-n)/2 最好(有序) O(N) 希尔排序 gap 任何数字/2都是1 gap/3 1 保证gap最后是1 gap是多少 就分了多少组,每组数据可能少一点&…

4月13日,每天30秒,昨夜今晨一览无余/两款iPhone 15 Pro将取消固态按键设计/法国正在考虑对苹果采取反垄断行动

1、永辉超市全资控股的私募基金主动注销 2、蚂蚁保上线“省心配”智能配置工具 3、国家能源局:大力发展风电太阳能发电,2023年全年风电、光伏装机增加1.6亿千瓦左右 4、国家能源局:积极推动能源消费侧转型,加快建设智能配电网、…

Apache配置与应用

1.基于域名的虚拟主机 为虚拟主机提供域名解析 基于域名:为每个虚拟主机使用不同的域名,但是其对应的 IP 地址是相同的。例如,www.benet.com 和 www.accp.com 站点的 IP 地址都是 192.168.80.10。这是使用最为普遍的虚拟 Web 主机类型。 方法…

Debezium同步之实时数据采集必备工具

目录 简介 基础架构图片 Kafka Connect Debezium 特性 抽取原理 简介 RedHat(红帽公司) 开源的 Debezium 是一个将多种数据源实时变更数据捕获,形成数据流输出的开源工具。 它是一种 CDC(Change Data Capture)工具,工作原理类似大家所熟知的 Canal, DataBus, Maxwell…

记录-vue项目中使用PWA

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前言: 梳理了一下项目中的PWA的相关用法,下面我会正对vue2和vue3的用法进行一些教程示例,引入离线缓存机制,即使你断网,也能访问页面。一旦用…

推荐一款 AI 脑图软件,助你神速提高知识体系搭建

觅得一款神器,接近我理想中,搭建知识体系的方法,先来看视频作为数据库开发或管理者,知识体系搭建尤为重要。来看看近些年缺乏足够数据库知识面造成的危害:a/ 数据安全风险:例如,2017年Equifax数…