Spisu treści:

System bezpieczeństwa rozpoznawania twarzy w lodówce z Raspberry Pi: 7 kroków (ze zdjęciami)
System bezpieczeństwa rozpoznawania twarzy w lodówce z Raspberry Pi: 7 kroków (ze zdjęciami)

Wideo: System bezpieczeństwa rozpoznawania twarzy w lodówce z Raspberry Pi: 7 kroków (ze zdjęciami)

Wideo: System bezpieczeństwa rozpoznawania twarzy w lodówce z Raspberry Pi: 7 kroków (ze zdjęciami)
Wideo: Test Linux Deepin 20.5 FaceID - rozpoznawanie twarzy na laptopie HP, Screenshot OCR, Real hardware 2024, Lipiec
Anonim
Image
Image
System bezpieczeństwa rozpoznawania twarzy w lodówce z Raspberry Pi
System bezpieczeństwa rozpoznawania twarzy w lodówce z Raspberry Pi
System bezpieczeństwa rozpoznawania twarzy w lodówce z Raspberry Pi
System bezpieczeństwa rozpoznawania twarzy w lodówce z Raspberry Pi

Przeglądając internet odkryłem, że ceny systemów bezpieczeństwa wahają się od 150$ do 600$ i więcej, ale nie wszystkie rozwiązania (nawet te bardzo drogie) da się zintegrować z innymi inteligentnymi narzędziami w Twoim domu! Na przykład nie możesz ustawić kamery bezpieczeństwa przy drzwiach wejściowych, aby automatycznie otworzyła drzwi dla Ciebie lub Twoich znajomych!

Postanowiłem stworzyć proste, tanie i wydajne rozwiązanie, z którego możesz korzystać wszędzie! Istnieje wiele podręczników, jak tworzyć tanie i domowe systemy zabezpieczeń, jednak chcę pokazać naprawdę nietrywialne ich zastosowanie – system zabezpieczenia lodówki z rozpoznawaniem twarzy!

Jak to działa? Kamera IP umieszczona na górze lodówki, czujniki (dwa przyciski) wykrywają, kiedy osoba otwiera drzwi lodówki, po czym Raspberry Pi robi jej zdjęcie (kamerą IP), a następnie przesyła je do Microsoft Face API przeanalizować obraz i otrzymać imię osoby. Dzięki tym informacjom Raspberry Pi skanuje „listę dostępu”: jeśli dana osoba nie ma uprawnień dostępu do lodówki, Raspberry Pi powiadamia właściciela za pośrednictwem poczty e-mail, wiadomości tekstowej i Twittera! (Patrz zdjęcia powyżej)

Czemu? System pozwala kontrolować członków rodziny, zwłaszcza gdy są na diecie lub zmagają się z niejedzeniem po północy! Lub użyj go po prostu dla zabawy!

Co więcej, możesz ustawić kamerę przy drzwiach wejściowych i skonfigurować system tak, aby otwierał drzwi, gdy zbliżasz się do Ciebie, członków Twojej rodziny lub znajomych. A to nie koniec! Możliwości aplikacji są nieograniczone!

Zaczynajmy!

Krok 1: Przygotowanie

Przygotowanie
Przygotowanie

Będziesz potrzebować:

  • Raspberry Pi 3 (możesz korzystać ze starszych wersji, ale trzecia generacja ma Wi-Fi, więc jest to bardzo wygodne)
  • guziki
  • Przewody
  • Stary smartfon lub kamera Raspberry Pi

Pierwszą rzeczą, którą musisz zrobić, to skonfigurować Raspberry Pi. Szczegółowe instrukcje, jak to zrobić, znajdziesz tutaj i tutaj, ale omówimy najważniejsze kroki w tej instrukcji.

  1. Pobierz Win32 DiskImager stąd (jeśli używasz systemu Windows)
  2. Pobierz SD Formatter stąd
  3. Włóż kartę SD do komputera i sformatuj ją za pomocą SD Formatter
  4. Pobierz Raspbian Image stąd (wybierz "Raspbian Jessie with pixel")
  5. Uruchom Win32 DiskImager, wybierz kartę SD, określ ścieżkę do obrazu Raspbian, kliknij „Napisz”
  6. Włóż kartę SD do Raspberry Pi i włącz zasilanie!

