Cours:Classif : Différence entre versions

De troyesGEII
Aller à : navigation, rechercher
Ligne 51 : Ligne 51 :
 
==== Mise en place de la librairie Dlib ====
 
==== Mise en place de la librairie Dlib ====
  
La librairie CImg est constituée d'un unique ficher <code>CImg.h<code>
+
La librairie CImg est constituée d'un unique ficher <code>CImg.h</code>
  
* Télécharger la librairie depuis https://cimg.eu/download.html, décompresser et copier le fichier <code>CImg.h<code>dans votre dossier de travail
+
* Télécharger la librairie depuis https://cimg.eu/download.html, décompresser et copier le fichier <code>CImg.h</code> dans votre dossier de travail
* Faire un nouveau projet
+
* Faire un nouveau projet non Qt, avec le <code>main.cpp</code> suivant
*
+
<source lang="c++">
 +
#include <iostream>
 +
 
 +
#include "/home/nicoli01/tests/testcimg/CImg.h" // A REMPLACER DANS VOTRE CAS
 +
 
 +
using namespace cimg_library;
 +
 
 +
using namespace std;
 +
 
 +
int main()
 +
{
 +
    cout << "Hello World!" << endl;
 +
 
 +
    CImg<unsigned char> image("/root/im.png"); // A REMPLACER DANS VOTRE CAS
 +
    image.display("hello");
 +
    return 0;
 +
}
 +
</source>
  
 
==== Prise d'images en c++ ====
 
==== Prise d'images en c++ ====
Ligne 83 : Ligne 100 :
  
 
* En utilisant Dlib
 
* En utilisant Dlib
 
Données bruitées à lire sur le topic <code>data/s1</code>.
 
 
{{q| a)}} Lire et afficher le graphe des données <code>s1</code>.
 
 
{{q| b)}} En exploitant l'équation aux différence du filtre, appliquer le filtre numérique L<sub>1</sub>(z) = (1 + z<sup>-1</sup>). Afficher le graphe de la sortie (par ex. avec nodered ou bien avec MQTT explorer). Comparer le signal avant et après filtrage (amplitude et quantité de bruit)
 
 
{{q| c)}} En exploitant le signal s1 non bruité (disponible sur le topic <code>data/s1nonoise</code>) proposer une mesure de la qualité de débruitage du filtre de lissage.
 
 
{{q| d)}} Faire de même avec des lissage d'ordre plus élevés. Vous pourrez, soit coder directement L<sub>2</sub>, L<sub>3</sub>, ... ou bien faire des filtrages multiples avec L<sub>1</sub> (en vérifiant ainsi expérimentalement que L<sub>2</sub> = L<sub>1</sub> * L<sub>1</sub>). Mesurer à chaque fois les quantités de bruits obtenus afin de valider quantitativement la qualité des différents filtres.
 
 
===== Dérivation (détection changements) =====
 
 
Données à lire sur les topics <code>data/s2</code> et <code>data/s2b</code> (version avec bruit)
 
Le but est de détecter les sauts de valeurs à l'aide de filtre dérivateurs.
 
 
{{q| a)}} Appliquer le filtre dérivateur D<sub>1</sub>(z) = (1 - z<sup>-1</sup>)/2 sur <code>data/s2</code>. Mettre en place un détecteur de saut de valeurs à partir du résultat obtenu. Vous pourrez valider votre détection en exploitant la vérité terrain (saut/pas de saut) disponible sur le topic <code>s2vt</code>.
 
 
{{q| b)}} De même avec la version bruitée (<code>s2b</code>). Il sera probablement nécessaire d'opérer un lissage avant la détection, afin de réduire le bruit.
 
 
===== Convolution (détection de motifs) =====
 
 
Un façon de détecter des motifs consiste à convoluer le signal d'entrée avec un signal similaire avec le motif recherché.
 
 
{{q| a)}} Mettre en place un détecteur de saut (avec les signaux <code>s2</code> puis <code>s2b</code>).
 

