{"id":460,"date":"2018-06-16T02:05:37","date_gmt":"2018-06-16T00:05:37","guid":{"rendered":"https:\/\/lobo.mensa.uberspace.de\/wp\/?p=460"},"modified":"2018-06-16T02:11:20","modified_gmt":"2018-06-16T00:11:20","slug":"stroemende-tensoren-teil-4","status":"publish","type":"post","link":"https:\/\/lobo.uber.space\/wp\/?p=460","title":{"rendered":"Str\u00f6mende Tensoren \u2013 Teil 4"},"content":{"rendered":"<div class=\"ArtikelSerie\">\r\nDies ist der vierte Teil der Artikelserie <em>Str\u00f6mende Tensoren<\/em>.\r\n<ul class=\"ArtikelListe\">\r\n<li><a href=\"https:\/\/lobo.mensa.uberspace.de\/wp\/?p=341\">Teil 1<\/a><\/li>\r\n<li><a href=\"https:\/\/lobo.mensa.uberspace.de\/wp\/?p=386\">Teil 2<\/a><\/li>\r\n<li><a href=\"https:\/\/lobo.mensa.uberspace.de\/wp\/?p=436\">Teil 3<\/a><\/li>\r\n<li><a href=\"https:\/\/lobo.mensa.uberspace.de\/wp\/?p=460\">Teil 4<\/a><\/li>\r\n<\/ul>\r\n<\/div>\n<p>Der Snap-Button wird mit Leben gef\u00fcllt, das Training des Netzes soll im Hintergrund geschehen und jetzt nicht nur Koordinaten sondern einen Bildbereich liefern und der Fortschritt des Trainings soll in einem Diagramm dargestellt werden.<\/p>\n<p>Im Bild soll man den entsprechenden Bereich angezeigt bekommen und ver\u00e4ndern k\u00f6nnen. Die Daten sollen auch in die Liste zur\u00fcck \u00fcbertragen werden k\u00f6nnen (Button \u201eChange Data\u201d) und die Liste der Bilder soll wieder in eine Datei auf Platte geschrieben werden k\u00f6nnen.<\/p>\n<p><!--more--><\/p>\n<p>Bisher wurde beim Klick auf \u201eTrain\u201d eine fest eingestellte Anzahl an Iterationen das Netz trainiert. In dieser Zeit war das Programm blockiert und wenn man danach weiter trainieren wollte musste man erneut auf den Knopf dr\u00fccken.<br \/>\nUm eine l\u00e4ngere Zeit zu trainieren, hatte ich bisher die Anzahl der Iterationen im Programm umgestellt, was nicht sonderlich komfortabel ist.<\/p>\n<p>Der entsprechende Knopf (<a href=\"http:\/\/doc.qt.io\/qt-5\/QButton.html\"><code class=\"codecolorer python blackboard\"><span class=\"python\">QButton<\/span><\/code><\/a>) ist jetzt schaltbar. Wenn man ihn einschaltet wird das Training des Netzes im Hintergrund gestartet. Schaltet man ihn wieder aus, so wird dem <a href=\"http:\/\/doc.qt.io\/qt-5\/QThread.html\"><code class=\"codecolorer python blackboard\"><span class=\"python\">QThread<\/span><\/code><\/a> ein Abbruchsignal geschickt und der Knopf inaktiv gesetzt. Ist der Thread angehalten, so wird der Knopf wieder ausgeschaltet und aktiv gesetzt.<\/p>\n<p>Das Hinzuf\u00fcgen der Bilder ist erstaunlich einfach: \u00dcber das Kommando <a href=\"https:\/\/www.raspberrypi.org\/documentation\/usage\/camera\/raspicam\/raspistill.md\"><code class=\"codecolorer bash blackboard\"><span class=\"bash\">raspistill<\/span><\/code><\/a> kann eine Aufnahme auf dem Raspberry-PI angesto\u00dfen werden. Die Parameter <code class=\"codecolorer bash blackboard\"><span class=\"bash\"><span class=\"re5\">-o<\/span> -<\/span><\/code> geben an, da\u00df die Ausgabe auf der Standardausgabe erfolgen soll. So kann dieses Kommando \u00fcber <code class=\"codecolorer bash blackboard\"><span class=\"bash\"><span class=\"kw2\">ssh<\/span><\/span><\/code> nat\u00fcrlich auch auf einem entfernten Rechner gestartet werden.<\/p>\n<p>Das Kommando mit Parametern landet auch in der Konfiguration und kann damit unabh\u00e4ngig eingestellt werden. Die gesamte Kommandozeile lautet bei mir: <code class=\"codecolorer bash blackboard\"><span class=\"bash\"><span class=\"kw2\">ssh<\/span> user<span class=\"sy0\">@<\/span>raspi raspistill <span class=\"re5\">-o<\/span> -<\/span><\/code>. Dabei habe ich mir mit <a href=\"https:\/\/www.ssh.com\/ssh\/keygen\/\"><code class=\"codecolorer bash blackboard\"><span class=\"bash\">ssh_keygen<\/span><\/code><\/a> die M\u00f6glichkeit geschaffen ohne die Eingabe eines Passwortes eine Verbindung zu dem Raspberry-PI aufzubauen.<\/p>\n<p>Da die Aufnahme eine gewisse Zeit ben\u00f6tigt und die Oberfl\u00e4che in der Zeit nicht tot sein soll, geschieht die Aufnahme asynchron in einem Thread.<\/p>\n<p>In dem Thread wird das entsprechende Aufnahmekommando \u00fcber <a href=\"http:\/\/doc.qt.io\/qt-5\/QProcess.html\"><code class=\"codecolorer python blackboard\"><span class=\"python\">QProcess<\/span><\/code><\/a> gestartet und die Daten aus dem Kommando \u00fcber die Standardausgabe des Prozesses in einer Datei gespeichert.<\/p>\n<p>Nachdem die \u00dcbertragung des Bildes fertig ist, bekommt die Oberfl\u00e4che ein entsprechendes Signal geschickt, damit das Bild in die Liste eingebunden wird und angezeigt wird.<\/p>\n<p>Die Bilder werden jetzt im Unterverzeichnis <code class=\"codecolorer bash blackboard\"><span class=\"bash\">Images<\/span><\/code> gespeichert, das Diagramm ist \u00fcber ein <code class=\"codecolorer python blackboard\"><span class=\"python\">QChartView<\/span><\/code> eingebaut und es existiert jetzt die M\u00f6glichkeit die Sprache umzuschalten.<\/p>\n<p>Hier das aktuelle Aussehen:<br \/>\n<img decoding=\"async\" loading=\"lazy\" src=\"https:\/\/lobo.mensa.uberspace.de\/wp\/wp-content\/uploads\/2018\/06\/Screenshot-2-1.jpg\" alt=\"Screenshot\" width=\"550\" height=\"371\" class=\"alignnone size-full wp-image-490\" srcset=\"https:\/\/lobo.uber.space\/wp\/wp-content\/uploads\/2018\/06\/Screenshot-2-1.jpg 550w, https:\/\/lobo.uber.space\/wp\/wp-content\/uploads\/2018\/06\/Screenshot-2-1-300x202.jpg 300w\" sizes=\"(max-width: 550px) 100vw, 550px\" \/><\/p>\n<p>Leider habe ich irgendwie das Layout etwas kaputt gemacht. Beim Vergr\u00f6\u00dfern des Fensters bleiben Bild und Diagramm klein und der Dialogteil auf der rechten Seite bekommt den zus\u00e4tzlichen Platz. Bild und Diagramm teilen sich den vertikalen Platz gleichm\u00e4\u00dfig auf. Eigentlich sollte in der Breite das Bild und das Diagramm m\u00f6glichst viel Platz bekommen und in der H\u00f6he sollte dem Bild ca. doppelt soviel Platz zugeteilt werden.<\/p>\n<p>Als n\u00e4chstes mu\u00df ich mich mal wieder um das neuronale Netz k\u00fcmmern:<br \/>\nDer Men\u00fcpunkt zum Zur\u00fccksetzen des Netzes soll aktiviert werden. Bisher geht das nur, indem man die Dateien aus dem Verzeichnis l\u00f6scht, in welches das Netz von TensorFlow automatisch gespeichert wird.<br \/>\nBeim Initialisieren des Netzes scheint es noch ein kleines Problem mit den Startwerten zu geben. Relativ h\u00e4ufig liefert das Netz f\u00fcr einen oder mehrere der vier Werte eine Null zur\u00fcck. Diese \u00e4ndert sich dann auch nicht mehr, egal wie lange ich das Netz trainieren lasse.<br \/>\nBei der Bewertung der bisherigen Lernleistung wird der selbe Datensatz verwendet wie zum Trainieren. Hier sollen einige Bilder aus dem Training entfernt werden und mit diesen Bilder die Lernleistung \u00fcberpr\u00fcft werden.<br \/>\nUnd zu guter Letzt sollte ich mal die Kamera provisorisch aufbauen und viele Bilder mit dieser Kamera schie\u00dfen und das Netz mit den entsprechenden Bildern trainieren. Der bisher verwendete Datensatz von 152 Bildern ist etwas knapp bemessen um das Netz sinnvoll zu trainieren.<\/p>\n<div class=\"LinkListe\">\r\n<p>Links zu weiterf\u00fchrenden Informationen dieser Artikelserie:<\/p>\r\n<ul>\r\n<li><a href=\"https:\/\/gitlab.com\/Azador\/dice\">Dice - die Quellen dieses Projekts auf GitLab<\/a><\/li>\r\n<li><a href=\"https:\/\/www.tensorflow.org\/\">TensorFlow<\/a><\/li>\r\n<li><a href=\"http:\/\/www.dkriesel.com\/science\/neural_networks\">D. Kriesel \u00fcber Neuronale Netzwerke<\/a><\/li>\r\n<li><a href=\"http:\/\/doc.qt.io\/qt-5\/\">Qt5 API<\/a><\/li>\r\n<\/ul>\r\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Der Snap-Button wird mit Leben gef\u00fcllt, das Training des Netzes soll im Hintergrund geschehen und jetzt nicht nur Koordinaten sondern einen Bildbereich liefern und der Fortschritt des Trainings soll in einem Diagramm dargestellt werden. Im Bild soll man den entsprechenden Bereich angezeigt bekommen und ver\u00e4ndern k\u00f6nnen. Die Daten sollen auch in die Liste zur\u00fcck \u00fcbertragen &hellip; <\/p>\n<p class=\"link-more\"><a href=\"https:\/\/lobo.uber.space\/wp\/?p=460\" class=\"more-link\"><span class=\"screen-reader-text\">\u201eStr\u00f6mende Tensoren \u2013 Teil 4\u201c<\/span> weiterlesen<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[1],"tags":[63,9,65,58],"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/lobo.uber.space\/wp\/index.php?rest_route=\/wp\/v2\/posts\/460"}],"collection":[{"href":"https:\/\/lobo.uber.space\/wp\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/lobo.uber.space\/wp\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/lobo.uber.space\/wp\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/lobo.uber.space\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=460"}],"version-history":[{"count":15,"href":"https:\/\/lobo.uber.space\/wp\/index.php?rest_route=\/wp\/v2\/posts\/460\/revisions"}],"predecessor-version":[{"id":494,"href":"https:\/\/lobo.uber.space\/wp\/index.php?rest_route=\/wp\/v2\/posts\/460\/revisions\/494"}],"wp:attachment":[{"href":"https:\/\/lobo.uber.space\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=460"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/lobo.uber.space\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=460"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/lobo.uber.space\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=460"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}