Dodatkowo musisz skonfigurować Raspberry Pi, aby mieć dostęp do systemu przez SSH. W Internecie jest wiele instrukcji, możesz na przykład użyć tego lub podłączyć monitor i klawiaturę.

Teraz Twoje Pi jest skonfigurowane i możesz kontynuować!

Krok 2: Wykonanie czujnika

Tworzenie czujnika
Tworzenie czujnika
Tworzenie czujnika
Tworzenie czujnika
Tworzenie czujnika
Tworzenie czujnika

Opis kroku: W tym kroku wykonamy czujnik, który wykrywa kiedy osoba otwiera drzwi lodówki i aktywuje Raspberry Pi.

Aby to skonfigurować, potrzebujesz 2 przycisków, które pierwotnie przygotowałeś. Pierwszy przycisk będzie wykrywał otwarcie drzwi, drugi przycisk będzie wykrywał otwarcie drzwi do momentu, w którym robimy zdjęcie osobie.

  1. Przylutuj przewody do przycisków.
  2. Przymocuj pierwszy przycisk do drzwi lodówki tak, aby był wciskany, gdy drzwi są zamknięte (patrz obrazek powyżej)
  3. Drugi przycisk przymocuj do drzwi lodówki, jak pokazano na powyższym zdjęciu. Przycisk ten musi być zwalniany przez cały czas, z wyjątkiem sytuacji, gdy drzwi osiągną punkt, w którym system robi zdjęcie. Aby to ustawić, musisz coś przyczepić do lodówki, aby ten przycisk był wciśnięty, gdy drzwi są otwarte do pożądanego stopnia (patrz zdjęcia powyżej).
  4. Podłącz przewody z przycisków do Raspberry Pi: pierwszy przycisk do GPIO 23 i uziemienia, drugi przycisk do GPIO 24 i uziemienia (patrz schemat fritzowania).

Uwaga: używam wyprowadzeń BCM (nie płyty), więcej o różnicach przeczytaj tutaj.

Po połączeniu z Raspberry Pi przez SSH, aby uruchomić powłokę Pythona, wpisz terminal:

Python3

Jeśli podłączasz monitor i klawiaturę do Raspberry Pi, po prostu uruchom „Python 3 IDLE” z menu.

Następnym krokiem jest sprawienie, aby Raspberry Pi pracowało z przyciskami. Do pinów GPIO 23 i 24 dołączymy specjalne detektory, które będą nasłuchiwać zdarzenia „rising edge” i „falling edge” na tych pinach. W przypadku zdarzenia słuchacze wywołają zdefiniowane przez nas funkcje. „Zbocze wznoszące” oznacza, że przycisk został wciśnięty i teraz puszczony (pierwszy przycisk – drzwi są otwarte), „opadająca krawędź” oznacza, że przycisk został zwolniony i teraz naciśnięty (drugi przycisk – drzwi osiągnęły określony punkt). Więcej o funkcjonalności przycisków - tutaj.

Najpierw zaimportuj bibliotekę, która daje nam dostęp do pinów:

importuj RPi. GPIO jako GPIO

Teraz zdefiniuj specjalne funkcje, które będą wywoływane po wyzwoleniu zdarzenia:

def czujnik1(kanał): print(„czujnik 1 wyzwolony”)def czujnik2(kanał): print(„czujnik 2 wyzwolony)

Ustaw typ pinoutu:

GPIO.setmode(GPIO. BCM)

Skonfiguruj piny:

GPIO.setup(23, GPIO. IN, pull_up_down=GPIO. PUD_UP)GPIO.setup(24, GPIO. IN, pull_up_down=GPIO. PUD_UP)

Dołącz słuchaczy:

GPIO.add_event_detect(23, GPIO. RISING, callback=sensor1, bouncetime=300)GPIO.add_event_detect(24, GPIO. FALLING, callback=sensor2, bouncetime=300)

Teraz możesz to przetestować! Jeśli naciśniesz przycisk 1, zobaczysz komunikat na terminalu „sensor 1 triggered”, przycisk 2 wyświetli komunikat „sensor 2 triggered”.

Uwaga: Kiedy skończysz eksperymentować, nie zapomnij wywołać następującej funkcji: GPIO.cleanup().

Ustawmy jeszcze jedną funkcję, która jest wywoływana, gdy drzwi dotrą do punktu, w którym zrobimy zdjęcie! Możesz to zrobić sam lub skorzystać z mojej implementacji, którą załączam tutaj (sensor.py)

