Cours:Classif

De troyesGEII
Aller à : navigation, rechercher

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