Review del Nano Degree de Udacity sobre conducción autónoma

Hace unos días terminé el primer trimestre del nano-degree (¿nano-grado?) sobre conducción autónoma. El nano-degree tiene tres partes que duran 12 semanas (un trimestre) cada una y cuesta en total $2,400.

Udacity es una start-up californiana fundada por Sebastian Thrun — ex-profesor de Stanford e impulsor del coche autónomo de Google — que se especializa en formación online solamente en áreas punteras donde hay falta de talento, e.g. inteligencia artificial, robótica, realidad virtual, etc.

En esta review os contaré mi experiencia.

¿Por qué?

¿Es que voy a montar una empresa de conducción autónoma o busco trabajo en el sector? La respuesta a ambas preguntas es no.

Mi motivación es intelectual: la conducción autónoma reúne una larga lista de desafíos imposibles de resolver con lo que s̶é̶ sabía de ingeniería así que éste es mi ticket para lo que será una norma en el futuro: el aprendizaje perenne.

Curriculum y Clases

Este nano-degree es de los pocos de Udacity calificados de avanzados, y no exageran: presuponen que sabes programar en Python y C++, que te manejas en sistemas lo suficiente para levantar máquinas en Amazon EC2 y hurgar en la consola de Linux; y aunque no es estrictamente necesario más te vale tener intuición para las matemáticas si quieres entender rigurosamente los conceptos y técnicas que se usan.

Como la motivación a la hora de estudiar es el principal obstáculo para conseguir resultados — eso lo saben en Udacity de sobra — las lecciones suelen empezar con elementos motivacionales.

Aunque no sea de este curso, el caso más extremo es este video donde sale Sebastian Thrun — el fundador de Udacity — incitándote a hacer un curso introductorio de machine learning: helo aquí en Napa Valley, botella de vino en mano como un auténtico triunfador (me abstengo de usar otros adjetivos).

Sí Señor Thrun, así se hace (sí, lo digo en serio).

El vídeo con el que nos motivarán para hacer el curso es éste:

que cuenta cómo el equipo de Stanford liderado por Thrun ganó el desafío DARPA de conducción autónoma por el desierto. Si no has visto el vídeo y te interesa remotamente la conducción autónoma, te lo recomiendo.

Una vez motivados, empiezan las clases, que resumiré con este meme:

Bien joven aprendiz, ya sabes todo lo que hay que saber sobre deep learning.

Las mala noticia es que el material de Udacity en si mismo es claramente insuficiente para aprender. En 10 ó 15 minutos tenemos una "lección" a lo Barrio Sésamo, dónde el Profesor Coco o acólito intentará resumir temas áridos; en mi caso veo imposible que sólo con ese material puedas dominar el temario o incluso superar los proyectos más complejos.

La buena noticia es que Udacity parece ser consciente de que sus videos son realmente un calentamiento así que te dan material que ellos llaman "extra"… y que yo considero absolutamente básico.

Por ejemplo, en la lección sobre deep learning te hacen implementar casi desde cero una versión de andar por casa del TensorFlow para que sepas como funcionan esas librerías a bajo nivel. La explicación de nuestro amigo Coco es más bien parca (de tipo: "hola amigos, hoy os explicaré la diferencia entre cerca y lejos") así que te emplazan a que leas algunos papers o mejor te veas 15+ horas de clases de Stanford sobre deep learning y visión artificial:

Si eres relativamente autodidacta y te gusta profundizar, te sentirás como en casa; pero si esperas que te den el material mascado estás en el sitio equivocado (ojo: quizás no exista ningún otro sitio, al menos online).

Las lecciones se imparten desde la web de Udacity mayoritariamente en vídeo. Existe una aplicación móvil pero paradójicamente los nano-degrees no funcionan en la aplicación. Las lecciones son interactivas y hay quizzes constantes para asegurarse de que no pasas sin entenderlo.

Hay tres tipos de ejercicios prácticos:

  1. Quizzes a medida que van dando la lección. Son muy sencillos y suelen consistir en cuestionarios o programas muy sencillos que se auto-evalúan en la propia web (es decir, no hace falta tener nada en tu ordenador para programarlos y probarlos).
  2. Labs — yo los llamaría "prácticas" — son ejercicios no tutelados un poco más complejos en los que te manchas las manos con las técnicas de la lección. Como no son tutelados ni evaluados te dan la solución por si te atascas o quieres ver cómo lo han hecho ellos.
  3. Proyectos con los que te evalúan y que has de terminar satisfactoriamente en una fecha límite para poder finalizar el curso. De estos hablaré en breve.

No hay exámenes y la evaluación es individual, basada en la realización de los proyectos. En este trimestre hay cinco proyectos que hay que superar.

Veredicto: A mi me encanta esta aproximación. Si pudiera pedir algo, pediría incluso más referencias y materiales seleccionados clasificados por el tiempo que les puedas dedicar.

Ecosistema: Los Compañeros, la Biblioteca, etc.

