WhatDoWeSee-EfficientNet-B0

Tags what is visible in an image with any number of 20 attributes, such as people, text, chart, diagram, table, map or aerial view. A small, fast EfficientNet-B0 model (17 MB ONNX, about 10 ms per image on one CPU thread) for sorting and describing large image collections.

This is v0.3.0 (2026-10-15): trained on 38,386 images where three Albert vision-language models agree. Try it in your browser: WhatDoWeSee Space.

Attributes

An image gets every attribute that is clearly recognisable, also when blurry or in the background; tiny or unrecognisable details don't count. Depicted things count (a drawn dog is Animals).

  • People (people): one or more humans, or clearly human faces, hands or bodies
  • Animals (animals): animals, birds, fish or insects
  • Plants (nature): living green things: trees, plants, flowers, crops; not grass or a lawn as ground, not sea, sky or rocks (those are Landscape)
  • Landscape (landscape): an outdoor view of land, sea, sky, mountains, rocks, rivers or a city as a whole
  • Buildings / structures (buildings): buildings, interiors where the room or its architecture is clearly visible, and other built structures: bridges, towers, dams, monuments, ruins
  • Vehicles (vehicles): cars, bikes, trains, ships, planes or other vehicles
  • Food (food): food or drinks
  • Text (text): running text, sentences, lists or a page that make up a substantial part of the image; labels, captions, titles and signs don't count
  • Handwriting (handwriting): handwritten text, notes or signatures
  • Chart (chart): a data plot: values on axes or as proportions (bar, line, pie, scatter, area chart or similar)
  • Diagram (diagram): structure or relationships without measured values: a flowchart, schematic, process or relationship diagram; also labelled drawings that show how something is built (anatomy, parts, cross-sections)
  • Table (table): text or numbers laid out in rows and columns, with or without grid lines; not the furniture
  • Map (map): a geographic map, floor plan or route map
  • Logo / icon (logo-icon): a logo, icon, emblem, badge or pictogram
  • Formula (formula): mathematical, chemical or other notation
  • Screen / UI (screen): an app, website or device interface
  • Artwork (artwork): made as art: a painting, illustration, cartoon or sculpture, as the image itself or shown in it; not drawings made to explain (those are Diagram)
  • Instruments (instruments): musical instruments: guitar, piano, violin, drums, wind instruments and the like
  • Furniture (furniture): chairs, tables, beds, sofas, desks, cabinets, shelves and other furniture (a data table is Table)
  • Aerial (aerial): the ground seen from high above: aerial or satellite photos, drone shots, bird's-eye views, also through a plane window, straight down or at an angle; clouds without ground don't count; a drawn map is Map

Usage

Download a fixed version (recommended), so a later release never changes your results:

from huggingface_hub import hf_hub_download

model_path = hf_hub_download("StephanMeijer/WhatDoWeSee-EfficientNet-B0", "model.onnx", revision="v0.3.0")
config_path = hf_hub_download("StephanMeijer/WhatDoWeSee-EfficientNet-B0", "config.json", revision="v0.3.0")

Then:

import json
import numpy as np
import onnxruntime as ort
from PIL import Image

config = json.load(open(config_path))
session = ort.InferenceSession(model_path)
size = config["input"]["shape"][-1]
mean = np.array(config["input"]["mean"], dtype=np.float32)
std = np.array(config["input"]["std"], dtype=np.float32)

image = Image.open("photo.jpg").convert("RGB").resize((size, size), Image.BILINEAR)
x = ((np.asarray(image, dtype=np.float32) / 255 - mean) / std).transpose(2, 0, 1)[None]
probabilities = 1 / (1 + np.exp(-session.run(None, {"pixel_values": x})[0][0]))
present = [label for label, p in zip(config["labels"], probabilities)
           if p >= config["thresholds"][label]]

Preprocessing: RGB, resized to 224×224 (antialiased bilinear, no crop, aspect ratio not kept), scaled to [0, 1], normalised with the ImageNet mean and standard deviation, NCHW float32. Each label has its own threshold in config.json, tuned on a validation split.

Evaluation

