YOLOv8+CLIP实现图文特征匹配

本文通过结合YOLOv8s的高效物体检测能力与CLIP的先进图像-文本匹配技术,展示了深度学习在处理和分析复杂多模态数据中的潜力。这种技术的应用不仅限于学术研究,还能广泛应用于工业、商业和日常技术产品中,以实现更智能的人机交互和信息处理。

一、物体检测与图像处理

1. 物体检测模型:YOLOv8s

  物体检测是计算机视觉领域的核心问题之一,它涉及识别图像中的物体并精确地定位它们的位置。YOLO(You Only Look Once)技术自2016年由Redmon等人首次提出以来,就以其高效的处理速度和优秀的性能引领了物体检测领域。YOLO的核心创新是将物体检测任务视为一个端到端的回归问题,通过单次前向传播,同时预测图像中多个边界框和相应的类别概率。YOLOv8s是YOLO系列中的最新迭代,继承并增强了YOLO体系的主要优点,如实时性能和高准确率。YOLOv8s进一步优化了模型架构和训练过程,使用深度卷积神经网络一次性分析整个图像,从而预测物体的类别和位置。这种端到端的训练方式不仅简化了训练过程,还增强了模型对不同尺寸物体的泛化能力。

  在本文中,我们采用预训练的YOLOv8s模型进行物体检测。该模型接受输入的原始图像,并输出包括物体类别、置信度和边界框坐标在内的详细检测信息,为后续的图像处理和分析奠定了基础。

在这里插入图片描述

2. 图像处理过程

  图像处理流程从使用PIL(Python Imaging Library)库加载图像开始,这是一个广泛应用于Python中的图像处理库。图像加载后,即被输入到YOLOv8s模型进行推断处理。模型输出的结果包括每个检测到的物体的类别、置信度和边界框坐标。基于这些信息,在原始图像上绘制边界框和相应的标注信息,如物体的类别和置信度,这样的视觉呈现有助于我们直观地理解和评估模型的检测效果。

  代码中还实现了一个关键步骤:根据检测到的边界框坐标,将每个物体裁剪出来并保存为独立的图像文件。这一处理步骤极为重要,因为它允许对每个单独检测到的物体进行进一步分析,无论是用于进一步的图像处理任务,还是用作其他应用,如机器学习训练数据集的构建。

  通过这种方法,我们不仅提高了对物体检测技术的理解,还能有效地利用检测结果进行多种后续的图像分析任务,展示了计算机视觉技术在实际应用中的广泛可能性。

在这里插入图片描述

二、图像与文本的语义匹配.

  1. CLIP模型技术介绍

  CLIP(Contrastive Language-Image Pre-training)是由OpenAI开发的一种革命性多模态学习框架,设计目的是为了深入理解图像与文本之间的语义联系。此框架基于大规模对比学习的原则,通过并行训练图像编码器和文本编码器来识别图像与其描述之间的匹配关系,显著提升了模型对视觉任务的泛化能力。CLIP模型的核心优势在于其独特的训练方法,该方法采用海量的图像-文本对作为训练数据,通过优化图像和文本表示之间的相似度进行训练。这种策略使得CLIP不仅能理解广泛的视觉概念,还能将这些概念与自然语言有效结合,从而实现深层次的语义理解。

  在本文中,我们采用了预训练的CLIP模型(ViT-B/32版本),该模型结合了视觉Transformer(ViT)架构和先进的文本处理能力,使其能够处理高维度的图像数据及复杂的文本输入。

  1. 图像与文本的预处理与特征提取

  为了有效利用CLIP模型进行图像与文本的匹配,数据的适当预处理至关重要。图像数据经过CLIP提供的标准预处理流程,包括调整尺寸、归一化等步骤,确保符合模型的输入规范。文本数据则通过CLIP的分词器处理,将文本转换为一系列标记,进而转换为数值型向量,以适配模型的处理需求。

  在特征提取阶段,预处理后的图像和文本数据分别输入到CLIP的图像编码器和文本编码器中。这两个编码器分别为图像和文本生成高维的特征表示,这些表示在多维空间中捕捉并表达了图像和文本的深层语义内容。

  1. 相似度计算与分析

  获取图像和文本的特征表示后,下一步是计算它们之间的语义相似度。这通过计算两组特征向量之间的点积来实现,其中点积结果反映了图像与文本在语义层面的匹配程度。在本研究中,进行相似度计算之前,对特征向量进行了标准化处理,以消除由于向量长度不同而带来的潜在偏差。

  通过这种方式,我们能够定量评估特定文本描述与一组图像之间的匹配程度,这对于多模态数据分析、内容检索、以及自动化标注等应用领域具有重要的实际意义。这些分析结果不仅展示了CLIP模型在桥接视觉与语言之间差异方面的强大能力,也为未来的多模态研究和应用提供了重要的技术基础。