Udacity no es ni una universidad convencional, casi todo es online.

Parte de la experiencia universitaria es la interacción con otros compañeros, quedar con amigos para estudiar (¿en la biblioteca?), prácticas en grupo, el bar, etc. Todo esto no existe online como tal y se suple por el ecosistema de:

  • Canales de Slack: desde geográficos (estudiantes de India, Atlanta, etc.) a específicos sobre discusión de proyectos y ejercicios:
Canales de Slack, desde cohortes de estudiantes a los proyectos del curso

Slack es caótico con tanta gente y hasta que Slack no haga un buen sistema de hilos de conversación la interacción es cacofónica.

La ventaja es que Slack tiene un buen cliente móvil y si usas Slack por otros motivos la fricción de tenerlo abierto es muy pequeña.

  • Foros y materiales de Udacity en Confluence. Otro caos. Por defecto al darte de alta te envían los correos de la actividad así que mejor que te pongas un filtro o te des de baja. Como es una web y además require un login/password especial hay fricción (e.g. no me acuerdo del password) y en la práctica se quedan muchísimas preguntas sin responder.
  • Grupo cerrado de Facebook. Mi favorito. Volumen de mensajes adecuado y Facebook gestiona bien meterlo en tu feed incluso si no te pasas explícitamente por el grupo. La gente suele responder rápido y el sistema de hilos está muy trabajado:
Ejemplo de interacción entre alumnos en Facebook

Desgraciadamente en Udacity han decidido no continuar con el grupo de Facebook. Un error.

Veredicto: Muy mejorable. Al principio había demasiados canales (foros, Confluence, dos Slacks y Facebook) y ahora parece que se van a centrar en Slack.

El Mentor

Nada más empezar el curso te asignan un mentor al que puedes preguntarle lo que quieras.

Mi mentor se llama Henry y está en la costa oeste de EE.UU., a 9 horas de diferencia horaria. No sé a cuantos más alumnos mentoriza Henry, pero mi interacción con él ha sido excelente: resolutivo que es lo importante, y motiva y anima cuando ha de hacerlo.

Interacción con el mentor: "Cuando hagas P3 (el proyecto 3)… ¡volarás!". ¡Toma ya!

Veredicto: Excelente. Quizás dependa de quién te toque, en mi caso he tenido un buen mentor que he usado varias veces y funciona.

Las Empresas

Udacity se centra en formación en áreas calientes donde hay falta de talento y las empresas entran en competencia extrema para reclutar a los mejores. Si esto ya es cierto en general para desarrollo de software, en conducción autónoma e inteligencia artificial la guerra por el top talent es increíble.

Este nano-degree tiene muchos hiring partners, empresas que están activamente buscando talento y colaboran con Udacity:

Algunas de las empresas que buscan ingenieros en conducción autónoma en Udacity

Que haya empresas interesadas se nota en dos cosas:

  1. Las clases y materiales: algunas de las clases las imparten empleados de Uber (Otto), BMW, Google. Tras cada clase puedes puntuar la calidad de las lecciones. Hubo unos profesores de una universidad de EE.UU. que ya no imparten lecciones porque tuvieron mala puntuación por parte de los alumnos (demasiado académicos, en mi opinión).
  2. Foco en contratación. Hay lecciones específicas de cómo hacer entrevistas de trabajo, cartas de presentación, cómo presentar tus proyectos en Github, etc. Incluso puedes activar una opción por la que los hiring partners verán tu progreso y te contactarán si les encajas.
Se activas esta opción, se supone que te contactarán con oportunidades.

Veredicto: Un gran acierto que algunas clases las imparta la industria. No he probado ninguna de las opciones de reclutamiento pero visto el énfasis me parece muy interesante.

Los Proyectos

Pasar o no pasar el trimestre depende exclusivamente de que hayas entregado los 5 proyectos que hay antes de la fecha límite global (más o menos 3 meses después de empezar).

Cada proyecto tiene criterios de aceptación que un revisor usa al evaluar tu entrega. No existen calificaciones más allá de "superado" o "no superado".

El tiempo de revisión es increíblemente rápido, en mi caso siempre ha sido menor de 8 horas, incluso cuando entregué un proyecto un domingo por la mañana hora de España a la hora de comer ya estaba revisado con comentarios exhaustivos incluyendo revisión de código.

Ejemplo de evaluación de entrega con comentarios del revisor.

Si bien las clases son relativamente superficiales es en los proyectos donde realmente aprendes, y vaya si aprendes.

Cada proyecto tiene sus criterios básicos de aceptación e incluyen secciones opcionales que llaman desafíos para ponerte a prueba.

Aquí va un repaso de los proyectos.

P1. Detección de las líneas de la carretera

Dado un vídeo grabado desde dentro de un coche tienes que usar algoritmos de visión artificial para detectar las líneas de los carriles y buscar la ecuación lineal que mejor las aproxime. Éste es el resultado:

