La création de voitures autonomes est maintenant un sujet populaire et beaucoup de choses intéressantes se produisent ici au niveau amateur.
Le cours le plus ancien et le plus célèbre était un
diplôme en ligne de Udacity .
Ainsi, dans les machines autonomes, il existe une approche très à la mode - le clonage comportemental, dont l'essence est que l'ordinateur apprend à se comporter comme une personne (au volant), en ne s'appuyant que sur des données d'entrée et de sortie enregistrées. En gros, il y a une base d'images de la caméra et l'angle de braquage correspondant.
En théorie, après avoir formé un réseau neuronal sur ces données, nous pouvons le laisser piloter une machine.
Cette approche est basée sur un
article de Nvidia .
Il existe de nombreuses implémentations réalisées principalement par des étudiants d'Udacity:
Encore plus intéressante est l'application dans des projets réels. Par exemple, la
Donkey Car est contrôlée par un
réseau neuronal spécialement formé.
Une telle infosphère saturée pousse directement l'action, d'autant plus que mon
réservoir de robot a atteint une impasse dans son développement depuis le
dernier article , et qu'il avait un besoin urgent de nouvelles idées. Il y avait un rêve audacieux - se promener dans le parc avec son réservoir, qui, en général, n'est pas pire qu'un chien domestique. Le point est petit - apprendre au char à rouler sur le trottoir du parc.
Alors, qu'est-ce qu'un trottoir en termes d'ordinateur?
Une zone de l'image de couleur différente des autres zones.
Il se trouve que dans les parcs accessibles à moi, le trottoir s'est avéré être l'objet le plus gris de l'image.
(Le plus gris fait référence à la différence minimale entre les valeurs RVB). Il s'agit d'une propriété grise qui jouera un rôle clé dans la reconnaissance des chaussées.
Un autre paramètre important du gris est la luminosité. Les photos d'automne sont en gris un peu moins que complètement, de sorte que les différences entre la route et le trottoir ne sont que dans les tons.
Quelques-unes des approches les plus évidentes consistent à pré-calibrer - positionner le robot de sorte que la route occupe la majeure partie de l'écran et
- prendre la luminosité moyenne (au format HSV)
- ou une pièce RVB moyenne, garantie en route (auquel cas ce sera le coin inférieur gauche).
Après avoir établi de tels critères pour reconnaître le trottoir, nous parcourons l'image et obtenons une forme de route.
L'étape suivante consiste à transformer la tache luride en action - allez tout droit ou tournez à droite ou à gauche.
Nous roulons tout droit si le bord droit est visible et l'angle est à moins de 45 degrés de la verticale.
Nous tournons à gauche si le bord droit est visible et l'angle s'écarte de la verticale vers le bas.
Tournez à droite si nous ne voyons pas le bord droit.
Le bord droit de la tache luride - utiliser la géométrie pour résoudre ce problème est plutôt sans joie. Mieux si l'esprit artificiel recherche des modèles d'inclinaison dans ces morceaux.
C'est là que les réseaux de neurones viennent à la rescousse.
Les photos originales sont délavées, pressées et recadrées, nous sélectionnons reconnaître le trottoir gris et obtenir des masques noir et blanc 64x64.
Nous décomposons ces masques en 3 groupes - Gauche, Droite, Droit et formons le classificateur de réseau neuronal sur eux.
La collecte et la préparation des données est une tâche fastidieuse, il a fallu quelques mois.
Voici des exemples de masques:
A gauche:
À droite:
Droit:
Pour travailler avec un réseau de neurones, j'ai utilisé Keras + Tensorflow.
Au début, il y avait une idée de prendre la structure du réseau neuronal de Nvidia, mais, évidemment, il est conçu pour plusieurs autres tâches et ne gère pas très bien la classification. En conséquence, il s'est avéré que le réseau neuronal le plus simple de tout tutoriel de classification multi-catégories donne des résultats tout à fait acceptables.
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"])
Ayant formé la première version du réseau, je suis tombé sur son incompatibilité avec le Raspberry Pi. Avant cela, j'ai utilisé Tensorflow version 1.1, en utilisant le chamanisme collecté par
une personne très intelligente .
Malheureusement, cette version est obsolète et n'a pas pu lire les modèles de Keras.
Cependant, récemment, des gens de Google sont finalement descendus et ont collecté TF sous le Raspberry Pi, bien que sous la nouvelle version de Raspbian - Stretch. Stretch était bon pour tout le monde, mais il y a un an, je n'avais pas OpenCV pour ça, alors le tank est allé à Jessie.
Maintenant, sous la pression du changement, j'ai dû passer à Stretch. Tensorflow s'est levé sans problème (même si cela a pris plusieurs heures). OpenCV depuis un an ne s'est pas non plus arrêté et la version 4.0 est déjà sortie. Elle a donc réussi à le collecter sous Stretch, afin qu'il n'y ait pas d'obstacles à la migration.
Il y avait des doutes sur la façon dont Raspberry tirerait un monstre tel que Tensorflow en temps réel, mais tout s'est avéré généralement acceptable - malgré la charge réseau initiale d'environ quelques secondes, la classification elle-même peut fonctionner plusieurs fois par seconde sans mémoire et consommation de CPU importantes.
En conséquence, la plupart des problèmes et des erreurs surviennent précisément au stade de la reconnaissance de la route.
Le réseau neuronal manque très rarement, malgré la simplicité de la structure.
Avec un firmware mis à jour, le réservoir traverse le parc.
En raison des blessures subies, le robot souffle constamment vers la droite, de sorte que sans intelligence artificielle, il part rapidement pour la pelouse.
Vous pouvez maintenant le promener le matin et détecter les chiens venant en sens inverse.
Références: