Faire du Haar training pour OpenCV

Bonjour,

Je me tourne vers vous car j’ai remarqué en autre, antalgeek, un membre bien actif sur ce forum s’était lancé dans le fait de faire ses propres modèles pour les utiliser par la suite avec OpenCV.

J’ai bien trouvé son post ici mais datant d’une bonne année, j’en crée un nouveau car il faut surtout reprendre à zéro avec moi…

Voila ma situation est que je débute sur Linux, je tourne avec Ubuntu 8.10 en live (oui je sais qu’à chaque fois que j’éteindrais mon pc je perdrai toutes les modifications), mais je programme sous XP (non me tabassez pas…). Je me lance avec Linux pour la réalisation de fichier XML de mes objets suivant le tutoriel de antalgeek(et puis faut bien commencer un jour).

Mon problème commence déjà avec le fait que je ne sais pas comment installé OpenCV 1.0 sous Linux! On m’a parlé du gestionnaire de paquets mais je vois pas grand chose dedans…Avant je voulais installé une archive télécharger sur SourceForge mais on m’a dit que les paquets étaient beaucoup mieux pour les dépendances! Après les autres problèmes seront au fur et à mesure de l’avancement de la réalisation des modèles je pense…

Ma première question pour être concret : Comment installer OpenCV sous Ubuntu 8.10 ?

Je vous remercie par avance pour votre aide et pour combler mes lacunes de Linux!

Salut

Déjà je te conseillerais d’installer ta distrib plutôt que tourner sur un live cd. Un haartraining dure souvent 10 jours, on passe son temps à recommencer, à bricoler. Avec un live cd tu vas vraiment te faire chier.

Ensuite openCV est très certainement présente sous Ubuntu donc tu peux installer leur paquet : libcv, libcvaux, libhigui plus les -dev qui vont avec. Si ça ce trouve les ubunteros ont déjà intégré la version 1.1.0 ce qui n’est pas le cas chez debian.

Pour debian tu peux utiliser mon dépôt perso

ou

Sur les 2 tu trouveras la version 1.1.0, franchement je te la conseille par rapport à la 1.0.0, notamment pour la doc (paquet opencv-doc).
La différence entre la version etch (1.1.0-2) et la version lenny (1.1.0-3) est que lenny prend en charge openmp qui permet de paralléliser le haartraining et de gagner beaucoup de temps.

Ensuite tu te lances, j’ai fait un tutoriel sur deb-indus.org qui pourra t’aider et dans lequel tu trouveras les images permettant de te faire ton répertoire negative/
En général les gens qui l’utilisent ne me disent pas qu’il est tout pourri.

Je crois que j’ai fait le tour, si ça coince tiens moi au jus.

[quote=“romvaillant”]Bonjour,

[/quote]

bienvenue à toi mais sois gentil de respecter le français sur ce forum et d’écrire un titre plus en accord avec notre langue, merci !

Tu ne laisses rien passer ricardo.
Il est vrai que ces derniers temps on a vu pas mal de “loleux kevin amateurs de poneys”.

En fin de compte j’ai fait une clé usb bootable avec un live persistent…
C’est un peu plus rapide que le cd live et comme ça j’enregistre mes modifications!

Pour trouver openCV dans le gestionnaire de paquets j’ai du changer les dépôts (ça peut paraitre évident pour certain mais il m’a fallu plusieurs topic de lecture avant de trouver…). Donc j’ai au final réussit à l’installer grâce à Synaptic. Je ne sais pas quelle version j’ai installée mais je ne pense pas (et j’espère un peu) que cela ne change pas grand chose dans la création de modèle.

Maintenant j’ai crée mes images positives pour mon objet. Et j’ai ensuite lancer le script PERL createtestsample d’après ton tutoriel (super ton tuto en passant, simple et très facile à suivre).
J’ai ensuite créé mon gros vecteur.
J’ai une question; c’est normal que lorsque je visualise les images du vecteur je les voit tout flou ? Il y en a même certains qui sont presque invisible (car tout blanc ou tout noir). Mon objet est en fait une flèche (je pense qu’il va falloir que je l’améliore) pour après se diriger tout seul en fonction de celles-ci (c’est pour un projet donc l’utilité n’est pas forcément au rendez vous mais c’est pour apprendre à allier informatique et électronique!)

Sinon là je suis à la création du Haar Classifier (au stage 4).

Faut que je vois à la fin du résultat! Dans ton tuto tu dis qu’il faut modifié les options w et h, mais comment savoir comment les modifier pour optimiser la reconnaissance?

Je dit un grand merci en tout cas, car sans ton tuto je n’aurais rien pu faire!

C’est toi qui es passé sur developpez.com pour les flèches ?
Je ne sais pas comment se présentent tes images positives mais as-tu pensé à une détection par template matching (pardon ricardo, reconnaissance de modèle) ? C’est moins l’usine à gaz que l’algo de haar.

Pour w et h, il faut les adapter aux dimensions de tes positifs, qui j’espère sont tous de la même taille.
Attention j’ai eu des soucis avec des images de plus de 50x50, l’apprentissage s’arrêtait au bout de quelques stages car il bouffait toute la ram (2Go) et manifestement le bouzin n’aime pas swapper.

Essaie, si tu le peux, de pousser le calcul jusqu’au niveau 20, tu pourras ensuite générer des xml de différents niveaux et ainsi comparer les résultats.

Non ce n’est pas moi… Je suis également inscrit sur Developpez mais je possède le même pseudo…
En revanche j’y suis passé pour interfacer Netbeans (donc programmation Java) à OpenCV!

Oui toutes mes images positives sont de même taille. Voici une flèche(celle ci n’est pas définitive car c’est pour tester si j’arrive à faire le haar training):
hiboox.com/go/pictures/compu … d.jpg.html
Je pense que les bordures sont trop fines (peut-être la remplir en la coloriant) et qu’il soit préférable qu’elle soit moins large…

template matching ?? Pas du tout et c’est la première fois que j’entends cela! Vu l’heure je vais me renseigner demain (et encore avec une journée de cours de 8h 19h je sais pas si j’aurais envie!).

Sinon pour le moment je suis au stage 16, et il me reste 75% de ma ram donc j’ai le temps avant de voir la saturation!
Comment pousser le calcul jusqu’à 20 niveau?

opencv-haartraining -data trainout -vec training.vec -bg negative.txt -nstages 30 -mem 200 -mode ALL -w 20 -h 20 Avec ce code il va jusqu’à 30 stages?

[quote=“romvaillant”]
Comment pousser le calcul jusqu’à 20 niveau?

C’est tout bon. Tu pourras l’arrêter plus tôt si ça te gonfle.

Bon le calcul s’est bloqué au bout de 19 stages… Après une journée d’attente j’ai arrêté le calcul car il ne faisait apparemment rien (pourtant il prenait 100% de mes 2 cœurs).
Ça marche bien!! Il faut bien évidemment que je l’améliore…Mais dans l’ensemble le résultat est correct! Comme amélioration je pense supprimer la marge blanche autour de la flèche pour que les bords de la flèches collent les bordures de l’image, Faire les traits en noir au lieu de rouge, et épaissir les contours. Qu’en penses tu ?

Maintenant j’ai une autre question, toujours sur OpenCV! Comment utiliser plusieurs modèles?Si je crée un autre objet OpenCV et que je réécris toutes les fonctions il ne détectera que mon deuxième modèle…Le problème se situe au niveau de la fonction cascade:C’est à dire que si je l’utilise deux fois dans le style de

opencv1.cascade(...); opencv2.cascade(...);
Il reconnait et détecte uniquement le deuxième modèle malgré le fait que je fasse

Rectangle[] formes1 = opencv1.detect(); Rectangle[] formes2 = opencv2.detect();

Dans mon cas je vais créer le fichier XML de ma flèche mais dans l’autre sens, donc je voudrais utiliser le modèle de ma flèche gauche et de la flèche droite.

[quote=“romvaillant”]Bon le calcul s’est bloqué au bout de 19 stages… Après une journée d’attente j’ai arrêté le calcul car il ne faisait apparemment rien (pourtant il prenait 100% de mes 2 cœurs).
Ça marche bien!! Il faut bien évidemment que je l’améliore…Mais dans l’ensemble le résultat est correct! Comme amélioration je pense supprimer la marge blanche autour de la flèche pour que les bords de la flèches collent les bordures de l’image, Faire les traits en noir au lieu de rouge, et épaissir les contours. Qu’en penses tu ?[/quote]
Bah parfois je suis resté 2 jours sur un niveau…
Maintenant je m’arrête à des images de 50x50 ou 30x70 en N&B sinon c’est effectivement un peu long.
Tu peux jouer avec tes images positives en effet. Déjà les passer en N&B et réduire un peu leur taille (que je ne connais pas mais c’est une piste), mettre plus ou moins de distorsion dans la préparation des échantillons d’entrainement, augmenter le nombre d’images de fond, ma banque de base est un peu faiblarde, j’ai commencé à m’en faire une de 5000 photos mais faut que je repasse tout en 640x480 et N&B.
Par contre pour la suppression de la marge tu peux essayer mais je ne garantis rien.

[quote=“romvaillant”]Maintenant j’ai une autre question, toujours sur OpenCV! Comment utiliser plusieurs modèles?Si je crée un autre objet OpenCV et que je réécris toutes les fonctions il ne détectera que mon deuxième modèle…Le problème se situe au niveau de la fonction cascade:C’est à dire que si je l’utilise deux fois dans le style de

opencv1.cascade(...); opencv2.cascade(...);
Il reconnait et détecte uniquement le deuxième modèle malgré le fait que je fasse

Rectangle[] formes1 = opencv1.detect(); Rectangle[] formes2 = opencv2.detect();

Dans mon cas je vais créer le fichier XML de ma flèche mais dans l’autre sens, donc je voudrais utiliser le modèle de ma flèche gauche et de la flèche droite.[/quote]
Alors pour faire des détections de plusieurs objets dans une image je ne me suis pas posé trop de questions. Si je fait 2 détections :

CvHaarClassifierCascade *cascade1=NULL;
CvMemStorage *storage1=NULL;
CvHaarClassifierCascade *cascade2=NULL;
CvMemStorage *storage2=NULL;

// chgt cascade 1
cascade1 = cvLoad( chemin1, 0, 0, 0 );
storage1 = cvCreateMemStorage (0);
cvClearMemStorage( storage1 );
// chgt cascade 2
cascade2 = cvLoad( chemin2, 0, 0, 0 );
storage2 = cvCreateMemStorage (0);
cvClearMemStorage( storage2 );
// detections
CvSeq* faces1 = cvHaarDetectObjects( image, cascade1, storage1, 1.1, 3, 0, cvSize(20, 20) );
CvSeq* faces2 = cvHaarDetectObjects( image, cascade2, storage2, 1.1, 3, 0, cvSize(20, 20) );
// menage
cvReleaseHaarClassifierCascade( &cascade1 );
cvReleaseMemStorage ( &storage1 );
cvReleaseHaarClassifierCascade( &cascade2 );
cvReleaseMemStorage ( &storage2 );

Voila en gros le code en C à la bourrin. Après j’utilise les types CvSeq pour exploiter les positions et tailles des objets détectés. La doc officielle donne quelques billes là-dessus.
Mais pour détecter gauche et droite tu peux faire la détection avec juste un xml :
détection gauche —> rotation image 180° —> détection gauche
en temps de calcul tu y gagnera et puis tu ne gères qu’un seul xml.

Sinon j’y ai repensé, plutôt que le lance roquettes atomique qu’est le haartraining, as-tu réfléchi à détecter tes flèches plus simplement en cherchant des formes géométriques ?
OpenCV est assez puissant pour ça. Tu fais un petit traitement pour isoler les contours, tu récupères les contours sous forme vectorielle et tu confrontes ce qui a été trouvé avec un modèle.
Je m’étais amusé à faire ça pour détecter des formes géométriques simples.
La doc fourni des infos pour les caractérisations de lignes, de rectangles, de cercles, d’ellipses…ensuite il faut combiner un peu.

EDIT : y’a des mecs qui font ça aussi avec allegro il me semble mais je n’ai pas regardé.

Mais fais un peu attention, ça rend barge la vision :wink:

Ah bah j’aurais peut être pu le laisser…

