Como ser um engenheiro de carros autônomos (self driving cars)

Ainda não é possível ser um Engenheiro de Carros Autônomos, porque não existem cursos de graduação sobre o assunto. Mas é possível ser um “nano engenheiro” de carros autônomos. E este post é uma análise deste nanodegree.

A plataforma de ensino on-line Udacity (www.udacity.com) oferece um curso “nanodegree” sobre carros autônomos. Hoje, final de 2016, é o primeiro curso no mundo, até onde eu sei.

Udacity.jpg

A Udacity é um plataforma de ensino on-line, fundada por uns caras de altíssimo nível técnico e muito idealistas, como o alemão Sebastian Thrun. Este foi o líder da equipe que venceu o grande desafio de carros autônomos da Darpa em 2005, com o carro Stanley, da Universidade de Stanford (vide post sobre o assunto).

stanley

Thrun foi para o Google, após vencer o grande prêmio. Depois de alguns anos trabalhando no veículo autônomo do Google, Thrun decidiu se dedicar integralmente ao Udacity. Ao invés de construir um carro com sistema fechado, ele acha que pode ser mais útil ensinando milhares de pessoas e construindo um carro open-source. E ele é o cabeça deste nanodegree.


O nanodegree

A Udacity tem alguns cursos gratuitos da área de tecnologia, e outros pagos, com acompanhamento, chamados de “nanodegree”. Comecei a fazer, agora em dezembro de 2016, o nanodegree de “Self Driving Cars”. Isto significa que sou uma das primeiras pessoas do mundo a fazer o curso.

O nanodegree “Self Driving Cars” é dividido em três módulos de três meses cada um.  Cada módulo custa US$ 800,00. Se o dólar estiver a R$ 3,50, dá R$ 2.800,00 para cada módulo, e R$ 8.400,00 para tudo. É caro? Depende. Se der para aprender muitas novas tecnologias, não.
Nota solta: Tive uma certa dificuldade de pagar o curso. Pelo valor ser alto, o cartão de crédito bloqueou. Tive que ligar para o banco, ficar um tempão pendurado com o atendente, provar que eu era eu mesmo, depois provar que eu não era um bandido tentando se passar por mim para me roubar, etc…


Módulos
São três módulos sobre o assunto, da qual somente o primeiro existe ainda.

1: Visão computacional e aprendizagem profunda: visão computacional envolve muito mais do que apenas filmar um imagem ou fazer filtros para mudar cor. Envolve identificar e interpretar objetos, e para tal, deve-se lançar mão de ferramentas de aprendizagem profunda, como redes neurais.

Não se sabe muito sobre os módulos 2 e 3, mas os temas são:

2: Sensores (câmera, radar, lidar, gps), localização e controle.
3: Planejamento da rota e sistemas

O engraçado é que não tem nada de mecânica. Só de eletrônica e computação. Os carros já tem toda a mecânica necessária. O que queremos substituir é justamente a inteligência com o uso da computação.


Motivação

Para mim, em particular, o curso já está valendo muito, muito a pena.
Olha o que fiz, na primeira semana do curso. Um projetinho para identificar, através de visão computacional, as linhas da estrada.

Imagem original:
solidWhiteRight.jpg
Desenho da linha através de processamento computacional (linha branca mais espessa):

laneModified.jpg

Fiz até um videozinho demonstrando o método, no link a seguir.

Legal, não?

Agora, um exemplo brasileiro. Av. Hélio Pelegrino, em São Paulo:

frameteste
Original
framelane
Com algoritmo de linhas

Vídeo com o método de identificação de linhas. Não ficou muito bom, mas a pessoa que fez o vídeo (eu) também não sabe filmar direito.


O Background necessário.

Agora, vamos colocar os pés de volta no chão: o curso é num nível bem alto. Por isso, é necessário ter um excelente background técnico. Dá para fazer o projeto acima em uma semana, mas só se o aluno tiver bons pré-requisitos antes. Preferencialmente, é bom ser da área de Exatas, alguma engenharia hard.

Tive um mês e pouco entre a inscrição e o início efetivo do curso. E, como um bom brasileiro descendente de japonês, comecei a estudar o conteúdo do curso antes mesmo dele começar.