Version du 31 janvier 2024 à 16:54

TP Classification : détection d'objet en temps réel

Le travail de cette étape va consister à

  • analyser des images acquise en "temps réel" afin de détecter et identifier des objets
  • les objets seront
    • dans un premier temps des jetons de nain jaune
    • dans un second temps des briques lego.

Technos matérielles et logicielles

Vous utiliserez :

  • Une Rpi 4 que vous programmerez depuis vos postes linux (en cross-compilation)
  • Une camera PiCam Wide (grand angle)
  • la librairie CImg pour des traitements bas niveaux et affichages : https://cimg.eu/
  • la librairie Dlib pour des traitements simples et la reconnaissance : http://dlib.net/

Vous travaillerez dans un dossier dit "DE TRAVAIL", qui contiendra

  • les dossiers de vos projets QtCreator
  • le code des librairies Dlib et CImg téléchargées

(dans mes exemples, c'est /home/nicoli01/tests)

Prise d'images en terminal

  • Connecter (si cela n'est pas fait) la PiCam à la Rpi4
  • Tester la PiCam avec libcamera-hello (la capture doit s'afficher sur l'écran de la Rpi)
  • Tester l'acquisition d'image avec l'éxecutable libcamera-still
  • Explorer les options de cette application (libcamera-still -h), en particulier -n, --immediate, --width, --height et -o

Mise en place de la librairie Dlib

Cette fonction exploite la librairie Dlib :

  • Créer un projet dans QtCreator de type Non-Qt C++
  • Télécharger la librairie depuis http://dlib.net, la décompresser et placer son dossier au même niveau que votre dossier de projet
  • Modifier votre fichier .pro de la façon suivante :
`
QMAKE_CXXFLAGS += -DDLIB_JPEG_SUPPORT
INCLUDEPATH += /home/nicoli01/tests # A REMPLACER PAR LE CHEMIN VERS VOTRE DOSSIER DE TRAVAIL
SOURCES += \
        /home/nicoli01/tests/dlib/all/source.cpp ## A REMPLACER DANS VOTRE CAS
LIBS += -ljpeg -lm -lX11 -lpthread
Ne pas oublier les deux lignes
target.path = /root
INSTALLS = target
  • Pour le contenu de votre main.cpp, vous pourrez utiliser l'exemple suivant http://dlib.net/image_ex.cpp.html (en remplaçant éventuellement la ligne load_image(img, argv[1]); par oad_image("image.png"); pour lire une image que vous aurez acquis avec libcamera).

Mise en place de la librairie Dlib

La librairie CImg est constituée d'un unique ficher CImg.h

  • Télécharger la librairie depuis https://cimg.eu/download.html, décompresser et copier le fichier CImg.h dans votre dossier de travail
  • Faire un nouveau projet non Qt, avec le main.cpp suivant
#include <iostream>

#include "/home/nicoli01/tests/testcimg/CImg.h" // A REMPLACER DANS VOTRE CAS

using namespace cimg_library;

using namespace std;

int main()
{
    cout << "Hello World!" << endl;

    CImg<unsigned char> image("/root/im.png"); // A REMPLACER DANS VOTRE CAS
    image.display("hello");
    return 0;
}

Prise d'images en c++

Voici une fonction imcapture que vous pourrez utiliser pour réaliser une acquisition d'image en c++

array2d<rgb_pixel> imcapture() {
	array2d<rgb_pixel> image;
    int pb = system("rm im.png 2>/dev/null; libcamera-still -n 1 --immediate --width 640 --height 480 -o im.png 2> /dev/null ");
	if (pb) {
		cout << "ERROR: no image acquisition" << endl;
		exit(1);
	} else {
		image = load("im.png");
	}
	return image;		
}

Prétraitements et mesure de descripteurs

Identification par KNN

  • A coder

Identification par SVM

  • En utilisant Dlib