Concernant l’utilisation de plusieurs modèles. J’ai fait un peu le con c’est que je code en Java avec OpenCV! Pour couronner le tout je suis interfacer avec Processing!(je me suis engagé à coder en java pour mon projet donc c’était la seule solution…). Donc le code ressemble à cela (basiquement):

public class Main extends PApplet {

    OpenCV opencv1;
    OpenCV opencv2;
    
    public Main() {
    }

    public static void main(String[] args) {
   // must match the name of your class ie "letsp5.Main" = packageName.className
   PApplet.main( new String[]{"letsp5.Main"} );
    }

    @Override
    public void setup() {

        size( 640, 480 );

        opencv1 = new OpenCV(this);
        opencv2 = new OpenCV(this);
        opencv1.capture( width, height );
        opencv2.capture( width, height );
        opencv1.cascade( "C:\\Documents and Settings\\asus\\Mes documents\\NetBeansProjects\\JavaApplication6\\haarcascade_fleche.xml" );
        opencv2.cascade( "C:\\Documents and Settings\\asus\\Mes documents\\NetBeansProjects\\JavaApplication6\\haarcascade_frontalface_alt.xml" );
    }

    @Override
    public void draw() {
    
        opencv1.read();
        opencv2.read();
        image( opencv1.image(), 0, 0 );
        image( opencv2.image(), 0, 0 );

        // detect anything ressembling a FRONTALFACE
        Rectangle[] F1 = opencv1.detect();
        Rectangle[] F2 = opencv2.detect();

        // draw detected face area(s)
        noFill();
        stroke(255,0,0);
        for( int i=0; i<F1.length; i++ ) {
            rect( F1[i].x, F1[i].y, F1[i].width, F1[i].height );
        }
        stroke(0,255,0);
        for( int i=0; i<F2.length; i++ ) {
            rect( F2[i].x, F2[i].y, F2[i].width, F2[i].height );
        }
    }

Normalement il est sensé me reconnaitre ma flèche et ma tête…
j’ai remarqué que si je supprimait dans le draw() toutes les fonctions de l’objet opencv2(donc en théorie la reconnaissance du visage) il ne me reconnait que le visage…
Je pense pouvoir résoudre mon problème en déclarant dans le sous programme draw().Un peu bourrin car je redéclare tout le temps les modèles…

[quote=“antalgeek”]C’est toi qui es passé sur developpez.com pour les flèches ?
Je ne sais pas comment se présentent tes images positives mais as-tu pensé à une détection par template matching (pardon ricardo, reconnaissance de modèle) ? C’est moins l’usine à gaz que l’algo de haar.

Pour w et h, il faut les adapter aux dimensions de tes positifs, qui j’espère sont tous de la même taille.
Attention j’ai eu des soucis avec des images de plus de 50x50, l’apprentissage s’arrêtait au bout de quelques stages car il bouffait toute la ram (2Go) et manifestement le bouzin n’aime pas swapper.

Essaie, si tu le peux, de pousser le calcul jusqu’au niveau 20, tu pourras ensuite générer des xml de différents niveaux et ainsi comparer les résultats.[/quote]

Bonjour,

je me joindre à vous dans cette discussion vu que je galère depuis qques semaines pour génerer un classifier, je voulais vous demander quand vous parler des tailles des images 50x50, vous parlez de 50x50 pixels! !!! ou bien la taille du classifier “-w 50 -h 50”?

merci

salut

lorsque tu veux créer ton xml tu vas générer des échantillons afin de lancer l’apprentissage
la génération des échantillons se fait par une commande du type :

ici “-w 40 -h 40” signifie que opencv-createsamples va créer des images de 40x40 intégrées aux images de fond

par contre une fois que tu as fixé ces dimensions tu devras les garder jusqu’au bout

il faut faire un peu attention à toutes ces dimensions
si tu as des positifs de 300x300 (par exemple un motif compliqué, j’avais fait l’essai sur un blason) il ne faut pas espérer avoir des échantillons de 20x20
si tu as des positifs très simples tu peux prendre des valeurs de w et h basses
quand je cherchais des bouteilles des champagne j’avais des positifs de 100x270 et j’ai pris une valeur de 40 pour w et h
par contre une autre fois je voulais chercher un motifs compliqué, j’ai pris des valeurs de w et h très basse et j’ai obtenu des perf minables

[quote=“antalgeek”]salut

lorsque tu veux créer ton xml tu vas générer des échantillons afin de lancer l’apprentissage
la génération des échantillons se fait par une commande du type :

ici “-w 40 -h 40” signifie que opencv-createsamples va créer des images de 40x40 intégrées aux images de fond

par contre une fois que tu as fixé ces dimensions tu devras les garder jusqu’au bout

il faut faire un peu attention à toutes ces dimensions
si tu as des positifs de 300x300 (par exemple un motif compliqué, j’avais fait l’essai sur un blason) il ne faut pas espérer avoir des échantillons de 20x20
si tu as des positifs très simples tu peux prendre des valeurs de w et h basses
quand je cherchais des bouteilles des champagne j’avais des positifs de 100x270 et j’ai pris une valeur de 40 pour w et h
par contre une autre fois je voulais chercher un motifs compliqué, j’ai pris des valeurs de w et h très basse et j’ai obtenu des perf minables[/quote]

c’est bien ce que je pensais, merci beaucoup, en fait je genère le fichier vec avec plusieurs images positives (le teste que je fais actuellement se compose de 1900 images positives, et 1800 negatives) par contre mùes images positives n’ont pas les memes dimensions, c’est des images que j’ai telechargé du net, et j’ai fait une application qui place l’objet aleatoirement sur les images et me genere le fichier de descriptions, quand je visualise le fichier vec (avec createsamples -vec xxxx.vec -w -h) je vois belle et bien l’objet que je cherche donc le fichier vec est bien generé; la question que je me pose c’est pour les images positives, est ce qu’elles doivent avoir les memes dimensiosn, l’objet dans ces images a toujours les memes dimensions (160x160); mon probleme c’est que quand je lance un haartraining le traitement s’arrete dans le 10ème stage, en tout cas j’ai lancé le traitement cet après midi et je vais voir ce que ca va donner, esperant que ca va marcher cette fois :slightly_smiling:.
merci et je vous tienderai au courant.

[quote=“antalgeek”]salut

lorsque tu veux créer ton xml tu vas générer des échantillons afin de lancer l’apprentissage
la génération des échantillons se fait par une commande du type :

ici “-w 40 -h 40” signifie que opencv-createsamples va créer des images de 40x40 intégrées aux images de fond

par contre une fois que tu as fixé ces dimensions tu devras les garder jusqu’au bout

il faut faire un peu attention à toutes ces dimensions
si tu as des positifs de 300x300 (par exemple un motif compliqué, j’avais fait l’essai sur un blason) il ne faut pas espérer avoir des échantillons de 20x20
si tu as des positifs très simples tu peux prendre des valeurs de w et h basses
quand je cherchais des bouteilles des champagne j’avais des positifs de 100x270 et j’ai pris une valeur de 40 pour w et h
par contre une autre fois je voulais chercher un motifs compliqué, j’ai pris des valeurs de w et h très basse et j’ai obtenu des perf minables[/quote]

me revoila ! cette fois ci le traitement s’est arreté au stage 6 !!! pourtant j’ai 1900 positives et 1800 negatives !!! j’ai essaié des formats d’entrée en BMP et Jpg et toujours le meme probleme !!! quelqu’un a une idée pls ??

merci d’avance

[quote=“antalgeek”]salut

lorsque tu veux créer ton xml tu vas générer des échantillons afin de lancer l’apprentissage
la génération des échantillons se fait par une commande du type :

ici “-w 40 -h 40” signifie que opencv-createsamples va créer des images de 40x40 intégrées aux images de fond

par contre une fois que tu as fixé ces dimensions tu devras les garder jusqu’au bout

il faut faire un peu attention à toutes ces dimensions
si tu as des positifs de 300x300 (par exemple un motif compliqué, j’avais fait l’essai sur un blason) il ne faut pas espérer avoir des échantillons de 20x20
si tu as des positifs très simples tu peux prendre des valeurs de w et h basses
quand je cherchais des bouteilles des champagne j’avais des positifs de 100x270 et j’ai pris une valeur de 40 pour w et h
par contre une autre fois je voulais chercher un motifs compliqué, j’ai pris des valeurs de w et h très basse et j’ai obtenu des perf minables[/quote]

me revoila ! cette fois ci le traitement s’est arreté au stage 6 !!! pourtant j’ai 1900 positives et 1800 negatives !!! j’ai essayé des formats d’entrée en BMP et Jpg et toujours le meme probleme !!! quelqu’un a une idée SVP??

merci d’avance

Desolé pour le retard!!(les vacances d’hiver et d’autres occupations scolaires et autres)
Et bien je vois que mon topic en a inspiré!
Bon pour le moment j’ai un peu mis mon projet en Stand-by car j’ai quelques autres projets qui doivent avancer (entre autre, une dalle tactile avec des visualisations musicales intéractives et faire de la réalité augmentée avec une wiimote) les joix des années d’écoles!
En tout cas je remercie beaucoup Antalgeek pour son aide (grâce à toi j’ai pu montrer quelque chose à mon référent et avoir une réelle discution autour!).

Sinon, ehkhalid, n’ayant pas eut ton problème je ne peux vraiment t’aider…Moi il s’est arrêté au stage 19 mais en fait je sais pas s’il s’était arrêté au stage 19 car je l’ai arrêté de mon propre chef au bout d’un pm en pensant qu’il était bloqué…
Sinon ça me parait beaucoup 1900 images positives…Je suis pas sur que openCV puisse extraire les points caractéristiques de tes images positives! Personnellement en suivant le tuto de Antalgeek et avec 5 images positives et 400 négatives j’ai de bon résultat!

Enfin ca maaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarche

ouf il m’a fallu 3000 positives et 4000 negatives pour reussir, le traitement s’est arreté au 17ème stage mais il est très fonctionnel et très très précis (reconnaissance a 100%).

pour “romvaillant” moi j’utilise pas la generation des échantillons a partir d’une seule image positive, je genere le .vec a partir de plusieurs images qui contiennent mon objet sans deformation, l’objet que je cherche est un tampon compliqué (avec des zones transparentes etc) donc la generation des echantillons avec createsamples deforme l’objet du coup le .vec generé ne correspond pas au tempon. j’ai donc dait une application en delphi (windows) je specifie les images brutes et il me met aleatoirement le tampon sur les images et genere le fichier de description, je genere le .vec et je lance le training; c vrai que l’utilisation d’un haartrainning pourla detection des tampons peut paraitre exageré, mais les tampons est une image comme tout autre objet (on travail en 2D donc …) mais les autres methodes ne sont pas fiables a 100% ; or dans mon projet , la reconnaissance doit etre fiable a 100% que le tampon soit decoupé, sur une zone coloré ou pas, avec deu text ou pas ; il faut qu’il soit detecté dans tous les cas, et franchement avec le haartrainng ca marche nickel; en tt cas merci pour vos reponses.

[quote=“romvaillant”]Desolé pour le retard!!(les vacances d’hiver et d’autres occupations scolaires et autres)
Et bien je vois que mon topic en a inspiré!
Bon pour le moment j’ai un peu mis mon projet en Stand-by car j’ai quelques autres projets qui doivent avancer (entre autre, une dalle tactile avec des visualisations musicales intéractives et faire de la réalité augmentée avec une wiimote) les joix des années d’écoles!
En tout cas je remercie beaucoup Antalgeek pour son aide (grâce à toi j’ai pu montrer quelque chose à mon référent et avoir une réelle discution autour!).

Sinon, ehkhalid, n’ayant pas eut ton problème je ne peux vraiment t’aider…Moi il s’est arrêté au stage 19 mais en fait je sais pas s’il s’était arrêté au stage 19 car je l’ai arrêté de mon propre chef au bout d’un pm en pensant qu’il était bloqué…
Sinon ça me parait beaucoup 1900 images positives…Je suis pas sur que openCV puisse extraire les points caractéristiques de tes images positives! Personnellement en suivant le tuto de Antalgeek et avec 5 images positives et 400 négatives j’ai de bon résultat![/quote]

Bonjour !

Si quelqu’una réussi à gégérer son haartraining sous windows, je souhaiterais un coup de main : il ne me reconnait pas la commande opencv-createsamples.

Merci.

salut mémèreSoso

j’ai vu ton post sur developpez.net mais j’ai pas eu le temps d’y répondre
j’y passerai demain matin