Fins ara hem fet servir les CNN per a una única tasca: mirar una imatge i assignar-li una etiqueta. Però la classificació és només la porta d'entrada. Amb el mateix motor d'extracció de característiques que ja domines —blocs conv+pooling construint la jerarquia vores→textures→parts→objectes— es resolen tasques molt més riques: dir on és cada objecte, retallar-ne la silueta exacta, llegir text en una foto o trobar productes visualment semblants. En aquesta lliçó farem el mapa complet de les tasques de visió per computador, cadascuna aplicada a una necessitat real de TecnoMarket, veurem com és el pipeline d'un sistema de reconeixement en producció, i ho aterrarem amb dos exemples executables: un classificador Keras fent prediccions sobre imatges i una demostració de cerca per similitud amb embeddings i similitud cosinus.
Contingut
- El mapa de tasques: de classificar a segmentar
- Detecció d'objectes: YOLO i SSD a vista d'ocell
- Segmentació: semàntica i d'instàncies
- OCR: llegir text en imatges
- Cerca visual per similitud: embeddings
- El pipeline d'un sistema real
- Exemple 1: classificar i predir amb Keras
- Exemple 2: similitud cosinus entre embeddings
El mapa de tasques: de classificar a segmentar
Les tasques de reconeixement s'ordenen per la riquesa de la seva resposta davant de la mateixa foto:
| Tasca | Pregunta que respon | Sortida | Cas TecnoMarket |
|---|---|---|---|
| Classificació | Què hi ha a la imatge? | Una etiqueta (+ probabilitats) | Categoritzar la foto que puja un venedor: "cafetera" |
| Classificació + localització | Què hi ha i on? | Etiqueta + un rectangle (bounding box) | Comprovar que el producte està centrat i ocupa la foto |
| Detecció d'objectes | Quins objectes hi ha i on és cadascun? | Llista de (etiqueta, caixa, confiança) | Trobar tots els productes en una foto de catàleg o de prestatgeria |
| Segmentació semàntica | A quina classe pertany cada píxel? | Un mapa d'etiquetes de la mida de la imatge | Separar producte/fons per treure el fons automàticament |
| Segmentació d'instàncies | Quins píxels pertanyen a cada objecte? | Una màscara per objecte | Retallar cadascun dels 3 monitors d'una foto de lot |
Dos aclariments sobre la taula:
- La localització afegeix a la classificació una regressió: a més de les probabilitats softmax, la xarxa produeix 4 números (x, y, ample, alt) del rectangle. Mateix extractor convolucional, un "cap" de sortida més — s'entrena amb una pèrdua combinada (la CCE de classificació de 02-04 més un MSE sobre les coordenades).
- La detecció generalitza a N objectes, i aquí hi ha la dificultat: no saps quants n'hi ha per endavant.
Casos d'ús concrets a TecnoMarket, que anirem connectant amb cada tècnica:
- Moderar fotos de venedors (el nostre projecte estrella): classificar la categoria del producte i rebutjar fotos que no corresponen (una foto borrosa, un objecte prohibit, una imatge sense producte).
- Detectar productes en imatges de catàleg: un proveïdor envia una foto amb 12 articles sobre una taula; el sistema localitza i retalla cadascun.
- Cerca visual "productes semblants": el client fotografia un llum que va veure a casa d'un amic i l'app troba els més similars del catàleg.
- Lectura d'etiquetes: extreure el número de sèrie o el model de la foto de l'etiqueta posterior d'un electrodomèstic.
Detecció d'objectes: YOLO i SSD a vista d'ocell
Com troba una xarxa un nombre variable d'objectes? La idea ingènua —desplaçar un classificador per milers de finestres de totes les mides possibles— funciona però és lentíssima. Les famílies modernes ho resolen en una sola passada:
- YOLO (You Only Look Once): divideix la imatge en una graella (p. ex. 13×13). Cada cel·la prediu, de cop, unes poques caixes candidates amb la seva confiança i la seva classe. Com que tot surt d'una única passada per la CNN, és tan ràpid que processa vídeo en temps real.
- SSD (Single Shot Detector): mateixa filosofia d'una sola passada, però prediu caixes des de diversos nivells de la jerarquia convolucional: els mapes grans de les primeres capes (alta resolució) detecten objectes petits, i els mapes petits i profunds detecten objectes grans — un ús directe de la jerarquia de característiques de 03-01.
Peces comunes que convé conèixer de nom:
- Confiança: cada caixa porta una probabilitat de "aquí hi ha un objecte"; les caixes per sota d'un llindar es descarten.
- Supressió de no-màxims (NMS): diverses cel·les solen proposar caixes gairebé idèntiques sobre el mateix objecte; NMS conserva la de més confiança i elimina les solapades.
Per a la foto del proveïdor amb 12 articles, un detector retorna una cosa com ara [("monitor", caixa1, 0.97), ("teclat", caixa2, 0.91), ...], i amb aquestes caixes el sistema retalla automàticament cada producte per donar-lo d'alta al catàleg. Entrenar un detector requereix datasets anotats amb caixes i pèrdues especialitzades — queda fora d'aquest curs; l'important aquí és saber què demanar a aquestes eines i reconèixer-ne les peces.
Segmentació: semàntica i d'instàncies
Quan el rectangle no basta —treure el fons de la foto de producte exigeix saber exactament quins píxels són producte— passem a la segmentació:
- Semàntica: cada píxel rep una classe ("producte", "fons", "mà del venedor"). Dues cafeteres juntes formen una sola taca "cafetera".
- D'instàncies: a més separa objectes individuals: cafetera núm. 1 i cafetera núm. 2 tenen màscares diferents (és la combinació de detecció + màscara per objecte).
L'arquitectura conceptual de referència per a segmentació és la U-Net: té forma d'U perquè a l'etapa convolucional habitual que encongeix la imatge extraient característiques (l'encoder, tot el que has après a 03-02) la segueix una etapa simètrica que la torna a expandir fins a la mida original (el decoder), produint una predicció per píxel. Les connexions de salt entre nivells simètrics de la U (cosines germanes de les de ResNet, però concatenant en comptes de sumar) reinjecten el detall fi de les primeres capes perquè els contorns surtin precisos.
flowchart LR
A["Imatge"] --> B["Encoder<br/>conv+pool<br/>(encongeix)"]
B --> C["Caracteristiques<br/>abstractes"]
C --> D["Decoder<br/>upsampling<br/>(expandeix)"]
D --> E["Mascara<br/>per pixel"]
B -.->|"connexions de salt<br/>(detall fi)"| D
Ús a TecnoMarket: el retall automàtic de fons perquè totes les fotos del catàleg tinguin fons blanc uniforme — segmentació semàntica producte/fons i substitució dels píxels de fons.
OCR: llegir text en imatges
L'OCR (Optical Character Recognition) converteix imatges amb text en text digital. Un sistema modern encadena dues etapes, totes dues recolzades en CNN:
- Detecció de text: localitzar les regions de la imatge que contenen text (un problema de detecció com el de la secció anterior, amb "text" com a classe).
- Reconeixement: llegir cada regió. Una CNN extreu característiques de la franja d'imatge i un component seqüencial les transcriu caràcter a caràcter — el text és una seqüència, i per modelar seqüències farem servir les xarxes recurrents del mòdul 4; aquí ens quedem en el concepte.
A TecnoMarket, l'OCR automatitza la lectura d'etiquetes: el venedor fotografia l'etiqueta posterior de l'electrodomèstic i el sistema n'extreu model, número de sèrie i classe energètica, omplint la fitxa sense teclejar. A la pràctica rarament s'entrena un OCR propi: es fan servir motors existents (Tesseract, serveis al núvol) llevat de necessitats molt específiques.
Cerca visual per similitud: embeddings
L'aplicació més elegant de l'extractor de característiques: fer servir la CNN sense la capa de classificació. Recorda l'anatomia de 03-01: després de l'etapa convolucional (i el global average pooling de 03-03), la imatge queda resumida en un vector de, posem, 128 números que condensen les seves característiques visuals. Aquest vector es diu embedding.
La propietat clau: imatges visualment semblants produeixen embeddings propers. Dos llums de disseny similar cauen en punts pròxims d'aquest espai de 128 dimensions encara que els seus píxels difereixin en tot (fons, angle, il·luminació); un llum i una fregidora cauen lluny.
Com es mesura "a prop": amb la similitud cosinus, el cosinus de l'angle entre els dos vectors:
Val 1 si apunten en la mateixa direcció (molt similars), 0 si són perpendiculars (res a veure) i −1 si són oposats. Es prefereix a la distància euclidiana perquè ignora la magnitud del vector (quant activa la imatge en total) i compara només el patró de característiques.
El sistema "productes semblants" de TecnoMarket queda així:
- Indexació (una vegada): passar cada foto del catàleg per la CNN i guardar el seu embedding en una base de dades.
- Consulta (en calent): el client puja la seva foto → embedding → similitud cosinus contra l'índex → retornar els K productes més propers.
Aquest patró (codificar qualsevol cosa com a vector i buscar per proximitat) és avui universal: el retrobaràs amb textos al mòdul 4 i amb els autoencoders de 05-02.
El pipeline d'un sistema real
Cap d'aquestes xarxes no treballa sola. El sistema de moderació de fotos de TecnoMarket, de la pujada del venedor a la fitxa publicada, encadena:
flowchart LR
A["Foto del venedor<br/>(3000x2000, JPG)"] --> B["Preprocessament<br/>redimensionar 224x224<br/>normalitzar valors"]
B --> C["Inferencia CNN<br/>classificacio"]
C --> D{"Confianca<br/>> llindar?"}
D -->|"si"| E["Auto-etiquetar<br/>i publicar"]
D -->|"no"| F["Cua de revisio<br/>humana"]
- Preprocessament: les fotos arriben en mides i formats arbitraris; es redimensionen a la mida d'entrada de la xarxa i es normalitzen els píxels (per exemple de [0, 255] a [0, 1], com vam fer amb MNIST a 02-05). Regla de ferro: la imatge d'inferència s'ha de preprocessar exactament igual que les d'entrenament.
- Entrenament a banda: en entrenar (no en inferència) s'aplica a més augment de dades —girar, retallar, canviar la brillantor— per multiplicar la varietat; és una tècnica de regularització i la desenvoluparem a 05-04.
- Inferència: una passada forward (02-03) del model ja entrenat. Sense backprop, sense gradients: mil·lisegons per imatge.
- Decisió amb llindar: un sistema en producció mai no confia a cegues en el softmax. Si la probabilitat màxima no supera un llindar (p. ex. 0.85), la foto va a revisió humana. El llindar regula l'equilibri entre automatitzar molt i equivocar-se poc.
Exemple 1: classificar i predir amb Keras
Metodologia del curs: prototip amb dataset públic abans de tocar les dades de TecnoMarket. Fem servir CIFAR-10 (60 000 fotos en color de 32×32, 10 classes: avió, cotxe, ocell...), que fa de substitut de les nostres fotos de producte. Entrenem breument una CNN petita i ens centrem en la part nova: predir sobre imatges i llegir les prediccions. (El projecte guiat complet, amb més entrenament, avaluació fina i millora iterativa, és el de la lliçó 07-01.)
import numpy as np
from tensorflow import keras
from tensorflow.keras import layers
# 1) Dades: CIFAR-10, normalitzat a [0, 1] com a 02-05
(x_train, y_train), (x_test, y_test) = keras.datasets.cifar10.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0
classes = ["avio", "cotxe", "ocell", "gat", "cervol",
"gos", "granota", "cavall", "vaixell", "camio"]
# 2) Una CNN compacta amb el patro mini-VGG de 03-03
model = keras.Sequential([
keras.Input(shape=(32, 32, 3)),
layers.Conv2D(32, (3, 3), padding="same", activation="relu"),
layers.MaxPooling2D((2, 2)),
layers.Conv2D(64, (3, 3), padding="same", activation="relu"),
layers.MaxPooling2D((2, 2)),
layers.GlobalAveragePooling2D(),
layers.Dense(10, activation="softmax"),
])
model.compile(optimizer="adam", # Adam, com a 02-04
loss="sparse_categorical_crossentropy",
metrics=["accuracy"])
# 3) Entrenament curt (suficient per a l'exemple)
model.fit(x_train, y_train, epochs=5, batch_size=64,
validation_split=0.1, verbose=2)
# 4) La part nova: predir sobre imatges i llegir la sortida
probabilitats = model.predict(x_test[:4]) # 4 imatges -> matriu 4x10
for i, probs in enumerate(probabilitats):
top = np.argsort(probs)[::-1][:3] # indexs de les 3 classes mes probables
real = classes[int(y_test[i])]
print(f"Imatge {i} (real: {real})")
for k in top:
print(f" {classes[k]:8s} {probs[k]:6.1%}")Sortida típica (variarà per la inicialització aleatòria):
Imatge 0 (real: gat) gat 54.2% gos 21.7% cervol 8.3% Imatge 1 (real: vaixell) vaixell 88.9% avio 6.1% camio 2.4% ...
Com llegir-ho amb ulls de sistema de producció:
model.predictretorna la distribució softmax completa (10 probabilitats per imatge), no una etiqueta. L'etiqueta és decisió nostra:np.argmax(probs).- El "vaixell" al 88.9 % superaria un llindar de 0.85 i s'auto-etiquetaria; el "gat" al 54.2 % aniria a revisió humana. Mostrar el top-3 ajuda el revisor: si les dues primeres opcions són "gat" i "gos", el dubte és raonable; si són "gat" i "camió", alguna cosa estranya passa amb la foto.
- Per a una foto nova de TecnoMarket el flux seria idèntic: carregar el JPG, redimensionar a 32×32 (o a la mida d'entrada del model), normalitzar dividint per 255, afegir la dimensió de batch (
np.expand_dims(img, 0)) i cridarpredict.
Exemple 2: similitud cosinus entre embeddings
Ara la cerca visual. Truc didàctic: en comptes d'entrenar una xarxa d'embeddings especialitzada, reutilitzem la CNN anterior tallant-la abans de la capa softmax — la sortida del GlobalAveragePooling2D (64 números) és el nostre embedding.
# 1) Model d'embeddings: la mateixa xarxa, sense la capa de classificacio
extractor = keras.Model(
inputs=model.inputs,
outputs=model.layers[-2].output # sortida del GlobalAveragePooling2D (64 valors)
)
# 2) "Cataleg": embeddings de 1000 imatges de test
cataleg = extractor.predict(x_test[:1000]) # matriu 1000x64
def similitud_cosinus(a, b):
return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))
# 3) Consulta: el "client" puja la imatge 1500 (fora del cataleg)
consulta = extractor.predict(x_test[1500:1501])[0] # vector de 64
similituds = np.array([similitud_cosinus(consulta, e) for e in cataleg])
top5 = np.argsort(similituds)[::-1][:5] # els 5 mes semblants
print(f"Consulta: {classes[int(y_test[1500])]}")
for idx in top5:
print(f" semblant: {classes[int(y_test[idx])]:8s} "
f"similitud = {similituds[idx]:.3f}")Sortida típica:
Consulta: cavall semblant: cavall similitud = 0.983 semblant: cavall similitud = 0.971 semblant: cervol similitud = 0.968 semblant: cavall similitud = 0.962 semblant: gos similitud = 0.955
Observacions:
keras.Model(inputs=..., outputs=capa_intermedia.output)crea una "vista" de la xarxa que acaba on diguem: així s'extreuen embeddings (i així es visualitzen feature maps intermedis, com vam apuntar a 03-02).- Els veïns més propers comparteixen classe o són classes visualment afins (cavall/cérvol): l'espai d'embeddings organitza les imatges per semblança visual, no per píxels. I ningú no ha entrenat la xarxa "per buscar": és un efecte col·lateral d'aprendre a classificar.
- El sistema real de TecnoMarket seguiria aquest esquema amb dues millores: un extractor molt més potent (una xarxa preentrenada — transfer learning, 05-03) i una base de dades vectorial per buscar entre milions d'embeddings sense recórrer-los un a un.
Errors Comuns i Consells
- Triar una tasca més cara del necessari. Si n'hi ha prou de saber quin producte és, no muntis detecció; si basta la caixa, no muntis segmentació. Cada salt en riquesa de sortida multiplica el cost d'anotar dades i de computar. Comença per la tasca mínima que resol el problema.
- Preprocessar diferent en entrenament i en inferència. Si vas entrenar amb píxels a [0, 1] i en producció arriben a [0, 255], el model veurà brossa i fallarà sense donar error. Encapsula el preprocessament en una funció única utilitzada a tots dos llocs.
- Tractar el softmax com a certesa. Un 99 % de softmax no és cap garantia; davant d'una imatge raríssima (un producte que no existia en entrenar) la xarxa repartirà probabilitats entre el que coneix. D'aquí els llindars i la cua de revisió humana.
- Oblidar la dimensió de batch en predir una sola imatge.
predictespera forma(N, alt, ample, canals); amb una imatge solta de forma(32, 32, 3)fallarà. Solució:np.expand_dims(imatge, axis=0). - Comparar embeddings amb distància euclidiana sense normalitzar. Dues imatges amb el mateix patró de característiques però diferent "intensitat" d'activació quedarien lluny en euclidiana; la similitud cosinus (o normalitzar els vectors abans) compara direccions i és la pràctica estàndard.
Exercicis
Exercici 1: triar la tasca
Per a cada necessitat de TecnoMarket, indica la tasca de visió adequada (classificació, localització, detecció, segmentació semàntica, segmentació d'instàncies, OCR o cerca per embeddings) i justifica-ho en una frase:
- Rebutjar automàticament fotos on el producte ocupa menys del 20 % de la imatge.
- Generar el fons blanc uniforme de totes les fotos del catàleg.
- Comptar quantes unitats apareixen a la foto d'un lot d'auriculars idèntics i retallar cadascuna.
- Suggerir "altres clients van mirar aquests productes semblants" a partir de la foto de la fitxa.
- Verificar que el número de sèrie de la foto coincideix amb el declarat al formulari.
Exercici 2: similitud cosinus a mà
Tres productes tenen aquests embeddings simplificats de 3 dimensions: llum A = (0.9, 0.1, 0.2), llum B = (0.8, 0.2, 0.1), fregidora = (0.1, 0.9, 0.8). Calcula la similitud cosinus entre el llum A i el llum B, i entre el llum A i la fregidora. Confirmen els números la intuïció?
Exercici 3: dissenyar el llindar
El classificador de fotos de TecnoMarket automatitza la publicació si la probabilitat màxima supera el llindar T. Amb T = 0.5 automatitza el 95 % de les fotos amb un 8 % d'errors; amb T = 0.9 automatitza el 60 % amb un 1 % d'errors. Quin llindar triaries si (a) els errors de categoria són barats de corregir a posteriori, (b) una foto mal classificada pot publicar un producte en una categoria amb requisits legals (p. ex. equips de gas)? Quina tercera opció intermèdia ofereix el pipeline vist a la lliçó?
Solucions
Exercici 1:
- Classificació + localització: n'hi ha prou amb una caixa del producte per calcular quina fracció de la imatge ocupa.
- Segmentació semàntica: cal decidir píxel a píxel què és producte i què és fons per substituir el fons.
- Segmentació d'instàncies (o detecció, si basta la caixa per retallar): els auriculars són idèntics i cal separar unitat a unitat.
- Cerca per embeddings: és exactament el cas de similitud visual entre catàleg i consulta.
- OCR: localitzar i llegir el text del número de sèrie per comparar-lo amb el formulari.
Exercici 2:
- A · B = 0.9·0.8 + 0.1·0.2 + 0.2·0.1 = 0.76. ‖A‖ = √(0.81+0.01+0.04) = √0.86 ≈ 0.927. ‖B‖ = √(0.64+0.04+0.01) = √0.69 ≈ 0.831. Similitud = 0.76 / (0.927 × 0.831) ≈ 0.987.
- A · F = 0.9·0.1 + 0.1·0.9 + 0.2·0.8 = 0.34. ‖F‖ = √(0.01+0.81+0.64) = √1.46 ≈ 1.208. Similitud = 0.34 / (0.927 × 1.208) ≈ 0.304.
- Sí: els dos llums són gairebé colineals (0.987, pràcticament idèntics per al sistema) i la fregidora queda lluny (0.304).
Exercici 3:
- (a) Amb errors barats, T = 0.5: automatitzar el 95 % estalvia moltíssima feina humana i el 8 % d'errors es corregeix després amb poc cost.
- (b) Amb risc legal, T = 0.9 (o més gran): un 1 % d'errors potser continua sent massa per a aquella categoria concreta; fins i tot es podria forçar revisió humana sempre que la classe predita sigui una categoria regulada, independentment de la confiança.
- La tercera opció és la del pipeline: llindar + cua de revisió humana — les fotos per sota del llindar no es rebutgen, es revisen. Es pot afinar per categoria: llindar baix per a fundes de mòbil, altíssim (o revisió obligatòria) per a categories sensibles.
Conclusió
Aquest mòdul va començar amb una limitació (les denses no escalen a imatges) i acaba amb un panorama complet del que les CNN fan possible. En aquesta lliçó has situat cada tasca al seu lloc —classificar, localitzar, detectar (YOLO/SSD en una sola passada), segmentar (U-Net amb el seu encoder-decoder), llegir text i buscar per similitud— i les has mapat a l'operativa de TecnoMarket: moderació de fotos, alta automàtica de catàleg, fons blanc uniforme, lectura d'etiquetes i "productes semblants". Has vist que un sistema real és un pipeline (preprocessament idèntic en entrenament i inferència, llindars de confiança, revisió humana), has fet prediccions reals amb Keras sobre CIFAR-10 llegint el softmax amb criteri de producció, i has construït un cercador per similitud reutilitzant el teu classificador com a extractor d'embeddings — la demostració definitiva que l'etapa convolucional és un extractor de característiques de propòsit general.
Amb això tanquem el mòdul de CNN: saps per què existeixen (03-01), com se'n configuren les capes (03-02), quines arquitectures van marcar el camí (03-03) i tot el que s'hi construeix (03-04). El projecte guiat complet de classificació de fotos de producte t'espera a 07-01, i la reutilització de xarxes preentrenades a 05-03. Però abans, un canvi de registre: les CNN dominen les dades amb estructura espacial; el mòdul 4 aborda les dades amb estructura temporal o seqüencial — les ressenyes que escriuen els clients de TecnoMarket, els seus historials de compra, la demanda setmana a setmana. Per a això necessitem xarxes amb memòria: les xarxes neuronals recurrents (RNN).
Curs de Deep Learning
Mòdul 1: Introducció al Deep Learning
- Què és el Deep Learning?
- Història i evolució del Deep Learning
- Aplicacions del Deep Learning
- Conceptes bàsics de xarxes neuronals
- Preparació de l'entorn de treball
Mòdul 2: Fonaments de Xarxes Neuronals
- Perceptró i Perceptró Multicapa
- Funció d'activació
- Propagació cap endavant i cap enrere
- Optimització i funció de pèrdua
- La teva primera xarxa neuronal completa
Mòdul 3: Xarxes Neuronals Convolucionals (CNN)
- Introducció a les CNN
- Capes convolucionals i de pooling
- Arquitectures populars de CNN
- Aplicacions de CNN en reconeixement d'imatges
Mòdul 4: Xarxes Neuronals Recurrents (RNN)
- Introducció a les RNN
- LSTM i GRU
- Aplicacions de RNN en processament del llenguatge natural
- Seqüències i sèries temporals
Mòdul 5: Tècniques Avançades en Deep Learning
- Xarxes Generatives Adversàries (GAN)
- Autoencoders
- Transfer Learning
- Regularització i tècniques de millora
- Mecanismes d'atenció i Transformers
Mòdul 6: Eines i Frameworks
- Introducció a TensorFlow
- Introducció a PyTorch
- Comparació de frameworks
- Entorns de desenvolupament i recursos addicionals
- Desar, carregar i desplegar models
Mòdul 7: Projectes Pràctics
- Classificació d'imatges amb CNN
- Generació de text amb RNN
- Detecció d'anomalies amb Autoencoders
- Creació d'una GAN per a generació d'imatges
- Fine-tuning d'un model preentrenat