En este proyecto aprendes cosas básicas como selección de zonas por umbrales (thresholding), detección de bordes con la técnica Canny, la transformada de Hough, etc. todo hecho Python (todos los proyectos en este trimestre son en Python).

Si bien la versión obligatoria es bastante básica, pasar la versión desafío es más complicado aunque en realidad es simplemente ajustar los parámetros de manera fina. El tweet de arriba es la versión desafío. El ajuste de los parámetros es tan sutil que ni se te ocurriría usar este sistema tal cual en un coche real.

P2. Reconocimiento de señales de tráfico

Te dan fotos de señales de tráfico y tienes que hacer un programa que decida qué tipo de señal es. Es un problema de visión artificial (clasificación) solucionable gracias al deep learning.

Toca implementarlo a pelo con TensorFlow: una librería de computación basada en grafos que se usa mucho para deep learning, aunque estrictamente hablando no es una librería de deep learning.

Ejemplos de señales que hay que reconocer. Algunas no se ven muy bien.

Este proyecto ya es más complicado que P1. Puesto que hay que diseñar una red neuronal y entrenarla desde cero es mejor hacerlo con GPU para que no sea impracticablemente lento. Udacity te da $50 en créditos de Amazon por si quieres hacer este ejercicio con GPU en la nube. Me decidí por instalar Linux en mi ordenador de gaming que tiene buena GPU y así hacer el entrenamiento en local.

Entrenar una red neuronal desde cero te obliga a solucionar muchísimos problemas: que funcione el training durante 12+ horas sin colgarse, usar eficientemente la CPU y GPU, generar imágenes nuevas, balancear histogramas, programar TensorFlow, configurar entorno, buscar de hiper-parámetros óptimos, etc.

Los criterios de aceptación no exigen ningún porcentaje mínimo de precisión, yo obtuve un 97% y estaba tan contento… hasta que probé la red con fotos tomadas por mi mismo por la calle:

A pesar de obtener un 97% de precisión en el conjunto de test, mi red falla con imágenes nuevas. Ahora entiendo por qué tener cantidades ingentes de datos es tan importante en deep learning.

Todos los proyectos de este trimestre tienen esta dosis de choque con la realidad: pasar la versión básica es relativamente fácil, la versión desafío no tanto, y la versión real es — evidentemente — órdenes de magnitud más compleja que las anteriores.

P3. Clonación de Comportamiento

Este proyecto es — con diferencia — el más exigente del nano-degree. Se trata de diseñar una red neuronal usando Keras (una librería de deep learning que a su vez encapsula TensorFlow) y hacer que aprenda a conducir un coche en un video-juego usando como referencia vídeos de cómo conduces, por eso se llama "clonación de comportamiento" (pelos de punta el término).

Grabas cómo conduces en un simulador, diseñas la red, entrenas y pruebas. Parece sencillo pero no lo es. Si sólo le enseñas a conducir por el centro de la carretera en cuanto se desvía un poco la red ya no sabe qué hacer y se sale.

El ciclo de desarrollo en deep learning es algo así: se te ocurre una idea, la implementas muy rápido (minutos o como mucho pocas horas… ¡bendito Python y Keras!)… pero luego tienes que esperar a entrenar la red. Esperar de 8 a 12 horas a que se entrene la red, así que solo puedes hacer 2 ó 3 pruebas al día. Estuve varias semanas con este proyecto, el resultado final (versión normal a un lado y desafío a otro):

Éste es uno de los proyectos con los que más he aprendido nunca y con los que he visto la potencia pero también la dificultad de diseñar y entrenar redes neuronales. Merece la pena hacer el nano-degree sólo por este proyecto.

P4. Detección avanzada de las líneas de la carretera

En este proyecto volvemos al primer problema del nano-degree pero esta vez aplicamos técnicas más avanzadas de detección con el objetivo de detectar las líneas de los carriles, crear una perspectiva sintética como si las viéramos desde arriba (vista de pájaro), buscar ecuación de segundo grado que aproxime las líneas, detectar la distancia del coche al centro de la carretera y medir la curvatura.

En este punto del nano-degree y tras haber hecho P3 este proyecto realmente es mucho más sencillo sobre todo porque el ciclo de pruebas es muy rápido. No se usa deep-learning así que tanto la base matemática como la intuitiva es bastante sencilla. Vídeo junto con P5.

P5. Detección de Vehículos

Dado un vídeo de una carretera con coches, se trata de detectar los coches que hay y marcarlos con una caja o similar como si fuéramos Terminator. La técnica que nos enseñan se llama HOG junto con un clasificador lineal y la verdad es que computacionalmente además de ser muy intensiva no da tan buenos resultados como otras más nuevas.

Tras implementar la detección con HOG y un clasificador lineal y pasar el proyecto probé a usar deep learning y la verdad es que la opción con deep learning se funde al HOG:

Veredicto

Altamente recomendado.

Enhorabuena a Udacity por el nano-degree. Aún quedan flecos por cubrir pero es lo que tiene ser pioneros. :)