ubuntuusers.de

python-skript meldet IndexError: invalid index to scalar variable.

Status: Gelöst | Ubuntu-Version: Ubuntu 9.04 (Jaunty Jackalope)
Antworten |

Heinrich_Schwietering Team-Icon

Wikiteam
Avatar von Heinrich_Schwietering

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 Team-Icon

Avatar von 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 Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: 4686

Wohnort: Berlin

Das sieht mir sehr nach numpy-Arrays aus. Vielleicht ist pixel nicht einmal einfach indizierbar:

1
2
3
4
5
6
7
8
9
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 Team-Icon

Wikiteam
(Themenstarter)
Avatar von Heinrich_Schwietering

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 Team-Icon

Avatar von 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

1
print type(pixel)

vor dem return einfügen, um zu schauen, was das für Werte sind - doe Doku sagt dazu leider nichts.

Heinrich_Schwietering Team-Icon

Wikiteam
(Themenstarter)
Avatar von Heinrich_Schwietering

Anmeldungsdatum:
12. November 2005

Beiträge: 11335

Wohnort: Bremen

Hi!

diesch schrieb:

Ich würde in isBlack mal ein

1
print type(pixel)

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 Team-Icon

Avatar von 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 Team-Icon

Wikiteam
(Themenstarter)
Avatar von Heinrich_Schwietering

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 Team-Icon

Avatar von 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 Team-Icon

Wikiteam
(Themenstarter)
Avatar von Heinrich_Schwietering

Anmeldungsdatum:
12. November 2005

Beiträge: 11335

Wohnort: Bremen

Hi!

leider gibt es keine andere Fehlermeldung;

1
2
3
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 Team-Icon

Avatar von 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 Team-Icon

Wikiteam
(Themenstarter)
Avatar von Heinrich_Schwietering

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;

1
    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 Team-Icon

Avatar von 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 Team-Icon

Wikiteam
(Themenstarter)
Avatar von Heinrich_Schwietering

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

Antworten |