Velkommen

Dette projekt er udviklet som en del af 4. semesters hovedopgave på Datamatikeruddannelsen. Formålet er at designe og implementere et system, der kan genkende og reagere på bestemte lyde ved hjælp af maskinlæring og embedded teknologi.

Oprindeligt var målet at udvikle et system til dronedetektering, men grundet manglende adgang til egnede lydoptagelser med droner er systemet i stedet baseret på detektion af Capuchin-fuglelyde. Denne justering har gjort det muligt at fastholde fokus på de tekniske aspekter af lydklassifikation og embedded implementering.

Systemet består af en lydklassifikationsmodel, der er trænet til at skelne mellem Capuchin-lyde og andre lyde. Modellen kører på en Raspberry Pi, som fungerer som en indlejret enhed og aktiverer en alarm, når en Capuchin-lyd registreres.

Projektet kobler mine to valgfag:

  • Machine Learning, hvor jeg arbejder med databehandling, modeltræning og evaluering.

  • Embedded Systems, hvor jeg implementerer løsningen på en Raspberry Pi og arbejder med hardwareintegration.

Jeg har stået for både udviklingen af modellen og integrationen af den i den fysiske enhed.

Ugens læringsmål:

  • Ingen – Ugen var fokuseret på introduktion, planlægning og opstart.

Opsummering

Fokus i denne uge var at få overblik over projektet og forberede mig på arbejdet i 4. semester. Jeg blev introduceret til projektets rammer, gennemgik relevante dokumenter og deltog i oplæg og gruppemøder. Derudover brugte jeg tid på at finde kurser, som kan støtte op om mit projekt, og jeg tog hul på at etablere min portefølje og logbog online. Målet var at skabe et solidt grundlag for resten af forløbet.

Mandag

Vi fik introduceret 4. semester og jeg gennemgik dokumenterne for at forstå projektets omfang.

Tirsdag

Oplæg med tidligere studerenes erfaringer med projektet + tips & tricks

Onsdag

Brugte dagen på at undersøge og udvælge relevante kurser, der kan understøtte mit projektforløb fagligt. Jeg kiggede bl.a. på kurser inden for embedded systems og machine learning, som passer til de teknologier, jeg forventer at arbejde med. Målet var at finde læringsmateriale, der både dækker teori og praksis.
Kan findes i ‘Kurser’

Torsdag

Gruppemøde:
Rammerne for projektet blev diskuteret, altså:
Ambitiøsniveauet og hvor stor fokus der ville være 

Fredag

Købte domæne til min portefølje og logbog. Brugte også tid på at overveje, hvordan siden skal se ud og bygges op, så den bliver nem at finde rundt i og viser mit arbejde på en enkel måde.

Kortsigtede læringsmål:

  • Opnå indsigt i hvilke hardware og komponenter (Raspberry Pi og controllere) der skal bruges i projektet.

Opsummering

Målet for ugen var at få etableret fundamentet for projektforløbet. Det indebar at afklare gruppesamarbejdet gennem en kontrakt, finde relevant hardware til mit projekt og begynde at forme en faglig retning via kursusresearch og læringsmål. Samtidig arbejdede jeg videre på porteføljen, som skal bruges til at dokumentere mit arbejde løbende.

Mandag

Udarbejdede gruppekontrakt sammen med min projektgruppe. Vi diskuterede forventninger, mødefrekvens. Det gav et fælles udgangspunkt og tydelige rammer for resten af projektforløbet.

Tirsdag

Brugte dagen på at researche relevante kurser til mine valgfag. Jeg sammenlignede indhold og læringsmål for at finde kurser, der matcher mit projekt.

Onsdag

Købte en passende Raspberry Pi til brug i projektet sammen med ekstra komponenter som SD-kort, strømforsyning og sensorer. Fortsatte samtidig med at lede efter kurser og materialer, der kan hjælpe mig med  opsætning.

Torsdag

Arbejdede videre på designet af min portefølje og logbogsside. Jeg fokuserede på layout, navigation og hvordan indholdet skal struktureres, så det bliver let at følge mit arbejde hen over semesteret.

Fredag

Formulerede flere læringsmål for mine valgfag: Maskinlæring og Embedded Systems. Jeg tog udgangspunkt i kursusbeskrivelser og mit eget projekt, for at sikre, at læringsmålene er relevante og forhåbenligt realistiske.

Kortsigtede læringsmål:

  • Opnå grundlæggende forståelse for Python-syntaks og struktur som skal bruges videre i arbejdet med machine learning og embedded systems.

Opsummering

Målet med ugen var at få lagt et solidt fundament i Python, da sproget kommer til at spille en central rolle i både maskinlæring og embedded udvikling i mit projekt. Jeg valgte derfor at starte på kurset Python 3 for Programmers, som er målrettet dem, der allerede har programmeringserfaring. Jeg nåede ca. 55 % gennem kurset og kom igennem emner som variabler, input/output, datatyper, loops, funktioner, errorhandling og recursion. Jeg har ikke lært det hele på et dybt niveau endnu, men kurset har givet mig en god introduktion til Python og en bedre forståelse af syntaksen og strukturen i sproget.

Mandag

Påbegyndelse af “Python for Programmers” 10% gennemførelse

Tirsdag

Fortsættelse af kursus 24% gennemførelse.
Læring: Python filer, kommentering, input, output

Onsdag

34% gennemførelse

Læring: Variabler, casting, operanter

Torsdag

44% gennemførelse

Læring: Conditionals, loops, loopcontrol

Fredag

55% gennemførelse

Læring: errorhandling, funktioner, recursion

Kortsigtede læringsmål:

  • Opnå grundlæggende forståelse for Python-syntaks og struktur som skal bruges videre i arbejdet med machine learning og embedded systems.

Opsummering

Denne uge afsluttede jeg kurset Python for Programmers med 100 % gennemførelse. Jeg arbejdede med objektorienteret programmering og Python’s indbyggede datastrukturer som lister, tuples og dictionaries. Vi havde også gruppemøde, hvor vi fastlagde struktur for kontakt med vores PO.

Mandag

Møde med projektgruppen hvor vi diskuterede faste planer for møder med PO samt fælles forståelse for hvor meget kontakt vi ville have med virksomheden

Tirsdag

63% gennemførelse af ‘Python for Programmers’

Læring: lambda funktioner, classes, objekter

Onsdag

75% gennemførelse

Læring: constructors,destructors, acces modifiers, inheritance, encapsulation

Torsdag

85% gennemførelse

Læring: polymorphism, string methods

Fredag

100% gennemførelse

Læring: lists, tuples, dictionaries, sets

Kortsigtede læringsmål:

  • Opnå forståelse for Raspberry Pi’s hardware og forskellen på Raspberry Pi og Arduino

  • Lære at flashe og konfigurere Raspberry Pi med nødvendigt styresystem

  • Skabe overblik over, hvilke komponenter og sensorer der skal bruges til embedded-delen af projektet

Opsummering

Denne uge arbejdede jeg med grundlæggende opsætning og forståelse af Raspberry Pi gennem kurset The Raspberry Pi Platform and Python Programming for the Raspberry Pi. Jeg gennemførte det første modul med tilhørende quiz og aflevering. Derudover lavede jeg research på nødvendige komponenter og begyndte at konfigurere Pi’en, bl.a. ved at flashe SD-kortet med styresystem via imager.

Mandag

Opdaterede hjemmesiden

Tirsdag

Påbegyndte kurset “The Raspberry Pi Platform and Python Programming for the Raspberry Pi”. Skabte overblik over nødvendige komponenter til kurset.

Foretog en research af påkrævede hardwaredele og bestilte de nødvendige komponenter

Onsdag

Fortsættelse af kursus. 22% completion

Torsdag

25% completion

Fredag

Aflevering 1. Flasher sd kort vha. imager

Kortsigtede læringsmål:

  • Udvikle grundlæggende færdigheder i Linux via Raspberry Pi (terminal, filsystem)
  • Træne Python-programmering direkte på Raspberry Pi med fokus på styring af hardware.

Opsummering

Denne uge arbejdede jeg videre med Raspberry Pi-kurset og nåede op på 83 % færdiggørelse. Jeg afleverede opgaver, hvor jeg bl.a. dokumenterede mit arbejde via terminalen. Kurset dækkede grundlæggende Linux-færdigheder som filsystem, tilladelser og processer samt brug af Python på Raspberry Pi. Ugen sluttede med, at jeg orienterede mig i praktikrelaterede dokumenter.

Mandag

50% completion af rsbpi kursus
aflevering 2. hvor man skal screenshotte sit værk over en terminal og aflevere aflevering gennem rsbpi

Tirsdag

66% done

Onsdag

75% done

Torsdag

83% done

Fredag

Orienterede mig i praktikdokumenter.

Kortsigtede læringsmål:

  • Afslutte og konsolidere min forståelse af GPIO og interaktion mellem fysiske komponenter via Python

  • Udvikle grundlæggende viden om supervised vs. unsupervised learning

  • Forstå begreber som lineær regression og omkostningsfunktioner i maskinlæring

