Skip to content

Observations

The observation is what the model reads. A submission carries exactly one kind of it.

Kind Container Charges Item cap Size cap
patches zip tiles 50,000 2 GiB
embeddings npz rows 50,000 256 MiB

patches uploads the tiles; the model computes its own representation of them. embeddings uploads a representation you computed, which means the pixels never leave your machine at all. Both end in the same result file.

patches — an archive of tiles

A ZIP archive holding the tiles, one manifest row per tile, and optionally a low-resolution overview image.

Member Contract
Manifest tiles.csv
Manifest columns tile_id, file, x, y, width, height, mpp
Tile members named to match ^tile_[0-9]{6}\.(png|jpe?g)$
Tile encodings .png, .jpg, .jpeg
Optional overview image thumbnail.jpg

The manifest is what makes the archive readable without decoding it: every tile carries its position in full-resolution pixels, its size, and the micrometres per pixel it was cut at. A tile with no physical scale cannot be matched to a model, and a model reading tiles at the wrong scale produces a confident wrong answer rather than an error, so the scale is required rather than inferred.

The overview image travels inside the archive. It is never read by a model; it exists so that a viewer can show your prediction on top of the tissue. Slide labels and macro images are not part of the container, and the local tiling path never produces them.

pack_tiles writes this archive and read_archive validates one — see the Quickstart and the package reference.

embeddings — vectors you computed

A NumPy .npz archive: one row per tile, with the coordinates and the quality measurements that produced it.

Part Contract
Arrays emb, px_col, px_row, passes, foreground_ratio, hsv_ratio, laplacian_var, calibration
Attributes encoder, revision, patch_px, pooling, commit
Accepted dtypes float16, float32

The attributes record which encoder produced the vectors and at which revision. They are checked against the model's input_spec before anything runs: embeddings from a different encoder, or a different revision of the same encoder, are not interchangeable, and a model reading them would be reading noise with a confident scale. The calibration array is how that check is made quantitative rather than a matter of trusting a label.

Subsampling

A slide can yield more tiles than a run is allowed to spend. Above a threshold the run selects the densest contiguous square of tiles and predicts on that, and says so in the job's events; above a hard cap the submission is refused instead.

Kind Subsamples above Rejected above
patches 10,000 50,000

Choosing a contiguous square rather than a random sample is deliberate: a spatial prediction over scattered tiles is not a map of anything. If you would rather choose the region yourself, subsample before you pack.

Which counter an observation charges

See Limits. In short, tiles charge per tile and embedding rows charge per row, so the two paths are priced by the work they cause and not by the bytes they arrive as.