piotrdn Napisano Marzec 13, 2022 Udostępnij Napisano Marzec 13, 2022 Cześć, Kompilator zwraca błąd opisany jako "Invalid Initializer". Wydaje mi się, że problem dotyczy niepoprawnych deklaracji zmiennych, które trafiają do funkcji: ai_sine_model_inputs_get AI_API_ENTRY ai_buffer* ai_sine_model_inputs_get(ai_handle network, ai_u16 *n_buffer) { if (network == AI_HANDLE_NULL) { network = (ai_handle)&AI_NET_OBJ_INSTANCE; ((ai_network *)network)->magic = AI_MAGIC_CONTEXT_TOKEN; } return ai_platform_inputs_get(network, n_buffer); } Zmienna AI_HANDLE_NULL jest definiowana w następujący spsób: #define AI_HANDLE_NULL AI_HANDLE_PTR(NULL) Natomiast NULL w ten sposób: #define NULL ((void *)0) Wywołanie tej funkcji następuje tutaj: AI_DEPRECATED #define AI_SINE_MODEL_IN \ ai_sine_model_inputs_get(AI_HANDLE_NULL, NULL) i to właśnie linia: ai_sine_model_inputs_get(AI_HANDLE_NULL, NULL) jest opatrzona błędem "Invalid initializer". Analogiczna sytuacja jest dla ai_sine_model_outputs_get(AI_HANDLE_NULL, NULL) AI_DEPRECATED #define AI_SINE_MODEL_OUT \ ai_sine_model_outputs_get(AI_HANDLE_NULL, NULL) Kompilator zgłasza także Info dla tych dwóch linii: ai_buffer ai_input[AI_SINE_MODEL_IN_NUM] = AI_SINE_MODEL_IN; ai_buffer ai_output[AI_SINE_MODEL_OUT_NUM] = AI_SINE_MODEL_OUT; Czy ktoś może spotkał się z podobną sytuacją? W jaki sposób to poprawić? Link do komentarza Share on other sites More sharing options...
Gieneq Marzec 14, 2022 Udostępnij Marzec 14, 2022 @piotrdn raczej Ci nie pomogę, bo chyba nie mam w tym doświadczenia. Czego się w ogóle tyczy ten kod? Możesz coś o tym napisać? Link do komentarza Share on other sites More sharing options...
FlyingDutch Marzec 14, 2022 Udostępnij Marzec 14, 2022 (edytowany) 14 godzin temu, piotrdn napisał: Cześć, Kompilator zwraca błąd opisany jako "Invalid Initializer". Wydaje mi się, że problem dotyczy niepoprawnych deklaracji zmiennych, które trafiają do funkcji: ai_sine_model_inputs_get AI_API_ENTRY ai_buffer* ai_sine_model_inputs_get(ai_handle network, ai_u16 *n_buffer) { if (network == AI_HANDLE_NULL) { network = (ai_handle)&AI_NET_OBJ_INSTANCE; ((ai_network *)network)->magic = AI_MAGIC_CONTEXT_TOKEN; } return ai_platform_inputs_get(network, n_buffer); } Zmienna AI_HANDLE_NULL jest definiowana w następujący spsób: #define AI_HANDLE_NULL AI_HANDLE_PTR(NULL) Natomiast NULL w ten sposób: #define NULL ((void *)0) Wywołanie tej funkcji następuje tutaj: AI_DEPRECATED #define AI_SINE_MODEL_IN \ ai_sine_model_inputs_get(AI_HANDLE_NULL, NULL) i to właśnie linia: ai_sine_model_inputs_get(AI_HANDLE_NULL, NULL) jest opatrzona błędem "Invalid initializer". Analogiczna sytuacja jest dla ai_sine_model_outputs_get(AI_HANDLE_NULL, NULL) AI_DEPRECATED #define AI_SINE_MODEL_OUT \ ai_sine_model_outputs_get(AI_HANDLE_NULL, NULL) Czy ktoś może spotkał się z podobną sytuacją? W jaki sposób to poprawić? Cześć, dziwny wydaje mi się pomysł przekazywania null pointer na uchwyt jakiejś większej struktury, szczególnie, że funkcja ma zwracać wskaźnik na bufor. Może najpierw odpowiesz na pytanie dlaczego przekazujesz do funkcji pusty wskaźnik? Co prawda w takim wypadku, jest tworzony nowy uchwyt, ale podczas jego tworzenia coś idzie źle. Pozdrawiam Edytowano Marzec 14, 2022 przez FlyingDutch update Link do komentarza Share on other sites More sharing options...
piotrdn Marzec 14, 2022 Autor tematu Udostępnij Marzec 14, 2022 Część, dzięki za odpowiedź. Temat dotyczy uruchomienia algorytmu AI na STM32 przy wykorzystaniu modułu X-CUBE-AI. Projekt został przedstawiony w tym artykule: https://www.digikey.pl/en/maker/projects/tinyml-getting-started-with-stm32-x-cube-ai/f94e1c8bfc1e4b6291d0f672d780d2c0 Chciałbym go odwzorować na STM32 L476RG. W załączniku przesyłam mój kod projektu. models.zip nucleo-l476_AI_v3.zip Link do komentarza Share on other sites More sharing options...
Polecacz 101 Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Produkcja i montaż PCB - wybierz sprawdzone PCBWay! • Darmowe płytki dla studentów i projektów non-profit • Tylko 5$ za 10 prototypów PCB w 24 godziny • Usługa projektowania PCB na zlecenie • Montaż PCB od 30$ + bezpłatna dostawa i szablony • Darmowe narzędzie do podglądu plików Gerber Zobacz również » Film z fabryki PCBWay
Gieneq Marzec 15, 2022 Udostępnij Marzec 15, 2022 @piotrdn na blogu jest coś w tym temacie, temat dla @Elvis https://forbot.pl/blog/sztuczna-inteligencja-na-stm32-przyklad-uzycia-x-cube-ai-id41588 Link do komentarza Share on other sites More sharing options...
piotrdn Marzec 15, 2022 Autor tematu Udostępnij Marzec 15, 2022 Przeglądałem ten artykuł, jednakże po jego przeczytaniu nie do końca jestem w stanie rozwiązać problem. Link do komentarza Share on other sites More sharing options...
Elvis Marzec 15, 2022 Udostępnij Marzec 15, 2022 Niestety nie wiem jak powstał ten kod, ani nie wiem o co w nim chodzi, więc pozostaje tylko zgadywanie. Pierwsze, co nie ma sensu to linie: //struktury wskazujące na dane in oraz out ai_buffer ai_input[char* AI_SINE_MODEL_IN_NUM] = AI_SINE_MODEL_IN; ai_buffer ai_output[char AI_SINE_MODEL_OUT_NUM] = AI_SINE_MODEL_OUT; //ai_buffer ai_input[1]; //ai_buffer ai_output[1]; Co miały robić "char*" i "char" w deklaracjach ai_input/ai_output ciężko się domyślić. Ale bez tych dziwnych wstawek, faktycznie pojawia się opisywany błąd "Invalid Initializer". Można go usunąć zmieniając kod na: //struktury wskazujące na dane in oraz out ai_buffer *ai_input = AI_SINE_MODEL_IN; ai_buffer *ai_output = AI_SINE_MODEL_OUT; //ai_buffer ai_input[1]; //ai_buffer ai_output[1]; Tylko czy to jest cokolwiek lepsze, ciężko powiedzieć... Kompilator i tak wyrzuci błąd przy liniach: ai_input[0].n_batches = 1; oraz ai_output[0].n_batches = 1; Mam niejasne wrażenie, że to jakiś kod utworzony przez generator, który jest łatany bez zrozumienia o co w nim chodzi... tak raczej nie da się napisać sensownego programu. No chyba że sztuczna inteligencja osiągnie na tyle wysoki poziom, że napisze program za użytkownika zamiast przykładowo niszczyć świat. Proponowałbym jakiś kurs podstaw programowania w C, może kurs Arduino? A zabawę w sztuczną inteligencję nieco później. 1 Link do komentarza Share on other sites More sharing options...
piotrdn Marzec 16, 2022 Autor tematu Udostępnij Marzec 16, 2022 @Elvis Dzięki za odpowiedź. Jako, że nie mam w języku C dużego doświadczenia, postanowiłem odwzorować projekt opisany na DigiKey (link wysłany wcześniej). W ten sposób chciałbym się dowiedzieć jak to wszystko powinno działać. Niestety nie udało się tego przenieść 1:1 na STM32L476. Być może mógłbyś zaproponować jakiś inny sposób na uruchomienie tego (być może jakiś prostszy, podobny do tego, który opisałeś w jednym ze swoich artykułów)? Myślę, że to może być ciekawy przykład edukacyjny i pewnie więcej czytelników mogłoby zainteresować się tematem. Sama sieć neuronowa jest dosyć prosta. Nie jest to przykład taki jak najczęściej można znaleźć w sieci (czyli wykrywanie jakiegoś wzorca, sekwencji itp). Tutaj sieć przyjmuje jedno wejście i zwraca nam jedno wyjście (przyjmujemy argument funkcji sinus i zwracamy wartość). Fajnie by było mieć możliwość uruchomienia tego na jakimś mikrokontrolerze. Link do komentarza Share on other sites More sharing options...
Elvis Marzec 18, 2022 Udostępnij Marzec 18, 2022 Przykład od DigiKey działa bez problemu na Nucleo-STM32L476. Trzeba tylko go poprawnie przeklikać i kod wygenerowany przez CubeMX kompiluje się bez problemu. Zmiany zamiast w pliku main.c łatwiej jest wprowadzać w pliku app_x-cube-ai.c, który jest generowany domyślne. W nim są zmienne ai_input oraz ai_output zadeklarowane jako wskaźniki (tak jak zgadywałem we wcześniejszym wpisie): static ai_buffer* ai_input; static ai_buffer* ai_output; Niestety jakość kodu z generatora jest koszmarna, ale kompiluje się i działa. Niestety bez znajomości języka C nie ma raczej szans poradzić sobie z tym projektem. Więc jak napisałem wcześniej, zachęcam do nauki podstaw. Natomiast samo AI można poćwiczyć bez STM32, wtedy jest nieco łatwiej. 2 Link do komentarza Share on other sites More sharing options...
piotrdn Marzec 19, 2022 Autor tematu Udostępnij Marzec 19, 2022 Problem rozwiązany. Przyczyną błędów była różnica w wersji modułu X-CUBE-AI. Przytoczony artykuł został wykonany w wersji 5.1, natomiast ja zastosowałem wersję 7, dlatego że starsza wersja niekoniecznie chce współpracować z chociażby nowszą wersją biblioteki Tensorflow. W nowszej wersji inaczej są kodowane niektóre struktury, np ai_buffer. Brakuje tam parametru n_batches. Różnic może być więcej. Początkowo projekt pisałem w PyCharm ale przeszedłem na Google colab. Nie trzeba przejmować się konfiguracją środowiska. Dzięki za wszystkie odpowiedzi. Pozdrawiam 🙂 1 Link do komentarza Share on other sites More sharing options...
FlyingDutch Marzec 20, 2022 Udostępnij Marzec 20, 2022 11 godzin temu, piotrdn napisał: Problem rozwiązany. Przyczyną błędów była różnica w wersji modułu X-CUBE-AI. Przytoczony artykuł został wykonany w wersji 5.1, natomiast ja zastosowałem wersję 7, dlatego że starsza wersja niekoniecznie chce współpracować z chociażby nowszą wersją biblioteki Tensorflow. W nowszej wersji inaczej są kodowane niektóre struktury, np ai_buffer. Brakuje tam parametru n_batches. Różnic może być więcej. Początkowo projekt pisałem w PyCharm ale przeszedłem na Google colab. Nie trzeba przejmować się konfiguracją środowiska. Dzięki za wszystkie odpowiedzi. Pozdrawiam 🙂 Cześć, fajnie, że udało się ustalić, co jest przyczyną błędów. Odnośnie środowiska to instalując "Anacondę" na lokalnym kompie też możemy korzystać z "Jupyter Notebook" i łatwo instalować nowe pakiety Pythona.Jako edytor (a właściwie IDE) u mnie dobrze się sprawdza także "PyScripter". Pozdrawiam 1 Link do komentarza Share on other sites More sharing options...
Elvis Marzec 20, 2022 Udostępnij Marzec 20, 2022 @FlyingDutch Na colabie też można instalować pakiety, a dodatkowo mamy dostęp do GPU w całkiem silnej konfiguracji - nie każdy może sobie na taki sprzęt pozwolić w lokalnym kompie. Link do komentarza Share on other sites More sharing options...
FlyingDutch Marzec 20, 2022 Udostępnij Marzec 20, 2022 1 minutę temu, Elvis napisał: @FlyingDutch Na colabie też można instalować pakiety, a dodatkowo mamy dostęp do GPU w całkiem silnej konfiguracji - nie każdy może sobie na taki sprzęt pozwolić w lokalnym kompie. Cześć @Elvis, wiem o tym, też korzystałem z "Google Colab" podczas pracy z Kerasem. Problem jest taki, że w fazie uczenia sieci neuronowej jest potrzeba przesyłania dużej ilości danych na to konto, a te dane są co dobę automatycznie usuwane. Pochłania to sporo czasu (transfer danych za pomocą sieci). Pozdrawiam Link do komentarza Share on other sites More sharing options...
Pomocna odpowiedź
Bądź aktywny - zaloguj się lub utwórz konto!
Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony
Utwórz konto w ~20 sekund!
Zarejestruj nowe konto, to proste!
Zarejestruj się »Zaloguj się
Posiadasz własne konto? Użyj go!
Zaloguj się »