Commit f0cdc98876657efe7a88769c15c46cbb4a3b2ce8
1 parent
bdfec245
travail sur la récupération de la décision du réseau de neurones
Showing
4 changed files
with
114 additions
and
41 deletions
Show diff stats
python/ANN.py
@@ -18,6 +18,7 @@ from sklearn.metrics import confusion_matrix | @@ -18,6 +18,7 @@ from sklearn.metrics import confusion_matrix | ||
18 | # Réseau de neurones | 18 | # Réseau de neurones |
19 | from keras.models import Sequential | 19 | from keras.models import Sequential |
20 | from keras.layers import Dense | 20 | from keras.layers import Dense |
21 | +from keras.models import model_from_json | ||
21 | ############################################################################### | 22 | ############################################################################### |
22 | 23 | ||
23 | ############################################################################### | 24 | ############################################################################### |
@@ -88,9 +89,9 @@ classifier.compile(optimizer = 'rmsprop', loss = 'binary_crossentropy', metrics | @@ -88,9 +89,9 @@ classifier.compile(optimizer = 'rmsprop', loss = 'binary_crossentropy', metrics | ||
88 | classifier.fit(data_train, target_train, batch_size =5, epochs=500); | 89 | classifier.fit(data_train, target_train, batch_size =5, epochs=500); |
89 | ############################################################################### | 90 | ############################################################################### |
90 | 91 | ||
91 | -########################################################################################## | 92 | +############################################################################### |
92 | #TAUX DE REUSSITE A PARTIR DES DONNEES DE TEST | 93 | #TAUX DE REUSSITE A PARTIR DES DONNEES DE TEST |
93 | -########################################################################################## | 94 | +############################################################################### |
94 | data_pred = classifier.predict(data_test); | 95 | data_pred = classifier.predict(data_test); |
95 | # Conversion en True ou False les predictions | 96 | # Conversion en True ou False les predictions |
96 | # Si y_pred > 0.5 : True | 97 | # Si y_pred > 0.5 : True |
@@ -102,15 +103,60 @@ good_prediction = cm[0, 0] + cm[1, 1]; | @@ -102,15 +103,60 @@ good_prediction = cm[0, 0] + cm[1, 1]; | ||
102 | #dire qu'une attaque est un trafic normal | 103 | #dire qu'une attaque est un trafic normal |
103 | bad_prediction = cm[1, 0] + cm[0, 1]; | 104 | bad_prediction = cm[1, 0] + cm[0, 1]; |
104 | taux_succes = good_prediction * 100 / (good_prediction + bad_prediction); | 105 | taux_succes = good_prediction * 100 / (good_prediction + bad_prediction); |
105 | -########################################################################################## | 106 | +############################################################################### |
106 | 107 | ||
107 | -########################################################################################## | 108 | +############################################################################### |
108 | #SAUVEGARDE DU TRAINING SET | 109 | #SAUVEGARDE DU TRAINING SET |
109 | -########################################################################################## | 110 | +############################################################################### |
110 | #Le modèle est mis au format JSON | 111 | #Le modèle est mis au format JSON |
111 | classifier_json = classifier.to_json(); | 112 | classifier_json = classifier.to_json(); |
112 | with open('C:/Users/Utilisateur/PFE/python/Training/training.json',"w") as json_file : | 113 | with open('C:/Users/Utilisateur/PFE/python/Training/training.json',"w") as json_file : |
113 | json_file.write(classifier_json); | 114 | json_file.write(classifier_json); |
114 | #Les poids sont mis en HDF5 | 115 | #Les poids sont mis en HDF5 |
115 | -classifier.save_weights("C:/Users/Utilisateur/PFE/python/datasets/training.h5"); | ||
116 | -########################################################################################## | ||
117 | \ No newline at end of file | 116 | \ No newline at end of file |
117 | +classifier.save_weights("C:/Users/Utilisateur/PFE/python/Training/training.h5"); | ||
118 | +############################################################################### | ||
119 | + | ||
120 | +############################################################################### | ||
121 | +#FONCTION DE PREDICTION APPELEE DANS LE MAIN | ||
122 | +############################################################################### | ||
123 | +def predictions(ping_mesured,rssi_mesured): | ||
124 | + ############################################################################### | ||
125 | + #ARCHITECTURE DU RESEAU DE NEURONES par le biais de la librairie KERAS | ||
126 | + #ANN | ||
127 | + ############################################################################### | ||
128 | + #Création du classifieur | ||
129 | + classifier = Sequential(); | ||
130 | + #Couche d'entrée donc avec 2 entrées, PING et DELTA_RSSI | ||
131 | + classifier.add(Dense(input_dim = 2, output_dim = 3, init = 'uniform', activation = 'sigmoid')); | ||
132 | + #Couche cachée | ||
133 | + classifier.add(Dense(output_dim = 3, init = 'uniform', activation = 'sigmoid')); | ||
134 | + #Sortie du réseau de neurones | ||
135 | + classifier.add(Dense(output_dim = 1, init = 'uniform', activation = 'sigmoid')); | ||
136 | + ############################################################################### | ||
137 | + | ||
138 | + ############################################################################### | ||
139 | + #LOAD DU TRAINING SET | ||
140 | + ############################################################################### | ||
141 | + json_file=open('C:/Users/Utilisateur/PFE/python/Training/training.json','r'); | ||
142 | + loaded_model_json=json_file.read(); | ||
143 | + json_file.close(); | ||
144 | + loaded_model=model_from_json(loaded_model_json); | ||
145 | + loaded_model.load_weights('C:/Users/Utilisateur/PFE/python/Training/training.h5'); | ||
146 | + ############################################################################### | ||
147 | + | ||
148 | + ############################################################################### | ||
149 | + #REALISER DES PREDICTIONS | ||
150 | + ############################################################################### | ||
151 | + dataset_to_pred = [ping_mesured, rssi_mesured]; | ||
152 | + predictions = classifier.predict(dataset_to_pred); | ||
153 | + | ||
154 | + predictions_named = []; | ||
155 | + if predictions > 0.5: | ||
156 | + predictions_named.append(0);#NORMAL | ||
157 | + #RAS | ||
158 | + return 0; | ||
159 | + else: | ||
160 | + predictions_named.append(1);#ATTAQUE | ||
161 | + #DETECTION d'ATTAQUE | ||
162 | + return 1; | ||
163 | + ############################################################################### | ||
118 | \ No newline at end of file | 164 | \ No newline at end of file |
python/datasets/training.h5 renamed to python/Training/training.h5
No preview for this file type
python/Training/training.json
1 | -{"class_name": "Sequential", "config": [{"class_name": "Dense", "config": {"name": "dense_2", "trainable": true, "batch_input_shape": [null, 2], "dtype": "float32", "units": 3, "activation": "sigmoid", "use_bias": true, "kernel_initializer": {"class_name": "RandomUniform", "config": {"minval": -0.05, "maxval": 0.05, "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}}, {"class_name": "Dense", "config": {"name": "dense_3", "trainable": true, "units": 3, "activation": "sigmoid", "use_bias": true, "kernel_initializer": {"class_name": "RandomUniform", "config": {"minval": -0.05, "maxval": 0.05, "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}}, {"class_name": "Dense", "config": {"name": "dense_4", "trainable": true, "units": 1, "activation": "sigmoid", "use_bias": true, "kernel_initializer": {"class_name": "RandomUniform", "config": {"minval": -0.05, "maxval": 0.05, "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}}], "keras_version": "2.1.2", "backend": "tensorflow"} | ||
2 | \ No newline at end of file | 1 | \ No newline at end of file |
2 | +{"class_name": "Sequential", "config": [{"class_name": "Dense", "config": {"name": "dense_1", "trainable": true, "batch_input_shape": [null, 2], "dtype": "float32", "units": 3, "activation": "sigmoid", "use_bias": true, "kernel_initializer": {"class_name": "RandomUniform", "config": {"minval": -0.05, "maxval": 0.05, "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}}, {"class_name": "Dense", "config": {"name": "dense_2", "trainable": true, "units": 3, "activation": "sigmoid", "use_bias": true, "kernel_initializer": {"class_name": "RandomUniform", "config": {"minval": -0.05, "maxval": 0.05, "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}}, {"class_name": "Dense", "config": {"name": "dense_3", "trainable": true, "units": 1, "activation": "sigmoid", "use_bias": true, "kernel_initializer": {"class_name": "RandomUniform", "config": {"minval": -0.05, "maxval": 0.05, "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}}], "keras_version": "2.1.2", "backend": "tensorflow"} | ||
3 | \ No newline at end of file | 3 | \ No newline at end of file |
python/main.py
@@ -10,45 +10,72 @@ Main - prédictions, affichage, vérification du trafic | @@ -10,45 +10,72 @@ Main - prédictions, affichage, vérification du trafic | ||
10 | ############################################################################### | 10 | ############################################################################### |
11 | import tkinter as tkr; | 11 | import tkinter as tkr; |
12 | import time; | 12 | import time; |
13 | -from keras.models import model_from_json | ||
14 | -from keras.models import Sequential | ||
15 | -import numpy as np | 13 | +import ANN; |
14 | +import serial; | ||
15 | +import recoder; | ||
16 | ############################################################################### | 16 | ############################################################################### |
17 | 17 | ||
18 | -########################################################################################## | ||
19 | -#LOAD DU TRAINING SET | ||
20 | -########################################################################################## | ||
21 | -json_file=open('C:/Users/Utilisateur/PFE/python/Training/training.json','r'); | ||
22 | -loaded_model_json=json_file.read(); | ||
23 | -json_file.close(); | ||
24 | -loaded_model=model_from_json(loaded_model_json); | ||
25 | -loaded_model.load_weights('C:/Users/Utilisateur/PFE/python/Training/training.h5'); | ||
26 | -########################################################################################## | ||
27 | - | ||
28 | -########################################################################################## | ||
29 | -#REALISER DES PREDICTIONS | ||
30 | -########################################################################################## | ||
31 | -#PING en ms | ||
32 | -ping_mesured = 1000; | ||
33 | -#Delta _RSSI entre deux trames en dB (dBm - dBm -> dB) | ||
34 | -rssi_mesured = 8; | ||
35 | -classifier = Sequential(); | ||
36 | -dataset_to_pred = [ping_mesured, rssi_mesured]; | ||
37 | -predictions = classifier.predict(dataset_to_pred); | ||
38 | - | ||
39 | -predictions_named = []; | 18 | +############################################################################### |
19 | +#VARIABLES GLOBALES | ||
20 | +############################################################################### | ||
21 | +ping_mesured=0; | ||
22 | +rssi_mesured=0; | ||
23 | +cpt_trame=0; | ||
24 | +result=0; | ||
25 | +############################################################################### | ||
40 | 26 | ||
41 | -for x in range(0, 1): | ||
42 | - if predictions[x] > 0.5: | ||
43 | - predictions_named.append("Normal") | ||
44 | - else: | ||
45 | - predictions_named.append("Attaque") | ||
46 | -########################################################################################## | 27 | +############################################################################## |
28 | +#DEFINITION DE LA LECTURE DE PORT | ||
29 | +############################################################################## | ||
30 | +ser = serial.Serial( | ||
31 | + #Pour Linux | ||
32 | + #port='/dev/ttyACM0', | ||
33 | + #Pour Windows | ||
34 | + port='COM4', | ||
35 | + #Vitesse de communication | ||
36 | + baudrate = 9600, | ||
37 | + #Parité | ||
38 | + parity=serial.PARITY_NONE, | ||
39 | + #Bit de stop | ||
40 | + stopbits=serial.STOPBITS_ONE, | ||
41 | + #Taille du message | ||
42 | + bytesize=serial.EIGHTBITS, | ||
43 | + #Out | ||
44 | + timeout=1 | ||
45 | +) | ||
46 | +counter=0; | ||
47 | +############################################################################## | ||
47 | 48 | ||
48 | ############################################################################### | 49 | ############################################################################### |
49 | #FONCTIONS UTILES | 50 | #FONCTIONS UTILES |
50 | ############################################################################### | 51 | ############################################################################### |
52 | +def Data_recover(): | ||
53 | + x = ser.readline(); | ||
54 | + debut = time.time(); | ||
55 | + temp = debut; | ||
56 | + #Vérifier si la trame provient d'un emetteur connu | ||
57 | + #Travail ici avec un seul et unique emetteur | ||
58 | + if(cpt_trame == 0): #PREMIERE TRAME ET TRAME OK | ||
59 | + #Récupération du ping | ||
60 | + debut = time.time(); | ||
61 | + temp = debut; | ||
62 | + cpt_trame = cpt_trame +1; | ||
63 | + elif(cpt_trame > 0 and ): #PAS LA PREMIERE ET TRAME OK | ||
64 | + #Récupération du ping | ||
65 | + fin = time.time(); | ||
66 | + ping = (fin-temp)*1000; | ||
67 | + #Récupération de la trame | ||
68 | + trame = x; | ||
69 | + #Récupération de la puissance | ||
70 | + x = ser.readline(); | ||
71 | + #Sortie de boucle | ||
72 | + cpt_trame = cpt_trame + 1; | ||
73 | + else: #TRAME INCONNUE PREMIERE OU AUTRE | ||
74 | + #TRAME INCONNUE = ATTAQUE | ||
75 | + result = 1; | ||
76 | + | ||
51 | def Draw(): | 77 | def Draw(): |
78 | + result = ANN.predictions(ping_mesured, rssi_mesured); | ||
52 | #FRAME INFORMATIONS | 79 | #FRAME INFORMATIONS |
53 | infos=tkr.Frame(root,width=1000,height=5000,relief='groove',background='white',bd=3); | 80 | infos=tkr.Frame(root,width=1000,height=5000,relief='groove',background='white',bd=3); |
54 | infos.place(x=10,y=10); | 81 | infos.place(x=10,y=10); |
@@ -59,12 +86,12 @@ def Draw(): | @@ -59,12 +86,12 @@ def Draw(): | ||
59 | text.config(bg='white', fg='black'); | 86 | text.config(bg='white', fg='black'); |
60 | text.pack(); | 87 | text.pack(); |
61 | global ping; | 88 | global ping; |
62 | - ping=tkr.Label(infos,text='\n\nPING(ms) : '); | 89 | + ping=tkr.Label(infos,text='\n\nPING(ms) : '+ ping_mesured); |
63 | ping.config(font=('arial', 20, 'bold')); | 90 | ping.config(font=('arial', 20, 'bold')); |
64 | ping.config(bg='white', fg='black'); | 91 | ping.config(bg='white', fg='black'); |
65 | ping.pack(); | 92 | ping.pack(); |
66 | global rssi; | 93 | global rssi; |
67 | - rssi=tkr.Label(infos,text='\n\nRSSI(dBm) :'); | 94 | + rssi=tkr.Label(infos,text='\n\nRSSI(dBm) : '+ rssi_mesured); |
68 | rssi.config(font=('arial', 20, 'bold')); | 95 | rssi.config(font=('arial', 20, 'bold')); |
69 | rssi.config(bg='white', fg='black'); | 96 | rssi.config(bg='white', fg='black'); |
70 | rssi.pack(); | 97 | rssi.pack(); |