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.

  1. Pelajari tentang arsitektur dan konsepnya
  2. Pengambilan data + Mempercepat
  3. Melatih model dan hasil ML
  4. 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.

  1. Beberapa SSID tidak tersedia terus-menerus — jadi kami menghapus (kolom) sementara dan melanjutkan dengan SSID persisten.
  2. Lebih sedikit titik data — sekitar 350 contoh untuk setiap peristiwa, namun kami menggunakan augmentasi data.
  3. Beberapa bidang kosong — jadi kami mengisi bidang yang hilang dengan nilai serupa dari contoh lain.
  4. 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.

  1. Mesin Vektor Dukungan (SVM)
  2. Gaussian Naif Bayes (GaussianNB)
  3. Regresi Logistik Multilinear
  4. Pengklasifikasi Pohon Keputusan
  5. 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!!!