Hallo,
ich muss euch warnen, denn ich bin ein Anfänger im Thema programmieren in Python.
Für meine W-Seminararbeit muss ich ein neuronales Netz mit meiner eigenen Handschrift trainieren, dass neuronale netz hab ich in Python schon erstellt und ich bin auf eine Website gestoßen https://www.linux-community.de/ausgaben ... -vernetzt/ die zeigt wie man eingescannte Bilder für das Netz zurecht schneidet. Der Code dafür lautet: "$ convert input.png -crop 74x74 -trim -background white -resize 28x28 -gravity center -extent 28x28 +repage -alpha off my%03d.png" und ich habe ein png-Bild auf meinem Desktop mit der entsprechenden Größe. Wenn ich jedoch den Code kopiere und in mein Jupyter Notebook einfüge und das "Input.png" verändere durch "Beispiel.png" (so heißt das png-Bild auf meinem Desktop), kommt immer ein Invalid Syntax Erorr.
Kann mir bitte jemand weiterhelfen wie ich dieses Problem lösen kann, denn im Internet habe ich bisher noch keine Lösung für das Problem gefunden.
Für Tipps für mein Projekt bin ich auch sehr Dankbar.
PNG-Datei in Python bearbeiten
Das ist ja auch kein Python-Code, sondern ein Shell-Kommando welches das Tool ImageMagick benutzt. Das gibst du nicht in Jupyter ein. Sondern auf der Eingabeaufforderung. Terminal unter *NIXen und macOS, und irgendwie geht das bestimmt auch unter Windows, dazu mal ImageMagick installieren und ausprobieren.
Ok mit ImageMagick hat jetzt alles geklappt, bin dir mega Dankbar__deets__ hat geschrieben: Montag 19. August 2019, 16:50 Das ist ja auch kein Python-Code, sondern ein Shell-Kommando welches das Tool ImageMagick benutzt. Das gibst du nicht in Jupyter ein. Sondern auf der Eingabeaufforderung. Terminal unter *NIXen und macOS, und irgendwie geht das bestimmt auch unter Windows, dazu mal ImageMagick installieren und ausprobieren.

Leider muss ich mich wieder melden, denn ich komm nicht mehr weiter.
In dem gleichen Artikel auf Seite 2 : https://www.linux-community.de/ausgaben ... ernetzt/2/, gibt es diesmal wirklich ein richtiges Python-Skript zum umwandeln der PNG-Dateien in CSV-Dateien:
In der letzten Zeile ist ja die Methode writeImagestoCSV in der man 3 Parameter eingeben muss.
bei dem ersten Parameter muss ich doch das Verzeichnis des Ordners angeben indem die PNG-Bilder sich befinden, bei mir "C:\Benutzer\Desktop\Testbilder2" und die anderen beiden Parameter kann ich ja so lassen.
Jedoch kommt dann immer der Fehler, dass der Pfad nicht gefunden wird.
Wisst ihr woran das liegen kann ?
Danke im Voraus
In dem gleichen Artikel auf Seite 2 : https://www.linux-community.de/ausgaben ... ernetzt/2/, gibt es diesmal wirklich ein richtiges Python-Skript zum umwandeln der PNG-Dateien in CSV-Dateien:
Code: Alles auswählen
import matplotlib.image as mpimg
import numpy as np
import os
def writeImagestoCSV(mydir,csvfile,picid):
'''Write images like picid-nnm.png in
directory mydir to csvfile in current directory.
-nnm are three digits, the last one
identifying the name of the number.
'''
with open(csvfile,'wb') as fp:
for fn in os.listdir(mydir):
fna = fn.split('.')[0][-1]
if (fn.split('.')[0][0:2] == picid):
img = mpimg.imread(mydir+fn)
pixels = np.asarray(img)
# print(pixels.shape,fn)
apixels = np.reshape(pixels,28*28)
apixels = 255-(apixels*255).astype(int)
apixels = np.append(int(fna),apixels)
np.savetxt(fp,[apixels],fmt='%i',delimiter=",")
writeImagestoCSV('meinbildverzeichnis/','test.csv','my')
bei dem ersten Parameter muss ich doch das Verzeichnis des Ordners angeben indem die PNG-Bilder sich befinden, bei mir "C:\Benutzer\Desktop\Testbilder2" und die anderen beiden Parameter kann ich ja so lassen.
Jedoch kommt dann immer der Fehler, dass der Pfad nicht gefunden wird.
Wisst ihr woran das liegen kann ?
Danke im Voraus
Hier seht ihr meinen Vollständigen Code
Der Pfad wird nun gefunden aber der Error ist nun komplizierter
Langsam verzweifle ich an meiner Arbeit.
Der Pfad wird nun gefunden aber der Error ist nun komplizierter

