Progreso mayo 2023 - RoboticsURJC/tfg-dcampoamor GitHub Wiki

Progreso mayo 2023

SEMANA 20 (01/05/2023-07/05/2023)

SEMANA 21 (08/05/2023-14/05/2023)

SEMANA 22 (15/05/2023-21/05/2023)

SEMANA 23 (22/05/2023-28/05/2023)

SEMANA 24 (29/05/2023-04/06/2023)

Semana 20 (01/05/2023-07/05/2023)

  • Detección de fresas en webcam con TensorFlow con modelos no pre-entrenados (ssd mobilenet v2 320x320)

    Finalmente el error Name Error: name 'detect_fn' is not defined , venía dado por no haber podido ejecutar la celda del bloque anterior en la que se definía la funciión detect_fn(image), por lo que tras cambiar varias líneas de diferentes archivos, se llegó al siguiente mensaje:

    Unexpected exception

    Para solucionar esto, se sustituyó en el archivo ssd_mobilenet_V2_fpn_feature_extractor.py la forma de llamar a la función conv2d por tf.keras.layers.Conv2D.

    Tras este cambio se consiguió ejecutar el programa, tal y como se muestra en la siguiente captura de pantalla, por lo que se procedió a llevar a cabo diferentes pruebas de detección al respecto.

    Deteccion fresas JN

    Al reiniciar el equipo, o tener que reiniciar el kernel, posiblemente pueda aparecer el siguiente error al intentar ejecutar de nuevo el archivo:

    Value Error

    Por lo que habrá que ejecutar en la terminal el siguiente comando para que Python pueda encontrar el módulo cuando se importe en un script, antes de volver a abrir jupyter notebook:

    export PYTHONPATH=$PYTHONPATH:/home/dcampoamor/anaconda3/envs/real_object_detection/lib/python3.8/site-packages/object_detection-0.1-py3.8.egg
    jupyter notebook
    

Semana 21 (08/05/2023-14/05/2023)

Semana 22 (15/05/2023-21/05/2023)

  • Detección de fresas en webcam con TensorFlow con modelos no pre-entrenados (ssd mobilenet v2 320x320)

    Después de llevar a cabo estas pruebas, se pasó a introducir en el programa de detección varios añadidos para obtener más datos sobre estas detecciones y poder mejorar el programa. Entre estos nuevos cambios se encuentran la instrucción cv2.destroyAllWindows(), dado que antes de introducir este comando, al pulsar la letra 'q' se dejaba de captar lo que se podía ver por la cámara del ordenador, pero no se cerraba la ventana emergente 'object detection', a la que también se le cambió el nombre por 'strawberry detection', teniendo que que forzar su cierre, por lo que si posteriormente se quería volver a ejecutar el programa para realizar una nueva detección, aparecía el siguiente mensaje de error, por lo que había que volver a ejecutar todo el programa desde el inicio, de nuevo.

    Kernel Restarting Dead kernel

    También se introdujo en el código, el cálculo de los FPS (frame per second), es decir, la medida de la frecuencia de cuadros en el vídeo, ya que representa la cantidad de imágenes individuales que se muestran en un segundo, midiendo la velocidad de procesamiento de los cuadros. Este dato será útil para comparar entre el uso de varios modelos para la detección, ya que un FPS más alto indica que se están procesando más cuadros por segundo, lo que generalmente se considera deseable para aplicaciones en tiempo real.

    # Setup Time
    startTime = 0
    currentTime = time.time()
    fps = 1/(currentTime - startTime)
    startTime = currentTime
    

    Y finalmente para mostrarlo en la ventana emergente durante la captura de vídeo de la webcam cv2.putText(image_np_with_detections, "FPS: " + str(int(fps)), (40, 40), cv2.FONT_HERSHEY_PLAIN,1, (0,255,0),2) donde:

    • 'image_np_with_detections': Es la imagen en la cual se escribirá el texto.

    • "FPS: " + str(int(fps)): Es el texto que se mostrará en la imagen. En este caso, se mostrará el valor de FPS (cuadros por segundo) como una cadena de texto.

    • '(40, 40)': Son las coordenadas (x, y) del punto de inicio del texto en la imagen.

    • 'cv2.FONT_HERSHEY_PLAIN': Es el estilo de fuente que se utilizará para el texto.

    • '1': Es el tamaño de la fuente.

    • '(0, 255, 0)': Es el color del texto en formato BGR (azul, verde, rojo). En este caso, el color es verde.

    • '2': Es el grosor del contorno del texto.

    A parte de esto, también se quiso encontrar el punto medio del recuadro de la primera detección, por lo que se utilizó el siguiente fragmento de código para el cálculo de las coordenadas centrales de esta primera detección:

    detection_boxes = detections['detection_boxes'][0]
    ymin, xmin, ymax, xmax = detection_boxes
    
    # Cálculo de las coordenadas centrales
    x_center = int((xmin + xmax) * image_np.shape[1] / 2)
    y_center = int((ymin + ymax) * image_np.shape[0] / 2)
    
    print("Coordenadas centrales de la detección:")
    print("x_center:", x_center)
    print("y_center:", y_center)
    

    Para poder limpiar el resultado de las celdas de salida, y que no se acumulasen las coordenadas de diferentes intentos de detección, se añadieron las líneas from IPython.display import clear_output en la primera celda del bloque 8.Detect in Real-Time y tras cerrar la ventana emergente después de detener la visualización a través de la cámara, el comando clear_output(), obteniendo como resultado lo siguiente:

    Coordenadas centrales bbox

    Todos estos cambios se encuentran en el archivo Ripe strawberry detection, dado que el modelo de momento únicamente reconoce fresas maduras.

    Para comprobar la aparente mejora del porcentaje de la detección con luz artificial frente a luz natural, se realizaron capturas de pantalla durante la ejecución del programa a lo largo del día, pudiendo diferenciar en la ejecución del mismo horas con alta luminosidad y con baja luminosidad, y definidas estas de la siguiente manera:

    Alta luminosidad Baja luminosidad
    9:00 h - 19:00 h 19:30 h - 21:30 h

    La bombilla utilizada para estas pruebas es una bombilla halógena de 12V y 20W.

    Las imágenes obtenidas se encuentran en la carpeta Comprobación de luz con el modelo my_ssd_mobnet.

