使用预训练CNN生成图像嵌入(image embeddings)

news2024/11/14 13:47:24

文章目录

  • 什么是图像嵌入?
  • 来自 Kaggle 的狗品种图像数据集
  • 从狗品种图像数据集生成图像嵌入
  • 参考

什么是图像嵌入?

图像嵌入是图像的低维表示。换句话说,它是图像的密集向量表示,可用于分类等许多任务。

例如,这些深度学习表示有时用于创建搜索引擎,因为它依赖于图像相似性。事实上,要找到一类图像(例如狗),我们只需要找到最接近狗图像向量的嵌入向量。

找到这些的一个好方法是计算嵌入之间的余弦相似度。相似的图像在嵌入之间将具有较高的余弦相似度。

来自 Kaggle 的狗品种图像数据集

对于这个例子,我们将使用我最喜欢的数据集之一:Kaggle Dog Breed Images 🐶

在这里插入图片描述
首先,我们需要下载这个数据集:

!export KAGGLE_USERNAME="xxxx" && export KAGGLE_KEY="xxxx" && mkdir -p data && cd data 
&& kaggle datasets download -d eward96/dog-breed-images 
&& unzip -n dog-breed-images.zip && rm dog-breed-images.zip

让我们看看这个数据文件夹中有什么:
在这里插入图片描述

这里我们有 10 种不同品种的狗:bernese_mountain_dog、chihuahua、dachshund、jack_russell、pug、border_collie、corgi、golden_retriever、labrador、siberian_husky。

import glob
data_dir = 'data'

list_imgs = glob.glob(data_dir + "/**/*.jpg")
print(f"There are {len(list_imgs)} images in the dataset {data_dir}")

=> 数据集中有918张图像。

以下示例展示了如何从狗品种文件夹创建 Deep Lake 数据集并将其存储在 Deep Lake 云中。

为了创建数据集,我们使用了 torchvision 模块:数据集和转换,以及 torch.utils.data.DataLoader:

from torchvision import datasets, transforms
import torch

# create dataloader with required transforms 
tc = transforms.Compose([
        transforms.Resize((256, 256)),
        transforms.ToTensor()              
    ])

image_datasets = datasets.ImageFolder(data_dir, transform=tc)
dloader = torch.utils.data.DataLoader(image_datasets, batch_size=10, shuffle=False)

print(len(image_datasets)) # returns 918

我们有一个调整大小和批处理的数据集加载器可供使用。

注意:Pytorch 默认的图像后端是 Pillow,当您使用 ToTensor() 类时,PyTorch 会自动将所有图像转换为 [0,1],因此无需在此处标准化图像。

如果我们想要可视化该数据集中的第一张图像:

for img, label in dloader:
      print(np.transpose(img[0], (1,2,0)).shape)
      print(img[i])
      plt.imshow((img[i].detach().numpy().transpose(1, 2, 0)*255).astype(np.uint8))
      plt.show()
      i = i + 1
      break

在这里插入图片描述

从狗品种图像数据集生成图像嵌入

为了生成图像嵌入,我们将使用预训练的模型直到分类前的最后一层,也称为倒数第二层。

CNN(卷积神经网络)的第一层提取输入图像的特征,然后全连接层处理分类并返回类别概率,然后将其传递给 softmax 损失,例如,它将确定哪个类别具有最高的概率概率得分:

在这里插入图片描述

# fetch pretrained model
model = torch.hub.load('pytorch/vision:v0.10.0', 'resnet18', pretrained=True)

现在我们需要选择要从中提取特征的层。如果我们再看一下 ResNet-18 的架构:

在这里插入图片描述
我们可以看到最后一层是 fc 层(全连接),其中对特征进行分类。我们想要CNN 分类部分之前的特征,因此,我们想要第一个全连接层,即 fc 之前的层:avgpool层。

我们可以使用模型对象选择该层:

# Select the desired layer
layer = model._modules.get('avgpool')

然后,我们使用register_forward_hook模块来获取嵌入:

def copy_embeddings(m, i, o):
    """Copy embeddings from the penultimate layer.
    """
    o = o[:, :, 0, 0].detach().numpy().tolist()
    outputs.append(o)

outputs = []
# attach hook to the penulimate layer
_ = layer.register_forward_hook(copy_embeddings)

