
In Excavating AI: The Politics of Images in Machine Learning Training Sets, Kate Crawford and Trevor Paglen use René Magritte’s famous painting The Treachery of Images to remind us that images do not simply represent reality. Magritte’s statement, “This is not a pipe,” points out something we often forget: an image is not the thing itself, and its meaning is never fixed. What an image means depends on who is interpreting it and who has the authority to decide what it represents. This idea becomes especially important when we think about how images are used in machine learning systems.
In image classification datasets, labels act like declarations of truth. Once an image is labeled, that label tends to override all other possible interpretations. An image becomes “a face,” “a weapon,” or “a criminal,” even though the image itself might be ambiguous or context-dependent. Machine learning systems need these fixed labels to function, but in doing so, they erase the uncertainty and complexity that Magritte’s painting tries to make visible. The image stops being open to question and starts being treated as fact.
The power to decide these labels usually belongs to large institutions such as tech companies, research labs, and government agencies. While the actual work of labeling is often done by crowd workers, the categories they must choose from are designed by people far removed from the images and the lives they depict. This means cultural assumptions, stereotypes, and institutional priorities get quietly built into the dataset. Most of the time, the people shown in the images have no say in how they are labeled or understood by machines.

When models trained on these datasets are put into use, the impact goes far beyond the training data. These systems begin to shape real-world decisions, from who gets flagged by surveillance systems to which content is promoted or hidden online. Labels are no longer just descriptions; they start to influence how people are treated. When labels are inaccurate, overly simplistic, or biased, the harm can be very real, especially for people who are already marginalized or misunderstood.
Magritte’s painting invites us to pause and question what we see, but machine learning systems often do the opposite. They present their classifications as neutral, objective, and authoritative, hiding the human choices behind them. Crawford and Paglen show that this is not just a technical issue, but a political one. By turning unstable, subjective interpretations into fixed categories, image classification systems shape how society sees and sorts the world. In doing so, they don’t just reflect reality — they actively help construct it.
My Model Link: https://teachablemachine.withgoogle.com/models/WP5WKQ7hL/

My process started with training the model in Teachable Machine using an Image Project. I created four classes named Black, White, Red, and Blue to match the cards I already had. I collected training examples by holding each card up to the webcam repeatedly and intentionally varying the conditions: I tilted the card, changed the distance, moved it across the frame, and captured it under different lighting and backgrounds. Doing this mattered because even a “simple” color label is not stable in practice like shadows, glare, and the webcam’s auto-exposure can shift what the model perceives as the dominant color. After training, I tested the model live and noticed that the confidence values were extremely sensitive to lighting changes, which made it clear that the output label is not a pure reading of reality but a guess shaped by how the data was gathered.
My p5.js Link: https://editor.p5js.org/ZhaoquanZheng/sketches/r3YXMRyDQ
Once the model was trained, I exported it as TensorFlow.js and connected it to my p5.js sketch through ml5. Structurally, this is where the project became a loop between perception and generation. In the preload stage, I loaded the model using the Teachable Machine model URL and also loaded my cat image assets into four separate arrays, one for each card category.
In setup, I created a canvas that matches the webcam feed and initialized the video capture. The webcam footage is drawn onto the canvas as the base layer so viewers can see the real-time input and understand the source of the classification. I then started the classification loop by calling the classifier on the video and feeding results into a callback function. The most important structural choice here was to immediately call classify again inside the callback, which creates continuous classification. This means the system is always re-reading the camera frame and updating the label as I switch cards. Conceptually, this continuous loop is what makes the project feel like a living system rather than a one-time demo.

