Heinrich_Schwietering
Wikiteam
Anmeldungsdatum: 12. November 2005
Beiträge: 11335
Wohnort: Bremen
|
Hi! Hab' ein Problem mit tesseractTrainer.py, einem Skript, das ich zum Training von tesseract-ocr verwende: Beim Versuch, die Funktion zum Boxen aufzusplitten zu verwenden, liefert mir das Programm folgende Fehlermeldung: ./tesseractTrainer.py:647: DeprecationWarning: PyArray_FromDimsAndDataAndDescr: use PyArray_NewFromDescr.
pixels = subpixbuf.get_pixels_array()
Traceback (most recent call last):
File "./tesseractTrainer.py", line 675, in doCommandsSplit
this.right = self.findSplitPoint(this)
File "./tesseractTrainer.py", line 656, in findSplitPoint
numPixels = countBlackPixels(pixels, x)
File "./tesseractTrainer.py", line 194, in countBlackPixels
if isBlack(row[x]):
File "./tesseractTrainer.py", line 202, in isBlack
return pixel[0][0] + pixel[1][0] + pixel[2][0] < 128 * 3
IndexError: invalid index to scalar variable.
Kann jemand python-kundiges damit etwas anfangen? Ich hab' nicht rausfinden können, wie denn der Index "valide" formuliert werden muss... Ich hab' schon beim Entwickler des Programms nachgefragt, der leider keine Lösung wusste, sich aber mit dem Programm nicht mehr weiter beschäftigt, und selbst jemanden sucht, das das maintainen könnte... Unter Karmic läuft das ganze übrigens überhaupt nicht. ☹ so long hank
|
diesch
Anmeldungsdatum: 18. Februar 2009
Beiträge: 5072
Wohnort: Brandenburg an der Havel
|
Ohne das Skript zu kennen ist das schwierig. Kannst du es mal posten? pixel ist in Zeile 202 nicht doppelt indizierbar.
|
Marc_BlackJack_Rintsch
Ehemalige
Anmeldungsdatum: 16. Juni 2006
Beiträge: 4686
Wohnort: Berlin
|
Das sieht mir sehr nach numpy -Arrays aus. Vielleicht ist pixel nicht einmal einfach indizierbar: | In [75]: a = np.float64(42.23)
In [76]: a[0]
---------------------------------------------------------------------------
<type 'exceptions.IndexError'> Traceback (most recent call last)
/home/bj/<ipython console> in <module>()
<type 'exceptions.IndexError'>: invalid index to scalar variable.
|
|
Heinrich_Schwietering
Wikiteam
(Themenstarter)
Anmeldungsdatum: 12. November 2005
Beiträge: 11335
Wohnort: Bremen
|
Hi! Das Skript steht hier: http://tesseract-ocr.googlecode.com/files/tesseractTrainer.py ; und ich denke, Marc 'BlackJack' Rintsch's Hinweis Das sieht mir sehr nach numpy -Arrays aus. Vielleicht ist pixel nicht einmal einfach indizierbar:
liegt schon ganz gut; python-numpy musste ich installieren, damit beim Aufruf der Funktion nicht gleich das ganze Teil abgeschmiert ist... Ich werd' mal schauen, was passiert, wenn ich an "pixel " rumbastele. so long hank
|
diesch
Anmeldungsdatum: 18. Februar 2009
Beiträge: 5072
Wohnort: Brandenburg an der Havel
|
Das Array wird in findSplitPoint() durch gtk.gdk.Pixbuf.get_pixels_array() erzeugt; die Doku sagt "The get_pixels_array() method returns a Numeric Python array containing the pixel data of the pixbuf". Das Array wird dann an countBlackPixels() übergeben. Dort wird über die Zeilen iteriert und ein Element jeder Zeile an isBlack() übergeben, wo dann der Fehler auftritt. Ich würde in isBlack mal ein
vor dem return einfügen, um zu schauen, was das für Werte sind - doe Doku sagt dazu leider nichts.
|
Heinrich_Schwietering
Wikiteam
(Themenstarter)
Anmeldungsdatum: 12. November 2005
Beiträge: 11335
Wohnort: Bremen
|
Hi! diesch schrieb:
Ich würde in isBlack mal ein
vor dem return einfügen, um zu schauen, was das für Werte sind - doe Doku sagt dazu leider nichts.
Wenn ich das vor return in der selben Zeile (also 202) einfüge, wird es einfach nur bei der Meldung mit ausgegeben, wenn ich es in eine einzelnen Zeile davor schreibe, wird es alleine als letzte Zeile vor der IndexError: invalid index to scalar variable.
-Meldung ausgegeben; sonst ist leider nichts anderes... 😢 so long hank
|
diesch
Anmeldungsdatum: 18. Februar 2009
Beiträge: 5072
Wohnort: Brandenburg an der Havel
|
So sollte das aussehen:
def isBlack(pixel):
print type(pixel)
return pixel[0][0] + pixel[1][0] + pixel[2][0] < 128 * 3 Vor der Fehlermeldung sollte dann eine Zeile auftauchen, in der steht, was für ein Typ pixel ist.
|
Heinrich_Schwietering
Wikiteam
(Themenstarter)
Anmeldungsdatum: 12. November 2005
Beiträge: 11335
Wohnort: Bremen
|
Hi! Ja, hab ich so versucht, Fehlermeldung hab ich eben übersehen:
pixels = subpixbuf.get_pixels_array()
Sagt dir das was? so long hank
|
diesch
Anmeldungsdatum: 18. Februar 2009
Beiträge: 5072
Wohnort: Brandenburg an der Havel
|
Das gehört noch zur DeprecationWarning davor. Mach aus dem
print type(pixel)
mal
print '*******', type(pixel), '*******'
oder sowas, dann findest du dei Ausgabe einfacher.
|
Heinrich_Schwietering
Wikiteam
(Themenstarter)
Anmeldungsdatum: 12. November 2005
Beiträge: 11335
Wohnort: Bremen
|
Hi! leider gibt es keine andere Fehlermeldung; | def isBlack(pixel):
print '*******', type(pixel), '*******'
return pixel[0][0] + pixel[1][0] + pixel[2][0] < 128 * 3
|
liefert
./tesseractTrainer.py:647: DeprecationWarning: PyArray_FromDimsAndDataAndDescr: use PyArray_NewFromDescr.
symbol.bottom - symbol.top)
Traceback (most recent call last):
File "./tesseractTrainer.py", line 675, in doCommandsSplit
clone = this.clone()
File "./tesseractTrainer.py", line 656, in findSplitPoint
for x in range(width // 2 - 5, width // 2 + 6):
File "./tesseractTrainer.py", line 194, in countBlackPixels
if isBlack(row[x]):
File "./tesseractTrainer.py", line 202, in isBlack
print '*******', type(pixel), '*******'
IndexError: invalid index to scalar variable.
und keinen Hinweis darauf, was pixel denn nun ist... so long hank EDIT
Aha! Nach einem Neustart kommt zumindest das hier als Meldung, bevor es mit dem rest unverändert weitergeht:
******* <type 'numpy.ndarray'> *******
|
diesch
Anmeldungsdatum: 18. Februar 2009
Beiträge: 5072
Wohnort: Brandenburg an der Havel
|
Das ist, was ich wollte ☺ pixel ist also ein Numpy-Array. Ersetze print '*******', type(pixel), '*******' durch print '*******', pixel.dtype, pixel.ndim, '*******' und starte neu. Das sagt uns dann, was für Daten das Array enthält und wieviele Dimensionen es hat.
|
Heinrich_Schwietering
Wikiteam
(Themenstarter)
Anmeldungsdatum: 12. November 2005
Beiträge: 11335
Wohnort: Bremen
|
Hi! Das ergibt dann ******* uint8 1 *******
Ein Herumspielen mit den Klammern liefert auch veränderte Fehlermeldungen; | return pixel ([0,0] + [0,1] + [2,0]) < 128 * 3
|
liefert beispielsweise
TypeError: 'numpy.ndarray' object is not callable
Aber da ich nicht wirklich weiß, was ich da tue, ist das wohl auch nicht von Erfolgsaussichten gekrönt... 😉 so long hank
|
diesch
Anmeldungsdatum: 18. Februar 2009
Beiträge: 5072
Wohnort: Brandenburg an der Havel
|
pixel ist also ein eindimensionales Array, das Ganzzahlen enthält. Entferne die print-Zeile wieder und ersetze
return pixel[0][0] + pixel[1][0] + pixel[2][0] < 128 * 3
durch
return pixel[0] + pixel[1] + pixel[2] < 128 * 3
das sollte dann funktionieren.
|
Heinrich_Schwietering
Wikiteam
(Themenstarter)
Anmeldungsdatum: 12. November 2005
Beiträge: 11335
Wohnort: Bremen
|
Hi! Perfekt! 👍 Danke! ☺ Jetzt wüsste ich nur noch gerne, warum das ganze Skript unter karmic nicht funktioniert... Es startet zwar, aber sobald ich versuche, ein Dateienpaar zu öffnen, passiert nichts mehr; es lässt sich aber auch nicht "normal" schließen... - Fehlermeldungen gibt es erstmal keine.
Ist das Skript ggf. zu "alt?" so long hank
|