Uwaga: sensor.py służy tylko do celów testowych, pliki z pełną funkcjonalnością załączyłem do ostatniego kroku.

Krok 3: Skonfiguruj kamerę IP

Skonfiguruj kamerę IP
Skonfiguruj kamerę IP
Skonfiguruj kamerę IP
Skonfiguruj kamerę IP
Skonfiguruj kamerę IP
Skonfiguruj kamerę IP

Opis kroku: Teraz skonfigurujemy stary smartfon jako kamerę IP.

Używanie smartfona jako kamery IP odbywa się za pośrednictwem aplikacji. Istnieją różne aplikacje na Androida, iOS, Windows Phone, z których możesz korzystać. Wybrałem ten o nazwie „Kamera IP” dla Androida. Jest to bezpłatna aplikacja, którą można łatwo skonfigurować.

Uruchom aplikację, przejdź do „Preferencji wideo”, aby ustawić rozdzielczość zdjęć, które zapewni aplikacja. Następnie dotknij „Uruchom serwer” (pierwszy obraz powyżej). Na dole ekranu musisz zobaczyć adres IP kamery (patrz drugi obraz powyżej). W przeglądarce wpisz https://cam_ip_address/photo-j.webp

Na koniec przymocuj kamerę do lodówki (ostatni obrazek powyżej).

Krok 4: Face API

API twarzy
API twarzy

Opis kroku: W tym kroku omówimy Face API firmy Microsoft, które rozpoznaje twarze i identyfikuje osoby.

Microsoft Face API to usługa rozpoznawania twarzy, dzięki której możemy analizować zdjęcia i identyfikować na nich osoby.

Najpierw potrzebujesz konta Microsoft Azure. Jeśli go nie masz, możesz go utworzyć za darmo tutaj.

Po drugie, przejdź do https://portal.azure.com, kliknij "Nowy" po lewej stronie, wpisz w formularzu "Cognitive Services APIs", wybierz go i kliknij "Utwórz". Możesz też otworzyć ten link. Teraz musisz podać nazwę swojej usługi, wybrać rodzaj subskrypcji, typ API, którego potrzebujesz (w naszym przypadku jest to Face API), lokalizację, poziom cenowy, grupę zasobów i zaakceptować Warunki prawne (patrz zrzut ekranu dodany do tego kroku).

Po trzecie, kliknij „Wszystkie zasoby”, wybierz usługę Face API i zobacz statystyki użytkowania, dane uwierzytelniające itp.

Szczegóły API Face można znaleźć tutaj, podano przykłady w różnych językach programowania. Do tego projektu używamy Pythona. Możesz przeczytać dokumentację i stworzyć swój własny zestaw funkcjonalności lub skorzystać z dostarczonego tutaj (nie jest to pełny zestaw funkcjonalności dostarczonych przez Microsoft, tylko punkty, które są potrzebne dla tego projektu). Moje pliki Pythona są dołączone do tego kroku.

Przejdźmy do struktury pracy z Face API. Aby skorzystać z funkcji "Identyfikacja" musimy stworzyć bibliotekę osób, które za pomocą Face API będą rozpoznawać zdjęcia, które są robione przez aplikację. Aby go skonfigurować, wykonaj następujące czynności:

  1. Tworzyć grupę
  2. Dodaj osoby do tej grupy
  3. Dodaj twarze do tych osób
  4. Grupa pociągów
  5. Prześlij zdjęcie z osobą, którą chcesz zidentyfikować (należy podać zdjęcie i identyfikator grupy, w której usługa będzie szukać kandydatów)
  6. Wynik: W odpowiedzi otrzymasz listę kandydatów, którzy mogą znaleźć się na przesłanym przez Ciebie zdjęciu.

Stworzyłem trzy pliki o określonej funkcjonalności pozwalającej na pracę z grupami, pojedynczymi osobami i pojedynczymi zdjęciami:

  • PersonGroup.py - zawiera funkcje, które pozwalają: utworzyć grupę, uzyskać informacje o grupie, uzyskać listę wszystkich swoich grup, grupę trenować i uzyskać status szkolenia
  • Person.py - zawiera funkcje pozwalające: stworzyć osobę, uzyskać informacje o osobie, wyświetlić wszystkie osoby w określonej grupie, dodać twarze do określonej osoby
  • Face.py - zawiera funkcje, które pozwalają: wykryć twarz na obrazie, zidentyfikować osobę, uzyskać imię zidentyfikowanej osoby

