A criação de carros autônomos agora é um tópico popular e muitas coisas interessantes estão acontecendo aqui no nível amador.
O curso mais antigo e famoso foi o curso
online da Udacity .
Portanto, em máquinas autônomas, existe uma abordagem muito moderna - a Clonagem Comportamental, cuja essência é que o computador aprende a se comportar como uma pessoa (ao volante), confiando apenas nos dados de entrada e saída gravados. Grosso modo, existe uma base de imagens da câmera e o ângulo de direção correspondente.
Em teoria, tendo treinado uma rede neural nesses dados, podemos deixá-lo dirigir uma máquina.
Essa abordagem é baseada em um
artigo da Nvidia .
Existem muitas implementações feitas principalmente por estudantes da Udacity:
Ainda mais interessante é a aplicação em projetos reais. Por exemplo, o
Donkey Car é controlado por uma
rede neural especialmente treinada.
Uma infosfera tão rica impulsiona diretamente a ação, especialmente porque meu
tanque de robôs atingiu um beco sem saída em seu desenvolvimento desde o
último artigo , e precisava urgentemente de novas idéias. Havia um sonho ousado - passear no parque com seu tanque, o que, em geral, não é pior que um cão doméstico. A questão é pequena - ensinar o tanque a andar na calçada do parque.
Então, o que é uma calçada em termos de computador?
Alguma área na imagem com cores diferentes de outras áreas.
Aconteceu que, nos parques acessíveis a mim, a calçada acabou sendo o objeto mais cinza da foto.
(O mais cinza refere-se à diferença mínima entre os valores RGB). Esta é uma propriedade cinza e será fundamental no reconhecimento do pavimento.
Outro parâmetro importante do cinza é o brilho. As fotos do outono consistem em cinza um pouco menos que completamente, de modo que as diferenças entre a estrada e a calçada são apenas em tons.
Algumas das abordagens mais óbvias são pré-calibrar - posicionar o robô para que a estrada ocupe a maior parte da tela e
- leve brilho médio (no formato HSV)
- ou uma peça RGB média, garantida para ser feita de estrada (nesse caso, será o canto inferior esquerdo).
Tendo estabelecido esses critérios para reconhecer a calçada, percorremos a imagem e obtivemos alguma forma da estrada.
O próximo passo é transformar o local sombrio em ação - siga em frente ou vire à direita ou à esquerda.
Dirigimos em linha reta se a borda direita estiver visível e o ângulo estiver a menos de 45 graus da vertical.
Viramos à esquerda se a borda direita estiver visível e o ângulo se desviar da vertical para baixo.
Vire à direita se não encontrarmos a borda direita.
A borda direita do ponto lúgubre - usar a geometria para resolver esse problema é um tanto sem alegria. Melhor se a mente artificial estiver procurando por padrões de inclinação nesses fragmentos.
É aqui que as redes neurais vêm em socorro.
As fotos originais são lavadas, espremidas e cortadas. Selecionamos reconhecer a calçada cinza e obter máscaras em preto e branco 64x64.
Nós decompomos essas máscaras em 3 grupos - Esquerda, Direita, Reta e treinamos o classificador de rede neural sobre elas.
Coletar e preparar dados é uma tarefa tediosa, que levou alguns meses.
Aqui estão máscaras de amostra:
À esquerda:
À direita:
Em linha reta:
Para trabalhar com uma rede neural, usei o Keras + Tensorflow.
No início, houve uma idéia de retirar a estrutura da rede neural da Nvidia, mas, obviamente, ela foi projetada para várias outras tarefas e não lida muito bem com a classificação. Como resultado, verificou-se que a rede neural mais simples de qualquer tutorial de classificação de várias categorias fornece resultados bastante aceitáveis.
model = Sequential() activation = "relu" model.add(Conv2D(20, 5, padding="same", input_shape=input_shape)) model.add(Activation(activation)) model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2))) model.add(Conv2D(50, 5, padding="same")) model.add(Activation(activation)) model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2))) model.add(Flatten()) model.add(Dense(500)) model.add(Activation(activation)) model.add(Dense(cls_n)) opt = SGD(lr=0.01) model.add(Activation("softmax")) model.compile(loss="categorical_crossentropy", optimizer=opt, metrics=["accuracy"])
Depois de treinar a primeira versão da rede, encontrei sua incompatibilidade com o Raspberry Pi. Antes disso, usei o Tensorflow versão 1.1, usando o xamanismo coletado por
uma pessoa muito inteligente .
Infelizmente, esta versão está desatualizada e não pôde ler os modelos da Keras.
No entanto, recentemente as pessoas do Google finalmente baixaram e coletaram TF sob o Raspberry Pi, embora com a nova versão do Raspbian - Stretch. O alongamento era bom para todos, mas há um ano eu não tinha o OpenCV, então o tanque foi para Jessie.
Agora, sob a pressão da mudança, tive que mudar para o Stretch. O Tensorflow levantou-se sem problemas (apesar de levar várias horas). O OpenCV por um ano também não parou e a versão 4.0 já foi lançada. Então ela conseguiu coletá-lo no Stretch, para que não houvesse obstáculos à migração.
Havia dúvidas sobre como o Raspberry atrairia um monstro como o Tensorflow em tempo real, mas tudo acabou sendo geralmente aceitável - apesar da carga inicial da rede de alguns segundos, a classificação em si pode funcionar várias vezes por segundo sem consumo significativo de memória e CPU.
Como resultado, a maioria dos problemas e erros ocorre precisamente no estágio de reconhecimento da estrada.
A rede neural falha muito raramente, apesar da simplicidade da estrutura.
Com o firmware atualizado, o tanque atravessa o parque.
Devido às lesões sofridas, o robô sopra constantemente para a direita, de modo que, sem inteligência artificial, sai rapidamente para o gramado.
Agora você pode passear com ele de manhã e detectar cães que se aproximam.
Referências: