E· Universitetdatorseende· ca 150 min· utvecklande· verifierad 2026-09-20
Bildklassificering end-to-end
Kunna träna, utvärdera och felanalysera en bildklassificerare på riktig data.
Förkunskaper
- EDatorseende — grundernakrävs
- ETransfer learningkrävs
Intuition
Projektet: en bildklassificerare på data du samlat eller hämtat själv, med en ärlig utvärdering.
Leverabler:
| Del | Krav |
|---|---|
| Data | ≥ 4 klasser, ≥ 150 bilder per klass, stratifierad train/val/test |
| Baslinje | majoritetsklass + förtränad modell med fryst kropp |
| Modell | transfer learning med augmentering |
| Utvärdering | per klass, förväxlingsmatris, bootstrap-intervall |
| Felanalys | 30 felklassade bilder granskade och kategoriserade |
| Åtgärd | en förbättring härledd ur felanalysen, med före/efter |
Det som skiljer godkänt från starkt är felanalysen. Att titta på 30 fel tar tjugo minuter och avslöjar nästan alltid något strukturellt: en klass med tvetydiga etiketter, en bakgrundsgenväg, eller bilder som inte borde vara med.
Kod
import numpy as np, torch
from sklearn.metrics import classification_report, confusion_matrix
@torch.no_grad()
def utvardera(modell, loader, klassnamn, device="cuda"):
modell.eval()
y, p, konf, sokvagar = [], [], [], []
for xb, yb, paths in loader:
ut = modell(xb.to(device)).softmax(-1).cpu()
p += ut.argmax(1).tolist(); konf += ut.max(1).values.tolist()
y += yb.tolist(); sokvagar += list(paths)
y, p, konf = np.array(y), np.array(p), np.array(konf)
print(classification_report(y, p, target_names=klassnamn, digits=3))
print(confusion_matrix(y, p))
# Bootstrap-intervall för träffsäkerheten
rng = np.random.default_rng(0)
acc = [np.mean(y[i] == p[i]) for i in (rng.integers(0, len(y), len(y)) for _ in range(2000))]
print("accuracy", round(float(np.mean(y == p)), 3), np.percentile(acc, [2.5, 97.5]).round(3))
# De 30 värsta felen: fel OCH hög konfidens — där finns de intressanta problemen
fel = np.where(y != p)[0]
varsta = fel[np.argsort(-konf[fel])][:30]
return [{"fil": sokvagar[i], "sant": klassnamn[y[i]], "gissat": klassnamn[p[i]],
"konfidens": round(float(konf[i]), 3)} for i in varsta]
Kategorisera felen i fyra högar när du granskat dem: fel etikett i datan, genuint svår bild, genväg som modellen tagit, saknad variation i träningsdatan. Varje hög har en egen åtgärd — och bara den sista löses med mer träning.
Behärskning innebär
- Tränar och utvärderar en bildklassificerare på riktig data
- Gör felanalys som leder till en åtgärd
- Rapporterar per klass med osäkerhet
Logga in för att göra övningarna och bygga upp din behärskning.
Källor
- PyTorch — Transfer learning tutorial (BSD-3) — BSD-3-Clause
- scikit-learn User Guide (BSD-3) — BSD-3-Clause