Skocz do zawartości

Przeszukaj forum

Pokazywanie wyników dla tagów 'Sieci'.

  • Szukaj wg tagów

    Wpisz tagi, oddzielając przecinkami.
  • Szukaj wg autora

Typ zawartości


Kategorie forum

  • Elektronika i programowanie
    • Elektronika
    • Arduino i ESP
    • Mikrokontrolery
    • Raspberry Pi
    • Inne komputery jednopłytkowe
    • Układy programowalne
    • Programowanie
    • Zasilanie
  • Artykuły, projekty, DIY
    • Artykuły redakcji (blog)
    • Artykuły użytkowników
    • Projekty - DIY
    • Projekty - DIY roboty
    • Projekty - DIY (mini)
    • Projekty - DIY (początkujący)
    • Projekty - DIY w budowie (worklogi)
    • Wiadomości
  • Pozostałe
    • Oprogramowanie CAD
    • Druk 3D
    • Napędy
    • Mechanika
    • Zawody/Konkursy/Wydarzenia
    • Sprzedam/Kupię/Zamienię/Praca
    • Inne
  • Ogólne
    • Ogłoszenia organizacyjne
    • Dyskusje o FORBOT.pl
    • Na luzie

Kategorie

  • Quizy o elektronice
  • Quizy do kursu elektroniki I
  • Quizy do kursu elektroniki II
  • Quizy do kursów Arduino
  • Quizy do kursu STM32L4
  • Quizy do pozostałych kursów

Szukaj wyników w...

Znajdź wyniki, które zawierają...


Data utworzenia

  • Rozpocznij

    Koniec


Ostatnia aktualizacja

  • Rozpocznij

    Koniec


Filtruj po ilości...

Data dołączenia

  • Rozpocznij

    Koniec


Grupa


Imię


Strona

