CoolFace
Modelpublic

mapo80/DeQA-Doc-Overall

sourceHugging Faceapache-2.0updated 9mo agoView on Hugging Face
0likes170downloads
Model Card

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:

ModelDescriptionHuggingFace
DeQA-Doc-OverallOverall document quality (this model)mapo80/DeQA-Doc-Overall
DeQA-Doc-ColorColor quality assessmentmapo80/DeQA-Doc-Color
DeQA-Doc-SharpnessSharpness/clarity assessmentmapo80/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 RangeQuality LevelDescription
4.5 - 5.0ExcellentPerfect quality, no visible defects
3.5 - 4.5GoodMinor imperfections, highly readable
2.5 - 3.5FairNoticeable issues but still usable
1.5 - 2.5PoorSignificant quality problems
1.0 - 1.5BadSevere 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

PropertyValue
Model Size~16 GB (float16)
Parameters~7.2B
InputRGB images (any resolution)
OutputQuality score (1.0 - 5.0)
Inference~2-3 seconds per image on A100

Hardware Requirements

SetupVRAM RequiredRecommended
Full precision (fp32)~32 GBA100, H100
Half precision (fp16)~16 GBA100, A40, RTX 4090
With CPU offload~8 GB GPU + RAMRTX 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

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

License

Apache 2.0

Related Models