Sztuczna inteligencja – wstęp do STM32Cube.AI i Keras

Sztuczna inteligencja to obszar wiedzy, który w ostatnich latach rozwija się bardzo prężnie i znajduje coraz szersze zastosowanie w praktyce. Myśląc o algorytmach uczenia maszynowego mamy często na myśli rozbudowane sieci neuronowe, które wymagają dużej mocy obliczeniowej opartej na dedykowanym wsparciu sprzętowym. Czy zastosowanie AI w przypadku niedużych mikrokontrolerów ma w ogóle sens? Na to pytanie postaram się odpowiedzieć w poniższym materiale.

Czym jest sztuczna inteligencja?

Mówiąc o robotach mamy na myśli poruszające się obiekty (kołowe, latające, kroczące), które wykonują pewien zakres zadań autonomicznie. W wizjach człowieka przedstawianych w literaturze od kilkudziesięciu, a nawet kilkuset lat, roboty miały być próbą stworzenia maszyny, która zachowywałaby się w analogiczny sposób jak człowiek, czyli sama podejmowała decyzje i uczyła się, jak się zachować w określonej sytuacji, na podstawie obserwacji otoczenia. W ten sposób pojawiła się wizja sztucznej inteligencji, czyli sposobu przetwarzania danych przez komputery, które miały zastąpić mózg człowieka.

Klasyczna sztuczna inteligencja (z ang. Artificial Intelligence, AI) opierała się na przekonaniu, że aby stworzyć „myślącą” maszynę, należy zdefiniować dostatecznie dużo algorytmów opisujących jej zachowanie. Podejście takie sprawdzało się w przypadku prostszych problemów, takich jak gra w szachy. Gdy jednak próbowano przejść do bardziej złożonych problemów, jak przetwarzanie obrazów czy rozpoznawanie mowy, dotychczasowe rozwiązania nie sprawdzały się. Przez wiele lat sztuczna inteligencja była traktowana jako ciekawostka, która nie znajduje praktycznego zastosowania. Dopiero zmiana podejścia do sposobu działania AI i wymyślenie uczenia maszynowego sprawiło, że rozwój sztucznej inteligencji nabrało tempa.

Uczenie maszynowe (Machine Learning, ML) to część sztucznej inteligencji, która wyróżnia się innym podejściem operowania na danych i sposobu ich przetwarzania niż klasyczne programowanie. Dotychczasowe metody opierały się na zasadzie, że człowiek dostarcza dane i algorytmy, według których dane należy przetworzyć, i uzyskuje w ten sposób odpowiedź. Nowe podejście bazowało na zmianie elementów wejściowych i wyjściowych – teraz człowiek powinien dostarczyć dane oraz odpowiedzi, a urządzenia ma za zadanie samodzielnie opracować algorytmy, według których najefektywniej dane będą przetwarzane tak, aby uzyskać żądany wynik. W ten sposób powstało pojęcia „trenowania” systemu uczenia i sieci neuronowych. Zmiana podejścia pozwoliła na efektywne zajęcie się m.in. problemem przetwarzania obrazów.

Czym jest zatem uczenie głębokie (Deep Learning, DL), o którym ostatnio najczęściej słyszymy w kontekście sztucznej inteligencji? Uczenie głębokie to obszar uczenia maszynowego, które wyróżnia się konstrukcją systemu przetwarzania danych (najczęściej mamy tu na myśli sieci neuronowe). W innych typach uczenia maszynowego mamy do czynienia z modelem składającym się jednej lub dwóch warstw. W kontekście uczenia głębokiego mówimy o wielowarstwowym modelu danych, który znalazł uznanie i zastosowanie w najnowszych algorytmach do rozpoznawania obrazów czy rozpoznawania mowy.

Zależność miedzy sztuczną inteligencją, uczeniem maszynowym i uczeniem głębokim dobrze obrazuje poniższa grafika.

