ml_artists · KlingemannMemorex
Memories of Passersby (Mario Klingemann — Memories of Passersby I)
Inspired by Mario Klingemann's Memories of Passersby I (2018, Sotheby's) — a custom GAN trained on 17th–19th-century portraits that runs forever, never repeats an output, and 'observes itself' in a feedback loop. The kernel we replicate: N cluster centroids drift through a 64-D synthetic latent space with Brownian motion + momentum and occasional large velocity jumps (Klingemann's 'memory slips'). Each centroid is projected to 2D via a fixed random matrix and stamped onto the canvas as a faded coloured dot — the result is a slowly-evolving swarm of soft pointillism whose overall hue and density gently evolve as clusters drift.
Original: https://www.sothebys.com/en/articles/artificial-intelligence-and-the-art-of-mario-klingemann
▶ Try the live demo (JS port) ▶ Run reference.py via Pyodide 10 formulas have instant JS ports. The Pyodide path runs the actual Python in your browser — first load is ~6 MB, then instant.
Math essence
centroids c_i ∈ R^D with velocities v_i; update v_i ← momentum·v_i + drift·N(0,I) + jump_mask·U; integrate c_i ← c_i + v_i; soft centring pull c_i ← c_i − ε·c_i; project via fixed 2×D matrix; render each centroid as a 5×5 Gaussian splat of its assigned palette colour.
Parameters
| Name | Type | Default | Range | Description |
|---|---|---|---|---|
dim | int | 600 | 200–1500 | Square canvas side length (px). |
n_clusters | int | 24 | 2–256 | Number N of drifting cluster centroids in latent space. |
latent_dim | int | 64 | 8–512 | Latent dimensionality D (Klingemann: small-GAN-style 64-512). |
drift | float | 0.06 | 0–0.5 | Per-step Brownian noise scale on each centroid velocity. |
momentum | float | 0.92 | 0–0.999 | Velocity retention (0..1). |
jump_prob | float | 0.012 | 0–0.5 | Per-step jump probability per centroid (Klingemann's 'memory slip'). |
jump_scale | float | 0.7 | 0–5 | Velocity magnitude applied when a jump fires. |
palette | str | klingemann | null–null | pastel|klingemann|rainbow — centroid colour cycle. |
Reference
First 60 lines of reference.py. Full source:
library_external/ml_artists/KlingemannMemorex/reference.py
"""KlingemannMemorex — Mario Klingemann "Memories of Passersby I" (2018) kernel.
Inspired by Mario Klingemann's *Memories of Passersby I* (Sotheby's,
2018, sold as the first AI artwork at a major auction house): a
machine that never stops generating portraits, never repeats itself,
and "observes itself" in a feedback loop. Klingemann trained a GAN on
17th-19th-century portraits and let its latent space drift, with each
new face a degraded memory of the previous one.
We translate the *kernel* of that work to numpy: instead of real GAN
latents, we maintain a set of N cluster centroids in a 64-D
"latent-like" space. Each centroid has momentum, drifts with Brownian
noise, and occasionally jumps (the "memory slips" / sudden context
switch). Each step we pick a random centroid, project it through a
fixed 64→2 random projector, and stamp a faded Gaussian dot onto the
canvas at that location. Centroids are coloured by cluster id along
a fixed palette — the result is a slowly-evolving swarm of coloured
"memory points" that gradually fills the canvas with a faint,
multi-coloured pointillism.
References:
- https://www.sothebys.com/en/articles/artificial-intelligence-and-the-art-of-mario-klingemann
- https://aiartists.org/mario-klingemann
- http://quasimondo.com/
"""
from __future__ import annotations
from typing import ClassVar
import numpy as np
class KlingemannMemorex:
"""Simulated memories — cluster centroids drifting in a 64-D latent space.
Parameters
----------
dim : int
Square canvas side length (px).
n_clusters : int
Number of cluster centroids N in the synthetic latent space.
latent_dim : int
Dimensionality D of the synthetic latent space (default 64, in
the spirit of small GANs).
drift : float
Per-step Brownian noise scale on each centroid.
momentum : float
How much of the previous velocity is retained (0..1).
jump_prob : float
Per-step probability that any centroid "jumps" — replaces its
velocity with a large random vector (Klingemann's "memory
slips" / sudden context changes).
jump_scale : float
Magnitude of the jump vector when a jump fires.
palette : str
``"pastel"`` (cool/light), ``"klingemann"`` (his auction-piece
warm-earthy palette), or ``"rainbow"``.
"""
family: ClassVar[str] = "ml_artists" Try running it locally
The reference implementation is self-contained Python with numpy. Install the package and run:
python library_external/ml_artists/KlingemannMemorex/reference.py Need help? See Learn for the standard environment setup, or Playground for an in-browser sketchbook.
More from ml artists
DeepDream Field (Mike Tyka — AI: DeepDream / Inceptionism)
ml_artists · TykaDeepDreamField
Inspired by Mike Tyka's AI: DeepDream series (2015-) and his co-authorship of 'Inceptionism: Going Deeper into Neural Networks' with Mordvintsev and Olah.
GAN Watercolor (Helena Sarin — Neural Bricolage / #latentDoodles)
ml_artists · SarinWatercolor
Inspired by Helena Sarin's Neural Bricolage practice (#latentDoodles, GAN Weaver, The Book of veGAN): she trains GANs on her own watercolor paintings and sketches, then curates the output back into analog paintings.
Glitch (Mario Klingemann — glitch-print aesthetic)
ml_artists · KlingemannGlitch
Klingemann's practice amplifies the visible failure modes of digital pipelines — distorted faces mid-decode, colour-shifted artefacts, rectangular datamosh tears — into the subject matter itself.
Neural Biodiversity (Sofia Crespo — Neural Zoo / Artificial Natural History)
ml_artists · CrespoNeuralBiodiversity
Inspired by Sofia Crespo's Neural Zoo (2018-), Artificial Natural History (2019-), and Beneath the Neural Waves (2021): she uses 3D GANs, CNN-based texture synthesis and 3D style transfer to fabricate a 'natural history book that never was' — chimerical creatures whose anatomies recombine fragments of real species.
Style Transfer Field (Gene Kogan — ml4a)
ml_artists · KoganStyleTransferField
Inspired by Gene Kogan's Experiments with Style Transfer and the ml4a curriculum: neural style transfer iteratively updates an image so its Gram-matrix feature statistics match a style reference — the gradient of the style loss with respect to pixels defines a vector field.