Die Aufgabe, mit den Augen eines Schülers zu klassifizieren: das Vorhandensein eines Autos auf dem Parkplatz anhand von Rahmen einer Überwachungskamera zu bestimmen

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.

Kamerabild

Bild eines Parkplatzes


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.py
import 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') #URL-  hasFrame, frame = cap.read()#    frame = frame[100:200, 300:750] box = [0,335,100,385] quantframe = frame[box[0]:box[2], box[1]:box[3]]#         r+=1 cv.imwrite(str(r)+'.png',quantframe) #     print('saved') cap.release() time.sleep(3600) key = cv.waitKey(1) if key & 0xFF == ord('q'): cv.destroyAllWindows() break 


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) #         ,   ,      hsv = cv.cvtColor( img, cv.COLOR_BGR2HSV ) thresh = cv.inRange( hsv, hsv_min, hsv_max ) contours, _ = cv.findContours(thresh, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE) img = np.zeros((100,50,3), np.uint8) cv.drawContours(img, contours, -1, (255,255,255), 1, cv.LINE_AA) return cv.cvtColor(img, cv.COLOR_BGR2GRAY) 


Das Ergebnis der Funktion:

Versteckter Text

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!

Source: https://habr.com/ru/post/de440608/


All Articles