W pliku o nazwie "recognition.py" udostępniam funkcje, które pozwalają sprawdzić, czy zdjęcie zawiera twarz i dodać twarze do określonej osoby (automatycznie dodaje twarz z wielu zdjęć z określonego folderu).

Pobierz plik dołączony do tego kroku, rozpakuj go, zmień globalną zmienną 'KEY' w tych trzech plikach: PersonGroup.py, Person.py i Face.py na swój własny klucz, który znajdziesz: portal.azure.com > wszystkie zasoby > usługa Face api (lub jak ją nazwałeś) > zakładka klawiszy. Możesz użyć dowolnego z dwóch kluczy.

Uwaga: tutaj będziemy trenować usługę Face API do rozpoznawania osób, więc poniższe czynności można wykonać z dowolnego komputera (Raspberry Pi nie jest do tego potrzebne) - zmiany są zapisywane na serwerze Microsoftu.

Po zmianie KEY, uruchom rozpoznawanie.py i wprowadź następującą komendę w powłoce Pythona:

PersonGroup.create("family", 'fff-fff')) // możesz użyć własnego imienia i identyfikatora

grupa printResJson(PersonGroup.getPersonGroup('fff-fff'))

Musisz zobaczyć dane o grupie, którą właśnie utworzyłeś. Teraz wpisz:

printResJson(Person.createPerson('fff-fff', 'imię osoby'))

Teraz masz identyfikator osoby. Utwórz folder ze zdjęciami tej osoby, aby wszystkie zdjęcia zawierały twarz tej osoby. Możesz użyć funkcji detectFaceOnImages w recognition.py, która pokazuje, na których zdjęciach wykryto twarz. Teraz uruchom polecenie:

addFacesToPerson('folder z obrazkami', 'ID osoby, którą otrzymałeś po poprzednim poleceniu', 'fff-fff')

Następnie musimy przeszkolić naszą obsługę wpisując:

PersonGroup.trainPersonGroup('fff-fff')printResJson(PersonGroup.getPersonGroupTrainingStatus('fff-fff'))

Teraz nasza grupa jest przeszkolona i gotowa do identyfikacji osoby.

Aby sprawdzić osobę na obrazku możesz:

Face.checkPerson(obraz, 'fff-fff')

W odpowiedzi otrzymasz listę kandydatów i prawdopodobieństwo, kto jest na zdjęciu.

Uwaga: za każdym razem, gdy dodajesz twarze do osoby lub osoby do grupy, musisz wyszkolić grupę!

Krok 5: Konfiguracja węzła czerwonego

Konfiguracja z czerwonym węzłem
Konfiguracja z czerwonym węzłem

Opis kroku: W tym kroku utworzymy przepływ Node-Red, który powiadomi Cię o naruszeniu dostępu do Twojej lodówki =)

Jeśli Twoje Raspberry Pi działa na Raspbian Jessie z listopada 2015 lub nowszej wersji, nie musisz instalować Node-Red, ponieważ jest już preinstalowany. Wystarczy go zaktualizować. Proszę skorzystać z instrukcji tutaj.

Teraz musimy zainstalować węzeł Twilio na Node-Red, abyśmy mogli wyzwolić wiadomość tekstową. Otwórz terminal i wpisz:

cd ~/.node-rednpm zainstaluj node-red-node-twilio

Więcej o węźle Twilio tutaj. Następnie uruchom Node-Red, wpisując w terminalu:

węzeł-czerwony

Następnie przejdź do: https://127.0.0.1:1880/ - jeśli otwierasz przeglądarkę na swoim Raspberry Pihttps://{raspberry_pi_ip}:1880/ - jeśli chcesz otworzyć edytor Node-Red z innego komputera

Aby poznać adres IP raspberry pi, skorzystaj z tej instrukcji.

Teraz musisz znaleźć węzeł Twilio na liście węzłów w edytorze Node-Red (zwykle pojawia się on po grupie „social”).

Czas stworzyć flow!

Uwaga: możesz użyć mojego przepływu dołączonego do tego kroku, ale nie zapomnij skonfigurować węzłów: e-mail, twitter i twilio. Przeczytaj o tym później.

Nasz przepływ zaczyna się od węzła "notify", który akceptuje żądanie POST z naszego programu głównego z pewnymi danymi o naruszeniu dostępu (przykład danych można znaleźć w węźle komentarza "o odbiorze obiektów"). Ten węzeł natychmiast odpowiada komunikatem "Ok", więc główny program wie, że dane zostały odebrane (przepływ: /notify > odpowiedź z Ok > odpowiedź). Zielony węzeł na dole o nazwie msg.payload służy do debugowania: jeśli coś nie działa, możesz go użyć.

Z pierwszego węzła (/notify) dane propagowane do „Tematu danych” i „Tematu obrazu”, gdzie dodano odpowiednio tematy „dane” i „obraz”.

W węźle "compile" otrzymujemy dane (które otrzymujemy w pierwszym kroku) z tematem "data" oraz obrazek z tematem "image" (obraz pochodzi z /home/pi/image.jpg). Te dwie wiadomości powinny być skompilowane w jeden obiekt, ale oba obiekty są odbierane w różnym czasie! Aby sobie z tym poradzić, użyjemy funkcji „kontekstu”, która pozwala nam przechowywać dane między wywołaniami funkcji.

Następnym krokiem jest sprawdzenie, czy osoba z naszej listy dostępowej czy nie jest obcą (węzeł checkConditions). W otrzymywanych przez nas danych znajduje się pole „trustedPerson”: „prawda” oznacza, że znamy tę osobę, ale naruszyła ona uprawnienia dostępu, „fałsz” oznacza, że jest to osoba obca.

Gdy wynik jest „prawdziwy” wysyłamy powiadomienie na twitter, twilio i e-mail; gdy wynik jest „fałszywy” - tylko e-mail i twilio. Tworzymy obiekt na e-mail z wiadomością, załączonym obrazkiem i tematem e-maila, obiekt na tilio z wiadomością. W przypadku Twittera dodajemy dane do obiektu, jeśli „trustedPerson” jest prawdziwe. Następnie wyślij te trzy obiekty do trzech różnych węzłów.

Uwaga: Jeśli następujący węzeł nie powinien otrzymać wiadomości, po prostu wysyłamy do niego "null".

Czas skonfigurować węzły do powiadamiania!

Twitter Dodaj węzeł „twitter” do przepływu. Otwórz go podwójnym kliknięciem. Kliknij ołówek obok „Identyfikatora Twittera”. Następnie kliknij „Kliknij tutaj, aby uwierzytelnić się za pomocą Twittera”. Wejdź na swoje konto na Twitterze i nadaj wymagane uprawnienia Node-Red.

EmailDodaj węzeł „e-mail” do przepływu. Jeśli nie korzystasz z Gmaila, musisz zmienić dane w następujących polach - „Serwer” i „Port” (możesz sprawdzić, którego serwera i portu należy użyć na stronach pomocy swojego agenta poczty e-mail), w przeciwnym razie nie zmieniaj tych pola.

  • Do > adres e-mail, na który będą wysyłane wiadomości
  • Identyfikator użytkownika > zaloguj się z adresu e-mail (może to samo, co pole „Do”)
  • Hasło > hasło z konta e-mail
  • Nazwa > nazwa dla tego węzła

Twilio Przejdź do https://www.twilio.com/try-twilio i zarejestruj konto. Sprawdź to. Wejdź na https://www.twilio.com/console. Kliknij na „Numery telefonów” (duża ikona #) i utwórz bezpłatny numer. Jeśli jesteś poza USA, musisz dodać uprawnienia GEO, przejdź do https://www.twilio.com/console/sms/settings/geo-pe… i dodaj swój kraj.

Teraz przejdź do edytora Node-Red, dodaj węzeł Twilio, kliknij go dwukrotnie, aby skonfigurować i wypełnić wszystkie pola:

  • Poświadczenia > Użyj lokalnych poświadczeń
  • Twilio > edytuj

    • Identyfikator SID konta > pobierz stąd
    • Od > wpisz wirtualny numer, który utworzyłeś
    • Token > pobierz stąd
    • Imię > Twilio
  • Wyjście > SMS
  • Do > Twój numer telefonu
  • Nazwa > nazwa tego węzła.

Kliknij Wdróż