Znaleziono 3 wyniki

  1. Wstęp Jesteś na wakacjach albo posiadasz dwa mieszkania i bardzo chcesz podejrzeć wykresy z grafany, sprawdzić temperaturę w mieszkaniu czy zdalnie sterować światłem przez domoticz. Napotykasz pewien problem. Twoje urządzenia działają w twojej sieci domowej, nie masz możliwości bezpośredniego połączenia się z internetu. Możemy rozwiązać ten problem, odpowiednio konfigurując swoje urządzenia sieciowe, jednak to rozwiązanie ma wiele wad. Wystawienie swoich urządzeń IoT bezpośrednio do internetu może narazić je na ataki internetowe. W dzisiejszych czasach nie jest to niczym dziwnym. Przekonał się o tym chyba każdy kto udostępnił usługę SSH, a już po paru minutach mógł zobaczyć setki prób logowania z egzotycznych adresów IP w swoim /var/log/auth.log. Istnieje wiele metod zabezpieczeń tak wystawionych usług od stosowania trudnych haseł po wysyłanie serii pakietów na odpowiednie kombinacje portów sieciowych w celu autoryzacji (Port knocking) Wirtualna sieć prywatna Otwieranie portów do internetu wydaje się złym pomysłem i tutaj z pomocą przychodzą nam wirtualne sieci prywatne (VPN). Możliwe, że kojarzysz VPN z usługami anonimizujących twoje działania w internecie. Jest to jedna z korzyści, które może posiadać sieć VPN, ale to nie na tej funkcji skupimy się w tym artykule. Ten artykuł bierze udział w naszym konkursie! 🔥 Na zwycięzców czekają karty podarunkowe Allegro, m.in.: 2000 zł, 1000 zł i 500 zł. Potrafisz napisać podobny poradnik? Opublikuj go na forum i zgłoś się do konkursu! Czekamy na ciekawe teksty związane z elektroniką i programowaniem. Sprawdź szczegóły » Sieci VPN umożliwiają połączenie naszych urządzeń w jedną sieć, niezależnie od tego, gdzie aktualnie znajduje się dane urządzenie. Byle by miało połączenie do głównego serwera. Rozwiązanie to doskonale sprawdza się od wielu lat w sieciach firmowych, gdzie pracownicy są w stanie bezpiecznie podłączyć się do firmowego serwera bezpośrednio ze swojego domu. Rozwiązanie to jednak jest trudne w konfiguracji i wymaga serwera centralnego z dobrym połączeniem sieciowym, który musi być dostępny z internetu. Więc czy istnieje darmowe rozwiązanie, które będzie zawierać wszystkie zalety sieci VPN, nie będzie wymagać dodatkowego serwera oraz jednocześnie będzie omijać wszystkie przeszkody w postaci braku publicznego adresu ip? Istnieje! VPN peer to peer. Tak p2p, technologia znana zapewne użytkownikom protokołu BitTorrent jednak tutaj wykorzystujemy go do zestawiania połączeń sieciowych. ZeroTier Jednym z tego typu usług jest otwartoźródłowa aplikacja na licencji BSL o nazwie ZeroTier. Umożliwia ona tworzenie zdecentralizowanych wirtualnych sieci, czyli takich, które nie wykorzystują żadnego serwera centralnego. Dzięki zastosowaniu szyfrowanego połączenia bezpośrednio między naszymi urządzeniami, omijamy potrzebę wymiany naszych pakietów przez serwer pośredniczący, dzięki czemu ten nie ogranicza nas swoją przepustowością sieci. Połączenie takie nie tylko jest bezpieczne, ale też zapewnia niskie opóźnienia, co może mieć kluczowe znaczenie, jeśli chcemy wykorzystać to rozwiązanie do zastosowań rozrywkowych jak granie w gry czy udostępnianie pulpitu zdalnego. Rejestracja Na początku musimy zarejestrować się w usłudze ZeroTier. Przechodzimy na adres Centrali ZeroTier oraz wypełniamy formularz kryjący się pod przyciskiem Register. Alternatywą jest zalogowanie się, korzystając z kont usług Google, Github lub Microsoft. Tworzenie nowej sieci Po zalogowaniu się do Centrali ZeroTier w zakładce Network klikamy na przycisk z napisem Create A Network. Natychmiastowo na liście sieci pojawi się nam nasza nowo utworzona sieć. Wyróżnić możemy Identyfikator składający się z liter i cyfr, losowa nazwa, aktualna podsieć i ilość urządzeń online i offline. Przechodzimy do konfiguracji klikając w ID naszej sieci na liście. W zakładce Settings -> Basic możemy ustawić nazwę (Name) oraz opis (Description) dla naszej sieci. Jest to zabieg mający na celu łatwiejszą identyfikację na liście sieci, jeśli byśmy posiadali ich więcej. Ustawienie Access Control ustawiamy na PRIVATE, dzięki czemu każdy nowy klient w naszej sieci będzie musiał zostać zaakceptowany ręcznie. Zapobiegnie to niechcianym intruzom. Zakładka Advanced zawiera ustawienia dotyczące adresacji naszej sieci. Pewnie zaawansowani administratorzy poczują się tutaj jak ryba w wodzie. Opcji jest wiele, możemy zarządzać wirtualnym routerem, dowolnie przypisywać prywatne adresy ip lub zdecydować się na statyczne adresowanie. Dla mniej zaawansowanym użytkowników zalecam tutaj ustawić tylko zakres adresów IPv4 Auto-Assign na taki, który nie koliduje z naszymi lokalnymi sieciami domowymi. Na potrzeby tego artykułu wybrałem 10.144.*.* Zakładka Members zawiera listę aktualnie podłączonych użytkowników. Lista na razie jest pusta. Wszystkie zmiany są zapisywane na bieżąco. Dodawanie urządzeń do sieci Na potrzeby tego artykułu zestawimy sieć prywatną między dwoma urządzeniami. Raspberry Pi 2 Komputer z systemem Windows 10 ZeroTier można również z powodzeniem stosować na urządzeniach mobilnych z systemem Android lub iOS. Wszystkie możliwe opcje znajdziemy na stronie producenta. Linux (Raspberry Pi) Instalacja ZeroTier na urządzeniach z systemem Linux jest bardzo prosta. Ogranicza się ona do wykonania jednej komendy. Procedura może się różnić w zależności od dystrybucji systemu. Na początku musimy się zalogować do swojego urządzenia i uruchomić terminal. Warto upewnić się, że nas system jest aktualny. W tym celu wpisujemy w konsoli: sudo apt update; sudo apt full-upgrade; sudo apt autoremove; Następnie upewniamy się, że posiadamy w systemie narzędzie Curl poleceniem sudo apt install curl ZeroTier instalujemy poleceniem curl -s https://install.zerotier.com | sudo bash Po poprawnie wykonanej instalacji zobaczymy komunikat *** Success! You are ZeroTier address [ f2a983da64 ]. Interakcja z aplikacją odbywa się poprzez polecenie zerotier-cli Aby uzyskać informacje o dostępnych opcjach wpisujemy zerotier-cli --help Dołączamy do naszej sieci poprzez polecenie join oraz ID naszej sieci. sudo zerotier-cli join 565799d8f6699d5b Windows W systemie operacyjnym Windows w celu instalacji udajemy się na stronę producenta. Pobieramy instalator, klikając w ikonkę naszego systemu. Instalator następnie uruchamiamy i przeprowadzamy instalację. W czasie instalacji możemy zostać zapytani o dodanie wyjątku do zapory sieciowej, zgadamy się. Po instalacji program jest dostępny na pasku zadań, interakcje z nim przeprowadzamy poprzez przyciśnięcie prawego klawisza myszy na jego ikonie. Aby dołączyć do naszej sieci wybieramy opcję Join Network… Następnie podajemy ID naszej sieci z Centrali ZeroTier, w moim przypadku jest to 565799d8f6699d5b. Zatwierdzamy przyciskiem Join. Autoryzacja Ostatnim krokiem jest autoryzacja nowo dodanych urządzeń w panelu zarządzania naszą siecią. W tym celu w zakładce Members zaznaczamy pozycję Auth? Dla tych urządzeń, którym chcemy zezwolić na dostęp do sieci. Odczytujemy również jaki adres IP został przyznany z puli. Po tej czynności pozostało nam już tylko przetestować połączenie. W tym celu wykonujemy polecenie ping w konsoli systemu Windows z docelowym IP naszego Raspberry Pi w sieci zerotier ping 10.144.214.244 W systemach linux sprawdzamy, czy jest widoczna wirtualna karta sieciowa za pomocą polecenia sudo ifconfig Jeśli karta nie jest widoczna, spróbuj zresetować urządzenie. Podsumowanie Tym oto sposobem stworzyliśmy darmową bezpieczną sieć wirtualną dla naszych urządzeń IoT. Instalując aplikację na telefonie, jesteś w stanie kontrolować swoje urządzenia domowe, tak samo jakbyś był podłączony do swojej lokalnej sieci wifi. A jeśli będziesz kiedyś chciał pograć z kolegą “po lanie” to masz już alternatywę dla Hamachi. 😉
  2. Witam serdecznie, Nie mam zbyt dużej wiedzy z sieci komputerowych, ale kiedyś chciałbym wystawić malinkę na świat. Możliwe, że są lepsze sposoby, lecz pragnę rozwiać swoje wątpliwości w tym. Przechodząc do rzeczy: Mam connectBoxa w UPC i nie mam wykupionego adresu publicznego. Nie znam infrastruktury sieci. Jeżeli wygląda ona tak, że mój connectBox jest urządzeniem mającym już adres zewnętrzny to sprawa jest dla mnie zrozumiała. Jednak wątpię w to, gdyż liczba domostw posiadająca internet w Polsce jest bardzo duża, więc podejrzewam, że mój connectBox nie jest routerem wychodzącym "na świat", lecz jedynie routerem, który jest połączony z tym routerem mającym adres publiczny. Czy jest to bardziej prawdopodobne? Załóżmy na chwilę, że tak jest. W takim razie musiałbym włączyć przekierowywanie portów na tym serwerze, do którego nie mam dostępu. Jest to dość dziwne, bo na stronie UPC można znaleźć informacje o przekierowywaniu portów. Zatem jeżeli tak by było to ta informacja byłaby bezużyteczna. Dodatkowo też, co w przypadku, gdy sąsiad z piętra niżej by też akurat chciał przekierowywać ruch na ten port, co ja? Jak sądzicie?
  3. SZTUCZNA INTELIGENCJA W SŁUŻBIE MOTORYZACJI Cz.1. (Trochę przydługi) Wstęp. Sztuczna inteligencja to ostatnio temat na topie. Wydaje się, że na dobre zostawiliśmy za sobą tzw. „wieki ciemne” , kiedy to, zaraz po wynalezieniu i udowodnieniu działania sieci neuronowych w końcówce lat ‘50 ubiegłego wieku, cała społeczność naukowców zniechęcona „fałszywymi obietnicami” uznała, że sieci, owszem działają, ale nie można ich nauczyć niczego pożytecznego i zgodnie zapomnieli o nich na paręnaście dobrych lat[1]. Dzisiaj nikogo nie trzeba przekonywać, że sieci działają, do tego w wielu przypadkach działają skuteczniej niż człowiek oraz inne „konwencjonalne” metody. Każdy z nas, chcąc nie chcąc, odczuwa działanie sztucznej inteligencji jeśli jest zalogowany na jakimkolwiek większym portalu społecznościowym. Sam niejednokrotnie byłem pełen podziwu dla algorytmów polecających w serwisach Youtube, czy Facebook. Akcjonariusze serwisów społecznościowych i instagramowe modelki pewnie się ze mną nie zgodzą, ale zawsze uważałem, że potencjał sztucznej inteligencji jest marnowany na algorytmy polecające albo upiększające zdjęcia. Jako inżynier transportu naturalnie widzę miejsce dla sieci neuronowych w transporcie motoryzacyjnym. Rynek pokazuje, że na pewno nie jestem w tym, ani jedyny, ani nawet pierwszy. Amerykański producent samochodów elektrycznych Tesla zdaje się być o krok od wypuszczenia na rynek całkowicie autonomicznego samochodu (Full Self-Driving) opartego w znacznej mierze na sieciach neuronowych, jednak również pozostali producenci aut z powodzeniem stosują rozwiązania sztucznej inteligencji w celu poprawienia bezpieczeństwa i komfortu jazdy (system monitorowania koncentracji kierowcy, system rozpoznawania znaków drogowych)[2]. Ten artykuł bierze udział w naszym konkursie! 🔥 Na zwycięzców czekają karty podarunkowe Allegro, m.in.: 2000 zł, 1000 zł i 500 zł. Potrafisz napisać podobny poradnik? Opublikuj go na forum i zgłoś się do konkursu! Czekamy na ciekawe teksty związane z elektroniką i programowaniem. Sprawdź szczegóły » Samochody autonomiczne to temat szalenie interesujący zarówno z punktu widzenia technicznego (duh!) jak i prawnego (w razie wypadku z winy pojazdu autonomicznego, kto powinien być pociągnięty do odpowiedzialności? Kierowca czy producent pojazdu?). Rozważania nad tymi zagadnieniami zachęciły mnie w końcu do podjęcia próby stworzenia własnego samochodu autonomicznego w małej skali (na razie 😉 ). Pojazdy autonomiczne do tego, aby odnaleźć siebie i innych uczestników ruchu drogowego w przestrzeni, wykorzystują różne technologie, a różnice między producentami są widoczne gołym okiem (sieć autonomicznych taksówek Waymo działających na terenie San Francisco wykorzystuje do nawigacji charakterystyczne, umiejscowione na dachach pojazdów LIDARy oraz bardzo dokładną mapę 3D terenu, tymczasem Tesla woli korzystać ze zwykłych kamer 2D i wspierać się sieciami neuronowymi). Cz.2. Założenia projektu, czyli co ja robię?! W czasie kiedy zaczynałem pracę nad tym projektem byłem już dobrze zaznajomiony z technikami analizy obrazu, biblioteką OpenCV i miałem jako-takie (podparte praktyką) pojęcie o sieciach neuronowych. Ponieważ byłem w tym czasie w trakcie lektury „Superinteligencji” Nicka Bostroma i moje myśli nieustannie krążyły w ogół sztucznej inteligencji, zacząłem się zastanawiać, czy to możliwe, żeby mój pojazd potrafił się poruszać po drodze wykorzystując TYLKO I WYŁĄCZNIE sieci neuronowe. Postanowiłem, że tworząc pojazd będę próbował używać sieci neuronowych do realizacji wszystkich założeń projektu, posiłkując się klasyczną analizą obrazu tylko w ostateczności, w sytuacji kiedy moje sieci polegną. Poniżej przedstawiam założenia projektu: pojazd do poruszania się ma wykorzystywać tylko kamery i sieci neuronowe, żadne inne sensory nie są dozwolone, pojazd ma poruszać się po narysowanej na ziemi 2-pasmowej drodze, pojazd na respektować zasadę ruchu prawostronnego, zjazd na przeciwległy pas uznawany jest jako błąd, pojazd ma stosować się do znaków drogowych i sygnalizacji świetlnej, pojazd ma mieć możliwość rozpoznawania pieszych, I na koniec zadanie z gwiazdką: pojazd ma posiadać możliwość przejazdu przez skrzyżowanie w dowolnym kierunku. W tym miejscu chciałbym dodać również, że moim zamiarem było osiągnięcie tego, nie nadwyrężając znacznie mojego budżetu. Do listy założeń wypada zatem dodać: osiągnąć powyższe minimalizując wydatki. Cz.3. Najmniej znaczy ZERO? Od początku wiedziałem, że bazą do projektu będzie robot, którego używałem zaczynając swoją przygodę z programowaniem Arduino, znany zapewne użytkownikom robot z kursu budowy robotów Forbot’a. Pozostał wybór kamer i komputera. Wahałem się między Jetsonem Nano, a Raspberry Pi, jednak urządzenia te nie należą do najtańszych, a trzeba też brać pod uwagę koszt kamery. Do głowy przyszła mi następująca myśli: "najmniej PLN to chyba będzie zero, prawda?". A gdyby tak wykorzystać stacjonarny komputer jako jednostkę obliczeniową i w jakiś sposób przesyłać obraz z kamery na pojeździe do komputera, a następnie odsyłać informacje o sterowaniu do jednostki wykonawczej, czyt. Arduino? A gdyby tak wykorzystać do tego smartfona? Pomysł spodobał mi się ze względu na to, że w razie porażki, nie wydałbym na projekt ani złotówki. Postanowiłem spróbować, mając z tyłu głowy, że w każdej chwili mogę zmienić podejście i dokonać zakupu mini komputera pokładowego. Pojazd użyty do projektu. Cz.4. Kontekst. Celem niniejszego artykułu (czy to nie powinno być w pierwszym akapicie?) jest ukazanie potęgi sieci neuronowych. Nie ma tu miejsca na szczegółowe opisywanie całego projektu. Niemniej jednak czytelnikom należy się wyjaśnienie, w jaki sposób doprowadziłem do tego, że mój pojazd jeździ i w jaki sposób komunikuje się z komputerem. Pozwolę sobie dokonać lakonicznego przedstawienia mojego systemu. Z chęcią dokładniej opiszę poszczególne elementy, jeśli artykuł będzie cieszył się dużym zainteresowaniem 🙂. Robot, którego używałem posiada 2 silniki napędzające niezależnie 2 przednie koła oraz jedno koło nienapędzane (typu kółko od wózka w super-markecie). Na pokładzie znajduje się telefon połączony kablem OTG-USB z Arduino. Pojazd nie ma osi skrętnej, mamy tu do czynienia ze sterowaniem typu "czołg" - jeśli chcemy wykonać skręt to jedno koło musi się kręcić wolniej od drugiego. Zainteresowanych budową robota odsyłam do kursu, jest bezpłatny. Teraz pora na tor sygnałowy. Na telefonie zainstalowana jest aplikacja do przesyłania obrazu typu ipwebcam, nazywa się DroidCam. Obraz jest przesyłany prosto z aplikacji do komputera za pośrednictwem sieci Wi-Fi (lokalnie). Na komputerze skrypt Pythona dokonuje analizy obrazu (każda klatka zostaje przepuszczona przez sieci, o czym opowiem w następnym rozdziale). Wyniki sieci są interpretowane i skrypt odsyła informację o sterowaniu na telefon, tym razem do specjalnej aplikacji w Javie (tą niestety musiałem napisać już sam) i dalej kablem USB do Arduino. Mikrokontroler podaje informacje na koła i jazda! Schemat toru sygnałowego. Cz.5. Sieć sieci nie równa. W końcu dochodzimy do sedna. Kiedy już miałem potrzebne narzędzia przyszła pora na tworzenie sieci i trening. Jest to etap nad którym spędziłem najwięcej czasu, eksperymentując z różnymi modelami sieci, optymizerami, rozważając sens zastosowania wstecznej propagacji błędów i tak dalej. W następnych akapitach chciałbym przedstawić moje osobiste odkrycie roku jakim jest biblioteka FastAi zbudowana na Pytorchu. Dla niezorientowanych spieszę z wyjaśnieniami. W świecie sieci neuronowych 90% użytkowników jako języka programowania używa Python’a. Dlaczego? Czy to ze względu na czytelność kodu, łatwość w programowaniu, intuicyjność? Czy może dlatego, że (całkiem przypadkiem) dwie największe biblioteki do uczenia maszynowego(TensorFlow i Pytorch) zostały napisane dla Pythona? W tym momencie ciężko powiedzieć, co było pierwsze, jajko czy kura? Jedno wiadomo na pewno, niska prędkość kompilacji i wykonywania kodu nie ma większego znaczenia w procesie trenowania sieci. Gorzej oczywiście z pracą w czasie rzeczywistym, ale należy pamiętać, że gotowe modele można konwertować i zaprzęgać do pracy w wielu innych językach. Rozpoczynając przygodę z sieciami neuronowymi zacząłem pracę z biblioteką TensorFlow (w tamtym czasie właśnie dla tej biblioteki w internecie było najwięcej informacji i tutoriali) i myślę, że wyrażę opinię wielu mówiąc, że było to doświadczenie nieprzyjemne. Jako, że o nieprzyjemnych rzeczach najlepiej nie mówić, wraz z nowym projektem zdecydowałem się na zmianę biblioteki na Pytorch (do zmiany nakłonił mnie również film na Youtubie w, którym szef ekipy od jazdy autonomicznej Tesli chwali się, że właśnie tej biblioteki używają). Odnośnie TensorFlow powiem tylko, że problemy jakie napotkałem próbując zainstalować tą bibliotekę na mojej maszynie powracają w koszmarach po dziś dzień. Ale co z tym FastAi? FastAi jest biblioteką zbudowaną na Pytorchu. Ułatwia korzystanie z Pytorch, dzięki niemu tworzenie i trenowanie sieci neuronowych staje się dziecinną igraszką. Każdemu, kto chce zacząć przygodę z sieciami neuronowymi, ale nie ma śmiałości polecam FastAi i serię tutoriali na Youtube współtwórcy tej biblioteki - Jeremy’ego Howarda. Dodatkową zaletą FastAi jest jej poziomowość. Można trenować naprawdę dobre modele, odpowiednio jedynie przygotowując dane i korzystając z gotowych ustawień, jednak wszystkie funkcje Pytorch są stale pod ręką. Jeszcze jedna pozytywna rzecz wynikła dla mnie z tego projektu. FastAi dosłownie wymusza pracowanie w Jupyter Notebooks, który zawsze z jakiegoś powodu mnie odstraszał. Teraz widzę, że jego używanie bywa uzasadnione, każdemu kto nie miał do czynienia z jupyterem polecam spróbowanie. Jest to świetne narzędzie dla eksperymentatorów (chwała wykonywaniu pojedynczych komórek kodu!). Minusy? FastAi działa tylko na Linuxie, ale kto jest zainteresowany sieciami z pewnością od dawna już korzysta z tego systemu operacyjnego. Cz.6. Sieć czy może sieci? Niemal od początku pracy miałem w głowie koncepcję na to w jaki sposób wykorzystać sieci, żeby sterować robotem. W realnej sytuacji (prawdziwy pojazd na prawdziwej drodze jako prawdziwy uczestnik prawdziwego ruchu drogowego) obraz z kamery/wielu kamer jest zapisywany razem z korespondującymi danymi o stanie pojazdu w tym o WIELKIEJ TRÓJCY do której należą: kąt skrętu kierownicą, stopień wciśnięcia pedału gazu, stopień wciśnięcia pedału hamulca. Potem wystarczy stworzyć model, który jako daną wejściową dostaje obraz z kamery, a wypluwa te trzy wartości. Proste prawda? Szkopuł w tym, że aby porządnie wytrenować sieć neuronową potrzeba dużej ilości danych. Sieci dosłownie żywią się danymi. Bez nich dają marne predykcje, choć są sposoby na poprawienie wyników sieci bez zwiększania ilości danych, ale o tym później. W realnej sytuacji (prawdziwy pojazd na prawdziwej drodze…) w celu zebrania danych do trenowania sieci wystarczy zapisywać normalne zachowania kierowców, jednak dla mnie oznaczało by to długie i mozolne jeżdżenie moim robotem po przygotowanym torze, a ciężko jest określić na początku, ile danych tak naprawdę potrzebuje sieć (chociaż z dużą pewnością można stwierdzić, że czym więcej tym lepiej 🙂 ). W dodatku wyniki sieci zależą oczywiście od jakości wprowadzonych danych, zatem musiałbym jeździć po torze bardzo precyzyjnie. Jeśli ktoś kiedykolwiek bawił się samochodem zdalnie sterowanym to wie, że precyzyjna jazda nie jest wcale taka łatwa. Musiał zatem istnieć jakiś sposób na zautomatyzowanie procesu zbierania danych. Ah, gdyby istniał taki samochód autonomiczny, który by zbierał te informacje… W końcu wpadłem na pomysł. Wykorzystałem odrobinę wiedzy z zakresu cyfrowej analizy obrazu, bibliotekę OpenCV i jedną dodatkową kamerę, którą umieściłem nad torem jazdy, tuż przy suficie. Na robocie przymocowałem zielony znacznik, który później wyodrębniłem na komputerze z tła. W Paint'cie narysowałem drogę po której ma się poruszać pojazd, i połączyłem te dwa obrazy. Miałem teraz współrzędne zielonego znacznika i niebieski tor. Z pomocą funkcji pointPolygonTest z OpenCV mogłem wyznaczyć odległość znacznika od najbliższego punktu na torze. Jeden warunek: tor musi stanowić zamknięty kształt. Mi to nawet było na rękę, dzięki temu pojazd mógł jeździć w kółko i zbierać dane. Teraz tylko prosty regulator PID i gotowe. Dla ułatwienia postanowiłem, że robot będzie jeździł ze stałą prędkością, więc zbierane dane miały postać: obraz z kamery w danym momencie oraz odchylenie znacznika od toru. Prosta sieć klasyfikująca. Wpada obraz z kamery (na GIF-ie poniżej dolny lewy róg), a wypada „odchylenie” od toru jazdy. Stworzyłem kilka wirtualnych "tras" na torze i zacząłem zbieranie danych. W międzyczasie rozregulowałem nieco PID, aby robot łapał trochę więcej skrajnych pozycji. Po godzinie jazdy uznałem, że mam wystarczająco danych do rozpoczęcia trenowania sieci (ostatecznie jeździłem nieco dłużej, w celu pobrania informacji o miejscach, w których robot mylił się najczęściej). Zbieranie danych. Cz.7. Można oszukiwać. Jak wspomniałem są sposoby na poprawienie wyników sieci bez zwiększania ilości danych. Jednym z nich jest tzw. „transfer learning” polegający na użyciu gotowego modelu sieci (w moim przypadku ResNet50), wytrenowanego na milionach zdjęć, którego skuteczność została udowodniona na „ogólnych” obiektach (odróżnia jabłko od gruszki, psa od kota) i dotrenowanie zaledwie kilku ostatnich warstw tak, żeby model lepiej odpowiadał na nasze dane. Przyspiesza to trenowanie i zwiększa dokładność predykcji. W trakcie pracy eksperymentowałem z różnymi gotowymi modelami jak i wieloma wartościami, głównie z wielkością zdjęcia (znacząco wpływa to na czas trenowania) jak i z ilością epok, typem optymizerów. Mimo, że zdarzało mi się zostawiać komputer włączony całą noc, a treningi trwały nieraz ponad 14 godzin, ostateczny model został wytrenowany w około 2 godziny (na karcie graficznej GTX 1660). Trenowanie modelu. Niektóre próby trwały ponad 14 godzin. Jak ze skutecznością predykcji? Zaledwie 60%. A jednak robot jeździ po torze prawie bezbłędnie. Jak to możliwe skoro 4 na 10 razy się myli? Kluczem nie jest w tym przypadku skuteczność, tylko skala błędu. W większości przypadków komputer popełniał bardzo niewielkie pomyłki, które nie miały wpływu na jazdę. Analizując zdjęcia jestem pod wrażeniem działania tego modelu, sam dla zabawy próbowałem odgadnąć jakie odchyły przypadają do jakich zdjęć. Poniżej przedstawiam kilka, spróbujcie odgadnąć sami (wartości od -15 do 15): Od lewej: 6,-11, 15 (pikseli odchyłu od idealnego toru jazdy). Kiedy przekonałem się, że robot jeździ po prostej drodze, nadszedł czas na coś bardziej skomplikowanego niż zwykła klasyfikacja obrazu(np.: na zdjęciu jest pies!) mianowicie na detekcję (np.: na zdjęciu jest pies i znajduje się on tutaj!). Wykorzystałem do tego system detekcji YOLO (You only look once) stworzony przez Josepha Redmona. YOLO znane jest w internecie z bardzo niskiego czasu detekcji (detekcja trwa dłużej niż klasyfikacja). Redmon udostępnia swój algorytm za darmo wraz z instrukcją jak trenować sieć pod detekcję własnych obiektów. Na początku próbowałem wykorzystać bazę zdjęć i etykiet Open Images Dataset, ale szybko przekonałem się, że lepiej zastosować własne zdjęcia. Nie pozostało mi nic innego jak odpalić program do etykiet (LabelImg) i ręcznie oznaczyć ok. 20 tyś zdjęć przedstawiających znaki drogowe, sygnalizację świetlną i pieszych. Zajęło to parę dni, ale było warto, wskaźnik detekcji poprawił się znacznie, głównie ze względu na to, że niektóre zdjęcia które zdecydowałem się oznaczać były bardzo niewyraźne, albo słońce świeciło bezpośrednio w kamerę, co odzwierciedlało prawdziwe sytuacje. Etykietowanie danych było mozolnym procesem, ale efekt był więcej niż zadowalający. Cz.8. Mądrzej, szybciej, lepiej. Ostatecznie projekt spełnił moje oczekiwania, muszę przyznać, że na początku nie spodziewałem się tak dobrych rezultatów. Finalnym potwierdzeniem działania robota powinien być przejazd po nieznanym torze. Dla utrudnienia tor testowy postanowiłem zrobić w innym kolorze (nie posiadał on również przerywanych linii), na dodatek w testowym przejeździe postarałem się, aby słońce świeciło w kamerę. Wyniki przejazdu można zobaczyć na załączonym GIF-ie 🙂 . Pozwoliłem sobie na zachowanie tajemnicy w kwestii przedstawionego na początku "zadania z gwiazdką" czyli jazdy przez skrzyżowanie. Dla dociekliwych na końcu artykułu umieściłem link do GitHuba, kto będzie chciał, dojdzie w jaki sposób realizuję to zadanie 🙂 . Jazda po nowym torze. Jest wiele sposobów na usprawnienie robota. Warto zaznaczyć, że czas przesyłu danych po Wi-Fi zajmuje niemal tyle samo czasu co detekcja i klasyfikacja. Umieszczenie algorytmów na komputerze pokładowym umożliwiłoby przetwarzanie większej ilości klatek na sekundę tym samym zwiększając dokładność i być może maksymalną prędkość pojazdu. Należy również zaznaczyć, że projekt był eksperymentem mającym na celu sprawdzenie możliwości sieci neuronowych i mam nadzieję, że nikt nie pomyśli, że neguję sens stosowania klasycznej analizy obrazu. Poniżej załączam film przedstawiający działanie robota. Aha, nie wspomniałem chyba, że można nim sterować za pomocą kierownicy komputerowej, która w trybie autonomicznym odzwierciedla ruchy pojazdu? Wystarczy nacisnąć przycisk na kierownicy i jesteśmy w trybie jazdy autonomicznej. Cały kod znajduje się na GitHubie. W razie niejasności służę pomocą, w przypadku dużego zainteresowania tematem chętnie stworzę bardziej szczegółowe wpisy. Pozdrawiam i zachęcam do dyskusji w komentarzach. Rafał [1] Bostrom, Nick. Superinteligencja. Wydawnictwo Helion 2016. ISBN 978-83-283-1934-9. [2] Zdaję sobie sprawę, że pojęcia "sieci neuronowe" i "sztuczna inteligencja" nie są tożsame, używam uproszczenia jako, że sieci stanowią jak na razie główny kierunek rozwoju SI.
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.