Opsummering

Jeg afsluttede Raspberry Pi-kurset og lavede et lille sideprojekt, hvor jeg kombinerede LED, buzzer og knap i et simpelt Python-styret kredsløb. Derudover påbegyndte jeg arbejdet med CV-skrivning til praktik og begyndte maskinlæringskurset, hvor jeg blev introduceret til supervised og unsupervised learning samt lineær regression og omkostningsfunktioner.

Mandag

fortsættelse af Raspi kurset:  100% done

Tirsdag

Påbegyndt CV skrivning til praktik

Onsdag

Jeg lavede et lille for-sjov projekt, hvor jeg byggede en simpel dørklokke-lignende løsning med Raspberry Pi. Når man trykker på en knap, tænder en LED og en buzzer aktiveres samtidig. Det var en god øvelse i at få knap, LED og buzzer til at fungere sammen via Python. 

Den kan findes under Delprodukter

Torsdag

Påbegyndelse af Maskinlæringskurset:
Læring, Superviced learning, Unsuperviced learning.

Fredag

Forsættelse af Maskinlæringskurset:
Læring, Lineær regression, omkostningsfunktion

Kortsigtede læringsmål:

  • Få en grundlæggende forståelse for, hvordan multiple linear regression fungerer

  • Forstål idéen om vectorization i Python

  • Prøve at bruge gradient descent på en simpel lineær model i Python

Opsummering

I denne uge arbejdede jeg videre med maskinlæringskurset og fokuserede især på multiple linear regression og brugen af gradient descent. Jeg lærte at vektorisere funktioner og eksperimenterede med learning rate og konvergens. Derudover arbejdede jeg med feature scaling og polynomial regression, og jeg afleverede flere labs, som nu kan findes under “Produkter” og på min GitHub. En meget lærerig uge med fokus på at forbedre mine praktiske ML-færdigheder.

Mandag

Forsættelse af Maskinlæringskurset:
Visualisering af omkostningsfunktion, Gradient nedstigning. learning rate

Forsættelse af cv skrivning.

Opdatering af logbog

Tirsdag

Forsættelse af maskinlæringskurset:

Gradient descent for linear regression

Running gradient descent

Nyt produkt: gradient_descent_lab (findes i ‘produkter’ og på min github)

Onsdag

Eksamensforudsætning

Arbejdede på resume

 

Forsættelse af maskinlæringskurset:

Linear regression with multiple features

Vectorization

Torsdag

Kort gruppemøde 

 

Forsættelse af maskinlæringskursus:

Gradient descent for multiple linear regression

Nyt produkt: Multiple linear regression (findes i ‘produkter’ og på min github)

Fredag

Fortsættelse af maskinlæringskursus:

Feature scaling

Checking gradient descent for convergence

Choosing the learning rate

Lab: Feature scaling and learning rate

Feature engineering

Polynomial regression

Lab: Feature engineering and polynomial regression

Lab: Linear regression with scikit-learn

Kortsigtede læringsmål:

  • Få en grundlæggende forståelse af logistisk regression

  • Lære hvad sigmoid-funktionen gør i en model

  • Forstå forskellen på klassifikation og regression

  • Arbejde videre med CV og forberedelse til gruppemøde

Opsummering

I denne uge arbejdede jeg videre med mit maskinlæringskursus og bevægede mig fra regression til klassifikation. Jeg blev introduceret til logistisk regression, sigmoid-funktionen, decision boundaries og forskellige cost functions relateret til klassifikation. Jeg arbejdede også videre med mit CV og deltog i et gruppemøde med vores PO for at få feedback og sparring på projektforløbet.

Mandag

Prøvede at implementere linear regression ved hjælp af kursets optional lab

Tirsdag

Fortsættelse af ML kursus

Classification

Logistic regression

Sigmoid function and logistic regression

Decision boundary

Onsdag

Fortsættelse af ml kursus

Cost function for logistic regression

Logistic loss

Simplified Cost function for logistic regresison

Practice quiz Cost function for logistic regression

Torsdag

Arbejde videre på CV

Fredag

Gruppemøde med PO

Kortsigtede læringsmål:

  • Forstå hvad overfitting betyder, og hvorfor det er et problem i maskinlæring

  • Blive introduceret til regularisering som metode til at modvirke overfitting

Opsummering

I denne uge arbejdede jeg videre med mit maskinlæringskursus og blev introduceret til overfitting og hvordan det påvirker modellens præcision. Jeg lærte om regularisering som en metode til at håndtere overfitting, herunder regularized linear og logistic regression. Samtidig begyndte jeg at implementere min egen lydgenkendelsesmodel og gik i gang med at indsamle data. Derudover arbejdede jeg videre på mit CV og havde fokus på praktisk anvendelse af teorien i mit projekt.

Mandag

Påbegyndt implementering af lydgenkendelses modellen. Er i gang med dataindsamling

Viderearbejdet på CV

Tirsdag

Fortsættelse af ML kursus

Gradient descent for logistic regression

Regression with scikit-leran

Onsdag

Fortsættelse af ML kursus

The problem with overfitting

Addressing overfitting

Cost function with regularization

Regularized linear regression

Regularized logistic regression

Regularization

Torsdag

Practize quiz: The problem with overfitting

Graded lab: logistic regression

Fredag

Viderearbejde på projekt

Jeg har researchet hvor jeg kan finde audiosamples, da jeg ikke kan få udleveret dronelyde af virksomheden. Jeg er kommet frem til at jeg vil bruge capuchinbird audio samples, som kan findes i litteraturlisten

Kortsigtede læringsmål:

  • Ingen

Opsummering

Jeg afleverede de sidste quizzes så jeg kunne modtage certifikater som jeg kan bruge til at pynte mit CV

Mandag

Ferie

Tirsdag

Ferie

Onsdag

Ferie

Torsdag

Ferie

Fredag

Færdiggjorde Rasbpi og ML kurserne og modtog certifickat som skal bruges på CV

Færdiggjorde CV

Kortsigtede læringsmål:

  • Jeg kan analysere og troubleshoote fejl i min lydklassifikationsmodel baseret på Capuchin-lyde.

  • Jeg kan implementere og forklare brugen af sliding window-teknik til at forbedre præcisionen i lydgenkendelse.

Opsummering

Denne uge fokuserede jeg på at finjustere mine læringsmål efter feedback fra Asger og sikre, at de passer bedre til mit projekt og mine ambitioner. Jeg brugte også tid på at undersøge praktiksteder, der arbejder med embedded systems, AI og lydteknologi.

I mit projekt begyndte jeg at skifte fokus fra dronelyde til fuglelyde, da jeg ikke havde nok dronelydsklip. Jeg trænede en Random Forest-model til at identificere Capuchin-lyde ud fra MFCC-features, men opdagede, at hele skovoptagelser, som blev behandlet som én lang sekvens, udvandede signalet. For at løse dette implementerede jeg sliding window detection, hvor jeg splitter optagelser op i små vinduer og evaluerer dem individuelt. Dette forbedrede modellens evne til at finde relevante lydsegmenter og øgede præcisionen i min klassifikation.

Mandag

Efter at have gennemført kurser inden for begge mine valgfag, har jeg brugt dagen på at finpudse og justere mine læringsmål, så de bedre afspejler det faglige niveau og de kompetencer, jeg ønsker at opnå.

Tirsdag

Jeg deltog i procesmøde i dag og fik værdifuld feedback fra Asger. Han anbefalede bl.a., at jeg gerne må være mere detaljeret i min logbog, og at jeg ikke bare indsætter kilder i litteraturlisten, men også giver dem en kort evaluering. Derudover har jeg brugt dagen på at udarbejde en prioriteret liste over praktiksteder. Jeg fokuserer udelukkende på virksomheder, der kan tilbyde arbejde med embedded udvikling, maskinlæring/AI og robotteknologi.

Onsdag

Brugte dagen på at sende praktikansøgninger afsted og undersøge muligheder hos relevante virksomheder.

Torsdag

  • Begyndt på projektet:

Jeg arbejder med fuglelyde i stedet for dronelyde, da jeg har nogle struggles med at fine dronelydsiler i store nok mængder:

Denne uge har jeg arbejdet videre med at udvikle en maskinlæringsmodel, som kan identificere Capuchin-bird lyde i lydoptagelser. Jeg har brugt MFCC-features til at repræsentere lydklippene, og trænet en Random Forest classifier på 200 Capuchin-klip og 500 ikke-Capuchin-klip. Modellen blev evalueret og viste 100% accuracy på testdata (20%).

Derefter testede jeg modellen på 100 uklassificerede skovoptagelser for at se, om den kunne finde Capuchin-lyde i virkelige scenarier. Her stødte jeg på et problem: modellen forudsagde, at ingen af filerne indeholdt Capuchin-lyde, selvom jeg ved, at nogle af dem gør.

