Trainiertes neuronales Netz auf dem Raspberry verwenden

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
offifee
User
Beiträge: 4
Registriert: Donnerstag 27. Juni 2019, 03:41

Guten Tag,

hat hier schonmal jemand ein neuronales Netz (Objekterkennung auf Bildern) außerhalb des Raspberrys in Python trainiert und anschließend auf einem Raspberry Pi verwendet?

Es ist leider schwierig, da konsistente Informationen zu zu finden. Ich habe gelesen, man müsse das Netzwerk als Frozen intergraph .pb file speichern.
Allerdings finde ich nirgends weitere Infos, WIE man das denn macht.

Ich habe bereits ein Netz über Keras trainiert und konnte seperat die Netzwerkarchitektur und die Gewichtungen (weights) speichern, falls jemand weiß wie ich das pb. file daraus konvertieren kann.

Weiß da jemand was? Oder kennt jemand eine andere Möglichkeit?


Vielen Dank für jegliche Hilfe.

Liebe Grüße
offifee
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Wie willst du denn dann auf dem Pi das trainierte NN verwenden, mit welchem Python Package?
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
offifee
User
Beiträge: 4
Registriert: Donnerstag 27. Juni 2019, 03:41

ThomasL hat geschrieben: Donnerstag 27. Juni 2019, 17:50 Wie willst du denn dann auf dem Pi das trainierte NN verwenden, mit welchem Python Package?

Das ist mir an sich egal. Was bereits mit einem vortrainierten NN geklappt hat (das habe ich direkt als Frozen intergraph .pb file runtergeladen): Dieses NN in Python 3.6 auf dem Raspberry ueber tensorflow zu verwenden. Wenn ich es richtig verstanden habe, gehoeren diese .pb files so wie so zu tensorflow.

Also waere es super zu wissen, wie ich ein in Keras trainiertes Netz entsprechend konvertiere oder zu wissen, wie ich ein NN in tensorflow trainiere und als .pb speichere/exportiere.

Wenn jemand eine andere Gesamtloesung hat, wuerde ich das aber auch probieren.
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Also ich würde das so machen:

Code: Alles auswählen

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense

# dummy NN
model = Sequential()
model.add(Dense(64, activation = ‘relu’, input_dim = 10))
model.add(Dense(1, activation = ‘sigmoid’))
model.compile(optimizer = ‘adam’, loss = ‘binary_crossentropy’, metrics = [‘accuracy’])

# training
model.fit(X_train, y_train, epochs = 5)

# predicting 
y_pred = model.predict(X_test)
y_pred = (y_pred > 0.5)

# saving the model
model.save(“model.h5”)
Auf einem anderen Rechner kann man dann das gespeicherte Model laden und benutzen

Code: Alles auswählen

from tensorflow.keras.models import load_model

model = load_model(“model.h5”)

new_prediction = model.predict(new_X_test)
new_prediction = (new_prediction > 0.5)
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
offifee
User
Beiträge: 4
Registriert: Donnerstag 27. Juni 2019, 03:41

ThomasL hat geschrieben: Freitag 28. Juni 2019, 05:18 Also ich würde das so machen:

Code: Alles auswählen

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense

# dummy NN
model = Sequential()
model.add(Dense(64, activation = ‘relu’, input_dim = 10))
model.add(Dense(1, activation = ‘sigmoid’))
model.compile(optimizer = ‘adam’, loss = ‘binary_crossentropy’, metrics = [‘accuracy’])

# training
model.fit(X_train, y_train, epochs = 5)

# predicting 
y_pred = model.predict(X_test)
y_pred = (y_pred > 0.5)

# saving the model
model.save(“model.h5”)
Auf einem anderen Rechner kann man dann das gespeicherte Model laden und benutzen

Code: Alles auswählen

from tensorflow.keras.models import load_model

model = load_model(“model.h5”)

new_prediction = model.predict(new_X_test)
new_prediction = (new_prediction > 0.5)
Vielen Dank fuer Ihre Antwort!
Das Problem ist, dass ich dann am Ende wieder ein Keras Modell habe. Ein solches habe ich auch schon erfolgreich trainiert, nur bekomme ich es nicht auf dem Raspberry zum Laufen. Auf dem Raspberry habe ich es bisher nur geschafft, ein .pb (wenn ich es richtig verstehe ein in Tensorflow ohne Keras) trainiertes Netz zu verwenden. Aber eben nur eins, das ich so fertig im passsenden Format runtergeladen habe.

Wissen Sie, wie man ein .h5 Model auf dem Raspberry verwenden oder es in ein .pb konvertieren kann? Ich finde leider keine wirklich hilfreichen Informationen dazu.

Oder funktioniert das schon mit dem zweiten Teil des Codes? Sind in dem .h5 nicht nur die Gewichtungen (Weights) hinterlegt? Ich habe zum Speichern eines Netzwerks in Keras immer nur gelesen, dass man Architektur und Gewichtungen einzelnd speichert, auch wenn das fuer mich wenig Sinn ergeben hat.

Liebe Gruesse
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Dann zeig doch mal den Code mit dem du eine .pb Datei erzeugt hast und den Code, mit dem du die .pb Datei auf dem Pi verwendest.
Was spricht dagegen, Tensorflow auf dem Pi zu verwenden? (Darüber habe ich keine Info/Erfahrung)
Von .pb Dateien habe ich auch das erste Mal von dir gehört.
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Habe mal etwas Zeit in Google investiert und das hier gefunden:
https://stackoverflow.com/questions/454 ... sorflow-pb
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
offifee
User
Beiträge: 4
Registriert: Donnerstag 27. Juni 2019, 03:41

Mit ein paar kleinen Erweiterungen hat Ihr Code zum verwenden des Netzwerks als .h5 tatsaechlich funktioniert! Vielen Dank, da werde ich jetzt drauf aufbauen.

Sie haben mir damit sehr geholfen.

Ich habe jetzt folgendes genutzt:


from tensorflow.keras.models import load_model

model = load_model(“model.h5”)

%hier ein paar Befehle zum Bild einlesen, als img speichern und in die richtige Form bringen

classes=model.predict_classes(img)
print(classes)

Funktioniert super, jetzt muss nur noch verschoenert werden. Also, nochmals vielen Dank!
Antworten