Uczenie maszynowe a mikrokontrolery

Uczenie maszynowe, a w szczególności uczenie głębokie zajmuje się nie tylko wspomnianymi już problemami, jakimi jest przetwarzanie obrazów czy rozpoznawanie mowy, ale jest stosowane w wielu dziedzinach nauki, jak ekonomia czy nawet meteorologia, gdzie znajduje zastosowanie przy przetwarzaniu danych dotyczących zachowań rynków kapitałowych czy do przewidywania pogody. Obszary te wymagają obróbki ogromnych ilości danych, do czego niezbędna jest duża moc obliczeniowa. Jaki ma zatem sens używanie AI na niewielkich i wolnych (w porównaniu do komputerów) mikrokontrolerach STM32?

Aby odpowiedzieć sobie na to pytanie, należy zastanowić się do czego jest tak naprawdę moc obliczeniowa potrzebna. Proces uczenia się sieci neuronowej, który stanowi najważniejszą część decydującą o powodzeniu całego przedsięwzięcia, polega na wprowadzaniu dużej ilości danych wraz z oczekiwanymi wynikami, na podstawie których model dobiera wagi tak, aby osiągnąć jak najlepsze wyniki. Po dobraniu wag w celu rozwiązania problemu, na który nie znamy odpowiedzi, wprowadzamy już tylko konkretne dane wejściowe i czekamy na odpowiedź. Choć przy rozbudowanych problemach, gdzie sieci neuronowe są ogromne, proces rozwiązywania problemu przez nauczony model również może wymagać wielu obliczeń, jest ich już znacznie mniej, niż w trakcie dobierania wag. Rozsądnym rozwiązaniem wydaje się więc wykonanie procesu uczenia się na szybkim komputerze ze wsparcie sprzętowym, a następnie przeniesienie wytrenowanego modelu na słabszą platformę, na której wygodniej jest pobierać dane wejściowe np. ze względu na rozmiary, czy koszty. Na tym polega koncepcja użycia STM32Cube.AI.

Ekosystem AI dla STM32

Obecnie ekosystem STM32 dla sztucznej inteligencji składa się z dwóch elementów: NanoEdge AI Studio oraz pakietu STM32Cube.AI.

NanoEdge AI Studio to zestaw narzędzi w postaci aplikacji dostępnej na komputery z systemem Windows oraz Linux, która ma za zadanie w znaczący sposób uprościć proces tworzenia modelu do przetwarzania AI dla STM32. Nie wymaga od użytkownika praktycznie żadnej wiedzy z zakresu AI, budowy sieci i procesu trenowania. Generowanie modelu polega na wykonaniu kilku prostych kroków, które obejmują wybór rodzaju czujnika (dostępny jest dość szeroki zakres czujników, od akcelerometrów, przez czujniki prądu, Halla, po czujniki temperatury czy dźwięku), wprowadzenie danych w postaci pliku lub bezpośrednio z urządzenia przez port COM oraz uruchomieniu narzędzia, które dobiera najbardziej odpowiedni model do naszego rodzaju danych spośród milionów dostępnych w bazie. W ten sposób uzyskujemy gotową do wgrania na mikrokontroler bibliotekę statyczną, która pozwala wykryć anomalie w działaniu silników, wentylatorów, czy niepożądane drgania w urządzeniu. NanoEdge AI Studio pozwala w szybki sposób wygenerować model na podstawie małej ilości danych, który dzięki dostępnej bibliotece modeli będzie w stanie działać z bardzo dużą dokładnością. Niestety jest to narzędzie płatne (istnieje możliwość przetestowania za darmo za pomocą 2-tygodniowej licencji).