Efter fejlsøgning konkluderede jeg, at problemet skyldes, at jeg anvendte hele lydfilen som én enhed (ved at tage gennemsnittet af MFCC’er over hele klippet). Dette “diluter” signalet, og Capuchin-lyde forsvinder i baggrundsstøj og stilhed.

Løsning: Jeg har besluttet at implementere sliding window detection – en metode hvor jeg splitter test-lydklippene op i f.eks. 2-sekunders vinduer, og kører modellen på hver vindue individuelt. På den måde kan jeg finde præcis hvilken del af optagelsen Capuchin-lyden forekommer i. Fikser først problemet en anden dag

Projektet kan findes under ‘Hovedprodukter’

Fredag

Efter at have identificeret problemet med, at hele skovoptagelser blev behandlet som én samlet MFCC-feature (hvilket udvandede Capuchin-lydene), har jeg arbejdet videre på modellen og implementeret en løsning.

Problemet var, at når lydfiler på op til 3 minutter blev gennemsnitligt analyseret som én enkelt feature-vektor, blev korte Capuchin-lyde druknet i baggrundsstøj og stilhed. Dette resulterede i, at modellen ikke fandt nogen Capuchin-lyde i testoptagelserne, selvom de reelt var til stede.

Løsningen jeg har implementeret:

  • Jeg splitter nu skovoptagelserne op i mindre 2-sekunders vinduer.

  • Jeg ruller vinduet frem med 1 sekund ad gangen (50 % overlap).

  • For hver vindue:

    • Ekstraherer jeg MFCC-features

    • Klassificerer vinduet individuelt med min Random Forest-model

  • Hvis modellen finder Capuchin-lyde i et vindue, kan jeg nu angive præcist hvilket tidsinterval der er mistanke om Capuchin.

  • Løsning:

Kortsigtede læringsmål:

  • Jeg kan analysere årsager til fejlklassifikationer i et lydgenkendelsessystem og foreslå konkrete forbedringer.

  • Jeg kan redegøre for, hvordan støj og baggrundslyde påvirker lydklassifikationen

  • Jeg kan forklare grundprincipperne i embedded machine learning og identificere typiske hardwarebegrænsninger.

Opsummering

Denne uge arbejdede jeg videre med mit lydklassifikationssystem, som nu anvender sliding window detection. Det fungerer tilfredsstillende i nogle tilfælde, men baggrundsstøj skaber problemer for præcisionen. Jeg reflekterede over løsninger som støjreduktion, ekstra træning på støjfyldt data og brug af confidence score.

Derudover begyndte jeg på kurset “Introduction to Embedded Machine Learning” og blev introduceret til centrale begreber som datasætforberedelse, embedded hardware og feature extraction. Jeg testede også mit setup med mikrofon i realtid, men systemet detekterede endnu ikke Capuchin-lyde som forventet, hvilket gav anledning til nye hypoteser og fejlsøgning.

Mandag

Efter at have implementeret sliding window detection, er modellen blevet testet på de første optagelser.

Modellen fungerer generelt meget tilfredsstillende, især i optagelser med lav baggrundsstøj. I disse tilfælde kan Capuchin-lyde detekteres pålideligt, og modellen rammer ofte rigtigt på de relevante tidsintervaller.
Der er dog observeret en svaghed, når baggrundsstøjen i optagelserne er høj. I situationer med eksempelvis kraftig vind, regn eller mange andre fuglelyde, kan modellen komme til at give falske detektioner, hvor den fejlagtigt tror, at der er Capuchin-lyde til stede.

Dette problem skyldes sandsynligvis, at baggrundsstøjen forstyrrer de MFCC-features, modellen bruger, hvilket gør det sværere at skelne mellem rigtig Capuchin-aktivitet og støj.

Overvejelser til forbedringer:

  • Udvide træningsdatasættet med flere “støjende” eksempler uden Capuchin-lyde, så modellen lærer at håndtere baggrundsstøj bedre.

  • Tilføje en threshold på forudsigelsens “confidence score”, så modellen kun accepterer en Capuchin-detektion, hvis sandsynligheden overstiger en vis grænse (for eksempel 80 %).

  • Forbehandle optagelserne med støjreduktion, før der udtrækkes features.

  • Eventuelt træne en sekundær model, der skelner mellem “Capuchin i støj” og “ren baggrundsstøj”, som et ekstra sikkerhedslag.

Tirsdag

I denne uge er jeg begyndt på kurset Introduction to Embedded Machine Learning på Coursera. Jeg har gennemført introduktionsmodulerne, hvor jeg blev præsenteret for kursusstrukturen, underviserne, samt hvilke krav der stilles til hardware og materialer. Jeg fik også en introduktion til, hvordan jeg kan få hjælp undervejs. Desuden har jeg læst syllabus og slides, der giver et overblik over de vigtigste temaer.

Efter introduktionen har jeg arbejdet med emnet Introduction to Machine Learning. Her lærte jeg, hvad maskinlæring grundlæggende er, og hvilke begrænsninger og etiske overvejelser der er forbundet med teknologien. Jeg har set relevante videoer, læst tilhørende materialer og afleveret en praksisopgave om maskinlæringens begrænsninger.

Endelig er jeg gået i gang med modulet Embedded Machine Learning, hvor jeg har set en introduktionsvideo, som forklarer, hvordan maskinlæring kan implementeres på små, ressourcebegrænsede enheder som mikrocontrollere.

Onsdag

I dag har jeg arbejdet videre med modulet Embedded Machine Learning. Jeg har lært om den specifikke hardware, der ofte bruges til embedded machine learning, herunder mikrocontrollere og edge-enheder, som kan køre modeller lokalt med lavt strømforbrug og begrænsede ressourcer.

Torsdag

Jeg arbejdede videre med kurset og lærte, hvordan man indsamler og håndterer data til maskinlæring. Jeg blev introduceret til, hvad der kendetegner et godt datasæt, og hvordan man forbereder data, så det er egnet til træning af modeller.

Derudover begyndte jeg at arbejde med feature extraction, som handler om at udtrække de mest relevante informationer fra rå data. Det er et centralt trin i maskinlæring, hvor data forenkles og struktureres, så en model lettere kan identificere mønstre og træffe præcise beslutninger – især når der arbejdes med hardware med begrænsede ressourcer.

Fredag

Jeg har udvidet mit setup, så modellen nu kan klassificere lyd fra mikrofonen i realtid. Ved hjælp af ‘sounddevice’ optager systemet 2 sekunders lyd, udtrækker MFCC-features og forudsiger Capuchin eller ikke.

Modellen kører stabilt, og mikrofonen (Q9-1) bliver korrekt brugt.

Dog bliver der ikke detekteret Capuchin, selv når jeg afspiller Capuchin-lyde tæt på mikrofonen.

Mulige årsager:

  • Lydene gennem mikrofon + højtaler afviger for meget fra træningsdata
  • Der opstår støj eller forvrængning
  • Min mic optager muligvis overhovedet ikke lydene

Kortsigtede læringsmål:

  • Forstå hvordan mikrofonvalg og lydniveau påvirker  klassifikation af lydsignaler
  • Kunne anvende normalisering af lyd for at forbedre mønstergenkendelse i optagelser

  • Lære hvordan man konfigurerer jordforbindelse sikkert ved arbejde med Raspberry Pi

  • Implementere Python-logik til at sende data fra en ML-model til en ekstern server via JSON og HTTP

Opsummering

Denne uge arbejdede jeg videre med lydklassifikationssystemet og testede modellen med forskellige mikrofoner. Jeg opdagede, at lavt lydniveau og støj fra fx en bærbar blæser påvirkede resultaterne negativt. Jeg implementerede derfor lydnormalisering, hvilket forbedrede detektionen markant.

Derudover deltog jeg i et gruppemøde, hvor vi planlagde samarbejdet i projektet og lavede et flowchart over systemet. Jeg fik også implementeret funktionalitet til at sende JSON-data til vores Azure-backend, når modellen registrerede en Capuchin-lyd. Testen blev gennemført med succes, og integrationen fungerer.

Mandag

Jeg tog hul på kurset Interfacing with the Raspberry Pi (Coursera), som handler om at styre fysiske komponenter med en Raspberry Pi via GPIO-pins. Jeg arbejdede med eksempler, der involverede LED-lys og buzzere, og fik en bedre forståelse for, hvordan man konfigurerer og styrer disse elementer i praksis.

Tirsdag

I dag holdt vi gruppemøde, hvor vi fik talt om samarbejdet i projektet og snakket om hvordan vores delprojekter skulle ‘limes’ sammen til en samlet løsning Vi gennemgik også, hvordan systemet hænger sammen, og tegnede et flowchart, som kan ses herunder.

Hvad der sker på billedet:

  • Systemet starter med live lydoptagelse via en mikrofon.

  • Lydsignalet behandles i realtid af en maskinlæringsmodel (RandomForestClassifier) i Python ved hjælp af scikit og Librosa.

  • Hvis modellen registrerer et Capuchin-kald, bliver det sendt videre til en Raspberry Pi, som styrer det fysiske output.

  • Raspberry Pi’en aktiverer en buzzer, tænder dioder, og sender JSON-data med information om detektionen (tid, koordinater, confidence mm.) til en ekstern server.

