OFA(One-For-All)阿里达摩院实现架构、模态、任务的三个统一之Image Captioning

news2024/11/15 11:45:50

OFA(One-For-All)

通用多模态预训练模型,使用简单的序列到序列的学习框架统一模态(跨模态、视觉、语言等模态)和任务(如图片生成、视觉定位、图片描述、图片分类、文本生成等)

  • 架构统一:使用统一的transformer encoder decoder进行预训练和微调,不再需要针对不同任务设计特定的模型层,用户不再为模型设计和代码实现而烦恼。

  • 模态统一:将NLP、CV和多模态任务统一到同一个框架和训练范式,即使你不是CV领域专家,也能轻松接入图像数据,玩转视觉、语言以及多模态AI模型。

  • 任务统一:将任务统一表达成Seq2Seq的形式,预训练和微调均使用生成范式进行训练,模型可以同时学习多任务,让一个模型通过一次预训练即可获得多种能力,包括文本生成、图像生成、跨模态理解等。

本文聚焦于OFA的使用并且尽可能做了详细的注释

只需要输入任意1张你的图片,3秒内就能收获一段精准的描述

一 Image Captioning(图像字幕)

以下将展示如何使用OFA对图像字幕生成进行推理
你需要构建环境并且clone相关的code与checkpoints后,提供带有一些简单图像预处理的图像,构建模型和生成器并且获得结果

Environment

!git clone --single-branch --branch feature/add_transformers https://github.com/OFA-Sys/OFA.git
!pip install OFA/transformers/
!git lfs install
# !git clone https://huggingface.co/OFA-Sys/OFA-tiny 
!git clone https://huggingface.co/OFA-Sys/OFA-tiny

Library

from PIL import Image
from torchvision import transforms
from transformers import OFATokenizer, OFAModel
from transformers.models.ofa.generate import sequence_generator

cfg

mean, std = [0.5, 0.5, 0.5], [0.5, 0.5, 0.5]
resolution = 256
#图像预处理
patch_resize_transform = transforms.Compose([
    lambda image: image.convert("RGB"),
    #BICUBIC 插值是一种高质量的图像缩放算法
    transforms.Resize((resolution, resolution), interpolation=Image.BICUBIC),
    transforms.ToTensor(), 
    transforms.Normalize(mean=mean, std=std)
])

tokenizer

ckpt_dir='./OFA-huge'
tokenizer = OFATokenizer.from_pretrained(ckpt_dir)
# 定义输入的文本
txt = " what does the image describe?"
# 使用 tokenizer 对输入文本进行编码,返回 PyTorch tensor 格式的输入 ID
inputs = tokenizer([txt], return_tensors="pt").input_ids
# 使用 !wget 命令从指定 URL 下载图像,保存为 test.jpg
!wget http://farm4.staticflickr.com/3539/3836680545_2ccb331621_z.jpg 
!mv 3836680545_2ccb331621_z.jpg  test.jpg
img = Image.open('./shigong-neg.png')
# 使用 patch_resize_transform 对图像进行裁剪和缩放,然后转换为 PyTorch tensor 格式,并在第 0 维增加一个维度,用于模型输入
patch_img = patch_resize_transform(img).unsqueeze(0)

加载预训练模型

#use_cache=False表示不使用缓存
model = OFAModel.from_pretrained(ckpt_dir, use_cache=False)

Choice of Generators

# 使用sequence_generator.SequenceGenerator类来生成文本序列
generator = sequence_generator.SequenceGenerator(
    tokenizer=tokenizer,  # 分词器
    beam_size=5,  # beam search算法中的beam size,控制生成的文本数量
    max_len_b=16,  # beam search算法中的最大生成长度,控制生成的文本长度
    min_len=0,  # beam search算法中的最小生成长度,控制生成的文本长度
    no_repeat_ngram_size=3,  # 控制生成的文本中重复n-gram(连续n个词)的数量,避免生成过于重复的文本
)
import torch
data = {}
data["net_input"] = {
    "input_ids": inputs,  # 表示模型的文本输入序列,
    "patch_images": patch_img,  # 表示模型的图像输入
    "patch_masks": torch.tensor([True])  # 表示模型的图像掩码,其值为一个张量,其中只包含一个布尔值 `True`
}
# 使用 `generator` 对象的 `generate` 方法生成文本序列
gen_output = generator.generate([model], data)
# 提取生成的文本序列
gen = [gen_output[i][0]["tokens"] for i in range(len(gen_output))]
display(img)
# 打印生成的文本序列
print(tokenizer.batch_decode(gen, skip_special_tokens=True)[0].strip())

