Cours:Classif : Différence entre versions

De troyesGEII
Aller à : navigation, rechercher
Ligne 16 : Ligne 16 :
 
* la librairie CImg pour des traitements bas niveaux et affichages : https://cimg.eu/
 
* 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/
 
* 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
  
 
==== Prise d'images en terminal ====
 
==== Prise d'images en terminal ====

Version du 31 janvier 2024 à 16:47

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

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).

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

Données bruitées à lire sur le topic data/s1.

a) Lire et afficher le graphe des données s1.

b) En exploitant l'équation aux différence du filtre, appliquer le filtre numérique L1(z) = (1 + z-1). 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)

c) En exploitant le signal s1 non bruité (disponible sur le topic data/s1nonoise) proposer une mesure de la qualité de débruitage du filtre de lissage.

d) Faire de même avec des lissage d'ordre plus élevés. Vous pourrez, soit coder directement L2, L3, ... ou bien faire des filtrages multiples avec L1 (en vérifiant ainsi expérimentalement que L2 = L1 * L1). 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 data/s2 et data/s2b (version avec bruit) Le but est de détecter les sauts de valeurs à l'aide de filtre dérivateurs.

a) Appliquer le filtre dérivateur D1(z) = (1 - z-1)/2 sur data/s2. 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 s2vt.

b) De même avec la version bruitée (s2b). 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é.

a) Mettre en place un détecteur de saut (avec les signaux s2 puis s2b).