Onsdag

Jeg arbejdede videre på lydklassifikationsmodellen. I første forsøg detekterede live recording ikke capuchinlyde, selvom jeg spillede dem direkte. Efter at have lyttet til mine optagelser, opdagede jeg, at lydniveauet var meget lavt, hvilket gjorde det svært for modellen at genkende mønstre. Jeg tilføjede derfor normalisering af lyden – og derefter begyndte modellen at detektere capuchinlyde korrekt.

Jeg testede også live optagelse på min bærbare pc, men mikrofonen opfangede primært støj fra computerens blæser, hvilket påvirkede resultaterne

Torsdag

Jeg færdiggjorde kurset og afprøvede det lærte ved at opsætte mit eget system med Raspberry Pi, hvor jeg styrer LED og buzzer afhængigt af input. Demonstrationen af mit arbejde kan ses i en produktvideo og mine tanker, som er uploadet under Delprodukter.

Fredag

I dag har jeg arbejdet med at få min machine learning-model til at sende JSON-data til frontend, når der detekteres Capuchin-lyde. Målet er, at beskeden sendes i realtid, så frontend (eller en app) kan reagere med det samme.

Jeg modtog et API-endpoint fra en gruppekammerat, som hoster applikationen via en Azure Function. Endepunktet forventer en bestemt JSON-struktur, og jeg lavede et separat testscript i Python, der sender en POST-request med denne struktur. Testen lykkedes, og jeg fik bekræftet, at integrationen virker.

Derefter implementerede jeg samme logik i min live classifier. Felter som detected, timestamp og confidence  genereres dynamisk af min kode, mens resten (somlocation og recordingURL) pt. er udfyldt med eksempeldata.

 

Kortsigtede læringsmål:

  • Forstå hvordan man integrerer machine learning-output med GPIO-komponenter (LED og buzzer)
  • Opnå erfaring med visualisering af klassifikationsresultater gennem fysisk output

Opsummering

I starten af ugen fik jeg sat mit Raspberry Pi-setup op og overført projektfilerne. Jeg oprettede et isoleret Python-miljø og forbandt systemet til VS Code for lettere kodning. Herefter arbejdede jeg med at sende klassifikationsdata fra min ML-model videre som JSON til et eksternt endpoint. Jeg implementerede også fejlhåndtering og realtidsvisning.

Senere arbejdede jeg med at integrere mit system med Raspberry Pi-hardware, så grøn LED og buzzer aktiveres, når en Capuchin-lyd detekteres. Jeg brugte gpiozero til at styre komponenterne og lavede en demonstrationsvideo, som viser hele systemet i funktion. 

Mandag

Jeg har i dag sat mit setup op, så jeg kan arbejde med Raspberry Pi fra min computer. Jeg har gjort det nemt at tilgå enheden og oprettet et separat Python-miljø til projektet. Derudover har jeg forbundet Pi’en med VS Code, så jeg kan skrive og teste kode direkte. Projektfilerne er overført, og systemet er nu klar til at køre lydklassifikation i realtid. 

Jeg har screenshottet dette da wordpress ser ‘ s s h’ osv som suspicious content

Tirsdag

Jeg har arbejdet på at sende klassifikationsresultater fra min lydmodel til et eksternt endpoint (Azure). Målet er, at modellen automatisk skal sende data, når den registrerer en Capuchin-lyd med høj nok sikkerhed (> 0.65). Jeg begyndte med at skrive et separat testscript, der laver en HTTP POST-request med relevante data – herunder timestamp, confidence og modelversion – i JSON-format.

Jeg brugte Python-biblioteket ‘requests’ til at sende data og ‘datetime’ til at tidsstemple detektionerne.

Onsdag

Jeg arbejdede videre og fik integreret POST-requesten direkte i min live lydklassifikationskode. Jeg implementerede også grundlæggende fejlhåndtering, så netværksproblemer logges i stedet for at stoppe scriptet.

Dataen bliver sendt videre til en gruppekammerats løsning, som viser det i frontend. Det gør det muligt for brugeren at se realtidsinformation om Capuchin-detektioner, hvilket er en vigtig del af systemets samlede funktion.

Torsdag

Arbejdede på integrationen af ML på raspberry pi

Du kan finde det gennem: Produkter > capuchin_bird_classifier (Projektet) > Integration af ML med Raspberry pi Kontroller

Fredag

Arbejdede på integrationen af ML på raspberry pi

Du kan finde det gennem: Produkter > capuchin_bird_classifier (Projektet) > Integration af ML med Raspberry pi Kontroller

Kortsigtede læringsmål:

  • Færdiggøre og finpudse logbogsindlæg og videoer til portefølje
  • Dokumentere og fremvise projektarbejde gennem demovideoer og tilhørende beskrivelse

Opsummering

Placeholder

Mandag

I dag var jeg til samtale om praktik og fik tilbudt praktikpladsen – hvilket betyder, at jeg nu har fået tilbudt tre forskellige praktikpladser.

Jeg har brugt dagen på at vurdere, hvilken af dem der passer mig bedst, da jeg helst skal svare hurtigst muligt. Jeg har især lagt vægt på kvaliteten af vejledning, graden af frihed i projektvalg og muligheden for senere ansættelse efter endt uddannelse.

Tirsdag

Optog en masse videoer til hovedproduktet, kan findes under ‘Hovedprodukter’

Onsdag

Optog en masse videoer til hovedproduktet, kan findes under ‘Hovedprodukter’

Torsdag

Jeg har brugt dagen på at finpudse indlæggene til mine hovedprodukter og oploade videoerne, så de er klar til at blive vist i min portefølje.

Fredag

I dag havde vi projektvejledning, som var den sidste produktvejledning, hvor vi fremviste vores endelige løsning. Vores PO var tilfreds med mit produkt og mente, at jeg havde dækket de vigtigste krav. Det inkluderer:

  • At systemet kører lokalt og kan registrere Capuchin-lyde i realtid

  • At klassifikationsresultater automatisk sendes videre til en ekstern server som derefter kan behandles

Derudover har jeg lavet og uploadet en video, hvor jeg sammen med mit gruppemedlem Emil viser samarbejdet i vores projekt. Videoen demonstrerer, hvordan min lydmodel sender data op til hans Azure-server, hvor dataen bliver håndteret og vist videre. (Kan findes i ‘Hovedprodukter’)

Kortsigtede læringsmål:

  • Ingen

Opsummering

Finpusning og aflevering af produktvideo

Mandag

Finpusning af portefølje

Tirsdag

Finpusning af portefølje

Onsdag

Optagelse samt aflevering af produkvideo

Torsdag

Fredag

Machine Learning

Viden

  • Jeg har grundlæggende forståelse for Python-syntaks.

  • Jeg kender principperne bag supervised, unsupervised og reinforcement learning.
  • Jeg har kendskab til centrale algoritmer inden for supervised learning, herunder lineær regression, logistisk regression og beslutningstræer.

  • Jeg har indsigt i lydklassifikation og hvordan maskinlæring anvendes til analyse af lydsignaler, eksempelvis med MFCC og realtidsinput.

  • Jeg har indsigt i, hvordan dataindsamling, datakvalitet og annotering påvirker maskinlæringens præcision og generalisering.

Færdigheder

  • Jeg kan designe, træne og evaluere klassifikationsmodeller til lydgenkendelse i Python, med scikit-learn.
  • Jeg kan anvende MFCC-feature extraction til at konvertere lyd til brugbare inputdata for modeller.

  • Jeg kan optimere og konvertere ML-modeller til embedded enheder for at reducere ressourceforbrug.

Kompetencer

  • Jeg kan identificere og vælge egnede ML-metoder til konkrete problemstillinger.

  • Jeg kan forholde mig kritisk til datasæt og modellens begrænsninger, herunder bias og generaliserbarhed.

  • Jeg kan samarbejde om at integrere ML i tværfaglige løsninger, herunder systemer med fysisk output eller visualisering.

Embedded Systems

Viden

  • Jeg har viden om mikrokontrollere, deres opbygning og anvendelse.

  • Jeg har forståelse for GPIO-pins og deres anvendelse til styring af komponenter som LED og buzzer.

  • Jeg har indsigt i grundlæggende elektriske kredsløb, herunder modstand, spænding og strøm.
  • Jeg har forståelse for typiske anvendelser af embedded systems i praksis, f.eks. i automatisering, overvågning og IoT.
  • Jeg forstår grundlæggende Linux-kommandolinjeværktøjer til at navigere og konfigurere embedded systemer.

Færdigheder

  • Jeg kan konfigurere og programmere en Raspberry Pi til realtids lydbehandling og hardwarekontrol.

  • Jeg kan anvende Python og biblioteker som gpiozero til at styre sensorer, LED og buzzere.

  • Jeg kan forbinde og teste simple komponenter som LED, buzzer og knapper på en breadboard.