Semana 23 (22/05/2023-28/05/2023)

  • Conclusiones

    De la recopilación de imágenes obtenidas de la ejecución del programa a lo largo del día, se pudieron obtener los siguientes resultados recogidos en el archivo Comprobación mejora luz artificial.

    Grafica deteccion alta luminosidad my_ssd_mobnet

    Grafica deteccion baja luminosidad my_ssd_mobnet

    Tal y como era de esperar, el porcentaje de detección con luz natural y alta luminosidad es superior a la detección con luz natural con baja luminosidad, mientras que se puede observar que para ambos casos de luminosidad, la detección utilizando luz artificial mejora el porcentaje de detección de fresas, suponiendo esta utilización un incremento mayor para los casos de baja luminosidad.

    Tabla media deteccion alta luminosidad Tabla media deteccion baja luminosidad

    Deteccion media alta luminosidad

    Deteccion media con baja luminosidad

Semana 24 (29/05/2023-04/06/2023)

  • Detección de fresas en webcam con TensorFlow con modelos no pre-entrenados (faster rcnn resnet101 v1 640x640)

    Se intentó entrenar otro modelo diferente con el algoritmo, siguiendo los mismos pasos que anteriormente, obteniendo los siguientes problemas:

    Import Error

    Para solucionar esto, se ejecutó el comando protoc object_detection/protos/*.proto --python_out=. en la ubicación /RealTimeObjectDetection/Tensorflow/models/research/object_detection y posteriormente, introducir el programa string_int_label_map_pb2.py en el archivo protos con la ubicación /home/dcampoamor/RealTimeObjectDetection/Tensorflow/models/research/object_detection/protos.

    El siguiente problema que se encontró al solucionar esto fue el siguiente:

    Assertion Error

    Se cambió en el archivo pipeline.congif la siguiente línea:

    fine_tune_checkpoint_type: "classification"
    

    Por:

    fine_tune_checkpoint_type: "detection"
    

    pipeline faster rcnn resnet

    Y para solventar el problema del exceso del 10% de la memoria libre del sistema al llevar a cabo este cambio y volver a ejecutar el comando para entrenar el modelo, se cambió en el mismo archivo pipeline.config el tamaño del batch_size de 4 a 2.

    starting training

    end of training

    Al continuar ejecutando el cuaderno de Jupyter Ripe strawberries detection my_faster_rcnn_resnet101 en el bloque 8. Detect in Real-Time se encuentra el siguiente error:

    Name Error image

    Debido a una copia previa al archivo definitivo de Ripe strawberries detection my_ssd_mobnet.ipynb, existían cambios que no se habían aplicado en el archivo Ripe strawberries detection my_faster_rcnn_resnet101.ipynb