This is an old revision of the document!


Facial Recognition Locker

Autor

Introducere

  • Metodele tradiționale de a obține accesul sunt metode de tipul “something you have” (descuierea ușii folosind o cheie) și “something you know” (parola propriului cont). Scopul proiectului este implementarea unei metode “something you are”, mai exact recunoașterea facială, oferind accesul fără necesitatea de a memora sau a deține un obiect anume.
  • Proiectul își propune controlarea unei încuietori electrice pe baza capturilor realizate de o camera atașată și a rezultatului dat de un server extern în urma procesării imaginilor.

Descriere generală

Ansamblul va avea atașată o cameră VGA ce va realiza capturi la apăsarea butonului. Imaginile vor fi trimise la un server extern folosind un modul Ethernet, unde acestea vor avea rol de input pentru modelul de recunoaștere facială implementat, urmând că răspunsul să fie transmis plăcuței Arduino. Microcontrolerul va putea atunci să acționeze asupra incuietoarei prin intermediul unui releu.
face_recognition_locker_diagram.jpg

Hardware Design

Piese necesare

  • Arduino UNO R3
  • Modul extern Ethernet
  • Cameră VGA
  • Modul releu 12V
  • Incuietoare electrică 12V
  • Push button
  • Cablu UTP
  • Rezistențe 2×4,7k, 2x10k
  • Conectori de pini
  • Placă PCB de prototipare

face_recognition_locker_hardware.jpgface_recognition_locker_front.jpgface_recognition_locker_back.jpg

Schema electrică

face_recognition_locker_schema_electrica.jpg
Inițial, proiectul își propusese să adauge un card SD pentru stocarea imaginilor și un numpad pentru o metodă alternativă de autentificare prin introducerea parolei, însă s-a renunțat la acestea din moment ce toți pinii pentru uz general au fost folosiți (camera necesită conectarea a 18 pini) și a fost necesară și remaparea pinilor.
Microcontroller-ul comunica cu shield-ul Ethernet prin pinii ICSP, fiind astfel necesară nefolosirea pinilor 10-13 (sunt conectați intern la pinii ICSP). Analog, pinii ȘCL și SDA corespund cu pinii A5, respectiv A4.
Pinii RX și TX sunt folosiți pentru buton și releu, la releu fiind de asemenea atașat un alimentator de 12V pentru încuietoare.

Software Design

Atât codul scris pentru plăcuța Arduino, cât și cel folosit pe server au fost urcate folosind git. Pentru programarea pe microcontroller s-a folosit Arduino IDE, iar pe server se găsește un script bash ce lansează 3 terminale care rulează în paralel script-uri Python.

Arduino IDE

Codul sursă se află în folder-ul “Ethernet_Camera”. Implementarea s-a început de la codul oferit de următorul ghid, care la rândul lui a folosit următoarea sursă. La apăsarea butonului, se va trimite un batch de 5 imagini, din moment ce unele imagini pot avea probleme de luminozitate sau poziționare.
La inițializare, se configurează pinul 6 ca și PWM clock pentru camera VGA și se configurează adresele MAC și IP, urmate de port-ul pentru transmiterea UDP. În urma testelor nu s-a observat o pierdere semnificativă a datelor în comparație cu protocolul TCP, UDP oferind totodată o viteză mai mare de transmitere a pachetelor.
Pe măsură ce se citesc pixelii, aceștia sunt salvați într-un buffer de dimensiune 1280 bytes (4 linii din imagine, a fost necesară optimizarea memoriei din moment ce SRAM-ul plăcuței Arduino are capacitate maximă de 2048 bytes), urmând a se transmite pachetul la umplerea acestuia. Microcontroller-ul va primi un pachet UDP în caz afirmativ, urmând să deschidă încuietoarea pentru 2 secunde.

Python

