menarik wawasan dari stasiun WiFi publik…
Setiap detiknya, banyak perubahan terjadi di dunia teknologi. Perangkat pintar baru, gadget hadir di pasar dengan spesifikasi berbeda. Oleh karena itu, ada banyak diskusi tentang cara menggunakan perangkat yang ada ini untuk mengumpulkan beberapa wawasan tersembunyi dari perangkat tersebut. Pengenalan aktivitas manusia berbasis sinyal WiFi adalah topik hangat saat ini, dengan teknik pembelajaran mesin, hal ini menjadi lebih menarik dan realistis.
Oleh karena itu, dalam artikel singkat ini, kami akan membuat aplikasi sederhana untuk mendeteksi keberadaan seseorang di suatu area tertentu.
Mari kita diskusikan beberapa ide terkait topik utama berikut.
- Pelajari tentang arsitektur dan konsepnya
- Pengambilan data + Mempercepat
- Melatih model dan hasil ML
- Prediksi pada data waktu nyata
Hebat! Kencangkan sabuk pengaman untuk menyelam lebih dalam.
1. Arsitektur
Masalah : Dalam proyek ini kami berfokus pada mengidentifikasi perbedaan antara,
- Area kosong vs satu orang yang hadir dan bergerak
- Area kosong vs 5 orang yang hadir dan bergerak
di wilayah tertentu. RSSI dari berbagai titik akses WIFI yang terdengar di area ini dikumpulkan dan data diterapkan pada teknik klasifikasi untuk mendapatkan hasil yang diperlukan. Kemudian kami mencoba memprediksi pada data real time.
Metodologi : Kami memerlukan beberapa komponen untuk membangun sistem, Anda mungkin pernah mendengar atau menggunakannya. Ya!
- ESP8266 — Pindai SSID dan RSSI (Pengumpulan data)
- Server pusat MQTT (iot.eclipse.org)
- Klien Python MQTT — Berlangganan topik yang relevan untuk data
NodeMCU memindai SSID WiFi yang tersedia dan mengumpulkan informasi RSSI. Kemudian klien MQTT dari NodeMCU akan mengirimkan data ke server MQTT; dalam kasus kami, kami akan menggunakan iot.eclipse.orguntuk percobaan pertama. Proses python terpisah dari klien MQTT juga disiapkan untuk membaca antrian dan menyimpan ke file excel yang digunakan untuk dimasukkan ke dalam model ML nanti.
Jadi ini adalah ide paling dasar dari sistem kami. Ini untuk menunjukkan bahwa ide kami layak untuk diterapkan. Namun dalam aplikasi tingkat produksi kita dapat menggunakan layanan cloud seperti GCP atau Azure untuk layanan MQTT, melatih model ML, dan menghosting dasbor hampir real-time untuk melihat ketersediaan orang di ruang kerja yang besar. Kemungkinan lainnya adalah jika Anda ingin mengimplementasikannya di area kecil, maka instal semuanya secara lokal. Sederhana!.
2. Pengumpulan data
Setelah sistem Anda aktif dan berjalan, sekarang saatnya mengumpulkan data dalam jumlah yang cukup. Pertama-tama identifikasi SSID yang tersedia, dan beri label pada data yang dikumpulkan. Dalam kasus kami, kami dapat mendengar jaringan nirkabel UoM_Wireless, UNIC-wifi, Beacon_wireless, FGS_office, Eduroam pada pemeriksaan awal. Dan mengumpulkan data dengan label berikut.
- 0 :Tidak ada orang di ruangan itu
- 1 :Satu orang di dalam ruangan dan bergerak-gerak
- 2 :Lima orang di dalam ruangan dan bergerak-gerak
Namun data ini tidak dapat digunakan secara langsung, kami menghabiskan banyak waktu untuk melakukan pra-pemrosesan data karena kami mengalami masalah berikut dan kami dapat menyelesaikan beberapa di antaranya.
- Beberapa SSID tidak tersedia terus-menerus — jadi kami menghapus (kolom) sementara dan melanjutkan dengan SSID persisten.
- Lebih sedikit titik data — sekitar 350 contoh untuk setiap peristiwa, namun kami menggunakan augmentasi data.
- Beberapa bidang kosong — jadi kami mengisi bidang yang hilang dengan nilai serupa dari contoh lain.
- Menormalkan kumpulan data dapat meningkatkan kinerja.
Contoh kolom kosong yang menggantikan kode,
Di bagian pengumpulan data, pengiriman data ke server Eclipse mqtt mungkin menambah latensi. Karena kami perlu mempercepat proses, kami menghosting server MQTT lokal menggunakan Docker.
Periksa https://www.docker.com/get-started . Kemudian Anda dapat dengan mudah menarik gambar buruh pelabuhan dan meningkatkan server MQTT mosquitto dengan menjalankan berikut ini di PowerShell.
docker run -it -p 1883:1883 -p 9001:9001 -v mosquitto.conf:/mosquitto/config/mosquitto.conf -v /mosquitto/data -v /mosquitto/log eclipse-mosquitto
3. Pelatihan Model Pembelajaran Mesin
Di sini kami mencoba beberapa model, tetapi tidak membahas pembelajaran mesin lebih dalam. Kami memeriksa hasil model berikut.
- Mesin Vektor Dukungan (SVM)
- Gaussian Naif Bayes (GaussianNB)
- Regresi Logistik Multilinear
- Pengklasifikasi Pohon Keputusan
- Pengklasifikasi Tetangga K
Silakan lihat :)
# 1. Importing libraries import json import csv import os import pandas as pd import numpy as np import pickle from sklearn.svm import SVC from sklearn.naive_bayes import GaussianNB from sklearn.linear_model import LogisticRegression from sklearn.tree import DecisionTreeClassifier from sklearn.neighbors import KNeighborsClassifier from sklearn.model_selection import train_test_split from sklearn.metrics import classification_report, confusion_matrix # 2. Importing the dataset #Download the dataset from database as a CSV file and store in the local directory. #To read data from CSV file, the simplest way is to use read_csv method of the pandas library. wifidata = pd.read_csv("./final-data-set.csv") #change your file name # 3. Exploratory Data Analysis #check the dimensions of the data and see first few records print("Dimensions of the data:") print(wifidata.shape) print("\nFirst few records:") print(wifidata.head()) # 4. Data Preprocessing # To divide the data into attributes and labels X = wifidata.drop('id', axis=1) #contains attributes y = wifidata['id'] # contains corresponding labels #divide data into training and test sets X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.20) # 5. Training the Algorithm models=[] models.append(('SVC',SVC(kernel='linear'))) models.append(('GNB',GaussianNB())) models.append(('LR',LogisticRegression(C=1e5, solver='lbfgs',multi_class='multinomial'))) models.append(('DTC',DecisionTreeClassifier(random_state=0))) models.append(('KNN',KNeighborsClassifier(n_neighbors=3))) for name,model in models: print(name+" : Training starting") classifier = model classifier.fit(X_train, y_train) # train the algorithm on the training data # 6. Making Predictions y_pred = classifier.predict(X_test) # 7. Evaluating the Algorithm #Confusion matrix, precision, recall, and F1 measures are the most commonly used metrics for classification tasks. print("\nConfusion Matrix:") print(confusion_matrix(y_test,y_pred)) print("\nClassification Report:") print(classification_report(y_test,y_pred)) # 8.save the model to disk filename =name+'_finalized_model.pkl' pickle.dump(classifier, open(filename, 'wb'))
Setelah Anda menjalankan program pelatihan model, kami mendapatkan skor presisi, perolehan, dan F1 dari setiap model yang dilatih. Jadi kita bisa memilih yang lebih baik untuk disesuaikan dengan aplikasi kita.
Visualisasi kumpulan data juga membantu kami mengidentifikasi faktor-faktor kunci dalam kumpulan data.
Distribusi data
Semua titik data dari setiap titik akses nirkabel diplot dalam skala yang sama. Jari-jari setiap titik sebanding dengan frekuensi nilai RSSI masing-masing. Ini membantu untuk memahami perilaku data.
Pengamatan :
- Beberapa nilai RSSI memiliki frekuensi lebih tinggi (titik dengan radius lebih tinggi).
- Titik-titik dengan frekuensi lebih tinggi setiap AP tidak berada pada pola yang sama.
Plot 3D (dengan mempertimbangkan 3 Titik Akses)
Plot 3D berikut dikembangkan berdasarkan kumpulan data dari tiga titik akses nirkabel; Chamidi, NipunaM, IsuruAp.
Pengamatan:
- 3 cluster untuk acara tanpa orang, dua orang, lima orang
Plot 5D (dengan mempertimbangkan 5 AP)
Di sini kami mencoba memplot semua titik data dalam representasi 5D.
X - Nilai Chamidi1
Y - Nilai NipunaM6
Z — Nilai IsuruAp6
Warna — Nilai UNIC-wifi11
Ukuran — Nilai UoM_Wireless11
Marker — kelas titik data
Marker ‘,’ untuk 0 kelas, marker ‘o’ untuk 1 kelas dan marker ‘x’ untuk 2 titik data kelas. Kita dapat mengidentifikasi secara terpisah tiga cluster yang diharapkan dapat diidentifikasi oleh algoritma SVM.
kode untuk plot ini di basis kode proyek.
BESAR!!!
Sekarang kami memiliki sistem yang lebih baik dengan model yang lebih baik.
4. Prediksi pada data real-time
Simpan model ke acar agar kita dapat memuatnya kembali di program lain. Klien python mqqt akan mendengarkan suatu topik dan data yang masuk akan diteruskan ke model yang menghasilkan prediksi apakah tidak ada orang/1 orang/5 orang di area tersebut.
import pickle import datetime import pandas as pd import paho.mqtt.client as mqtt from sklearn.model_selection import train_test_split from sklearn.metrics import classification_report, confusion_matrix import ast # Starting. print("###### Welcome to wifi person detector ######") # callback for connecting to the server def on_connect(client, userdata, flags, rc): print("Connected with result code "+str(rc)) client.subscribe("entc/wifipd") # The callback for when a PUBLISH message is received from the server. def on_message(client, userdata, msg): try: print("-----------------------------") print(msg.topic+" "+str(msg.payload)) data1=msg.payload dic = ast.literal_eval(data1.decode("utf-8")) #print(dic) p = [dic.setdefault("Chamidi1",-100),dic.setdefault("NipunaM1",-100),dic.setdefault("IsuruAp6",-100),dic.setdefault("UoM_Wireless1",-100),dic.setdefault("UNIC-wifi11",-100)] p=list(map(int,p)) print("p",p) # Making Predictions y_pred = model.predict([p]) person = 0 if y_pred[0] == 1: person = 1 elif y_pred[0] == 2: person = 5 print(datetime.datetime.now()) print(str(person) + " person/s detected.") except Exception as e: print(e) # Load the model from disk filename = 'finalized_model.pkl' file = open(filename, 'rb') model = pickle.load(file) client = mqtt.Client() client.on_connect = on_connect client.on_message = on_message client.connect("iot.eclipse.org", 1883, 120) client.loop_forever()
Boom, sekarang Anda sudah memiliki pendeteksi orang lengkap menggunakan WiFi. Jika Anda masih membaca, ada baiknya untuk mengintip basis kodenya.
Selamat coding!!!