On 39 held-out hand-labelled images: mean average precision 0.93, macro F1 0.82 at the tuned thresholds. The set is small: per-label scores are indicative only.

label name positives AP F1
people People 3 0.92 0.86
animals Animals 4 1.00 1.00
nature Plants 0 - 0.00
landscape Landscape 1 1.00 0.50
buildings Buildings / structures 0 - 0.00
vehicles Vehicles 1 1.00 1.00
food Food 1 1.00 1.00
text Text 17 0.99 0.94
handwriting Handwriting 5 0.91 0.73
chart Chart 5 1.00 1.00
diagram Diagram 3 0.92 0.80
table Table 8 0.97 0.55
map Map 2 1.00 1.00
logo-icon Logo / icon 3 0.60 0.50
formula Formula 0 - 0.00
screen Screen / UI 2 1.00 1.00
artwork Artwork 2 0.58 0.50
instruments Instruments 0 - 0.00
furniture Furniture 0 - 0.00
aerial Aerial 1 1.00 1.00

How it compares

Against v0.2 on the same 39 independent hand-labelled images: much better yes/no decisions (macro F1 0.82 against 0.66 at each version's thresholds) and slightly better ranking (mean AP 0.93 against 0.90). Clearly better on Handwriting (AP 0.91 against 0.60), Table (0.97 / 0.85) and People (0.92 / 0.53). Weaker on Logo / icon (0.60 against 1.00). The thresholds are now tuned on 8,104 validation images instead of 95, so they are far more stable. On an earlier set of 33 independent images mean AP was lower than v0.2 (0.86 against 0.92) while macro F1 was higher (0.80 against 0.72): treat ranking as on par with v0.2. Plants, Buildings, Formula, Instruments and Furniture have no test image in the 39; per-label scores rest on 1 to 17 images: indicative only.

Training

  • Backbone: efficientnet_b0.ra_in1k (ImageNet-pretrained, via timm), with a new 20-way sigmoid head; 30 epochs, AdamW, binary cross-entropy per label.
  • Data: Three vision-language models on the Albert API (Gemma 4 31B, Ministral 3 8B, Mistral Small 3.2 24B) answered the attribute question for about 81,000 images; an attribute counts only when all three picked it. Each image counts under its rarest attribute, at most 2,000 per attribute were kept for training (38,386 images); the 645 hand-labelled images are in the pool with their teacher labels like any other. Thresholds are tuned on the 8,104 teacher-labelled validation images. Test: 39 hand-labelled images that neither this version nor v0.2 trained on or tuned thresholds on. Same weights and thresholds as v0.3.0-rc.3.
  • The images come from public collections: photo datasets, document and form scans, charts, diagrams, screenshots, maps, artwork and icons.

Limitations

  • Small text-related details (a small table inside a document, a signature) are harder than whole-image subjects.
  • The training images come from many public collections, some under research-only or non-commercial terms. Check whether that matters for your use.

Licence

The model weights and config.json are released under the Apache License 2.0, like the EfficientNet-B0 backbone they start from. The licence covers the model, not the images it was trained on.

Versions

Each version on hand-labelled test images it never trained on (mean AP and macro F1). The test sets differ between some versions, so compare versions through the notes of each version:

version date test images mean AP macro F1
v0.3.0 2026-10-15 39 0.93 0.82 trained on 38,386 images where three Albert vision-language models agree
v0.3.0-rc.3 2026-10-15 95 0.78 0.67 release candidate, trained on 38,386 images where all three Albert vision-language models agree
v0.3.0-rc.2 2026-10-15 38 0.81 0.75 release candidate, v0.3.0-rc.1 with stable thresholds
v0.3.0-rc.1 2026-10-15 38 0.81 0.77 release candidate, trained on 38,710 images labelled by three Albert vision-language models
v0.2 2026-10-14 95 0.84 0.67 trained on 20,551 images labelled by a SigLIP 2 probe plus the 444 hand labels
v0.1 2026-10-14 95 0.80 0.71 baseline, fine-tuned on 444 hand-labelled images
Downloads last month
59
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Space using StephanMeijer/WhatDoWeSee-EfficientNet-B0 1