Kompetencer

  • Jeg kan udvikle funktionelle embedded-løsninger ud fra krav og specifikationer.

  • Jeg kan vurdere og vælge passende sensorer og komponenter ud fra funktionalitet, præcision og strømforbrug.

  • Jeg kan dokumentere og evaluere funktionaliteten af min embedded-løsning ved hjælp af testresultater og demonstrationsmateriale.

Generelle Læringsmål

Viden

Den studerende har viden om:

  • De valgte emners teori og praksis
  • De valgte emners relavans i forhold til IT-fagets teori og praksis

Færdigheder

Den studerende kan:

  • Udvælge, beskrive og foretage litteratursøgning til en selvvalgt it-faglig problemstilling

  • Diskutere branche- og/eller samfundsmæssige aspekter knyttet til de valgte emner

  • Vurdere problemstillinger og opstille løsningsmuligheder i forhold til de valgte emner

  • Formidle centrale resultater

Kompetencer

Den studerende kan:

  • Selvstendigt sætte sig ind i nye teknologier inden for fagområdets teori og/eller praksis
  • Perspektivere og relatere det/de valgte emner i forhold til uddannelsens øvrige emneområder

Machine Learning

CodeAcademy: Python for Programmers

Udbyder: CodeAcademy
Kurset er rettet mod programmører med lidt erfaring og introducerer Python på en praksisnær måde. Det er interaktivt, og man skriver kode direkte i browseren. Jeg fandt kurset gennem en anbefaling på Reddit og valgte det for at få en hurtig, anvendelig indføring i Python.

Rating: 4.5/5
Kurset var en god, praktisk introduktion til Python. Kortfattet, interaktivt og nemt at komme i gang med. Anbefalet på Reddit og hurtigt gennemført – perfekt som opfriskning.

Coursera: Machine Learning Specialization

Udbyder: Stanford University (Coursera)
Instruktør: Andrew Ng – en anerkendt professor fra Stanford og co-founder af Coursera.
Kurset er bredt anbefalet i tech-verdenen og giver et stærkt teoretisk fundament i machine learning, med hands-on øvelser i Python. Jeg fandt det via en simpel google søgning og det er desuden også delt i vores ML ERFA Discord

Rating: 5/5
Et af de mest anerkendte ML-kurser (Andrew Ng, Stanford). Gennemgik teori og praksis grundigt og struktureret.

Microsoft: Introduction to Audio Classification with TensorFlow
Udbyder: Microsoft via Learn platformen
Jeg nåede desværre ikke at gennemføre dette kursus, men det kunne have været relevant, da det fokuserer på audio classification med TensorFlow – en mere avanceret tilgang end den Random Forest-model, jeg anvendte. Kurset kunne have givet mig indblik i, hvordan neurale netværk anvendes til lydgenkendelse, hvilket kunne styrke fremtidige versioner af mit projekt.

Embedded Systems

Coursea: The Raspberry Pi Platform & Python Programming for the Raspberry Pi

Udbyder: University of California, Irvine (Coursera)
Kurset giver en praktisk introduktion til Raspberry Pi-platformen, GPIO og Python-programmering. Det er let at følge og særligt velegnet til begyndere. Jeg fandt det gennem Courseras forslag, da jeg ledte efter kurser om Raspberry Pi.

Rating: 4/5
Kurset dækker GPIO og python-baseret hardwarestyring på Pi’en. Relevant og meget brugbart.

Coursera: Introduction to Embedded Machine Learning

Udbyder: Edge Impulse (via Coursera)
Kurset introducerer, hvordan man implementerer machine learning på små, ressourcebegrænsede enheder som Raspberry Pi og mikrokontrollere. Det er udviklet af Edge Impulse – en anerkendt aktør inden for embedded ML-platforme. Jeg har skimmet ML delene i kurset, da det meste af ML-teorien allerede er kendt for mig fra tidligere kurser. Jeg har valgt at placere kurset under Embedded Systems, fordi det primært fokuserer på den praktiske integration af ML i hardware. Jeg fandt kurset gennem en søgning efter “embedded machine learning course” relateret til mit projekt.

Rating: 4/5
Jeg skimmede ML- delen, da jeg allerede havde lært det meste fra tidligere ML-kurser. Jeg valgte at placere kurset under Embedded Systems, fordi det primært handler om praktisk integration af ML i hardware – hvilket var relevant for mit projekt.

Coursera: Interfacing with the Raspberry Pi
Udbyder: University of California, Irvine via Coursera
Kurset er en del af specialiseringen An Introduction to Programming the Internet of Things (IoT) og dækker, hvordan Raspberry Pi interagerer med hardware via forskellige interfaces. Jeg fandt kurset på Coursera, mens jeg søgte efter avanceret Raspberry Pi-materiale.
Jeg brugte kun kurset til at lære, hvordan man konfigurerer SSH-forbindelse til Raspberry Pi, så jeg kunne arbejde “remotely” fra min PC. Resten af kurset gennemgik jeg ikke, da jeg allerede den viden til påbegyndelse af projektet og at jeg havde begrænset tid.

Rating: 4/5
Jeg brugte kun SSH-delen af kurset til at kunne arbejde “remotely” fra min PC. Resten af kurset gennemgik jeg ikke, da jeg allerede havde den viden til at påbegynde mit projekt og jeg havde begrænset tid.

  • Andrew Ng – “Machine Learning Specialization” (Coursera)

https://www.coursera.org/specializations/machine-learning-introduction
Refleksion: Et meget anerkendt kursus, som gav et solidt teoretisk fundament i klassifikation og supervised learning. Kilden er meget pålidelig, da det er udviklet af en af verdens førende AI-forskere.

Hvordan jeg fandt det: Jeg fandt den via simpel google søgning, og desuden avr den delt gennem vores ML-ERFA-Discord
Rating: 5/5

  • Codecademy – Python for Programmers

https://www.codecademy.com/learn/python-for-programmers
Refleksion: Dette var mit første møde med Python. Kurset er velegnet til personer, der allerede har programmeringserfaring i andre sprog, da det går hurtigt frem og fokuserer på de unikke aspekter af Python. Det var meget brugbart til hurtigt at blive klar til at arbejde med ML og Raspberry Pi.

Hvordan jeg fandt det: Jeg fandt kurset gennem en Reddit-tråd om de bedste måder at lære Python som “erfaren” programmør.
Rating: 4.5/5

  • Coursera – The Raspberry Pi Platform and Python Programming for the Raspberry Pi

https://www.coursera.org/learn/raspberry-pi-platform
Refleksion: Et centralt kursus for at forstå, hvordan man arbejder med Raspberry Pi og bruger Python til at styre hardware. Undervist af University of California, Irvine – meget pålidelig kilde. Får ikke 5/5 da jeg ikke er fan af hvordan han underviser, han kommer tit på sidespor.

Hvordan jeg fandt det: Jeg fandt det gennem Courseras forslag, da jeg ledte efter kurser om Raspberry Pi.
Rating: 4/5

  • Coursera: Introduction to Embedded Machine Learning

https://www.coursera.org/learn/introduction-to-embedded-machine-learning

Refleksion:
Kurset handler om, hvordan man udvikler og implementerer machine learning-modeller på små, ressourcebegrænsede enheder som Raspberry Pi og mikrokontrollere. Det gennemgår hele processen fra dataindsamling og feature extraction til modeltræning og deployment med Edge Impulse.

Hvordan jeg fandt det: Jeg fandt kurset gennem en søgning efter “embedded machine learning course” relateret til mit projekt.
Rating: 4/5

  • Librosa Documentation

https://librosa.org/doc/latest/index.html
Refleksion: Librosa blev brugt til at udtrække MFCC-features fra lydfilerne. Dokumentationen var teknisk korrekt, men lidt kompleks for begyndere. Relevant for at forstå lydsignalbehandling.

Hvordan jeg fandt det: Jeg brugte librosa, så da jeg skulle bruge hjælp søgte jeg abre på librosa documentation
Rating: 4/5

  • Sounddevice Documentation (Python)

https://python-sounddevice.readthedocs.io
Refleksion: Uundværlig for at implementere live lydoptagelse via mikrofon på både PC og Raspberry Pi. Letforståelig og med gode kodeeksempler.

Hvordan jeg fandt det: Jeg fandt det via Stack Overflow, hvor flere anbefalede sounddevice som alternativ til pyaudio.
Rating: 5/5

  • MFCC extraction for sound classification

https://www.kaggle.com/code/seriousran/mfcc-feature-extraction-for-sound-classificationhttps://www.youtube.com/watch?v=4SHKxiRCKlo
Refleksion: Giver en visuel og letforståelig forklaring på MFCC – en essentiel feature i lydklassifikation. Rigtig god som introduktion til emnet.

Hvordan jeg fandt det: Jeg fandt den gennem “Kaggle”.
Rating: 4.5/5

  • Scikit Documentation

https://scikit-learn.org/stable/
Refleksion: Grundlag for modeltræning og evaluering. Dokumentationen er detaljeret og meget professionel, men et mareridt at læse :).

