( esta página y código fuente aqui https://github.com/FacundoRo/SDD )
Proyecto realizado con python, deep learning y computer vision para monitorear el distanciamiento social. Para el object recognition hemos usado una darknet/YOLOv3 (https://pjreddie.com/darknet/yolo/) entrenada para reconocer 80 clases , concentrandonos en la clase 0 del archivo coco.names (clase person).
Credito de idea: LandingAI
Clickea en las imagenes para ver los videos del programa en acción.
Es recomendable crear un nuevo entorno virtual para este proyecto e instalar las dependencias. Se pueden seguir los siguientes pasos para descargar comenzar con el proyecto
git clone https://github.com/FacundoRo/SDD.git
Solo necesita numpy y opencv.
Además es necesario descargar yolov3.weights de https://drive.google.com/open?id=1R7Pd6IqPRN7ls2VcuP3EpsW87H_JjA_-
cd SDD
python SDD_local.py
Al ejecutar SDD_local.py se abrirá una ventana del primer fotograma del video. En este punto, el código espera que el usuario marque 6 puntos haciendo clic en las posiciones apropiadas en el marco.
Los primeros 4 entre los 6 puntos requeridos se utilizan para marcar una region que va ser mapeada hacia un cuadrado. Además, las líneas marcadas por estos puntos deben ser líneas paralelas en el mundo real como se ve desde arriba. Por ejemplo, estas líneas podrían ser los bordes de la carretera. Estos 4 puntos deben proporcionarse en un orden predefinido que sigue.
- Point1 (ai): abajo a la izquierda
- Point2 (ad): abajo a la derecha
- Point3 (Ai): arriba a la izquierda
- Point4 (Ad): arriba a la derecha
Los últimos dos puntos se usan para marcar dos puntos separados 2mts en la región de interés. Por ejemplo, esto podría ser la altura de una persona (más fácil de marcar en el marco)
Lo primero es calcular la matriz M de la transformación de perspectiva, para tener una vista aerea. Esa transformacion M la usamos con la función de openCV
M = cv2.getPerspectiveTransform( pts_cuatro, ...)
dst=cv2.perspectiveTransform(pts,M)
Luego obtenemos los centroides de los bounding boxes que nos devuelve YOLOv3.
net = cv2.dnn.readNetFromDarknet("yolov3.cfg","yolov3.weights")
...
layerOutputs = net.forward(ln)
...
for output in layerOutputs:
for detection in output:
...
box = detection[0:4] * np.array([W, H, W, H])
...
Una vez con las coordenadas de los centroides de cada persona en una matrix de numpy las transformamos
dst_pts=cv2.perspectiveTransform(pts_matrix,M)
a un plano euclideo (vista aerea) con la transformacion de perspectiva y procedemos a calcular la distancia entre todas las personas y las marcamos con "OK" y "CUIDADADO" en la imagen original del video.
![video_completo]https://drive.google.com/file/d/1AOnOwZZc6--YXz88jVEqRx66ecm4j1aD/view
Ejecutar desde PC debido a que colab tiene algunas restricciones.
Integrantes del grupo:
Facundo Rodriguez
Guillermo Ruiz
Edwin Contreras
Créditos de idea: LandingAI