在这里插入图片描述

三、完整代码

from ultralytics import YOLO
import os
from PIL import Image, ImageDraw, ImageFont
import numpy as np
import torch
import matplotlib.pyplot as plt
import clip# Load a pretrained YOLOv8s model
model = YOLO('yolov8s.pt')# Load an image with PIL
original_image = Image.open('img/img1.jpg')# Run inference on an image
results = model(original_image)# Create a copy of the original image to draw bounding boxes
draw_image = original_image.copy()
draw = ImageDraw.Draw(draw_image)# 类别映射
class_names = {0: "person", 1: "bicycle", 2: "car", 3: "motorcycle", 4: "airplane",5: "bus", 6: "train", 7: "truck", 8: "boat", 9: "traffic light",10: "fire hydrant", 11: "stop sign", 12: "parking meter", 13: "bench",14: "bird", 15: "cat", 16: "dog", 17: "horse", 18: "sheep", 19: "cow",20: "elephant", 21: "bear", 22: "zebra", 23: "giraffe", 24: "backpack",25: "umbrella", 26: "handbag", 27: "tie", 28: "suitcase", 29: "frisbee",30: "skis", 31: "snowboard", 32: "sports ball", 33: "kite", 34: "baseball bat",35: "baseball glove", 36: "skateboard", 37: "surfboard", 38: "tennis racket",39: "bottle", 40: "wine glass", 41: "cup", 42: "fork", 43: "knife",44: "spoon", 45: "bowl", 46: "banana", 47: "apple", 48: "sandwich",49: "orange", 50: "broccoli", 51: "carrot", 52: "hot dog", 53: "pizza",54: "donut", 55: "cake", 56: "chair", 57: "couch", 58: "potted plant",59: "bed", 60: "dining table", 61: "toilet", 62: "tv", 63: "laptop",64: "mouse", 65: "remote", 66: "keyboard", 67: "cell phone", 68: "microwave",69: "oven", 70: "toaster", 71: "sink", 72: "refrigerator", 73: "book",74: "clock", 75: "vase", 76: "scissors", 77: "teddy bear", 78: "hair drier",79: "toothbrush"
}# Process results list
for result in results:boxes = result.boxes  # Boxes object for bbox outputscls = boxes.clsconf = boxes.confxyxyn = boxes.xyxyn# Convert tensor to numpy array and move data to CPUcls_numpy = cls.cpu().numpy()conf_numpy = conf.cpu().numpy()xyxyn_numpy = xyxyn.cpu().numpy()# Iterate over each detectionfor i in range(len(cls_numpy)):# Convert normalized coordinates to image coordinatesbox = xyxyn_numpy[i]xmin, ymin, xmax, ymax = box[0] * original_image.width, box[1] * original_image.height, box[2] * original_image.width, box[3] * original_image.height# Draw the bounding boxdraw.rectangle([(xmin, ymin), (xmax, ymax)], outline="red", width=2)# Get class label from cls number using the mappingclass_label = class_names.get(int(cls_numpy[i]), 'Unknown')# Prepare text with class and confidencelabel = f'{class_label}: {conf_numpy[i]:.2f}'# Draw the class and confidence textdraw.text((xmin, ymin), label, fill="white")# # Save the annotated image
draw_image.save('annotated_image/annotated_img1.png')# 定义一个函数来裁剪图像
def crop_image(original_image, box):x1, y1, x2, y2 = map(int, box)return original_image.crop((x1, y1, x2, y2))# 创建一个目录来保存裁剪的图像,如果该目录不存在的话
os.makedirs('cropped_images', exist_ok=True)# Process results list
for result in results:boxes = result.boxes  # Boxes object for bbox outputscls = boxes.clsconf = boxes.confxyxyn = boxes.xyxyn# Convert tensor to numpy array and move data to CPUcls_numpy = cls.cpu().numpy()conf_numpy = conf.cpu().numpy()xyxyn_numpy = xyxyn.cpu().numpy()# Iterate over each detectionfor i in range(len(cls_numpy)):# Convert normalized coordinates to image coordinatesbox = xyxyn_numpy[i]xmin, ymin, xmax, ymax = box[0] * original_image.width, box[1] * original_image.height, box[2] * original_image.width, box[3] * original_image.height# Draw the bounding boxdraw.rectangle([(xmin, ymin), (xmax, ymax)], outline="red", width=2)# Get class label from cls number using the mappingclass_label = class_names.get(int(cls_numpy[i]), 'Unknown')# Prepare text with class and confidencelabel = f'{class_label}: {conf_numpy[i]:.2f}'# Draw the class and confidence textdraw.text((xmin, ymin), label, fill="white")# Crop the image around the bounding box and save itcropped_img = crop_image(original_image, (xmin, ymin, xmax, ymax))cropped_img_path = os.path.join('cropped_images', f'{class_label}_{i}_{conf_numpy[i]:.2f}.jpg')cropped_img.save(cropped_img_path)# Load the CLIP model
model, preprocess = clip.load("ViT-B/32", device='cuda')
model.eval()# Prepare your images and texts
your_image_folder = "cropped_images"  # Change to the folder where you stored cropped images
your_texts = ["Drink water"]  # Replace with your list of textsimages = []
for filename in os.listdir(your_image_folder):if filename.endswith(".png") or filename.endswith(".jpg"):path = os.path.join(your_image_folder, filename)image = Image.open(path).convert("RGB")images.append(preprocess(image))# Image and text preprocessing
image_input = torch.tensor(np.stack(images)).cuda()
text_tokens = clip.tokenize(your_texts).cuda()# Compute features
with torch.no_grad():image_features = model.encode_image(image_input).float()text_features = model.encode_text(text_tokens).float()# Normalize the features
image_features /= image_features.norm(dim=-1, keepdim=True)
text_features /= text_features.norm(dim=-1, keepdim=True)print('image_features:', image_features)
print('text_features:', text_features)print('image_features_shape:', image_features.shape)
print('text_features_shape:', text_features.shape)# Calculate similarity
similarity = (text_features.cpu().numpy() @ image_features.cpu().numpy().T)# Print similarity scores
print('Similarity:', similarity)

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

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