Hvordan jeg fandt det: søgning på “MFCC audio classification explanation”.
Rating: 5/5

  • joblib Documentation

https://joblib.readthedocs.io/en/latest/
Refleksion: Bruges til at gemme og loade modellen. Kilden er pålidelig og fungerer som supplement til scikit-learn.

Hvordan jeg fandt det: Jeg fandt det nævnt i scikit-learn’s egen dokumentation
Rating: 4/5

  • GPIO Zero Documentation (Raspberry Pi)

https://gpiozero.readthedocs.io/
Refleksion: Brugbar til at implementere simpel kontrol af hardware såsom LED og buzzer på Raspberry Pi. Biblioteket er højniveau og nemt at bruge, især for begyndere. Dokumentationen er overskuelig og pålidelig.

Hvordan jeg fandt det: Jeg fandt det via Raspberry Pi’s officielle hjemmeside og via tutorial-videoer på YouTube.
Rating: 5/5

  • Capuchin Bird Audio Samples – Kaggle Dataset (Ken Jee)

https://www.kaggle.com/datasets/kenjee/z-by-hp-unlocked-challenge-3-signal-processing
Refleksion: Datasættet blev brugt til at træne modellen til at genkende Capuchin-lyde. Det stammer fra en pålidelig kilde (Ken Jee). Datastrukturen var veldesignet og særligt velegnet til lydklassificering.

Hvordan jeg fandt det: Jeg blev henvist til hjemmesiden (Kaggle) af klassekammerat Frederik. På hjemmesiden søgte jeg efter egnede lydfiler der allerede var opdelt og egnet til projektet
Rating: 5/5

  • Stack Overflow

https://stackoverflow.com/
Refleksion: Stack Overflow har været nyttig til at løse mere specifikke og lidt mere “obscure” problemer, som ikke altid er dækket i officiel dokumentation – f.eks. fejl i forbindelse med biblioteker, installationer eller særlige edge cases. Dog får den ikke topkarakter, da løsningerne er indsendt af brugere og ikke altid er verificerede eller opdaterede.

Hvordan jeg fandt det: Jeg har siden spædbarn kendt til Stack Overflow 🙂
Rating: 4/5

  • Raspberry Pi

https://www.raspberrypi.com/documentation/computers/remote-access.html#ssh

Refleksion: Dokumentationen forklarer klart og overskueligt, hvordan man opsætter SSH-adgang til Raspberry Pi. Den dækker både forudsætninger, aktivering og sikkerhed, hvilket gjorde det nemt for mig at arbejde med min Pi uden skærm og tastatur. Materialet er officielt og opdateret.
Rating: 5/5

Python for Programmers

I forbindelse med mine valgfag: Machine Learning, og Embedded Systems, har jeg taget kurset “Python for Programmers” for at styrke mine færdigheder i Python, da det skal bruges begge valgfag (Machine learning og Embedded systems). Kurset dækker basic Python koncepter, såsom objektorienteret programmering og fejlhåndtering.

Koden kan findes her (github)

Forståelse af GPIO på Raspberry Pi

GPIO (General Purpose Input/Output) på Raspberry Pi gør det muligt at sende og modtage digitale signaler til og fra eksterne komponenter. Det er en central del af mange embedded systems-projekter og bruges typisk til at styre fysiske elementer som LED’er, buzzere og knapper.

Diagrammet herunder viser en oversigt over alle pins på en 40-pin Raspberry Pi-model:

_images/pin_layout.svg

Farvekoderne angiver pin-typer: strøm (rød/orange), jord (grå), og forskellige GPIO-pins (grøn, blå, lilla, gul).

Jeg forestiller mig projektet at bruge denne viden til at tilslutte komponenter som LED og buzzer, der kan aktiveres automatisk, når et systemet registrerer en lyd via min ML model. På den måde kan jeg skabe et fysisk output som respons på lydgenkendelse det kunne være cool. 

 

I dag har jeg arbejdet på at få Raspberry Pi-komponenter som LED, buzzer og knap til at fungere sammen. Jeg har kombineret hardware og software for at få dem til at interagere, så når jeg trykker på knappen, lyser LED’en op og buzzerne aktiveres.

De anvendte komponenter:

  • Raspberry Pi: Hovedcomputeren til at køre både kontrol- og maskinlæringskode.

  • LED: Bruges til at indikere status (tændt eller slukket) baseret på brugerinput.

  • Buzzer: Lydsignal, der aktiveres ved bestemte handlinger eller begivenheder.

  • Knap: Brugerinput, der gør det muligt for mig at interagere med systemet.

Mål for integrationen:

Jeg arbejdede på at få disse komponenter til at fungere sammen. Når jeg trykker på knappen, skal LED’en lyse op, og buzzerens lyd skal aktiveres. Dette vil give en visuel og auditiv feedback i realtid.

Resultat:

  • Jeg har fået knappen og LED’en til at fungere perfekt sammen. Når knappen trykkes, tændes LED’en.

  • Buzzerens funktionalitet blev også integreret, og den aktiveres sammen med LED’en, når knappen trykkes.

 

Refleksion:

I fremtiden kan jeg bruge dette arbejde i mit maskinlæringsprojekt, hvor jeg kan integrere fysiske komponenter til at reagere på systemets output når den detekterer en fuglelyd.

 

Gradient Descent for Lineær Regression

Implementering af gradient descent ved hjælp af Python og NumPy for at optimere en lineær regressionsmodel. Det inkluderer også visualiseringsværktøjer, som hjælper med at forstå, hvordan gradienten opfører sig, og hvordan læringsraten påvirker ‘convergensen’.

Har implementeret ud fra en opgave i kurset ‘Machine Learning Specialization’. Jeg ville ikke have kunnet implementere det uden at følge kursusmaterialet tæt. Øvelsen hjalp mig med at forstå teorien bedre og se effekten af forskellige parametre i praksis.

Github link: Github

Multiple Variable Linear Regression

Implementering af lineær regressionsmodel med flere variabler og bruger gradient descent til at finde optimale parametre. Modellen er testet på et lille datasæt for huspriser med features som størrelse, antal værelser, etager og alder.

Jeg har fulgt kursusmateriale og eksempler for at kunne lave denne løsning, da jeg ikke selv kunne have skrevet det hele fra bunden. Øvelsen har hjulpet mig med at forstå, hvordan præcision ikke kun afhænger af selve modellen, men i høj grad også af hvordan og hvor tit data analyseres.

Github: Github

Introduktion til Hovedproduktet

Mit hovedprodukt er et intelligent system, der kan registrere lyden af Capuchin-fugle i skovmiljøer ved hjælp af maskinlæring og derefter reagere på fundet med et fysisk signal gennem embedded hardware. Projektet kombinerer software og hardware og demonstrerer, hvordan man kan anvende kunstig intelligens i praksis på en lille, ressourcebegrænset enhed som en Raspberry Pi.

Systemet består af to hoveddele:

Maskinlæring (ML)

Jeg har trænet en ML-model i Python ved hjælp af MFCC-features udtrukket fra lydfiler, som er kategoriseret i Capuchin-kald, andre lyde og testoptagelser fra skoven. Modellen er trænet med RandomForestClassifier fra scikit-learn og kan afgøre, om en lyd sandsynligvis er en Capuchin. Dette dækker mit valgfag i maskinlæring, hvor jeg har arbejdet med dataforberedelse, feature-ekstraktion og modellering.

Embedded Systems

Modellen er implementeret på en Raspberry Pi, hvor en mikrofon kontinuerligt lytter efter Capuchin-lyde. Når der registreres en lyd med høj nok sandsynlighed, aktiveres fysiske komponenter – f.eks. en LED og en buzzer. Dette dækker mit valgfag i embedded systems, hvor jeg har arbejdet med input/output gennem GPIO-pins og realtidsinteraktion med omgivelserne.

Samarbejde med gruppen

Projektet er en del af et gruppearbejde, hvor hvert medlem arbejder med deres egne fagområder. Jeg har haft ansvar for maskinlæringsmodellen og integrationen med hardware, mens mine gruppemedlemmer arbejder med andre specialiseringer. For eksempel har én i gruppen fokus på Cloud Computing og sørger for, at klassifikationsdata sendes til en Azure-endpoint, hvor dataene kan vises og gemmes. En anden arbejder med Frontend-udvikling, hvor resultaterne visualiseres på en brugervenlig webplatform. På den måde arbejder vi tæt sammen, og vores løsninger bindes sammen til ét samlet system.

Hvordan MIT system (den gule del) fungerer

Diagrammet viser hele flowet i mit hovedprodukt. En mikrofon optager lyd live, og lydsignalet analyseres med en ML-model bygget i Python ved hjælp af Librosa og scikit-learn. Modellen er trænet til at genkende Capuchin-kald. Hvis modellen vurderer, at der er tale om en Capuchin-lyd, sender Raspberry Pi en alarm:

  • En buzzer aktiveres

  • En LED lyser

  • Der sendes JSON-data til en Azure-endpoint med information om hændelsen (tidspunkt, lokation, confidence mv.)

