[PYTHON] Hindernis (schwarz) Ich habe eine Raupe mit automatischer Vermeidung hergestellt.

Was ich gemacht habe

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. IMG_1029.JPG

Bitte sehen Sie hier, denn ein Bild sagt mehr als tausend Worte. YouTube: Raupentestlauf zur Vermeidung von Hindernissen mit Raspeltorte

Nachschlagewerke

[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

Einfallsreichtum

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 1291.jpg

28x28 (Graustufen) 1292_1_93784.jpg

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.

Schaltplan

IMG_1030.JPG

Code

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.

Impressionen

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

Hindernis (schwarz) Ich habe eine Raupe mit automatischer Vermeidung hergestellt.
Ich habe einen Ansible-Installer gemacht
Ich habe einen Xubuntu-Server erstellt.
Ich habe einen Anpanman-Maler diskriminiert
Ich habe ein Angular Starter Kit gemacht
Ich habe eine Online-Frequenzanalyse-App erstellt
Ich habe ein alternatives Modul für japandas.DataReader erstellt
Ich habe ein automatisches Stempelwerkzeug für den Browser erstellt.
Ich habe ein Extenum-Paket erstellt, das die Enumeration erweitert
Ich habe eine Amazon Web Service Dash-Schaltfläche erstellt
Ich habe ein automatisches Kitskript für OpenBlocks IoT geschrieben
Ich habe ein automatisches Installationsskript für Arch Linux geschrieben
Ich habe eine Android-App erstellt, die Google Map anzeigt