115,293 illustrated pages from scanned volumes of the Encyclopaedia Britannica, 1st edition (1768–71) to 14th (1929), selected by a page classifier from 975,345 pages in 1,160 volumes (838 Internet Archive items). A second config carries the classifier score, OCR word count and provenance for every one of the 975,345 pages.
Two things the scan showed:
| 1797 · 3rd ed. · plate | 1853 · 8th ed. · text page (Palaeontology) | 1922 · 11th ed. · text page (Lamellibranchia) |
|---|---|---|
![]() | ![]() | ![]() |
| source page on IA | source page on IA | source page on IA |
Each image links to the same page in the Internet Archive's viewer (ia_page_url).
Scored pages per edition and the share the classifier flagged as illustrated. Edition labels
come from the IA catalogue record where it names one, else are inferred from the year
(edition_inferred = true); 8% of pages have neither.
| edition | years | volumes | pages scored | illustrated | % |
|---|---|---|---|---|---|
| 1st | 1768–73 | 18 | 16,036 | 1,446 | 9.0 |
| 2nd | 1778 | 11 | 9,739 | 389 | 4.0 |
| 3rd (+supp.) | 1788–1803 | 114 | 95,454 | 3,556 | 3.7 |
| 4th | 1810 | 94 | 51,317 | 1,757 | 3.4 |
| 5th | 1815–17 | 22 | 18,935 | 732 | 3.9 |
| 6th (+supp.) | 1823–24 | 76 | 66,815 | 2,499 | 3.7 |
| 7th | 1830–42 | 57 | 34,564 | 3,273 | 9.5 |
| 8th | 1853–60 | 36 | 26,792 | 3,010 | 11.2 |
| 9th | 1875–1902 | 162 | 124,630 | 20,217 | 16.2 |
| 10th | 1902–03 | 39 | 28,277 | 5,183 | 18.3 |
| 11th | 1910–22 | 335 | 338,051 | 50,844 | 15.0 |
| 12th | 1922–23 | 63 | 66,005 | 9,695 | 14.7 |
| 13th | 1926 | 7 | 9,570 | 988 | 10.3 |
| 14th | 1929 | 16 | 7,973 | 1,933 | 24.2 |
| no label | — | 110 | 81,187 | 9,771 | 12.0 |
The 1st-edition rate (9.0%) is inflated by the NLS 1771 scans, where the copperplates are bound together and score at 24%; the 1773 printing scores 5%. The 14th-edition figure rests on 16 volumes. Copies of the same edition from different libraries are all counted — the volume counts are scanned volumes, not distinct volumes.
| config | rows | contents |
|---|---|---|
pages | 115,293 | pages predicted illustrated: embedded 600px JPEG + metadata (~9.6 GB) |
manifest | 975,345 | every scored page: score, word count, provenance — no images (~120 MB) |
manifest is the one to re-threshold, compute rates per edition or decade, or build your own
split from; pages is the one to browse or train on.
Both configs share:
| column | what |
|---|---|
ia_id, volume, page | source triple: IA item, volume file stem, 1-indexed page |
p_illustrated | classifier probability the page carries an illustration |
words | word count from the IA djvu.xml OCR layer (−1 = no OCR for the page) |
stratum | text (≥100 words) or low (<100) — the two thresholds below key off this |
tier | storage tier at scan time: text = 600px JPEG, low = original scan bytes |
edition, edition_inferred | edition label; true when inferred from year rather than the catalogue record |
year, year_raw | first 17xx/18xx/19xx in the IA date (null for 9% of pages); the raw IA string |
title, contributor | IA item title and contributing library (blank for a third of items) |
ia_url, ia_page_url | the IA item, and the exact page in IA's viewer (/details/<item>/<volume>/page/nN — the volume segment matters: 19 items hold up to 22 volumes each) |
bucket_url, file_key | the full-resolution original in the HF bucket (pages rows only) |
order_repaired | true where page numbers were re-bound after an image-order/OCR-order mismatch (see Method) |
pages adds image. manifest adds stored (whether the page made it into pages),
src_archive, src_djvu, sha256, model, run_id, licenseurl, source_manifest.
tier and stratum disagree on ~10k pages. The tier was fixed when the page was stored; the
stratum was recomputed from the correct word count after the page-order repair. Use stratum.
Every page of every volume was decoded from the IA _jp2.zip / _images.zip masters and scored
by davanstrien/britannica-illustrated-detector
(timm efficientvit_b1.r256_in1k, 7.5M parameters) on Hugging Face Jobs
— 16 cpu-performance shards reading the scans from an HF bucket, ~$3 total.
The classifier itself was trained on Jobs (a10g-small, ~5 min). The
classifier was trained on the National Library of Scotland's 2,573-page
encyclopaedia_britannica_illustrated
labels.
Thresholds were set on 347 human-labelled pages from this corpus, in two samples:
| stratum | threshold | validation |
|---|---|---|
text (≥100 words) | 0.90 | 175 pages: precision 1.000, recall 1.000 |
low (<100 words) | 0.982 | 172 pages: precision 1.000, recall 0.87 |
Recall on low-word pages is the weaker number: the misses were all near-threshold (0.91–0.98).
Re-threshold from manifest if you want recall over precision.
Page order. For 242 volumes the image order inside the zip did not match the OCR order, so
page numbers and word counts had been mis-bound. Those rows were re-bound via the zip
central-directory permutation and verified against djvu page geometry (order_repaired = true
on 640k rows, most of them no-ops). file_key keeps the original ordinal.
All page images are scans held by the Internet Archive, contributed by libraries including the
National Library of Scotland, University of California Libraries, Cornell, Harvard, the Getty
Research Institute, the Bavarian State Library and the Digital Library of India — see
contributor and ia_url per row. The volumes were published 1768–1929 and are public domain
in the US by publication date. IA item-level licence fields vary (Public Domain Mark, CC-BY on
some third-party uploads, blank); the underlying works are out of copyright regardless.
Attribute the contributing library where one is named.
The IA "Britannica" search that seeded the mirror also returned items that are not pre-1930
encyclopaedia volumes. 8 were removed in v1.1 — two of them in copyright (Great Books of the
Western World, 1952; Book of the Year 1938) that had passed a year-based screen because
their IA records carry no date. The list with reasons is in
curation/dropped_items.json. 2 of 1,162 volumes are missing
(corrupt source archives).
year is null for 9% of pages (IA date blank or non-numeric — year_raw keeps the string).contributor is blank for a third of items.edition + volume if you need one copy per volume.from datasets import load_dataset
# scores + provenance for every page, no images (~120 MB)
manifest = load_dataset("biglam/britannica-illustrated-pages", "manifest", split="train")
# the illustrated pages with images (~9.6 GB) — stream unless you want all of it
pages = load_dataset("biglam/britannica-illustrated-pages", "pages", split="train", streaming=True)
row = next(iter(pages))
row["image"], row["edition"], row["ia_page_url"]
Cite the Internet Archive item (ia_url) and contributing library for the scans, and the
National Library of Scotland
for the training labels. Classifier, scan and curation by Daniel van Strien
(Machine Learning Librarian, Hugging Face); published under BigLAM, the
BigScience/Hugging Face initiative for libraries, archives and museums data.
Every row links to its page in the public bucket biglam/britannica. This is the quickest way to get the full-resolution scan — no archive.org round-trip:
bucket_url — the full-resolution original (source/pages/<ia_id>/<member>.jp2, straight from the Internet Archive item)bucket_url_jpg — a 2000 px JPEG of the same page (source/jpg/…), for browsers and quick loadingleaf — the IA leaf number of the page; ia_page_url opens the same page on archive.orgThe image column embedded in this dataset is a 600 px thumbnail. Every row was matched to its page by comparing that thumbnail with the bucket image (grey-level correlation ≥ 0.99) before the links were written; the match for every row is recorded in the bucket's manifest/rowmap-*.jsonl.
crop_masks config)Instance boxes and masks for the illustrations on every page of this dataset, predicted by small-models-for-glam/britannica-illustration-detector-seg-v2 (RF-DETR Seg small, 29M parameters). One row per page, joinable on file_key; 115,293 rows, 700,480 instances at score ≥ 0.10, 411,385 at ≥ 0.30.
Each row carries objects (index-aligned lists: bbox as [x, y, w, h] px, score, area, rectangularity) and masks_rle (a JSON string of COCO RLE dicts in the same order). The frame is the full-resolution original (src_width × src_height, the image at bucket_url), not the embedded thumbnail; to use them on the 2000 px JPEG (bucket_url_jpg) scale by jpg_width / src_width.
Filter by score before use. Predictions are stored down to 0.10 so that consumers choose the operating point; 0.3 is a sensible display default (on a VLM-judged 78-page sample, instances between 0.25 and 0.30 were still ~97 % illustrations). Masks are the raw model output and sit slightly inside the drawn edges; for cut-outs, dilate by ~2 % of the box size:
import json
from datasets import load_dataset
from pycocotools import mask as maskutil
from scipy import ndimage
masks = load_dataset("biglam/britannica-illustrated-pages", "crop_masks", split="train")
row = masks[0]
rles = json.loads(row["masks_rle"])
keep = [i for i, s in enumerate(row["objects"]["score"]) if s >= 0.3]
m = maskutil.decode(rles[keep[0]]) # H x W, full-resolution frame
x, y, w, h = row["objects"]["bbox"][keep[0]]
m = ndimage.binary_dilation(m, iterations=round(0.02 * max(w, h)))
Join against the page metadata with DuckDB, no image bytes fetched:
import duckdb
duckdb.sql("""
SELECT p.file_key, p.edition, p.year, p.bucket_url, m.objects, m.masks_rle
FROM 'hf://datasets/biglam/britannica-illustrated-pages/pages/*.parquet' p
JOIN 'hf://datasets/biglam/britannica-illustrated-pages/crop_masks/*.parquet' m USING (file_key)
""")
Masks are not clipped to their boxes: they normally sit inside the box, but low-score instances can extend beyond it — clip to bbox if you need the two to agree. Known limits: small in-text line diagrams are sometimes missed (about 6 % of illustrated pages had no detection at all on the judged sample); dense plates can merge neighbouring figures. Every row is stamped with model_id and model_sha.
3 commits
115,293 illustrated pages from scanned volumes of the Encyclopaedia Britannica, 1st edition (1768–71) to 14th (1929), selected by a page classifier from 975,345 pages in 1,160 volumes (838 Internet Archive items). A second config carries the classifier score, OCR word count and provenance for every one of the 975,345 pages.
Two things the scan showed:
| 1797 · 3rd ed. · plate | 1853 · 8th ed. · text page (Palaeontology) | 1922 · 11th ed. · text page (Lamellibranchia) |
|---|---|---|
![]() | ![]() | ![]() |
| source page on IA | source page on IA | source page on IA |
Each image links to the same page in the Internet Archive's viewer (ia_page_url).
Scored pages per edition and the share the classifier flagged as illustrated. Edition labels
come from the IA catalogue record where it names one, else are inferred from the year
(edition_inferred = true); 8% of pages have neither.
| edition | years | volumes | pages scored | illustrated | % |
|---|---|---|---|---|---|
| 1st | 1768–73 | 18 | 16,036 | 1,446 | 9.0 |
| 2nd | 1778 | 11 | 9,739 | 389 | 4.0 |
| 3rd (+supp.) | 1788–1803 | 114 | 95,454 | 3,556 | 3.7 |
| 4th | 1810 | 94 | 51,317 | 1,757 | 3.4 |
| 5th | 1815–17 | 22 | 18,935 | 732 | 3.9 |
| 6th (+supp.) | 1823–24 | 76 | 66,815 | 2,499 | 3.7 |
| 7th | 1830–42 | 57 | 34,564 | 3,273 | 9.5 |
| 8th | 1853–60 | 36 | 26,792 | 3,010 | 11.2 |
| 9th | 1875–1902 | 162 | 124,630 | 20,217 | 16.2 |
| 10th | 1902–03 | 39 | 28,277 | 5,183 | 18.3 |
| 11th | 1910–22 | 335 | 338,051 | 50,844 | 15.0 |
| 12th | 1922–23 | 63 | 66,005 | 9,695 | 14.7 |
| 13th | 1926 | 7 | 9,570 | 988 | 10.3 |
| 14th | 1929 | 16 | 7,973 | 1,933 | 24.2 |
| no label | — | 110 | 81,187 | 9,771 | 12.0 |
The 1st-edition rate (9.0%) is inflated by the NLS 1771 scans, where the copperplates are bound together and score at 24%; the 1773 printing scores 5%. The 14th-edition figure rests on 16 volumes. Copies of the same edition from different libraries are all counted — the volume counts are scanned volumes, not distinct volumes.
| config | rows | contents |
|---|---|---|
pages | 115,293 | pages predicted illustrated: embedded 600px JPEG + metadata (~9.6 GB) |
manifest | 975,345 | every scored page: score, word count, provenance — no images (~120 MB) |
manifest is the one to re-threshold, compute rates per edition or decade, or build your own
split from; pages is the one to browse or train on.
Both configs share:
| column | what |
|---|---|
ia_id, volume, page | source triple: IA item, volume file stem, 1-indexed page |
p_illustrated | classifier probability the page carries an illustration |
words | word count from the IA djvu.xml OCR layer (−1 = no OCR for the page) |
stratum | text (≥100 words) or low (<100) — the two thresholds below key off this |
tier | storage tier at scan time: text = 600px JPEG, low = original scan bytes |
edition, edition_inferred | edition label; true when inferred from year rather than the catalogue record |
year, year_raw | first 17xx/18xx/19xx in the IA date (null for 9% of pages); the raw IA string |
title, contributor | IA item title and contributing library (blank for a third of items) |
ia_url, ia_page_url | the IA item, and the exact page in IA's viewer (/details/<item>/<volume>/page/nN — the volume segment matters: 19 items hold up to 22 volumes each) |
bucket_url, file_key | the full-resolution original in the HF bucket (pages rows only) |
order_repaired | true where page numbers were re-bound after an image-order/OCR-order mismatch (see Method) |
pages adds image. manifest adds stored (whether the page made it into pages),
src_archive, src_djvu, sha256, model, run_id, licenseurl, source_manifest.
tier and stratum disagree on ~10k pages. The tier was fixed when the page was stored; the
stratum was recomputed from the correct word count after the page-order repair. Use stratum.
Every page of every volume was decoded from the IA _jp2.zip / _images.zip masters and scored
by davanstrien/britannica-illustrated-detector
(timm efficientvit_b1.r256_in1k, 7.5M parameters) on Hugging Face Jobs
— 16 cpu-performance shards reading the scans from an HF bucket, ~$3 total.
The classifier itself was trained on Jobs (a10g-small, ~5 min). The
classifier was trained on the National Library of Scotland's 2,573-page
encyclopaedia_britannica_illustrated
labels.
Thresholds were set on 347 human-labelled pages from this corpus, in two samples:
| stratum | threshold | validation |
|---|---|---|
text (≥100 words) | 0.90 | 175 pages: precision 1.000, recall 1.000 |
low (<100 words) | 0.982 | 172 pages: precision 1.000, recall 0.87 |
Recall on low-word pages is the weaker number: the misses were all near-threshold (0.91–0.98).
Re-threshold from manifest if you want recall over precision.
Page order. For 242 volumes the image order inside the zip did not match the OCR order, so
page numbers and word counts had been mis-bound. Those rows were re-bound via the zip
central-directory permutation and verified against djvu page geometry (order_repaired = true
on 640k rows, most of them no-ops). file_key keeps the original ordinal.
All page images are scans held by the Internet Archive, contributed by libraries including the
National Library of Scotland, University of California Libraries, Cornell, Harvard, the Getty
Research Institute, the Bavarian State Library and the Digital Library of India — see
contributor and ia_url per row. The volumes were published 1768–1929 and are public domain
in the US by publication date. IA item-level licence fields vary (Public Domain Mark, CC-BY on
some third-party uploads, blank); the underlying works are out of copyright regardless.
Attribute the contributing library where one is named.
The IA "Britannica" search that seeded the mirror also returned items that are not pre-1930
encyclopaedia volumes. 8 were removed in v1.1 — two of them in copyright (Great Books of the
Western World, 1952; Book of the Year 1938) that had passed a year-based screen because
their IA records carry no date. The list with reasons is in
curation/dropped_items.json. 2 of 1,162 volumes are missing
(corrupt source archives).
year is null for 9% of pages (IA date blank or non-numeric — year_raw keeps the string).contributor is blank for a third of items.edition + volume if you need one copy per volume.from datasets import load_dataset
# scores + provenance for every page, no images (~120 MB)
manifest = load_dataset("biglam/britannica-illustrated-pages", "manifest", split="train")
# the illustrated pages with images (~9.6 GB) — stream unless you want all of it
pages = load_dataset("biglam/britannica-illustrated-pages", "pages", split="train", streaming=True)
row = next(iter(pages))
row["image"], row["edition"], row["ia_page_url"]
Cite the Internet Archive item (ia_url) and contributing library for the scans, and the
National Library of Scotland
for the training labels. Classifier, scan and curation by Daniel van Strien
(Machine Learning Librarian, Hugging Face); published under BigLAM, the
BigScience/Hugging Face initiative for libraries, archives and museums data.
Every row links to its page in the public bucket biglam/britannica. This is the quickest way to get the full-resolution scan — no archive.org round-trip:
bucket_url — the full-resolution original (source/pages/<ia_id>/<member>.jp2, straight from the Internet Archive item)bucket_url_jpg — a 2000 px JPEG of the same page (source/jpg/…), for browsers and quick loadingleaf — the IA leaf number of the page; ia_page_url opens the same page on archive.orgThe image column embedded in this dataset is a 600 px thumbnail. Every row was matched to its page by comparing that thumbnail with the bucket image (grey-level correlation ≥ 0.99) before the links were written; the match for every row is recorded in the bucket's manifest/rowmap-*.jsonl.
crop_masks config)Instance boxes and masks for the illustrations on every page of this dataset, predicted by small-models-for-glam/britannica-illustration-detector-seg-v2 (RF-DETR Seg small, 29M parameters). One row per page, joinable on file_key; 115,293 rows, 700,480 instances at score ≥ 0.10, 411,385 at ≥ 0.30.
Each row carries objects (index-aligned lists: bbox as [x, y, w, h] px, score, area, rectangularity) and masks_rle (a JSON string of COCO RLE dicts in the same order). The frame is the full-resolution original (src_width × src_height, the image at bucket_url), not the embedded thumbnail; to use them on the 2000 px JPEG (bucket_url_jpg) scale by jpg_width / src_width.
Filter by score before use. Predictions are stored down to 0.10 so that consumers choose the operating point; 0.3 is a sensible display default (on a VLM-judged 78-page sample, instances between 0.25 and 0.30 were still ~97 % illustrations). Masks are the raw model output and sit slightly inside the drawn edges; for cut-outs, dilate by ~2 % of the box size:
import json
from datasets import load_dataset
from pycocotools import mask as maskutil
from scipy import ndimage
masks = load_dataset("biglam/britannica-illustrated-pages", "crop_masks", split="train")
row = masks[0]
rles = json.loads(row["masks_rle"])
keep = [i for i, s in enumerate(row["objects"]["score"]) if s >= 0.3]
m = maskutil.decode(rles[keep[0]]) # H x W, full-resolution frame
x, y, w, h = row["objects"]["bbox"][keep[0]]
m = ndimage.binary_dilation(m, iterations=round(0.02 * max(w, h)))
Join against the page metadata with DuckDB, no image bytes fetched:
import duckdb
duckdb.sql("""
SELECT p.file_key, p.edition, p.year, p.bucket_url, m.objects, m.masks_rle
FROM 'hf://datasets/biglam/britannica-illustrated-pages/pages/*.parquet' p
JOIN 'hf://datasets/biglam/britannica-illustrated-pages/crop_masks/*.parquet' m USING (file_key)
""")
Masks are not clipped to their boxes: they normally sit inside the box, but low-score instances can extend beyond it — clip to bbox if you need the two to agree. Known limits: small in-text line diagrams are sometimes missed (about 6 % of illustrated pages had no detection at all on the judged sample); dense plates can merge neighbouring figures. Every row is stamped with model_id and model_sha.
3 commits