Teraz Twój przepływ jest gotowy! Możesz to przetestować wysyłając żądanie POST z określonym obiektem!

Krok 6: Kompilacja całego projektu

Kompilacja całego projektu
Kompilacja całego projektu
Kompilacja całego projektu
Kompilacja całego projektu

Opis kroku: W tym kroku połączymy wszystkie części i sprawimy, że będą działać jako osobny system.

W tym kroku musisz:

  1. Skonfiguruj stary smartfon jako kamerę IP
  2. Mają działające czujniki
  3. Wyszkolony interfejs Microsoft Face API
  4. Skonfigurowany przepływ Node-Red

Teraz musimy ulepszyć kod, który napisaliśmy w kroku 2. Dokładniej funkcja process(), która jest wywoływana, gdy osoba otwiera drzwi. W tej funkcji wykonamy następujące czynności:

  1. Pobierz obraz z kamery ip i zapisz go w „/home/pi/” pod nazwą „image.jpg” (funkcja „fromIpCam” w pliku „getImage”)
  2. Pobierz imię i nazwisko osoby na tym obrazie (funkcja „checkPerson” w pliku „recognition”)
  3. Sprawdź uprawnienia dostępu dla tej osoby (funkcja „sprawdź” w pliku „dostęp”)
  4. Na podstawie wyniku funkcji „check” skomponuj wiadomość
  5. Wyślij skomponowaną wiadomość do Node-Red (funkcja „toNodeRed” w pliku „sendData”)

Uwaga: aby zobaczyć pełny kod wymienionych funkcji, pobierz plik zip dołączony do tego kroku.

O funkcji „fromIpCam”. Ta funkcja powoduje wysłanie żądania GET do kamery IP, uzyskanie w odpowiedzi wyostrzonego obrazu i zapisanie go na określonej przez Ciebie ścieżce. Do tej funkcji należy podać adres IP kamery.

O funkcji „checkPerson”. Funkcja pobiera jako parametry ścieżkę do zdjęcia i grupę, w której chcesz odszukać osobę ze zdjęcia. Po pierwsze, wykrywa twarz na dostarczonym obrazie (plik Face.py, funkcja „wykryj”). W odpowiedzi otrzymuje id, jeśli wykryto twarz. Następnie wywołuje funkcję „identyfikuj” (plik Face.py), która znajduje podobne osoby w określonej grupie. W odpowiedzi otrzymuje identyfikator osoby, jeśli osoba zostanie znaleziona. Następnie wywołujemy funkcję „osoba” (plik Person.py) z identyfikatorem osoby jako parametrem, funkcja „osoba” zwraca osobę o podanym identyfikatorze, otrzymujemy imię osoby i zwracamy ją.

O funkcji „sprawdź”. Funkcja ta jest umieszczona w pliku „dostęp”, gdzie również umieszcza „listę dostępu” jako zmienną globalną (możesz ją dowolnie modyfikować). Pobierając nazwisko osoby z poprzedniej funkcji, funkcja „sprawdź” porównuje tę osobę z listą dostępu i zwraca wynik.

Uwaga: pełny projekt jest dołączony do następnego kroku.

Krok 7: Wniosek

W tym kroku dołączyłem pełny projekt, który należy rozpakować i umieścić na swoim Raspberry Pi.

Aby uruchomić ten projekt, uruchom plik „main.py”.

Jeśli kontrolujesz Raspberry Pi przez SSH, musisz uruchomić dwa programy z jednej powłoki: program Pythona i Node-Red. Wpisz w terminalu:

węzeł-czerwony

Naciśnij „Ctrl + Z” i wpisz:

Oferty pracy

Widzisz proces Node-Red. Spójrz na identyfikator procesu i wpisz:

bg

Teraz Node-Red musi zacząć działać w tle. Następnie przejdź do katalogu ze swoim projektem i uruchom główny program:

python3 main.py

Uwaga: nie zapomnij zmienić KEY w plikach Pythona (krok 4) i poświadczeń w przepływie Node-Red (krok 5)

Gotowe! Twoja lodówka jest bezpieczna!

Mam nadzieję, że podobało ci się to nieustępliwe! Zapraszam do pozostawienia swoich myśli w komentarzach.

Będę wdzięczny, jeśli zagłosujesz na mój projekt =)

Dziękuję Ci!

Zalecana: