File size: 8,296 Bytes
037ab1e ff12385 15f17da 87a6d5e 15f17da 87a6d5e 15f17da 87a6d5e 15f17da 87a6d5e 15f17da | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 | ---
license: apache-2.0
pipeline_tag: image-text-to-text
---
<div align="center">
<h1>π VisCo: Leveraging Large Language Models as Intrinsic Encoders for Visual Token Compression</h1>
<h3>ACM Multimedia 2026</h3>
<p align="center">
<a href="https://github.com/Zyvpeng">Yupeng Zheng</a><sup>*</sup>,
<a href="https://github.com/Jacky-hate">Kai Zou</a><sup>*</sup>,
<a href="https://scholar.google.com/citations?user=kReWULQAAAAJ&hl=en&oi=ao">Bin Liu</a><sup>β </sup>,
<a href="https://scholar.google.com/citations?user=7620QAMAAAAJ&hl=en&oi=ao">Nenghai Yu</a><sup>β </sup>
</p>
<p align="center">
<sup>*</sup>Equal contribution
<sup>β </sup>Corresponding author
</p>
<p align="center">
<a href="https://arxiv.org/abs/2607.12756">
<img src="https://img.shields.io/badge/arXiv-2607.12756-b31b1b.svg">
</a>
<!-- <a href="https://your-project-page.github.io">
<img src="https://img.shields.io/badge/Project-Page-blue">
</a>-->
<a href="https://huggingface.co/zpatrick/VisCo">
<img src="https://img.shields.io/badge/π€%20Model-HuggingFace-yellow">
</a>
<a href="https://github.com/Zyvpeng/VisCo/blob/main/LICENSE">
<img src="https://img.shields.io/badge/License-Apache--2.0-green">
</a>
<a href="https://github.com/Zyvpeng/VisCo">
<img src="https://img.shields.io/github/stars/Zyvpeng/VisCo?style=social">
</a>
</p>
<p align="center">
<strong>
Compress hundreds of visual tokens into only a few memory tokens while preserving multimodal understanding.
</strong>
</p>
</div>
## π₯ Highlights
- **Intrinsic self-compression.** VisCo reuses the pretrained VLM itself as a parameter-sharing autoencoder instead of introducing a separate compression network.
- **Lightweight adaptation.** Only memory tokens and encoder-side LoRA adapters are trained; the shared pretrained backbone is kept intact for decoding.
- **Hierarchical KV passing.** Layer-wise key-value states associated with memory tokens are transferred from the encoder directly into the decoder KV cache.
- **Extreme compression.** VisCo retains 85.3% of LLaVA-1.5-7B performance with one visual token and 91.4% of Qwen2-VL-2B performance with 18 tokens.
- **Broad evaluation.** Experiments cover LLaVA-1.5-7B, Qwen2-VL-2B, and Qwen2-VL-7B on six multimodal benchmarks.
## π Main Results
### LLaVA-1.5-7B
Average is the mean percentage of performance retained relative to the original model.
| Method | Tokens | GQA | MMB | MMB-CN | MME | POPE | MMVet | Average |
|:--|--:|--:|--:|--:|--:|--:|--:|--:|
| LLaVA-1.5-7B | 576 | 62.0 | 64.3 | 58.3 | 1510.7 | 85.9 | 31.1 | 100.0% |
| FastV | 32 | 41.5 | 37.8 | 33.2 | 884.6 | 32.5 | 20.7 | 57.6% |
| SparseVLM | 32 | 48.3 | 51.4 | 40.6 | 1046.7 | 67.9 | 18.6 | 72.6% |
| PruMerge+ | 32 | 51.1 | 56.8 | 47.0 | 940.8 | 70.9 | 21.4 | 77.5% |
| DivPrune | 32 | 54.9 | 57.6 | 49.1 | **1284.9** | 81.5 | 26.3 | 87.8% |
| VisPruner | 32 | 52.2 | 58.4 | 52.7 | 1271.0 | 72.7 | **28.8** | 87.8% |
| **VisCo** | **32** | **58.5** | **62.3** | **57.2** | 1152.9 | **81.9** | 27.9 | **91.8%** |
| PruMerge+ | 1 | 26.4 | 13.7 | 13.7 | 568.9 | 40.4 | 12.5 | 35.4% |
| VisPruner | 1 | 41.8 | 22.4 | 25.8 | 764.4 | 49.0 | 12.0 | 48.8% |
| **VisCo** | **1** | **58.2** | **59.0** | **52.4** | **1191.2** | **78.2** | **20.7** | **85.3%** |
### Qwen2-VL
| Base model | Method | Tokens | GQA | MMB | MMB-CN | MME | POPE | MMVet | Average |
|:--|:--|--:|--:|--:|--:|--:|--:|--:|--:|
| Qwen2-VL-2B | Origin | 144 | 59.8 | 67.3 | 61.8 | 1465.8 | 81.5 | 42.5 | 100.0% |
| Qwen2-VL-2B | VisionZip | 36 | 53.2 | 64.3 | 56.7 | 1372.4 | 75.3 | 35.5 | 91.0% |
| Qwen2-VL-2B | **VisCo** | **36** | **61.1** | 64.0 | **58.9** | 1368.3 | **82.9** | **35.6** | **95.2%** |
| Qwen2-VL-2B | VisionZip | 18 | 48.5 | 55.2 | 41.6 | 1300.9 | 62.7 | 25.8 | 76.1% |
| Qwen2-VL-2B | **VisCo** | **18** | **59.7** | **62.9** | **57.8** | **1358.0** | **82.4** | **28.9** | **91.4%** |
| Qwen2-VL-7B | Origin | 144 | 64.8 | 76.1 | 71.6 | 1664.8 | 82.6 | 56.1 | 100.0% |
| Qwen2-VL-7B | VisionZip | 36 | 58.3 | 72.4 | 63.4 | 1530.0 | 75.3 | 39.1 | 87.7% |
| Qwen2-VL-7B | **VisCo** | **36** | **62.6** | **74.0** | **70.0** | **1551.0** | **83.3** | **40.4** | **92.9%** |
| Qwen2-VL-7B | VisionZip | 18 | 55.3 | 66.4 | 58.3 | 1443.8 | 71.7 | 33.9 | 81.3% |
| Qwen2-VL-7B | **VisCo** | **18** | **61.8** | **70.0** | **68.8** | **1496.5** | **81.7** | **39.2** | **90.4%** |
## π οΈ Installation
```bash
git clone https://github.com/Zyvpeng/VisCo.git
cd VisCo
conda create -n visco python=3.10 -y
conda activate visco
pip install --upgrade pip
pip install torch transformers peft datasets safetensors qwen-vl-utils
pip install flash-attn --no-build-isolation
```
The current implementation additionally uses `torch`, `transformers`, `peft`, `datasets`, `safetensors`, `qwen-vl-utils`, and FlashAttention for LLaVA.
## β‘ Quick Start
The case examples read `/home/ypzheng/VLM_ICAE/data/case/data.json`. Each item must provide `image` and `question` fields. Run commands from the repository parent so that `VisCo` is importable.
### Qwen2-VL case inference
```bash
cd /home/ypzheng
conda activate mmicae2
python -m VisCo.inference.case_qwen2 \
--model_name_or_path /home/ypzheng/Qwen2-VL-2B-Instruct \
--output_dir /path/to/qwen2_visco_checkpoint.pt \
--fixed_mem_size 18 \
--train false \
--per_device_train_batch_size 1
```
### LLaVA-1.5 case inference
```bash
cd /home/ypzheng
conda activate mmicae2
python -m VisCo.inference.case_llava15 \
--model_name_or_path /home/ypzheng/llava15 \
--output_dir /path/to/llava_visco_checkpoint.pt \
--fixed_mem_size 32 \
--train false \
--per_device_train_batch_size 1
```
`--output_dir` is used by the inference scripts as the checkpoint file path and is loaded with `torch.load`.
## π Training
Both training scripts fine-tune for one epoch on LLaVA-665K-style JSON data. Update the dataset path near the top of the selected script before launching. Qwen2-VL trains LoRA on `q_proj` and `v_proj`; LLaVA-1.5 trains LoRA on the attention `q/k/v/o` projections. Memory-token embeddings are learned jointly, while decoding reuses the shared backbone without the encoder LoRA adapters.
### Qwen2-VL-2B
```bash
cd /home/ypzheng
torchrun --nproc_per_node=1 -m VisCo.train.train_qwen2 \
--model_name_or_path /home/ypzheng/Qwen2-VL-2B-Instruct \
--output_dir /path/to/output/qwen2_visco \
--fixed_mem_size 18
```
### LLaVA-1.5-7B
```bash
cd /home/ypzheng
torchrun --nproc_per_node=8 -m VisCo.train.train_llava15 \
--model_name_or_path /home/ypzheng/llava15 \
--output_dir /path/to/output/llava_visco \
--fixed_mem_size 32
```
Training uses the tokenization/mapping functions and data collators in `utils/preprocess.py`, then delegates optimization and checkpointing to `train_model` in the same module.
## π§ͺ Evaluation
The released evaluation entry points cover MME for both backbones. They load the checkpoint passed through `--output_dir`, preprocess the benchmark with the matching backbone-specific mapping function, and report MME accuracy and accuracy+ scores.
```bash
# Qwen2-VL
python -m VisCo.inference.mme_qwen2 \
--model_name_or_path /home/ypzheng/Qwen2-VL-2B-Instruct \
--output_dir /path/to/qwen2_visco_checkpoint.pt \
--fixed_mem_size 18 \
--train false
# LLaVA-1.5
python -m VisCo.inference.mme_llava15 \
--model_name_or_path /home/ypzheng/llava15 \
--output_dir /path/to/llava_visco_checkpoint.pt \
--fixed_mem_size 32 \
--train false
```
The paper evaluates GQA, MMBench, MMBench-CN, MME, POPE, and MMVet. Additional benchmark entry points will be added as they are cleaned for release.
## π Citation
If you find this project useful, please cite:
```bibtex
@inproceedings{zheng2026visco,
title = {VisCo: Leveraging Large Language Models as Intrinsic Encoders for Visual Token Compression},
author = {Zheng, Yupeng and Zou, Kai and Liu, Bin and Yu, Nenghai},
booktitle = {Proceedings of the 34th ACM International Conference on Multimedia},
year = {2026}
}
```
## π Acknowledgements
This project builds on [LLaVA](https://github.com/haotian-liu/LLaVA), [Qwen2-VL](https://github.com/QwenLM/Qwen2-VL), [Hugging Face Transformers](https://github.com/huggingface/transformers).
|