Listo a seguir algumas tecnologias utilizadas neste curso.


Linux

Cheguei à conclusão de que era melhor ignorar o Windows para fazer este curso. Isto porque há alguns pacotes de Redes Neurais profundas que só rodam no Linux, ou rodam melhor no Linux (é mais testado, com mais usuários, mais help se der pau). Instalei o Linux Ubuntu. E na verdade, passei a ser um grande fã do Linux. Tem tudo o que é necessário para fazer excelentes trabalhos.

logo-ubuntu_st_no®-orange-hex.png

A única coisa ruim do Linux é que não tem o MS Excel. Até dá para usar o Open Office Calc, mas tenho centenas de milhares de linhas de código legado no Excel, além do que o Excel é onipresente no mundo corporativo.


Programação
A linguagem de programação utilizada é o Python (https://www.python.org) . O python se tornou a língua franca da área de deep learning e computação científica em geral, pela sua facilidade de uso e facilidade de extensão com outras ferramentas.

Python_logo.png

Eu não sabia Python, nem um pouco. Mas já fiz vários programinhas em VBA, Javascript, Java. Meu mestrado foi escrito em Matlab. Sou especialista na linguagem de otimização Aimms. Quando a gente lida com algumas linguagens, fica muito fácil pegar as manhas de outras. E, mesmo assim, fiquei umas duas semanas estudando python e continuo estudando.

python-tour-5-728.jpg


Numpy, Scypi, Pandas, Matplotlib e outros módulos

A grande vantagem do Python é que tem uma sintaxe muito simples, e consegue incorporar facilmente módulos especialistas.

python_sci_pack_ing.png

O numpy e scypi (https://www.scipy.org/) são módulos de computação científica. Eles fazem com que o Python tenha uma notação parecida com o Matlab ou o Octave, e uma performance semelhante. A performance é possível porque o Python é quase como um front end, chamando em background bibliotecas escritas de forma altamente otimizada. Por isso, vira e mexe é necessário instalar algum módulo para fazer algo específico, digamos carregar arquivos (pandas) ou plotar algum gráfico (matplotlib).

O Jupyter Notebook (http://jupyter.org/) é como se fosse uma página da internet que tem alguns trechos de código python rodáveis. Fica bastante didático por ter a interface web, e bastante poderoso por ter todo o código rodável por entre ele.

ipy-notebook-spectral.png


OpenCV

De acordo com a própria filosofia do Sebastian Thrun, de que o software tem que se virar com o hardware que existe, há uma forte dependência de Visão Computacional: interpretar o vídeo, da mesma forma que interpretamos que numa cena, há uma estrada, há carros, há alguém querendo atravessar a rua.

OpenCV_Logo.png

Para tal, há um pacote computacional opensource chamado OpenCV (Open Computer Vision http://opencv.org/). Ele tem dezenas de algoritmos de processamento digital de imagens, para usos diversos. Baixei e instalei o PpenCV. Só que não foi um processo muito simples, tive que instalar um monte de outras coisas, deu pau, etc. Mas no final, deu certo.

Exemplo de aplicação do OpenCV: identificar rostos computacionalmente:

faceDetection.png


Keras, TensorFlow, Cuda

Redes neurais artificiais são algoritmos inspirados no funcionamento dos neurônios do cérebro. Cada neurônio recebe um ou mais inputs, multiplica por um peso, e aplica uma função de ativação, gerando um resultado. Este resultado pode passar para um ou mais neurônios da rede.

neural_net2.jpeg

Há 10 anos atrás, quando fiz a cadeira de Redes Neurais na Federal do Rio de Janeiro, isto tinha pouca aplicação de verdade. O state of the art eram umas redes neurais de 3 camadas, que faziam coisas simples, tão simples que poderiam ser feitas de outros modos.

A área de Redes Neurais deu um salto gigantesco em poucos anos. Aliando a evolução computacional do hardware com novas técnicas de treinamento das redes, e ao processamento maciçamento paralelo em GPU, hoje é possível ter redes neurais profundas, de mais de 100 camadas, com alguns milhares de neurônios, contra as redes neurais rasas do passado.

neuron.jpg

Para efeito de comparação, estima-se que  cérebro humano tenha 100 bilhões de neurônios, que podem gerar uma quantidade infinitamente absurda de conexões… e todo este aparato entre nossas orelhas pesa menos de 1 quilo e meio, e gasta alguns watts de energia. É impressionante.

neurons51.jpg

Não necessariamento o maior número de camadas é melhor. Depende da aplicação. Mas cada camada é como se fosse um nível de abstração a mais. E, para coisas complexas, como ensinar o computador a identificar uma placa de trânsito no meio de um monte de outros fatores, podem ser necessárias muitas camadas da rede neural.

Para ter uma ideia do quão recente é este avanço, o Tensor Flow (pacote computacional de Machine Learning do Google – https://www.tensorflow.org/) foi liberado para o público em nov/2015. Estamos em dez/2016, somente um ano depois.

tensor-flow_opengraph_h.png

O Keras (https://keras.io/) é um wrapper, algo de nível mais alto que utiliza o Theano ou o Tensor Flow por debaixo dos panos: facilita a utilização para os casos mais comuns, sem perder o poder computacional.

keras.png

Um dos truques que diferenciam pacotes como o TensorFlow de um suplemento de redes neurais comum é a capacidade de utilizar o poder do processamento de GPUs.

GPUs são unidades gráficas de processamento, feitas para serem extremamente eficientes no tratamento de imagens. É um mini super computador à disposição. Muito desta evolução foi devida aos vídeo-games, que passaram a exigir mais e mais velocidade, mais realismo, portanto mais pixels a serem processados, maior capacidade de processamento.

GPU.jpg


Matemática

Como não poderia deixar de ser, as ferramentas de processamento de sinais têm muito embasamento teórico na Rainha das Ciências: Cálculo, Álgebra Linear, Otimização. É bom relembrar um pouco desses conceitos.

maths-differential-equations.png


Conclusões

Como foi apresentado, é necessário ter uma série de pré-requisitos para fazer bem o nanodegree.

Não é necessário ter um conhecimento profundo em cada um dos tópicos apresentados. Até porque, como o curso é curto, só são utilizados alguns tópicos que interessam. Mas, para aproveitar bem o conhecimento apresentado, é legal ter uma boa ideia do que são essas ferramentas, de como trabalhar com cada módulo, pelo menos um conhecimento teórico introdutório. Ajuda muito ter um bom background em matemática e programação.

Como toda nova tecnologia, algumas dessas ferramentas podem evoluir bastante, enquanto outras vão morrer.

Imagino que o desenvolvimento dos self-driving cars siga uma clássica curva de inovação.

400px-Gartner_Hype_Cycle.png

No início, muita euforia: vão conquistar o mundo, gerar milhões de motoristas desempregados, etc. Depois do auge, vem a decepção: o negócio não é tão bom assim, não serve para nada. Após isto, a consolidação e uma visão mais real: para alguns nichos isto servirá muito bem, para outros não, não vai tomar todos os empregos do mundo, etc…

De qualquer forma, no meu caso está valendo bastante a pena fazer este curso, por estar em contato com essas novas tecnologias e por estar entendendo o que há de mais avançado no mundo da ciência da computação.

Arnaldo Gunzi

Dez 2016


Agradecimento

Agradecimento especial ao amigo Marcos Melo, por ter me indicado a plataforma Udacity. Ele é mesmo que me presenteou com uma impressora 3D. Dica: quando encontrar uma pessoa de alto nível intelectual, cole nele, porque já diziam os antigos gregos: “diga-me com quem andas, e eu direi que és”.


Links
Plataforma de ensino online:
http://www.udacity.com

Python:
https://www.python.org/
https://www.scipy.org/
http://jupyter.org/

Visão computacional:
http://opencv.org/

Redes Neurais:
https://www.tensorflow.org/
http://deeplearning.net/software/theano/
https://keras.io/

GPU

https://developer.nvidia.com/cuda-gpus

6 comentários sobre “Como ser um engenheiro de carros autônomos (self driving cars)

    1. Olá Raphael. Estou no primeiro modulo, que vai ate abril. É um curso de alto nível, muito bom. Mas tem que ter no mínimo uma boa noção dos conceitos do post. Não adianta entrar de curioso, se não tiver o background. Voce pode ir fazendo cursos da udacity, como o de visao computational e python.

      Curtir

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s