Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Bêta ON] Introduction à la vision par ordinateur

Dans la catégorie "Général" par nohar

29 octobre 2011 à 11:14:47

Lire le tutoriel
Tuto ouvert aux bêta-tests
Réservé aux membres

  • Partager sur Facebook
  • Partager sur Twitter
29 octobre 2011 à 11:14:47

Bonjour !

Certains d'entre vous se souviendront peut-être qu'il fut un temps, j'avais écrit et publié sur ce site un tutoriel sur la vision par ordinateur avec OpenCV, en C++.

Le contenu de ce tutoriel, commencé à une époque où OpenCV n'en était qu'à sa version 0.9 (?!), est assez rapidement devenu obsolète (en un an) avec la sortie d'OpenCV 1.2 puis 2.0. Il n'était donc plus possible pour moi de maintenir ce cours tel qu'il était, et celui-ci a fini par être dévalidé, et sortir de la zone bêta.

Ceci dit, voici une grande nouvelle : devant le nombre de MP qui m'ont été adressés pour me demander où était passé ce cours, et après plusieurs choix difficiles, j'ai décidé de reprendre mon travail, ou plutôt de le recommencer sur des bases saines.

plan envisagé



Le plan est fait de telle manière qu'il n'est pas nécessaire de suivre (ni d'écrire, d'ailleurs) ce tuto dans un ordre précis et figé une fois passée la première partie. Dans chaque partie, les points listés correspondent plus à des notions que forcément à des chapitres (il sera possible de mettre plusieurs notions dans un seul chapitre ou de prendre plusieurs chapitres pour la même notion). Les points entre parenthèses sont des notions dont j'ignore si elles sont bien nécessaires.

Notions fondamentales


* Qu'est-ce qu'une image ?
* La couleur
* Lire et écrire des flux vidéo

Traitement d'image de base


* Histogrammes, égalisation et étirement
* Filtrage : filtre moyen vs. filtre médian
* Filtrage : convolution et filtre gaussien
* Filtrage : filtre bilinéaire

Détection de contours


* Filtre de Sobel
* Filtre laplacien
* Filtre de Gabor
* Filtre de Canny-Deriche

Apprentissage de fond et détection du mouvement


* Approche naïve : différence entre frames
* Moyenne / Médiane des N dernières frames
* Mélanges de gaussiennes
* Flot optique
(* Histogrammes flous)
(* Fusion avec des algorithmes d'apprentissage)

Suivi de cibles (tracking)


* MeanShift et CAMShift
* Analyse Canonique des Corrélations
* Filtre de Kalman
* Filtrage particulaire

Apprentissage et reconnaissance de formes


* Approches naïves (arbres, etc)
* Réseaux de neurones formels / Perceptron
* Boosting (ADABOOST)
* Boosting en-ligne (lien avec le tracking…)

Calibration et reconstruction 3D


* Géométrie projective
* Calibration
* Géométrie épipolaire
* Stéréovision

Il est probable que plusieurs chapitres et annexes que je n'ai pas cités ici viennent aussi se greffer au tuto, mais ce sont là, en tout cas, le gros des notions que je compte aborder.

Ce tutoriel se voulant d'un niveau avancé, mais néanmoins accessible, je compte sur vous, bêta-lecteurs, pour m'adresser toutes les critiques constructives qui vous sembleront pertinentes, de façon à affiner et améliorer la qualité du cours au fur et à mesure de son écriture.

Sur ce, je vous souhaîte une bonne lecture ! ;)
  • Partager sur Facebook
  • Partager sur Twitter
Zeste de Savoir, le site qui en a dans le citron !
31 octobre 2011 à 9:49:56

Plop.

Vu que le troisième chapitre est quasiment terminé, je compte envoyer le tuto en validation dès demain soir.

De façon à orienter un petit peu les remarques que vous pourriez me faire d'ici là :

Le niveau des explications en C vous convient-t'il ? Y a t'il besoin que je passe plus de temps sur certains détails, notamment le passage d'arguments au programme (chapitre 2), et la représentation des images en mémoire, en particulier la profondeur (chapitre 3) ?

