PosterSentry Logo

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

Downloads last month
10
Inference Providers NEW
This model isn't deployed by any Inference Provider. πŸ™‹ Ask for provider support