Prin rularea script-ului run.sh se lansează în execuție script-urile python3:

  • udp_server - șterge imaginile salvate anterior și preia datele de la microcontroller, salvându-le în format .txt în urma primirii unui fișier întreg
  • convert - preia datele din fișierul .txt, după care le scrie sub formă RGB și adaugă header-ul BMP, urmând să salveze rezultatul într-un fișier bmp
  • check_identity - compară encodarea imaginii bmp obținute cu encodarea imaginii de referință folosind librăria “face_recognition”. Dacă funcția returnează True, script-ul va trimite pachete UDP pentru batch-ul curent de imagini. Script-ul poate fi dezvoltat să compare captura cu mai multe imagini de referință pentru a oferi acces mai multor persoane.

Rezultate Obținute

În prima jumătate a execuției din demo, s-au obținut imaginile (primele 5):

Avand ca imagine de referinta ultima captura din set, programul a returnat valorile False, True, False, True, respectiv True, dupa care incuietoarea se deschide. Se observa o “shiftare” sau decupare a pozelor (posibil un bug la sincronizare), insa din moment ce se realizeaza 5 capturi iar “shiftarea” pare uniforma, nu este afectat rezultatul final (cel putin intr-o imagine se gaseste fata intreaga). Dupa boot-are, primele 2-3 poze ies intotdeauna cu luminozitate crescuta, dupa care se stabilizeaza si restul pozelor au un rezultat normal, obtinandu-se o corectitudine consistenta.
In a doua jumatate a demo-ului, se testeaza cazul negativ prin capturarea unor imagini ce nu contin nicio fata, si prin urmare incuietoarea nu se deschide.

Concluzii

Utilizarea unei camere pe un Arduino Uno R3 este un bun exemplu de testare a limitelor acestui microcontroller. Atat numarul de pini cat si memoria SRAM au fost utilizate aproape la maxim, aducand dificultati in implementare pe partea de optimizare si remapare a pinilor. Au existat conflicte in utilizarea pinilor din moment ce shield-ul Ethernet necesita ca pinii 10-13 sa fie neutilizati, iar schema originala a camerei se folosea partial de acesti pini. Proiectul si-a atins scopul propus, insa ar putea fi imbunatatit in cateva puncte in conditia in care se utilizeaza un microcontroller cu mai multe resurse:

  • sistemul de lock are cateva vulnerabilitati. Pentru a nu permite accesul unei persoane care detine o poza cu proprietarul, serverul ar putea face autentificarea folosindu-se de mai multe poze in diverse pozitii sau de o filmare. De asemenea, semnalul trimis pentru deschiderea incuietorii ar trebui sa contina o masura de securitate. In momentul de fata, daca un atacator se poate conecta la reteaua locala si alfa adresa IP si portul microcontroller-ului, acesta poate trimite orice pachet UDP pentru descuiere
  • se pot adauga mai multe functionalitati, precum autentificarea printr-o parola introdusa la numpad si configurarea dispozitivului folosind tastatura si un display LCD.

Download

Jurnal

  • 25 Aprilie - Alegerea temei proiectului si crearea paginii de documentatie
  • 2-3 Mai - Testarea separata a componentelor exceptand camera
  • 5-6 Mai - Acomodarea cu librariile de lucru si realizarea unui ansamblu de autentificare printr-o parola introdusa prin numpad
  • 10-14 Mai - Procurarea unor materiale aditionale si documentarea pentru folosirea camerei pe Arduino
  • 17 Mai - Testarea camerei
  • 20-22 Mai - Realizarea lipiturilor pentru conexiuni
  • 23-25 Mai - Implementarea programului pentru placuta Arduino si a script-urilor de pe server
  • 26-28 Mai - Debugging si testare
  • 30 Mai - Realizarea documentatiei

Bibliografie/Resurse

pm/prj2021/cghenea/facial-recognition-locker.1622396094.txt.gz · Last modified: 2021/05/30 20:34 by razvan.apetroaie
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0