Πανεπιστήμιο Αθηνών Τμήμα Πληροφορικής και Τηλεπικοινωνιών Ανάπτυξη Λογισμικού για Δίκτυα και Τηλεπικοινωνίες Χειμερινό εξάμηνο 2017-2018 Στα πλαίσια της 2 ης άσκησης καλείστε να ολοκληρώσετε το σύστημα τ η ς απομακρυσμένης διαχείρισης συσκευών μέσω σημάτων που παράγονται από τον ανθρώπινο εγκέφαλο. Η βασική λογική πίσω από αυτό το παραδοτέο είναι η java εφαρμογή μέσω classification να αποφασίζει για την εντολή η οποία θα σταλθεί στο android τερματικό για εκτέλεση. Οι δυνατές εντολές που υπάρχουν είναι Μάτια Ανοιχτά(Eyes Opened) που ισοδυναμεί με την εκτέλεση των ειδοποιήσεων για ON και Μάτια Κλειστά(Eyes Closed) που ισοδυναμεί με την εκτέλεση των ειδοποιήσεων για OFF που περιεγράφηκαν στο 1 ο παραδοτέο. Κατά τη διάρκεια του πρώτου μέρους της εργασίας, κάθε φοιτητής συμμετείχε στη συλλογή μη προσωποποιημένων δεδομένων με τη χρήση του φορητού εγκεφαλογραφήματος Emotiv EPOC+. Κατά το στάδιο της διεξαγωγής των πειραμάτων τα δεδομένα που παράχθηκαν από τους 14 αισθητήρες, από τους οποίους απαρτίζεται η συσκευή Emotiv, εξάχθηκαν αρχεία τύπου CSV. Οι τιμές των CSV αρχείων ακολουθούν την παρακάτω δομή: Τα πρώτα δεκατέσσερα στοιχεία αντιπροσωπεύουν τις τιμές των 14 αισθητήρων (channels) του Emotiv και τα οποία είναι: AF3, F7, F3, FC5, T7, P7, O1, O2, P8, T8, FC6, F4, F8, AF4 Η γραφική απεικόνιση της θέσης του κάθε αισθητήρα είναι αυτή που παρουσιάζεται στην παρακάτω Εικόνα. Τα επόμενα δεκατέσσερα στοιχεία αντιπροσωπεύουν την ποιότητα σύνδεσης των 14 αισθητήρων με το ανθρώπινο κεφάλι κατά τη διάρκεια συλλογής δεδομένων και τα οποία είναι: CQ_AF3, CQ_F7, CQ_F3, CQ_FC5, CQ_T7, CQ_P7, CQ_O1, CQ_O2, CQ_P8, CQ_T8, CQ_FC6, CQ_F4, CQ_F8, CQ_AF4
Οι δυνατές τιμές της ποιότητας σύνδεσης είναι 0, 1, 2, 3, 4 με το 0 να συμβολίζει την αδυναμία επαφής και το 4 τη βέλτιστη ποιότητα σύνδεσης. Όσον αφορά τα τελευταία δύο στοιχεία ισχύουν τα εξής: Ο Marker είναι η μεταβλητή που δηλώνει την έναρξη ή τη λήξη κάποιου event/περιοχή ενδιαφέροντος (π.χ σε αυτό το σημείο ξεκίνησε ο χρήστης να κλείνει τα μάτια του), ορίζεται μέσω συντόμευσης κατά τη φάση της δειγματοληψίας. Ο MarkerH είναι μεταβλητή με τιμή που καθορίζει με ποιο Hardware Input (π.χ πληκτρολόγιο, ποντίκι) ορίστηκε ο Μarker. Στα CSV αρχεία που περιέχουν τις τιμές δειγματοληψίας, μεταξύ δύο μη μηδενικών Marker λαμβάνει χώρα κάποιο event, όπως κλειστά ή ανοιχτά μάτια. Μία γραφική απεικόνιση της λειτουργίας των Marker φαίνεται στην παρακάτω εικόνα. Πιο αναλυτικά: Καλείστε να υλοποιήσετε ένα σύστημα με πολλαπλούς publishers/subscribers κι έναν broker/controller, το οποίο θα αποτελείται από τέσσερα επιμέρους υποσυστήματα: 1. Communication System - CS (Πρώτο Παραδοτέο) 2. ΙοΤ Broker & IoT Controller (Πρώτο Παραδοτέο) 3. Automation System - AS (Δεύτερο Παραδοτέο) 4. Computational Service (Δεύτερο Παραδοτέο) Δεύτερο Παραδοτέο Για κάθε αρχείο CSV, το σύνολο των οποίων θα παρέχεται μέσω του eclass θα πρέπει να υπολογιστεί η εντροπία των τιμών για κάθε ένα από τα 14 channel. Ο κώδικας υπολογισμού εντροπίας παρέχεται στο eclass στο αρχείο calculateentropy.java. Αυτό σημαίνει ότι το τελικό feature vector για κάθε CSV αρχείο θα πρέπει να είναι ένα διάνυσμα της μορφής <Entropy AF3, Entropy F7,, Entropy AF4 >. Επιπρόσθετα μαζί με την εντροπία θα πρέπει να αποθηκεύεται κάθε φορά και το όνομα του πειράματος(eyes Opened/Closed). Το όνομα του πειράματος μπορεί πολύ εύκολα να εξαχθεί από το όνομα του CSV. Η τελική δομή που αφορά την εντροπία φαίνεται γραφικά στο σχήμα που ακολουθεί. Στην συνέχεια θα χρησιμοποιηθούν τα παραπάνω feature vector ως δεδομένα προς κατηγοριοποίηση για την παραλλαγή του classification αλγορίθμου Weighted knn που περιγράφεται παρακάτω. Το training σύνολο Χ που απαιτείται για την υλοποίηση του αλγορίθμου
θα παρέχεται στο eclass υπό μορφή CSV αρχείου. Σχετικά τώρα με το training set πρέπει να αναφερθούν τα εξής: Η 1 η στήλη περιέχει το όνομα του πειράματος(eyes Closed/Opened). Οι επόμενες 14 στήλες είναι οι εντροπίες/feature vector για καθένα από τα 14 channels. Κάθε γραμμή ισοδυναμεί με ένα πείραμα. Γραφικά τα παραπάνω αναπαριστάνονται ως εξής: Σας ζητείται να υλοποιήσετε σε java κώδικα τον παρακάτω ψευδοκώδικα του classification αλγορίθμου. Ψευδο-κώδικας παραλλαγής του knn Αλγορίθμου Απώτερος σκοπός του αλγορίθμου είναι δοθέντος ενός διανύσματος x να βρεθούν οι k κοντινότεροι γείτονές τους. Το διάνυσμα x θα κατηγοριοποιηθεί στην κλάση στην οποία ανήκει η πλειοψηφία των k γειτόνων του. Έστω X τα ήδη κατηγοριοποιημένα δεδομένα, Υ τα Labels για τις κλάσεις (στην συγκεκριμένη εφαρμογή υπάρχουν μόνο 2 κλάσεις με ονόματα EyesClosed και EyesOpened) και x το διάνυσμα προς κατηγοριοποίηση και m το μέγεθος των κατηγοριοποιημένων δεδομένων. For i = 1 to m do Υπολογισμός EuclideanDistance d(χ i, x) End for Υπολογισμός του συνόλου Ι μέσα στο οποίο θα βρίσκονται οι k μικρότερες αποστάσεις d(x i, x). Υπολογισμός counter που δηλώνει τον αριθμό των Y i μέσα στο I Υπολογισμός της μετρικής βάρους w yi = w yi + 1/d(X i, x) για κάθε X i στο σύνολο των k γειτόνων με Label Y i. Επιστροφή το Y i με για το οποίο το w yi counter παίρνει την μεγαλύτερη τιμή. Σημείωση! Η επιλογή του k είναι ανοιχτή. Συνήθως οι τιμές του είναι περιττοί αριθμοί για να αποφεύγονται οι ισοψηφίες. Συνήθεις τιμές είναι 3,5,7,11. Στην συνέχεια, κάθε νέο διάνυσμα(όχι τα διανύσματα του training set) το οποίο κατηγοριοποιείται σε μία από τις 2 κλάσεις θα πρέπει να μπαίνει σε ένα ενταμιευτή-buffer υπό την μορφή εντολής ώστε να σταλθεί στο τερματικό android. Για παράδειγμα εάν ένα feature vector κατηγοριοποιήθηκε στην κλάση EyesClosed θα μπορούσε να μπει στον buffer ως «Execute Eyes Closed» Παράλληλα με το γέμισμα του buffer θα πρέπει να υπάρχει ένα ακόμα Thread το οποίο θα παίρνει σειριακά τις εντολές από τον buffer και θα τις στέλνει στο τερματικό android. Κάθε εντολή που
αποστέλλεται θα πρέπει να αφαιρείται από τον buffer. Εδώ πέρα σημαντικό είναι να τονιστεί ότι θα πρέπει να υπάρχει συγχρονισμός για την πρόσβαση στον buffer. Σημαντικό επίσης είναι να αναφερθεί το ποιος θα είναι ο ρυθμός με τον οποίον θα στέλνει η java εφαρμογή τις εντολές στο android τερματικό. Αυτός ο ρυθμός/συχνότητα θα πρέπει να ορίζεται από το ίδιο το android τερματικό μέσω του ήδη υλοποιημένου «options menu». Οπότε σε αυτήν την φάση της εργασίας θα γίνει μία επέκταση του «options menu» και θα περιέχει πλέον 3 επιλογές: Δυνατότητα παραμετροποίησης της IP και του port στα οποία μπορεί το android τερματικό να βρει τον broker. Δυνατότητα παραμετροποίησης της συχνότητας με την οποία θα πρέπει η java εφαρμογή να στέλνει τις εντολές. Προτείνεται η συχνότητα να έχει την μορφή δευτερολέπτων ώστε να μην υπάρχει συμφόρηση εντολών. Την επιλογή εξόδου από την εφαρμογή(exit). Επιπρόσθετα θα πρέπει να γίνει μία επέκταση της λειτουργικότητας του android τερματικού με την ύπαρξη ενός thread το οποίο θα εκτελείται στον background και θα ελέγχει περιοδικά για την ύπαρξη σύνδεσης στο διαδίκτυο. Σε περίπτωση που δεν υπάρχει θα πρέπει να προτείνει στον χρήστη να ενεργοποιεί την σύνδεση. Η ενεργοποίηση της σύνδεση θα μπορεί να γίνεται είτε αυτόματα είτε χειροκίνητα. Δεν υπάρχει κάποιος περιορισμός πάνω στον τρόπο με τον οποίο πρέπει να γίνεται η ενεργοποίηση. Τέλος θα πρέπει να γίνουν μερικές ακόμα επεκτάσεις την java εφαρμογή που έχουν ως σκοπό την παρακολούθηση την επιτυχίας του αλγορίθμου κατηγοριοποίησης. Πιο συγκεκριμένα: Θα πρέπει να γίνεται διασταύρωση μεταξύ της κλάσης στην οποία τελικά κατηγοριοποιήθηκε το δείγμα και της πραγματικής κλάσης του δείγματος(η οποία όπως αναφέρθηκε και στις προηγούμενες σελίδες μπορεί να παρθεί από το όνομα του αρχείου). Στην κονσόλα της java εφαρμογής θα πρέπει κάθε φορά που αποστέλλεται μία εντολή προς το android τερματικό να τυπώνεται η κλάση στην οποία τελικά κατηγοριοποιήθηκε το δείγμα καθώς και η πραγματική κλάση του δείγματος μαζί με ένα μήνυμα επιτυχίας ή αποτυχίας. Η επιτυχία θα είναι εάν η πραγματική κλάση είναι ίδια με την κλάση στην οποία κατηγοριοποιήθηκε το δείγμα και η αποτυχία θα προκύπτει από το αν τελικά οι 2 κλάσεις ήταν διαφορετικές. Με την ολοκλήρωση του προγράμματος θα πρέπει να εμφανίζεται ένα συνολικό ποσοστό επιτυχίας του αλγορίθμου κατηγοριοποίησης. Το ποσοστό επιτυχίας ορίζεται από το πόσα δείγματα τελικά κατηγοριοποιήθηκαν στις σωστές κλάσεις. Επιπρόσθετα σε αυτό το παραδοτέο θα πρέπει να παραδοθεί και ένα αρχείο README το οποίο θα περιέχει αναλυτικά τον τρόπο λειτουργίας του προγράμματος. Θα ακολουθήσει ανακοίνωση προς το τέλος της διορίας παράδοσης με αναλυτικές λεπτομέρειες.
Τεχνολογίες συστήματος ανάπτυξης: 1. Java Oracle SE 8 2. Android API 4.1 ή νεότερο 3. Android Studio (Εργαλείο ανάπτυξης της εφαρμογής Android) 4. IntelliJ IDEA (Εργαλείο ανάπτυξης της Java εφαρμογής) 5. MQTT mosquitto broker 6. Eclipse Paho (Java & Android MQTT client) Κατά τη διαδικασία της ανάπτυξης της εργασίας είναι η υποχρεωτική η χρήση του εργαλείου Git (Version Control) και της πλατφόρμας gitlab (anapgit.scanlab.gr) που παραχωρείται για τις ανάγκες του μαθήματος. Η υλοποίηση της εφαρμογής θα πρέπει: 1. Να υπακούει στις αρχές του αντικειμενοστραφούς προγραμματισμού 2. Να γίνεται σωστή και αποδοτική οργάνωση του κώδικα σε κλάσεις και πακέτα. 3. Να είναι όσο το δυνατό παραμετροποιήσιμη και δυναμική γίνεται. 4. Να γίνεται σωστή και αποδοτική διαχείριση της μνήμης.