
Dzień dobry.
W nawiązaniu do mojej poprzedniej konstrukcji Link prezentuję kolejną wersję Luny.
Tym razem została uruchomiona w 100% na ESP32, mając za zadanie wypełnić założenia edge AI.
Poprzednia konstrukcja wykonywała obliczenia na dodatkowym urządzeniu (rpi), teraz wszystko wykorzystuje jedynie zasoby mikroprocesora.
Oprogramowanie oparte jest o bibliotekę TensorFlow Lite, co zmusiło mnie do przebudowania modelu sieci (zmniejszenie liczby neuronów).
Układ także lekko się zmienił ze względu na obsługę karty SD, część wyprowadzeń ESP32cam nakłada się z tymi od karty. ADS został podłączony do innych nóg.
System posiada webowy interfejs w formie dashboardu, z możliwością raportowania o zaistniałych zdarzeniach.
Odświeżanie wykresów co ok 5 sek, więc w zasadzie podgląd na bieżąco.
Model dla malucha
Niestety mikroprocesor ESP32 ma ograniczone zasoby względem "dużych braci" co zmusza do odpowiedniego nimi zarządzania.
Moja sieć musiała zostać drastycznie zmniejszona i mimo obaw o dokładność, udało mi się zredukować jej wielkość do 1208 neuronów,
zachowując przy tym przyzwoitą wykrywalność.
Code: dos
Luna zamiast poprzednio analizowanego zakresu 500 sek obecnie widzi tylko 32.
Powoduje to różnice w czasie wskazywania wykrytych urządzeń, czasem po prostu jest to za krótki okres żeby sklasyfikować nietypowy przebieg.
Na obecną chwilę testuje różne topologie warstw.
Zgodnie z podpowiedzią z poprzedniego tematu próbuję zastosować rekurencyjną sieć LSTM, na razie bez rezultatów - nie osiąga takiej dokładności jak obecna a dodatkowo mam trudności w zaimplementowaniu jej w tf Lite.
Trening - tylko dla dużych
Sieć trenuje na pc. Nie wiem czy da się to zrobić na ESP, obawiam się że to trwałoby dość długo...
Uczenie wykonałem w pythonie za pomocą poprzednio zbudowanej aplikacji i zbieranych próbek, ale jak się okazuje są za długie [500] i nie mieszczą się istotne dane w zakresie 32 sek.
Nie jestem w stanie ich przejrzeć i ponownie opisać, więc dodałem do oprogramowania funkcje zbierania nowych i ich zapisywania lokalnie.
Po rozpoczęciu tworzony jest plik z 32 próbkami po 32 wartości (zebrany jest pełny zakres co sekundę).

Próbki można zapisywać do istniejących lub dodać nową kategorię. Całość przechowywana jest na karcie SD dołączonej do układu.
Dla ułatwienia dodałem obługę ftp na mikroprocesorze co ułatwia pobieranie danych.
O taką paczkę można wzbogacić bazę dla Luny i ponownie ją przetrenować.
Dodałem także uploader gotowej sieci co ułatwia upgrade, wystarczy dostraczyć odpowiednio wygenerowany plik .bin (można to zrobić z poziomu pythona) a układ po restarcie uruchomi nową wersję.

Historia z prądem
Dane zapisuję co 120 sek w pliku csv - takie okienko wydaje się obecnie optymalne, może trochę za długie względem 32 sek bufora. Zobaczę po paru dniach, zależy mi na zminimalizowaniu logów.
Strona Luny posiada obecnie prosty system raportowania - wykres pokazujące powyżej zebrane dane.
Mam zamiar dodać filtrowanie po okresie, urządzeniu itp. Gdyby był jeszcze jakiś sql lub pandas na esp...
Poniżej screeny pokazujące historię:



Co dalej?
Z pewnością będę rozwijał zarówno soft układowy jaki i trenujący.
Zgodnie z poprzednimi sugestiami dodam protokół MQTT, na razie skupiłem sie na platformie do rozwoju technologii egde AI, co w zasadzie się udało.
Pracuje już nad kolejną wersją, jednak będzie to z gatunku wearable...
p.
Cool? Ranking DIY