Dette illustrerer, hvordan mit projekt forbinder begge mine valgfag: maskinlæring og embedded systems i én praktisk løsning.
______________________________________________________________________________________________________________________________________________________

Billedet herunder er et komplet billede af hele systemet. Jeg vil uddybe under billedet

Det er her, mit samarbejde med Emil begynder.

Selvom det ligger uden for mine valgfag at forstå Azure-opsætningen i detaljer, vil jeg forsøge at forklare det alligevel:

Jeg sender mine data til Emils Azure Function, som er en del af en større løsning hostet i Azure. Denne funktion modtager mit JSON-objekt, som indeholder information om:

  • tidspunkt for detektion,

  • sandsynlighed (confidence score),

  • version af modellen,

  • og geografisk placering.

Emils Azure Function er sat op til at tage imod disse data og sende dem videre i hans system, som bl.a. indeholder:

  • Application Insights (monitorering),

  • en storage queue til videre behandling,

  • og en alert- og notifikationsservice, der muligvis kan bruges til at give brugeren besked eller analysere hændelser over tid.

Dataen han mogtager vil så vises på frontend gennem hans mobilapp og Jakobs hjemmeside.

 

Til dette projekt havde jeg oprindeligt planlagt at arbejde med dronegenkendelse, men da jeg ikke kunne finde et tilstrækkeligt datasæt med dronelyde, valgte jeg i stedet at fokusere på Capuchin-fuglekald. Disse fuglelyde er lettere tilgængelige i offentlige datasæt og har tydelige akustiske mønstre, hvilket gør dem velegnede til klassifikation med maskinlæring.

Jeg opdelte dataene i tre kategorier:

  • Ca. 200 korte lydklip med Capuchin-kald
  • Ca. 500 korte lydklip uden Capuchin (baggrundslyde, andre fugle)
  • 100 lange skovoptagelser til test, hvor Capuchin-lyde kan forekomme

Alle lydfiler blev konverteret til .wav og analyseret ved hjælp af MFCC-features, som derefter blev brugt som input til en RandomForestClassifier i scikit-learn.

Siden her er LANG

Jeg implementerede kode, der skulle kunne detektere, om en lydfil indeholdt Capuchin-lyde. Selvom modellen viste høj præcision på trænings- og valideringsdata, opstod der problemer, da jeg begyndte at teste den på de lange skovoptagelser. Modellen detekterede ingen Capuchin-lyde, selv i filer hvor jeg vidste, de var til stede.

Årsagen var, at jeg i starten analyserede hele lydfilen som én samlet MFCC-vektor. De korte Capuchin-kald udgjorde kun en lille del af filen og blev derfor “udjævnet” og ikke registreret. Løsningen var at implementere sliding windows, hvor jeg analyserer optagelsen i små 2-sekunders segmenter med overlap. Det gav modellen mulighed for at finde korte mønstre og forudsige korrekt.

Denne ændring gjorde en markant forskel og understregede vigtigheden af korrekt tidsbaseret datahåndtering ved arbejde med lyd. Det var en vigtig læring om, hvordan præcision ikke kun afhænger af modellen, men i høj grad også af hvordan data behandles og opdeles.

Kode (Github)

chunk_duration = 2.0 og step_duration = 1.0
Her definerer jeg længden af de lydstykker (chunks), som lydfilen opdeles i, til 2 sekunder, og step-størrelsen til 1 sekund. Det betyder, at hvert nyt chunk overlapper med det forrige med 50%. Dette overlap er vigtigt for at sikre, at Capuchin-lyde, som er korte og kan være klemt inde mellem to segmenter, ikke overses.

chunk_size og step_size
Disse variabler omregner chunk_duration og step_duration fra sekunder til antal samples, så de kan bruges til slicing af lyd-arrayet y. Det gør det muligt at opdele selve datastrukturen i passende segmenter, som hver især analyseres for Capuchin-kald.

for-loopet
Her itererer jeg gennem hele lydfilen i trin af step_size, og skærer hvert 2-sekunders chunk ud. Det er denne del, der gør det muligt at analysere optagelsen i små bidder med overlap.

if prediction == 1:
Her anvender jeg min ML-model til at klassificere det nuværende chunk. Hvis modellen forudsiger en Capuchin-lyd (værdi 1), udskrives navnet på lydfilen og det eksakte tidsinterval, hvor lyden er fundet. Det er denne del, der gør analysen brugbar i praksis og muliggør præcis lokalisering af Capuchin-kald.

Efter at have opnået tilfredsstillende resultater med at analysere lydfiler, besluttede jeg at udvide løsningen med live lydinput via mikrofon. Det ville gøre det muligt at bruge systemet som en realtidsdetektor, som konstant lytter og melder tilbage, hvis der opfanges Capuchin-lyde i omgivelserne.

Til dette brugte jeg sounddevice-biblioteket i Python, som gør det muligt at optage lyd i realtid direkte fra mikrofonen. Hver 2. sekund optages et kort lydklip, som derefter normaliseres og konverteres til MFCC-features. Modellen klassificerer lyden, og hvis der detekteres Capuchin, vises det i terminalen sammen med en confidence-score.

Under arbejdet opdagede jeg, at lyde optaget via mikrofon ofte havde lav lydstyrke, hvilket gjorde det svært for modellen at genkende mønstrene. For at løse dette begyndte jeg at normalisere lydsignalet med librosa.util.normalize(), så modellen fik input i samme skala som den var trænet på.

Efter at have normaliseret lyden stødte jeg på et nyt problem: Normaliseringen har forstærket baggrundsstøgen, hvilket noglegange giver falsk detektion, da de begge har et relativt stabilt mønster

Kode (Github)

Kode (Github)

Jeg har arbejdet på at sende klassifikationsresultater fra min lydmodel til et eksternt endpoint (Azure). Når modellen registrerer en Capuchin-lyd med tilstrækkelig høj sikkerhed (> 0.65), bliver der automatisk oprettet en HTTP POST-request, som sender relevante data videre, herunder tidspunkt, lokation, confidence, modelversion, recordingURL og koordinater.

Jeg brugte Python-biblioteket requests til at håndtere forbindelsen og datetime til at tidsstemple detektionerne. Formatet blev sendt som JSON, og jeg implementerede fejlhåndtering for at kunne fange og logge eventuelle netværksproblemer.

Dataen bliver herefter håndteret af et andet gruppemedlem, som står for at vise den videre i frontend-løsningen. Dette gør det muligt at præsentere realtidsinformation om Capuchin-detektioner direkte til brugeren.

Integration af Raspberry pi i ML Projekt

Efter at have færdiggjort arbejdet med live klassifiseringen, besluttede jeg at tage næste skridt i projektet ved at integrere Raspberry Pi-hardware for at kunne køre lydklassifikationen gennem noget anden end en computer Dette åbner op for en praktisk anvendelse, hvor systemet kan flyttes rundt og give feedback i form af visuelle og auditive signaler.

Jeg startede med at opsætte Raspberry Pi’en med de nødvendige GPIO-kontroller for at styre både LED’erne og buzzeren. Jeg brugte gpiozero-biblioteket til at definere de nødvendige GPIO-pins og til at aktivere den røde og grønne LED samt buzzeren. Systemet er sat op således, at den røde LED er tændt som standard, og den grønne LED kun tændes, når en Capuchin-lyd bliver detekteret.

Jeg integrerede derefter min eksisterende ML-model med Raspberry Pi-systemet. Når en Capuchin-lyd opdages, sender systemet et signal til grøn LED og aktiverer buzzeren kortvarigt, hvilket giver en fysisk respons på lyddetektionen. 

Video:
Jeg har også optaget en demonstrationsvideo, som viser, hvordan systemet fungerer i praksis. Videoen demonstrerer, hvordan grøn LED og buzzer aktiveres, når en Capuchin-lyd detekteres gennem mikrofonen.

Kode (Github)

Koden viser, hvordan jeg bruger GPIO Zero-biblioteket til at styre hardwarekomponenter på min Raspberry Pi – specifikt to LED’er (rød og grøn) samt en buzzer. Hver komponent er koblet til en bestemt GPIO-pin: den røde LED til GPIO 27 (pin 13), den grønne LED til GPIO 17 (pin 11), og buzzeren til GPIO 22 (pin 15). Disse forbindelser er konfigureret i koden ved hjælp af LED() og Buzzer() frag gpiozero-biblioteket.

Jeg har sat en standardtilstand, hvor den røde LED er tændt for at indikere, at systemet overvåger men ikke har detekteret noget. Når en Capuchin-lyd bliver opfanget, og confidence overstiger den definerede threshold(0.70), skifter systemet til “detekteret”-tilstand: den grønne LED tænder, den røde slukker, og buzzeren udsender et kort lydsignal som auditiv feedback.

GPIO Zero gør det let at kontrollere output med simple .on() og .off()-kald, uden behov for manuel konfiguration af GPIO-mode eller pin-styring. Det gør koden meget mere læsbar og vedligeholdelsesvenlig. Dette er særligt nyttigt, når man arbejder med flere komponenter ‘live’.