Les explications mathématiques sont-elles assez claires ?

Merci.

Edit : Finalement, les trois premiers chapitres viennent d'être envoyés aux validos. Il est peu probable que j'aie le temps d'en rédiger complètement un quatrième d'ici demain soir, et le chapitre 3 est déjà suffisamment dense pour qu'il y ait de quoi faire. :p
  • Partager sur Facebook
  • Partager sur Twitter
Zeste de Savoir, le site qui en a dans le citron !
1 novembre 2011 à 2:02:18

Plip.

D'abord, bravo pour avoir repris ce tuto surtout en repartant de zéro. C'est un sujet qui m'intéresse au plus haut point ayant un background en tout ce qui est traitement du signal, traitement d'images, traitement audio, machine learning,... Je me ferais un plaisir de relire ton tutoriel. Mais passons au coeur du sujet.

Chapitre 1


Concernant l'installation et plus particulièrement sur Mac :

Citation : nohar

ou bien si vous êtes sous Mac, vous pouvez vous rendre sur cette page, et suivre les indications pas à pas.


Tu donnes ce lien qui renvoie vers une installation pour distributions Linux. Est ce que c'est ce lien que tu voulais mettre ? L'installation n'est (théoriquement) très différente sous MacOS, mais il manque la configuration sous XCode.

Bref, je me suis penché sur une installation sur ma machine, et ça été la croix et la bannière et je n'ai pas vraiment abouti. En gros, il y a deux manières de le faire :
  • En utilisant un framework tout prêt qui s'installe quasi en drag'n'drop et marche nickel, mais qui est encore à la version 2.0 EDIT : et en C++...
  • Pour une version 2.2, il faut installer à la main. J'ai donc suivi l'installation avec CMake conseillé à cette page (Point 2). Je m'y suis repris à 3-4 fois en changeant les options et en cherchant d'autres sources sur l'Internet sans résultats.

Bon, je suis pas là pour que tu me règles mes soucis d'installation. :D
Tout ça pour dire que ça a pas l'air si trivial sous Mac et qu'il serait bon de s'y pencher un moment. Moi je jette l'éponge pour le moment et j'irais coder sur mon boot Linux qui est plus mieux. Mais ça serait pas mal qu'un Zéro réussisse à aller jusqu'au bout de l'install' pour pouvoir donner une procédure d'installation fiable pour la 2.2 (à défaut du framework en 2.0)

Chapitre 2


Citation : nohar

Y a t'il besoin que je passe plus de temps sur certains détails, notamment le passage d'arguments au programme (chapitre 2),

L'explication me semble suffisante. Au pire, rajouter un lien vers un tuto/documentation/... pour ceux qui ne connaissaient pas et voudraient en savoir plus.

Le reste est bien.

Chapitre 3



Représentation formelle : Les explications sont bien. Peut-être un peu plus de schémas ? Je verrais bien un exemple d'image avec des pixels bien visibles en niveau de gris de taille 8x8 avec à côté sa représentation sous forme de matrice. Ça permettrait d'illustrer la matrice qui est bien écrite mais peut paraitre obscure au premier abord.

La structure IplImage :
  • petite faute dans ton schéma sur l'image en zone mémoire. (imageData+ widthStep) devrait plutôt ressembler à (imageData+ n*widthStep) je pense.
  • pour la 'profondeur' des images, pourquoi ne pas montrer que le codage des pixels a une influence sur 'le pas de quantification' des couleurs avec un comparatif en images ?


Parcourir une image : Lena, toujours Lena. ^^ Rien à redire, très bien de faire une même fonction sous 4 angles différents. Juste tu n'expliques pas assert (img->depth == IPL_DEPTH_8U && img->nChannels == 1); ?

Voilà, voilà.
  • Partager sur Facebook
  • Partager sur Twitter
1 novembre 2011 à 2:34:12

Je suis bien occupé ces temps-ci, mais je lirai ce tuto avec plaisir dès que j'en ai l'occasion.
  • Partager sur Facebook
  • Partager sur Twitter
1 novembre 2011 à 9:35:59

Salut,

Tout d'abord, merci Lanfeust 313 pour toutes ces remarques.

Je vais les reprendre dans l'ordre.

Chapitre1



Citation : Lanfeust 313

Bref, je me suis penché sur une installation sur ma machine, et ça été la croix et la bannière et je n'ai pas vraiment abouti. En gros il y a deux manières de le faire :

  • En utilisant un framework tout prêt qui s'installe quasi en drag'n'drop et marche nickel, mais qui est encore à la version 2.0
  • Pour une version 2.2, il faut installer à la main. J'ai donc suivi l'installation avec CMake conseillé à cette page (Point 2). Je m'y suis repris 3-4 fois en changeant les options et en cherchant d'autres sources sur l'Internet sans résultats.


En ce qui concerne ce tutoriel, la version 2.0 d'OpenCV suffit largement pour suivre (l'API C n'a pas bougé depuis). Je vais intégrer ces liens dans le chapitre. (edit : Fait)

Il est probable aussi qu'un jour où je n'aurais pas d'autres priorités sur ce tuto, j'intègrerai une annexe avec des explications détaillées en français. Si des gens sous Windows ou Mac ont réussi leur installation et s'en sentent le courage, leur participation (screenshots, explications) est la bienvenue.

Chapitre 2



Citation : Lanfeust 313

L'explication me semble suffisante. Au pire, rajouter un lien vers un tuto/documentation/... pour ceux qui ne connaissaient pas et voudraient en savoir plus.



OK, ça devrait se trouver. (edit : en effet, fait)

Chapitre 3



Citation : Lanfeust 313

Représentation formelle : Les explications sont bien. Peut-être un peu plus de schémas ? Je verrais bien un exemple d'image avec des pixels bien visibles en niveau de gris de taille 8x8 avec à côté sa représentation sous forme de matrice. Ça permettrait d'illustrer la matrice qui est bien écrite mais peut paraitre obscure au premier abord.



Haha, voilà ma bête noire, les schémas ! Ceci dit c'est pas une mauvaise idée, je vais voir ce que je peux faire (edit: c'est fait).

Citation : Lanfeust 313

La structure IplImage :

  • petite faute dans ton schéma sur l'image en zone mémoire. (imageData+ widthStep) devrait plutôt ressembler à (imageData+ n*widthStep) je pense.
  • pour la 'profondeur' des images, pourquoi ne pas montrer que le codage des pixels a une influence sur 'le pas de quantification' des couleurs avec un comparatif en images ?


Pour le schéma, non, c'est bien le premier pixel de la seconde ligne que je montre avec l'adresse imageData + widthStep (donc n = 1), mais je détaille en-dessous comment généraliser à toutes les lignes.

Pour ce qui est de la profondeur, je préfère personnellement ne pas trop m'appesantir sur le sujet dès ce chapitre (au pire, donner une explication plus détaillée quand il y aura besoin d'utiliser une profondeur plus grande sur une image ou une matrice). Ceci dit il est vrai que tel quel, on comprend mal l'intérêt de représenter des niveaux de gris avec des pas de quantification différents. Je crois que je vais couper la poire en deux en rajoutant une petite explication d'une phrase ou deux (edit : c'est fait aussi).

Citation : Lanfeust 313


Parcourir une image : Lena, toujours Lena. ^^



Héhéhé, on pouvait pas faire de traitement d'image sans raconter son histoire quand même. :p

Citation : Lanfeust 313

Juste tu n'expliques pas assert (img->depth == IPL_DEPTH_8U && img->nChannels == 1); ?



Ah, en effet, j'avais fait l'impasse dessus parce que ça me semblait intuitif, mais là encore, je pense qu'une petite phrase ou un commentaire au-dessus de la ligne en question fera l'affaire. (edit : fait, un peu plus qu'une petite phrase, d'ailleurs)


Edit : voilà, tout a été pris en compte. :)
Merci !
  • Partager sur Facebook
  • Partager sur Twitter
