Ludwig Temmel Portfolio

KNN Handskriftsigenkänning

Ett maskinlärningsprojekt som använder KNN-algoritmen för att känna igen handskrivna siffror.

Projektöversikt

Projektet handlar om att träna en KNN-algoritm för igenkänning av handskrivna siffror i en jupyter notebook. För träningen användes MNIST-datasetet och modellen uppnådde en noggrannhet på ungefär 97%.

Körning av programmet

Det första som görs när jupyter notebooken öppnas är att läsa in träningsdatan och träna modellen. Modellen kan även sparas efter träning och återanvändas, men jag har valt att inte göra så för detta projekt eftersom jag ville experimentera med hyperparametrarna.

träning av KNN modellen klar

Efter det kan kNN modellen testas för att se hur bra dess prestanda är:

test av knn prestanda

Nu kan vi rita vår egna siffra att testa modellen med. Efter lite experimentering kom jag fram till att MS-paints paintbrush ger resultat med bra accuracy. Detta beror möjligtvis på att den liknar en stor del av inmatningsdatan. Suddigheten beror på att MNIST datasetet använder siffror som är 28x28 pixlar stora, så vår inmatningsdata bör också va det. Vi kan rita siffran i en högre upplösning och konvertera den sen, men det tillför inget vidare och downscaling-steget kan möjligtvis minska noggrannheten.

ritad siffra för test av knn modellen

Efter detta körs programmet som konverterar png till csv. För närvarande har jag skrivt det i pycharm, men ska flytta in det till notebooken i framtiden. Det kommer göra steget enklare att utföra. Koden använder Pillow biblioteket för att enkelt kunna komma åt alla rgb värden på varje pixel i bilden. Efter detta sparas den bara ner till en csv fil som då enkelt kan skickas in till kNN algoritmen.

kod för att konvertera png till csv

Nu återstår bara att skicka in csv filen till knn algoritmen genom att använda pandas för att läsa den. Här kopierar jag även över headers från träningsdatan för att inte få en varning för att dessa saknas i den konverterade csv filen. Sen körs en .predict på csv filen och vi får då modellens prediction som utmatning.

Kod där vi testar vår egna bild

Utmaningar & Lösningar

Dataformatsanpassning

En utmaning var att säkerställa att imatningsdatan från användaren matchar träningsdatan. Jag granskade därför exempeldatan och dess struktur, och vilka värden pixlar hade där, för att konvertera bilden till csv på rätt sätt.

Själva pngen med den ritade siffran konverteras till en csv fil med hjälp av pillow. Där används alla tre rgb värden för varje pixel för atta beräkna dess luminositet på en skala från 0 till 255, så som i träningsdatan. Den är då redo att skickas in till KNN algoritmen.

Optimering av K-värdet

Experimenterade med olika k-värden för att optimera algoritmens prestanda och uppnå bästa möjliga noggrannhet.

Resultat & Lärdomar

Trots sin enkelhet visade sig KNN-algoritmen vara mycket effektiv med 97% noggrannhet på testdata. Konverteringsprocessen från bild till CSV är för närvarande något osmidigt och kommer att förbättras i framtida iterationer av projektet.