Test af Detektionssystem

For at vurdere hvor pålideligt mit system reagerer på Capuchin-lyde, gennemførte jeg en struktureret test med 20 forsøg i kontrolleret miljø. Hver test er en 3minutters lang lydoptagelse der bliver spillet gennem mit speaker. Formålet var at validere, om systemet korrekt kunne aktivere LED og buzzer ved detektion.

Testopsætning

  • Testtid: 60 minutter

  • Testmiljø: Indendørs rum med lav baggrundsstøj

  • Lydkilde: Afspilning af Capuchin-lyde via højttaler

  • Antal testforsøg: 20

ForsøgIndeholder Capuchin-lyd Reageret korrekt (LED/buzzer)
1✅✅
2✅✅
3✅✅
4✅✅
5✅✅
6❌ (ingen lyd)✅
7❌ (ingen lyd)✅
8✅✅
9✅✅
10✅✅
11✅✅
12✅✅
13✅✅
14✅✅
15✅✅
16✅✅
17❌ (ingen lyd)✅ (false positive)
18❌ (ingen lyd)✅ (false positive)
19✅✅
20✅✅
  • Korrekt detektionsrate: 18/20 = 90%

  • False positives: 2

  • Respons-tid (gennemsnit): under 1 sekund. (Målt med mine ører)

Systemrobusthed

  • Stabilitet: Ingen crashes ved 60 minutters drift

  • CPU-brug: ca. 33–55% ifølge htop på Raspberry Pi 5

  • Strømforbrug: ingen mærkbare problemer

Konklusion

Systemet fungerer generelt pålideligt og reagerer korrekt på de fleste Capuchin-lyde. False positives er minimale, og systemets respons-tid og stabilitet gør det anvendeligt til realtidsdetektion. En eventuel fremtidig forbedring kunne være at tilføje noise-filtering.

Min læringsfilosofi

Som studerende har jeg lært, at det ikke kun handler om at opnå resultater, men om at forstå processen bag. Jeg lægger stor vægt på at lære gennem handling, refleksion og anvendelse, og netop derfor er Kolbs læringsmodel blevet en naturlig del af min tilgang til læring.

Kolbs model beskriver læring som en cyklisk proces med fire faser:

  • Erfaring

  • Refleksion og Eftertænksomhed

  • Begrebsdannelse

  • Aktiviteter og Eksperimenter

 

Jeg arbejdede ikke bevidst ud fra Kolbs model fra starten af min uddannelse, men siden jeg begyndte at strukturere min læring efter den, har det haft stor positiv effekt. Når jeg f.eks. opsætter et system, der lytter efter Capuchin-lyde, starter det med en erfaring – fx en prototype der ikke virker. Herefter følger refleksion og eftertænksomhed: Hvorfor virkede det ikke? Hvad viste dataene? Jeg bruger dokumentation og kursusmateriale til at opnå begrebsdannelse – en forståelse for teori og koncepter. Til sidst følger aktiviteter og eksperimenter, hvor jeg afprøver ændringer og løsninger – og dermed starter cyklussen igen.

Denne tilgang har hjulpet mig med at fastholde viden og styrke mine færdigheder i praksis. Det motiverer mig at kunne afprøve mine idéer og lære af mine fejl. Jeg ser ikke læring som en lineær sti, men som en cirkulær proces, hvor jeg hele tiden bygger ovenpå det, jeg allerede har lært.

Hvordan Pomodoro-metoden hjalp min disciplin og consistency

I starten af semesteret brugte jeg ikke nogen specifik metode til at strukturere min tid, og det havde en negativ effekt på min consistency. Jeg havde svært ved at holde fokus i længere perioder, og min arbejdsrytme blev ofte forstyrret af overspringshandlinger.

Senere begyndte jeg at bruge Pomodoro-teknikken, som normalt indebærer 25 minutters fokuseret arbejde efterfulgt af 5 minutters pause. Jeg valgte dog at modificere metoden til at passe bedre til min arbejdsvane:
Jeg arbejdede i 45 minutter og holdt 15 minutters pause. Formålet med dette er, at når jeg arbejder i lang nok tid kommer jeg i noget jeg selv kalder for “Flow State”

Denne tilpasning hjalp mig med at arbejde langt mere struktureret og disciplineret, og det blev nemmere at opbygge en stabil arbejdsvane. Pauserne gav mig mulighed for at restituere mentalt uden at miste momentum.

Jeg følger dog ikke metoden helt slavisk – hvis jeg befinder mig i deep work og er i en god flow state, så ignorerer jeg pausen og arbejder videre for ikke at afbryde koncentrationen. For mig handler det ikke om at følge en fast skabelon, men om at bruge Pomodoro som et fleksibelt værktøj til at forbedre mit fokus og min arbejdsrytme.

Min brug af Kanban

En vigtig del af min måde at lære og arbejde på under dette projekt har været at skabe struktur i min proces. Jeg arbejder bedst, når jeg har overblik – både over hvad jeg har lavet, hvad jeg laver, og hvad der mangler. Til det formål har Kanban vist sig at være et uvurderligt værktøj.

Jeg har anvendt et digitalt Kanban-board til løbende at organisere mine opgaver. Det har givet mig et visuelt overblik og fungeret som en form for ekstern hukommelse. Når jeg i løbet af dagen mister fokus eller bliver i tvivl om, hvad jeg skal tage fat på, kan jeg altid vende tilbage til boardet og finde en relevant opgave.

Boardet er inddelt i klassiske kolonner: To Do, Doing og Done, og jeg har løbende opdateret det undervejs i projektet. Noget af det vigtigste for mig har været at fylde “To Do”-kolonnen med både små og store opgaver – fx:

  • “Reflektere over Kolbs læringsmodel i logbog”

  • “Implementere visuel visning af confidence-score”

På den måde har jeg altid haft en opgave, jeg kunne kaste mig over – også når jeg var træt eller manglede inspiration. Det har gjort mit arbejde mere flydende og effektivt.

Kanbanboardet har ikke kun været et værktøj til planlægning, men også et middel til at styrke min refleksive læringsproces. Ved at kunne se fremdrift og afsluttede opgaver har jeg løbende kunnet evaluere min indsats og prioritere bedre.

Mit arbejde med læring og struktur har også været inspireret af Kolbs læringscirkel, som lægger vægt på at veksle mellem erfaring, refleksion, begrebsdannelse og aktiv eksperimentering. Selvom jeg ikke arbejdede sådan bevidst fra starten, har det givet stor værdi, siden jeg begyndte at tænke mere i faser og gentagelser.

Alt i alt har mit Kanbanboard haft en positiv indvirkning i hverdagen, som har gjort det muligt at holde momentum i et komplekst projekt uden at miste retningen.

Semesterevaluering

Dette semester har været det mest krævende, men også det mest givende indtil nu. Kombinationen af maskinlæring, embedded udvikling og det store projekt har gjort, at jeg har lært en masse nyt – både teknisk og personligt. 

Jeg har blandt andet lært at bruge MFCC til at udtrække relevante træk fra lyd, så min maskinlæringsmodel kunne klassificere lyde – især Capuchin-fugle. Jeg har også arbejdet med GPIO, lydinput, LED, buzzer og knap på Raspberry Pi, og fået det hele koblet sammen til et fungerende system. Hele processen har givet mig en bedre forståelse af, hvordan man bygger noget komplet.

Struktur og arbejdsrytme

I starten havde jeg svært ved at holde en stabil rytme. Jeg arbejdede uden struktur, hvilket gjorde det svært at holde fokus og være effektiv. Senere begyndte jeg at bruge en modificeret version af Pomodoro-teknikken: 45 minutters arbejde og 15 minutters pause. Det gjorde en kæmpe forskel. Jeg blev langt mere disciplineret og fik meget mere fra hånden.

Jeg fulgte det dog ikke helt slavisk. Hvis jeg var i deep work og var rigtig godt i gang, sprang jeg pausen over for ikke at forstyrre mit flow. Det fungerede bedre for mig end at stoppe midt i noget vigtigt. Så i stedet for at følge en metode 100 %, brugte jeg den som et værktøj og tilpassede den til min egen måde at arbejde på.

Hvad jeg ville gøre anderledes

Hvis jeg skulle starte forfra, ville jeg helt klart strukturere min tid tidligere i forløbet. Jeg ville også dokumentere mere grundigt undervejs, så jeg skulle sidde med ekstra arbejde senere. Og så skulle jeg havde deltaget i flere Proces,Produkt, og ERFA møder. De har helt klart have positiv indflydelse i mit semester.

Alt i alt

Jeg har lært enormt meget – ikke bare om teknologi, men også om hvordan jeg arbejder bedst. Det her semester har virkelig hjulpet mig med at forstå mine egne styrker og svagheder, og jeg føler mig mere klar til både praktik og fremtidige projekter. Der har været fejl og frustrationer undervejs, men det er netop dem, jeg har lært mest af.