Langsam verzweifle ich an meiner Arbeit.
Code: Alles auswählen
import matplotlib.image as mpimg
import numpy as np
import os
def writeImagestoCSV(mydir,csvfile,picid):
'''Write images like picid-nnm.png in
directory mydir to csvfile in current directory.
-nnm are three digits, the last one
identifying the name of the number.
'''
with open(csvfile,'wb') as fp:
for fn in os.listdir(mydir):
fna = fn.split('.')[0][-1]
if (fn.split('.')[0][0:2] == picid):
img = mpimg.imread(mydir+fn)
pixels = np.asarray(img)
# print(pixels.shape,fn)
apixels = np.reshape(pixels,28*28)
apixels = 255-(apixels*255).astype(int)
apixels = np.append(int(fna),apixels)
np.savetxt(fp,[apixels],fmt='%i',delimiter=",")
writeImagestoCSV('C:\Users\Pfeifer\Desktop','test.csv','my')
File "<ipython-input-13-7a869b1f67ae>", line 1
writeImagestoCSV('C:\Users\Pfeifer\Desktop','test.csv','my')
^
SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated \UXXXXXXXX escape
Du weißt doch gar nicht, ob der Pfad gefunden wiord. So weit kommt der Code doch gar nicht.
Ein Backslash (\) muss in einer Zeichenkette durch einen Backslash (\) escaped werden, wenn du wirklich einen Backslash meinst. "\n" ist z.B. das Zeichen für einen Zeilenwechsel, deshalb ist das Escapen nötig, falls du das nicht meinst.
Korrekt wäre
Das "r" vor einer Zeichenkette deklariert diese als "raw string". Da wird dann genau so genommen, wie sie kommt. Dafür kann man keine Newlines, etc. verwenden.
Ein Backslash (\) muss in einer Zeichenkette durch einen Backslash (\) escaped werden, wenn du wirklich einen Backslash meinst. "\n" ist z.B. das Zeichen für einen Zeilenwechsel, deshalb ist das Escapen nötig, falls du das nicht meinst.
Korrekt wäre
Code: Alles auswählen
'C:\\Users\\Pfeifer\\Desktop'
#oder
r'C:\Users\Pfeifer\Desktop'
Code: Alles auswählen
writeImagestoCSV(r'C:\Users\Pfeifer\Desktop\Testbilder2\','test.csv','my')
File "<ipython-input-4-01fe34d99a39>", line 1
writeImagestoCSV(r'C:\Users\Pfeifer\Desktop\Testbilder2\','test.csv','my')
^
SyntaxError: invalid syntax
An der Stelle wird noch gar nichts mit dem Pfad gemacht, das ist nur eine Zeichenkette.
Der Fehler ist ein anderer. Auch bei raw Strings kann man Anführungszeichen escapen. Deshalb denkt der Interpreter, dass die Zeichenkette nicht aufhört.
Ich habe noch eine dritte Variante vergessen, und die sollest du benutzen: Verwende / statt \ bei der Pfadangabe. Python kann damit auch unter Windows arbeiten:
Der Fehler ist ein anderer. Auch bei raw Strings kann man Anführungszeichen escapen. Deshalb denkt der Interpreter, dass die Zeichenkette nicht aufhört.
Ich habe noch eine dritte Variante vergessen, und die sollest du benutzen: Verwende / statt \ bei der Pfadangabe. Python kann damit auch unter Windows arbeiten:
Code: Alles auswählen
writeImagestoCSV('C:/Users/Pfeifer/Desktop/Testbilder2/','test.csv','my')
Code: Alles auswählen
import matplotlib.image as mpimg
import numpy as np
import os
def writeImagestoCSV(mydir,csvfile,picid):
'''Write images like picid-nnm.png in
directory mydir to csvfile in current directory.
-nnm are three digits, the last one
identifying the name of the number.
'''
with open(csvfile,'wb') as fp:
for fn in os.listdir(mydir):
fna = fn.split('.')[0][-1]
if (fn.split('.')[0][0:2] == picid):
img = mpimg.imread(mydir+fn)
pixels = np.asarray(img)
# print(pixels.shape,fn)
apixels = np.reshape(pixels,28*28)
apixels = 255-(apixels*255).astype(int)
apixels = np.append(int(fna),apixels)
np.savetxt(fp,[apixels],fmt='%i',delimiter=",")
Und dank deinem Tipp sparrow wird das Verzeichnis gefunden
jedoch kommt jetzt garkeine Fehlermeldung und das Programm macht Garnichts
ich denke es liegt daran, dass die anderen beiden Parameter irgendwie "ausgeblendet" werden weil die "rot" sind
Code: Alles auswählen
writeImagestoCSV('C:/Users/Pfeifer/Desktop/Testbilder2/','test.csv','my')
Zumindest eine leere Datei in irgendeinem Verzeichnis (Dein Arbeitsverzeichnis) sollte erzeugt werden.
Zum Code: eingerückt wird immer mit 4 Leerzeichen pro Ebene, nicht 2. Variablennamen sollten aussagekräftig sein und keine Abkürzungen, also fn -> filename, mydir -> image_directory, fna -> ?????? etc.
Für Dateinamen-Operationen kennt Python im Modul os.path einige Funktionen. Die sollte man statt des String-Gewurschtels nehmen. os.path.splitext statt str.split. Und diese Operation sollte man auch nicht unnötigerweise gleich zweimal machen, sondern das Ergebnis in einer Variable speichern
Um if-Bedingungen gehören keine Klammern.
Pfade werden mit os.path.join zusammengesetzt, sonst hast Du das Problem, dass es nicht funktioniert, falls Du den / am Ende der Vezeichnisangabe vergißt, oder absichtlich wegläßt, weil der da eigentlich nicht hingehört und bei Deinem letzten Problem ja auch tatsächlich Probleme gemacht hat.
`imread` liefert schon ein Numpy-Array, weshalb das asarray überflüssig ist.
Zum Code: eingerückt wird immer mit 4 Leerzeichen pro Ebene, nicht 2. Variablennamen sollten aussagekräftig sein und keine Abkürzungen, also fn -> filename, mydir -> image_directory, fna -> ?????? etc.
Für Dateinamen-Operationen kennt Python im Modul os.path einige Funktionen. Die sollte man statt des String-Gewurschtels nehmen. os.path.splitext statt str.split. Und diese Operation sollte man auch nicht unnötigerweise gleich zweimal machen, sondern das Ergebnis in einer Variable speichern
Um if-Bedingungen gehören keine Klammern.
Pfade werden mit os.path.join zusammengesetzt, sonst hast Du das Problem, dass es nicht funktioniert, falls Du den / am Ende der Vezeichnisangabe vergißt, oder absichtlich wegläßt, weil der da eigentlich nicht hingehört und bei Deinem letzten Problem ja auch tatsächlich Probleme gemacht hat.
`imread` liefert schon ein Numpy-Array, weshalb das asarray überflüssig ist.
Ich möchte mich mal bei allen hier bedanken für eure Hilfe und schnellen Antworten. Ich Hab jetzt endlich die CSV-Dateien auf meinem Computer und kann endlich meine Ferien genießen. Vielleicht melde ich mich im späteren Verlauf meiner Arbeit nochmal wenn ich nicht mehr weiterkomme, weil ihr seid hilfreicher als mein Informatiklehrer
Servus

Servus