STM32Cube.AI (X-CUBE-AI) to pakiet STM32Cube rozszerzający możliwości STM32CubeMX o automatyczną konwersję wstępnie wytrenowanych algorytmów sztucznej inteligencji, w tym sieci neuronowych i klasycznych modeli uczenia maszynowego. STM32Cube.AI wymaga przygotowania modelu za pomocą innego narzędzia (wspiera modele wygenerowane przy pomocy Keras, TensorFlow Lite oraz frameworki, które mogą generować model w standardzie ONNX, czyli m.in. PyTorch™, Microsoft Cognitive Toolkit, MATLAB). Taki wytrenowany model jest optymalizowany pod kątem użycia w języku C, co umożliwia efektywne zastosowanie go na mikrokontrolerze. W porównaniu do NanoEdge AI Studio, STM32Cube.AI wymaga wiedzy z zakresu tworzenia i trenowania modeli uczenia maszynowego przy wykorzystaniu zewnętrznych narzędzi. Poza tym STM32Cube.AI wspiera tylko mikrokontrolery z rdzeniem ARM Cortex-M4, ARM Cortex-M7 oraz ARM Cortex-M33, a w przypadku NanoEdge otrzymujemy możliwość uruchamiania AI na wszystkich STM32. Niewątpliwą zaletą STM32Cube.AI jest jednak to, że jest darmowy.

Ze względu na koszty związane z zakupem licencji na NanoEdge AI Studio, w artykułach będę bazował na darmowym pakiecie STM32Cube.AI i tworzeniu modeli w bibliotece Keras. Jeżeli uda mi się wypróbować w jakiś sensowny sposób NanoEdge AI Studio w ramach okresu testowego, na pewno podzielę się wrażeniami na blogu.

Jak działa STM32Cube.AI

Krótki wstęp czym jest STM32Cube.AI mamy już za sobą. Teraz przejdźmy do tego, jak jest zbudowany pakiet i na czym polega działanie silnika X-CUBE-AI. Przedstawia to grafika zaczerpnięta z dokumentacji.

Jak wcześniej wspomniałem, STM32Cube.AI wymaga przygotowania modelu sieci neuronowej w jednym z wspieranych bibliotek. Wytrenowany model dostarczany jest do importera, który generuje reprezentację sieci neuronowej do dalszego przetwarzania. Proces ten ma za zadanie stworzyć reprezentację modelu sieci neuronowej, która będzie niezależna od platformy (PINNR, czyli platform-independent Neural Network Representation) . Ponieważ dostarczyć możemy model przygotowany za pomocą biblioteki Keras, TensorFlow lub w formacie ONNX, które różnią się budową, importer w tym miejscu konwertuje dostarczony model do formy łatwiejszej do przetwarzania w dalszym etapie.

Tak przygotowany model przekazywany jest do optymalizatora, który dąży do optymalizacji wykorzystania pamięci (RAM i ROM) w stosunku do czasu obliczeń. Etap ten jest wykonywany bez zestawu danych treningowych czy walidujących, co oznacza, że wynikowy model przygotowany do zastosowania na mikrokontrolerze może nieznacznie różnić się dokładnością. Poziom kompresji możemy konfigurować w zależności od potrzeb i ograniczeń pamięci w projekcie.

Po przeprowadzeniu optymalizacji mamy wygenerowane gotowe do użycia na mikrokontrolerze pliki z modelem sieci neuronowej. Przed uruchomieniem docelowej aplikacji warto jeszcze przeprowadzić walidację uzyskanego modelu, która pokaże nam, w jakim stopniu wyniki uzyskane na modelu oryginalnym i zoptymalizowanym różnią się od siebie.

Uruchamiając AI na STM32 musimy liczyć się z pewnymi ograniczeniami. Wytrenowany model może przyjmować na wejściu maksymalnie 4-wymiarowy tensor. Pozwala to jednak na przetwarzanie obrazów, co w przypadku uC oznacza mimo wszystko spore możliwości.

