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

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
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 »

Ja, men du måste ju koppla ihop allt och se hur det funkar. Skulle du inte använda SVM för detektion?
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 »

SVM, PCA, LDA, KPCA använder man bara en gång vid träningen. Alla dessa algoritmer ger tillsammans en matris. Tar jag denna matris och multiplicerar med en bild som är uttryckt som en lång vektor. Då får jag ett ID i form av ett binärt tal, 0101010.

Så det är ett smart sätt. Fisherfaces med SVM är sedan länge beprövat och har visat sig ett gott resultat. Men detta är inte detektion. SVM är endast för klassificering.

Jag tror du har missuppfattat det där med detektion och klassificering.
Klassificering är att identifiera okänd mätdata.
Detektion är att upptäcka förändringar i okänd data. För en detektionsalgoritm ska vara bra så måste den kunna detektera när en nytt känt objekt inkommer, inte att det okända objektet ändrar sig 1-2%, men är ändå samma objekt.

------------------------------------------------------------
Om du X bilder per klass och det är Y klasser. Varje bild har storleken \(m * n\) och du gör om varje bild till en lång kolumnvektor i row-major. Då får du en vektor som har storleken \(mn * 1\). Sedan staplar du alla dessa \(XY\) bilder till en superstor matris. Denna matris är \(M * N\) där \(M = mn\) är rader och \(N\) är totala antalet bilder, vilket är XY.

Använder du min metod med KPCA -> LDA -> SVM så kommer du tillslut få en matris som är \(Y*M\). Det är denna matris som är identifieringsmatrisen. Denna gör om en bild till en vektor med 0101001. Ja, visst, vi ska använda en aktivitetsfunktion som heter heaviside också, dvs är vektorn negativ, så blir det 0 och är den positiv så blir det 1.

Så vi leker med siffror!
Du har en bild som är \(m = 80\) och \(n = 60\). Du har \(X = 11\) bilder per klass och antalet klasser är \(Y = 15\) stycken.
Då får du en supermatris som har storleken \(M = mn = 4800\) och \(N = XY = 165\), alltså \(4800*165\). Nu kan vi börja träna en modell med KPCA -> LDA -> SVM.

Slutresultatet är då \(15*4800\) som matris som ska ha en aktivitetsfunktion av heaviside. Då kan vi få våran ID i binärt format.
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 »

Jovisst, men jag förstår fortfarande inte vad du vill göra. Fisherfaces utgår väl från att det finns ett ansikte, att det har en viss orientering, position och storlek. Och detta har du redan och vill nu validera automatiskt mot en perfekt ansiktsdetektor? Svårt att hänga med.
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 »

Jag vill klassificera objekt. Det går mycket bra att klassificera objekt om man har en fixerad kamera och ett fixerat objekt. Men börjar objektet flyga omkring eller ändra sin position, så måste man ha detektion.

Fisherfaces är en välbeprövad ansiktsigenkänningsmetod. Den är känd för att man behöver minimalt med data för att träna en modell och erhåller hög noggrannhet. Däremot kan den inte hantera komplexa bilder t.ex. känna igen alla typer av bilar, något som djupa neurala nätverk kan.

Så jag frågar om vilket matrisbibliotek bör jag använda mig av. CMSIS verkar vara en kandidat, finns det något bättre?
Sedan undrar jag om just detektion.
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 »

Aha, så du tänker att din klassificerare fungerar, men du behöver en detektor för att hitta områden i bilden där det finns objekt att klassificera.

Återigen, hur man gör beror på applikationen. Letar man cellförändringar i en lever kanske man kan titta på (rotationsinvarianta) hessianer till exempel. Letar man ansikten kanske man faltar horisontellt med en jämn och en udda funktion (tex sinus och cosinus), där den ena blir noll och den andra maximal när man är mitt på ett ansikte pga symmetri (om man inte behöver hantera roterade ansikten och har ett hum om deras storlek vill säga).

Möjligen kan du använda deskriptorer som HOG eller ORB eller liknande för att hitta punkter (innanför objektes rand) som har unika egenskaper som kan användas för detektering.

Det du vill göra "löses" ju annars med just YOLO som löser detektering samt klassificering samtidigt som ett regressionsbroblem. (Och det är det som anspelas på i "you only look once".) (Och det behöver naturligtvis inte vara en YOLO-algoritm, det finns massor av liknande algoritmer.)

