2024/10/21
: Mini-InternVL 시리즈를 출시합니다. 이 모델은 최소한의 크기로 인상적인 성능을 달성합니다. 4B 모델은 단 5%의 모델 크기로 90%의 성능을 달성합니다. 자세한 내용은 당사 프로젝트 페이지와 문서를 확인해주세요.
2024/08/01
: Chartmimic 팀은 InternVL2 시리즈 모델을 벤치마크로 평가했습니다. InternVL2-26B 및 76B 모델은 오픈 소스 모델 중 상위 2개 성능을 달성했으며, InternVL2 76B 모델은 GeminiProVision을 능가하고 Claude-3-opus와 비슷한 결과를 나타냈습니다.
2024/08/01
: InternVL2-Pro는 CharXiv 데이터 세트의 오픈 소스 모델 중 SOTA 성능을 달성하여 GPT-4V, Gemini 1.5 Flash 및 Claude 3 Sonnet과 같은 많은 비공개 소스 모델을 능가했습니다.
2024/07/24
: MLVU 팀은 벤치마크에서 InternVL-1.5를 평가했습니다. 객관식 과제의 평균 성과는 50.4%인 반면, 생성 과제의 성과는 4.02였습니다. 객관식 작업의 성능은 모든 오픈 소스 MLLM 중에서 1위를 차지했습니다.
2024/07/18
: ?? InternVL2-40B는 Video-MME 데이터 세트의 오픈 소스 모델 중 SOTA 성능을 달성하여 16프레임 입력 시 61.2점, 32프레임 입력 시 64.4점을 기록했습니다. 다른 오픈 소스 모델보다 훨씬 뛰어난 성능을 발휘하며 GPT-4o mini에 가장 가까운 오픈 소스 모델입니다.
2024/07/18
: ? InternVL2-Pro는 DocVQA 및 InfoVQA 벤치마크에서 SOTA 성능을 달성했습니다.
2024/07/04
: ? InternVL2 시리즈를 출시합니다. InternVL2-Pro는 MMMU 벤치마크에서 62.0%의 정확도를 달성하여 GPT-4o와 같은 주요 비공개 소스 상용 모델의 성능과 일치합니다. 본 모델의 무료 API는 (신청서)/(申请表)를 작성하여 적용할 수 있습니다. 다른 모델은 HF 링크에서 구입할 수 있습니다.
2024/06/19
: 우리는 긴 다중 모드 문서를 이해하기 위해 기존 MLLM의 기능을 체계적으로 평가하기 위해 설계된 최초의 벤치마크인 MM-NIAH(Needle In A Multimodal Haystack)를 제안합니다.
2024/05/30
: 자세한 설명과 함께 200K 이미지, 10K 비디오, 10K 오디오로 오픈 소스화할 대규모 데이터 세트인 ShareGPT-4o를 출시합니다.
2024/05/28
: AWQ 양자화 지원을 제공한 lmdeploy 팀에 감사드립니다. 4비트 모델은 OpenGVLab/InternVL-Chat-V1-5-AWQ에서 사용할 수 있습니다.
2024/05/13
: 이제 InternVL 1.0을 확산 모델용 텍스트 인코더로 사용하여 전 세계 110개 이상의 언어에서 기본적으로 다국어 생성을 지원할 수 있습니다. 자세한 내용은 MuLan을 참조하세요.
2024/04/18
: InternVL-Chat-V1-5가 HF 링크에서 출시되어 MMMU, DocVQA, ChartQA, MathVista 등과 같은 다양한 벤치마크에서 GPT-4V 및 Gemini Pro의 성능에 근접했습니다.
2024/02/27
: InternVL이 CVPR 2024 (Oral)에 합격했습니다! ?
2024/02/21
: InternVL-Chat-V1-2-Plus는 MathVista(59.9), MMBench(83.8) 및 MMVP(58.7)에서 SOTA 성능을 달성했습니다. 자세한 내용은 블로그를 참조하세요.
2024/02/12
: InternVL-Chat-V1-2가 출시되었습니다. MMMU val에서 51.6, MMBench 테스트에서 82.3을 달성했습니다. 자세한 내용은 당사 블로그 및 SFT 데이터를 참고하시기 바랍니다. 이제 HuggingFace에서 모델을 사용할 수 있으며 교육/평가 데이터와 스크립트가 모두 오픈 소스로 제공됩니다.
2024/01/24
: InternVL-Chat-V1-1이 출시되었습니다. 중국어를 지원하고 더욱 강력한 OCR 기능을 갖추고 있습니다. 여기를 참조하세요.
2024/01/16
: 대규모 감지 및 세분화 모델 학습에 사용할 수 있는 DeepSpeed와 통합된 맞춤형 mmcv/mmsegmentation/mmDetection 코드를 출시합니다.
vLLM 및 Ollama 지원
readthedocs를 사용하여 문서 다시 작성
LoRA를 통해 다양한 LLM 미세 조정 지원
온라인 데모에서 비디오 및 PDF 입력 지원
VisionLLMv2 통합을 통해 InternVL2 출시
InternVL2용 requirements.txt
출시
InternVL2 시리즈 교육/평가 코드 출시
InternVL1.5 및 InternVL2용 Streamlit 웹 UI 출시
시작하기
설치: [환경] [requirements.txt]
평가자료 준비 : [InternVL 평가]
채팅 데이터 형식: [메타 파일] [순수 텍스트] [단일 이미지] [다중 이미지] [비디오]
InternVL-채팅 API: [InternVL2-Pro]
로컬 채팅 데모: [Streamlit 데모] [Gradio 데모] [LMDeploy 데모]
튜토리얼: [LoRA 미세 조정을 사용하여 COCO 캡션에서 InternVL2 향상]
InternVL 제품군
InternVL 2.0: [소개] [빠른 시작] [Finetune] [평가] [배포]
InternVL 1.5: [소개] [빠른 시작] [Finetune] [평가] [배포]
InternVL 1.2: [소개] [빠른 시작] [Finetune] [평가]
InternVL 1.1: [소개] [빠른 시작] [평가]
InternVL 1.0: [분류] [CLIP-벤치마크] [세분화] [InternVL-Chat-LLaVA] [InternVL-G]
모델명 | 비전파트 | 언어 부분 | HF링크 | MS링크 | 문서 |
---|---|---|---|---|---|
InternVL2-1B | InternViT‑300M‑448px | Qwen2‑0.5B‑지시 | ? 링크 | ? 링크 | ? 의사 |
InternVL2‑2B | InternViT‑300M‑448px | internlm2-chat-1-8b | ? 링크 | ? 링크 | ? 의사 |
InternVL2-4B | InternViT‑300M‑448px | Phi‑3‑mini‑128k‑instruct | ? 링크 | ? 링크 | ? 의사 |
InternVL2-8B | InternViT‑300M‑448px | internlm2_5‑7b‑채팅 | ? 링크 | ? 링크 | ? 의사 |
InternVL2‑26B | InternViT-6B-448px-V1-5 | internlm2‑chat‑20b | ? 링크 | ? 링크 | ? 의사 |
InternVL2‑40B | InternViT-6B-448px-V1-5 | Nous‑Hermes‑2‑Yi‑34B | ? 링크 | ? 링크 | ? 의사 |
InternVL2-Llama3-76B | InternViT-6B-448px-V1-5 | 헤르메스‑2‑세타‑ 라마‑3‑70B | ? 링크 | ? 링크 | ? 의사 |
우리는 연구를 위해 API를 사용하는 모든 사람을 환영합니다. 더 나은 관리를 위해 (신청서) / (申请表)를 제출하여 무료 API 액세스 권한을 얻으시기 바랍니다.
모델 | 날짜 | HF링크 | MS링크 | 메모 |
---|---|---|---|---|
Mini‑InternVL‑Chat‑4B‑V1‑5 | 2024.05.28 | ? 링크 | ? 링크 | ?? 모델 크기의 16%, 성능의 90% |
Mini‑InternVL‑Chat‑2B‑V1‑5 | 2024.05.19 | ? 링크 | ? 링크 | ? 모델 크기의 8%, 성능의 80% |
InternVL‑Chat‑V1‑5 | 2024.04.18 | ? 링크 | ? 링크 | 4K 이미지 지원; 매우 강력한 OCR; MMMU, DocVQA, ChartQA, MathVista 등과 같은 다양한 벤치마크에서 GPT-4V 및 Gemini Pro의 성능에 접근합니다. |
InternVL-Chat-V1-2-Plus | 2024.02.21 | ? 링크 | ? 링크 | 더 많은 SFT 데이터와 더 강력한 |
InternVL‑Chat‑V1‑2 | 2024.02.11 | ? 링크 | ? 링크 | LLM을 34B로 확장 |
InternVL‑Chat‑V1‑1 | 2024.01.24 | ? 링크 | ? 링크 | 중국어 및 더욱 강력한 OCR 지원 |
InternVL‑Chat‑19B | 2023.12.25 | ? 링크 | ? 링크 | 영어 다중 모드 대화 |
InternVL‑Chat‑13B | 2023.12.25 | ? 링크 | ? 링크 | 영어 다중 모드 대화 |
모델 | 날짜 | HF링크 | MS링크 | 메모 |
---|---|---|---|---|
InternViT‑300M‑448px | 2024.05.25 | ? 링크 | ? 링크 | 300M 매개변수를 갖춘 증류된 스몰 비전 파운데이션 모델(?new) |
InternViT-6B-448px-V1-5 | 2024.04.20 | ? 링크 | ? 링크 | 증분 사전 훈련을 통해 동적 해상도 및 초강력 OCR 특징 추출 기능 지원(?new) |
InternViT-6B-448px-V1-2 | 2024.02.11 | ? 링크 | ? 링크 | 증분 사전 학습을 통해 448 해상도 지원 |
InternViT‑6B‑448px‑V1‑0 | 2024.01.30 | ? 링크 | ? 링크 | 증분 사전 학습을 통해 448 해상도 지원 |
InternViT‑6B‑224px | 2023.12.22 | ? 링크 | ? 링크 | InternVL‑14B‑224px에서 추출된 InternViT-6B의 첫 번째 버전 |
모델 | 날짜 | HF링크 | MS링크 | 메모 |
---|---|---|---|---|
InternVL‑14B‑224px | 2023.12.22 | ? 링크 | ? 링크 | 비전 언어 기반 모델인 InternViT-6B + QLLaMA는 CLIP과 같은 이미지-텍스트 검색에 사용할 수 있습니다. |
선형 프로브 이미지 분류 [자세히 보기]
ViT-22B는 개인 JFT-3B 데이터 세트를 사용합니다.
방법 | #param | IN-1K | IN-Real | IN-V2 | 인에이 | IN-R | IN-스케치 |
---|---|---|---|---|---|---|---|
오픈CLIP-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 (우리) | 5.9B | 88.2 | 90.4 | 79.9 | 77.5 | 89.8 | 69.1 |
의미론적 분할 [자세히 보기]
방법 | 디코더 | #param(열차/전체) | 자르기 크기 | 미우 |
---|---|---|---|---|
OpenCLIP-G(동결) | 선의 | 0.3M / 1.8B | 512 | 39.3 |
ViT-22B (냉동) | 선의 | 0.9M / 21.7B | 504 | 34.6 |
InternViT-6B(냉동) | 선의 | 0.5M / 5.9B | 504 | 47.2 (+12.6) |
ViT-22B (냉동) | 어퍼넷 | 0.8B / 22.5B | 504 | 52.7 |
InternViT-6B(냉동) | 어퍼넷 | 0.4B / 6.3B | 504 | 54.9 (+2.2) |
ViT-22B | 어퍼넷 | 22.5B / 22.5B | 504 | 55.3 |
InternViT-6B | 어퍼넷 | 6.3B / 6.3B | 504 | 58.9 (+3.6) |
제로샷 이미지 분류 [자세히 보기]
방법 | IN-1K | 인에이 | IN-R | IN-V2 | IN-스케치 | 오브젝트넷 |
---|---|---|---|---|---|---|
오픈CLIP-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 (우리) | 83.2 | 83.8 | 95.5 | 77.3 | 73.9 | 80.6 |
다국어 제로샷 이미지 분류 [자세히 보기]
EN: 영어, ZH: 중국어, JP: 일본어, Ar: 아랍어, IT: 이탈리아어
방법 | IN-1K(EN) | IN-1K(ZH) | IN-1K(일본) | IN-1K(AR) | IN-1K(IT) |
---|---|---|---|---|---|
타이이-CLIP-ViT-H | - | 54.4 | - | - | - |
우콩-비티-LG | - | 57.5 | - | - | - |
CN-CLIP-ViT-H | - | 59.6 | - | - | - |
AltCLIP-ViT-L | 74.5 | 59.6 | - | - | - |
EVA-02-CLIP-E+ | 82.0 | - | - | - | 41.2 |
오픈CLIP-XLM-RH | 77.0 | 55.7 | 53.1 | 37.0 | 56.8 |
InternVL-C (우리) | 83.2 | 64.5 | 61.5 | 44.9 | 65.7 |
제로샷 비디오 분류
방법 | #액자 | K400 | K600 | K700 |
---|---|---|---|---|
오픈CLIP-G | 1 | 65.9 | 66.1 | 59.2 |
EVA-02-CLIP-E+ | 1 | 69.8 | 69.3 | 63.4 |
InternVL-C (우리) | 1 | 71.0 | 71.3 | 65.7 |
ViCLIP | 8 | 75.7 | 73.5 | 66.4 |
InternVL-C (우리) | 8 | 79.4 | 78.8 | 71.5 |
영어 제로샷 이미지-텍스트 검색 [자세히 보기]
모델 | 플리커30K | 머리 | 평균 | ||||||||||
이미지를 텍스트로 | 텍스트를 이미지로 | 이미지를 텍스트로 | 텍스트를 이미지로 | ||||||||||
R@1 | R@5 | R@10 | R@1 | R@5 | R@10 | R@1 | R@5 | R@10 | R@1 | R@5 | R@10 | ||
오픈CLIP-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 (우리) | 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 (우리) | 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 |
중국 제로샷 이미지-텍스트 검색 [자세히 보기]
모델 | Flickr30K-CN | 코코CN | 평균 | ||||||||||
이미지를 텍스트로 | 텍스트를 이미지로 | 이미지를 텍스트로 | 텍스트를 이미지로 | ||||||||||
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 |
오픈CLIP-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 (우리) | 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 (우리) | 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 |
XTD에서 다국어 제로샷 이미지-텍스트 검색 [자세히 보기]
방법 | KO | ES | 정말로 | ZH | 그것 | KO | 러시아 | 일본 | 평균 |
---|---|---|---|---|---|---|---|---|---|
Alt클립 | 95.4 | 94.1 | 92.9 | 95.1 | 94.2 | 94.4 | 91.8 | 91.7 | 93.7 |
오픈CLIP-XLM-RH | 97.3 | 96.1 | 94.5 | 94.7 | 96.0 | 90.2 | 93.9 | 94.0 | 94.6 |
InternVL-C (우리) | 97.3 | 95.7 | 95.1 | 95.6 | 96.0 | 92.2 | 93.3 | 95.5 | 95.1 |
InternVL-G (우리) | 98.6 | 97.7 | 96.5 | 96.7 | 96.9 | 95.1 | 94.8 | 96.1 | 96.6 |
"SOTA VLLM과 비교" 섹션을 참조하세요.
import torchfrom PIL import Imagefrom Transformers import 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= 이미지, return_tensors='pt').pixel_valuespixel_values = pixel_values.to(torch.bfloat16).cuda()outputs = model(pixel_values)
import torchfrom PIL import Imagefrom Transformers import AutoModel, CLIPImageProcessorfrom Transformers import 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 # pad_token_id를 0images로 설정 = [Image.open('./examples/image1.jpg').convert('RGB'),Image.open('./examples/image2.jpg').convert('RGB'),Image.open( './examples/image3.jpg').convert('RGB') ]prefix = 'summarize:'texts = [prefix + '붉은 판다 사진', # Englishprefix + '一张熊猫의 사진', # Chineseprefix + 'two 匹の猫の写真' # 일본어]pixel_values = image_processor( 이미지=이미지, 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(image=pixel_values, text=input_ids, mode='InternVL-C')probs = logits_per_image.softmax(dim=-1)# 텐서([[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)# 텐서([[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= )# Generationtokenizer에 대해 add_eos_token을 False로 설정하십시오.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("영어 캡션:", 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()# 영어 캡션: 나무 플랫폼 위에 앉아 있는 붉은 팬더
여기서는 더 작은 OpenGVLab/InternVL2-8B
예로 들어 보겠습니다.
import numpy as npiimport import torchvision.transforms as 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 , 입력_크기), 보간=InterpolationMode.BICUBIC),T.ToTensor(),T.Normalize(평균=MEAN, std=STD) ])return 변환def 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 Area > 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# 기존 이미지 종횡비 계산target_ratios = set( (i, j) 범위(min_num, max_num + 1)의 경우 i의 경우 범위(1, n + 1)의 경우 범위(1, n + 1)의 j의 경우 ifi * j <= max_num 및 i * j >= min_num)target_ratios = sorted(target_ratios, key=lambda x: x[0] * x[1])# target에 가장 가까운 종횡비를 찾습니다target_aspect_ratio = find_closest_aspect_ratio(aspect_ratio, target_ratios, orig_width, orig_height, image_size)# 대상 너비 계산 그리고 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]# 이미지 크기 조정resize_img = image.resize((target_width, target_height))processed_images = []for i in 범위(블록):상자 = ( (i % (target_width // 이미지 크기)) * 이미지 크기, (i // (대상 너비 // 이미지 크기)) * 이미지 크기, ((i % (target_width // 이미지 크기)) + 1) * 이미지 크기, ((i // (target_width // image_size)) + 1) * image_size)# 이미지 분할 분할_img = resize_img.crop(box)processed_images.append(split_img)assert