Warto wspomnieć jeszcze o jednej procedurze, którą udostępnia pakiet STM32Cube.AI. Istnieje możliwość przeprowadzenia procesu kwantyzacji, czyli konwersji wag i odchylenia oraz aktywacji z dokładnością zmiennoprzecinkowej (float 32-bitowy) do 8-bitowej precyzji. Pozwala to na uniknięcie ciągłej konwersji zmiennoprzecinkowej na 8-bitową i 8-bitowej na zmiennoprzecinkową w trakcie pracy, co prowadzi do zmniejszenia rozmiaru modelu przy jednoczesnej poprawie opóźnienia procesora i akceleratora sprzętowego przy niewielkim pogorszeniu dokładności. Możliwość kwantyzacji dostępna jest tylko z poziomu CLI (Command Line Interface).

Instalacja STM32Cube.AI

Instalacja pakietu STM32Cube.AI jest analogiczna do innych pakietów i bibliotek od ST. Najłatwiej ją wykonać za pomocą STM32CubeMX. Przechodzimy do zakładki Help i wybieramy Manage embedded software packages.

Następnie w zakładce STMicroelectronics wybieramy X-CUBE_AI i najnowszą wersję Artificial Intelligence (w momencie pisania artykułu 7.0.0).

Python i biblioteka Keras

Uruchomienie sieci neuronowej na mikrokontrolerze STM32 wymaga wcześniejszego przygotowania i wytrenowania. Proces ten, ze względu na potrzebne duże zasoby obliczeniowe, odbywa się na komputerze. Jest wiele możliwości przygotowania modelu sieci neuronowej, które współpracują z STM32Cube.AI. Ze względu na dużą popularność i dość łatwą obsługę w przykładach, które w najbliższym czasie będą pojawiały się na blogu, wykorzystamy bibliotekę Keras oraz język Python.

Keras to pakiet dedykowany do uczenia głębokiego, który umożliwia wygodne definiowanie i trenowanie dowolnych modeli sieci neuronowych. Może być uruchamiany zarówno na procesorach CPU, jak i GPU (wsparcie karty graficznej znacznie przyspiesza obliczenia). Ma wbudowaną obsługę sieci konwolucyjnych stosowanych przy przetwarzaniu obrazów, sieci rekurencyjnych dedykowanych do danych sekwencyjnych i sieci łączących oba typy. Keras ma przyjazny interfejsu użytkownika, dzięki czemu zyskał dużą popularność wśród osób zajmujących się uczeniem maszynowym.

Przed przystąpieniem do instalacji pakietu warto wspomnieć o kilku istotnych kwestiach związanych z jej użytkowaniem. Keras jest biblioteką funkcjonującą na poziomie modelu i zapewnia wysokopoziomowe funkcje służące do tworzenia modeli uczenia głębokiego. Do prawidłowej pracy wymagana jest jeszcze biblioteka, która będzie odpowiadała za wykonywanie niskopoziomowych działań na tensorach (wektorach, macierzach itd.). Keras jest w tym względzie dość elastyczny i może współpracować z jednym z popularnych bibliotek do obsługi tensorów: TensorFlow, Theano lub CNTK. My będziemy używali Keras w połączeniu z TensorFlow.

Jak zatem zainstalować i skonfigurować Pythona, Keras i TensorFlow do współpracy z STM32Cube.AI? Przedstawię tylko podstawową konfigurację i sposób instalacji pakietów w uproszczony sposób. W sieci możemy znaleźć wiele materiałów i poradników na ten temat, do których w razie problemów odsyłam.

