Camera lens profiles
A perfect render does not look like camera footage, and a model trained only on perfect renders notices. Lens profiles apply a measured amount of the wrong to your images: haze, grain, dirt, glare, compression. This page lists every profile that ships.
Applied after capture, which changes everything#
Lens simulation runs offline, in the report and dataset exporters, not in Unreal. Three consequences worth knowing:
- Changing the profile does not require re-rendering. Re-run
nameframe datasetagainst the same dump. - You can export the same capture several times with different profiles and compare what the model does with each.
- Labels are unaffected. They are derived from the ID buffer, which the lens never touches.
# in a recipe
sensor:
enabled: true
profile: realistic_drone
strength: 1.0
save_clean_images: true
# or per export
nameframe dataset _local/dumps/beach _local/datasets/beach --task box --lens-profile realistic_drone --lens-intensity 1.0 --include-clean-images
save_clean_images, or --include-clean-images, writes the
untouched RGB next to the processed images. It costs disk and saves you from re-rendering
when you want to see what the lens actually did.
Intensity#
0 leaves the image clean, 1.0 is the profile as designed, and up
to 2 pushes it hard. Values above 1 are useful for stress-testing a model, and
less useful for training data that is meant to look plausible.
The catalogue#
27 distinct looks, reachable under 40 names plus 4 random aliases. An alias is an exact synonym: it resolves to the same parameters.
| Profile | Also accepted as | What it looks like |
|---|---|---|
none | clean | No treatment. The render passes through untouched. |
night_vision | infrared_green | Green image intensifier: heavy gain, noise and bloom. |
thermal_white_hot | thermal | Thermal imager, white-hot palette. |
sepia_vintage | vintage | Aged film stock: warm cast, soft edges, heavy grain. |
golden_hour | none | Low warm sun, long glare, mild haze. |
harsh_noon | blown_highlights | Blown highlights and hard contrast, as at midday. |
night_street | sodium_night | Sodium street lighting, orange cast, low-light noise. |
cold_cine | teal_cine | Teal cinematic grade, cool and slightly desaturated. |
action_cam | gopro | Wide sports camera: strong contrast, chromatic fringing. |
vhs_analog | vhs | Analogue tape: bleed, scanline noise, heavy compression. |
cheap_webcam | webcam | Low-cost sensor: soft, noisy, aggressively compressed. |
underexposed_noise | low_light_noise | Shot below the sensor's usable range. |
realistic_drone | drone_camera, runpod_realistic | The default aerial look: mild haze, light dirt, moderate grain. |
atmospheric | none | Distance haze with a cool cast. |
dusty_aerial | none | Aerial through dust: strong haze, warm cast, dirty optics. |
cool_haze | none | Cold desaturated haze, low contrast. |
sharp_surveillance | none | Clean fixed camera: sharp, low grain, high quality. |
cctv | none | Older fixed camera: desaturated, blocky, low bitrate. |
dashcam | none | Vehicle camera: wide, contrasty, visible compression. |
bodycam | none | Worn camera: soft, noisy, motion-tolerant. |
phone_camera | none | Modern phone: heavy sharpening and saturation. |
old_security_camera | none | Degraded fixed camera: washed out and blocky. |
dirty_industrial_lens | none | Grease, dust and scratches on the front element. |
rainy_lens | none | Water on the lens: streaks, smearing, glare. |
low_sun_dirty | none | Low sun straight into a dirty lens: heavy glare and ghosting. |
dirty_lens_low_contrast | none | Neglected optics: low contrast, dirt, dust, scratches. |
fogged_camera | none | Condensation on the element: soft, hazy, desaturated. |
Random and weighted selection#
These four names all mean the same thing, pick one per frame: random, weighted, sensor_random, camera_random.
Without explicit weights, this is the built-in distribution. Weights are relative, so they do not have to add up to anything in particular.
| Profile | Default weight |
|---|---|
dusty_aerial | 20 |
dirty_lens_low_contrast | 18 |
realistic_drone | 16 |
atmospheric | 12 |
golden_hour | 11 |
dashcam | 10 |
rainy_lens | 10 |
cold_cine | 9 |
harsh_noon | 9 |
action_cam | 8 |
dirty_industrial_lens | 8 |
low_sun_dirty | 8 |
night_street | 7 |
fogged_camera | 7 |
cctv | 6 |
night_vision | 6 |
sepia_vintage | 5 |
bodycam | 5 |
vhs_analog | 5 |
underexposed_noise | 5 |
cheap_webcam | 4 |
old_security_camera | 4 |
thermal_white_hot | 4 |
phone_camera | 4 |
What a profile is made of#
Every profile is a set of these values. You can override individual ones through sensor.effects in a recipe, for when a stock profile is close but not exactly what you want.
| Parameter | Effect |
|---|---|
chromatic | Chromatic aberration, colour fringing towards the edges |
bloom_threshold, bloom_intensity, bloom_radius | Highlight bloom |
vignette, vignette_power | Corner darkening and its falloff |
grain, grain_chroma | Luminance and colour sensor noise |
contrast, exposure | Tone curve and overall brightness |
warmth, tint | Colour temperature and per-channel tint |
softness | Optical blur, a lens that is not quite sharp |
desaturate | Colour strength reduction |
haze, haze_gradient, haze_color | Atmospheric veil and its vertical gradient |
dirt, dirt_blobs, dust, scratches, grease | Contamination on the front element |
glare, glare_ghosts | Veiling glare and lens-flare ghosts |
blockiness, jpeg_quality | Compression artefacts |
Choosing one#
Match the profile to the camera you are going to deploy on, not to what looks good.
| Deploying on | Start with |
|---|---|
| Drone or aerial imagery | realistic_drone, or dusty_aerial in dry climates |
| Fixed security camera | cctv, or sharp_surveillance for a modern one |
| Vehicle-mounted | dashcam, plus rainy_lens in the mix |
| Worn or handheld | bodycam or phone_camera |
| Night operations | night_street, night_vision, underexposed_noise |
| Thermal sensors | thermal_white_hot |
| Mixed or unknown | random with weights matching your fleet |
Weighted mixes
Real fleets are not one camera. Weight the mix to match yours:
sensor:
profile: random
profile_weights: "realistic_drone:40,dusty_aerial:25,rainy_lens:20,fogged_camera:15"
Or on the CLI:
nameframe dataset _local/dumps/x _local/datasets/x --lens-profile random --lens-profile-weights "realistic_drone:40,dashcam:25,rainy_lens:20,cctv:15"
Tuning one knob
When a stock profile is close but not right, override individual parameters instead of building a new one:
sensor:
profile: cctv
effects:
grain: 8.0
jpeg_quality: 55
Lens simulation is the last thing you should add and the easiest to overdo. Heavy dirt and grain on top of an already-hazy scene produces images no real camera would output, and the model learns the artefact rather than the object. Add it after the camera and weather variation already work, and look at the result.