View Full Version : [PROBLEM] - Bsp 3.3
Sir Bobolo
14-05-2007, 13:36
ich verstehe noch nicht ganz wie dieser transponse trick funktionieren soll...
muss ich da EINEN eigenvektor v ausrechen mit dem ich dann weiterrechne?
kann mir vielleicht jemand einen tipp geben wie ich das am besten in matlab angehen soll?
Nein, nicht nur einen. Du berechnest Dir anstatt der Eigenvektoren von A*A' (-> 19500 Eigenvektoren) die Eigenvektoren von A'*A (-> 48 Eigenvektoren). Das machst Du mit der Funktion eig().
Damit man aber die richtige Eigenface-Matrix am Schluß bekommt, muß man halt am Schluß die sortierten Eigenvektoren (48x48 Matrix) mit A multiplizieren: eigenfaces=A*V
LG
Sebastian (EFME-Tutor)
Sir Bobolo
14-05-2007, 15:33
danke das hilft mir wirklich weiter...
Walter Huber
17-05-2007, 19:20
also ich hab jetzt alles bis inklusive dem sortieren der eigenvektoren gemacht.
wie komme ich jetzt mit den Vsort und Dsort auf meine Matrix U?
A*V ist deine Matrix U
Dsort brauchst du nichtmehr, das war nur da um die Eigenvektoren zu sortieren um es nach Relevanz der Eigenvektoren/faces zu sortieren
Also wenn ich A einfach mit V multipliziere komme ich auf U? Wofür brauch ich dann mein eigsort??
Oder brauch ich das erst dann, wenn ich die anderen Punkte einbaue??
Lg
Spite
edit:
So sieht dann mein Eigenface1 aus, stimmt das????:
Also wenn ich A einfach mit V multipliziere komme ich auf U? Wofür brauch ich dann mein eigsort??
...
Du mußt A schon mit dem sortierten V multiplizieren (Vsort oder wie auch immer).
LG
Sebastian (EFME-Tutor)
Walter Huber
18-05-2007, 15:05
so jetzt bin ich wieder an ein problem gestossen.
ich hab mir jetzt den vektor mit den koeffizienten erstellt mit y = U'*x
doch beim versuch zu rekonstruieren hab ich bemerkt das sich mein bild durch addieren des mean face nicht ändert.
ja und dann hab ich halt mal geschaut was in dem vector der koeffizienten so drinnen steht.
und die werte darin sind einfach viel zu hoch.
soll ich die irgendwie zwischen 0 und 255 bringen?
oder sollte das gar nicht passieren?
hast du deine fertige Matrix U auch normalisiert? Die Vektoren müssen alle Einheitsvektoren sein. Verwende normc(U)
Walter Huber
18-05-2007, 15:41
ja danke das war natürlich mein problem ...
hab statt U = normc(U);
normc(U);
gehabt ... das hat narürlich nicht so viel bewirkt ;)
jo bei mir auch genau das selbe Problem, genau als dus geschrieben hast hab ich mir dacht : Ajaaa, daran könnts liegen ^^
Sir Bobolo
18-05-2007, 17:51
mit welchen komponenten soll ich das gesicht rekonstruieren?
ich baue da auf ein bild aus U auf indem ich (nachdem ich es mit dem vorher ausgerechnetem vektor multipliziere) das mean bild dazuaddiere?
in U stehen deine ganzen Eigenvektoren drinnen (als Kolumnen)
Diese Eigenfaces wurden aus den Differenzen vom eigentlichen Face mit dem Meanface gebildet. Sprich um eine verlustfreie Rekonstruierung eines Faces in der Datenbank zu erreichen, musst du dir die Koeffizienten für jeden der Einheitsvektoren in U berechnen (sind 48 Stück anfangs) und die Summe aller dieser gewichteten Einheitsvektoren aufaddieren.
Am Ende musst du aus dem oben erwähnten Grund die Differenz, also das Mean Face, wieder hinzuaddieren. Um Kompression zu erreichen würdest du halt nur die relevantesten Eigenfaces aufaddieren. Die Funktion die dir also das Bild rekonstruiert sollte also die m ersten Spalten der Eigenfacematrix auslesen, daraus die Koeffizienten ausrechnen, und anschließend die Koeffizienten mit den entsprechenden Eigenfaces multiplizieren.
Falls ich jetzt etwas unklar gesprochen hab frag halt nochmal konkreter nach ^^
Walter Huber
18-05-2007, 19:03
so ich glaub echt das ich jetzt fast fertig bin.
etwas stört mich jedoch noch.
die rekonstruierten bilder sehen nicht ganz perfekt aus und ich weiss nicht ob sie das sollten.
jetzt hab ich aber die bilder meiner kollegen und von mir reingetan und plötzlich hat es super perfekt funktioniert bei allen bildern ausser bei denen von uns.
dann hab ich bemerkt das ich beim einlesen der bilder den fehler gemacht hab die werte nicht nachher von 0 - 255 zu skalieren.
und siehe da die ergebnisse sind wieder so schlecht wie vorher.
also poste ich jetzt mal zwei bilder von dem ersten face einmal mit korrekt berechnetem mean face, und einmal mit einem mean face das statt durch 51 (soviele bilder sind jetzt in A) durch 60 dividiert wird. (ich weiss das ergibt keinen sinn, aber wie gesagt da komm ich auf schönere rekonstruktion.
@Sulik:
Ich versuchs nach deiner "Anleitung" zu machen ;)
Aber ich steh irgendwie auf der Leitung....
Ich hab jetzt eine funktion geschrieben calcCoefficients(U, i), wobei U die Eigenfaces sind, und i die gewünschte Nummer des zu berechnenden Bildes... Ist das mal richtig?? Oder muß ich die faces nehmen, also die Startbilder?? Lt. Formel im Skriptum brauch ich dafür das U....
Wenn ich U nehme, kommen fast überall 0-Werte heraus bei den Koeffizienten, wenn ich aber die Faces nehme, sinds überall Zahlen, mit 9 Stellen, was stimmt jetzt?
Und, wie meinst du das da: ...und die Summe aller dieser gewichteten Einheitsvektoren aufaddieren.??
Fragen über Fragen ;)
Lg
Spite
edit:
Also ich habe einfach y(:,i) = transpose(U) * U(:, i); stimmt das so?
Weil wenn ich das y dann ausgeben lass (wenn ichs für alle Bilder mach), dann kommt eine 48*48 Matrix raus, in der in der Diagonalen immer 1 steht, sonst nur (fast) 0, und in der letzten Spalte und Zeile kleine, von 0 verschiedene Werte, da passt doch was nicht, oder soll das so sein?? (wenn ich hier keinen Code posten darf, bitte sagen, dann lösch ichs wieder....)
edit2:
Mal von vorne:
stimmt mal das angehängte Mean-Face? weil wenn das nicht stimmt, is es e klar, das nichts passt ;)
edit3:
Wenn ich das da mache:
B = transpose(A) * A;
[V,D] = eig(B);
[Vnew,Dnew] = eigsort(V,D);
und mir mal die V ausgeben lasse, so steht in der ersten Spalte immer der selbe wert, stimmt das so?
Wundert mich nur, weil in B nirgends gleiche Werte drinnen stehen....
Bin ich ein Trottel^^
Wer lesen kann ist tatsächlich eindeutig im Vorteil ;)
Ich hab die Koeffizienten so berechnet (für 1 Bild)
coeff(:, 1) = transpose(U) * U;
anstatt so
coeff(:, 1) = transpose(U) * face;
Als komplett rekonstruiertes Bild hab ich dann das Ergebnis von Walter_Huber oben links)
Lg
Spite
edit:
Wobei ich mich noch was Frage:
Wie bekomme ich das hin, dass sich eine Animation ergibt??
Jemand eine Idee?
Problem gelöst!
"drawnow" ist unser Freund ;)
Lg
Spite
Ein Problem habe ich noch:
Bei diversen Bildern sieht die Rekonstruktion schon ziemlich anders aus, als die Originalbilder, hat das eventuell was mit den "...und die Summe aller dieser gewichteten Einheitsvektoren aufaddieren" zu tun??
(weil wenn ich, so wie Walter_Huber beim berechnen des Mean-Faces durch eine viel höhere Zahl dividiere, kommen viel bessere Rekonstruktionen dabei heraus!!!)
Lg
Spite
Ein Problem habe ich noch:
Bei diversen Bildern sieht die Rekonstruktion schon ziemlich anders aus, als die Originalbilder, hat das eventuell was mit den "...und die Summe aller dieser gewichteten Einheitsvektoren aufaddieren" zu tun??
(weil wenn ich, so wie Walter_Huber beim berechnen des Mean-Faces durch eine viel höhere Zahl dividiere, kommen viel bessere Rekonstruktionen dabei heraus!!!)
Lg
Spite
Die Rekonstruktion sollte, wenn man alle Eigenfaces verwendet, schon wie das Original ausschauen.
LG
Sebastian (EFME-Tutor)
Walter Huber
19-05-2007, 13:06
hm... na dann ist meine lösung auch noch nicht ganz richtig?
oder passt das erste bild?
Anscheinend machen wir was falsch :(
@buschti:
zum Punkt 2: Koeffizienten berechnen:
Argumente sollen sein: U (eigenfaces) und faces (original-bilder) oder??????
Weil wenn ich mir die Koeffizienten berechnen lasse mit diesen Argumenten: 'U und A' statt 'U und faces' (wobei a Originalbilder - Mean-bild ist) Dann rekonstruierts ganz ordentlich.....
Kann das sein, dass das der Fehler war??
Lg
Spite
Das ist mein newface rekonstruiert mit 48 komponenten. habt ihr was ähnliches?
Wie bist du denn vorgegangen??
Mir fällt dazu nichts ein, oder anders gesagt:
bleibt unser U gleich (eigenfaces)?, wie dann die koeffizienten berechnen?? usw.
oder alles neu berechnen? bin shcon a bissl auf der seitn heute, von dem ganzen herumprobiern ;)
Lg
Spite
PS: wenn du das hier posten könntest, könnte ich dir dann mein Ergebnis zeigen ;)
edit:
hab einfach das Mean vom neuen Originalbild abgezogen, dann Koeffizienten berechnet (mit den Eigenfaces von vorher) und komme so auch zu deinem Ergebnis jetzt ;) )
HA - wär doch gelacht, denn das nicht stimmt ;)
siehe dieses hier:
Ich hab leider keine Ahnung wie die Rekonstruktion genau von statten geht...
Ich hab jetzt mein Ergebnis bestehend aus der eigenvektor Matrix (selbe größe wie Faces, name: EigVekt) und dem Durchschnitt...
Was jetzt ?...
Edit:
steht eh schon weiter oben -> Coeffizienten berechnen und danach Rekonstruieren -> Rekonstruktion schaut genauso wie Original
hm... na dann ist meine lösung auch noch nicht ganz richtig?
oder passt das erste bild?
Kommt drauf an, ob das rekonstruierte Face in den Eigenfaces enthalten ist (ist es eines der 48 zur Erstellung der Eigenfaces verwendeten Bilder?).
Generell: Alle 48 Originalbilder können wieder perfekt rekonstruiert werden. Alle Faces, die nicht in den Eigenfaces enthalten sind, können im allgemeinen nur näherungsweise rekonstruiert werden.
LG
Sebastian (EFME-Tutor)
Alle 48 Originalbilder können wieder perfekt rekonstruiert werden.
jup das funktioniert bei mir auch... Bei newface hab ich genau das selbe ergebnis wie spite
Hat es einen speziellen Grund warum Matlab bei mir die Funktion "normc" nicht kennt??
Standardinstallation Matlab 7.4, Studenten version vom Zid @ WinXp.
Danke!
hab das selbe problem. liegt vermutlich daran, dass bei der studenten-version keine Neural Netrwork Processing Toolbox dabei ist?
hab mal eine eigene version der funktion verfasst. bitte um korrektur, falls da was nicht stimmt:
function normc = normc( A )
[rows cols] = size(A);
tmp = zeros(rows, cols);
for i = 1 : cols
length = sqrt( sum( A(:,i) .^ 2 ) );
tmp(:,i) = A(:,i) ./ length;
end;
normc = tmp;
hab mal eine eigene version der funktion verfasst. bitte um korrektur, falls da was nicht stimmt:
function normc = normc( A )
[rows cols] = size(A);
tmp = zeros(rows, cols);
for i = 1 : cols
length = sqrt( sum( A(:,i) .^ 2 ) );
tmp(:,i) = A(:,i) ./ length;
end;
normc = tmp;
Stimmt, normc ist Teil der Neural Network Toolbox.
Deine eigene Implemntierung dürfte aber auch richtig sein.
LG
Sebastian (EFME-Tutor)
Wenn ich nun ein Bild von mir in Spalte 49 in die Datenbank gebe, so funktioniert alles nach wie vor wunderbar. Nur, wenn ich dann mein eigenes Gesicht rekonstruieren lassen will, gibt's folgendes Problem:
- bei 48 Koeffizienten kommt genau mein Bild raus.
- bei 49 Koeffizienten kommt was ganz anderes raus.
Bei den anderen Gesichtern funktioniert's aber mit 49 Koeffizienten.
Hat jemand eine Idee, woran das liegen könnte?
Die 48 kommt nirgends hardgecodet vor. Alles mit einer Variable, die anhand der Größe von faces gesetzt wird. Ich füge mein Bild VOR der Größenbestimmung ein.
Der 49te Koeffizient ist in diesem Fall ein ziemlich hoher negativer Wert, und der verschandelt mir dann das ganze Bild wieder.
Danke, aba ich hab mir dann eine eigene normc geschrieben, die auch ganz gut funkt. :)
Aba eines versteh ich bei der Rekonstruktion net ganz:
Das Rekonstruieren der Faces geht nur, wenn ich als Input für meine Rekontruktions-Methode ein Bild aus A nehme (und nicht aus U zB).
Stimmt das? Wenn ja, warum? Wenn nicht, was dann?
Ich glaub hier irgendeinen Denkfehler zu haben...
hab da eine frage:
ich zeige die 9 gesichter mit den geringsten eigenvalues an, welche ja an sich immer weniger konturen zeigen sollten. das passt meiner meinung nach auch bei den ersten 8, aber beim letzten dann nicht.
ist das ok/normal/falsch/gibts dafür eine erklärung? :confused:
bzw. wie kann man überprüfen, ob die vektoren/werte auch richtig sortiert wurden?
@vogi:
würde mal sagen, A. weil du U ja eben auch aus A errechnet hast und nicht aus den faces
Danke, aba ich hab mir dann eine eigene normc geschrieben, die auch ganz gut funkt. :)
Aba eines versteh ich bei der Rekonstruktion net ganz:
Das Rekonstruieren der Faces geht nur, wenn ich als Input für meine Rekontruktions-Methode ein Bild aus A nehme (und nicht aus U zB).
Stimmt das? Wenn ja, warum? Wenn nicht, was dann?
Ich glaub hier irgendeinen Denkfehler zu haben...
Ja klar aus A. U wurde ja aus A gebildet, und somit sind alle Spalten/Faces von A anhand von U zu rekonstruieren.
LG
Sebastian (EFME-Tutor)
irgendwie will die Rekonstruktion noch immer nicht so ganz :(
Ich habe meine matrix mit den Eigenfaces U und ich wähle ein Bild aus A aus zum rekonstruieren. Dann berechne ich mir die Koiffizienten für dieses Bild A. und wie komm ich jetzt zum rekonstruierten Bild? Einfach mit x=U*y? y hat 48 Zeilen, aber wenn ich U*y rechne bekomm ich eine 19500x48 Matrix, das ergibt ja dann nicht _ein einziges_ Bild (welches rekonstruiert werden soll)...
od bin ich da ganz falsch unterwegs?
danke schon mal, lg
wie berechnest du die Koeffizienten?
ich hab das so A' * (BILD - DURSCHNITT)... du musst A' weil du sonst 19500 und nicht 48 koeffizienten bekommst...
beim rekonstruieren musst du das ganze nur umdrehen und den durchschnitt wieder dazurechnen... und natürlich mit den koeffizienten rechnen... und nicht mehr mit dem Bild :)
hm die Koeffizienten werden doch mit U' * x (wobei x ein Bild-Durschnitt ist) berchnet nicht mit A' od?
So berechne ich das ganze dann bekomm ich für ein eingelesens Bild aus A 48 Koeffizienten. Aber wie komm ich dann von dort auf das original Bild?
ja du hast recht selbstverständlich U ...
die Rekonstruktion ist dann dasselbe in Grün... Rekon = U * Koeff + Durchschnitt... und das ergebnis wird das normalisiert Rekon = normc(Rekon)
vBulletin® v3.7.1, Copyright ©2000-2008, Jelsoft Enterprises Ltd.