Keras
Joblib
Safetensors
PyTorch
English
multimodal
document-classification
distilbert
efficientnet
late-fusion
rvl-cdip
tensorflow
scikit-learn
Instructions to use gonzalobosque/multimodal-document-intelligence with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Keras
How to use gonzalobosque/multimodal-document-intelligence with Keras:
# !pip install -U keras tensorflow huggingface_hub # Keras needs TensorFlow installed to read "hf://" paths, so the tensorflow backend is selected here; # "jax" and "torch" also work for computation once TensorFlow is installed. import os os.environ["KERAS_BACKEND"] = "tensorflow" import keras model = keras.saving.load_model("hf://gonzalobosque/multimodal-document-intelligence") - Notebooks
- Google Colab
- Kaggle
File size: 7,621 Bytes
84c9ebc | 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 | ---
language:
- en
tags:
- multimodal
- document-classification
- distilbert
- efficientnet
- late-fusion
- rvl-cdip
- pytorch
- tensorflow
- scikit-learn
license: other
---
# Multimodal Document Intelligence — Classifier Artifacts
This repository contains the trained runtime artifacts for the multimodal document classifier developed as part of the **Multimodal Document Intelligence** Master's Thesis project.
The classifier combines two independent branches:
- **DistilBERT** for OCR-derived document text;
- **EfficientNetB0** for the document image.
Each branch produces a probability distribution over the 16 RVL-CDIP classes. The 16 text probabilities are concatenated with the 16 image probabilities and passed to a **Logistic Regression late-fusion model**, which produces the final prediction.
The complete application, Docker runtime and deployment code are maintained separately at:
**https://github.com/gonzalobosque/multimodal-document-intelligence**
## Model overview
| Component | Role | Artifact |
| --- | --- | --- |
| DistilBERT | Text classification from OCR text | `text_model/` |
| EfficientNetB0 | Image classification | `image_model/model.keras` |
| Logistic Regression | Late fusion of both probability vectors | `fusion_logreg.joblib` |
| Class order | Canonical mapping between output indices and labels | `class_order.json` |
The text branch was fine-tuned from `distilbert-base-uncased` using its associated tokenizer.
The image branch was built from EfficientNetB0 initialized with ImageNet weights and fine-tuned for the 16 RVL-CDIP categories.
## Final evaluation
The final multimodal classifier was evaluated once on the held-out test partition after model and fusion selection had been completed.
| Metric | Result |
| --- | ---: |
| Macro-F1 | **0.9165** |
| Accuracy | **0.9166** |
| Valid test documents | **38,520** |
| Classes | **16** |
The held-out test partition was not used for model selection or final fusion fitting.
## Inference contract
These artifacts are intended to reproduce the inference pipeline used during evaluation. The following contracts should be preserved:
- OCR text is expected in English;
- DistilBERT input is truncated to a maximum of **512 tokens**;
- EfficientNetB0 receives **RGB images resized to 384 × 384**;
- the fusion model receives exactly **32 features**;
- fusion feature order is fixed: **16 text probabilities first, followed by 16 image probabilities**;
- class order must be loaded from `class_order.json`;
- changing preprocessing, probability order or class order requires revalidation.
The end-to-end application additionally performs OCR with Tesseract before running the text branch.
## Class order
The canonical class order is:
```json
[
"letter",
"form",
"email",
"handwritten",
"advertisement",
"scientific report",
"scientific publication",
"specification",
"file folder",
"news article",
"budget",
"invoice",
"presentation",
"questionnaire",
"resume",
"memo"
]
```
## Artifact structure
```text
.
├── README.md
├── checksums.sha256
├── class_order.json
├── fusion_logreg.joblib
├── image_model/
│ └── model.keras
└── text_model/
├── config.json
├── model.safetensors
├── special_tokens_map.json
├── tokenizer.json
├── tokenizer_config.json
└── vocab.txt
```
Only the artifacts required for classifier inference are included.
Training outputs, validation predictions, duplicate checkpoints and environment-specific files are intentionally excluded.
## Loading the artifacts
The individual components can be loaded with the same libraries used by the application:
```python
import json
import joblib
import tensorflow as tf
from transformers import AutoModelForSequenceClassification, AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("text_model")
text_model = AutoModelForSequenceClassification.from_pretrained("text_model")
image_model = tf.keras.models.load_model(
"image_model/model.keras",
compile=False,
)
fusion_model = joblib.load("fusion_logreg.joblib")
with open("class_order.json", "r", encoding="utf-8") as f:
class_order = json.load(f)
```
For the complete OCR, preprocessing, late-fusion and application workflow, use the companion GitHub repository rather than treating these files as a standalone inference package.
## Data provenance
The models were developed using **RVL-CDIP** document images together with OCR transcriptions associated with that corpus.
No RVL-CDIP source images are distributed in this repository.
No QS-OCR corpus files are distributed in this repository.
The semantic retrieval catalogue used by the wider application, `documents.parquet`, is also **not included**, because it contains dataset-derived OCR content.
This repository therefore contains trained classifier artifacts and small configuration files only.
## Scope and limitations
This is an **academic prototype**.
- Reported classification metrics apply to the RVL-CDIP domain.
- The classifier has not yet been systematically evaluated on documents from a different domain.
- OCR errors can affect the text branch.
- Some document classes remain more difficult to distinguish than others.
- The confidence returned by the late-fusion classifier should not be interpreted as a guarantee of correctness.
- These artifacts are not presented as a production-ready document-management system.
## Licensing and third-party material
This model repository is marked **`license: other`** because the artifact bundle has mixed provenance and should not be represented as if a single permissive license automatically covered every upstream component and training source.
Third-party models, pretrained weights, datasets and document content remain subject to their respective original terms.
In particular:
- the DistilBERT branch was fine-tuned from `distilbert-base-uncased`;
- the EfficientNetB0 branch was initialized from ImageNet-pretrained weights;
- the training corpus is based on RVL-CDIP and OCR-derived text associated with that corpus;
- source dataset documents and the semantic catalogue are not redistributed here.
This repository does **not** grant rights over RVL-CDIP documents, QS-OCR corpus content or other third-party material.
The source code for the maintained application is distributed separately in the companion GitHub repository; its licensing is handled there.
## SHA-256 checksums
The runtime artifacts in this release can be verified against `checksums.sha256`.
| File | SHA-256 |
| --- | --- |
| `text_model/model.safetensors` | `0f816dce4aa40df26bdd528ffdd5beee076c0515099de27447aae52f952ef7e2` |
| `text_model/config.json` | `274ccddb3b1c4841de147df99c1d82c5f678767dd96015f52babeb461bdddba8` |
| `text_model/tokenizer_config.json` | `a3c9410f27554c6e26af779fd147e536c6c5f9e5cb0e6b8f38ddaa25e1b0f6af` |
| `text_model/special_tokens_map.json` | `b6d346be366a7d1d48332dbc9fdf3bf8960b5d879522b7799ddba59e76237ee3` |
| `text_model/tokenizer.json` | `435667fab0c06c165b1283ecb422497c37124f2d6a35b2ac73dc876332fc9518` |
| `text_model/vocab.txt` | `07eced375cec144d27c900241f3e339478dec958f92fddbc551f295c992038a3` |
| `image_model/model.keras` | `f46c30bedc0761f270af41a3e260352787ac5327d0e3abd971c24416e5e98eb5` |
| `fusion_logreg.joblib` | `fab7d8dc6cb13568c8b93d7fd4ddba1b77f86e7a5c625f83c7183579601991c0` |
| `class_order.json` | `fc573a380d8a9cbb635a81edb60d20b3b0b42646d7293316b3bc1911cac005e6` |
## Author
**Gonzalo Bosque Rodríguez**
Master's Thesis in Artificial Intelligence, 2026.
|