Matrisalgebra för processorer - Är CMSIS det bästa man ska ha?

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
DanielM
Inlägg: 2194
Blev medlem: 5 september 2019, 14:19:58

Matrisalgebra för processorer - Är CMSIS det bästa man ska ha?

Inlägg av DanielM »

Jag tänker göra matrisalgebra på processorer. Dom beräkningarna jag ska göra är matris multiplicerat med vektor \(y = Ax\).
Det är också en rätt stor matris. Kan vara flera tusen rader och tusen kolumner.

Jag tänkte fråga er fyra frågor:
  1. Är CMSIS det bästa bibliotek man kan använda för att göra matrisalgebra för ett inbyggt system? Jag vill utnyttja hårdvaran så mycket som möjligt.
  2. Mina matriser är i datatypen float men vektorerna är av datatypen integer. Finns det något sätt som man kan konvertera en flyttalsmatris till heltalsmatris, utan att förändra slutresultatet procentuellt proportionellt, dvs om \(A\) multipliceras med \(x\) så får man \(y\) men om \(A\) bestod av heltal så skulle man få ett annat \(y\), som är bara proportionellt förändrat. Då skulle man kunna få ned storleken fyra gånger om man använder int8_t som datatyp for matrisen \(A\) istället för float, då vektorn \(x\) är av datatypen uint8_t.
  3. Det jag håller på med är bildigenkänning med Kernel Principal Component Analysis + Multiclass Linear Discriminant Analysis och Support Vector Machine tillsammans med kvadratisk programmering. Dessa tillsammans genererar i stort sett en enda stor matris tillbaka. Så om jag tar en bild och gör den till en lång vektor i Row-Major, sedan multiplicerar jag bilden med matrisen, så kommer jag få en kod i uint16_t. Koden representerar ett ID-nummer på en okänd bild. Jag använder denna för klassificera bilder. Men jag skulle behöva någon som kan verifiera objekt också t.ex. "Här är ett okänt objekt". Då tänkte jag om ni har kunskap inom Viola-Jones algoritmen eller Histogram of Oriented Gradients algoritmen eller någon annan. Dessa algoritmer är bara för att detektera objekt, inte klassificera objekt. Detektion ska vara att den känner igen ett speciellt mönster men kan inte veta vad det är. Den måste vara resurssnål. Vad skulle ni ha valt då? Skulle ni ha valt YOLO-algoritmen, som tar flera små bilder av en bild och avgör sannolikheten vilken småbild som tillhör en viss klass?
  4. Jag har lite svårt att avgöra om en detektionsalgoritm kan vara för flera klasser eller bara en. Om den är för flera klasser, så borde det väll vara en klassificeringsalgoritm?
Bild
guckrum
Inlägg: 1691
Blev medlem: 19 juni 2012, 09:04:27
Ort: Lund

Re: Matrisalgebra för processorer - Är CMSIS det bästa man ska ha?

Inlägg av guckrum »

Mycket på en gång där:-)

1. Ingen aning om hur moget och buggfritt det är. Du får testa.

2. Hur bra det funkar med heltal beror på applikationen och hur många bitar du kan tänka dig att jobba med. Du kan multiplicera upp alla dina flyttal så att de blir heltal, men dynamiken kan ju bli väldigt stor. Och att få in det i åtta bitar, ja om applikationen klarar att vara så pass "lossy". Det finns hur mycket som helst att läsa om detta, men olika appöikationer har olika lösningar.

3. Nu minns jag inte detaljerna, men Viola-Jones är väl Haarfeatures i olika storlekar beräknade på ett effektivt sätt. Och HOG är en feature/descriptor som används i SLAM. Lite olika saker.
Om du skall hitta objekt kan ju någon YOLO eller liknande neuralnätalgoritm vara ett alternativ. Det beror på vad du skall ha det till och vilken prestanda du behöver. Samt hur mycket tid du är beredd på att träna och optimera algoritmen.

