How it works

The colour pipeline the model never told you about

Between your camera's file and the model's tensor sit colour-space conversions that can shift tone enough to matter for a skin-tone-sensitive task.

4 min readHow it works

A photo does not arrive at a model as colour in any perceptual sense. It arrives as three grids of numbers, one per channel, and how those numbers were produced depends on a chain of colour-space decisions made before the model ever runs. Most of that chain is invisible to the person uploading the photo, and a mismatch anywhere in it changes the numbers the model sees.

The chain, briefly

A phone sensor captures raw light and converts it into a colour space, commonly sRGB, sometimes a wider gamut like Display P3. That conversion involves a gamma curve - a nonlinear remapping that spreads out darker tones, because human vision is more sensitive to differences among shadows than among highlights, and encoding the file that way uses the available bits more efficiently. The file is then saved, often as HEIC on recent iPhones or JPEG more broadly, each with its own way of tagging which colour space and gamma curve were used.

Before the model can use the file, a decoder reads it, and a preprocessing step typically converts it to a standard RGB tensor, often assuming sRGB unless told otherwise, then rescales those values against a fixed mean and standard deviation - a separate step covered on its own - before anything reaches the network. If the file was tagged with a different profile, or the tag is missing, or the decoding library ignores the tag, the resulting numbers are shifted from what the pixels were meant to represent. None of this produces an error message. It produces a tensor that looks plausible and is quietly wrong.

Where this actually bites

Wide-gamut capture is the clearest case. A photo shot in Display P3 contains colours that do not exist in sRGB. Naive conversion, or no conversion at all, clips or compresses those colours, and the effect is not uniform - it tends to concentrate in exactly the warm, mid-tone range that skin sits in, because that is where gamut differences are largest. A photo that looked correct on the phone's own screen can decode into slightly different numbers than the photographer saw.

Gamma mishandling is the second case, and it is more mechanical: applying a linear operation, such as resizing, to gamma-encoded values before converting to linear light produces a subtly different image than doing the operations in the correct order. Most consumer pipelines get this right most of the time, but "most of the time" is doing real work in that sentence, and the failure mode is silent rather than loud.

What this is not

This is not a claim that the model is biased against any particular skin tone by design - that is a separate, dataset-level question covered elsewhere, and conflating the two muddies both. It is also not the same mechanism as the lighting and camera variance that changes a score across an afternoon of retakes, though the two can compound. The colour-space issue is specifically about the file format and decoding path turning correct light into slightly incorrect numbers before the model does anything at all.

Why it is hard to notice from outside

You cannot see a colour-space mismatch by looking at the photo on your own screen, because your screen is also interpreting the same tags, often the same way the model's pipeline does or does not. The two can agree with each other and both be wrong relative to the light that actually hit the sensor. This is one reason what the model actually sees once it is a vector is worth understanding on its own terms - by the point an embedding exists, the colour decisions are already baked in and cannot be recovered.

A well-built pipeline reads the embedded colour profile, converts explicitly to a known working space, and does gamma-aware processing throughout. A shortcut pipeline assumes sRGB and moves on, which is fine for the vast majority of files and quietly wrong for the wide-gamut minority. Rate Cock runs decoding through a fixed, explicit colour path for this reason, rather than trusting whatever a given phone happened to tag the file with. The same care matters on the measurement side of this business, where Measure My Cock's method depends on consistent capture conditions rather than colour guesswork. It matters less once a human is doing the looking, which is part of why a human review sidesteps an entire category of pipeline failure that a model cannot. Reading your own results with this in mind is a habit Penis Rater also recommends when comparing photos taken under different conditions. The file format on your phone's settings screen is, in this narrow sense, part of the scoring pipeline before you ever open the app.

Read next

Full archive