Eine Raupe, die Raspeye 3b + und eine Pi-Kamera verwendet, um die in Echtzeit aufgenommenen Fotos mit SVM in "vorwärts", "rechts", "links" und "rückwärts" zu klassifizieren.
Bitte sehen Sie hier, denn ein Bild sagt mehr als tausend Worte. YouTube: Raupentestlauf zur Vermeidung von Hindernissen mit Raspeltorte
[Farbabbildung Lernen Sie die elektronische Arbeit mit dem neuesten Raspberry Pi Make und bewegen Sie sie, um zu verstehen, wie sie funktioniert (Blue Bucks)](https://www.amazon.co.jp/%E3%82%AB%E3%83%A9%E3% 83% BC% E5% 9B% B3% E8% A7% A3-Himbeer-Pi% E3% 81% A7% E5% AD% A6% E3% 81% B6% E9% 9B% BB% E5% AD% 90% E5% B7% A5% E4% BD% 9C-% E4% BD% 9C% E3% 81% A3% E3% 81% A6% E5% 8B% 95% E3% 81% 8B% E3% 81% 97% E3 % 81% A6% E3% 81% 97% E3% 81% 8F% E3% 81% BF% E3% 81% 8C% E3% 82% 8F% E3% 81% 8B% E3% 82% 8B-% E3% 83% 96% E3% 83% AB% E3% 83% BC% E3% 83% 90% E3% 83% 83% E3% 82% AF% E3% 82% B9 / dp / 4062579774 / ref = sr_1_3? __Mk_ja_JP = % E3% 82% AB% E3% 82% BF% E3% 82% AB% E3% 83% 8A & Keywords =% E3% 83% A9% E3% 82% BA% E3% 83% 99% E3% 83% AA% E3% 83% BC% E3% 83% 91% E3% 82% A4% E3% 81% A7% E5% AD% A6% E3% 81% B6% E9% 9B% BB% E5% AD% 90% E5% B7% A5% E4% BD% 9C & qid = 1561894984 & s = Hobby & sr = 1-3-Katcorr)
Informationen zur Hardware finden Sie in Kapitel 10 + Schließen Sie einfach die Pi-Kamera an. Informationen zur Software finden Sie in Kapitel 8 + Vorverarbeitung + SVM (Scikit-Lernen) + Bild zum erneuten Lernen speichern
Schwer: Die Kamera schießt nur vor mir. Da es den Anschein hat, dass es nicht klassifiziert werden kann, wenn der Hintergrund reflektiert wird, geben Sie das Bild nur vor der Raupe ein.
Soft ①: Die Eingabe in svm beträgt 28 x 28 Pixel / Foto (Graustufen) Die Pi-Kameraaufnahme wurde auf 64 x 64 Pixel (Farbe) reduziert und auf 28 x 28 Pixel (Graustufen) vorverarbeitet. Wenn die Vorverarbeitung einige Zeit in Anspruch nimmt, tritt eine zeitliche Verzögerung beim Getriebe zum Motor auf. Mit dieser Auflösung habe ich die Verzögerung nicht wirklich bemerkt. Das 64x64 (Farb) Bild sieht übrigens so aus
28x28 (Graustufen)
Soft②: Ich habe einen Modus zum Ausführen erstellt, während Daten zum erneuten Lernen gesammelt wurden Wenn SavePics 1 ist, fahren Sie fort, während Sie das aufgenommene Bild zum erneuten Lernen speichern. Das gespeicherte Bild bewegt sich vorwärts, während der Dateiname als "vorwärts", "rechts", "links" und "rückwärts" bezeichnet wird. Nach dem Fahren können Benutzer die Bilder mit der falschen Bezeichnung leicht neu lernen, indem sie sie in Ordner unterteilen und camera_car_preprocess.py verschieben. Die Vorverarbeitung von ca. 200 Blatt x 4 Klassifizierungen dauert ca. 3 Minuten. Das Lernen ist sofort abgeschlossen, sodass Anpassungen vor Ort einfach vorgenommen werden können.
Weich ③: Biegen Sie beim Rückzug rechts ab Wenn Sie gerade zurück gehen, treten Sie in eine Endlosschleife ein, also versuche ich, nach rechts abzubiegen.
camera_car_preprocess.py
from PIL import Image
import numpy as np
import glob
from sklearn import svm, metrics
from sklearn.model_selection import train_test_split
import pickle
ModelName = "model_20191102_9.pickle"#As you wish.
def main():
Path = '/home/pi/Dokument/camera_car/Train/'
Left_L = glob.glob(Path + '1_Left/*.jpg')
Right_L = glob.glob(Path + '2_Right/*.jpg')
Center_L = glob.glob(Path + '0_Center/*.jpg')
Back_L = glob.glob(Path + '3_Back/*.jpg')
X_L = Preprocess(Left_L)
Y_L = np.ones(int(len(X_L)/784))
X_R = Preprocess(Right_L)
Y_R = np.full(int(len(X_R)/784),2)
X_C = Preprocess(Center_L)
Y_C = np.zeros(int(len(X_C)/784))
X_B = Preprocess(Back_L)
Y_B = np.full(int(len(X_B)/784),3)
X = np.r_[X_L, X_R, X_C, X_B]#concatinate all preprocessed pics.Alle vorverarbeiteten Fotokombinationen
X = X.reshape([int(len(X)/784),784])#make array.Matrix
y = np.r_[Y_L, Y_R, Y_C, Y_B]#teacher data addition.Hinzufügen von Lehrerdaten
print(X.shape)
print(y.shape)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.1, random_state=42)
clf = svm.SVC(kernel='linear')
clf.fit(X_train, y_train)
pre = clf.predict(X_test)
ac_score = metrics.accuracy_score(y_test, pre)
print(ac_score)#print score.Genauigkeitsanzeige
with open(ModelName, mode='wb') as fp:
pickle.dump(clf, fp)#save model.Modellausgabe
def Preprocess(files):
size = [28,28]
array = np.empty([size[0]*size[1],0],int)
print(array.shape)
print(files)
for i, file in enumerate(files):
img = Image.open(file).convert('L')
img = img.resize(size, Image.ANTIALIAS)
print(img.format, img.size, img.mode,img.getextrema())
img_arr = np.asarray(img)
print("OD"+str(img_arr.ravel().shape))
array = np.append(array,img_arr.ravel())
print(array.shape)
return array
if __name__ == '__main__':
main()
camera_car_main.py
# -*- coding: utf-8 -*-
from picamera import PiCamera
import RPi.GPIO as GPIO
from time import sleep
from PIL import Image
import numpy as np
import os
import glob
import pickle
import shutil
import random
def Preprocess(i,SaveP):
size = [28,28]
array = np.empty([size[0]*size[1],0],int)
print(array.shape)
FullPath = glob.glob('/home/pi/Dokument/camera_car/Predict/*.jpg')
print(FullPath)
#Preprocessing
img = Image.open(FullPath[0]).convert('L')
img = img.resize(size, Image.ANTIALIAS)
print(img.format, img.size, img.mode,img.getextrema())
#Make one dimention array
img_arr = np.asarray(img)
print("OneDimention"+str(img_arr.ravel().shape))
if SaveP:
os.remove(FullPath[0])
else:#saving pics for re-training the model.Talent speichert Fotos für Hashu
shutil.move(FullPath[0],'/home/pi/Dokument/camera_car/Predict/done/%s.jpg' % i)
return img_arr.ravel(), img
PickleName = "model_20191102_9.pickle"#indicate trained model(pickle)
SavePics = 0
with open(PickleName, mode='rb') as fp:
clf = pickle.load(fp)
camera = PiCamera()
#camera.rotation = 180#Wenn die Kamera auf dem Kopf steht Wenn die Kamera auf dem Kopf steht
camera.resolution = (64,64)
GPIO.setmode(GPIO.BCM)
GPIO.setup(25, GPIO.OUT)
GPIO.setup(24, GPIO.OUT)
GPIO.setup(23, GPIO.OUT)
GPIO.setup(22, GPIO.OUT)
p0 = GPIO.PWM(25, 50)#RH
p1 = GPIO.PWM(24, 50)#RH
p2 = GPIO.PWM(23, 50)#LH
p3 = GPIO.PWM(22, 50)#LH
p0.start(0)
p1.start(0)
p2.start(0)
p3.start(0)
print("start moving...")
sleep(10)
i = 0
duty = 70
#At first go forward
p0.ChangeDutyCycle(20)
p1.ChangeDutyCycle(0)
p2.ChangeDutyCycle(20)
p3.ChangeDutyCycle(0)
try:
while True:
#Take a pic and save to indicated folder.Nehmen Sie ein Foto auf und speichern Sie es im angegebenen Ordner
i += 1
camera.capture('/home/pi/Dokument/camera_car/Predict/%s.jpg' % i)
#preprocessing at indicated folder.Verarbeiten Sie die Fotos im angegebenen Ordner vor
X_pred, img = Preprocess(i, SavePics)
#Schätzung vorhersagen
pred = clf.predict(X_pred)
#change duty ratio.Änderung des Tastverhältnisses
if pred[0] == 0:#Voraus
print("Forward")
p0.ChangeDutyCycle(duty)
p1.ChangeDutyCycle(0)
p2.ChangeDutyCycle(duty)
p3.ChangeDutyCycle(0)
sleep(0.8)
elif pred[0] == 1:#links abbiegen links
print("Left")
p0.ChangeDutyCycle(duty-20)
p1.ChangeDutyCycle(0)
p2.ChangeDutyCycle(0)
p3.ChangeDutyCycle(20)
sleep(0.3)
elif pred[0] == 2:#rechts rechts abbiegen
print("Right")
p0.ChangeDutyCycle(0)
p1.ChangeDutyCycle(20)
p2.ChangeDutyCycle(duty-20)
p3.ChangeDutyCycle(0)
sleep(0.3)
elif pred[0] == 3:#rückwärts rückwärts
p0.ChangeDutyCycle(0)
p1.ChangeDutyCycle(duty-10)
p2.ChangeDutyCycle(0)
p3.ChangeDutyCycle(duty-40)
print("Backing...")
sleep(1)
print("finish backing")
#Vorverarbeitetes Bild speichern Vorverarbeitetes Foto speichern
if SavePics:
pass
else:#collect preprocessed pics with pred number.Speichern Sie das Foto zum erneuten Lernen (mit dem geschätzten Wert).
rand = random.randint(0,100000)
img.save('/home/pi/Dokument/camera_car/Train/'
+str(i)+'_'+str(int(pred[0]))+
'_'+str(rand)+'.jpg')
except KeyboardInterrupt:
pass
p0.stop()
p1.stop()
GPIO.cleanup()
Die Ordnerstruktur ist
│ camera_car_main.py │ camera_car_preprocess.py │ model_20191102_8_best.pickle │ model_20191102_9.pickle ├─Predict │ └─done └─Train ├─0_Center ├─1_Left ├─2_Right └─3_Back
Bitte. Übrigens gibt es zwei Gurken, aber 8 war die beste. 9 ist eine Re-Learning-Version von 8, aber da es nicht tatsächlich ausgeführt wird, ist die Fähigkeit unbekannt.
Es war interessant, weil ich in der Lage war, über verschiedene Dinge nachzudenken, von Hardware bis Logik, und sie zu implementieren, und ich lernte über Logik, indem ich über das Wiederlernen nachdachte. Die Verbesserung besteht darin, dass die Leute Anmerkungen machen müssen, um neu zu lernen. Der Nachteil ist also, dass Sie ohne ein großes Display nicht sofort neu lernen können.
Recommended Posts