2024/10/21
: Nous sortons la série Mini-InternVL. Ces modèles atteignent des performances impressionnantes avec une taille minimale : le modèle 4B atteint 90 % des performances avec seulement 5 % de la taille du modèle. Pour plus de détails, veuillez consulter notre page et notre document de projet.
2024/08/01
: L'équipe Chartmimic a évalué les modèles de la série InternVL2 sur leur benchmark. Les modèles InternVL2-26B et 76B ont atteint les deux meilleures performances parmi les modèles open source, le modèle InternVL2 76B surpassant GeminiProVision et présentant des résultats comparables à ceux de Claude-3-opus.
2024/08/01
: InternVL2-Pro a atteint les performances SOTA parmi les modèles open source sur l'ensemble de données CharXiv, surpassant de nombreux modèles à source fermée tels que GPT-4V, Gemini 1.5 Flash et Claude 3 Sonnet.
2024/07/24
: L'équipe MLVU a évalué InternVL-1.5 sur son benchmark. La performance moyenne sur la tâche à choix multiples était de 50,4 %, tandis que la performance sur les tâches génératives était de 4,02. Les performances sur la tâche à choix multiples se sont classées au premier rang parmi tous les MLLM open source.
2024/07/18
: ?? InternVL2-40B a atteint les performances SOTA parmi les modèles open source sur l'ensemble de données Video-MME, obtenant un score de 61,2 lors de la saisie de 16 images et de 64,4 lors de la saisie de 32 images. Il surpasse considérablement les autres modèles open source et constitue le modèle open source le plus proche du GPT-4o mini.
2024/07/18
: ? InternVL2-Pro a atteint les performances SOTA sur les benchmarks DocVQA et InfoVQA.
2024/07/04
: ? Nous lançons la série InternVL2. InternVL2-Pro a atteint une précision de 62,0 % sur le benchmark MMMU, correspondant aux performances des principaux modèles commerciaux à source fermée comme GPT-4o. L'API gratuite de ce modèle peut être appliquée en remplissant (formulaire de candidature) / (申请表). D'autres modèles sont disponibles sur lien HF.
2024/06/19
: Nous proposons Needle In A Multimodal Haystack (MM-NIAH), le premier benchmark conçu pour évaluer systématiquement la capacité des MLLM existants à comprendre de longs documents multimodaux.
2024/05/30
: Nous publions ShareGPT-4o, un ensemble de données à grande échelle que nous prévoyons d'ouvrir en source avec 200 000 images, 10 000 vidéos et 10 000 audios avec des descriptions détaillées.
2024/05/28
: Merci à l'équipe lmdeploy pour avoir fourni le support de quantification AWQ. Le modèle 4 bits est disponible sur OpenGVLab/InternVL-Chat-V1-5-AWQ.
2024/05/13
: InternVL 1.0 peut désormais être utilisé comme encodeur de texte pour les modèles de diffusion afin de prendre en charge la génération multilingue de manière native dans plus de 110 langues dans le monde. Voir MuLan pour plus de détails.
2024/04/18
: InternVL-Chat-V1-5 a été publié sur la liaison HF, se rapprochant des performances de GPT-4V et Gemini Pro sur divers benchmarks comme MMMU, DocVQA, ChartQA, MathVista, etc.
2024/02/27
: InternVL est accepté au CVPR 2024 (Oral) ! ?
2024/02/21
: InternVL-Chat-V1-2-Plus a atteint les performances SOTA sur MathVista (59,9), MMBench (83,8) et MMVP (58,7). Consultez notre blog pour plus de détails.
2024/02/12
: InternVL-Chat-V1-2 est sorti. Il atteint 51,6 au MMMU val et 82,3 au test MMBench. Pour plus de détails, veuillez vous référer à notre blog et aux données SFT. Le modèle est maintenant disponible sur HuggingFace, et les données et les scripts de formation/évaluation sont open source.
2024/01/24
: InternVL-Chat-V1-1 est publié, il prend en charge le chinois et a une capacité OCR plus forte, voir ici.
2024/01/16
: Nous publions notre code mmcv/mmsegmentation/mmdetection personnalisé, intégré à DeepSpeed, qui peut être utilisé pour entraîner des modèles de détection et de segmentation à grande échelle.
Prise en charge de vLLM et Ollama
Reconstruire des documents à l'aide de readthedocs
Prise en charge du réglage fin de différents LLM avec LoRA
Prise en charge de la saisie vidéo et PDF dans la démo en ligne
Lancez InternVL2 avec l'intégration de VisionLLMv2
Publier requirements.txt
pour InternVL2
Libération du code de formation/évaluation pour la série InternVL2
Publier l'interface utilisateur Web Streamlit pour InternVL1.5 et InternVL2
Commencer
Installation : [Environnement] [requirements.txt]
Préparation des données d'évaluation : [Évaluation InternVL]
Format des données de discussion : [Métafichier] [Texte pur] [Image unique] [Multi-images] [Vidéo]
API InternVL-Chat : [InternVL2-Pro]
Démo de chat local : [Démo Streamlit] [Démo Gradio] [Démo LMDeploy]
Tutoriels : [Amélioration d'InternVL2 sur la légende COCO à l'aide du réglage fin LoRA]
StagiaireVL Family
InternVL 2.0 : [Introduction] [Démarrage rapide] [Finetune] [Évaluation] [Déploiement]
InternVL 1.5 : [Introduction] [Démarrage rapide] [Finetune] [Évaluation] [Déploiement]
InternVL 1.2 : [Introduction] [Démarrage rapide] [Finetune] [Évaluation]
InternVL 1.1 : [Introduction] [Démarrage rapide] [Évaluation]
InternVL 1.0 : [Classification] [CLIP-Benchmark] [Segmentation] [InternVL-Chat-LLaVA] [InternVL-G]
Nom du modèle | Partie visuelle | Partie linguistique | Liaison HF | Lien MS | Document |
---|---|---|---|---|---|
StagiaireVL2‑1B | InternViT‑300M‑448px | Qwen2‑0.5B‑Instruction | ? lien | ? lien | ? doc |
StagiaireVL2‑2B | InternViT‑300M‑448px | internelm2‑chat‑1‑8b | ? lien | ? lien | ? doc |
StagiaireVL2‑4B | InternViT‑300M‑448px | Instruction Phi‑3‑mini‑128k | ? lien | ? lien | ? doc |
StagiaireVL2‑8B | InternViT‑300M‑448px | internelm2_5‑7b‑chat | ? lien | ? lien | ? doc |
StagiaireVL2‑26B | InternViT‑6B‑448px‑V1‑5 | internelm2‑chat‑20b | ? lien | ? lien | ? doc |
StagiaireVL2‑40B | InternViT‑6B‑448px‑V1‑5 | Nous‑Hermes‑2‑Yi‑34B | ? lien | ? lien | ? doc |
StagiaireVL2-Llama3-76B | InternViT‑6B‑448px‑V1‑5 | Hermès‑2‑Thêta‑ Lama‑3‑70B | ? lien | ? lien | ? doc |
Nous invitons tout le monde à utiliser notre API pour la recherche. Pour une meilleure gestion, veuillez soumettre (formulaire de candidature) / (申请表) pour obtenir un accès gratuit à l'API.
Modèle | Date | Liaison HF | Lien MS | Note |
---|---|---|---|---|
Mini‑StagiaireVL‑Chat‑4B‑V1‑5 | 2024.05.28 | ? lien | ? lien | ?? 16 % de la taille du modèle, 90 % des performances |
Mini‑StagiaireVL‑Chat‑2B‑V1‑5 | 2024.05.19 | ? lien | ? lien | ? 8% de la taille du modèle, 80% des performances |
StagiaireVL‑Chat‑V1‑5 | 2024.04.18 | ? lien | ? lien | prend en charge les images 4K ; OCR super puissant ; Approche des performances de GPT-4V et Gemini Pro sur divers benchmarks comme MMMU, DocVQA, ChartQA, MathVista, etc. |
StagiaireVL‑Chat‑V1‑2‑Plus | 2024.02.21 | ? lien | ? lien | plus de données SFT et plus fort |
StagiaireVL‑Chat‑V1‑2 | 2024.02.11 | ? lien | ? lien | faire passer le LLM à 34B |
StagiaireVL‑Chat‑V1‑1 | 2024.01.24 | ? lien | ? lien | prend en charge le chinois et un OCR plus fort |
StagiaireVL‑Chat‑19B | 2023.12.25 | ? lien | ? lien | Dialogue multimodal anglais |
StagiaireVL‑Chat‑13B | 2023.12.25 | ? lien | ? lien | Dialogue multimodal anglais |
Modèle | Date | Liaison HF | Lien MS | Note |
---|---|---|---|---|
InternViT‑300M‑448px | 2024.05.25 | ? lien | ? lien | modèle de base distillé pour petite vision avec 300 millions de paramètres (? nouveau) |
InternViT‑6B‑448px‑V1‑5 | 2024.04.20 | ? lien | ? lien | prend en charge la résolution dynamique et la capacité d'extraction de fonctionnalités OCR ultra puissante grâce à une pré-formation incrémentielle (? nouveau) |
InternViT‑6B‑448px‑V1‑2 | 2024.02.11 | ? lien | ? lien | prend en charge la résolution 448 par pré-entraînement incrémentiel |
InternViT‑6B‑448px‑V1‑0 | 30/01/2024 | ? lien | ? lien | prend en charge la résolution 448 par pré-entraînement incrémentiel |
InternViT‑6B‑224px | 2023.12.22 | ? lien | ? lien | la première version d'InternViT-6B, extraite d'InternVL‑14B‑224px |
Modèle | Date | Liaison HF | Lien MS | Note |
---|---|---|---|---|
StagiaireVL‑14B‑224px | 2023.12.22 | ? lien | ? lien | Le modèle de base du langage de vision, InternViT-6B + QLLaMA, peut être utilisé pour la récupération d'image-texte comme CLIP |
Classification d'images par sonde linéaire [voir les détails]
ViT-22B utilise l'ensemble de données privé JFT-3B.
méthode | #param | EN-1K | EN RÉEL | EN-V2 | EN-A | IN-R | DANS-Croquis |
---|---|---|---|---|---|---|---|
OuvrirCLIP-G | 1,8 milliards | 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 milliards | 87,8 | - | - | - | - | - |
ViT-22B* | 21,7B | 89,5 | 90,9 | 83.2 | 83,8 | 87,4 | - |
InternViT-6B (le nôtre) | 5,9 milliards | 88,2 | 90,4 | 79,9 | 77,5 | 89,8 | 69.1 |
Segmentation sémantique [voir détails]
méthode | décodeur | #param (entraînement/total) | taille de la récolte | mIoU |
---|---|---|---|---|
OpenCLIP-G (gelé) | Linéaire | 0,3 M / 1,8 G | 512 | 39.3 |
ViT-22B (congelé) | Linéaire | 0,9 M / 21,7 G | 504 | 34,6 |
InternViT-6B (congelé) | Linéaire | 0,5M / 5,9B | 504 | 47,2 (+12,6) |
ViT-22B (congelé) | UperNet | 0,8B / 22,5B | 504 | 52,7 |
InternViT-6B (congelé) | UperNet | 0,4B / 6,3B | 504 | 54,9 (+2,2) |
ViT-22B | UperNet | 22,5B / 22,5B | 504 | 55.3 |
InternViT-6B | UperNet | 6.3B / 6.3B | 504 | 58,9 (+3,6) |
Classification d'images Zero-Shot [voir les détails]
méthode | EN-1K | EN-A | IN-R | EN-V2 | DANS-Croquis | ObjetNet |
---|---|---|---|---|---|---|
OuvrirCLIP-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 |
StagiaireVL-C (le nôtre) | 83.2 | 83,8 | 95,5 | 77.3 | 73,9 | 80,6 |
Classification multilingue des images Zero-Shot [voir les détails]
EN : anglais, ZH : chinois, JP : japonais, Ar : arabe, IT : italien
méthode | IN-1K (FR) | IN-1K (ZH) | IN-1K (JP) | IN-1K (AR) | IN-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 |
StagiaireVL-C (le nôtre) | 83.2 | 64,5 | 61,5 | 44,9 | 65,7 |
Classification vidéo Zero-Shot
méthode | #cadre | K400 | K600 | K700 |
---|---|---|---|---|
OuvrirCLIP-G | 1 | 65,9 | 66.1 | 59.2 |
EVA-02-CLIP-E+ | 1 | 69,8 | 69,3 | 63,4 |
StagiaireVL-C (le nôtre) | 1 | 71,0 | 71.3 | 65,7 |
ViCLIP | 8 | 75,7 | 73,5 | 66,4 |
StagiaireVL-C (le nôtre) | 8 | 79,4 | 78,8 | 71,5 |
Récupération d'image et de texte Zero-Shot en anglais [voir détails]
modèle | Flickr30K | COCO | moyenne | ||||||||||
image en texte | texte en image | image en texte | texte en image | ||||||||||
R@1 | R@5 | R@10 | R@1 | R@5 | R@10 | R@1 | R@5 | R@10 | R@1 | R@5 | R@10 | ||
OuvrirCLIP-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 |
StagiaireVL-C (le nôtre) | 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 |
StagiaireVL-G (le nôtre) | 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 |
Récupération d'image et de texte chinois Zero-Shot [voir les détails]
modèle | Flickr30K-CN | COCO-CN | moyenne | ||||||||||
image en texte | texte en image | image en texte | texte en image | ||||||||||
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 |
StagiaireVL-C (le nôtre) | 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 |
StagiaireVL-G (le nôtre) | 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 |
Récupération multilingue d'images et de textes Zero-Shot sur XTD [voir les détails]
méthode | FR | ES | FR | ZH | IL | KO | RU | JP | moyenne |
---|---|---|---|---|---|---|---|---|---|
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 |
StagiaireVL-C (le nôtre) | 97,3 | 95,7 | 95.1 | 95,6 | 96,0 | 92,2 | 93,3 | 95,5 | 95.1 |
StagiaireVL-G (le nôtre) | 98,6 | 97,7 | 96,5 | 96,7 | 96,9 | 95.1 | 94,8 | 96.1 | 96,6 |
Voir la section « Comparé aux VLLM SOTA ».
importer torchfrom PIL importer Imagefrom transformateurs importer 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=image, return_tensors ='pt').pixel_valuespixel_values = pixel_values.to(torch.bfloat16).cuda()outputs = model(pixel_values)
importer torchfrom PIL importer Imagefrom transformateurs importer AutoModel, CLIPImageProcessorfrom transformateurs importer AutoTokenizermodel = AutoModel.from_pretrained('OpenGVLab/InternVL-14B-224px',torch_dtype=torch.bfloat16,low_cpu_mem_usage=True,trust_remote_code=True).cuda().eval() image_processeur = 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 # définir pad_token_id sur 0images = [Image.open('./examples/image1.jpg').convert('RVB'),Image.open('./examples/image2.jpg').convert('RVB'),Image.open(' ./examples/image3.jpg').convert('RVB') ]prefix = 'summarize:'texts = [préfixe + 'une photo d'un panda roux', # Préfixe anglais + '一张熊猫的照片', # Préfixe chinois + '二匹の猫の写真' # Japonais]pixel_values = image_processor( images = images, return_tensors='pt').pixel_valuespixel_values = pixel_values.to(torch.bfloat16).cuda()input_ids = tokenizer(textes, 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.7583e-06, 3.1233e-05, 1.0000e+00]], device='cuda:0',# dtype=torch.bfloat16, grad_fn= )# veuillez définir add_eos_token à False pour 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("Légende anglaise :", 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()# Légende en anglais : un panda roux assis au sommet d'une plate-forme en bois
Ici, nous prenons comme exemple le plus petit OpenGVLab/InternVL2-8B
:
importer numpy en tant que npimport torchimport torchvision.transforms en tant que Tfrom decord import VideoReader, cpufrom PIL import Imagefrom torchvision.transforms.function 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, input_size), interpolation=InterpolationMode.BICUBIC),T.ToTensor(),T.Normalize(mean=MEAN, std=STD) ]) return transformdef find_closest_aspect_ratio(aspect_ratio, target_ratios, width, height, image_size):best_ratio_diff = float('inf')best_ratio = (1, 1)area = width * heightfor ratio in 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 zone > 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# calculer le rapport hauteur/largeur de l'image existantetarget_ratios = set( (i, j) pour n dans la plage (min_num, max_num + 1) pour i dans la plage (1, n + 1) pour j dans la plage (1, n + 1) ifi * j <= max_num et i * j >= min_num)target_ratios = sorted(target_ratios, key=lambda x: x[0] * x[1])# trouver le rapport hauteur/largeur le plus proche du targettarget_aspect_ratio = find_closest_aspect_ratio(aspect_ratio, target_ratios, orig_width, orig_height, image_size)# calculer la largeur et la hauteur ciblestarget_width = image_size * target_aspect_ratio[0]target_height = image_size * target_aspect_ratio[1]blocks = target_aspect_ratio[0] * target_aspect_ratio[1]# redimensionner l'imageresized_img = image.resize((target_width, target_height))processed_images = []for i in range(blocks):box = ( (i % (target_width // image_size)) * image_size, (i // (target_width // image_size)) * image_size, ((i % (target_width // image_size)) + 1) * image_size, ((i // (target_width // image_size)) + 1) * image_size)# diviser les imagesplit_img = resized_img.crop(box)processed_images.append(split_img)assert