2024/10/21
: Lanzamos la serie Mini-InternVL. Estos modelos consiguen un rendimiento impresionante con un tamaño mínimo: el modelo 4B consigue el 90% del rendimiento con sólo el 5% del tamaño del modelo. Para obtener más detalles, consulte nuestra página y documento del proyecto.
2024/08/01
: El equipo de Chartmimic evaluó los modelos de la serie InternVL2 en su punto de referencia. Los modelos InternVL2-26B y 76B lograron los dos mejores rendimientos entre los modelos de código abierto, y el modelo InternVL2 76B superó a GeminiProVision y mostró resultados comparables a los de Claude-3-opus.
2024/08/01
: InternVL2-Pro logró el rendimiento SOTA entre los modelos de código abierto en el conjunto de datos CharXiv, superando a muchos modelos de código cerrado como GPT-4V, Gemini 1.5 Flash y Claude 3 Sonnet.
2024/07/24
: El equipo de MLVU evaluó InternVL-1.5 en su punto de referencia. El rendimiento medio en la tarea de opción múltiple fue del 50,4%, mientras que el rendimiento en las tareas generativas fue del 4,02%. El desempeño en la tarea de opción múltiple ocupó el puesto número 1 entre todos los MLLM de código abierto.
2024/07/18
: ?? InternVL2-40B logró un rendimiento SOTA entre los modelos de código abierto en el conjunto de datos Video-MME, con una puntuación de 61,2 al ingresar 16 cuadros y 64,4 al ingresar 32 cuadros. Supera significativamente a otros modelos de código abierto y es el modelo de código abierto más cercano al GPT-4o mini.
2024/07/18
: ? InternVL2-Pro logró el rendimiento SOTA en los puntos de referencia DocVQA e InfoVQA.
2024/07/04
: ? Lanzamos la serie InternVL2. InternVL2-Pro logró una precisión del 62,0 % en el punto de referencia MMMU, igualando el rendimiento de los principales modelos comerciales de código cerrado como GPT-4o. La API gratuita de este modelo se puede aplicar completando (formulario de solicitud) / (申请表). Otros modelos están disponibles en enlace HF.
2024/06/19
: Proponemos Needle In A Multimodal Haystack (MM-NIAH), el primer punto de referencia diseñado para evaluar sistemáticamente la capacidad de los MLLM existentes para comprender documentos multimodales largos.
2024/05/30
: Lanzamos ShareGPT-4o, un conjunto de datos a gran escala que planeamos abrir con imágenes de 200K, videos de 10K y audios de 10K con descripciones detalladas.
2024/05/28
: Gracias al equipo de lmdeploy por brindar soporte de cuantificación de AWQ. El modelo de 4 bits está disponible en OpenGVLab/InternVL-Chat-V1-5-AWQ.
2024/05/13
: InternVL 1.0 ahora se puede utilizar como codificador de texto para modelos de difusión para admitir la generación multilingüe de forma nativa en más de 110 idiomas en todo el mundo. Consulte MuLan para obtener más detalles.
2024/04/18
: InternVL-Chat-V1-5 se lanzó en el enlace HF, acercándose al rendimiento de GPT-4V y Gemini Pro en varios puntos de referencia como MMMU, DocVQA, ChartQA, MathVista, etc.
2024/02/27
: ¡InternVL es aceptado por CVPR 2024 (Oral)! ?
2024/02/21
: InternVL-Chat-V1-2-Plus logró un rendimiento SOTA en MathVista (59,9), MMBench (83,8) y MMVP (58,7). Vea nuestro blog para más detalles.
2024/02/12
: InternVL-Chat-V1-2 ha sido lanzado. Alcanza 51,6 en MMMU val y 82,3 en la prueba MMBench. Para obtener más detalles, consulte nuestro blog y los datos de SFT. El modelo ahora está disponible en HuggingFace, y tanto los datos como los scripts de capacitación/evaluación son de código abierto.
2024/01/24
: Se lanza InternVL-Chat-V1-1, es compatible con chino y tiene una capacidad de OCR más sólida, consulte aquí.
2024/01/16
: Lanzamos nuestro código mmcv/mmsegmentation/mmdetection personalizado, integrado con DeepSpeed, que se puede utilizar para entrenar modelos de detección y segmentación a gran escala.
Soporte vLLM y Ollama
Reconstruir documentos usando readthedocs
Admite el ajuste de diferentes LLM con LoRA
Admite entrada de vídeo y PDF en demostración en línea
Lanzamiento de InternVL2 con integración de VisionLLMv2
requirements.txt
de versión.txt para InternVL2
Lanzamiento del código de capacitación/evaluación para la serie InternVL2
Lanzamiento de la interfaz de usuario web Streamlit para InternVL1.5 e InternVL2
Empezar
Instalación: [Entorno] [requisitos.txt]
Preparación de datos de evaluación: [Evaluación InternVL]
Formato de datos de chat: [Metaarchivo] [Texto puro] [Imagen única] [Imagen múltiple] [Video]
API de chat InternVL: [InternVL2-Pro]
Demostración de chat local: [Demostración Streamlit] [Demostración de Gradio] [Demostración de LMDeploy]
Tutoriales: [Mejora de InternVL2 en COCO Caption usando el ajuste fino de LoRA]
Familia InternVL
InternVL 2.0: [Introducción] [Inicio rápido] [Finetune] [Evaluación] [Implementación]
InternVL 1.5: [Introducción] [Inicio rápido] [Finetune] [Evaluación] [Implementación]
InternVL 1.2: [Introducción] [Inicio rápido] [Finetune] [Evaluación]
InternVL 1.1: [Introducción] [Inicio rápido] [Evaluación]
InternVL 1.0: [Clasificación] [CLIP-Benchmark] [Segmentación] [InternVL-Chat-LLaVA] [InternVL-G]
Nombre del modelo | Parte de visión | Parte del idioma | Enlace HF | Enlace MS | Documento |
---|---|---|---|---|---|
PasanteVL2‑1B | InternViT‑300M‑448px | Qwen2‑0.5B‑Instruir | ? enlace | ? enlace | ? doc |
PasanteVL2‑2B | InternViT‑300M‑448px | internolm2‑chat‑1‑8b | ? enlace | ? enlace | ? doc |
PasanteVL2‑4B | InternViT‑300M‑448px | Phi‑3‑mini‑128k‑instrucciones | ? enlace | ? enlace | ? doc |
PasanteVL2‑8B | InternViT‑300M‑448px | internolm2_5‑7b‑chat | ? enlace | ? enlace | ? doc |
PasanteVL2‑26B | InternViT‑6B‑448px‑V1‑5 | internolm2‑chat‑20b | ? enlace | ? enlace | ? doc |
PasanteVL2‑40B | InternViT‑6B‑448px‑V1‑5 | Nous‑Hermes‑2‑Yi‑34B | ? enlace | ? enlace | ? doc |
PasanteVL2-Llama3-76B | InternViT‑6B‑448px‑V1‑5 | Hermes‑2‑Theta‑ Llama‑3‑70B | ? enlace | ? enlace | ? doc |
Invitamos a todos a utilizar nuestra API para realizar investigaciones. Para una mejor gestión, envíe (formulario de solicitud) / (申请表) para obtener acceso gratuito a la API.
Modelo | Fecha | Enlace HF | Enlace MS | Nota |
---|---|---|---|---|
Mini‑PasanteVL‑Chat‑4B‑V1‑5 | 2024.05.28 | ? enlace | ? enlace | ?? 16% del tamaño del modelo, 90% del rendimiento |
Mini‑PasanteVL‑Chat‑2B‑V1‑5 | 2024.05.19 | ? enlace | ? enlace | ? 8% del tamaño del modelo, 80% del rendimiento |
PasanteVL‑Chat‑V1‑5 | 2024.04.18 | ? enlace | ? enlace | admite imagen 4K; OCR súper fuerte; Acercándose al rendimiento de GPT-4V y Gemini Pro en varios puntos de referencia como MMMU, DocVQA, ChartQA, MathVista, etc. |
InternoVL‑Chat‑V1‑2‑Plus | 2024.02.21 | ? enlace | ? enlace | más datos SFT y más fuertes |
PasanteVL‑Chat‑V1‑2 | 2024.02.11 | ? enlace | ? enlace | ampliando el LLM a 34B |
PasanteVL‑Chat‑V1‑1 | 2024.01.24 | ? enlace | ? enlace | soporte chino y OCR más fuerte |
PasanteVL‑Chat‑19B | 2023.12.25 | ? enlace | ? enlace | Diálogo multimodal en inglés. |
PasanteVL‑Chat‑13B | 2023.12.25 | ? enlace | ? enlace | Diálogo multimodal en inglés. |
Modelo | Fecha | Enlace HF | Enlace MS | Nota |
---|---|---|---|---|
InternViT‑300M‑448px | 2024.05.25 | ? enlace | ? enlace | modelo de base de visión pequeña destilada con parámetros de 300M (?nuevo) |
InternViT‑6B‑448px‑V1‑5 | 2024.04.20 | ? enlace | ? enlace | Admite resolución dinámica y capacidad de extracción de funciones de OCR súper sólida mediante entrenamiento previo incremental (? Nuevo) |
InternViT‑6B‑448px‑V1‑2 | 2024.02.11 | ? enlace | ? enlace | admite resolución 448 mediante entrenamiento previo incremental |
InternViT‑6B‑448px‑V1‑0 | 2024.01.30 | ? enlace | ? enlace | admite resolución 448 mediante entrenamiento previo incremental |
InternViT‑6B‑224px | 2023.12.22 | ? enlace | ? enlace | la primera versión de InternViT-6B, extraída de InternVL‑14B‑224px |
Modelo | Fecha | Enlace HF | Enlace MS | Nota |
---|---|---|---|---|
PasanteVL‑14B‑224px | 2023.12.22 | ? enlace | ? enlace | El modelo básico de visión y lenguaje, InternViT-6B + QLLaMA, se puede utilizar para la recuperación de imágenes y texto como CLIP. |
Clasificación de imágenes de sonda lineal [ver detalles]
ViT-22B utiliza el conjunto de datos privado JFT-3B.
método | #param | EN-1K | EN-Real | EN-V2 | EN-A | EN-R | EN-Sketch |
---|---|---|---|---|---|---|---|
OpenCLIP-G | 1,8 mil millones | 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,5 mil millones | 87,8 | - | - | - | - | - |
ViT-22B* | 21,7 mil millones | 89,5 | 90,9 | 83.2 | 83,8 | 87,4 | - |
InternViT-6B (nuestro) | 5.9B | 88.2 | 90,4 | 79,9 | 77,5 | 89,8 | 69.1 |
Segmentación Semántica [ver detalles]
método | descifrador | #param (tren/total) | tamaño de cultivo | miou |
---|---|---|---|---|
OpenCLIP-G (congelado) | Lineal | 0,3 millones/1,8 mil millones | 512 | 39.3 |
ViT-22B (congelado) | Lineal | 0,9 millones/21,7 mil millones | 504 | 34,6 |
InternViT-6B (congelado) | Lineal | 0,5 millones/5,9 mil millones | 504 | 47,2 (+12,6) |
ViT-22B (congelado) | UperNet | 0,8 mil millones/22,5 mil millones | 504 | 52,7 |
InternViT-6B (congelado) | UperNet | 0,4 mil millones/6,3 mil millones | 504 | 54,9 (+2,2) |
ViT-22B | UperNet | 22,5 mil millones / 22,5 mil millones | 504 | 55.3 |
PasanteViT-6B | UperNet | 6,3 mil millones / 6,3 mil millones | 504 | 58,9 (+3,6) |
Clasificación de imágenes Zero-Shot [ver detalles]
método | EN-1K | EN-A | EN-R | EN-V2 | EN-Sketch | Red de objetos |
---|---|---|---|---|---|---|
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 |
InternVL-C (nuestro) | 83.2 | 83,8 | 95,5 | 77,3 | 73,9 | 80,6 |
Clasificación de imágenes Zero-Shot multilingüe [ver detalles]
EN: inglés, ZH: chino, JP: japonés, Ar: árabe, IT: italiano
método | IN-1K (ES) | EN-1K (ZH) | IN-1K (JP) | IN-1K (AR) | EN-1K (IT) |
---|---|---|---|---|---|
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 |
InternVL-C (nuestro) | 83.2 | 64,5 | 61,5 | 44,9 | 65,7 |
Clasificación de vídeo de disparo cero
método | #marco | K400 | K600 | K700 |
---|---|---|---|---|
OpenCLIP-G | 1 | 65,9 | 66.1 | 59.2 |
EVA-02-CLIP-E+ | 1 | 69,8 | 69.3 | 63.4 |
InternVL-C (nuestro) | 1 | 71.0 | 71.3 | 65,7 |
ViCLIP | 8 | 75,7 | 73,5 | 66,4 |
InternVL-C (nuestro) | 8 | 79,4 | 78,8 | 71,5 |
Recuperación de texto e imagen Zero-Shot en inglés [ver detalles]
modelo | Flickr30K | PALMA DE COCO | promedio | ||||||||||
imagen a texto | texto a imagen | imagen a texto | texto a imagen | ||||||||||
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 |
InternVL-C (nuestro) | 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 |
InternVL-G (nuestro) | 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 |
Recuperación de texto e imagen de disparo cero en chino [ver detalles]
modelo | Flickr30K-CN | COCO-CN | promedio | ||||||||||
imagen a texto | texto a imagen | imagen a texto | texto a imagen | ||||||||||
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 |
InternVL-C (nuestro) | 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 |
InternVL-G (nuestro) | 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 |
Recuperación multilingüe de imágenes y textos Zero-Shot en XTD [ver detalles]
método | ES | ES | FR | ZH | ÉL | KO | RU | J.P. | promedio |
---|---|---|---|---|---|---|---|---|---|
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 |
InternVL-C (nuestro) | 97,3 | 95,7 | 95.1 | 95,6 | 96.0 | 92.2 | 93.3 | 95,5 | 95.1 |
InternVL-G (nuestro) | 98,6 | 97,7 | 96,5 | 96,7 | 96,9 | 95.1 | 94,8 | 96.1 | 96,6 |
Consulte la sección "Comparado con SOTA VLLM".
importar antorcha desde PIL importar imagen desde 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= imagen, return_tensors='pt').pixel_valuespixel_values = pixel_values.to(torch.bfloat16).cuda()salidas = modelo(pixel_values)
importar antorcha desde PIL importar imagen desde transformadores importar AutoModel, CLIPImageProcessordesde 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 # establece pad_token_id en 0image s = [Imagen.open('./examples/image1.jpg').convert('RGB'),Imagen.open('./examples/image2.jpg').convert('RGB'),Imagen.open( './ejemplos/image3.jpg').convert('RGB') ]prefijo = 'resumir:'textos = [prefijo + 'una foto de un panda rojo', # Prefijo inglés + '一张熊猫的照片', #Prefijo chino + '二匹の猫の写真' # Japonés]pixel_values = image_processor( imágenes=imágenes, return_tensors='pt').pixel_valuespixel_values = pixel_values.to(torch.bfloat16).cuda()input_ids = tokenizer(texts, return_tensors='pt', max_length=80, truncation=True, padding='max_length' ).input_ids.cuda()# InternVL-Clogits_per_image, logits_per_text = model(imagen=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]] , dispositivo='cuda:0',# dtype=torch.bfloat16, grad_fn=)# InternVL-Glogits_per_image, logits_per_text = model(imagen=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= )# configure add_eos_token en False para generatetokenizer.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("título en 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()# Título en inglés: un panda rojo sentado encima de una plataforma de madera
Aquí, tomamos el OpenGVLab/InternVL2-8B
más pequeño como ejemplo:
importar numpy como npimport torchvision.transforms como Tdesde decord importar VideoReader, cpudesde PIL importar Imagen desde torchvision.transforms.function importar InterpolationModedesde transformadores importar AutoModel, AutoTokenizerIMAGENET_MEAN = (0.485, 0.456, 0.406)IMAGENET_STD = (0.229, 0.224, 0.225)def formulario ( 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 , tamaño_entrada), interpolación=InterpolationMode.BICUBIC),T.ToTensor(),T.Normalize(media=MEAN, std=STD) ])return transformdef find_closest_aspect_ratio(aspect_ratio, target_ratios, ancho, alto, image_size):best_ratio_diff = float('inf')best_ratio = (1, 1)area = ancho * altopara la relación en target_ratios:target_aspect_ratio = ratio[0] / ratio[ 1]ratio_diff = abs(aspect_ratio - target_aspect_ratio)if ratio_diff < best_ratio_diff:best_ratio_diff = ratio_diffbest_ratio = ratioelif ratio_diff == best_ratio_diff:if área > 0.5 * image_size * image_size * ratio[0] * ratio[1]:best_ratio = ratioreturn best_ratiodefdynamic_preprocess( image, min_num=1, max_num=12, image_size=448, use_thumbnail=False):orig_width, orig_height = image.sizeaspect_ratio = orig_width / orig_height# calcular la relación de aspecto de la imagen existentetarget_ratios = set( (i, j) para n en el rango(min_num, max_num + 1) para i en el rango(1, n + 1) para j en el rango(1, n + 1) ifi * j <= max_num y i * j >= min_num)target_ratios = sorted(target_ratios, key=lambda x: x[0] * x[1])# encuentra la relación de aspecto más cercana al objetivotarget_aspect_ratio = find_closest_aspect_ratio(aspect_ratio, target_ratios, orig_width, orig_height, image_size)# calcula el ancho objetivo y 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]# cambiar el tamaño de la imagenresized_img = image.resize((target_width, target_height))processed_images = []para i en rango (bloques): caja = ( (i % (ancho_objetivo // tamaño_imagen)) * tamaño_imagen, (i // (ancho_objetivo // tamaño_imagen)) * tamaño_imagen, ((i % (ancho_objetivo // tamaño_imagen)) + 1) * tamaño_imagen, ((i // (ancho_objetivo // tamaño_imagen)) + 1) * tamaño_imagen)# dividir las imágenesplit_img = resized_img.crop(box)processed_images.append(split_img)assert