Skip to content

Commit b5e2804

Browse files
unknownunknown
authored andcommitted
Merge branch 'master' of github.com:sikick/app3ais8
2 parents 72b12dc + 2c9f01b commit b5e2804

File tree

4 files changed

+25
-24
lines changed

4 files changed

+25
-24
lines changed

LibraryMatlab/problematique/display_result.m

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,13 @@ function display_result(falls_errors, total_falls, non_falls_errors, total_non_f
33

44
f_falls_count = total_falls - falls_errors;
55
f_non_falls_count = falls_errors;
6-
fprintf('F : Falls : %d/%d => %d\n', f_falls_count, total_falls, round(f_falls_count/total_falls*100))
7-
fprintf('F : Non falls : %d/%d => %d\n', f_non_falls_count, total_falls, round(f_non_falls_count/total_falls*100))
6+
fprintf('F : Falls : %d/%d => %d %%\n', f_falls_count, total_falls, round(f_falls_count/total_falls*100))
7+
fprintf('F : Non falls : %d/%d => %d %%\n', f_non_falls_count, total_falls, round(f_non_falls_count/total_falls*100))
88

99
nf_falls_count = non_falls_errors;
1010
nf_non_falls_count = total_non_falls - non_falls_errors;
11-
fprintf('NF : Falls : %d/%d => %d\n', nf_falls_count, total_non_falls, round(nf_falls_count/total_non_falls*100))
12-
fprintf('NF : Non falls : %d/%d => %d\n', nf_non_falls_count, total_non_falls, round(nf_non_falls_count/total_non_falls*100))
11+
fprintf('NF : Falls : %d/%d => %d %%\n', nf_falls_count, total_non_falls, round(nf_falls_count/total_non_falls*100))
12+
fprintf('NF : Non falls : %d/%d => %d %%\n', nf_non_falls_count, total_non_falls, round(nf_non_falls_count/total_non_falls*100))
1313

14-
moy = (round(f_falls_count/total_falls*100) + round(nf_non_falls_count/total_non_falls*100))/2
14+
moy = (round(f_falls_count/total_falls*100) + round(nf_non_falls_count/total_non_falls*100))/2;
15+
fprintf('Total success : %d %%\n', moy)

LibraryMatlab/problematique/fuzzy_3.fis

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ NumOutputs=1
77
NumRules=27
88
AndMethod='min'
99
OrMethod='max'
10-
ImpMethod='min'
10+
ImpMethod='prod'
1111
AggMethod='max'
1212
DefuzzMethod='centroid'
1313

LibraryMatlab/problematique/fuzzy_app3.m

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
% (see values variable near line 69)
1111
% fuzzy_logic_fis = readfis('fuzzy_2.fis');
1212
fuzzy_logic_fis = readfis('fuzzy_3.fis');
13+
1314

1415
falls = get_falls;
1516
non_falls = get_non_falls;
@@ -37,8 +38,8 @@
3738

3839
% k => For binary search of threshold value
3940
% for k = 1:20
40-
% threshold = 0.35 + (k-1)/100
4141
threshold = 0.42;
42+
% threshold = 0.35 + (k-1)/100
4243

4344
[f_falls_count, f_non_falls_count] = eval_fuzzy(falls, fuzzy_logic_fis, threshold);
4445
[nf_falls_count, nf_non_falls_count] = eval_fuzzy(non_falls, fuzzy_logic_fis, threshold);

rapport/04526123_05666488_04450409_05667682.tex

Lines changed: 16 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -107,16 +107,15 @@ \section{Hypothèses simplificatrices}
107107

108108
\subsection{Logique floue}
109109

110+
Au niveau de l'algorithme de logique floue, notre hypothèse simplificatrice a été d'éliminer un capteur au complet. Premièrement, ce choix permet de diminuer le coût du système. Deuxièmement, utiliser les trois axes des deux capteurs augmentent de façon drastique le nombre de règles à écrire et alourdi presque inutilement le système. Pour le choix du capteur, nous avons choisi le capteur sous le bras puisqu'en général, il y a de plus grandes variations sur ce capteur.
111+
110112
\subsection{Réseau de neurones} % Mike
111113
% Utilisation seulement des max et min permet d'identifier les chutes
112114
Dans le cas du réseau de neurones, nous avons décidé de détecter s'il y a une chute ou non, peu importe le type de celle-ci. En effet, il s'agit du mandat de base de la problématique. Nous avons utilisé les données découpées telles que fournies dans les échantillons, donc nous nous simplifions la tâche en ne faisant pas de traitement en temps réel. De plus, nous simplifions nos données en entrée en omettant les lectures du capteur 1, étant donné qu'elles sont redondantes avec celles du capteur 6 mais moins significatives. Tel que présenté dans la section d'analyse des données, le maximum et le minimum du signal sont des informations qui semblent suffisantes pour pouvoir détecter l'occurrence d'une chute.
113115

114116
\section{Représentation de l'information}
115117

116118
\subsection{Logique floue}
117-
118-
Au niveau de l'algorithme de logique floue, nous avons commencé par éliminer un capteur au complet. Premièrement, ce choix permet de diminuer le coût du système. Deuxièmement, utiliser les trois axes des deux capteurs augmentent de façon drastique le nombre de règles à écrire et alourdi presque inutilement le système. Pour le choix du capteur, nous avons choisi le capteur sous le bras puisqu'en général, il y a de plus grandes variations sur ce capteur.
119-
120119
Pour le traitement des données, nous commençons par réduire l'échantillonnage à 20 Hz afin de diminuer le nombre de valeurs avec lesquels travailler. Par la suite, nous ne gardons que deux valeurs par axe de capteur, le maximum et le minimum de l'échantillon de temps. Ces valeurs sont combinées avec l'équation : $||max|-|min||$ qui permet de déterminer la différence entre les accélérations maximales positives et négatives. Si cette valeur est petite, elle signifie qu'une personne a réussi à appliquer une force équivalente opposée à la chute pour se rattraper ou qu'aucune chute n'a eu lieu. Cette relation a été identifiée après l'analyse des données. Les valeurs caractéristiques de cette équation pour le capteur choisi se retrouvent au tableau \ref{tbl:f_input_val}.
121120

122121
\begin{table}[h]
@@ -205,9 +204,7 @@ \subsection{Logique floue}
205204

206205
En deuxième lieu, nous avons déterminé la défuzzification du système. Puisque nous n'avions pas de contrainte sur les valeurs de sorties, nous avons choisi de garder l'intervalle par défaut, de 0 à 1. Nous avons également choisi d'utiliser 4 fonctions d'appartenance pour faciliter l'écriture des règles et les rendre plus représentatives. La relation se retrouve à la figure \ref{fig:f_output}.
207206

208-
En troisième lieu, nous devions définir nos règles pour lier nos entrées fuzzifiées à nos sorties. Selon notre expertise, nous ne voyions pas davantage à prioriser un axe plus qu'un autre. Donc, nos règles dépendent du nombre de types d'entrée et non de quel axe la valeur provient. Dans le même ordre d'idée, nous avons choisi de garder le AND pour combiner les entrées et le OR pour combiner les sorties puisque selon notre analyse du domaine, les variables sont indépendantes. Finalement, au niveau de l'agrégation pour obtenir la valeur finale, nous avons choisi d'utiliser le centroïde puisqu'il s'agit de la valeur par défaut et que nous ne voyions pas l'utilité de la modifier.
209-
210-
% Il faut parler de scaled ou clipped
207+
En troisième lieu, nous devions définir nos règles pour lier nos entrées fuzzifiées à nos sorties. Selon notre expertise, nous ne voyions pas davantage à prioriser un axe plus qu'un autre puisqu'ils sont indépendants. Donc, nos règles dépendent du nombre de types d'entrée et non de quel axe la valeur provient. Dans le même ordre d'idée, nous avons choisi de garder le AND pour combiner les entrées et le OR pour combiner les valeurs de sortie des règles puisque selon notre analyse du domaine, les variables sont indépendantes. Finalement, par essaie erreur, nous avons choisi d'utiliser la mise à l'échelle pour calculer les différentes valeurs de sortie des règles et le centroïde pour calculer le résultat final puisque cette configuration nous donnait de meilleur résultat.
211208

212209
En quatrième lieu, il faut déterminer le seuil de détection d'une chute et d'une non-chute. Puisque notre sortie varie de 0 à 1, nous avons fait une recherche binaire avec une précision de 2 chiffres après la virgule pour identifier le seuil optimal qui de 0.42 avec toutes les données fournies.
213210

@@ -292,6 +289,8 @@ \subsection{Algorithme génétique}
292289
breeders = SelectBreeders pop
293290
pop = Reproduce breeders
294291
pop = Mutate pop
292+
293+
best = pop(MaxIndex(fitnesses))
295294
296295
\end{verbatim}
297296

@@ -300,7 +299,7 @@ \section{Évaluation des performances}
300299

301300
\subsection{Logique floue}
302301

303-
Tout d'abord, notre algorithme de logique a un taux de détection de 88.5\% : 92\% de reconnaissance de chute et 85\% de reconnaissance de non-chute. Nous considérons cette valeur assez élevée pour considérer cette technique satisfaisante compte tenu de notre compréhension et de notre expertise du domaine limité. En plus, l'algorithme prend, pour s'exécuter, entre 3 et 24 millisecondes avec une moyenne à 9 millisecondes. Donc, nous pourrions facilement implémenter un système de détection de chute à la seconde prêt, en temps réel pour un humain.
302+
Tout d'abord, notre algorithme de logique a un taux de détection de 90\% : 91\% de reconnaissance de chute et 87\% de reconnaissance de non-chute. Nous considérons cette valeur assez élevée pour considérer cette technique satisfaisante compte tenu de notre compréhension et de notre expertise du domaine limité. En plus, l'algorithme prend, pour s'exécuter, entre 3 et 24 millisecondes avec une moyenne à 9 millisecondes. Donc, nous pourrions facilement implémenter un système de détection de chute à la seconde prêt, en temps réel pour un humain.
304303

305304
En guise de comparaison, nous avons également essayé l'algorithme de logique floue avec seulement les axes Y et Z du capteur 2. Cette implémentation nous donne, à un seuil de 0.40, 83.5\% de détection : 79\% de reconnaissance de chute et 88\% de reconnaissance de non-chute. En temps de calcul, cette solution prend entre 3 et 24 millisecondes avec une moyenne à 9 millisecondes. Donc, puisque les données sont déjà disponibles sans augmentation des coûts en argent ou en temps, il est plus avantageux d'utiliser le système avec les 3 axes.
306305

@@ -314,9 +313,9 @@ \subsection{Réseau de neurones} % Mike
314313
Les réseaux de neurones que nous générons obtiennent habituellement de bons taux de détection avec les données de test. Le tableau \ref{tbl:neural_results} montre les taux de réussite, en faisant varier la taille de la couche cachée. Nous observons qu'en général, augmenter le nombre de neurones amène une meilleure détection. Le meilleur réseau que nous avons observé possédait 16 neurones et affichait un taux de reconnaissance de 96\%. Nous n'avons cependant pas opté pour celui-ci puisqu'il a fallu plusieurs essais avec notre système avant de le générer. Aussi, le réseau avec 1 seul neurone a requis plusieurs essais avant de converger. Évidemment, lorsque nous analysons la structure, il apparaît qu'en ayant moins d'unités dans la couche cachée que dans la couche de sortie, nous diminuons les chances de distinguer les sorties. Il est même surprenant que nous ayons pu générer un réseau valide avec cette configuration. Donc, après avoir analysé l'impact du nombre d'unités cachées, nous avons fixé notre forme à 8 neurones.
315314
\begin{table}
316315
\centering
317-
\begin{tabular}{|p{1in}|p{1.1in}|p{1.1in}|l|}
316+
\begin{tabular}{|p{1.2in}|p{1.3in}|p{1.3in}|l|}
318317
\hline
319-
Nombre de neurones & Reconnaissance chutes & Reconnaissance non-chutes & \% reconnaissance \\ \hline
318+
\bf{Nombre de neurones} & \bf{Reconnaissance chutes} & \bf{Reconnaissance non-chutes} & \bf{\% reconnaissance} \\ \hline
320319
1 & 13\% & 100\% & 48\% \\ \hline
321320
2 & 91\% & 87\% & 89\% \\ \hline
322321
4 & 80\% & 100\% & 90\% \\ \hline
@@ -327,13 +326,13 @@ \subsection{Réseau de neurones} % Mike
327326
\label{tbl:neural_results}
328327
\end{table}
329328

330-
Un autre paramètre que nous avons étudié est le sujet utilisé pour les données d'apprentissage. Nous avons fait les tests précédents en utilisant les données du sujet 5 comme base pour l'apprentissage. Nous montrons au tableau \ref{tbl:neural_results2} les résultats obtenus en utilisant les deux sujets comme base. À titre d'information, nous avons tenté de mélanger les données des deux sujet pour former notre ensemble d'apprentissage. Il nous a été impossible d'entraîner le réseau de neurones avec ces ensembles puisque celui-ci ne convergeait pas, malgré le fait que nous faisions varier les paramètres du réseau (nombre d'unités cachées, momentum, taux d'apprentissage, etc...).
329+
Un autre paramètre que nous avons étudié est le sujet utilisé pour les données d'apprentissage. Nous avons fait les tests précédents en utilisant les données du sujet 5 comme base pour l'apprentissage. Nous montrons au tableau \ref{tbl:neural_results2} les résultats obtenus en utilisant les deux sujets comme base. À titre d'information, nous avons tenté de mélanger les données des deux sujets pour former notre ensemble d'apprentissage. Il nous a été impossible d'entraîner le réseau de neurones avec ces ensembles puisque celui-ci ne convergeait pas, malgré le fait que nous faisions varier les paramètres du réseau (nombre d'unités cachées, momentum, taux d'apprentissage, etc...).
331330

332331
\begin{table}
333332
\centering
334-
\begin{tabular}{|p{1in}|p{1.1in}|p{1.1in}|p{1.3in}|}
333+
\begin{tabular}{|p{1.2in}|p{1.3in}|p{1.3in}|p{1.5in}|}
335334
\hline
336-
Apprentissage & Reconnaissance chutes & Reconnaissance non-chutes & \% reconnaissance \\ \hline
335+
\bf{Apprentissage} & \bf{Reconnaissance chutes} & \bf{Reconnaissance non-chutes} & \% \bf{reconnaissance} \\ \hline
337336
Sujet 3 & 96\% & 88\% & 92\% \\ \hline
338337
Sujet 5 & 93\% & 98\% & 95\% \\ \hline
339338
\end{tabular}
@@ -345,9 +344,9 @@ \subsection{Réseau de neurones} % Mike
345344

346345
\begin{table}
347346
\centering
348-
\begin{tabular}{|p{1in}|p{1.1in}|p{1.1in}|p{1.3in}|}
347+
\begin{tabular}{|p{1.2in}|p{1.3in}|p{1.3in}|p{1.5in}|}
349348
\hline
350-
Seuil d'entraînement & Reconnaissance chutes & Reconnaissance non-chutes & \% reconnaissance \\ \hline
349+
\bf{Seuil d'entraînement} & \bf{Reconnaissance chutes} & \bf{Reconnaissance non-chutes} & \% \bf{reconnaissance} \\ \hline
351350
0.1 & 84\% & 100\% & 92\% \\ \hline
352351
0.05 & 87\% & 97\% & 92\% \\ \hline
353352
0.01 & 87\% & 100\% & 93.5\% \\ \hline
@@ -418,13 +417,13 @@ \subsection{Algorithme génétique}
418417

419418
\section{Observations et perspectives futures}
420419

421-
Nous avons réussi a implémenter une preuve de concepte fonctionnel en utilisant des techniques d'intélligence artificielle tel que les réseaux de neurones et de la logique flou. Les algorithmes génétiques ne se porte bien à ce type de problème directement, mais peuvent être utlisés dans une approche hybride pour optimiser les paramètres utilisés par les autres méthodes.
420+
Nous avons réussi a implémenter une preuve de concepte fonctionnel en utilisant des techniques d'intélligence artificielle tel que les réseaux de neurones et de la logique flou. Les algorithmes génétiques ne se porte bien à ce type de problème directement, mais peuvent être utlisés dans une approche hybride pour optimiser les paramètres utilisés par les autres méthodes.
422421

423-
À l'aide de la logique flou, nous obtenons une reconnaissance de 88.5\% et environs 95\% avec un réseau de neuronnes. Il serait possible d'augmenter le taux de reconnaissance en utilisants plus de données d'apprentissage et en optimisants les paramètres.
422+
À l'aide de la logique flou, nous obtenons une reconnaissance de 89\% et environs 95\% avec un réseau de neuronnes. Il serait possible d'augmenter le taux de reconnaissance en utilisants plus de données d'apprentissage et en optimisants les paramètres.
424423

425424
Une des plus grandes difficultés rencontré est l'identification des paramètres permettant de différentier les chutes des non-chutes. Cela semble être une des plus grandes difficultés lors de l'implémentation d'algorithmes de classification.
426425

427-
Les techniques d'intélligences artificiel, particulièrement les réseaux de neurones, s'applique bien à ce type de problème où il est difficille d'identifier des règles pour effecteur la classification. Ces techniques peuvent être réutiliser pour une multitude de problèmes qui seraient difficile de résoudre à l'aide des méthodes classiques.
426+
Les techniques d'intélligences artificiel, particulièrement les réseaux de neurones, s'applique bien à ce type de problème où il est difficille d'identifier des règles pour effecteur la classification. Ces techniques peuvent être réutiliser pour une multitude de problèmes qui seraient difficile de résoudre à l'aide des méthodes classiques.
428427

429428
\pagebreak
430429
\section{Annexe}

0 commit comments

Comments
 (0)