注意:每次forward()计算出输出后都会调用函数copy_embeddings并将其保存在列表ouputs中。

然后,我们需要建模为推理模式:

model.eval() # Inference mode

让我们使用这个模型为我们的狗品种图像生成嵌入:

# Generate image's embeddings for all images in dloader and saves 
# them in the list outputs
for X, y in dloader:
    _ = model(X)
print(len(outputs)) #returns 92

由于dloader是批处理的,我们需要展平输出:

# flatten list of embeddings to remove batches
list_embeddings = [item for sublist in outputs for item in sublist]

print(len(list_embeddings)) # returns 918
print(np.array(list_embeddings[0]).shape)) #returns (512,)

正如预期的那样,新的展平列表 list_embeddings 的长度等于 918,这是我们在此狗品种数据集中拥有的图像数量。另外,列表 list_embeddings 中第一项的形状是 (512,),它对应于 avgpool 层输出的形状。

参考

https://www.activeloop.ai/resources/generate-image-embeddings-using-a-pre-trained-cnn-and-store-them-in-hub/

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

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

相关文章

(0020) H5-Vue-router+Element-ui 搭建非常简单的dashboard

参考学习: Vue Vue-router Element-ui 搭建一个非常简单的dashboard demo demo参考:https://github.com/wangduanduan/vue-el-dashboard 在线预览 效果图: 使用到的技术: Vue Vue-router Element-ui webpack Normalize.css v…

final关键字 抽象类

final关键字 可以修饰类、属性、方法和局部变量【参数】。 使用场景 1、当不希望 类被继承时,可以用final修饰。比如不希望子类重写父类时。 2、当不希望子类重写父类的某个方法。注意:此时不能重写但能继承父类此方法使用。 3、当不希望类的某个属…

windows下在注册表中添加右键pycharm打开目录

1、winregedit打开注册表,并在shell下创建项,修改如下图右侧内容 2、在PyCharm下创建command项,并修改其内容 3、重启电脑 4、显示

比ping还好用的排障命令

遇到网络故障的时候,你一般会最先使用哪条命令进行排障? 除了Ping,还有Traceroute、Show、Telnet又或是Clear、Debug等等。 今天安排的,是Traceroute排障命令详解,给你分享2个经典排障案例哈。 01 Traceroute原理和功…

Cisco ISR 4000 Series IOS XE Release Dublin-17.11.1a ED

Cisco ISR 4000 Series IOS XE Release Dublin-17.11.1a ED 思科 4000 系列集成服务路由器 请访问原文链接:https://sysin.org/blog/cisco-isr-4000/,查看最新版。原创作品,转载请保留出处。 作者主页:sysin.org 思科 4000 系列…

Matlab无人机算法开发套件上新,快速实现控制算法到无人机平台的移植

在现有的旋翼无人机市场中,绝大部分可二次开发的产品都只提供C、C等SDK,但在科研类无人机这一细分领域中,更多的开发者偏好或善于使用Matlab进行算法的开发和验证。为了助力从事控制算法理论研究的开发者,能够独立完成控制算法到无…

举例说明什么是循环神经网络

循环神经网络(Recurrent Neural Network, RNN)是一种处理时间序列数据和自然语言等具有顺序信息的数据的神经网络模型。与普通的前馈神经网络(Feedforward Neural Network)不同,RNN具有循环连接,使得网络能…

【Java】-【IDEA 编译项目时报错:GC overhead limit exceeded】

文章目录 问题简述问题分析解决方案解决方案一解决方案二 问题简述 以前项目启动都是好好的,没有任何问题,最近启动时却报错: java.lang.OutOfMemoryError: ...(此处忽略) GC overhead limit exceeded问题分析 错误是发生在编译阶段&#…

STM32单片机CAN总线汽车灯光控制系统远近光刹车双闪

实践制作DIY- GC0151---CAN总线汽车灯光控制系统 基于STM32单片机设计---CAN总线汽车灯光控制系统 二、功能介绍: OLED主控板:STM32F103C系列最小系统OLED显示3个按键(大灯开关、大灯自动/手动、大灯近光/远光)左转按键右转按键双…

docker学习(七)docker daemon