相关文章

新年首站 | 宝兰德教育行业信创新动力发展研讨会顺利召开

近日,宝兰德携手慧点数码、安超云共同举办了教育行业信创新动力发展研讨会。会议邀请了中国人民公安大学、中国戏曲学院、北京航空航天大学、北京理工大学、华北电力大学、中国矿业大学、北京服装学院、北京城市学院等数十所高校信息中心负责人、专家出席了本次会议…

LeetCode 题目 120:三角形最小路径和

作者介绍:10年大厂数据\经营分析经验,现任字节跳动数据部门负责人。 会一些的技术:数据分析、算法、SQL、大数据相关、python,欢迎探讨交流 欢迎加入社区:码上找工作 作者专栏每日更新: LeetCode解锁1000题…

WEB后端复习——javabean与会话cookie、session

JavaBean 是一种符合特定命名约定的 Java 类,它通常用于封装数据。 JavaBean 的主要特点是: 1. 无参构造器:JavaBean 必须有一个公共的(public)无参构造方法,以便于反射时能够创建对象实例。 2. 属性&…

Android的视图显示和管理机制:layout view window WindowManager Canvas Surface

在Android系统中,Layout view window WindowManager Canvas Surface SurfaceFlinger这些组件协同工作,以实现图形的绘制和显示。需要搞明白这些组件是什么时候创建的以及他们之间的结构关系。 从上到下的层级关系:用户在View上进行操作&…

考研踩坑经验分享

文章目录 写在前面自身情况简介自身学习路线优点坑点 学习路线建议1、2和3月份3、4和5月份6、7和8月份9、10月份11、12月份 一些私货建议结尾 写在前面 考研是一件非常有盼头的事,但绝对不是一件容易的事。 如果你不能做好来年三月份出成绩时,坦然接受…

Ubuntu 下使用 Scons 交叉编译嘉楠堪智 CanMV K230 大小核 Coremark 程序

在 Ubuntu 下使用 SCons 进行交叉编译嘉楠堪智 CanMV K230 大小核(不同的玄铁 C908 核心)的 C 程序,以 Coremark 程序为例,顺便测试一下大小核和编译器的性能。 2024年3月14日,嘉楠科技宣布推出了全球首款支持 RISC-V…

# 从浅入深 学习 SpringCloud 微服务架构(十七)--Spring Cloud config(1)

从浅入深 学习 SpringCloud 微服务架构(十七)–Spring Cloud config(1) 一、配置中心的 概述 1、配置中心概述 对于传统的单体应用而言,常使用配置文件来管理所有配置,比如 SpringBoot 的 application.y…

消费金融平台公司如何做大做强自营产品

本文来自于2019年的某次内部分享沟通会,部分敏感内容已做删减。

油泼辣子在食品类别可以申请成商标不!

前阵韩国人在美国申请“chili crunch”油泼辣子作为商标,还准备禁止华人餐馆使用投诉侵权并索赔,普推知产老杨在USPTO上面检索发现,这个人申请的主要是30类方便食品的调味品,商标分类是全球通用的。 商标名称不能申请本类所属的通…

C/C++常用的内置的宏定义

常用的C/C 内置宏 这是我在VS2015下运行的 cout << "file " << __FILE__ << endl;cout << "line " << __LINE__ << endl;cout << "date " << __DATE__ << endl;cout << "…

力扣HOT100 - 55. 跳跃游戏

解题思路&#xff1a; class Solution {public boolean canJump(int[] nums) {int n nums.length;int maxReach 0;// 正常来说每次至少跳一格&#xff0c;所以最多循环n次for (int i 0; i < n; i) {if (i > maxReach) return false;// 这种情况代表遇到了0&#xff0…

机器学习周报第三十八周 iTransformer

文章目录 week38 iTransformer摘要Abstract一、文献阅读1. 题目2. abstract3. 网络架构**转置Embedding&#xff1a;****LayerNorm&#xff08;层归一化&#xff09;****Feed-forward network&#xff08;前馈网络&#xff09;****Multivariate-Attention&#xff08;多变量注意…

大数据比赛-环境搭建(一)

1、安装VMware Workstation 链接&#xff1a;https://pan.baidu.com/s/1IvSFzpnQFl3svWyCGRtEmg 提取码&#xff1a;ukpo 内有安装包及破解方式&#xff0c;安装教程。 2、下载Ubuntu系统 阿里巴巴开源镜像站-OPSX镜像站-阿里云开发者社区 (aliyun.com) 点击下载&#xff…

四川汇昌联信:拼多多运营属于什么行业?

拼多多运营属于什么行业?这个问题看似简单&#xff0c;实则涉及到了电商行业的深层次理解。拼多多运营&#xff0c;顾名思义&#xff0c;就是在拼多多这个电商平台上进行商品销售、推广、客户服务等一系列活动。那么&#xff0c;这个行业具体包含哪些内容呢?下面就从四个不同…

Verilog复习(四)| 组合逻辑

一位全加器结构描述&#xff1a; 数据流描述&#xff1a; 行为描述&#xff1a; 只要有事件发生&#xff08;列表中任何 信号有变化&#xff09;&#xff0c;就执行begin…end 的语句 。 always的事件控制方式 边沿触发 always (posedge clk) // clk从低电平->高&#x…

QT自适应界面 处理高DPI 缩放比界面乱问题

1.pro文件添加 必须添加要不找不到 QT版本需要 5。4 以上才支持 QT widgets 2.main界面提前处理 // 1. 全局缩放使能QApplication::setAttribute(Qt::AA_EnableHighDpiScaling, true);// 2. 适配非整数倍缩放QGuiApplication::setHighDpiScaleFactorRoundingPolicy(Qt::High…

打印图形(C语言)

一、N-S流程图&#xff1b; 二、运行结果&#xff1b; 三、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>int main() {//初始化变量值&#xff1b;int i, j;//循环打印&#xff1b;for (i 0; i < 5; i){//列&#xff1b;for (j 0; j &…

SpringBoot+Vue实现图片滑块和文字点击验证码

一、背景 1.1 概述 传统字符型验证码展示-填写字符-比对答案的流程&#xff0c;目前已可被机器暴力破解&#xff0c;应用程序容易被自动化脚本和机器人攻击。 摒弃传统字符型验证码&#xff0c;采用行为验证码采用嵌入式集成方式&#xff0c;接入方便&#xff0c;安全&#…

光伏电站智能管理平台功能全面介绍

一、介绍 光伏电站智能管理平台专门为了光伏电站服务的融合了项目沟通、在线设计、施工管理、运维工单等多智能光伏管理系统&#xff0c;可以满足光伏电站建设前期沟通、中期建设和后续维护的一体化智能平台&#xff0c;同时通过组织架构对企业员工进行线上管理和数据同步&…

BUU-二维码

题目 解题 打开是一张图片&#xff0c;扫描二维码后显示 secret is here 一时没有思路&#xff0c;看别人的wp https://blog.csdn.net/wusimin432503/article/details/125692459https://blog.csdn.net/weixin_45728231/article/details/120988424?spm1001.2101.3001.6661.1…