La tarea de clasificar a través de los ojos de un niño escolar: determinar la presencia de un automóvil en el estacionamiento por marcos de una cámara de vigilancia

Hola, soy un estudiante de 11º grado, estoy interesado en la programación, sobre temas de TI.

Estoy escribiendo esta publicación para compartir mi proyecto, que tomó 10 horas de mi vida el fin de semana y se completó para comprender las posibilidades de los métodos modernos de análisis de datos. La publicación puede considerarse como un ejemplo de implementación exitosa para personas ignorantes en este campo del conocimiento, así como una solicitud para indicar mis errores a las personas que tienen el conocimiento correspondiente.

Dado: transmisión de video desde una cámara CCTV, en la que hay un fragmento de 100x50 píxeles con una imagen de un espacio de estacionamiento en particular, en el que solo un automóvil específico puede estar presente o ausente.

Imagen de la cámara

Imagen de una plaza de aparcamiento


Objetivo: determinar la presencia o ausencia de un automóvil en un espacio de estacionamiento.

Recibir una imagen de cámara


Utilizo la biblioteca openCV para obtener y preprocesar la imagen.
Utilicé el siguiente código para crear el conjunto de datos que utilizo para entrenar la red neuronal: fotografío el espacio de estacionamiento cada hora, y después de recibir 60 fotos, las divido manualmente en una foto con y sin máquina.

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 


Procesamiento de imagen


Pensé que era la decisión correcta entrenar la red neuronal no en las imágenes de origen, sino en las imágenes con los contornos del automóvil que se encuentran utilizando la función cv2.findcontours (...).

Aquí está el código que convierte la imagen original en una imagen de esquema:

Encontrar contornos
 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) 


El resultado de la función:

Texto oculto

Red neuronal


Usé la biblioteca de tensorflow (keras).

La arquitectura de red se ha copiado del ejemplo de Internet: para mí, una explicación no es obvia por qué es así. Si personas conocedoras dicen o leen dónde leer, por qué esta arquitectura es efectiva o por qué alguna otra será más efectiva, estaré inmensamente agradecido.
El modelo de red neuronal: secuencial, consiste en dos densas capas ocultas de 256 y 128 neuronas y capas de entrada y salida.

Código
 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]) 


Antes del entrenamiento, toda la matriz numpy se dividió por 255 para dar números en el rango de 0 a 1 a la entrada de la red neuronal.

 trainingimagesarr = trainingimagesarr / 255.0 trainingimagesarrlabel = np.array(trainingimagesarrlabel)-1 

Ahora puedo llamar a la función:

 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 

obtener datos sobre la presencia del automóvil en el estacionamiento.

No patees mucho, pero un poco :-)

Gracias

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


All Articles