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.