Har du testat att manuellt göra perfekt detektion för att verifiera att din klassifiverare faktiskt fungerar? Det ger ju också en rätt bra bild av hur bra detektorn behöver vara.
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: 12 augusti 2023, 19:51:08 Aha, så du tänker att din klassificerare fungerar, men du behöver en detektor för att hitta områden i bilden där det finns objekt att klassificera.
Exakt.
Jag körde en liten beräkning går och fick 95-97% sannolikhet att den träffar rätt.
Återigen, hur man gör beror på applikationen. Letar man cellförändringar i en lever kanske man kan titta på (rotationsinvarianta) hessianer till exempel. Letar man ansikten kanske man faltar horisontellt med en jämn och en udda funktion (tex sinus och cosinus), där den ena blir noll och den andra maximal när man är mitt på ett ansikte pga symmetri (om man inte behöver hantera roterade ansikten och har ett hum om deras storlek vill säga).
Jag ser att jag har tre alternativ:
  1. Viola Jones - Tyvärr så verkar den bara vara för en klass.
  2. Histogram of Oriented Gradients.
  3. Yolo - Denna som tar massvis med små bilder av en bild och avgör sannolikheten
Möjligen kan du använda deskriptorer som HOG eller ORB eller liknande för att hitta punkter (innanför objektes rand) som har unika egenskaper som kan användas för detektering.
Men kan denna ha flera klasser?
Och om den har flera klasser, då borde den väll kunna identifiera? Jag menar...det finns ju likheter mellan flerklassig detektion och flerklassig identifiering.
Det du vill göra "löses" ju annars med just YOLO som löser detektering samt klassificering samtidigt som ett regressionsbroblem. (Och det är det som anspelas på i "you only look once".) (Och det behöver naturligtvis inte vara en YOLO-algoritm, det finns massor av liknande algoritmer.)
Jag tror mycket på det där om att ta flera små bilder och sedan avgöra en sannolikhet. Metoden verkar vara enkel, men den kräver mycket beräkning.
Har du testat att manuellt göra perfekt detektion för att verifiera att din klassifiverare faktiskt fungerar? Det ger ju också en rätt bra bild av hur bra detektorn behöver vara.
Jag har aldrig provat detektion, förutom DarkNet i C. Men denna kod var ju färdig.
Min klassificerare heter Fisherfaces. Den kom 1997. Fischerfaces finns med i OpenCV. Det är en beprövad metod som kräver lite data. Den kan hantera komplexa system också, men då växer modellen så det tar tid att beräkna. Då är det bättre att använda olinjära modeller för att få ned storleken.

Därför har jag valt att använda Kernel och SVM med i Fisherfaces, istället för ingen Kernel och KNN.
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 körde en liten beräkning går och fick 95-97% sannolikhet att den träffar rätt.
Det kan ju vara bra, men det beror på experimentet. Om 95% av exemplen är av en viss specifik klass och man alltid gissar den klassen så blir det ju så:-)
Viola Jones - Tyvärr så verkar den bara vara för en klass.
Du kan ju använda Haarfeature-delen från Viola-Jones och koppla till vilken klassare/detektor som helst.
Och om den har flera klasser, då borde den väll kunna identifiera? Jag menar...det finns ju likheter mellan flerklassig detektion och flerklassig identifiering.
De är enbart deskriptorer, de kan användas av valfri algoritm, multiklass eller ej.
Jag tror mycket på det där om att ta flera små bilder och sedan avgöra en sannolikhet. Metoden verkar vara enkel, men den kräver mycket beräkning.
Japp, neuralnäten är väldigt beräkningsintensiva. YOLO delar inte upp bilden i småbilder, den gör en stor faltning med nedsampling i flera steg följt av en regressor. Regressorn jobbar därmed på en lägre upplösning än bilden, men det är inte samma sak som att man delat upp inbilden i småbilder. Regressorns olika insampel innehåller överlappande bilddata pga faltning och nedsampling.
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 »

Tror du att jag kan använda Viola-Jones med fisherfaces på något sätt?

YOLO kanske är för mycket beräkningskrävande för mig. Jag blir skitglad om jag kan hantera 15 klasser.

Jag tänkte. Den där algoritmen som jag har, Fisherfaces, har visat sig ha en väldigt bra noggrannhet.
Fisherfaces är egentligen bara en projektering av data. Kombinerar man detta med Support Vector Machine så kommer man få en stor fet matris bara.

Matrismultiplikation kanske är snabbare än att ha en sökalgoritm som utför detta?
1_XX8WqHo0lyrgZfTTRQ3ESQ.jpg
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
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 »

Jag har forskat lite nu.

Jag tror jag överväger att gå över till CNN-nätverk, men inte till 100%.
Jag har tittat på CNN och HOG och börjar nu förstå varför CNN uppfanns. HOG är en effektiv algoritm som hittar strukturer via en metod. CNN är precis som HOG, hitta strukturer, men istället med flera olika metoder. Så CNN är bara ett sätt för att konvertera om en bild. Allt handlar om att man använder en viktmatris av 3x3, 5x5 eller 7x7. Vanligaste är 3x3.

Då kan man få en bild som ser ut så här.

Kod: Markera allt

close all
imshow(x);
figure
imshow(conv2(x, [1 1 1; -1 0 1; -1 -0.7 -1], 'valid'));
Skärmbild 2023-08-27 190129.png
Skärmbild 2023-08-27 190115.png
Det viktmatrisen gör är att skapa en mindre matris igenom att summera och multiplicera vikterna. Beroende på hur vikterna är placerade och numrerade så kan man få olika strukturer. Viktmatrisen är en enkel matris med andra ord, men att hitta den kan vara vanskligt.
Bild

Problemet med att göra detta i C är att man måste använda sig av minst 3 eller flera for-satser för att utföra detta. Sådant tar enormt mycket tid!
Finns det något enklare sätt?

Brukar Fast Fourier Transform användas här?
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Senast redigerad av DanielM 27 augusti 2023, 19:44:18, redigerad totalt 1 gång.
agehall
Inlägg: 427
Blev medlem: 12 augusti 2020, 19:27:54

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

Inlägg av agehall »

Det enkla tricket brukar väl vara att köra FFT på både indata och kärnan först så du slipper falta och istället bara kan multiplicera?
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 »

Tackar!

Jag gjorde ett exempel

Kod: Markera allt

input = imread('yale/Class 1/centerlight.gif');
kernel = [1.2 1 1; 0.1 2 -0.1; -1 -1 -1]; % Fyll i din egen kärna

% Storlek på input och kernel
input_height = size(input, 1);
input_width = size(input, 2);
kernel_size = size(kernel, 1);

% Utför 2D-konvolution genom FFT
conv_result = ifft2(fft2(input, input_height + kernel_size - 1, input_width + kernel_size - 1) .* fft2(kernel, input_height + kernel_size - 1, input_width + kernel_size - 1));

% Klipp till önskad storlek för resultatet
output_height = input_height - kernel_size + 1;
output_width = input_width - kernel_size + 1;
conv_result = conv_result(kernel_size:end-kernel_size+1, kernel_size:end-kernel_size+1);

% ReLU
conv_result(conv_result < 0) = 0;

close all
imshow(input);
figure
imshow(uint8(real(conv_result)))
Jag tror jag får implementera FFT i mitt C program :)
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
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 »

Bra, men tänk på att ett CNN typiskt består av flera lager av faltningar, där kärnorna tränats på något fiffigt vis. (Du visar endast en faltning.) Så länge kärnorna är små (3x3, 5x5, ...) i förhållande till bilden är det inte en bra affär att använda FFT för faltning.
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 »

Jag har tänkt att använda FFT för att extrahera ut olika typer av mönster, precis som HOG gör. Men FFT verkar kunna göra det betydligt snabbare. HOG tar sin tid att bygga upp och göra dessa beräkningar. Det fungerar på kraftfullare datorer, men jag har tänkt och köra detta på mikrokontrollers för begränsade applikationer.

Du rekommenderar mig att använda större kärnor än 5x5?

Notera att jag använder Kernel PCA och LDA för att reducera dimensionen. Sedan använder jag Support Vector Machine för klassificering. Jag tycker SVM ger ett bättre resultat än vanligt neuralt nätverk, så länge datat är linjärt separerat av Kernel PCA.
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 »

Är det någon som vet hur man tränar ett filter via FFT om man vet hur bra prediktion modelen gav?

Här måste man väll använda sig av någon typ utav Reinforcement Learning, dvs vanlig klassisk återkoppling?
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: 28 augusti 2023, 13:54:48 Bra, men tänk på att ett CNN typiskt består av flera lager av faltningar, där kärnorna tränats på något fiffigt vis. (Du visar endast en faltning.) Så länge kärnorna är små (3x3, 5x5, ...) i förhållande till bilden är det inte en bra affär att använda FFT för faltning.
Vad tror du om att använda FFT för att hitta mönster i en bild?
Det är ju detta som CNN gör. Fast jag har tänkt och göra det lite mera manuellt för att själv ta beslut om det är optimalt eller inte för att skicka vidare datan i andra beräkningar.
1_yfN4VHs2A_sp8xki1UwXig.png
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Skriv svar