Instructions to use fairdataihub/poster-sentry with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Model2Vec
How to use fairdataihub/poster-sentry with Model2Vec:
from model2vec import StaticModel model = StaticModel.from_pretrained("fairdataihub/poster-sentry") - Notebooks
- Google Colab
- Kaggle
PosterSentry: Multimodal Scientific Poster Classifier
Model Description
PosterSentry is a lightweight, CPU-optimized multimodal classifier that determines whether a PDF is a scientific poster or a non-poster (paper, proceedings, newsletter, abstract book, etc.).
Part of the quality control pipeline for posters.science, a platform for making scientific conference posters Findable, Accessible, Interoperable, and Reusable (FAIR).
Developed by the FAIR Data Innovations Hub at the California Medical Innovations Institute (CalMIΒ²).
Version
| Version | Date | Notes |
|---|---|---|
| 1.0.0 | 2026-08-18 | Head trained on the human-validated corpus: 3,381 documents labeled by a three-reviewer survey (Krippendorff's alpha 0.79) with blinded adjudication of the 439 contested documents. This is the model reported in the PosterSentry paper. |
Earlier unversioned weights (April 2026) were trained on heuristically labeled data and are superseded; they remain available in the repository history.
Related Models & Tools
| Resource | Description | Link |
|---|---|---|
| PosterSentry | Multimodal poster classifier (this model) | fairdataihub/poster-sentry |
| poster-sentry | Installable classifier package | GitHub |
| poster-sentry-training | Training code and replication | GitHub |
| poster-sentry-training-data | Human-validated training dataset (3,381 samples) | HuggingFace |
| poster-sentry-evaluation-paper-code | Reproducible analysis for the paper | GitHub |
| Llama-3.1-8B-Poster-Extraction | Poster β structured JSON extraction | fairdataihub/Llama-3.1-8B-Poster-Extraction |
| poster2json | Python library for poster extraction | PyPI Β· Docs Β· GitHub |
| poster-json-schema | DataCite-based poster metadata schema | GitHub |
| Platform | posters.science | posters.science |
Pipeline Position
PosterSentry sits at the front of the posters.science pipeline. It screens incoming PDFs before the expensive Llama-based extraction:
PDF Input
β
βΌ
ββββββββββββββββ βββββββββββββββββββββββββββββββββββββ ββββββββββββββββ
β PosterSentry β βββΊ β Llama-3.1-8B-Poster-Extraction β βββΊ β poster2json β
β (classify) β β (extract structured metadata) β β (validate) β
ββββββββββββββββ βββββββββββββββββββββββββββββββββββββ ββββββββββββββββ
poster? β raw text β JSON schema FAIR output
Architecture
Three feature channels concatenated into a 542-dimensional vector, fed to a single LogisticRegression:
| Channel | Features | Dimension | Signal |
|---|---|---|---|
| Text | model2vec (potion-base-32M) embedding | 512 | Semantic content |
| Visual | Color stats, edge density, FFT spatial complexity, whitespace | 15 | Visual layout |
| Structural | Page count, area, font diversity, text blocks, density | 15 | PDF geometry |
Each classifier head is a single linear layer stored as a numpy .npz file (10 KB). Inference is pure numpy, no torch required at prediction time.
Performance
Evaluated against human-validated labels (three-reviewer survey with blinded adjudication of contested documents):
| Metric | Value |
|---|---|
| Held-out accuracy (508 documents) | 90.2% (95% CI 87.3 to 92.5) |
| Macro F1 (held-out) | 0.902 |
| Precision / Recall / F1 (poster) | 0.895 / 0.909 / 0.902 |
| Precision / Recall / F1 (non-poster) | 0.908 / 0.894 / 0.901 |
| Out-of-fold accuracy (all 3,381 documents, 5-fold) | 89.0% (95% CI 87.9 to 90.0) |
| Inference speed | ~300 docs/sec (CPU) |
Errors concentrate where the human panel itself divided: out-of-fold agreement is 91.8% on documents the panel rated unanimously and 71.4% on documents decided two to one.
Top Features by Importance
Standardized logistic regression coefficients of the trained head (positive pushes toward poster):
| Rank | Feature | Coefficient | Signal |
|---|---|---|---|
| 1 | page_width_pt |
+2.65 | Posters are physically wide |
| 2 | img_width |
+2.65 | Large rendered width |
| 3 | edge_density |
+2.32 | Visually busy layouts |
| 4 | color_diversity |
+2.14 | Posters are visually rich |
| 5 | avg_font_size |
-1.94 | Papers use body text sizes |
| 6 | size_per_page_kb |
+1.89 | Dense, high-resolution single pages |
| 7 | page_count |
-1.44 | More pages pushes away from poster |
| 8 | file_size_kb |
-1.21 | Multi-page documents are bigger overall |
| 9 | white_space_ratio |
-1.19 | Sparse pages are not posters |
| 10 | text_block_count |
+1.17 | Multi-column poster layouts |
Structural and visual cues carry most of the decision; four embedding dimensions appear among the fifteen largest coefficients.
Training Data
Trained on 3,381 documents with human-validated labels, zero synthetic data:
| Class | Count | Label provenance |
|---|---|---|
| Poster | 1,686 | Three-reviewer survey; unanimous panel label or blinded adjudication |
| Non-poster | 1,695 | Three-reviewer survey; unanimous panel label or blinded adjudication |
Three reviewers independently rated all 3,570 candidate documents (inter-rater Krippendorff's alpha 0.79); the 439 documents without a unanimous panel were settled in a blinded adjudication review. After removing 182 near-duplicate documents and 7 with unavailable PDFs, the remaining 3,381 form the training corpus. Applied to the full corpus of 30,195 readable repository PDFs labeled as posters, PosterSentry classifies 77.2% as posters: more than one in five records labeled as posters is something else.
Training data: fairdataihub/poster-sentry-training-data
Usage
Python API
from poster_sentry import PosterSentry
sentry = PosterSentry()
sentry.initialize()
# Classify a PDF (uses text + visual + structural features)
result = sentry.classify("document.pdf")
print(f"Is poster: {result['is_poster']}, Confidence: {result['confidence']:.2f}")
# {'is_poster': True, 'confidence': 0.97, 'path': 'document.pdf'}
# Batch classification
results = sentry.classify_batch(["poster1.pdf", "paper.pdf", "newsletter.pdf"])
Installation
pip install git+https://github.com/fairdataihub/poster-repo-qc.git
# Or install from source
git clone https://github.com/fairdataihub/poster-repo-qc.git
cd poster-repo-qc
pip install -e ".[train]"
Training
python scripts/train_poster_sentry.py --n-per-class 2000
Training completes in ~40 minutes on CPU (PDF rendering is the bottleneck, not the classifier).
Model Specifications
| Attribute | Value |
|---|---|
| Embedding backbone | minishlab/potion-base-32M (model2vec StaticModel) |
| Embedding dimension | 512 |
| Visual features | 15 (color, edge, FFT, whitespace) |
| Structural features | 15 (page geometry, fonts, text blocks) |
| Total input dimension | 542 |
| Classifier | LogisticRegression (sklearn) + StandardScaler |
| Head file size | 10 KB (.npz) |
| Precision | float32 |
| GPU required | No (CPU-only) |
| License | MIT |
System Requirements
- CPU: Any modern CPU (no GPU needed)
- RAM: β₯4GB
- Python: β₯3.10
- Dependencies: numpy, model2vec, scikit-learn, PyMuPDF, Pillow
Citation
@software{poster_sentry_2026,
title = {PosterSentry: Multimodal Scientific Poster Classifier},
author = {O'Neill, Jamey and Portillo, Dorian and Zeinali, Nahid and Soundarajan, Sanjay and Blake, Gerard and Sarin, Parth and Buttrick, Adam and Patel, Bhavesh},
year = {2026},
version = {1.0.0},
url = {https://huggingface.co/fairdataihub/poster-sentry},
note = {Part of the posters.science initiative}
}
License
This model is released under the MIT License.
Acknowledgments
- FAIR Data Innovations Hub at California Medical Innovations Institute (CalMIΒ²)
- posters.science platform
- MinishLab for the model2vec embedding backbone
- HuggingFace for model hosting infrastructure
- Funded by The Navigation Fund (10.71707/rk36-9x79), "Poster Sharing and Discovery Made Easy"
- Downloads last month
- 10