【计算机视觉】BLIP:源代码示例demo(含源代码)

2023-11-15

一、Image Captioning

首先配置代码:

import sys
if 'google.colab' in sys.modules:
    print('Running in Colab.')
    !pip3 install transformers==4.15.0 timm==0.4.12 fairscale==0.4.4
    !git clone https://github.com/salesforce/BLIP
    %cd BLIP

这段代码用于在Google Colab环境中进行设置。代码首先检查是否在Google Colab环境中运行(‘google.colab’ in sys.modules)。如果是在Colab环境中运行,它会继续使用pip3安装特定版本的Python包。然后,它通过git clone命令克隆名为"BLIP"的GitHub代码仓库。最后,代码使用%cd命令将当前工作目录更改为"BLIP"代码仓库的目录。

这段代码的目的是在Google Colab中设置必要的环境,以便在"BLIP"代码仓库中继续执行其他相关代码。

from PIL import Image
import requests
import torch
from torchvision import transforms
from torchvision.transforms.functional import InterpolationMode

device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')

def load_demo_image(image_size,device):
    img_url = 'https://storage.googleapis.com/sfr-vision-language-research/BLIP/demo.jpg' 
    raw_image = Image.open(requests.get(img_url, stream=True).raw).convert('RGB')   

    w,h = raw_image.size
    display(raw_image.resize((w//5,h//5)))
    
    transform = transforms.Compose([
        transforms.Resize((image_size,image_size),interpolation=InterpolationMode.BICUBIC),
        transforms.ToTensor(),
        transforms.Normalize((0.48145466, 0.4578275, 0.40821073), (0.26862954, 0.26130258, 0.27577711))
        ]) 
    image = transform(raw_image).unsqueeze(0).to(device)   
    return image

这段代码用于加载演示图像并进行预处理,以便用于后续的计算机视觉任务。让我们逐行解读代码:

  1. from PIL import Image: 导入PIL库中的Image模块,用于图像处理。

  2. import requests: 导入requests库,用于从网络上获取图像。

  3. import torch: 导入PyTorch库,用于深度学习任务。

  4. from torchvision import transforms: 从torchvision库中导入transforms模块,用于图像预处理。

  5. from torchvision.transforms.functional import InterpolationMode: 从torchvision.transforms.functional模块中导入InterpolationMode,用于指定图像的插值方式。

  6. device = torch.device(‘cuda’ if torch.cuda.is_available() else ‘cpu’): 判断是否有可用的GPU,如果有则将device设置为cuda,否则设置为cpu。后续计算会在这个设备上执行。

  7. def load_demo_image(image_size, device):: 定义了一个名为load_demo_image的函数,该函数接受图像大小image_size和计算设备device作为输入参数。

  8. img_url = ‘https://storage.googleapis.com/sfr-vision-language-research/BLIP/demo.jpg’: 定义了演示图像的URL。

  9. raw_image = Image.open(requests.get(img_url, stream=True).raw).convert(‘RGB’): 从给定的URL下载原始图像,并使用PIL库中的Image模块打开和转换图像格式为RGB。

  10. w, h = raw_image.size: 获取原始图像的宽度和高度。

  11. display(raw_image.resize((w//5, h//5))): 使用display函数显示缩小后的原始图像。

  12. transform = transforms.Compose([…]): 定义一个图像预处理的变换链,包括图像大小调整、图像转换为张量、以及归一化等操作。

  13. image = transform(raw_image).unsqueeze(0).to(device): 对原始图像进行预处理,并将其转换为张量。使用unsqueeze(0)将图像张量的维度从 [C, H, W] 调整为 [1, C, H, W],以匹配网络模型的输入形状。最后,将处理后的图像张量移动到之前设定的计算设备上。

  14. return image: 返回预处理后的图像张量。

这段代码的作用是加载演示图像,并将其预处理成适合用于后续计算机视觉任务的张量数据。在函数调用时,您需要传入所需的图像大小和计算设备,然后可以使用返回的图像张量进行计算机视觉模型的推理和分析。

from models.blip import blip_decoder

image_size = 384
image = load_demo_image(image_size=image_size, device=device)

model_url = 'https://storage.googleapis.com/sfr-vision-language-research/BLIP/models/model_base_capfilt_large.pth'
    
model = blip_decoder(pretrained=model_url, image_size=image_size, vit='base')
model.eval()
model = model.to(device)

with torch.no_grad():
    # beam search
    caption = model.generate(image, sample=False, num_beams=3, max_length=20, min_length=5) 
    # nucleus sampling
    # caption = model.generate(image, sample=True, top_p=0.9, max_length=20, min_length=5) 
    print('caption: '+caption[0])
  1. from models.blip import blip_decoder: 导入自定义的blip_decoder模型,这是"BLIP"模型的解码部分。

  2. image_size = 384: 定义图像大小为384x384像素。

  3. image = load_demo_image(image_size=image_size, device=device): 使用之前定义的load_demo_image函数加载演示图像,并对图像进行预处理,以适应模型的输入要求。image是经过预处理后的图像张量。

  4. model_url = ‘https://storage.googleapis.com/sfr-vision-language-research/BLIP/models/model_base_capfilt_large.pth’: 定义了预训练模型的URL。

  5. model = blip_decoder(pretrained=model_url, image_size=image_size, vit=‘base’): 使用blip_decoder模型的构造函数创建模型实例。此处的pretrained参数指定了预训练模型的URL,image_size参数指定了图像大小,vit参数指定了使用哪个ViT(Vision Transformer)模型,这里选择了base版本。

  6. model.eval(): 将模型设置为评估模式,这会关闭一些在训练时启用的特定功能,如Dropout。

  7. model = model.to(device): 将模型移动到之前设定的计算设备上。

  8. with torch.no_grad():: 使用torch.no_grad()上下文管理器,以确保在推理时不会计算梯度。

  9. caption = model.generate(image, sample=False, num_beams=3, max_length=20, min_length=5): 使用model.generate()方法生成图像的描述。这里使用了beam search方法来搜索最佳的描述。sample=False表示不使用采样方法,而是使用beam search。num_beams=3表示beam search时使用3个束(beam)。max_length=20表示生成的描述最长为20个词,min_length=5表示生成的描述最短为5个词。

  10. print('caption: '+caption[0]): 输出生成的图像描述。

这段代码的作用是使用预训练的"BLIP"模型对加载的图像进行描述生成。它使用beam search方法在模型中进行推理,并输出生成的图像描述。您可以尝试使用不同的采样方法或调整其他参数,来观察生成描述的变化。

输出结果为:

在这里插入图片描述

load checkpoint from https://storage.googleapis.com/sfr-vision-language-research/BLIP/models/model*_base_caption.pth
caption: a woman sitting on the beach with a dog

二、VQA

from models.blip_vqa import blip_vqa

image_size = 480
image = load_demo_image(image_size=image_size, device=device)     

model_url = 'https://storage.googleapis.com/sfr-vision-language-research/BLIP/models/model_base_vqa_capfilt_large.pth'
    
model = blip_vqa(pretrained=model_url, image_size=image_size, vit='base')
model.eval()
model = model.to(device)

question = 'where is the woman sitting?'

with torch.no_grad():
    answer = model(image, question, train=False, inference='generate') 
    print('answer: '+answer[0])
  1. from models.blip_vqa import blip_vqa: 导入自定义的blip_vqa模型,这是"BLIP"模型的视觉问答部分。

  2. image_size = 480: 定义图像大小为480x480像素。

  3. image = load_demo_image(image_size=image_size, device=device): 使用之前定义的load_demo_image函数加载演示图像,并对图像进行预处理,以适应模型的输入要求。image是经过预处理后的图像张量。

  4. model_url = ‘https://storage.googleapis.com/sfr-vision-language-research/BLIP/models/model_base_vqa_capfilt_large.pth’: 定义了视觉问答模型的预训练模型的URL。

  5. model = blip_vqa(pretrained=model_url, image_size=image_size, vit=‘base’): 使用blip_vqa模型的构造函数创建模型实例。此处的pretrained参数指定了预训练模型的URL,image_size参数指定了图像大小,vit参数指定了使用哪个ViT(Vision Transformer)模型,这里选择了base版本。

  6. model.eval(): 将模型设置为评估模式,这会关闭一些在训练时启用的特定功能,如Dropout。

  7. model = model.to(device): 将模型移动到之前设定的计算设备上。

  8. question = ‘where is the woman sitting?’: 定义了一个视觉问答问题,这里的问题是"where is the woman sitting?"。

  9. with torch.no_grad():: 使用torch.no_grad()上下文管理器,以确保在推理时不会计算梯度。

  10. answer = model(image, question, train=False, inference=‘generate’): 使用模型的__call__方法进行推理,输入图像和问题,以生成回答。train=False表示在推理过程中不使用训练模式。inference='generate’表示使用生成式推理方法,而不是提供答案的训练模式。

  11. print('answer: '+answer[0]): 输出生成的回答。

这段代码的作用是使用预训练的"BLIP"模型进行视觉问答,根据给定的问题对加载的图像进行回答生成。它使用生成式推理方法来生成回答。您可以尝试提供不同的问题,来观察模型生成的回答。

输出结果:

在这里插入图片描述

load checkpoint from https://storage.googleapis.com/sfr-vision-language-research/BLIP/models/model*_vqa.pth
answer: on beach

三、Feature Extraction

from models.blip import blip_feature_extractor

image_size = 224
image = load_demo_image(image_size=image_size, device=device)     

model_url = 'https://storage.googleapis.com/sfr-vision-language-research/BLIP/models/model_base.pth'
    
model = blip_feature_extractor(pretrained=model_url, image_size=image_size, vit='base')
model.eval()
model = model.to(device)

caption = 'a woman sitting on the beach with a dog'

multimodal_feature = model(image, caption, mode='multimodal')[0,0]
image_feature = model(image, caption, mode='image')[0,0]
text_feature = model(image, caption, mode='text')[0,0]

输出结果为:

在这里插入图片描述

load checkpoint from https://storage.googleapis.com/sfr-vision-language-research/BLIP/models/model_base.pth

四、Image-Text Matching

from models.blip_itm import blip_itm

image_size = 384
image = load_demo_image(image_size=image_size,device=device)

model_url = 'https://storage.googleapis.com/sfr-vision-language-research/BLIP/models/model_base_retrieval_coco.pth'
    
model = blip_itm(pretrained=model_url, image_size=image_size, vit='base')
model.eval()
model = model.to(device='cpu')

caption = 'a woman sitting on the beach with a dog'

print('text: %s' %caption)

itm_output = model(image,caption,match_head='itm')
itm_score = torch.nn.functional.softmax(itm_output,dim=1)[:,1]
print('The image and text is matched with a probability of %.4f'%itm_score)

itc_score = model(image,caption,match_head='itc')
print('The image feature and text feature has a cosine similarity of %.4f'%itc_score)

输出结果为:

在这里插入图片描述

load checkpoint from https://storage.googleapis.com/sfr-vision-language-research/BLIP/models/model_base_retrieval_coco.pth
text: a woman sitting on the beach with a dog
The image and text is matched with a probability of 0.9960
The image feature and text feature has a cosine similarity of 0.5262
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【计算机视觉】BLIP:源代码示例demo(含源代码) 的相关文章

随机推荐

  • PowerShell使用教程(挑战全网最全,不喜勿喷)

    PowerShell使用教程 遇到它是因为我有一个appx文件要安装 结果 win10没法安装 最后遇到了它 PowerShell 1 背景及定义 微软是一个很 低调 的公司 取名为微软 感觉有 微微软下去 的意思 这是个玩笑了 windo
  • C++循环案例

    目录 1 while循环练习案例 猜数字 2 练习案例 水仙花数 3 练习案例 敲桌子 4 练习案例 乘法口诀表 1 while循环练习案例 猜数字 案例描述 系统随机生成一个1到100之间的数字 玩家进行猜测 如果猜错 提示玩家数字过大或
  • DVCon US 2022论文集合

    2022年DVCon US Paper共55篇 已开放下载论文全集 在此整理各篇论文的摘要和下载链接 方便大家获取和交流 也可后台私信获取 1 A Comparative Study of CHISEL and SystemVerilog
  • 华为架构师8年经验谈:从单体架构到微服务的服务化演进之路

    华为架构师8年经验谈 从单体架构到微服务的服务化演进之路 目录技术文章 2016年6月28日 转自 http www 58maisui com 2016 06 28 a 327 ref myread 本次分享的大纲如下 传统应用开发面临的挑
  • 系统呼叫服务器,一种基于服务器的后台呼叫方式及系统技术方案

    技术实现步骤摘要 本专利技术涉及通讯领域 特别是涉及一种基于服务器的后台呼叫方式及系统 技术介绍 通话是人们生活中必不可少的功能 我们在拨打电话时都遇到过因对方手机关机 占线 暂时无法接通或停机而无法及时联络到对方的情况 目前的处理方式是
  • 人生清单100条

    人生清单是一个个人向往 目标和追求的集合 每个人的清单都会因其个人价值观 兴趣和优先事项而不同 以下是一个包含一些常见目标和价值的人生清单的示例 以供参考 1 学习一门新语言 2 旅行至少10个不同的国家 3 完成一次马拉松 4 创办自己的
  • python 自动复制U盘文件到电脑磁盘v202112012250

    python 自动复制U盘文件到电脑磁盘v202112012250 打包exe去黑框 pyinstaller F w D a1 py import pathlib import time import datetime import shu
  • Dynamics CRM邮箱配置 (OP版)

    Dynamics CRM邮箱配置 Dynamics CRM对邮箱有很好的支持 开通邮箱后方便用户通过邮件进行Dynamics CRM的业务处理 同时也可以作为一直消息流提醒的手段应用于审批 通知等场景 可以做一些更深入的功能拓展 本次集成以
  • MyBatis-Plus详解

    MyBatis Plus 1 简介 1 1 操作步骤 1 2 mybatis plus mapper编写规则 2 注解介绍 2 1 常用注解 2 2 mybatis plus通用Mapper接口 3 条件构造器 4 高级查询 4 1 列投影
  • 学习笔记:多重纹理

    学习笔记 多重纹理 2009 09 01 14 20 52 转载 分类 学习笔记 多重纹理 多重纹理就是在渲染一个多边形的时候可以用到多张纹理图 把多张纹理图进行一些颜色的操作 可以达到一些效果 但是多重纹理必须是在显卡支持的情况下 但是还
  • centOS 配置DNS

    修改 etc resolv conf 重启网卡或者重启电脑后 etc resolv conf会恢复到原来的状态 原因说明 CentOS redhat下面直接修改 etc resolv conf 达到临时效果 但是重启网络后会重置 重启后 根
  • c++ 结构体

    1 结构体定义 整形 长整形 字符型以及浮点型等这些数据类型指南记录单一的数据 而这些数据只能被称为基础数据类型 如果需要定义某种类型 同时包含以上几种的基本数据类型 比如一个人同时含有身高 体重以及年龄的属性 而结构体就是将这些变量类型包
  • @ApiImplicitParams这个注解的作用

    ApiImplicitParams这个注解的作用 ApiImplicitParams是一个用于描述方法参数的注解 它可以用在方法上 作用是为方法中的参数定义多个注解 并将这些注解集中到一个注解集中进行统一管理 通过 ApiImplicitP
  • 1028. 从先序遍历还原二叉树

    题目 https leetcode cn com problems recover a tree from preorder traversal 我们从二叉树的根节点 root 开始进行深度优先搜索 在遍历中的每个节点处 我们输出 D 条短
  • 机器学习--Logistic Regression(逻辑回归)---分类器

    写在之前 带着问题去学习 往往能够让我们有着一个纲领的学习方法 而不会迷失在各种概念 和公式的推导中 1 什么是逻辑回归 逻辑回归的推导 损失函数的推导分别是什么 为什么LR需要归一化或者说取log 2 LR为什么要用sigmoid函数 这
  • 深度学习中分类和回归常见损失函数归纳小结

    1 引言 在深度学习领域中 损失函数定义了模型的预测与目标值之间的距离 因此我们必须正确地选择它 只有这样所有的参数才会根据其值进行更新 损失函数的选择取决于模型的设计 在这篇文章中 我们主要讨论两种常见的的任务 即回归和分类 2 回归损失
  • 蓝桥杯算法训练-印章

    这一题是10月份新加的题 网上也没啥答案 标签为dp动态规划 实际上我觉得不用动态规划也能做 毕竟python是自带了求组合数的函数 下面来看一下吧 试题 算法训练 印章 资源限制 时间限制 1 0s 内存限制 256 0MB 问题描述 共
  • mybatis逆向工程

    使用mybatis的逆向工程生成JavaBean和mapper以及映射文件只需要三个步骤 1 逆向工程maven依赖 2 编写配置文件genarator xml 3 编写主函数 启动类 一 maven依赖
  • 基于AIOT技术的智慧校园空调集中管控系统设计与实现

    毕业论文 设计 题 目 基于AIOT技术的智慧校园空调集中管控系统设计与实现 指导老师 XXXX 专业班级 电子商务2XXXX 姓 名 XXXX 学 号 20XXXXXXXXX 20XX年XX月XX日 摘要 近年来 随着物联网技术和人工智能
  • 【计算机视觉】BLIP:源代码示例demo(含源代码)

    文章目录 一 Image Captioning 二 VQA 三 Feature Extraction 四 Image Text Matching 一 Image Captioning 首先配置代码 import sys if google