Tema 28

Classificació d'objectes (II)

Ves més enllà dels models pre-entrenats. Aprèn a crear el teu propi classificador amb kNNClassifier de ml5.js. Ensenya a la màquina a reconèixer els teus objectes, gestos o dibuixos.

Què és kNNClassifier?

kNN (k-Nearest Neighbors, k veïns més propers) és un algorisme de classificació senzill però potent. En lloc d'utilitzar un model pre-entrenat, el kNN aprèn al moment a partir dels exemples que li donem.

El procés és el següent:

  1. Afegir exemples: captures una mostra (per exemple, una imatge) i li assignes una etiqueta (per exemple, "classe A").
  2. Repetir: afegeixes moltes mostres de cada classe.
  3. Classificar: quan arriba una nova mostra, l'algorisme busca les k mostres més similars i assigna l'etiqueta majoritària.
Idea clau: Amb kNNClassifier, tu ets el professor. La màquina no sap res fins que li ensenyes exemples. Això el fa ideal per a projectes interactius i personalitzats.

kNNClassifier amb ml5.js

Estructura bàsica per crear un classificador personalitzat:

let knn;
let video;

async function setup() {
  createCanvas(320, 240);
  video = await createCapture({ video: true });
  video.hide();
  knn = ml5.KNNClassifier();
}

// Quan premem una tecla, afegim un exemple
function keyPressed() {
  let features = knn.infer(video);
  if (key === 'a') knn.addExample(features, 'Classe A');
  if (key === 'b') knn.addExample(features, 'Classe B');
}

// Quan premem una altra tecla, classifiquem
function gotResults(error, result) {
  if (error) { console.error(error); return; }
  // result.label és l'etiqueta predita
  // result.confidencesByLabel és un objecte amb les confiances
}

knn.infer() extreu característiques de la imatge. knn.addExample() guarda una característica amb la seva etiqueta. knn.classify() prediu l'etiqueta d'una nova mostra.

Simulació: entrenar un classificador

Simulem el procés d'entrenament d'un kNN: afegim "mostres" amb el ratolí i el sistema aprèn a classificar noves posicions.

// Mode entrenament: clica per afegir exemples a cada zona
// Mode classificació: mou el ratolí i el sistema prediu la zona

if (mode === 'train') {
  if (mouseX < width/2) exemplesA.push({x: mouseX, y: mouseY});
  else exemplesB.push({x: mouseX, y: mouseY});
} else {
  // Troba l'exemple més proper i assigna la seva etiqueta
  prediccio = distA < distB ? 'Zona A' : 'Zona B';
}

Entrenament amb imatges simulades

Simulem l'entrenament d'un classificador d'imatges: cada "classe" es representa amb un color i una forma diferent, i el sistema aprèn a reconèixer-les.

// Mode entrenament: clica per afegir exemples amb l'etiqueta actual
// Mode classificació: mou el ratolí per veure la predicció

if (mode === 'train') {
  entrenament.push({ x: mouseX, y: mouseY, etiqueta: classeActual });
} else {
  // kNN: busca l'exemple més proper
  let millor = entrenament[0];
  for (let e of entrenament) {
    let d = dist(mouseX, mouseY, e.x, e.y);
    if (d < millorDist) { millorDist = d; millor = e; }
  }
  pred = millor.etiqueta;
}

Exemples creatius pas a pas

Classificador de colors personal

Entrena un model per reconèixer els teus propis "colors emocionals" i genera art basat en la predicció.

// Entrena amb 3 emocions: Alegre, Calmat, Trist
// Classifica noves posicions del ratolí

if (mode === 'train') {
  if (mouseX < 110) emocio = 'Alegre';
  else if (mouseX < 220) emocio = 'Calmat';
  else emocio = 'Trist';
  mostres.push({ x: mouseX, y: mouseY, emocio: emocio });
}

Joc d'endevinalles amb kNN

El jugador entrena el model amb exemples i després ha d'endevinar què classificarà el model.

// Entrena zones esquerra/dreta
// Després endevina on és el ratolí segons el kNN
// Compara la predicció amb la realitat i suma punts

if (mode === 'guess') {
  etiqueta = mouseX < width/2 ? 'Esquerra' : 'Dreta';
  let pred = millor.zona; // predicció del kNN
  if (etiqueta === pred) punt++;
}

Consells per treballar amb kNNClassifier

  • Més exemples = millor classificació: intenta afegir almenys 10-20 exemples per cada classe.
  • Varietat: els exemples han de cobrir diferents posicions, angles i condicions de llum.
  • Neteja de dades: si afegeixes un exemple equivocat, esborra'l o comença de nou.
  • Nombre de veïns (k): el valor per defecte és 3. Prova amb k=1 (més sensible) o k=5 (més robust).
  • Desa i carrega models: pots guardar les dades d'entrenament en un fitxer JSON per no perdre-les.

Exercicis per practicar

  1. Crea un classificador de 3 zones: entrena amb clics a diferents àrees del llenç i després classifica noves posicions.
  2. Implementa un classificador d'emocions amb 4 categories (alegria, tristesa, por, sorpresa) basat en la posició del ratolí.
  3. Dissenya un joc d'endevinalles on el jugador entrena un model i després intenta predir què classificarà.
  4. Fes un sistema de recomanació visual: entrena amb preferències (m'agrada / no m'agrada) i genera composicions basades en la predicció.
  5. Repte: Implementa un classificador de dibuixos: dibuixa diferents formes (cercle, quadrat, triangle) i entrena el kNN per reconèixer-les.

Reflexió artística

Entrenar el teu propi model és un acte profundament creatiu. Ja no ets només un usuari de la intel·ligència artificial, sinó el seu professor. Tu decideixes què és important, quines categories existeixen, quins exemples són representatius. Aquesta responsabilitat té implicacions artístiques i ètiques. Què passa si entrenes un model amb pocs exemples? I amb exemples esbiaixats? El model reflectirà les teves decisions, les teves limitacions, els teus prejudicis. Com a artista, pots jugar amb aquesta idea: crear models que classifiquen de manera absurda, poètica o política. Pots entrenar un model per reconèixer emocions en taques de color, o per classificar sorolls en categories inventades. Amb kNNClassifier, la frontera entre ensenyar i crear es difumina. Ets l'artista, el professor i el curador de la teva pròpia intel·ligència artificial.

Mini-projecte del Tema 28

Crea un "Classificador personal entrenable" amb les següents característiques:

  • Defineix almenys 4 categories personalitzades (poden ser emocions, colors, formes, o qualsevol concepte teu).
  • Implementa un mode d'entrenament on l'usuari pugui afegir exemples amb clics del ratolí.
  • Implementa un mode de classificació on el sistema predigui la categoria de noves posicions.
  • Mostra informació en temps real: mode actual, nombre d'exemples per categoria, predicció actual.
  • Utilitza colors i formes per representar visualment cada categoria i les prediccions.