Podstawą działania Keras jest to, że jest to pakiet dedykowany do języka Python. Musimy więc go zainstalować. Programistom, którzy zaczynają swoją przygodę z Pythonem, poleca się zainstalowanie Anaconda. Jest to dystrybucja Pythona przeznaczona do obliczeń naukowych, w tym uczenia maszynowego. Domyślnie instaluje wiele przydatnych bibliotek i narzędzi, dzięki czemu nie musimy ręcznie wszystkiego instalować np. NumPy, SciPy, PyQT. Wadą tego rozwiązania jest z pewnością znacznie większa ilość miejsca, jaką zajmie nam na dysku (instalowanych jest wiele pakietów, z których nie będziemy korzystać), w porównaniu z ręczną instalacją. Anaconda ma wbudowany również instalator pakietów Pythona, dzięki czemu możemy łatwo dodać potrzebne pakiety niedodane przy podstawowej instalacji. Domyślnie z Anaconda mamy do dyspozycji także edytory kodu, np. Jupyter Notebook, którego będę używał w przykładach. Instalator Anaconda można pobrać ze strony producenta.

Mając zainstalowaną dystrybucję Anaconda, musimy doinstalować pakiet TensorFlow i Keras. Musimy zwrócić tutaj uwagę na jedną istotną rzecz – domyślnie pakiety te zainstalują się nam w najnowszej dostępnej wersji. Mając na uwadze, że będziemy chcieli utworzony model zaimportować przez STM32Cube.AI, musimy zainstalować wersje Keras i TensorFlow kompatybilną z naszą wersją CubeAI. Dla wersji 7.0.0, kompatybilny jest pakiet Keras w wersji od 2.0 do 2.5.1. Możemy go zainstalować z poziomu Navigatora lub używając Anaconda Prompt (linia komend) np. :

conda install keras==2.4.3
conda install tensorflow==2.3.0

Aby używać Keras z wykorzystaniem GPU, powinniśmy dodatkowo zainstalować pakiet tensorflow-gpu.

W artykułach będę przedstawiał tylko podstawowe wiadomości dotyczące budowy i trenowania sieci neuronowych. Jeżeli chciałbyś pozwać bardziej szczegółową wiedzę, zachęcam do lektury książek, z których sam korzystam przy nauce ML i DL. W szczególności polecam dwie pozycje:

  • „Deep Learning. Praca z językiem Python i biblioteką Keras”, Francois Chollet – wiedza wytłumaczona w bardzo przystępny sposób. Bardzo dobrze opisana biblioteka Keras i najczęściej używane typy sieci neuronowych.
  • „Uczenie głębokie od zera. Podstawy implementacji w Pythonie”, Seth Weidman – nie dotyczy konkretnie pakietu Keras, ale przedstawia, jak zbudowane są sieci od podstaw. Dla osób które już trochę znają podstawy ML, a chciałyby poznać je od podszewki i lepiej zrozumieć ich działanie.

Czym zajmiemy się dalej

W artykule przedstawiłem podstawy wiedzy dotyczącej sztucznej inteligencji, STM32Cube.AI oraz Keras, czyli narzędzi które pozwolą nam uruchomić sztuczne sieci neuronowe na mikrokontrolerach STM32. W kolejnych artykułach będę chciał przedstawić podstawowe problemy, jakimi zajmuje się aktualnie uczenie maszynowe i sposób ich zastosowanie w przypadku mikrokontrolerów. Tematyka obejmie takie zagadnienia, jak przetwarzanie ciągów danych z czujników, rozpoznawanie głosu oraz przetwarzanie obrazów. Każdy z tematów będzie obejmował przygotowanie danych treningowych i modelu za pomocą biblioteki Keras, ale przede wszystkim przykłady użycia na STM32. W międzyczasie będę chciał także przedstawić narzędzia poboczne, jakie oferuje STM32Cube.AI.

Komentarz

  1. Super temat. Cieszę się, że się go podjąłeś i nie mogę się doczekać kolejnych wpisów.
    Czy AI jest używane przez Ciebie w pracy, czy zająłeś się nim z własnej ciekawości?

    1. Dziękuję. Nie, w pracy akurat AI jeszcze nie wykorzystywałem. Temat ten ciekawi mnie hobbystycznie i od jakiegoś czasu się nim zajmuję w wolnej chwili.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *