|
|
--- |
|
|
license: apache-2.0 |
|
|
language: |
|
|
- en |
|
|
tags: |
|
|
- image-quality-assessment |
|
|
- document-quality |
|
|
- mplug-owl2 |
|
|
- vision-language |
|
|
- document-analysis |
|
|
- IQA |
|
|
pipeline_tag: image-to-text |
|
|
library_name: transformers |
|
|
--- |
|
|
|
|
|
# DeQA-Doc-Overall: Document Image Quality Assessment |
|
|
|
|
|
**DeQA-Doc-Overall** is a vision-language model for assessing the **overall quality** of document images. It provides a quality score from 1 (bad) to 5 (excellent) that reflects the general visual quality of scanned or photographed documents. |
|
|
|
|
|
## Model Family |
|
|
|
|
|
This model is part of the **DeQA-Doc** family, which includes three specialized models: |
|
|
|
|
|
| Model | Description | HuggingFace | |
|
|
|-------|-------------|-------------| |
|
|
| **DeQA-Doc-Overall** | Overall document quality (this model) | [mapo80/DeQA-Doc-Overall](https://huggingface.co/mapo80/DeQA-Doc-Overall) | |
|
|
| **DeQA-Doc-Color** | Color quality assessment | [mapo80/DeQA-Doc-Color](https://huggingface.co/mapo80/DeQA-Doc-Color) | |
|
|
| **DeQA-Doc-Sharpness** | Sharpness/clarity assessment | [mapo80/DeQA-Doc-Sharpness](https://huggingface.co/mapo80/DeQA-Doc-Sharpness) | |
|
|
|
|
|
## Quick Start |
|
|
|
|
|
```python |
|
|
import torch |
|
|
from transformers import AutoModelForCausalLM |
|
|
from PIL import Image |
|
|
|
|
|
# Load the model |
|
|
model = AutoModelForCausalLM.from_pretrained( |
|
|
"mapo80/DeQA-Doc-Overall", |
|
|
trust_remote_code=True, |
|
|
torch_dtype=torch.float16, |
|
|
device_map="auto", |
|
|
) |
|
|
|
|
|
# Score an image |
|
|
image = Image.open("document.jpg").convert("RGB") |
|
|
score = model.score([image]) |
|
|
print(f"Overall Quality Score: {score.item():.2f} / 5.0") |
|
|
``` |
|
|
|
|
|
## Batch Processing |
|
|
|
|
|
You can score multiple images at once: |
|
|
|
|
|
```python |
|
|
images = [ |
|
|
Image.open("doc1.jpg").convert("RGB"), |
|
|
Image.open("doc2.jpg").convert("RGB"), |
|
|
Image.open("doc3.jpg").convert("RGB"), |
|
|
] |
|
|
|
|
|
scores = model.score(images) |
|
|
for i, score in enumerate(scores): |
|
|
print(f"Document {i+1}: {score.item():.2f} / 5.0") |
|
|
``` |
|
|
|
|
|
## Score Interpretation |
|
|
|
|
|
| Score Range | Quality Level | Description | |
|
|
|-------------|---------------|-------------| |
|
|
| 4.5 - 5.0 | **Excellent** | Perfect quality, no visible defects | |
|
|
| 3.5 - 4.5 | **Good** | Minor imperfections, highly readable | |
|
|
| 2.5 - 3.5 | **Fair** | Noticeable issues but still usable | |
|
|
| 1.5 - 2.5 | **Poor** | Significant quality problems | |
|
|
| 1.0 - 1.5 | **Bad** | Severe degradation, hard to read | |
|
|
|
|
|
## Model Architecture |
|
|
|
|
|
- **Base Model**: mPLUG-Owl2 (LLaMA2-7B + ViT-L Vision Encoder) |
|
|
- **Vision Encoder**: CLIP ViT-L/14 (1024 visual tokens via Visual Abstractor) |
|
|
- **Language Model**: LLaMA2-7B |
|
|
- **Training**: Full fine-tuning on document quality datasets |
|
|
- **Input Resolution**: Images are resized to 448x448 (with aspect ratio preservation) |
|
|
|
|
|
## Technical Details |
|
|
|
|
|
| Property | Value | |
|
|
|----------|-------| |
|
|
| Model Size | ~16 GB (float16) | |
|
|
| Parameters | ~7.2B | |
|
|
| Input | RGB images (any resolution) | |
|
|
| Output | Quality score (1.0 - 5.0) | |
|
|
| Inference | ~2-3 seconds per image on A100 | |
|
|
|
|
|
## Hardware Requirements |
|
|
|
|
|
| Setup | VRAM Required | Recommended | |
|
|
|-------|---------------|-------------| |
|
|
| Full precision (fp32) | ~32 GB | A100, H100 | |
|
|
| Half precision (fp16) | ~16 GB | A100, A40, RTX 4090 | |
|
|
| With CPU offload | ~8 GB GPU + RAM | RTX 3090, RTX 4080 | |
|
|
|
|
|
### GPU Inference (Recommended) |
|
|
|
|
|
```python |
|
|
model = AutoModelForCausalLM.from_pretrained( |
|
|
"mapo80/DeQA-Doc-Overall", |
|
|
trust_remote_code=True, |
|
|
torch_dtype=torch.float16, |
|
|
device_map="auto", |
|
|
) |
|
|
``` |
|
|
|
|
|
### CPU Offload (Lower VRAM) |
|
|
|
|
|
```python |
|
|
model = AutoModelForCausalLM.from_pretrained( |
|
|
"mapo80/DeQA-Doc-Overall", |
|
|
trust_remote_code=True, |
|
|
torch_dtype=torch.float16, |
|
|
device_map="auto", |
|
|
offload_folder="/tmp/offload", |
|
|
) |
|
|
``` |
|
|
|
|
|
## Installation |
|
|
|
|
|
```bash |
|
|
pip install torch transformers accelerate pillow sentencepiece protobuf |
|
|
``` |
|
|
|
|
|
**Note**: Use `transformers>=4.36.0` for best compatibility. |
|
|
|
|
|
## Use Cases |
|
|
|
|
|
- **Document Scanning QA**: Automatically flag low-quality scans for re-scanning |
|
|
- **Archive Digitization**: Prioritize documents needing restoration |
|
|
- **OCR Preprocessing**: Filter images likely to produce poor OCR results |
|
|
- **Document Management**: Sort and categorize documents by quality |
|
|
- **Quality Control**: Automated quality checks in document processing pipelines |
|
|
|
|
|
## Example: Quality-Based Filtering |
|
|
|
|
|
```python |
|
|
import torch |
|
|
from transformers import AutoModelForCausalLM |
|
|
from PIL import Image |
|
|
from pathlib import Path |
|
|
|
|
|
model = AutoModelForCausalLM.from_pretrained( |
|
|
"mapo80/DeQA-Doc-Overall", |
|
|
trust_remote_code=True, |
|
|
torch_dtype=torch.float16, |
|
|
device_map="auto", |
|
|
) |
|
|
|
|
|
# Filter documents by quality |
|
|
def filter_by_quality(image_paths, min_score=3.0): |
|
|
good_docs = [] |
|
|
bad_docs = [] |
|
|
|
|
|
for path in image_paths: |
|
|
img = Image.open(path).convert("RGB") |
|
|
score = model.score([img]).item() |
|
|
|
|
|
if score >= min_score: |
|
|
good_docs.append((path, score)) |
|
|
else: |
|
|
bad_docs.append((path, score)) |
|
|
|
|
|
return good_docs, bad_docs |
|
|
|
|
|
# Usage |
|
|
docs = list(Path("documents/").glob("*.jpg")) |
|
|
good, bad = filter_by_quality(docs, min_score=3.5) |
|
|
|
|
|
print(f"Good quality: {len(good)} documents") |
|
|
print(f"Need review: {len(bad)} documents") |
|
|
``` |
|
|
|
|
|
## Limitations |
|
|
|
|
|
- Optimized for document images (forms, letters, reports, etc.) |
|
|
- May not perform well on natural photos or artistic images |
|
|
- Requires GPU with sufficient VRAM for efficient inference |
|
|
- Score is subjective and based on training data distribution |
|
|
|
|
|
## Credits & Attribution |
|
|
|
|
|
This model is based on the **DeQA-Doc** project by Junjie Gao et al., which won the **Championship** in the VQualA 2025 DIQA (Document Image Quality Assessment) Challenge. |
|
|
|
|
|
**Original Repository**: [https://github.com/Junjie-Gao19/DeQA-Doc](https://github.com/Junjie-Gao19/DeQA-Doc) |
|
|
|
|
|
All credit for the research, training methodology, and model architecture goes to the original authors. |
|
|
|
|
|
## Citation |
|
|
|
|
|
If you use this model in your research, please cite the original paper: |
|
|
|
|
|
```bibtex |
|
|
@inproceedings{deqadoc, |
|
|
title={{DeQA-Doc}: Adapting {DeQA-Score} to Document Image Quality Assessment}, |
|
|
author={Gao, Junjie and Liu, Runze and Peng, Yingzhe and Yang, Shujian and Zhang, Jin and Yang, Kai and You, Zhiyuan}, |
|
|
booktitle={Proceedings of the IEEE/CVF International Conference on Computer Vision Workshop}, |
|
|
year={2025}, |
|
|
} |
|
|
``` |
|
|
|
|
|
**ArXiv**: [https://arxiv.org/abs/2507.12796](https://arxiv.org/abs/2507.12796) |
|
|
|
|
|
## License |
|
|
|
|
|
Apache 2.0 |
|
|
|
|
|
## Related Models |
|
|
|
|
|
- [DeQA-Doc-Color](https://huggingface.co/mapo80/DeQA-Doc-Color) - Color quality assessment |
|
|
- [DeQA-Doc-Sharpness](https://huggingface.co/mapo80/DeQA-Doc-Sharpness) - Sharpness assessment |
|
|
|