The problem in brief
Harry sketches 50 kinds of objects (an arm, a beach, a cello, a kangaroo...), and to save paper he draws three objects on top of one another on the same page. You have his clean single drawings, 2000 per class, with labels: 100 000 black-on-white images of pixels. The task is to name the 3 objects in each of 16 339 overlaid composites. External training data is forbidden. The organisers even show how composites are made: the pixel-wise minimum of three drawings, so ink from any drawing stays black. The task is from the Swedish AI Olympiad qualifier 2026 (by Theodor Beskow). The data zip only links to a public GitHub repository, which holds the images.
The test labels are hidden. We validate on 4 000 composites that we build ourselves, exactly like the organisers' image_merge.py and at full resolution, from 200 drawings per class that are never used in training. We also checked that the test composites are made of new drawings: no training drawing fits inside any test composite. So the held-out-drawing protocol is the faithful one.
How you are scored
Each composite earns one point per correctly named object (order does not matter), and is the share of the possible points obtained:
Full marks need 65 % of objects named correctly. On the Kattis statistics page, three contestants reached 100, and the next scores are 75.5 and 56.5.
First look at the data
- The drawings look like the "Quick, Draw!" style: thin strokes, centred, filling most of the frame. Three of them on top of each other make a dense tangle (see the figure below), where even a human struggles.
- The minimum operation means nothing is ever erased. Every stroke of each object is still present, just mixed with 2 others.
- There are possible triples, so you cannot treat the problem as one class per triple. It is multi-label classification: 50 yes/no questions per image, answered by taking the 3 most likely.
A first baseline
The obvious first try is to train a 50-way classifier on the clean single drawings, then take its top 3 classes on each composite. Composites are far from the training distribution (three times more ink), so this transfers badly. We skipped it in favour of the key idea below, which costs nothing extra.
The key idea
We know the generator, so we can manufacture unlimited labelled training data that looks exactly like the test. At each training step, pick three different classes, one random drawing of each, and take their pixel-wise minimum. The label is the 3-hot vector of those classes. The network then learns on precisely the task it will be tested on, and it never sees the same composite twice: with 1 800 drawings per class there are about combinations. That is a built-in regulariser.
The loss is a sigmoid per class (binary cross-entropy), not a softmax. A softmax forces the 50 scores to compete for a single winner, whereas here three classes are present together:
At test time, output the 3 classes with the highest , since we know there are exactly 3.
The full solution
- Clone the data repository and convert every image to grey levels at (enough for these strokes, and it keeps all 100 000 drawings in 400 MB). Keep drawings 1800 to 1999 of each class aside, to build the validation composites at full resolution.
- Generate composites on the fly on the GPU: sample 3 distinct classes with
argsort(random)[:, :3]and one drawing per class, apply random horizontal flips to individual drawings, and take the minimum. Batches have 128 composites. - CNN: four blocks of [conv 3x3, batch norm, ReLU] x 2 then max-pooling (32, 64, 128 and 256 channels, ), global average pooling, dropout 0.3, and a linear layer with 50 outputs. AdamW with a one-cycle learning rate peaking at 0.002, for 13 000 steps (1.7 M synthetic composites), about 23 minutes on Apple MPS.
- Test-time augmentation: average the sigmoids of the image and of its mirror image, then output the top 3.

The figure shows typical behaviour. When objects have distinctive parts (a guitar's neck, a pig's snout), all three are found. Big, plain outlines (table, helmet) and objects made of a few simple strokes (map, toothpaste, passport) are the usual misses.
Results
Object accuracy on 4 000 held-out composites (built from unseen drawings; test labels are private).
| approach | object accuracy | points |
|---|---|---|
| CNN on synthetic composites, 1 000 steps | 40.8 % | 62.7 |
| same, 7 000 steps (smaller budget) | 63.3 % | 97.3 |
| same, 13 000 steps (final) | 64.5 % | 99.2 |
Details for the final model: all 3 objects are right in 21.3 % of the composites, 2 in 53.2 %, 1 in 23.1 % and none in 2.4 %. The right objects are in the top 5 for 76.9 % of them and in the top 10 for 89.3 %. Per class, recall ranges from 32 % (map) to 88 % (campfire). Accuracy was still rising at the end, so a longer run or a wider network would most likely cross the 65 % bar. We stopped at the compute cap.
What to remember
- When the organisers tell you how test inputs are generated, simulate it: synthetic data from the true generator beats any amount of clever modelling on the wrong distribution.
- Validate on synthetic examples built from held-out originals, at the test's exact resolution and process. Check that the test does not reuse training originals.
- Several objects per image means multi-label: one sigmoid per class with binary cross-entropy, then pick the known number of labels.
- On-the-fly generation gives a practically infinite dataset. Then more training steps keep helping, and compute becomes the limit rather than overfitting.