Hallo, ich bin ein Schüler der 11. Klasse. Ich interessiere mich für Programmierung und IT-Themen.
Ich schreibe diesen Beitrag, um mein Projekt zu teilen, das am Wochenende 10 Stunden meines Lebens in Anspruch genommen hat und abgeschlossen wurde, um die Möglichkeiten moderner Methoden der Datenanalyse zu verstehen. Die Veröffentlichung kann als Beispiel für eine erfolgreiche Implementierung für Personen angesehen werden, die in diesem Wissensbereich nichts wissen, sowie als Aufforderung, meine Fehler für Personen anzugeben, die über entsprechende Kenntnisse verfügen.
Gegeben: Videostream von einer Überwachungskamera, auf der sich ein Fragment von 100 x 50 Pixel mit einem Bild eines bestimmten Parkplatzes befindet, auf dem nur ein bestimmtes Auto vorhanden sein oder fehlen kann.
Ziel: Feststellung des Vorhandenseins oder Nichtvorhandenseins eines Autos auf einem Parkplatz.
Empfangen eines Kamerabildes
Ich benutze die openCV-Bibliothek, um das Bild abzurufen und vorzuverarbeiten.
Der folgende Code, mit dem ich den Datensatz erstellt habe, mit dem ich das neuronale Netzwerk trainiere: Ich fotografiere den Parkplatz stündlich und teile ihn nach Erhalt von 60 Fotos manuell in ein Foto mit und ohne Maschine auf.
dataminer.pyimport cv2 as cv import numpy as np import time cap = cv.VideoCapture() r = 0 while r <=100: cap.open('http://**.**.***.***:***/*****CG?container=mjpeg&stream=main')
Bildverarbeitung
Ich dachte, es wäre die richtige Entscheidung, das neuronale Netzwerk nicht auf den Quellbildern zu trainieren, sondern auf den Bildern mit den Konturen des Autos, die mit der Funktion cv2.findcontours (...) gefunden wurden.
Hier ist der Code, der das Originalbild in ein Umrissbild konvertiert:
Konturen finden def contoursfinder(image): img = image.copy() srcimg = img.copy() hsv_min = np.array((0, 0, 0), np.uint8) hsv_max = np.array((255, 255, 60), np.uint8)
Das Ergebnis der Funktion:
Neuronales Netz
Ich habe die Tensorflow-Bibliothek (Keras) verwendet.
Die Netzwerkarchitektur wurde aus dem Beispiel aus dem Internet kopiert: Für mich ist eine Erklärung nicht offensichtlich, warum dies so ist. Wenn sachkundige Leute sagen oder sagen, wo sie lesen sollen, warum diese Architektur effektiv ist oder warum eine andere effektiver ist, bin ich sehr dankbar.
Das neuronale Netzwerkmodell: sequentiell, besteht aus zwei dichten verborgenen Schichten von 256 und 128 Neuronen und Eingabe- und Ausgabeschichten.
Code model = keras.Sequential([ keras.layers.Flatten(input_shape=(100, 50)), keras.layers.Dense(256, activation=tf.nn.relu), keras.layers.Dense(128, activation=tf.nn.relu), keras.layers.Dense(2, activation=tf.nn.softmax) ]) model.compile(optimizer=tf.train.AdamOptimizer(), loss='sparse_categorical_crossentropy', metrics=['accuracy']) model.fit(trainingimagesarr, trainingimagesarrlabel, epochs=1, callbacks=[tbCallBack])
Vor dem Training wurde die gesamte Numpy-Matrix durch 255 geteilt, um dem Eingang des neuronalen Netzwerks Zahlen im Bereich von 0 bis 1 zu geben.
trainingimagesarr = trainingimagesarr / 255.0 trainingimagesarrlabel = np.array(trainingimagesarrlabel)-1
Jetzt kann ich die Funktion aufrufen:
def realtest(): cap = cv.VideoCapture() cap.open('http://**.**.***.***:***/*****CG?container=mjpeg&stream=main') hasFrame, frame = cap.read() frame = frame[100:200, 300:750] quantframe = frame[0:100,275:325] quantframe = contoursfinder(quantframe) return model.predict(np.array([quantframe]))[0][1]>0.60
Erhalten Sie Daten über das Vorhandensein des Autos auf dem Parkplatz.
Nicht viel treten, aber ein bisschen :-)
Vielen Dank!