{"id":386,"date":"2018-05-24T20:50:42","date_gmt":"2018-05-24T18:50:42","guid":{"rendered":"https:\/\/lobo.mensa.uberspace.de\/wp\/?p=386"},"modified":"2018-06-05T21:09:53","modified_gmt":"2018-06-05T19:09:53","slug":"stroemende-tensoren-teil-2","status":"publish","type":"post","link":"https:\/\/lobo.uber.space\/wp\/?p=386","title":{"rendered":"Str\u00f6mende Tensoren &#8211; Teil 2"},"content":{"rendered":"<div class=\"ArtikelSerie\">\r\nDies ist der zweite 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>Wenn man sich mit neuronalen Netzen befassen m\u00f6chte, ist es gut, ein kleines Projekt zu haben, an dem man die ganzen ben\u00f6tigten Dinge lernen und ausprobieren kann.<\/p>\n<p>Mein Projekt ist ein W\u00fcrfelerkenner. Bilder von einer Kamera, auf denen ein W\u00fcrfel vor einem einfarbigen Hintergrund zu sehen ist sollen untersucht werden. letzten Endes soll das System ausspucken, welchen Wert der W\u00fcrfel zeigt.<\/p>\n<p><!--more--><\/p>\n<p>Das Vorgehen ist bisher zweiteilig geplant:<\/p>\n<ol>\n<li>Auf einem Bild mit reduzierter Aufl\u00f6sung soll identifiziert werden, wo sich der W\u00fcrfel befindet<\/li>\n<li>Der entsprechende Bereich, in dem sich der W\u00fcrfel befindet, soll in voller Aufl\u00f6sung untersucht werden und als Ergebnis den gew\u00fcrfelten Wert liefern<\/li>\n<\/ol>\n<p>Dementsprechend ben\u00f6tige ich als erstes ein Netz, welches mir aus einem kleinen Bild eine 2D-Koordinate oder eine Bounding-Box liefert, wo der W\u00fcrfel zu finden ist.<\/p>\n<p>Als erste Testdaten habe ich Bilder mit der Kamera meines Telefons vor wei\u00dfem Hintergrund aufgenommen. In dem Bilder sind an den R\u00e4ndern noch Teile des Tisches zu sehen, aber das sollte das Netz nicht weiter st\u00f6ren.<\/p>\n<p>Die Bilder habe ich, zur Positionserkennung, bisher auf eine Gr\u00f6\u00dfe von 92&#215;69 Pixel reduziert und in Grauwertbilder umgewandelt.<\/p>\n<p>In diesen Bildern soll nun die Position des W\u00fcrfels bestimmt werden. Wir ben\u00f6tigen also ein neuronales Netzwerk mit zwei Ausgangsneuronen, welche je einen Sch\u00e4tzwert f\u00fcr die X- und Y-Position liefern sollen.<\/p>\n<p>Vermutlich wird ein mehrschichtiges neuronales Netzwerk (deep neuronal network &#8211; DNN) am besten daf\u00fcr geeignet sein. Von den vorhandenen Klassen in TensorFlow h\u00f6rt sich <a href=\"https:\/\/www.tensorflow.org\/api_docs\/python\/tf\/estimator\/DNNRegressor\"><code class=\"codecolorer python blackboard\"><span class=\"python\">tf.<span class=\"me1\">estimator<\/span>.<span class=\"me1\">DNNRegressor<\/span><\/span><\/code><\/a> nach dem Mittel der Wahl an.<\/p>\n<p>Leider musste ich feststellen, da\u00df diese Klasse mit mehreren Ausgabeneuronen ein gewisses Problem hat. Vielleicht habe ich mich nur ungeschickt angestellt oder die entsprechende Beschreibung nicht gefunden. Wenn ihr also Hinweise habt, wie man dies mit einem <code class=\"codecolorer python blackboard\"><span class=\"python\">DNNRegressor<\/span><\/code> bewerkstelligt, nutzt bitte die Kommentar-Funktion.<\/p>\n<p>Nun gut, also wird ein eigener <a href=\"https:\/\/www.tensorflow.org\/api_docs\/python\/tf\/estimator\/Estimator\"><code class=\"codecolorer python blackboard\"><span class=\"python\">tf.<span class=\"me1\">estimator<\/span>.<span class=\"me1\">Estimator<\/span><\/span><\/code><\/a> geschrieben.<\/p>\n<p>Der Sourcecode zu diesem Projekt ist unter meinem Account auf <a href=\"https:\/\/lobo.mensa.uberspace.de\/wp\/?p=468\"><del datetime=\"2018-06-05T19:09:21+00:00\">GitHub<\/del> GitLab<\/a> unter dem Namen <a href=\"https:\/\/gitlab.com\/Azador\/dice\">dice<\/a> zu finden.<\/p>\n<p>Der Estimator wird (zur Zeit) in der Datei dice.py \u00fcber die Methode <code class=\"codecolorer python blackboard\"><span class=\"python\">cnn_model_fn<\/span><\/code> definiert und in der Methode <code class=\"codecolorer python blackboard\"><span class=\"python\">train<\/span><\/code> der Klasse <code class=\"codecolorer python blackboard\"><span class=\"python\">Trainer<\/span><\/code> instanziiert. Der Code wird jedoch auf Dauer mit Sicherheit noch in eine eigene Datei verschoben werden.<\/p>\n<p>In der ersten Fassung wird das Netz zum Test mit den gleichen Daten trainiert, mit denen es auch \u00fcberpr\u00fcft wird. Das soll sp\u00e4ter nat\u00fcrlich anders werden, hier ging es erst einmal darum das Netz \u00fcberhaupt zum Laufen zu bekommen.<\/p>\n<p>Als N\u00e4chstes geht es damit weiter, ein kleines GUI zu basteln, mit der man einen Trainingsdatensatz laden, erweitern und speichern kann und in der man die Ergebnisse visualisiert bekommt. Als Toolkit daf\u00fcr wird PyQt5 zum Einsatz kommen.<\/p>\n<p><a href=\"https:\/\/lobo.mensa.uberspace.de\/wp\/?p=436\">Zum dritten Teil<\/a><\/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>Wenn man sich mit neuronalen Netzen befassen m\u00f6chte, ist es gut, ein kleines Projekt zu haben, an dem man die ganzen ben\u00f6tigten Dinge lernen und ausprobieren kann. Mein Projekt ist ein W\u00fcrfelerkenner. Bilder von einer Kamera, auf denen ein W\u00fcrfel vor einem einfarbigen Hintergrund zu sehen ist sollen untersucht werden. letzten Endes soll das System &hellip; <\/p>\n<p class=\"link-more\"><a href=\"https:\/\/lobo.uber.space\/wp\/?p=386\" class=\"more-link\"><span class=\"screen-reader-text\">\u201eStr\u00f6mende Tensoren &#8211; Teil 2\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":[59,9,58],"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/lobo.uber.space\/wp\/index.php?rest_route=\/wp\/v2\/posts\/386"}],"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=386"}],"version-history":[{"count":9,"href":"https:\/\/lobo.uber.space\/wp\/index.php?rest_route=\/wp\/v2\/posts\/386\/revisions"}],"predecessor-version":[{"id":410,"href":"https:\/\/lobo.uber.space\/wp\/index.php?rest_route=\/wp\/v2\/posts\/386\/revisions\/410"}],"wp:attachment":[{"href":"https:\/\/lobo.uber.space\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=386"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/lobo.uber.space\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=386"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/lobo.uber.space\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=386"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}