Seite 1 von 2
If then Abfrage
Verfasst: Montag 11. Januar 2021, 18:06
von joernius
Hallo zusammen,
ich versuche eigentlich nur eine einfache If-Then-Abfrage, bzw If-Else nennt sich das wohl...und falle von einer Fehlermeldung in die nächste
Es geht um zwei-Abfrage-Zweige, einer wird genommen wenn das Modul
libedgetpu.so.1.0
geladen ist, der andere als Fallback.
So in der Art:
Code: Alles auswählen
import importlib
edge_tpu_delegate = importlib.util.find('libedgetpu.so.1.0')
if edge_tpu_delegate is None:
print("No EdgeTPU detected. Falling back to CPU.")
def make_interpreter(model_file):
model_file, *device = model_file.split('@')
return tflite.Interpreter(
model_path=model_file
)
else:
def make_interpreter(model_file):
model_file, *device = model_file.split('@')
return tflite.Interpreter(
model_path=model_file,
experimental_delegates=[
tflite.load_delegate(EDGETPU_SHARED_LIB,
{'device': device[0]} if device else {})
])
Die Python-Version ist 3.7
Wenn jemand diese Abfrage lauffähig hinbiegen kann, so würde ich mich freuen
Viele Grüße
Jörn
Re: If then Abfrage
Verfasst: Montag 11. Januar 2021, 18:30
von sparrow
Auch im neuen Jahr können wir Fehlermeldungen nicht erraten.
Ich verstehe auch ehrlich gesagt nicht, warum du zwei verschiedene Versionen der Funktion vorhalten solltest. Mach die Fallutnerscheidung *in* der Funktion.
Re: If then Abfrage
Verfasst: Montag 11. Januar 2021, 18:49
von __blackjack__
Was ist denn hier `importlib`? Denn `importlib.util` aus der Standardbibliothek kennt keine `find()`-Funktion. Und dürfte auch eher nicht mit so einer „shared library“ klar kommen.
Re: If then Abfrage
Verfasst: Montag 11. Januar 2021, 18:52
von Sirius3
@sparrow: bei so Sachen, ob eine Bibliothek vorhanden ist, sind solche if-Abfragen nicht unüblich.
@joernius: Eingerückt wird immer mit 4 Leerzeichen pro Ebene, nicht mal 4 und mal 2.
Und wo ist das Problem?
Re: If then Abfrage
Verfasst: Montag 11. Januar 2021, 18:57
von __blackjack__
@Sirius3: Naja, das hier:
Code: Alles auswählen
In [309]: import importlib.util
In [310]: importlib.util.find('libedgetpu.so.1.0')
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-308-076194ef8263> in <module>
----> 1 importlib.util.find('libedgetpu.so.1.0')
AttributeError: module 'importlib.util' has no attribute 'find'
Hat natürlich nichts mit dem ``if`` zu tun.
Re: If then Abfrage
Verfasst: Montag 11. Januar 2021, 19:33
von joernius
Da war ja nur ein Beispiel. Hatte ich als Anregung aus dem Netz.
Methoden und Verfahren sind mir egal, ich will ja nur eine Fallunterscheidung. Kann auch ganz anders aussehen.
Habe von Python keine Ahnung, komme aber hier nicht drumherum.
Re: If then Abfrage
Verfasst: Montag 11. Januar 2021, 19:38
von __blackjack__
@joernius: Du hast eine Fallunterscheidung. Und immer noch nicht verraten was das Problem damit ist.
Re: If then Abfrage
Verfasst: Montag 11. Januar 2021, 19:45
von joernius
Ups, ich nahm an, meine ersten Sätze sind verständlich.
Wie Du in dem anderen Thread vorschlugst, die Zeilen
Code: Alles auswählen
experimental_delegates=[
tflite.load_delegate(EDGETPU_SHARED_LIB,
{'device': device[0]} if device else {})
auszukommentieren, weißt Du noch?
Also, ist das Modul libedgetpu.so.1.0 geladen, dann ist der Coral-Acculator angesteckt, dann soll experimental_delegates=[ ... durchlaufen werden.
Wenn nicht, darf das nicht aufgerufen werden.
Re: If then Abfrage
Verfasst: Montag 11. Januar 2021, 20:00
von __blackjack__
@joernius: Das ist irgendwie falsch herum. Was heisst denn „wenn das geladen ist“? Der Code da *lädt* das ja. Du willst eine Entscheidung auf Grund von etwas fällen was erst gemacht werden soll wenn die Entscheidung… das ist ein Zirkelschluss.
Re: If then Abfrage
Verfasst: Montag 11. Januar 2021, 20:10
von joernius
Das ist ja kein Modul im Sinne der Programmiersprache. Eher eine Bibliothek, welche ansprechbar wird, wenn die Hardware gesteckt ist.
Es wird also erkannt, ob libedgetpu.so.1.0 verfügbar ist.
Re: If then Abfrage
Verfasst: Montag 11. Januar 2021, 22:37
von __blackjack__
@joernius: Wo wird das erkannt? Was passiert denn wenn diese Hardware (oder Bibliothek) nicht vorhanden ist?
Re: If then Abfrage
Verfasst: Montag 11. Januar 2021, 23:08
von joernius
Dann bricht das Skript mit einer Fehlermeldung mit einem Hinweis zu dieser Bibliothek ab.
Vielleicht wäre ein andere Weg den Fehler zu ignorieren, wenn das geht, dann bei Fehler einen andere Verzweigung zu wählen.
Das original Skript war ja das: https:/ ... &t=50882&e
Eine Bastellösung wäre natürlich, die USB-Schnittstelle abzufragen ob ein Gerät von Google angeschlossen ist und dann entweder das Skript mit den auskommentierten "experimental_delegates=[.."-Zweig, oder das andere Skript mit der TPU-Unterstützung laufen zu lassen. Aber eben wenig elegant....
Re: If then Abfrage
Verfasst: Montag 11. Januar 2021, 23:24
von __blackjack__
@joernius: Was denn für eine Fehlermeldung? Und bitte komplett samt Traceback (falls es den gibt) 1:1 kopieren.
Re: If then Abfrage
Verfasst: Montag 11. Januar 2021, 23:35
von joernius
$ python3 classify_image.py --model tflite.tpu_model/model_edgetpu.tflite --labels tflite.tpu_model/labels.txt --input sperling.jpg
Traceback (most recent call last):
File "/home/pi/tflite1/tflite1-env/lib/python3.7/site-packages/tflite_runtime/interpreter.py", line 152, in load_delegate
delegate = Delegate(library, options)
File "/home/pi/tflite1/tflite1-env/lib/python3.7/site-packages/tflite_runtime/interpreter.py", line 111, in __init__
raise ValueError(capture.message)
ValueError
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "classify_image.py", line 119, in <module>
main()
File "classify_image.py", line 96, in main
interpreter = make_interpreter(args.model)
File "classify_image.py", line 70, in make_interpreter
{'device': device[0]} if device else {})
File "/home/pi/tflite1/tflite1-env/lib/python3.7/site-packages/tflite_runtime/interpreter.py", line 155, in load_delegate
library, str(e)))
ValueError: Failed to load delegate from libedgetpu.so.1
Re: If then Abfrage
Verfasst: Montag 11. Januar 2021, 23:48
von joernius
Sirius3 hat geschrieben: Montag 11. Januar 2021, 18:52
@joernius: Eingerückt wird immer mit 4 Leerzeichen pro Ebene, nicht mal 4 und mal 2.
Und wo ist das Problem?
Ja, ich weiß um die Bedeutung der Einrückung bei Python, aber das Skript habe ich so geklaut. Ich kann eben nur Bash

