Hola,
Bon, globalement je sais même pas si c'est faisable.
En gros, l'idée serait de pouvoir reconstituer virtuellement un environnement a partir de deux images.
En tant qu'humain, on voit en 3d parce qu'on a deux yeux, je voulait savoir si c'était codable de recréer pour un robot (ou autre) a peu près une visualisation 3D a partir de deux photos (ou plus) prises par deux caméra, un peu comme des yeux humains.
Ce qui m'intéresse, et la ou mes compétences en programmations sont très largement limités, c'est comment faire, et je n'ai aucune idée de même savoir ou commencer...
Bref, de l'aide ne serait pas de refus !
a partir de juste deux images ca va etre difficile. mais oui c'est faisable. c'est de la reconstruction de scene 3d a partir d'image 2d. typiquement c'est fait a partir de video et pas juste a partir de deux images unique.
Bonjour,
C'est possible, dans une certaine mesure ; c'etait d'ailleurs un projet d'etude durant mes annees de cycle ingenieur en imagerie et traitement du signal.
Tu vas generalement commencer par une approche de type segmentation, par contours actifs ou similaire á base de minimisation de critere energetique. Tu combines avec tout ce que tu peux, comme par exemple des filtres 2D (convolution dans l'espace rgb pour le gradient de couleur pour trouver des contours, la profondeur n'etant pas initialement disponible) pour faire emerger un certain nombre de points caracteristiques ; c-a-d des points qui presentent un interet dans la topologie des images (coins d'objets ou murs, surtout). Ces points 2D sont le premier resultat intermediare utile.
Ensuite tu as une phase d'appariement, oú tu essayes de creer des paires entre les points des deux images (et eventuellement les contours actifs directement). Chaque paire represente un point caracteristique selon des points de vue differents. Ces paires vont servir a estimer la deformation de projection subit par les differentes zones de la scene entre les deux clichés. La difficulté etant que certains points d'une image peuvent devenir masqués sur l'autre... Il faut donc mettre en place une forme de metrique pour mesurer la pertinence d'une paire, et eliminer les donnees peu interessantes ou incompletes. Ces paires constituent le deuxieme resultat intermediaire utile.
En connaissant les caracteristiques de l'appareil et lentilles qui ont servi á prendre les photos, et les distances parcourues par les paires entre les images, on peut alors calculer la profondeur du point caracteristique associé en retro-projetant chaque paire en un point 3D. Tu obtiens un nuage de points 3D, et qq infos de topologie. Cela constitue le troisieme resultat intermediaire utile.
Mais ce n'est pas encore fini, car á ce stade tu n'as qu'un nuage de points 3D. Il faut donc recreer la connectivité et les surfaces en essayant de respecter la topo des images sources. C'est un probleme assez compliqué qui n'a pas de solution facile elegante, et qu'on retrouve dans les scanners 3D. Il faut generalement re-trianguler derriere (tesselation + Delaunay, etc.) pour ameliorer (ou pas...) la consistance de la scene. En sortie, tu obtiens le maillage de la scene 3D.
Reste a fignoler en mettant les textures des images initiales, etc. Mais globalement c'est le principe sur la partie "traitement". Certaines images sont bcp plus compliquees que d'autres (elements masqués, etc.). Il faut commencer par un cas simple (une piece vide avec juste un canapé basique par exemple) et retoucher les resultats a chaque etape pour etalonner les algos.
Il faut etre á l'aise avec pas mal de choses, notamment bcp d'outils conceptuels mathematiques, et bien comprendre la geometrie projective. Donc je dirais que c'est abordable á bac+3/bac+4, pas avant.
(les resultats sont effectivement bien meilleurs á partir d'une video, car avec plus de donnees on peut se permettre d'etre plus aggressif dans la selection des points caracteristiques pour ne garder que ceux qui sont vraiment pertinents. De plus la difference entre deux images consecutives a 24 ou 30 fps est faible, donc la phase d'appariement est facilitée et plus precise)
Note que de nos jours, il y a pas mal d'approche qui bourrine le probleme a coup de deep learning. Comme on a de bon moteur 3D, c'est relativement facil de pomper une quantite infini d'instance du probleme dans un modele profond, et du fait de reconstruire les scenes assez correctement.
Les approches soa font des trucs entre ce que raconte refeuh et du bourrinage a base de DL.
Tout a fait ! Cela dit vu qu'il est aussi question de robotique, je ne sais pas si l'approche deep learning est tres viable pour de l'embarqué, vu la quantite de ressources necessaires :-?
Le 22 janvier 2020 à 09:42:57 Refeuh a écrit :
Tout a fait ! Cela dit vu qu'il est aussi question de robotique, je ne sais pas si l'approche deep learning est tres viable pour de l'embarqué, vu la quantite de ressources necessaires :-?
Le deep learn n'est pas lourd en soit, c'est l'apprentissage de ton réseau qui l'est.
Et cet apprentissage peut très bien être fait ailleurs que sur ton robot, à l'aide de machines plus performante.
Même si dans tous les cas, c'est pas parce que c'est de l'embarqué que tu ne peut pas mettre 4 cartes graphiques à 800 euros + 5 i7, ça dépend uniquement de la taille de ton robot et de son modèle de conception
oui, c'est l'apprentissage qui coute cher, oas l'inference. L'apprentissage peut etre fait offline et d'habitude dans des environment simule.
Tu peux probablement faire l'inference sur un gpu embarque comme un tx2 de nvidia. Et ca c'est de l'ordre de 7W. Donc ca passe sur la plupart des systemes.
dans les voiture de tesla, le plan etait soit d'avoir la version pas cher qui etait une tx2. ou pour la version "self driving" 2tx2 et 2 gp100. une gp100 pompe de l'ordre de 200w. donc le systeme entier c'est en gros 450w. Mais tu es dans une voiture donc 450w, ca va.
A l'extreme, j'avais travaille avec un mec paye par un grant de l'air force. Et la reponse a ce genre de question etait: "le truc vole a mach 3, on va arriver a monter un cluster dedans.".
Le 21 janvier 2020 à 23:07:52 Refeuh a écrit :
Bonjour,C'est possible, dans une certaine mesure ; c'etait d'ailleurs un projet d'etude durant mes annees de cycle ingenieur en imagerie et traitement du signal.
Tu vas generalement commencer par une approche de type segmentation, par contours actifs ou similaire á base de minimisation de critere energetique. Tu combines avec tout ce que tu peux, comme par exemple des filtres 2D (convolution dans l'espace rgb pour le gradient de couleur pour trouver des contours, la profondeur n'etant pas initialement disponible) pour faire emerger un certain nombre de points caracteristiques ; c-a-d des points qui presentent un interet dans la topologie des images (coins d'objets ou murs, surtout). Ces points 2D sont le premier resultat intermediare utile.
Ensuite tu as une phase d'appariement, oú tu essayes de creer des paires entre les points des deux images (et eventuellement les contours actifs directement). Chaque paire represente un point caracteristique selon des points de vue differents. Ces paires vont servir a estimer la deformation de projection subit par les differentes zones de la scene entre les deux clichés. La difficulté etant que certains points d'une image peuvent devenir masqués sur l'autre... Il faut donc mettre en place une forme de metrique pour mesurer la pertinence d'une paire, et eliminer les donnees peu interessantes ou incompletes. Ces paires constituent le deuxieme resultat intermediaire utile.
En connaissant les caracteristiques de l'appareil et lentilles qui ont servi á prendre les photos, et les distances parcourues par les paires entre les images, on peut alors calculer la profondeur du point caracteristique associé en retro-projetant chaque paire en un point 3D. Tu obtiens un nuage de points 3D, et qq infos de topologie. Cela constitue le troisieme resultat intermediaire utile.
Mais ce n'est pas encore fini, car á ce stade tu n'as qu'un nuage de points 3D. Il faut donc recreer la connectivité et les surfaces en essayant de respecter la topo des images sources. C'est un probleme assez compliqué qui n'a pas de solution facile elegante, et qu'on retrouve dans les scanners 3D. Il faut generalement re-trianguler derriere (tesselation + Delaunay, etc.) pour ameliorer (ou pas...) la consistance de la scene. En sortie, tu obtiens le maillage de la scene 3D.
Reste a fignoler en mettant les textures des images initiales, etc. Mais globalement c'est le principe sur la partie "traitement". Certaines images sont bcp plus compliquees que d'autres (elements masqués, etc.). Il faut commencer par un cas simple (une piece vide avec juste un canapé basique par exemple) et retoucher les resultats a chaque etape pour etalonner les algos.
Il faut etre á l'aise avec pas mal de choses, notamment bcp d'outils conceptuels mathematiques, et bien comprendre la geometrie projective. Donc je dirais que c'est abordable á bac+3/bac+4, pas avant.
SURF/SIFT + ransac + homographie etc c'est vraiment s'il y a pas d'autres choix, ou alors pour apprendre,
mais si la finalite est le produit fini, y a plus rapide, robuste et simple
tu peux juste prendre un checkerboard et faire une calibration de camera
tu peux utiliser des librairies qui font ca tres facilement comme vuforia par exemple
tu peux aussi prendre une camera RGB-D (D pour depth) comme ce qu'a kinect
utiliser du deeplearning ici me semble overkill
deeplearning ce serait plutot essayer d'inferer de la 3d a partir d'une image seul sans checkerboard ni rien d'autre