piotrdn 1 Napisano 13 marca Udostępnij Napisano 13 marca 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ć? Cytuj Link to post Share on other sites
Gieneq 1 785 14 marca Udostępnij 14 marca @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ć? Cytuj Link to post Share on other sites
FlyingDutch 844 14 marca Udostępnij 14 marca (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 14 marca przez FlyingDutch update Cytuj Link to post Share on other sites
piotrdn 1 14 marca Autor tematu Udostępnij 14 marca 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 Cytuj Link to post Share on other sites
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 1 785 15 marca Udostępnij 15 marca @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 Cytuj Link to post Share on other sites
piotrdn 1 15 marca Autor tematu Udostępnij 15 marca Przeglądałem ten artykuł, jednakże po jego przeczytaniu nie do końca jestem w stanie rozwiązać problem. Cytuj Link to post Share on other sites
Elvis 1 517 15 marca Udostępnij 15 marca 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 Cytuj Link to post Share on other sites
piotrdn 1 16 marca Autor tematu Udostępnij 16 marca @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. Cytuj Link to post Share on other sites
Elvis 1 517 18 marca Udostępnij 18 marca 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 Cytuj Link to post Share on other sites
piotrdn 1 19 marca Autor tematu Udostępnij 19 marca 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 Cytuj Link to post Share on other sites
FlyingDutch 844 20 marca Udostępnij 20 marca 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 Cytuj Link to post Share on other sites
Elvis 1 517 20 marca Udostępnij 20 marca @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. Cytuj Link to post Share on other sites
FlyingDutch 844 20 marca Udostępnij 20 marca 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 Cytuj Link to post Share on other sites
Pomocna odpowiedź
Dołącz do dyskusji, napisz odpowiedź!
Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!