4. Kanske googla "multiclass classification" hjälper?
guckrum
Inlägg: 1691
Blev medlem: 19 juni 2012, 09:04:27
Ort: Lund

Re: Matrisalgebra för processorer - Är CMSIS det bästa man ska ha?

Inlägg av guckrum »

Hmm, undrar om du inte missförstått YOLO lite. Bilden du bifogar är lite konstig. Det sker ingen uppdelning i småbilder, snarare faltas hela inbilden med ett antal kärnor i flera lager som succesivt samplas ned. Därefter sker en selekteringsprocess av erhållna boundingboxes per klass. Osv.
DanielM
Inlägg: 2194
Blev medlem: 5 september 2019, 14:19:58

Re: Matrisalgebra för processorer - Är CMSIS det bästa man ska ha?

Inlägg av DanielM »

guckrum skrev: 9 augusti 2023, 23:28:16 Mycket på en gång där:-)

1. Ingen aning om hur moget och buggfritt det är. Du får testa.

2. Hur bra det funkar med heltal beror på applikationen och hur många bitar du kan tänka dig att jobba med. Du kan multiplicera upp alla dina flyttal så att de blir heltal, men dynamiken kan ju bli väldigt stor. Och att få in det i åtta bitar, ja om applikationen klarar att vara så pass "lossy". Det finns hur mycket som helst att läsa om detta, men olika appöikationer har olika lösningar.

3. Nu minns jag inte detaljerna, men Viola-Jones är väl Haarfeatures i olika storlekar beräknade på ett effektivt sätt. Och HOG är en feature/descriptor som används i SLAM. Lite olika saker.
Om du skall hitta objekt kan ju någon YOLO eller liknande neuralnätalgoritm vara ett alternativ. Det beror på vad du skall ha det till och vilken prestanda du behöver. Samt hur mycket tid du är beredd på att träna och optimera algoritmen.

4. Kanske googla "multiclass classification" hjälper?
Fungerar bara CMSIS på ARM?

Jag tror man inte gör som du tänker. Jag tror att man formar om matrisen i från grunden.

Jag visste inte att HOG var för SLAM algoritmen. Men då kanske Viola Jones är den enda lösningen. Men samtidigt, att göra fisherfaces med SVM kanske är ännu mindre resurskrävande då det är bara en stor matris och ingen sökalgoritm som Viola Jones är.

Nja. Neutrala nätverk försöker jag hålla mig borta ifrån. Dom är för enkla att träna och tro att nu är den fulltränad. Det fungerar för färdiga recept och färdig data. Men för egen skapad data så är det enormt svårt att träna ett djupt neutralt nät.
DanielM
Inlägg: 2194
Blev medlem: 5 september 2019, 14:19:58

Re: Matrisalgebra för processorer - Är CMSIS det bästa man ska ha?

Inlägg av DanielM »

guckrum skrev: 9 augusti 2023, 23:43:10 Hmm, undrar om du inte missförstått YOLO lite. Bilden du bifogar är lite konstig. Det sker ingen uppdelning i småbilder, snarare faltas hela inbilden med ett antal kärnor i flera lager som succesivt samplas ned. Därefter sker en selekteringsprocess av erhållna boundingboxes per klass. Osv.
Det är det bilden förklarar. YOLO tar en bild. Från denna bild då tar den mindre små bilder. Från dessa små bilder blir det mindre och mindre bilder.

När en stor grupp av bilderna visar en gemensam uppsticksande sannolikhet så har ett objekt hittats.

Detta kräver mycket datorkraft om man vill ha hög FPS på skärmen. Annars får man nöja sig med sega uppdateringar.
.
guckrum
Inlägg: 1691
Blev medlem: 19 juni 2012, 09:04:27
Ort: Lund

Re: Matrisalgebra för processorer - Är CMSIS det bästa man ska ha?

Inlägg av guckrum »

Undrar om den som ritat bilden förstått hur algoritmen funkar :-)
guckrum
Inlägg: 1691
Blev medlem: 19 juni 2012, 09:04:27
Ort: Lund

Re: Matrisalgebra för processorer - Är CMSIS det bästa man ska ha?

Inlägg av guckrum »

Jag tror man inte gör som du tänker. Jag tror att man formar om matrisen i från grunden.
Ja det finns många sätt beroende på vad man skall ha det till. Ett annat populärt alternativ ur lösningsspektrumet kan vara "compressed sensing".

Du måste förtydliga vad du vill göra och vad det får kosta i termer av tex exekveringstid, hårdvara och utvecklingsresurser. Annars är det omöjligt att svara. Antal objekt, deras storlekar och behov av storleksinvarians är andra nyckelparametrar.

YOLO tränar du med fördel inte från scratch, utan man tar ett förtränat backbone som man finetunar med egen träningsdata. Annars blir det jobbigt.
DanielM
Inlägg: 2194
Blev medlem: 5 september 2019, 14:19:58

Re: Matrisalgebra för processorer - Är CMSIS det bästa man ska ha?

Inlägg av DanielM »

>> Ett annat populärt alternativ ur lösningsspektrumet kan vara "compressed sensing".

Jag har kollat på "compressed sensing". Det är en optimeringsalgoritm. Man använder sig av glesa vektorer för att hitta ett specifikt index. Compressed sensing är känslig för variationer.

>> Du måste förtydliga vad du vill göra och vad det får kosta i termer av tex exekveringstid, hårdvara och utvecklingsresurser. Annars är det omöjligt att svara. Antal objekt, deras storlekar och behov av storleksinvarians är andra nyckelparametrar.

Det jag vill uppnå är bildigenkänning på en STM32:a. Tänk en liten kamera som tar en halvdålig bild med låg upplösning. Denna bild skall multipliceras med en stor matris. Matrisen är den så kallade tränade modellen. Orsaken varför jag valde matriser istället för neurala nätverk, har med storleken på neurala nätverk är alltid det dubbla jämfört med enskilda matriser samt matriser är snabbare. Fördelen med neurala nätverk är att man kan hantera "olinjär matrisalgebra" och därmed kunna hantera flera klasser, trots samma storlek som en vanlig matris. Men nackdelen med neurala nätverk är att det krävs väldigt mycket data, och dessutom bra data, för att träna ett neuralt nätverk. Enligt min gamla lärare så går gränsen vid minst 10 tusen bilder per klass. Det brukar vara lämpligt.

>> YOLO tränar du med fördel inte från scratch, utan man tar ett förtränat backbone som man finetunar med egen träningsdata. Annars blir det jobbigt.

Jag har bara använt mig av DarkNet när jag körde YOLO i C.
Jag vet att ST Microeletronics har Cube-AI stöd för att kunna implementera neurala nätverk på en STM32:a, oavsett storlek. Men jag är inte imponerad över deras resultat. Oftast är det bara något superenkelt neuralt nätverk som kan klassificera 10 olika klasser på enkla bilder.
guckrum
Inlägg: 1691
Blev medlem: 19 juni 2012, 09:04:27
Ort: Lund

Re: Matrisalgebra för processorer - Är CMSIS det bästa man ska ha?

Inlägg av guckrum »

Visst, men vilket problem tänker du lösa med "bildigenkänningen"? Räkna får på satelitbilder, hitta sprickor i vindkraftverksblad, cellförändringar i MR-bilder, orientera dig i en lokal, skilja på katter och hundar, ...?

Lösningen kommer att variera beroende på problemet.

Kanske börja med ett litet begränsat problem och ta det därifrån?
DanielM
Inlägg: 2194
Blev medlem: 5 september 2019, 14:19:58

Re: Matrisalgebra för processorer - Är CMSIS det bästa man ska ha?