Zeste de Savoir, le site qui en a dans le citron !
5 novembre 2011 à 14:03:44

Parfait, il vient d'être validé, je le lirais dès que j'en aurais le temps ...
  • Partager sur Facebook
  • Partager sur Twitter

🍊 - Étudiant - Codeur en C | Zeste de Savoir apprenez avec une communauté | Articles  - ♡ Copying is an act of love.

6 novembre 2011 à 12:04:05

Le chapitre 4 de la partie 1 sur la couleur vient d'être envoyé à la validation.

Je vais probablement entamer la partie 2 sur les prétraitements et les filtres, avant de revenir un peu plus tard dans la partie 1 pour rajouter les notions de base sur l'acquisition et l'écriture de flux vidéo dans OpenCV.

Edit : Validation express ! Merci au le renard le plus rapide de l'espace.
  • Partager sur Facebook
  • Partager sur Twitter
Zeste de Savoir, le site qui en a dans le citron !
6 novembre 2011 à 17:16:41

Personnellement, j'attends la suite. :p
  • Partager sur Facebook
  • Partager sur Twitter
"If debbugging is the process of removing bugs, then programming must be the process of putting them in." (Edsger Dijkstra)
6 novembre 2011 à 17:35:44

C'est sympa, moi aussi j'attends la suite. Il y a une vrai demande à un tel tuto ...
  • Partager sur Facebook
  • Partager sur Twitter

🍊 - Étudiant - Codeur en C | Zeste de Savoir apprenez avec une communauté | Articles  - ♡ Copying is an act of love.

6 novembre 2011 à 23:22:06

@nohar: Est ce que tu as un plan pour la suite du cours ? Même sans être ultra-précis, ça permettrait d'avoir une vision à plus long terme quand on bêta-relis le cours. Tu peux le laisser dans le premier message et l'updater si besoin est.
  • Partager sur Facebook
  • Partager sur Twitter
10 novembre 2011 à 22:21:47

En fin, ça me fait un grand plaisir de trouver le tuto de retour!
  • Partager sur Facebook
  • Partager sur Twitter
11 novembre 2011 à 13:12:06

Citation : Lanfeust 313

@nohar: Est ce que tu as un plan pour la suite du cours ? Même sans être ultra-précis, ça permettrait d'avoir une vision à plus long terme quand on bêta-relis le cours. Tu peux le laisser dans le premier message et l'updater si besoin est.



Voilà, je viens de mettre à jour le premier post.
  • Partager sur Facebook
  • Partager sur Twitter
Zeste de Savoir, le site qui en a dans le citron !
11 novembre 2011 à 13:13:51

Face à ce cours qui m'intéresse, je posterai ma critique en tant que débutant dans ce domaine.
  • Partager sur Facebook
  • Partager sur Twitter
"If debbugging is the process of removing bugs, then programming must be the process of putting them in." (Edsger Dijkstra)
11 décembre 2011 à 22:25:36

Hello !!!
Déjà respect, le tuto est balaise et le sujet est très intéressent :)

La seul petite remarque que j'ai à faire c'est qu'il serrais cool de voir (dans une annexe ?) les librairies similaires (ou l'intégration d'OpenCV), pour les autres langages (.NET, PHP, etc)
  • Partager sur Facebook
  • Partager sur Twitter
20 décembre 2011 à 11:07:28

je bave dans l'attente de la suite
merci pour ce tuto
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
20 décembre 2011 à 14:30:22

Citation : loleur

Hello !!!
Déjà respect, le tuto est balaise et le sujet est très intéressent :)

La seul petite remarque que j'ai à faire c'est qu'il serrais cool de voir (dans une annexe ?) les librairies similaires (ou l'intégration d'OpenCV), pour les autres langages (.NET, PHP, etc)