1.Docker 的CS模式 1.1.Docker 的C/S模式介绍 在 Docker Client 中来运行 Docker 的各种命令,这些命令会传送给在 Docker 的宿主机上运行的 Docker 守护进程。而 Docker 守护进程是负责实现 Docker 各种功能的。 如图所示,Docker 守护进程运行在宿主机…

超参数调试、Batch正则化和程序框架

1、归一化网络的激活函数(Normalizing activations in a network ) 规范化,方法如下,减去均值再除以标准偏差,为了使数值稳定, 通常将𝜀作为分母,以防𝜎 0的情况 &…

使用maven profile 实现一次打包多版本依赖的fat jar

基于一种特殊情况: 需要开发通用代码,但底层依赖的jar有不同版本,使用一次maven 命令编译来同时生成多个fat jar。 测试代码结构: log4j-v1/log4j-v2 有一个同名类被maintest引用。 maintest pom.xml如下 <?xml version="1.0" encoding="UTF-8"…

Docker的安装以及Docker私有仓库的搭建

Docker的安装 # 1、yum 包更新到最新 yum update # 2、安装需要的软件包&#xff0c; yum-util 提供yum-config-manager功能&#xff0c;另外两个是devicemapper驱动依赖的 yum install -y yum-utils device-mapper-persistent-data lvm2 # 3、 设置yum源 yum-config-manage…

基于QT设计的无人机地面站(摄像头录像拍摄)

一、功能需求 通过QT设计一款无人机地面站软件,需要包含基本的RTSP拉流功能,对接无人机平台的RTSP流。此外,需要完成拍照、录像、OSD叠加功能;完成按钮控制云台进行拍照、录像、变焦、指点运动等。在此基础上,完成对应的目标跟踪识别。 技术要求 (1)采用QT平台,设计W…

一、QT主界面简介和创建一个QT工程

QT从入门到实战学习笔记 一、QtCreator主界面简介1、欢迎界面2、编辑界面3、设计界面4、Debug界面5、帮助界面6、主界面左下角按钮 二、创建QT工程1、创建一个新的project2、模板选择3、项目介绍和位置4、定义所建的系统文件类型5、创建类信息&#xff08;Details&#xff09;6…

Redis【实战篇】---- 秒杀优化

Redis【实战篇】---- 秒杀优化 1. 秒杀优化-异步秒杀思路2. 秒杀优化-Redis完成秒杀资格判断3. 秒杀优化-基于阻塞队列完成秒杀优化 1. 秒杀优化-异步秒杀思路 我们来回顾一下下单流程 当用户发起请求&#xff0c;此时会请求nginx&#xff0c;nginx会访问到tomcat&#xff0c…

HNU-小学期工训-STC-B焊接质量分析报告

质量分析报告 焊接情况简单概述 同学们都按时按质量地完成了焊接工作&#xff0c;在测试过程中无短路问题 学习班焊接质量、报修等情况统计 焊接质量较好&#xff0c;焊锡基本圆润光滑&#xff0c;经测试无短路现象 报修情况统计&#xff1a; 测试情况统计 部分同学存在故…

Sqlite创建表、查看表

前面已经学习了Sqlite&#xff1b; 图解SQLite教程_bcbobo21cn的博客-CSDN博客 下面复习一下&#xff1b; 启动和创建数据库&#xff1b;.tables查看表&#xff0c;此时没有&#xff1b; 创建一个表并插入数据&#xff1b; 再创建一个表并插入数据&#xff1b;带小数点的数据…

如何防止数据泄露,保护企业内部文件的安全

现在全球数据泄露事件频发&#xff0c;而且很大一部分都是由于内部员工造成的数据外泄&#xff0c;对企业造成的损失和打击很大&#xff0c;企业一旦出现数据泄露问题&#xff0c;所遭受的不仅仅是经济损失&#xff0c;可能还会对企业的声誉造成负面影响&#xff0c;企业内部的…

简单的手机记事本怎么把英文翻译成中文?

手机记事本是人们常用的辅助工具之一&#xff0c;在使用手机记事本记录内容的时候&#xff0c;除了我们平时使用较多的中文之外&#xff0c;也有人会记录一些英文内容。想要将手机记事本中的英文内容翻译成中文内容应该如何操作呢&#xff1f;以iPhone手机端敬业签记事本软件为…