Inlägg av DanielM »

Om jag får förklara lite av min teori på hur jag tänker göra. :)

Projektion: Steg 1
Antag att vi har en bild som heter \(A\). Den har storleken \(m * n\). Vi vill klassificera den då bilden är okänd.
För att klassificera en bild så kan vi göra ett stor kluster av bilden. Men det kommer se ut som en gröt då en bild innehåller flera olika dimensioner, allt mer än 3D. Så det vi kan göra är att reducera ned dimensionen på bilden.

När man reducerar ned dimensionen på en bild så kommer bilden allt mer se enklare och suddigare ut. För att reducera ned dimensionen på en bild så använder man sig av något som heter PCA. PCA projekterar bilden på en annan dimension, med avseende på mest varians. Dvs bara dom mest vanligaste egenskaperna kommer med. En projektion är alltså en matris \(W_{pca}\). Viktigt att man tar transponatet också då \(W\) innehåller singulära egenvektorer.

\(y = W_{pca}^TA\)

Nu är \(y\) en lång vektor som är en förenklad bild där medelvärderna av variationerna kommer endast med. Så om man har flera olika ansikten i \(A\) så kommer man få ett medelvärdesansikte i \(y\).

Projektion: Steg 2
Nu när vi har \(y\) så kan vi göra ytterligare en projektion via LDA. LDA projekterar igenom att separera olika klasser. LDA är en övervakad algoritm, jämfört med PCA som är en oövervakad algoritm, dvs med LDA så behöver vi ha ett ID nummer på varje bild, medan PCA tar inte hänsyn till vilket ID nummer varje bild har. En fördel med LDA är att den kan hantera variationer i datat.

Det är samma projektion med LDA som PCA. Matrisen \(W_{lda}\) innehåller osingulära egenvärden.

\(z = W_{lda}^Ty\)

\(z\) är nu en vektor som är så separerad från övriga klasser att nu kan vi göra identifiering på \(z\).
Men vänta! Vi kan ju baka ihop

\(W = W_{lda}^T*W_{pca}^T\)

Nu sparar vi beräkning. :tumupp:

Klassificering: Steg 3

För klassificering tänkte jag att man ska använda Support Vector Machine. Support Vector Machine genererar en rad matrix \(S\) som har storleken \(1 * n\) per klass. Så om vi har \(p\) klasser, så kommer vi få en matris \(p * n\).

Om vi nu tar och bakar ihop \(W\) och \(S\) så får vi ytterligare en matris

\(K = W*S\)

Så om vi tar våran urspringsbild \(y\) och multiplicerar med \(K\) så kommer vi få en \(p\) lång vektor. Denna vektor innehåller bara \(0\) och \(1\) och därmed så kan man göra bit-operationer för att få fram ett nummer.

Förbättring: Steg 4

Istället för PCA så kan man använda Kernel PCA. Kernel PCA är en olinjär metod igenom att man tar sin data, och applicerar en kärna på den, vilket gör att dimensionerna ökar radikalt. Sedan använder man PCA för att reducera ned dimensionerna. Resultatet är att olinjära egenskaper konverteras som till linjära. Kernel PCA har visat sig ge väldigt bra resultat för klassificering då det finns olika valfrihet att vända olika kernels, till skillnad från ISOMAP och UMAP som är iterativa algoritmer för projektion och. Kernel PCA kör man bara en gång.
Senast redigerad av DanielM 10 augusti 2023, 10:18:05, redigerad totalt 1 gång.
DanielM
Inlägg: 2194
Blev medlem: 5 september 2019, 14:19:58

Re: Matrisalgebra för processorer - Är CMSIS det bästa man ska ha?

Inlägg av DanielM »

guckrum skrev: 10 augusti 2023, 10:14:20 Visst, men vilket problem tänker du lösa med "bildigenkänningen"? Räkna får på satelitbilder, hitta sprickor i vindkraftverksblad, cellförändringar i MR-bilder, orientera dig i en lokal, skilja på katter och hundar, ...?

