Semana 17 - Piloto neuronal!!!
Índice
- Índice
- Fallo en augmentation
- Cambio de enfoque
- Cambios en el dataset
- Video final
- Conclusiones de la semana
Fallo en augmentation
Lo primero que se descubrió es que en nuestro caso la aumentación no nos favorecía tanto, ya que al hacer que el aprendizaje no dependiera del color, se detectaba la pared del circuito como la línea, por lo que se tuvo que quitar esta característica.
Cambio de enfoque
Tras una prueba, me di cuenta de que no sabía a ciencia cierta qué umbral de mse_loss
era el más indicado para finalizar el entrenamiento, por lo que se desarrolló otra manera de probar los modelos neuronales. Se ejecutó un entrenamiento de manera normal con el comando:
python3 train.py --dataset_path ../training_dataset/expertPilot_VX/ --network_path ../networks/netX/netX.tar
Entonces se creó un script que cada hora fuera copiando la red neuronal, guardando el estado de la misma con el avance del entrenamiento durante un tiempo indefinido. Se dejó esta red entrenando bastantes horas, dejando una carpeta con bastantes modelos.
El siguiente paso fue la automatización de la comprobación. Para esto se recorrió esta misma carpeta ejecutando cada modelo; el resultado se guardó como una imagen. Esto permitía ver con claridad qué modelos no funcionaban. Analizando los resultados se seleccionaron las gráficas donde menor error y tiempo por vuelta salía como resultado.
Cambios en el dataset
Se trataron varias distribuciones con las variables de pesos, la que dio un mejor resultado fue la siguiente
weights = [(0.85, 0.15, 0.25),
(0.65, 0.55, 0.45),
(0.35, 0.75, 0.995),
(0.35, 0.75, 0.995),
(0.65, 0.55, 0.45),
(0.85, 0.15, 0.25)]
También se distribuyeron de varias maneras las velocidades a la hora de entrenar. Leí una técnica que consistía en aumentar el valor de la variable que más importara en la estabilidad del sistema. Esto se tradujo en multiplicar la velocidad angular por 3 para que así tuviera un mayor peso y el error en la misma se corrigiera más rápido. Después de la inferencia se dividía su valor de nuevo entre 3 para que el drone se comportara adecuadamente.
En un principio dio buenos resultados, pero la velocidad lineal no se ajustaba mucho, por lo que se decidió normalizar ambas con sus valores máximos y mínimos y después normalizar.
Video final
Tras varias pruebas se consiguió que el piloto neuronal pasara el circuito de pruebas, pero quedaba un pequeño problema. El drone no era tan estable como se esperaba. Tras releer varios papeles de semanas anteriores, me di cuenta de que una de las características de estas redes neuronales es que no tienen memoria ni retroalimentación. En nuestro caso, lo más parecido y sencillo de implementar con nuestro modelo sería que la entrada del mismo fuera de 4 imágenes, pero no daría resultados muy distintos.
Pensándolo, nuestra mayor dependencia era que si el cambio de velocidad lineal era muy brusco, haría al drone cabecear y esto produciría un movimiento de cámara que desestabilizaría al drone. Para solucionar esto se usó la misma medida que en el piloto experto: hacer una media de x velocidades lineales para calcular la actual.
Con esta técnica se respeta la inferencia de la red neuronal y aportó una mucho mejor estabilidad, dando el siguiente resultado:
Conclusiones de la semana
No siempre más entrenamiento significa mejores resultados. Esto creo que podría ser debido a un sobreajuste, y hay veces que las redes neuronales tienen límites como es el caso de la “memoria” o retroalimentación de velocidades mencionadas anteriormente. Sin embargo, aporta la mejora de que su frecuencia de decisión es mucho más alta que la del piloto experto, pudiendo tener un mejor tiempo de reacción.
Podemos ver la diferencia de media entre frecuencias del piloto experto, con una media de 125 Hz, al piloto neuronal que, aunque tenga más desviación, su media de frequencia ronda al doble. Respecto a resultados prácticos, es cierto que el piloto neuronal tiene un poco más de error y tarda 5 segundos más en completar el circuito.