a truck travels on a road in wuhan, hubei province
a truck travels on a road in wuhan, hubei province

gen = model.generate(inputs, patch_images=patch_img, num_beams=5, no_repeat_ngram_size=3)
display(img)
print(tokenizer.batch_decode(gen, skip_special_tokens=True)[0].strip())

在这里插入图片描述
a herd of highland cattle graze in a field in scotland.

参考资料

ICML 2022|达摩院多模态模型OFA,实现模态、任务和架构三个统一

OFA github

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

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

相关文章

何谓SRIO——RapidIO之旅从这里开始

何谓SRIO——RapidIO之旅从这里开始 SRIO(Serial RapidIO)协议是一种用于高速串行通信的协议,旨在连接数字信号处理器(DSP)、网络处理器、FPGA等芯片,以及它们之间的互连。SRIO协议具有低延迟、高带宽&…

【单链表】

单链表 1. 函数的声明部分2. 函数的实现部分(1)打印链表(2)头插(3)尾插(3)头删(4)尾删(5)单链表的查找(6)删除…

leetcode 879. Profitable Schemes(有利润的计划)

有几个工程,每个工程需要group[ i ]个人去做,做完了可以得到profit[ i ]的利润。 现有2个限制条件: 人数上限是n, 且参加了一个工程的人不能再参加其他工程。 利润下限minProfit, 至少要获得minProfit的利润。 问有多少种工程的选法&#xff…

Zuul源码解析(一)

说在前面 我们公司有一个线上服务报错通知群,经常报网关服务的一个 EOFException 异常。这个异常报出来好久了,如下图所示,艾特相关的人也不去处理,大概是不重要异常吧,反正看样子是不影响线上核心业务流程。 然后我上…

FreeRTOS学习笔记(一)——初识FreeRTOS

FreeRTOS官网:FreeRTOS - 适用于具有物联网扩展功能的嵌入式系统的市场领先 RTOS(实时操作系统) FreeRTOS源码下载:FreeRTOS Real Time Kernel (RTOS) - Browse /FreeRTOS at SourceForge.net 目录 0x01 FreeRTOS编程风格 一…

用CentOS服务器自己搭建部署个Discuz论坛网站,网站搭建教程

Linux系统CentOS服务器使用堡塔搭建论坛网站全套教程。服务器大本营,技术文章内容集合站发车啦! 操作系统:Centos 7.6 网站程序:Discuz-X3.4 前言 首先,搭建一个网站需要准备:服务器、域名、网站程序。 …

PWM控制直流电机

一,TB6612电机驱动模块 直流电机属于大功率器件,GPIO无法直接驱动,需要电机驱动模块配合,才能驱动直流电机. TB6612可以驱动2个直流电机。由IN1,IN2控制电机旋转方向,由PWM控制电机旋转速度。 二&#xf…

基于Oracle VM VirtualBox的ubuntu的安装

基于Oracle VM VirtualBox的ubuntu的安装 感谢詹老师的帮助使我得以完成本次安装,以下为本次安装的一个小小的记录。 目录 基于Oracle VM VirtualBox的ubuntu的安装Oracle VM VirtualBox的下载与安装ubuntu的下载Oracle VM VirtualBox下安装ubuntu安装 ROS Melodi…

GitHub 开源神器 Bark模型,让文本转语音更简单

今天跟大家分享一个文本转语音的开源模型:Bark Bark 是由Suno创建的基于转换器的文本到音频模型。Bark 可以生成高度逼真的多语言语音以及其他音频 - 包括音乐、背景噪音和简单的音效。该模型还可以产生非语言交流,如大笑、叹息和哭泣。 该项目刚开源不…

二叉树OJ题(C++实现)

文章目录 1.二叉树创建字符串2. 二叉树的最近公共祖先3.二叉搜索树与双向链表4.从前序与中序遍历序列构造二叉树 1.二叉树创建字符串 二叉树的层序遍历 OJ连接 主要思路是借助一个队列,将每一层的数据以size统计,当size为0时说明该层数据已经输入完&…

Unity Physics2D 2d物理引擎游戏 笔记

2d 材质 里面可以设置 摩擦力 和 弹力 Simulated:是否在当前的物理环境中模拟,取消勾选该框类似于Disable Rigidbody,但使用这个参数更加高效,因为Disable会销毁内部产生的GameObject,而取消勾选Simulated只是禁用。…

详解C语言string.h中常用的14个库函数(四)

本篇博客会讲解最后4个函数,分别是memset, memcpy, memmove, memcmp。这4个函数开头都是mem,即memory(内存)的缩写。 memset void * memset ( void * ptr, int value, size_t num );memset可以用来设置内存中的值。该函数可以把从…

深度学习实战——循环神经网络(RNN、LSTM、GRU)

忆如完整项目/代码详见github:https://github.com/yiru1225(转载标明出处 勿白嫖 star for projects thanks) 目录 系列文章目录 一、实验综述 1.实验工具及内容 2.实验数据 3.实验目标 4.实验步骤 二、循环神经网络综述 1.循环神经…

【数据结构】第五章 树与二叉树

文章目录 知识体系5.1 树的基本概念5.1.1 树的定义5.1.2 基本术语5.1.3 树的性质 5.2 二叉树的概念5.2.1 二叉树的定义和主要特性5.2.2 二叉树的存储结构 5.3 二叉树的遍历和线索二叉树5.3.1 二叉树的遍历5.3.2 线索二叉树 5.4 树、森林5.4.1 树的存储结构5.4.2 树、森林与二叉…

uniapp踩坑之项目:各端条件编译

在 HBuilderX 中,ctrlalt/ 即可生成正确注释(js:// 注释、css:/* 注释 */、vue/nvue模板: )。 #ifdef:if defined 仅在某平台存在#ifndef:if not defined 除了某平台均存在%PLATFORM…

ARM busybox 的移植实战2

一、busybox 源码分析1 1、源码目录梳理 2、整个程序入口的确认 (1) 分析一个程序,不管多庞大还是小,最好的路线都是 按照程序运行时的逻辑顺序来。所以找到一个程序的入口至关重要。 (2) 学 C 语言的时候都知道,程序的主函数 main 函数就是…

机器学习算法 随机森林

文章目录 一、概述1.1 集成学习1.2 决策树1.3 随机森林 二、Sklearn中的随机森林2.1 分类树API2.2 参数 2.2 回归树API2.2.1 重要参数 2.3 随机森林调参 三、总结 一、概述 1.1 集成学习 多个模型集成成为的模型叫做集成评估器(ensemble estimator)&am…

车载软件架构——闲聊几句AUTOSAR BSW(二)

我是穿拖鞋的汉子,魔都中坚持长期主义的工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 我特别喜欢一个老话,来都来了。我觉得这就是松弛感,既然来了,就开心起来吧!松弛感来自于专注,焦虑不是靠克服的,是靠忘记的,当你很专注做一件事的时候…

HNCTF-re部分复现

目录 [HNCTF 2022 WEEK3]Help_Me! [HNCTF 2022 WEEK3]Whats 1n DLL? [HNCTF 2022 WEEK4]ez_maze 这几天在做HNCTF的week3,week4部分,学到了一些不知道的没接触过的东西,所以记录一下 [HNCTF 2022 WEEK3]Help_Me! 题目下载:下…

onnx笔记2:onnx操作实例

1. 介绍 本文以yolov5s模型,演示对yolov5s.onnx模型文件的读取,修改等操作 2. onnx操作 2.1 获取数据 (1) 案例1 :读取weights数据 比如获取yolov5s.onnx第一个Conv的weights数据。 点击左侧第一个Conv, 右侧INPUTS下面的W点开+号,可以看到该Conv的weight的name为m…