Maskinellt lärande i inbyggda system - Vem är på?
Re: Maskinellt lärande i inbyggda system - Vem är på?
Adressen?Shimonu skrev:Okej, låt oss säga att det var sant. Varför räknar du ut adressen för varje element istället för att göra vanlig indexering? Är det också snabbare?
Bara att testa.hummel skrev:Kompilerar den här koden?
Re: Maskinellt lärande i inbyggda system - Vem är på?
Kod: Markera allt
histograms + 256*i
Re: Maskinellt lärande i inbyggda system - Vem är på?
Jag har för mig att skriva array är exakt samma som *(array + i).
Jag ser många gör så här.
Jag ser många gör så här.
Re: Maskinellt lärande i inbyggda system - Vem är på?
Har du verifierat att det verkligen är så? Det är fullt möjligt att kompilatorn genererar ett liknande resultat, t o m effektivare, även av en for-loop. Försök optimera när du märker att det verkligen behövs, när programmet går märkbart långsamt. Och bli inte förvånad om det är en helt annan del av programmet som tar tid än vad du trodde.DanielM skrev:Det är bara 1 rad
Jag gör så istället för att ha en for-loop. Har man en for-loop så tar det tid. Men gör man exakt allt på en enda rad så går det snabbt.
Re: Maskinellt lärande i inbyggda system - Vem är på?
Förra gången funkade det inte på första eller andra eller om det var först på tredje försöket att kompilera koden.DanielM skrev:Shimonu skrev:Bara att testa.hummel skrev:Kompilerar den här koden?
Därför jag frågar om du verifierat att din uppladdade kod i alla fall fungerar att kompilera.
Re: Maskinellt lärande i inbyggda system - Vem är på?
DanielM skrev:Jag har för mig att skriva array är exakt samma som *(array + i).
Jag ser många gör så här.
Ena sättet är väl klart enklare och mer läsbart än det andra?
Re: Maskinellt lärande i inbyggda system - Vem är på?
Japp! Algoritmen fungerar!
Valgrind säger dessutom:
Valgrind säger dessutom:
Kod: Markera allt
// This is just a function to print out the trained histogram
void print_uint8_t(uint8_t* A, int row, int column) {
for (int i = 0; i < row; i++) {
for (int j = 0; j < column; j++) {
printf("%d ", *(A++));
}
printf("\n");
}
printf("\n");
}
// Images
uint8_t A[15*15] = {14,4,12,5,12,6,6,7,10,3,5,3,10,15,3,4,3,10,10,9,2,15,6,15,5,15,3,9,13,10,4,3,11,7,4,5,3,12,8,2,14,14,7,13,14,6,14,14,13,11,13,3,7,2,2,15,4,11,5,7,11,12,7,15,15,13,13,7,11,9,12,10,8,12,9,6,9,14,3,2,2,3,12,10,15,7,13,1,1,2,6,4,3,10,9,3,9,6,10,5,6,11,4,11,11,8,12,9,7,13,5,10,5,14,1,2,14,4,8,9,13,3,1,3,12,5,2,12,6,6,13,2,6,6,14,15,7,1,8,12,15,3,5,1,2,4,9,11,2,12,7,11,15,5,9,1,1,3,4,12,2,10,5,15,10,3,6,6,12,6,9,13,1,11,12,5,3,9,15,15,3,15,3,4,10,5,5,10,11,2,12,6,2,3,15,3,15,11,3,14,2,3,14,11,13,1,12,10,2,13,4,13,6,7,4,14,11,4,10,2,3,9,11,14,8};
uint8_t B[15*15] = {14,3,2,4,4,13,3,8,2,15,13,7,5,2,12,6,3,12,2,8,9,9,7,3,2,14,5,7,2,7,4,7,8,14,12,8,2,5,6,14,5,14,12,3,7,12,5,11,6,13,3,5,3,7,2,14,10,7,6,12,6,1,3,5,6,14,7,2,3,7,5,9,3,4,13,7,13,2,15,4,12,14,14,3,7,11,12,14,6,14,10,9,4,2,12,11,6,11,6,7,6,8,10,8,1,7,13,13,7,3,5,8,5,14,6,2,4,3,10,12,10,14,2,4,15,2,7,5,6,4,15,3,8,8,15,5,13,13,15,14,15,9,11,11,11,9,10,7,3,3,2,4,5,15,9,4,15,1,8,14,5,13,4,5,13,11,9,13,8,5,2,13,5,15,13,2,5,12,9,11,11,15,6,1,5,12,11,8,13,3,11,7,12,2,6,3,1,1,9,5,7,2,1,13,7,6,15,13,12,8,6,3,15,11,7,6,12,6,9,13,9,12,13,5,3};
uint8_t C[15*15] = {2,6,13,8,5,2,6,1,2,12,11,10,15,3,15,2,3,9,4,14,4,15,7,15,2,2,2,15,7,8,6,15,8,7,1,4,14,3,14,15,4,4,9,14,6,15,15,1,8,7,11,14,14,6,10,5,12,1,12,4,13,13,15,12,14,2,7,15,9,1,2,7,4,5,10,7,14,9,15,15,7,1,12,10,9,4,7,2,3,13,14,12,8,13,3,3,10,1,10,2,7,15,2,11,13,13,3,6,7,6,13,11,10,11,14,1,1,13,15,15,15,13,4,4,9,10,9,15,9,8,12,5,3,12,8,2,3,4,11,11,8,8,1,5,9,9,14,4,9,3,15,12,14,5,3,7,9,11,7,14,8,14,11,11,7,4,14,14,10,10,5,14,4,13,4,3,9,6,7,8,11,1,5,10,12,7,10,11,5,7,5,2,1,10,6,6,3,7,9,6,8,4,10,2,9,1,12,6,2,8,9,8,3,2,3,12,1,12,2,2,10,11,10,12,9};
uint8_t D[15*15] = {5,7,5,2,11,9,15,15,7,2,14,9,13,3,8,6,3,3,12,3,11,12,9,2,4,10,5,5,14,15,1,11,3,5,10,4,2,9,13,9,11,10,15,9,5,2,7,10,5,9,7,4,14,11,1,7,15,10,12,3,8,12,14,14,12,14,10,11,13,7,11,6,4,9,8,4,3,11,6,4,8,7,2,14,3,2,14,15,5,4,15,1,15,15,4,5,5,7,14,12,11,13,14,13,14,12,2,12,13,3,13,3,2,12,4,11,8,12,12,10,14,11,12,12,5,6,15,6,6,11,14,7,2,13,11,10,15,5,15,12,5,6,9,1,2,5,13,2,6,9,11,4,2,15,12,1,1,11,15,8,9,12,1,8,9,2,15,4,12,8,1,7,7,12,11,10,11,12,13,15,15,14,11,6,10,1,13,2,4,11,2,3,8,14,7,2,10,13,6,12,5,9,9,5,15,10,6,2,11,3,10,15,11,8,13,9,10,9,8,9,6,4,9,12,5};
uint8_t E[15*15] = {15,1,13,6,9,8,15,13,15,7,13,10,5,4,10,9,10,4,4,5,6,8,5,13,6,12,13,12,2,1,11,13,11,10,15,15,8,11,10,2,6,9,1,6,1,15,6,6,11,8,15,14,4,9,4,10,10,13,13,5,6,13,12,4,9,14,4,3,14,11,2,9,2,3,3,14,13,2,6,5,12,4,1,2,5,8,1,14,6,7,5,6,3,14,7,13,4,13,6,11,10,1,4,6,9,12,6,6,6,15,7,6,14,13,8,15,11,15,14,13,6,4,7,5,3,8,14,7,13,8,2,1,10,13,7,8,2,7,15,9,10,7,11,15,7,5,15,13,14,3,5,9,11,6,3,12,15,4,13,7,13,11,9,1,9,2,12,4,10,11,6,3,14,4,13,1,3,13,14,6,9,15,1,6,8,10,14,2,13,2,15,10,1,4,4,3,5,8,5,1,15,14,2,15,7,4,13,10,1,7,10,3,12,14,14,14,3,3,8,1,2,15,4,15,3};
uint8_t F[15*15] = {7,15,9,6,10,4,11,8,4,14,9,10,8,14,13,10,3,7,1,4,3,12,2,15,11,14,2,14,8,4,1,7,15,14,12,5,6,14,11,14,2,5,2,4,14,15,9,4,5,5,14,12,6,1,12,7,6,14,3,11,13,1,3,1,10,13,9,1,5,5,11,2,3,12,8,14,15,1,1,1,9,14,9,14,9,10,9,1,2,12,11,4,6,13,10,3,13,7,12,8,14,5,2,13,11,6,3,10,12,6,13,4,4,2,14,13,9,14,9,9,8,15,2,12,14,6,1,7,14,12,4,12,2,8,11,11,10,13,15,9,9,8,11,4,15,14,10,13,11,9,1,12,15,2,9,1,6,2,15,4,1,14,1,14,8,10,5,6,15,6,13,13,4,4,4,12,1,7,3,12,5,12,9,15,7,15,6,3,9,10,7,10,2,11,1,6,15,4,5,3,2,7,14,4,12,11,11,8,12,1,15,10,7,10,2,4,14,4,1,10,1,2,14,9,8};
uint8_t G[15*15] = {15,5,15,11,5,15,8,2,8,13,5,13,1,7,6,15,1,4,1,10,7,2,1,4,6,4,1,11,6,8,2,5,6,2,1,6,13,6,5,12,15,15,8,6,10,2,8,1,14,3,11,12,3,7,9,3,1,7,11,4,13,10,13,10,10,3,8,1,2,3,5,14,15,14,4,1,2,11,14,9,13,14,15,1,5,11,10,15,6,15,2,13,1,14,6,6,5,7,6,15,13,6,3,14,13,11,12,1,4,9,2,8,14,4,4,2,4,12,4,13,14,10,7,10,5,5,2,11,12,6,14,15,7,8,8,7,14,7,15,1,14,5,3,11,1,10,5,5,15,2,8,13,7,10,5,5,10,14,13,6,10,2,10,8,1,13,3,10,8,15,2,8,3,12,12,11,8,5,3,11,4,11,2,4,10,5,7,6,15,1,10,5,1,12,10,5,12,13,2,2,2,9,14,12,15,7,11,12,7,3,3,3,12,15,2,1,13,13,15,14,8,4,8,6,1};
uint8_t H[15*15] = {6,9,14,11,7,13,11,8,10,7,4,8,9,12,3,11,3,9,15,1,11,2,4,8,7,2,1,1,5,5,12,6,6,14,6,4,7,10,15,14,5,13,4,9,3,6,7,1,10,6,15,8,10,5,9,7,8,1,10,11,6,2,2,1,3,8,14,7,2,14,8,6,3,5,12,11,6,15,13,3,8,11,2,15,15,10,5,13,5,11,15,10,4,5,6,1,6,12,9,15,15,7,4,2,4,13,2,9,5,8,3,6,11,1,7,7,2,9,1,11,15,3,3,15,14,8,3,7,5,2,13,5,6,9,8,8,13,15,5,1,12,2,15,5,7,13,1,3,8,14,11,6,10,14,6,1,15,2,14,8,15,7,11,15,11,5,12,9,1,14,14,8,3,1,6,10,2,8,6,3,9,11,9,7,1,1,6,7,3,14,4,12,13,3,10,5,15,13,1,5,13,10,1,9,14,15,1,1,12,3,5,3,10,5,10,11,15,4,6,10,8,3,3,4,11};
uint8_t I[15*15] = {2,8,10,10,14,11,14,13,14,2,15,5,3,5,11,14,8,7,3,6,7,11,9,5,5,12,5,9,9,6,13,3,6,8,6,6,6,1,11,12,10,6,6,2,5,15,3,14,9,2,4,10,3,8,15,2,11,7,8,11,9,10,10,15,1,2,5,12,14,11,2,4,2,7,11,9,15,1,5,14,8,2,6,5,14,8,10,5,4,14,9,7,3,11,4,8,5,4,15,5,9,9,1,2,7,8,2,3,8,5,2,2,13,4,15,11,4,14,1,1,8,3,2,6,15,11,13,1,3,6,3,3,2,7,13,8,3,14,2,15,3,14,13,4,2,11,13,6,15,9,13,6,9,9,13,11,9,14,1,6,10,15,1,3,8,2,7,5,6,2,4,4,3,7,5,13,10,4,2,6,11,3,4,2,10,1,8,13,5,5,12,4,4,13,13,8,13,9,3,11,8,1,10,5,10,13,13,1,2,2,12,14,15,8,1,14,4,3,15,6,15,2,15,9,3};
uint8_t J[15*15] = {1,5,10,14,12,9,6,11,4,13,3,5,6,13,10,9,8,2,4,6,13,6,12,5,4,12,14,8,3,11,1,7,3,3,6,1,9,7,12,4,1,6,8,7,12,11,2,15,9,14,7,4,8,14,8,11,9,3,11,9,15,3,3,15,4,5,7,10,13,6,12,5,3,10,10,5,7,1,8,15,8,2,8,3,8,3,12,2,4,12,5,11,13,8,4,1,6,3,11,15,5,12,9,12,3,13,9,8,7,2,3,14,1,1,3,13,2,14,8,12,10,7,9,13,2,8,1,5,9,14,1,1,9,12,15,9,13,1,13,10,10,2,14,10,9,6,10,8,2,13,1,7,4,10,8,14,14,8,5,10,2,7,11,3,6,14,6,13,6,11,12,11,7,15,14,2,11,5,2,3,13,2,11,11,5,14,12,8,4,2,4,5,2,13,1,8,12,10,6,2,12,11,3,11,5,1,7,12,1,3,1,6,6,2,15,10,7,11,5,14,6,13,8,10,10};
// Histogram holder
uint8_t histograms[10*256]; // 10 because we have 10 pictures to train
int main() {
clock_t start, end;
float cpu_time_used;
start = clock();
// Train first the pictures
uint16_t status = lbph(A, 15, 15, histograms, 1, true); // Save at first row
status = lbph(B, 15, 15, histograms, 2, true);
status = lbph(C, 15, 15, histograms, 3, true);
status = lbph(D, 15, 15, histograms, 4, true);
status = lbph(E, 15, 15, histograms, 5, true);
status = lbph(F, 15, 15, histograms, 6, true);
status = lbph(G, 15, 15, histograms, 7, true);
status = lbph(H, 15, 15, histograms, 8, true);
status = lbph(I, 15, 15, histograms, 9, true);
status = lbph(J, 15, 15, histograms, 10, true); // Save at last row
// Print the histograms
print_uint8_t(histograms, 10, 256);
// Now do an image classification
uint16_t index = lbph(J, 15, 15, histograms, 10, false) - 2;
printf("The image is index: %d, and status is: %d\n", index, status);
end = clock();
cpu_time_used = ((float) (end - start)) / CLOCKS_PER_SEC;
printf("\nTotal speed was %f\n", cpu_time_used);
return EXIT_SUCCESS;
}
Senast redigerad av DanielM 8 mars 2020, 23:49:26, redigerad totalt 4 gånger.
Re: Maskinellt lärande i inbyggda system - Vem är på?
Shimonu skrev:DanielM skrev:Jag har för mig att skriva array är exakt samma som *(array + i).
Jag ser många gör så här.
Ena sättet är väl klart enklare och mer läsbart än det andra?
Jag håller med, när jag var ny i C. Då ville jag helst till och med köra 2D arrayer. Men sedan dess har det blivit en vanesak att skriva arrayer på det mera ortodoxa sättet. En array är ju bara en adress med andra ord.
Jag brukar dock använda [ ] för vanliga interna arrayer. Mest bara för att separera argument-arrayer från internt deklarerade arrayer.
Re: Maskinellt lärande i inbyggda system - Vem är på?
Ha Ha Ha// Notice that this is only one line of code. Super fast way to do this
Precis som Shimonu måste jag påpeka att det där sannolikt är fel.
http://www.ioccc.org/1998/banks.c
Re: Maskinellt lärande i inbyggda system - Vem är på?
Så det är bättre med en for-loop?
Jag har själv använt for-loopar till sådant och det drog bara upp tiden.
Edit:
Nu kom jag på även ett bättre sätt.
Jag behöver inte ta abs på alla element. Jag kan summera först och sedan ta abs. Då sparar jag ännu mera tid.
Uppdaterar imorgon.
Jag har själv använt for-loopar till sådant och det drog bara upp tiden.
Edit:
Nu kom jag på även ett bättre sätt.
Jag behöver inte ta abs på alla element. Jag kan summera först och sedan ta abs. Då sparar jag ännu mera tid.
Uppdaterar imorgon.
Re: Maskinellt lärande i inbyggda system - Vem är på?
Det beror på hur man skriver koden i for-loopen.
Jag skrev ett exempel till dig för länge sedan där jag gjorde om din loop från att innehålla typ:
Till:
Det senare brukar gå fortare.
Sen undrar jag varför du ens behöver använda abs() om resultatet blir samma om du summerar utan abs() på varje faktor?
Om det ger samma resultat indikerar det att alla faktorer är positiva (eller alla negativa), och i så fall behövs inte abs() alls, eller?
Jag skrev ett exempel till dig för länge sedan där jag gjorde om din loop från att innehålla typ:
Kod: Markera allt
integral += *(pekare + faktor*i);
Kod: Markera allt
integral += *pekare;
pekare += faktor;
Sen undrar jag varför du ens behöver använda abs() om resultatet blir samma om du summerar utan abs() på varje faktor?
Om det ger samma resultat indikerar det att alla faktorer är positiva (eller alla negativa), och i så fall behövs inte abs() alls, eller?
Re: Maskinellt lärande i inbyggda system - Vem är på?
Tänk en gång till.Jag behöver inte ta abs på alla element. Jag kan summera först och sedan ta abs. Då sparar jag ännu mera tid.
Re: Maskinellt lärande i inbyggda system - Vem är på?
Har du tittat på den genererade assemblern?DanielM skrev:Det är bara 1 rad
Jag gör så istället för att ha en for-loop. Har man en for-loop så tar det tid. Men gör man exakt allt på en enda rad så går det snabbt.
Re: Maskinellt lärande i inbyggda system - Vem är på?
Hehe det ÄR 256 rader. Möjligen är det ett statement, nä vad det kallas på svenska slinter från minnet nu.
Men du kommer att få mer kommentarer om din kodningsstil än kring ditt egentliga problem när du gör som du gör.
Och att det är snabbare med 256 rader är inte säkert alls. Men du ser vart det drar iväg så jag stoppar här
och hoppas du kommer framåt med dit egentliga problemlösande.
Men du kommer att få mer kommentarer om din kodningsstil än kring ditt egentliga problem när du gör som du gör.
Och att det är snabbare med 256 rader är inte säkert alls. Men du ser vart det drar iväg så jag stoppar här
och hoppas du kommer framåt med dit egentliga problemlösande.