2024/10/21
: Lançamos a série Mini-InternVL. Estes modelos alcançam um desempenho impressionante com tamanho mínimo: o modelo 4B atinge 90% do desempenho com apenas 5% do tamanho do modelo. Para mais detalhes, consulte nossa página e documento do projeto.
2024/08/01
: A equipe Chartmimic avaliou os modelos da série InternVL2 em seu benchmark. Os modelos InternVL2-26B e 76B alcançaram os dois melhores desempenhos entre os modelos de código aberto, com o modelo InternVL2 76B superando o GeminiProVision e exibindo resultados comparáveis ao Claude-3-opus.
2024/08/01
: InternVL2-Pro alcançou o desempenho SOTA entre os modelos de código aberto no conjunto de dados CharXiv, superando muitos modelos de código fechado, como GPT-4V, Gemini 1.5 Flash e Claude 3 Sonnet.
2024/07/24
: A equipe da MLVU avaliou o InternVL-1.5 em seu benchmark. O desempenho médio na tarefa de múltipla escolha foi de 50,4%, enquanto o desempenho nas tarefas gerativas foi de 4,02. O desempenho na tarefa de múltipla escolha ficou em primeiro lugar entre todos os MLLMs de código aberto.
2024/07/18
: ?? O InternVL2-40B alcançou desempenho SOTA entre modelos de código aberto no conjunto de dados Video-MME, pontuando 61,2 ao inserir 16 quadros e 64,4 ao inserir 32 quadros. Ele supera significativamente outros modelos de código aberto e é o modelo de código aberto mais próximo do GPT-4o mini.
2024/07/18
: ? O InternVL2-Pro alcançou o desempenho SOTA nos benchmarks DocVQA e InfoVQA.
2024/07/04
: ? Lançamos a série InternVL2. O InternVL2-Pro alcançou uma precisão de 62,0% no benchmark MMMU, igualando o desempenho dos principais modelos comerciais de código fechado, como o GPT-4o. A API gratuita deste modelo pode ser aplicada preenchendo (formulário de inscrição) / (申请表). Outros modelos estão disponíveis no link HF.
2024/06/19
: Propomos Needle In A Multimodal Haystack (MM-NIAH), o primeiro benchmark projetado para avaliar sistematicamente a capacidade dos MLLMs existentes de compreender longos documentos multimodais.
2024/05/30
: Lançamos o ShareGPT-4o, um conjunto de dados em grande escala que planejamos abrir o código-fonte com 200 mil imagens, 10 mil vídeos e 10 mil áudios com descrições detalhadas.
2024/05/28
: Obrigado à equipe lmdeploy por fornecer suporte à quantização AWQ. O modelo de 4 bits está disponível em OpenGVLab/InternVL-Chat-V1-5-AWQ.
2024/05/13
: InternVL 1.0 agora pode ser usado como codificador de texto para modelos de difusão para suportar geração multilíngue nativamente em mais de 110 idiomas em todo o mundo. Veja MuLan para mais detalhes.
2024/04/18
: InternVL-Chat-V1-5 foi lançado no link HF, aproximando-se do desempenho do GPT-4V e Gemini Pro em vários benchmarks como MMMU, DocVQA, ChartQA, MathVista, etc.
2024/02/27
: InternVL é aceito pelo CVPR 2024 (Oral)! ?
2024/02/21
: InternVL-Chat-V1-2-Plus alcançou desempenho SOTA em MathVista (59,9), MMBench (83,8) e MMVP (58,7). Veja nosso blog para mais detalhes.
2024/02/12
: InternVL-Chat-V1-2 foi lançado. Atinge 51,6 no valor MMMU e 82,3 no teste MMBench. Para obter mais detalhes, consulte nosso blog e dados SFT. O modelo agora está disponível no HuggingFace, e os dados e scripts de treinamento/avaliação são de código aberto.
2024/01/24
: InternVL-Chat-V1-1 é lançado, suporta chinês e tem capacidade de OCR mais forte, veja aqui.
2024/01/16
: Lançamos nosso código mmcv/mmsegmentation/mmdetection customizado, integrado ao DeepSpeed, que pode ser usado para treinar modelos de detecção e segmentação em larga escala.
Suporte vLLM e Ollama
Reconstrua documentos usando readthedocs
Apoie o ajuste fino de diferentes LLMs com LoRA
Suporta entrada de vídeo e PDF em demonstração online
Lançar InternVL2 com integração VisionLLMv2
Liberar requirements.txt
para InternVL2
Liberar código de treinamento/avaliação para a série InternVL2
Lançar UI da web Streamlit para InternVL1.5 e InternVL2
Comece
Instalação: [Ambiente] [requirements.txt]
Preparação de dados de avaliação: [Avaliação InternVL]
Formato de dados de bate-papo: [Meta arquivo] [Texto puro] [Imagem única] [Imagem múltipla] [Vídeo]
API InternVL-Chat: [InternVL2-Pro]
Demonstração de bate-papo local: [Demonstração Streamlit] [Demonstração de Gradio] [Demonstração LMDeploy]
Tutoriais: [Aprimorando InternVL2 na legenda COCO usando LoRA Fine-Tuning]
Família EstagiáriaVL
InternVL 2.0: [Introdução] [Início rápido] [Finetune] [Avaliação] [Implantação]
InternVL 1.5: [Introdução] [Início rápido] [Finetune] [Avaliação] [Implantação]
InternVL 1.2: [Introdução] [Início rápido] [Finetune] [Avaliação]
InternVL 1.1: [Introdução] [Início rápido] [Avaliação]
InternVL 1.0: [Classificação] [CLIP-Benchmark] [Segmentação] [InternVL-Chat-LLaVA] [InternVL-G]
Nome do modelo | Parte da visão | Parte do idioma | Ligação HF | Link MS | Documento |
---|---|---|---|---|---|
EstagiárioVL2‑1B | InternViT‑300M‑448px | Qwen2‑0.5B‑Instrução | ? link | ? link | ? documento |
EstagiárioVL2‑2B | InternViT‑300M‑448px | internolm2‑chat‑1‑8b | ? link | ? link | ? documento |
EstagiárioVL2‑4B | InternViT‑300M‑448px | Phi‑3‑mini‑128k‑instrução | ? link | ? link | ? documento |
EstagiárioVL2‑8B | InternViT‑300M‑448px | internlm2_5‑7b‑chat | ? link | ? link | ? documento |
EstagiárioVL2‑26B | InternViT‑6B‑448px‑V1‑5 | internolm2‑chat‑20b | ? link | ? link | ? documento |
EstagiárioVL2‑40B | InternViT‑6B‑448px‑V1‑5 | Nous-Hermes-2-Yi-34B | ? link | ? link | ? documento |
EstagiárioVL2-Llama3-76B | InternViT‑6B‑448px‑V1‑5 | Hermes‑2‑Teta‑ Lhama‑3‑70B | ? link | ? link | ? documento |
Convidamos todos a usar nossa API para pesquisa. Para um melhor gerenciamento, envie (formulário de inscrição) / (申请表) para obter acesso gratuito à API.
Modelo | Data | Ligação HF | Link MS | Observação |
---|---|---|---|---|
Mini‑EstagiárioVL‑Chat‑4B‑V1‑5 | 2024.05.28 | ? link | ? link | ?? 16% do tamanho do modelo, 90% do desempenho |
Mini‑EstagiárioVL‑Chat‑2B‑V1‑5 | 2024.05.19 | ? link | ? link | ? 8% do tamanho do modelo, 80% do desempenho |
EstagiárioVL‑Chat‑V1‑5 | 2024.04.18 | ? link | ? link | suporta imagem 4K; OCR super forte; Abordando o desempenho do GPT-4V e Gemini Pro em vários benchmarks como MMMU, DocVQA, ChartQA, MathVista, etc. |
EstagiárioVL‑Chat‑V1‑2‑Plus | 2024.02.21 | ? link | ? link | mais dados SFT e mais fortes |
EstagiárioVL‑Chat‑V1‑2 | 2024.02.11 | ? link | ? link | ampliando LLM para 34B |
EstagiárioVL‑Chat‑V1‑1 | 2024.01.24 | ? link | ? link | suporte chinês e OCR mais forte |
EstagiárioVL‑Chat‑19B | 2023.12.25 | ? link | ? link | Diálogo multimodal inglês |
EstagiárioVL‑Chat‑13B | 2023.12.25 | ? link | ? link | Diálogo multimodal inglês |
Modelo | Data | Ligação HF | Link MS | Observação |
---|---|---|---|---|
InternViT‑300M‑448px | 2024.05.25 | ? link | ? link | modelo destilado de base de visão pequena com parâmetros de 300M (?novo) |
InternViT‑6B‑448px‑V1‑5 | 2024.04.20 | ? link | ? link | suporta resolução dinâmica e capacidade de extração de recursos de OCR super forte por pré-treinamento incremental (?novo) |
InternViT‑6B‑448px‑V1‑2 | 2024.02.11 | ? link | ? link | suporta resolução 448 por pré-treinamento incremental |
InternViT‑6B‑448px‑V1‑0 | 2024.01.30 | ? link | ? link | suporta resolução 448 por pré-treinamento incremental |
InternViT‑6B‑224px | 2023.12.22 | ? link | ? link | a primeira versão do InternViT-6B, extraída de InternVL‑14B‑224px |
Modelo | Data | Ligação HF | Link MS | Observação |
---|---|---|---|---|
EstagiárioVL‑14B‑224px | 2023.12.22 | ? link | ? link | modelo básico de linguagem de visão, InternViT-6B + QLLaMA, pode ser usado para recuperação de imagem-texto como CLIP |
Classificação de imagens de sonda linear [ver detalhes]
ViT-22B usa o conjunto de dados privado JFT-3B.
método | #param | IN-1K | IN-Real | IN-V2 | IN-A | IN-R | IN-Sketch |
---|---|---|---|---|---|---|---|
OpenCLIP-G | 1,8B | 86,2 | 89,4 | 77,2 | 63,8 | 87,8 | 66,4 |
DINov2-g | 1.1B | 86,5 | 89,6 | 78,4 | 75,9 | 78,8 | 62,5 |
EVA-01-CLIP-g | 1.1B | 86,5 | 89,3 | 77,4 | 70,5 | 87,7 | 63,1 |
MAWS-ViT-6.5B | 6,5B | 87,8 | - | - | - | - | - |
ViT-22B* | 21,7B | 89,5 | 90,9 | 83,2 | 83,8 | 87,4 | - |
InternViT-6B (nosso) | 5.9B | 88,2 | 90,4 | 79,9 | 77,5 | 89,8 | 69,1 |
Segmentação Semântica [ver detalhes]
método | decodificador | #param (trem/total) | tamanho da colheita | miU |
---|---|---|---|---|
OpenCLIP-G (congelado) | Linear | 0,3M / 1,8B | 512 | 39,3 |
ViT-22B (congelado) | Linear | 0,9M / 21,7B | 504 | 34,6 |
InternViT-6B (congelado) | Linear | 0,5M / 5,9B | 504 | 47,2 (+12,6) |
ViT-22B (congelado) | SuperNet | 0,8B / 22,5B | 504 | 52,7 |
InternViT-6B (congelado) | SuperNet | 0,4B / 6,3B | 504 | 54,9 (+2,2) |
ViT-22B | SuperNet | 22,5B / 22,5B | 504 | 55,3 |
EstagiárioViT-6B | SuperNet | 6,3B / 6,3B | 504 | 58,9 (+3,6) |
Classificação de imagem Zero-Shot [ver detalhes]
método | IN-1K | IN-A | IN-R | IN-V2 | IN-Sketch | ObjectNet |
---|---|---|---|---|---|---|
OpenCLIP-G | 80,1 | 69,3 | 92,1 | 73,6 | 68,9 | 73,0 |
EVA-02-CLIP-E+ | 82,0 | 82,1 | 94,5 | 75,7 | 71,6 | 79,6 |
ViT-22B* | 85,9 | 90,1 | 96,0 | 80,9 | - | 87,6 |
EstagiárioVL-C (nosso) | 83,2 | 83,8 | 95,5 | 77,3 | 73,9 | 80,6 |
Classificação multilíngue de imagens Zero-Shot [ver detalhes]
EN: Inglês, ZH: Chinês, JP: Japonês, Ar: Árabe, IT: Italiano
método | IN-1K (PT) | IN-1K (ZH) | IN-1K (JP) | IN-1K (AR) | IN-1K (TI) |
---|---|---|---|---|---|
Taiyi-CLIP-ViT-H | - | 54,4 | - | - | - |
WuKong-ViT-LG | - | 57,5 | - | - | - |
CN-CLIP-ViT-H | - | 59,6 | - | - | - |
AltCLIP-ViT-L | 74,5 | 59,6 | - | - | - |
EVA-02-CLIP-E+ | 82,0 | - | - | - | 41,2 |
OpenCLIP-XLM-RH | 77,0 | 55,7 | 53.1 | 37,0 | 56,8 |
EstagiárioVL-C (nosso) | 83,2 | 64,5 | 61,5 | 44,9 | 65,7 |
Classificação de vídeo Zero-Shot
método | #quadro | K400 | K600 | K700 |
---|---|---|---|---|
OpenCLIP-G | 1 | 65,9 | 66,1 | 59,2 |
EVA-02-CLIP-E+ | 1 | 69,8 | 69,3 | 63,4 |
EstagiárioVL-C (nosso) | 1 | 71,0 | 71,3 | 65,7 |
ViCLIP | 8 | 75,7 | 73,5 | 66,4 |
EstagiárioVL-C (nosso) | 8 | 79,4 | 78,8 | 71,5 |
Recuperação de imagem e texto em inglês Zero-Shot [ver detalhes]
modelo | Flickr30K | COCO | média | ||||||||||
imagem para texto | texto para imagem | imagem para texto | texto para imagem | ||||||||||
R@1 | R@5 | R@10 | R@1 | R@5 | R@10 | R@1 | R@5 | R@10 | R@1 | R@5 | R@10 | ||
OpenCLIP-G | 92,9 | 99,3 | 99,8 | 79,5 | 95,0 | 97,1 | 67,3 | 86,9 | 92,6 | 51,4 | 74,9 | 83,0 | 85,0 |
EVA-02-CLIP-E+ | 93,9 | 99,4 | 99,8 | 78,8 | 94,2 | 96,8 | 68,8 | 87,8 | 92,8 | 51.1 | 75,0 | 82,7 | 85,1 |
EVA-CLIP-8B | 95,6 | 99,6 | 99,9 | 80,8 | 95,5 | 97,6 | 70,3 | 89,3 | 93,9 | 53,0 | 76,0 | 83,4 | 86,2 |
EstagiárioVL-C (nosso) | 94,7 | 99,6 | 99,9 | 81,7 | 96,0 | 98,2 | 70,6 | 89,0 | 93,5 | 54.1 | 77,3 | 84,6 | 86,6 |
EstagiárioVL-G (nosso) | 95,7 | 99,7 | 99,9 | 85,0 | 97,0 | 98,6 | 74,9 | 91,3 | 95,2 | 58,6 | 81,3 | 88,0 | 88,8 |
Recuperação de imagem e texto chinês Zero-Shot [ver detalhes]
modelo | Flickr30K-CN | COCO-CN | média | ||||||||||
imagem para texto | texto para imagem | imagem para texto | texto para imagem | ||||||||||
R@1 | R@5 | R@10 | R@1 | R@5 | R@10 | R@1 | R@5 | R@10 | R@1 | R@5 | R@10 | ||
CN-CLIP-ViT-H | 81,6 | 97,5 | 98,8 | 71,2 | 91,4 | 95,5 | 63,0 | 86,6 | 92,9 | 69,2 | 89,9 | 96,1 | 86,1 |
OpenCLIP-XLM-RH | 86,1 | 97,5 | 99,2 | 71,0 | 90,5 | 94,9 | 70,0 | 91,5 | 97,0 | 66,1 | 90,8 | 96,0 | 87,6 |
EstagiárioVL-C (nosso) | 90,3 | 98,8 | 99,7 | 75,1 | 92,9 | 96,4 | 68,8 | 92,0 | 96,7 | 68,9 | 91,9 | 96,5 | 89,0 |
EstagiárioVL-G (nosso) | 92,9 | 99,4 | 99,8 | 77,7 | 94,8 | 97,3 | 71,4 | 93,9 | 97,7 | 73,8 | 94,4 | 98,1 | 90,9 |
Recuperação de imagem e texto multilíngue Zero-Shot no XTD [ver detalhes]
método | PT | ES | França | ZH | ISTO | Nocaute | Ru | JP | média |
---|---|---|---|---|---|---|---|---|---|
AltCLIP | 95,4 | 94,1 | 92,9 | 95,1 | 94,2 | 94,4 | 91,8 | 91,7 | 93,7 |
OpenCLIP-XLM-RH | 97,3 | 96,1 | 94,5 | 94,7 | 96,0 | 90,2 | 93,9 | 94,0 | 94,6 |
EstagiárioVL-C (nosso) | 97,3 | 95,7 | 95,1 | 95,6 | 96,0 | 92,2 | 93,3 | 95,5 | 95,1 |
EstagiárioVL-G (nosso) | 98,6 | 97,7 | 96,5 | 96,7 | 96,9 | 95,1 | 94,8 | 96,1 | 96,6 |
Consulte a seção "Comparado com SOTA VLLMs".
importar tocha de PIL importar imagem de transformadores importar AutoModel, CLIPImageProcessormodel = AutoModel.from_pretrained('OpenGVLab/InternViT-6B-448px-V1-5',torch_dtype=torch.bfloat16,low_cpu_mem_usage=True,trust_remote_code=True).cuda().eval( )image = Image.open('./examples/image1.jpg').convert('RGB')image_processor = CLIPImageProcessor.from_pretrained('OpenGVLab/InternViT-6B-448px-V1-5')pixel_values = image_processor(images= imagem, return_tensors='pt').pixel_valuespixel_values = pixel_values.to(torch.bfloat16).cuda()outputs = model(pixel_values)
importar tocha de PIL importar imagem de transformadores importar AutoModel, CLIPImageProcessor de transformadores importar AutoTokenizermodel = AutoModel.from_pretrained('OpenGVLab/InternVL-14B-224px',torch_dtype=torch.bfloat16,low_cpu_mem_usage=True,trust_remote_code=True).cuda().eval() image_processor = CLIPImageProcessor.from_pretrained('OpenGVLab/InternVL-14B-224px')tokenizer = AutoTokenizer.from_pretrained('OpenGVLab/InternVL-14B-224px', use_fast=False, add_eos_token=True)tokenizer.pad_token_id = 0 # definir pad_token_id como 0image é = [Image.open('./examples/image1.jpg').convert('RGB'),Image.open('./examples/image2.jpg').convert('RGB'),Image.open( './examples/image3.jpg').convert('RGB') ]prefix = 'resumir:'textos = [prefixo + 'uma foto de um panda vermelho', # Englishprefix + '一张熊猫的照片', # Chineseprefix + '二匹の猫の写真' # Japonês]pixel_values = image_processor( imagens=imagens, return_tensors='pt').pixel_valuespixel_values = pixel_values.to(torch.bfloat16).cuda()input_ids = tokenizer(textos, return_tensors='pt', max_length=80, truncation=True, padding='max_length' ).input_ids.cuda()# InternVL-Clogits_per_image, logits_per_text = model(image=pixel_values, text=input_ids, mode='InternVL-C')probs = logits_per_image.softmax(dim=-1)# tensor([[9.9609e -01, 5.2185e-03, 6.0070e-08],# [2.2949e-02, 9.7656e-01, 5.9903e-06],# [3.2932e-06, 7.4863e-05, 1.0000e+00]] , device='cuda:0',# dtype=torch.bfloat16, grad_fn=)# InternVL-Glogits_per_image, logits_per_text = model(image=pixel_values, text=input_ids, mode='InternVL-G')probs = logits_per_image .softmax(dim=-1)# tensor([[9.9609e-01, 3.1738e-03, 3.6322e-08],# [8.6060e-03, 9.9219e-01, 2.8759e-06],# [1.7583 e-06, 3.1233e-05, 1.0000e+00]], device='cuda:0',# dtype=torch.bfloat16, grad_fn= )# defina add_eos_token como False para Generationtokenizer.add_eos_token = Falseimage = Image.open('./examples/image1.jpg').convert('RGB')pixel_values = image_processor(images=image, return_tensors='pt').pixel_valuespixel_values = pixel_values.to(torch.bfloat16).cuda() tokenized = tokenizer("Legenda em inglês:", return_tensors='pt')pred = model.generate(pixel_values=pixel_values,input_ids=tokenized.input_ids.cuda(),attention_mask=tokenized.attention_mask.cuda(),num_beams=5, min_new_tokens=8, )caption = tokenizer.decode(pred[0].cpu(), skip_special_tokens=True).strip()# Legenda em inglês: um panda vermelho sentado em cima de uma plataforma de madeira
Aqui, tomamos o OpenGVLab/InternVL2-8B
menor como exemplo:
import numpy as npimport torchimport torchvision.transforms as Tfrom decord import VideoReader, cpufrom PIL import Imagefrom torchvision.transforms.functional import InterpolationModefrom transformers import AutoModel, AutoTokenizerIMAGENET_MEAN = (0.485, 0.456, 0.406)IMAGENET_STD = (0.229, 0.224, 0.225)def build_transform( input_size):MEAN, STD = IMAGENET_MEAN, IMAGENET_STDtransform = T.Compose([T.Lambda(lambda img: img.convert('RGB') if img.mode != 'RGB' else img),T.Resize((input_size , tamanho_entrada), interpolação=InterpolationMode.BICUBIC),T.ToTensor(),T.Normalize(média=MÉDIA, std=STD) ])retornar transformdef find_closest_aspect_ratio(aspect_ratio, target_ratios, largura, altura, image_size):best_ratio_diff = float('inf')best_ratio = (1, 1)area = largura * alturapara proporção em target_ratios:target_aspect_ratio = proporção[0] / proporção[ ( imagem, min_num=1, max_num=12, image_size=448, use_thumbnail=False):orig_width, orig_height = image.sizeaspect_ratio = orig_width / orig_height# calcula a proporção de aspecto da imagem existentetarget_ratios = set( (i, j) para n no intervalo (min_num, max_num + 1) para i no intervalo (1, n + 1) para j no intervalo (1, n + 1) ifi * j <= max_num e i * j >= min_num)target_ratios = sorted(target_ratios, key=lambda x: x[0] * x[1])# encontre a proporção de aspecto mais próxima do targettarget_aspect_ratio = find_closest_aspect_ratio(aspect_ratio, target_ratios, orig_width, orig_height, image_size)# calcule a largura do alvo e heighttarget_width = image_size * target_aspect_ratio[0]target_height = image_size * target_aspect_ratio[1]blocks = target_aspect_ratio[0] * target_aspect_ratio[1]# redimensionar a imagemresized_img = image.resize((target_width, target_height))processed_images = []for i in intervalo(blocos):caixa = ( (i% (largura_alvo // tamanho_da_imagem)) * tamanho_da_imagem, (i // (largura_alvo // tamanho_da_imagem)) * tamanho_da_imagem, ((i% (largura_alvo // tamanho_da_imagem)) + 1) * tamanho_da_imagem, ((i // (target_width // image_size)) + 1) * image_size)# divida as imagensplit_img = resized_img.crop(box)processed_images.append(split_img)assert