Je vois pas du tout comment nohar peut t'expliquer ça. Je fais de l'unrealscript, comment je fais pour appeler OpenCV ? Bah c'est pas nohar qui va le savoir. Tu pratiques un autre langage, à toi de savoir t'en servir pour appeler du code C.
Protip : appeler du code d'une DLL est une approche classique et que tout langage sérieux gère.
  • Partager sur Facebook
  • Partager sur Twitter
20 décembre 2011 à 19:00:24

Faut pas l'agresser non plus, c'est censé ce qu'il dit. Parler de la "concurrence" ou de son utilisation dans un autre langage est utile pour les lecteurs qui ne conaissent pas le langage ou qui n'aiment pas OpenCV, et je ne vois pas pourquoi ça serait au lecteur de se débrouiller, c'est un tuto. Après ça dépends de nohar mais faut pas blâmer une idée qui te semble ridicule.
  • Partager sur Facebook
  • Partager sur Twitter
"If debbugging is the process of removing bugs, then programming must be the process of putting them in." (Edsger Dijkstra)
Anonyme
20 décembre 2011 à 19:06:57

J'ai pas vraiment vu d'agression ni de blâme, juste la réponse au problème.

Histoire d'être plus clair : si tu veux utiliser OpenCV via PHP, le travail à faire est nul côté OpenCV, c'est côté PHP qu'il se fait et par conséquent, avec toute la bonne volonté du monde, on ne peut pas t'expliquer comment faire.
  • Partager sur Facebook
  • Partager sur Twitter
20 décembre 2011 à 22:46:44

Très bon tuto sur un sujet intéressant.
J'attends la suite avec impatience !
Par contre, j'ai un petit problème avec opencv, pour ceux que ça intéresse : http://www.siteduzero.com/forum-83-719 [...] r-opencv.html
  • Partager sur Facebook
  • Partager sur Twitter
20 janvier 2012 à 10:19:36

Bonjour,

Pour information, je vais très prochainement retirer le tuto de la zone bêta, non pas parce que je ne travaille plus dessus (bien au contraire, rassurez-vous !), mais pour attirer votre attention sur la disparition d'un repère indispensable à la rédaction, la validation, la lecture et l'édition des tutoriels : la numérotation des chapitres.

Bien que cela puisse paraître idiot de prime abord, j'en conviens, posez-vous simplement la question : comment un lecteur de tuto en bêta pourrait-il me dire qu'il a relevé une imprécision sur le chapitre 3 de la partie 2, si le "3" n'est plus là ?

Privés de l'unique point de repère qui leur évite de re-compter péniblement les chapitres à la main à la moindre occasion, les (déjà rares) lecteurs de bonne volonté qui commentaient jusqu'à ce jour les tutos en bêta de façon constructive n'ont aujourd'hui plus aucune raison valable de faire cet effort : la nouvelle interface des tutoriels ne les y encourage plus, alors à quoi bon ?

J'en arrive donc au point central de ce message, et la motivation profonde du retrait de mon tutoriel de la bêta : sans point de repère pour communiquer efficacement sur les big-tutos, la zone bêta ne sert plus à rien.

En espérant avoir attiré votre attention sur cet important détail d'ergonomie, sacrifié sur la base de critères esthétiques discutables aux dépens de toutes les personnes qui ont à communiquer ou à travailler d'une façon ou d'une autre sur les tutoriels, je vous suggère de faire entendre votre voix en m'imitant.

PS : En guise de solution à ce problème, dégueulasse certes, mais, je le souhaite, temporaire, je viens de re-soumettre une version du tutoriel inchangée sur le fond, mais sur laquelle, par soucis d'ergonomie envers les lecteurs, j'ai renuméroté les chapitres à la main.

Bonne journée à vous. :)
  • Partager sur Facebook
  • Partager sur Twitter
Zeste de Savoir, le site qui en a dans le citron !
29 janvier 2012 à 15:07:46

