머신러닝과 와이파이 정보를 이용한 실내 위치 예측

13887 단어 nodemachinelearning
(원래 공유된 게시물my blog )

whereami 이라는 Python 프로젝트를 시도한 후 JavaScript에서 복제하려고 시간을 보냈습니다.

패키지의 목적은 와이파이 정보와 기계 학습을 사용하여 실내 위치를 예측하는 것입니다.

사용자는 먼저 각 위치에 대한 일부 훈련 데이터를 기록해야 하며 그런 다음 랜덤 포레스트 분류기가 이 데이터를 사용하여 사용자의 현재 위치를 예측합니다.

내가 만든 패키지 whereami.jsnode-wifirandom-forest-classifier 에 의존합니다.

기록 데이터



데이터를 기록하기 위해 node-wifi 모듈은 주변 네트워크를 스캔하고 많은 정보를 반환합니다.

networks = [
    {
        ssid: '...',
        bssid: '...',
        mac: '...', // equals to bssid (for retrocompatibility)
        channel: <number>,
        frequency: <number>, // in MHz
        signal_level: <number>, // in dB
        quality: <number>, // same as signal level but in %
        security: 'WPA WPA2' // format depending on locale for open networks in Windows
        security_flags: '...' // encryption protocols (format currently depending of the OS)
        mode: '...' // network mode like Infra (format currently depending of the OS)
    },
    ...
];


이 특정 프로젝트의 경우 주로 네트워크 ssid, bssid 및 해당 품질을 유지해야 합니다.
라우터에서 멀어질수록 연결 품질은 낮아지고 가까울수록 높아집니다. 따라서 감지된 모든 주변 네트워크에서 품질 데이터를 수집하여 이 정보를 사용하여 분류기를 훈련하고 실내 위치를 예측할 수 있습니다.

네트워크를 스캔하고 필요한 정보를 보관한 후 위치를 파일 이름으로 하여 JSON 파일에 저장합니다.
파일의 데이터는 다음과 같습니다.

// kitchen.json
[
  {
    "Fake wifi1 14:0c:76:7a:68:90": 12,
    "Fake wifi2 48:4a:e9:05:a2:72": 14,
    "Fake wifi3 48:4a:e9:05:a2:71": 14,
    "Fake wifi4 68:a3:78:6d:a3:20": 18,
    "Fake wifi5 00:07:cb:71:54:35": 18,
    "Fake wifi6 cc:2d:1b:61:18:f5": 24,
    "Fake wifi7 e8:1d:a8:0c:62:7c": 40,
    "Fake wifi8 7a:8a:20:b4:f1:28": 58,
    "Fake wifi9 78:8a:20:b4:f1:28": 60,
    "Fake wifi10 e8:1d:a8:0c:62:78": 80,
    "Fake wifi11 e8:1d:a8:0c:5b:c8": 116,
    "Fake wifi12 e8:1d:a8:0c:5b:cc": 102,
  },
  ...
];


내 프로젝트의 목적을 위해 각 위치에 대해 더 많은 교육 데이터를 수집하기 위해 네트워크를 5번 스캔하고 있습니다.

데이터가 여러 위치에 대해 기록되면 랜덤 포레스트 분류기를 사용하여 현재 위치를 예측합니다.

포맷팅



기록과 예측 사이에 데이터 형식을 지정해야 합니다.

예측의 정확도를 높이려면 훈련 데이터 개체에 있는 네트워크가 모든 훈련 세션 간에, 그리고 예측할 실시간 데이터를 기록할 때에도 동일한지 확인해야 합니다.

한 방을 교육할 때 네트워크가 있었지만 다른 방을 교육할 때 찾을 수 없는 경우 이 데이터를 사용하면 안 됩니다.

학습 데이터를 정리하기 위해 라이브 데이터를 참조로 사용하고 모든 객체에 존재하지 않는 네트워크를 필터링하기로 결정했습니다.
필터링된 데이터가 있으면 각 개체를 사전순으로 정렬하고 새 키/값 데이터 쌍을 추가하여 방을 나타냅니다.

