Soo mal wieder zeit für nen Update, wenn auch nur ein kleines, dafür aber für mich einen wirklich tollen Meilenstein erreicht der auch für meine CAVE und VR Anwendungen sehr wichtig ist.
Head / Eyetracking
Ich hab den "Prototyp" fertig und es funktioniert erstaunlich gut. Damit waere PC Nr.1 für das Rechencluster meiner CAVE nun fertig.
Ein Bild vorab die erklaerung folgt. Zu dem Bild sei gesagt, die Auflösung is scheise, das Bild is verschwommen und es ist alles andere als gut, brauchts also nich zu erwaehnen, falls aber jemand zu meinem aueserst attraktiven Gesicht etwas sagen möchte ..... verkneifts euch auch ich weis ich seh fertig aus ;-) Zu dem Bild zurück man erkennt das grundlegende, man sieht das es Funktioniert, ist nen "Screenshot" meiner API welche die Face und Eyedetection mit 3 Achsen Koordinaten System zeigt in Echtzeit
Anhang anzeigen 336012
So hier sieht man nun meine hübsche Fresse und die Maskingpoints für das Tracking. Das ganze wird mittels einer Technik namens HAAR Realisiert, das ist nen spezial Algorithmus mit Cascadefunktion für Objekterkennung auf Bildern und Videos. Dadurch kann man enorm Rechenpower sparen obwohl man stark komplexe Trackingberechnungen hat die ja auch mit möglich kleinster Latenz bei möglichst maximaler Bildwiederholrate stattfinden soll, das ganze darf 8.6ms nicht übersteigen muss aber konstante wiederum 8.6ms Latenz haben, alles drüber vernichtet bei geübten Menschen sofort das Immersive Augment Reality "Gefühl" HAt aber noch nen anderen Hintergrund, Signalwege ! Die müssen mit berechnet werden, ich muss jede verdammte Kabellaenge sei es nur 10cm mehr beim Monitor Kabel exakt berechnen damit ich die Signallaufzeit vom Kabel habe, sonst macht Beamer 1 mit nem 2.10m Kabel paar µs schneller Bild als Beamer 2 mit nem 2.50m Kabel. Das spielt eine enorme Rolle wie gelernt habe, ansonst ist 3D in ner CAVE unmöglich zumindest jenes was ich nutzen will / muss.
Also die API trackt einmal die Augen. Das ganze geht so, zuerst erkennt die API das gesicht in dem Bild, damit der "PC" keine 100 Millionen Bildpunkte in Echtzeit scannen und Analysieren muss erstellt man erstmal eine Maske, ein Gesicht hat immer eine Gewisse Grundform, dies nimmt man grob als Maske und laesst die API dort drinne eine "Kopferkennung" starten diese dient auch gleichzeitig für das Tracking der einzelnen Masken im gesicht, Im gesicht sind üblicherweise auch Nase Mund und co immer an der "gleichen" stelle. Also gibts ne Maske in dem Augenbereich, ne Maske im Nasenbereich, ne Maske im Mundbereich ( 3 Bezugspunkte für ein 3 Achs Koordinaten System wie es ein IR Headtracking System macht )
In den Augenbereichen gibts nochmal eine Maske welche die Grundform der Augen hat, diese wird dann letzendlich in Echtzeit nach 4 Bezugspunkten gescannt, linke mitte vom Elipsen Rand, Rechte seite ebenso, Mitte Augelid oben, Mitte Augelid unten.Und als Bonus die Pupille, für das Eyetracking
Nase gleiches Spielchen mit den Bezugspunkten und der Maske bei der Nase, Nasenlöcher, Nasenflügel, Nasenspitze, Nasenvorhof,
Und der Mund, da reichen die beiden Mundwinkel aus.
Und so hat der PC´le statt 60 Millonen Punkte nur knapp 6000-8000 Punkte die er scannen muss, und somit hab ich mit dem Pentium D auch nur ne Systemlast von 15% auf einem Core ! Bei 100-150mb Speicherverbrauch, allerdings bin ich auch erst bei 25hz angelangt, die Cam schafts leider nur Konstant 25fps zu machen, das liegt an meiner Modifikation *grml* is halt ne 10€ Billig Webcam gewesen.
Soviel zur Softwareseite, natürlich sollte klar sein das ich hier nicht auf details eingehe, da steckt mein ganz herzblut drinne,
Die Hardwareseite : Tja im moment ist es eine "etwas" von mir Modifizierte Webcam, daher auch die recht schlechte Bildquali auf dem Bild, aber das ist von mir gewollt.
Ein Pentium D 960 mit 2*3.6ghz und 8GB DDR2 Ram und die USB Webcam sind dafür verantwortlich. Das ganze wird aber noch modifiziert und zwar mit 120FPS Kameras.
Das Fotografierte Bild ist übrigends bei kompletter Dunkelheit entstanden, das es so hell aussieht das liegt an der Modifikation
Aber auch wenn ich mich jetzt mit 5000 Ansilumen beleuchten lasse, dann aendert sich an dem Bild rein garnicht, es wird weder heller noch dunkler einfach weil die Cam nur 5% von dem Licht überhaupt "sieht"
So realisiere ich dann auch die ganze Caputure Geschichte ohne das irgendwo ne dabische LED oder irgendwas rumhaengt. Dazu brauch man Lediglich entweder Haarspray oder Herpespflaster und die Technik die ich gebastelt habe
Klingt vieleicht etwas verrückt und komisch aber ey das waren die dinge die ich nachts um 2 hatte.
Achja das ganze ist übrigends so von mir programiert worden das bei der Headtracking API nicht nur der Kopf das Bild bewegt. Es werden die Augenbewegungen der Pupille ! getrackt. D.h Schaut man bei meiner Leinwand oben rechts ins Eck dann bewegt sich genau dahin z.b auch der Mauszeiger oder die Waffe im Spiel ( in meinem Fall erstmal Armed Assault 2 ) Es ist aber auch so gemacht das die Pupilen das Bild bewegen, es ist ja so dreht man den Kopf zur seite um etwas zu betrachten, dann bewegt man die Pupillen Automatisch mit, so ist es bei mir auch, drehst du den Kopf um etwas auf der Seite zu sehen dann wird das PupillenTracking zusammen mit dem Headtracking gemischt, ein minimalen Teil der Bildbewegung wird aus den Pupillen berechnet und der großteil aus dem Headtracking. So entsteht viel intensiver dieses Immersiv gefühl bereits bei ner 2D Leinwand bemerkt man das wirklich gut. Und zwar so gelöst die Feinen bewegungen realisiert man über die Pupillen, die Groben bewegungen übers Headtracking, wie es eben bei nem Menschen auch gesteuert ist im Hirn.
Was mir noch fehlt sind jetzt die schnittstellen zu den Games, aber auch hier ist das einzige problem lediglich meine Zeit *g*
Realisiert wird das ganze über OpenCV, ich bin leztendlich bei OpenCV gelandet und werd alles selbst programieren, OpenCV eignet sich perfekt für alles was ich vorhab, und C++ ist doch recht einfach. Auserdem kamm vor kurzen erst ein Brandneues Update ( seit 6 jahren ) was die ganze sache sehr interessant macht. Denn alle anderen Librarys die für sowas optimiert wurden sind teilweise 12 jahre alt und dementsprechend bassieren die meisten "fertigen" Anwendungen die man zur verfügung gestellt bekommt auf uralten Librarys das geht da los das 80% der CAVE Anwedungen nur mit 1024*786 laufen und DX8 nutzen oder nur OpenGL. Kein wunder das die meisten Cave anwendungen die man so sieht eine billigste Steinzeit Vektor Grafik zeigen oder uralte Games wie Quake und Unreal, oder das wenn überhaupt uralt Shuttertechnik genutzt wird, oder gar Analglyph für 3D. Ich bin Perfektionist und für mich kommt das nicht in frage. Deswegen schmeis ich auch gut 2 Wochen arbeit mal eben weg, das was ihr seht das waren lediglich 30 stunden Arbeit, davor hab ich 2 wochen gefudelt ohne ein ergebniss was mich annaehernd so befriedigt wie das jetzt.
Auserdem kann ich die API ohne probleme in kürzester Zeit umschreiben um somit mein Multitouch zu realisieren, nur mit dieser API kann ich weitaus mehr als nur 8 Touchpunkte machen, begrenzt wird das ganze nur von Rechenleistung. Auserdem kann ich teile der Codes der API nutzen für eine Motion Capture API bassierend auf OpenCV. Und damit habe schonmal 2 Grundprobleme für die CAVE gelöst naemlich die umsetzung vom Head Tracking und Motion Capturing in Echtzeit OHNE spürbare Latenz damit gehe ich ein Schritt naeher in Richtung Augmented Reality, natürlich das ganze ist noch weit von Augmented oder Mixed Reality entfernt, aber das ist der Schritt dahin, ich will Hololens in seiner ursprungsform haben auch ein grund warum ich bei OpenCV gelandet bin, Hololens bassiert dadrauf, und fragt mich nicht wie oder warum oder weshalb ich hab teile des SDK vom urprungs hololens auftreiben können, und auch noch genau die für mich wichtigsten API´s..... wisst ihr was naechsten Monat passiert wenn bei mir nen Paket mit 8 Kinect Kameras ankommt ? Ich denke mir ist es möglich Hololens nachzubauen, und zwar mit Projektoren wie es eigentlich vorgesehen ist. Die abwandlung mit der Brille ist nur die "billig" Version für den Consumer Markt.
Soo ich denke viel verdammte Theorie, vieleicht langweilig, vieleicht spannend, aber man erkennt wohl das ich mich intensiv die lezten Wochen mit theorie und Lernen befasst habe und daher so wenig neues hier gekommen ist. Ich sag euch bald gehts wieder Rund, das Trackingsystem reicht schonmal für meine Simulatoren, die muss ich nur mal schnell zusammenbasteln.
Edit : Grad ein kleinen haken entdeckt beim Eyetracking, das Headtracking funktioniert zwar perfekt wenn man das Gesicht zu seite dreht, und zwar funktioniert das sogar noch wenn der PC auf einem Auge 4 Trackingpunkte verloren hat, aber natürlich reist das Eyetracking dann ab was zur folge hat das alles anfaengt etwas zu zittern, das gleiche passiert auch wenn der Trackingpunkt der Pupille nicht mehr richtig erkannt wird liegt also definitiv nicht daran das die Trackingpunkte für eine Achse fast fehlen, ich weis auch schon woran das liegt, ich glaub das liegt daran das die Pupillen viel weichere bewegungen machen und dementsprechend weitaus mehr Rechenpower darein fliest um die Punkte nicht zittern zu lassen, das wird wohl für sorgen das komplett das ganzen Masken nicht Zittern da die nach den Augen auch ausgerichtet werden da hier die meisten markanten Bezugspunkte auch liegen und auch in der Augenmaske für das Headtracking die Pupillen als Trackingpunkt genommen werden. Nur müssen die mit genutzt werden sonst klappt der übergang von Eyetracking zum Headtracking nicht oder ich muss die Eyetrackingdaten mit den Headtrackingdaten vermischen und da extra was basteln und softwareseitig einfügen was auf die Latenz geht und je mehr unnötiges gebastel dabei ist umso unmöglicher wird das mit der Latenzgeschichte, ich muss ja deswegen schon mit 2 Netzwerkkarte arbeiten und 2 getrennten Netzwerken, jeder weitere Rechencluster brauch nen eigenes Netzwerk.
Tracking = 100Mbit Netzwerk
Motion Capture = 100Mbit Broadcast Netzwerk
Render Nodes = 1000Mbit Multicast Netzwerk
Master Cluster = 1000Mbit Multicast Netzwerk
Dazu kommt dann noch mein Rotes Netzwerk als Gateway nach drausen mit DMZ , mein Grünes Netzwerk was eigentlich mein Homenetzwerk ist. Mein Blaues Netzwerk was Wlan und Internet für meine Handy´s bzw Mobilen Geraete bereit stellt. Und mein Gelbes Netzwerk mit Wlan was ausschlieslich nur für meine Musikgeraete ist zwecks Mididaten über Wlan und LAN für alle PC´s und Geraete bereitzustellen.
Jetzt weis ich warum ich seit 15 jahren jede verdammte 100Mbit Netzwerkkarte aufgehoben hab die mir in die Finger gekommen ist, mist ist das ich jetzt die grenzen von meiner Firewall / Gateway / Server Kiste gekommen bin, 7 Netzwerkkarten waren ja kein Problem, 200Mbit Internet auch nicht bei vollauslastung, genausowenig wie 4 Netzwerke und 20 Clients Online die das Netzwerk vollauslasten.
Aber jetzt is ende gelaende von dem Pentium 4 HT, die 2Gb Ram sind fast voll, und ne IDE Festplatte kommt mit der Zugriffsgeschwindigkeit nicht mit wenn alles gelogt wird, hab zwar jetzt ne 12000K UW320 SCSI Platte drinne für die Logs was den speicher etwas entlastet hat. Dafür kotzt die CPU jetzt und die Kiste verbraet fast 220W und das für nen 24/7 Server der mein Internet bereitstellt zu ner Jahreszeit wo die Solarzellen aufm Dach nicht mehr genug Power bringen um die kiste "kostenlos" laufen zu lassen.