Lösningen kommer att variera beroende på problemet.

Kanske börja med ett litet begränsat problem och ta det därifrån?
Det ska vara enkla situationer. Vi säger att jag har en fixerad kamera som ska avgöra ett fixerat objekt. Ca 10 klasser. Jag har inte så mycket data heller, så neurala nätverk passar inte mig.
guckrum
Inlägg: 1691
Blev medlem: 19 juni 2012, 09:04:27
Ort: Lund

Re: Matrisalgebra för processorer - Är CMSIS det bästa man ska ha?

Inlägg av guckrum »

Du får fundera på hur din dimensionsreduceringsmetod hanterar om objektet du vill klassa befinner sig på olika ställen i bilden, om dess storlek ändras eller om det roteras.
DanielM
Inlägg: 2194
Blev medlem: 5 september 2019, 14:19:58

Re: Matrisalgebra för processorer - Är CMSIS det bästa man ska ha?

Inlägg av DanielM »

Ja, det är därför jag har behov utav detektion. Men Viola Jones kan bara hantera en klass.

Så det jag hade tänkt är att man gör lite som YOLO gör. Alltså tar små bilder av en stor bild och sedan så avgör man vilka bilder, inom visst område, så visar samma resultat.

Jag vet att OpenCV har något som heter Fisherfaces, vilket är den algoritm som jag använder. Den är från 1997, men jag har kompletterat med SVM och Kernel PCA, vilket är en förbättring av Fisherfaces. Ursprungligen så används KNN istället för SVM, men KNN kräver väldigt mycket sparad data, medan SVM är snålare. KNN brukar normalt ge bättre resultat då den är anpassad för olinjär data, medan SVM är bara för linjär data. Men med tanke på att jag använder Kernel PCA så kommer min data vara linjärt separerad.

Men jag vet inte vilka detekteringsalgoritmer OpenCV har.
guckrum
Inlägg: 1691
Blev medlem: 19 juni 2012, 09:04:27
Ort: Lund

Re: Matrisalgebra för processorer - Är CMSIS det bästa man ska ha?

Inlägg av guckrum »

Du måste börja koda upp någonting så att du får en bättre förståelse av vad som funkar och inte!

Använd Octave, Matlab, OpenCV, Scikit eller vadsomhelst som du är bekväm med och kan jobba snabbt i.

Såhär tänker jag mig att man kan lägga upp projektet, VÄLDIGT kortfattat:

1. Implementera en algoritm som löser ditt problem, oavsett hur, så att du vet att problemet är lösbart och ger en referens på hur bra det kan funka.

2. Om lösningen är för komplex, hitta en bättre algoritm.

3. Optimera algoritmen mot ditt case.

4. Gå mot implementation på målplatform. Senast här blir valet av matrisbibliotek kritiskt.

Naturligtvis har man hela tiden målet och dess vilkor i sikte när man jobbar, så att man hela tiden kan anpassa sig eller avbryta om man kör fast.
DanielM
Inlägg: 2194
Blev medlem: 5 september 2019, 14:19:58

Re: Matrisalgebra för processorer - Är CMSIS det bästa man ska ha?

Inlägg av DanielM »

>> Du måste börja koda upp någonting så att du får en bättre förståelse av vad som funkar och inte!
>> Använd Octave, Matlab, OpenCV, Scikit eller vadsomhelst som du är bekväm med och kan jobba snabbt i.

Jag har redan ANSI C-kod för Fisherfaces, SVM, PCA, Kernel PCA, Dbscan och allt annat. Samt även för MATLAB. Så metoderna har jag redan testat. Fisherfaces ger ett väldigt bra resultat.

Så det är bara detektion som jag tänkte bolla några några frågor med er :)
Skriv svar