결국 학습 데이터는 다음과 같습니다.

[
  {
    "Fake wifi1 e8:1d:a8:0c:5b:c8": 114,
    "Fake wifi2 e8:1d:a8:0c:5b:cc": 102,
    "Fake wifi3 e8:1d:a8:0c:62:78": 80,
    "Fake wifi4 e8:1d:a8:0c:62:7c": 40,
    "Fake wifi5 cc:2d:1b:61:18:f5": 26,
    "Fake wifi6 48:4a:e9:05:a2:72": 14,
    room: 0,
  },
  ...
  {
    "Fake wifi1 e8:1d:a8:0c:5b:c8": 116,
    "Fake wifi2 e8:1d:a8:0c:5b:cc": 102,
    "Fake wifi3 e8:1d:a8:0c:62:78": 80,
    "Fake wifi4 e8:1d:a8:0c:62:7c": 40,
    "Fake wifi5 cc:2d:1b:61:18:f5": 24,
    "Fake wifi6 48:4a:e9:05:a2:72": 14,
    room: 1,
  },
  ...
  {
    "Fake wifi1 e8:1d:a8:0c:5b:c8": 114,
    "Fake wifi2 e8:1d:a8:0c:5b:cc": 104,
    "Fake wifi3 e8:1d:a8:0c:62:78": 80,
    "Fake wifi4 e8:1d:a8:0c:62:7c": 42,
    "Fake wifi5 cc:2d:1b:61:18:f5": 24,
    "Fake wifi6 48:4a:e9:05:a2:72": 18,
    room: 2,
  },
  ...
];


훈련 데이터가 준비되었으므로 라이브 데이터 예측으로 넘어갈 수 있습니다.

예측



내가 사용하고 있는 분류기는 random-forest-classifier 모듈을 사용하는 랜덤 포레스트 분류기입니다. 예측 실행은 다음 코드로 수행됩니다.

var rf = new RandomForestClassifier({
  n_estimators: 10,
});

const classes = ["bedroom", "bathroom", "kitchen"];

rf.fit(trainingData, null, "room", function(err, trees) {
  var pred = rf.predict([formattedLiveData], trees);
  return classes[pred[0]]; // the room predicted.
});

fit 함수의 첫 번째 인수는 형식화된 교육 데이터이고 두 번째 인수는 사용된 기능이며 교육 개체의 모든 기능을 사용하도록 전달합니다null. 일부 속성만 사용하고 다른 속성은 사용하지 않으려면 이러한 속성의 배열을 전달합니다.
세 번째 인수는 대상 기능, 예측하려는 방입니다.

콜백에서 predict 함수를 호출하여 형식이 지정된 라이브 데이터를 전달합니다. 이는 훈련 데이터 세트에 3개의 방이 있으므로 예측된 ​​방의 값(이 경우 0, 1 또는 2)을 반환합니다.
마지막으로 예측된 ​​방의 이름을 반환합니다.



애플리케이션



궁극적으로 저는 이러한 종류의 도구를 사용하여 IoT 프로젝트를 구축할 수 있기를 바랍니다.

우리가 대부분 가지고 있는 휴대폰에서 비슷한 것을 실행할 수 있다면 실내 위치를 예측하여 기기나 인터페이스를 제어하는 ​​데 사용할 수 있습니다.

예를 들어, 누군가가 집을 돌아다니면 조명을 켜거나 끌 수 있고, 거실을 나갈 때 TV를 일시 중지할 수 있으며, 침실에 있으면 밤에 전화 알림을 자동으로 음소거할 수 있습니다.

현재 이것은 빌드된 방식대로 모바일에서 실행할 수 없으며 브라우저에서 실행되는 네트워크 API는 클라이언트 측에서 유사한 것을 빌드할 수 있는 충분한 정보를 제공하지 않습니다.
그러나 RaspberryPi에서 실행될 수 있으므로 이것을 테스트하기 위해 일종의 작은 웨어러블을 만들 수 있습니다.

지금은 그게 다야! 🙂

좋은 웹페이지 즐겨찾기