Déjà un grand bravo mais je vais être honnête j'ai pas lu le tuto à fond juste survoler. Mais je voudrais te poser une question car je commence à désespérer. Je n'ai aucune connaissance en traitement vidéo et OpencV pour moi c'est tout nouveau. En lisant des trucs à gauche à droite je suis arrivé à sauvegarder les images de ma webcam et donc je voudrais pouvoir en filmant reconnaitre des forme et ne sauvegarder que ces formes sous formes d'image. La question est est ce que tu pourrais me donner des indications sur les connaissances qu'il me faut acquérir des liens, des livres .............. tout ce que quelqu'un ici pense qui pourrait aider.

MERCI
  • Partager sur Facebook
  • Partager sur Twitter
13 mars 2012 à 17:00:39

Je viens de finir la lecture de tout ce que tu as déjà effectué. Je ne l'ai pas encore tester mais ça ne serait tarder. Je suis en effet entrain d'apprendre la lib OpenCV pour effectuer un LAPI (lecture automatisé de plaque d'immatriculation).
Des que je pourrais je vais donc effectuer les histogrammes afin de réussir a lire une plaque malgré les pleins phares d'une voiture.
En regardant ton PLAN je vois que les recherche de forme me serai aussi super utile. Malheureusement je ne peux attendre que tu écrives jusque là pour l'effectuer lol.
J'espère que tu pourras éditer la suite au plus vite. Je suivrais avec attention.

Amicalement,
Fayne.

PS: A quand la suite???
  • Partager sur Facebook
  • Partager sur Twitter
24 avril 2012 à 8:52:30

Bonjour, et un grand merci pour ton tuto, je suis étudiant a ISART et on ce lance demain dans un projet de 3 mois sur la réalité augmente, ton début de tuto ma bien servit a comprendre les bases donc merci et bonne chance pour la suite de ton tuto.
  • Partager sur Facebook
  • Partager sur Twitter
14 mai 2012 à 19:16:40

Un tuto de très bonne qualité :) j'avais suivi l'ancien sans trop comprendre car je débutais en C mais, maintenant que je fais celui-là c'est un vrai plaisir (bien que je zappe certaines parties théoriques que je connais déjà, je teste directement).

Par contre j'aimerais bien savoir si le tuto est toujours en vie ou si tu ne pense plus ajouter de nouveau chapitres :( ce serait vraiment dommage je trouve (bien que compréhensible).

Bonne chance pour la suite et merci pour ce super début de tuto qui aide quand même à bien démarrer :)
  • Partager sur Facebook
  • Partager sur Twitter
26 juillet 2012 à 15:15:48

Merci pour ce tuto trés utile.
Pour Info la release 2.4 est sortie.
  • Partager sur Facebook
  • Partager sur Twitter
15 septembre 2012 à 14:57:04

Salut salut :)
Pouvons-nous attendre une suite à ce tutoriel ?
  • Partager sur Facebook
  • Partager sur Twitter
17 septembre 2012 à 1:24:29

Un tutoriel de très bonne qualité, mais malheusement il s'avance pas!
  • Partager sur Facebook
  • Partager sur Twitter
22 février 2013 à 21:58:45

Dommage qu'il soit incomplet :\
  • Partager sur Facebook
  • Partager sur Twitter
23 février 2013 à 16:32:33

Salut,

C'est vrai que ce tuto est un peu mort en ce moment, et ce pour plusieurs raisons :

  • J'ai de moins en moins de temps à accorder à la rédaction, vie professionnelle oblige,
  • Je travaille aussi sur d'autres tutoriels, dont le tuto officiel Perl, qui, de part son statut officiel, est prioritaire sur celui-ci.
  • Depuis l'arrivée de la v4, on n'a plus aucun outil de rédaction. Je préfère attendre que ceux-ci reviennent pour porter le tuto proprement en Markdown et me remettre au travail.

Un peu de patience, je suis le premier frustré à ne pas pouvoir tenir un rythme plus soutenu !

  • Partager sur Facebook
  • Partager sur Twitter
Zeste de Savoir, le site qui en a dans le citron !