Cours:BUTiot TNS : Différence entre versions

De troyesGEII
Aller à : navigation, rechercher
 
Ligne 2 : Ligne 2 :
  
 
<center>
 
<center>
'''<big>Classification multivariée temps réel</big>'''
+
'''<big>TD/TP Traitement du signal numérique: lissage, détection de changements, détection de motifs</big>'''
 
</center>
 
</center>
  
 
Le travail de cette étape va consister à  
 
Le travail de cette étape va consister à  
* lire des données temps réel caractérisant l'état d'un réseau (latence et débit)
+
* manipuler les différentes représentations d'un système numérique (filtre)
* A partir d'un ensemble de données d'entrainement, mettre en place un classifieur permettant de détecter des anomalies sur ce réseau
+
* Utiliser des filtres numériques pour lisser des données temps réel, détecter des changements ou des motifs particuliers.
  
=== Lecture des données d'entrainement et apprentissage ===
+
=== Exercice 1 : TD ===
  
* Source des données : https://www.kaggle.com/datasets/rishitdagli/anomaly-detection-sample-dataset
+
* [[Media:TNS-td-représentationFiltre.pdf|Énoncés des exercices de TD (pdf)]]
  
{{q| a)}} À faire :
+
=== Exercice 2 : TP ===
* Créer une nouvelle "application" node.js
 
* Télécharger le zip des données, décompresser, placer les deux fichiers <code>tr_server_data.csv</code> et <code>gt_server_data.csv</code> dans le dossier de l'application.
 
* Lire ces données au format CSV, par exemple avec :
 
<source lang="c++">
 
const fs = require("node:fs");
 
  
// training
+
===== Lissage =====
let tr = fs.readFileSync("tr_server_data.csv", "utf-8")
 
    .split('\n') // découpe des lignes
 
    .map(l => l.split(',').map (v => parseFloat(v))); // découpe autour de la virgule et conv. en flottant
 
tr.pop(); // Les deux dernières lignes sont à rejeter.
 
tr.pop();
 
</source>
 
* Mise en place du classifieur KNN (entrainement et test):
 
  
Il sera nécessaire d'installer les paquets <code>@tensorflow-models/knn-classifier</code> et <code>@tensorflow/tfjs</code>
+
Données bruitées à lire sur le topic <code>data/s1</code>.
<source lang="c++">
 
const knnClassifier = require('@tensorflow-models/knn-classifier');
 
const tf = require('@tensorflow/tfjs');
 
  
// Create the classifier.
+
{{q| a)}} Lire et afficher le graphe des données <code>s1</code>.
const classifier = knnClassifier.create();
 
  
// Train the classifier
+
{{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)
for (let k = 0; k < gt.length; k++) {
 
    classifier.addExample(
 
        tf.tensor(tr[k]),
 
        gt[k]
 
    );
 
}
 
  
// Test the classifier
+
{{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.
for (let k = 0; k < gt.length; k++) {
 
    classifier.predictClass(
 
        tf.tensor(tr[k]),
 
        1
 
    ).then(v => console.log(v.classIndex + " / " + gt[k]));
 
}
 
</source>
 
Tester le bon fonctionnement de ce code.
 
  
{{q| b)}} Évaluer les performances de ce classifieur KNN (1 plus proche voisin) en construisant la matrice de confusion (cf https://fr.wikipedia.org/wiki/Matrice_de_confusion)
+
{{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.
  
{{q| c}} Évaluer les performances de ce classifieur KNN (3 plus proches voisins) en construisant la matrice de confusion
+
===== Dérivation (détection changements) =====
  
=== Classification temps réel ===
+
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.
  
* Données publiées sur le broker habituel :
+
{{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>.
** <code>data/latence</code> en ms
 
** <code>data/debit</code> en mb/s
 
** <code>data/gt</code> = ''ground truth'' (vérité terrain) : est-ce une anomalie ?
 
* Ces données ne sont pas les mêmes que celles de l'entrainement.
 
  
A faire (en node.js) :
+
{{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.
* Lire ces données avec mqtt
+
 
* Lorsqu'une donnée arrive : la classer comme "normale" (0) ou "anomalie" (1) avec le KNN précédent (1 ou 3 plus proche voisin)
+
===== Convolution (détection de motifs) =====
* La vérité terrain étant disponible sur le topic <code>data/gt</code>, évaluer les performances du classifieur, sur ces données non entrainées, en construisant une matrice de confusion.
+
 
 +
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 actuelle datée du 6 février 2024 à 15:31

Retour à la page du cours

TD/TP Traitement du signal numérique: lissage, détection de changements, détection de motifs

Le travail de cette étape va consister à

  • manipuler les différentes représentations d'un système numérique (filtre)
  • Utiliser des filtres numériques pour lisser des données temps réel, détecter des changements ou des motifs particuliers.

Exercice 1 : TD

Exercice 2 : TP

Lissage

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