den Rest "borge"ich mir aus...
Re: If then Abfrage
Verfasst: Dienstag 12. Januar 2021, 00:23
von __blackjack__
@joernius: Na dann kann man doch einfach den `ValueError` entsprechend behandeln. Stichwort ist Ausnahmebehandlung.
Re: If then Abfrage
Verfasst: Dienstag 12. Januar 2021, 09:17
von joernius
__blackjack__ hat geschrieben: Dienstag 12. Januar 2021, 00:23
@joernius: Na dann kann man doch einfach den `ValueError` entsprechend behandeln. Stichwort ist Ausnahmebehandlung.
OK, danke. Werde mich mal schlau-googlen.
Re: If then Abfrage
Verfasst: Dienstag 12. Januar 2021, 10:27
von Sirius3
Nicht schlau-Googlen, sondern den entsprechenden Abschnitt in der Dokumentation durcharbeiten:
https://docs.python.org/3/tutorial/errors.html
Re: If then Abfrage
Verfasst: Dienstag 12. Januar 2021, 11:00
von joernius
Danke für die Schubser

,
die Tutorial lesen sich schön einfach, aber meine Praxis sieht dann so aus:
Code: Alles auswählen
ef make_interpreter(model_file):
model_file, *device = model_file.split('@')
return tflite.Interpreter(
model_path=model_file,
experimental_delegates=[
tflite.load_delegate(EDGETPU_SHARED_LIB,
{'device': device[0]} if device else {})
except ValueError:
print("Coral Acculator nicht angesteckt, bitte Auffruf ändern")
])
Meine einzige Freude bei Einsatz dieses einfügten Aufrufes war, das die Schlüsselwörter schön bunt im VIM dargestellt werden.
Egal wo ich den Zweizeiler hinsteckte, mehr eingerückt, nach der Klammer usw.... Python ist da einer festen Meinung:
Re: If then Abfrage
Verfasst: Dienstag 12. Januar 2021, 11:13
von Jankie
Zu einem except gehört auch ein
try.