Differences

This shows you the differences between two versions of the page.

Link to this comparison view

pm:prj2021:cghenea:facial-recognition-locker [2021/05/30 16:32]
razvan.apetroaie
pm:prj2021:cghenea:facial-recognition-locker [2021/06/04 21:43] (current)
razvan.apetroaie
Line 4: Line 4:
  
 ===== Introducere ===== ===== Introducere =====
-  * Metodele ​traditionale ​de a obtine ​accesul sunt metode de tipul "​something you have" (descuierea ​usii folosind o cheie) ​si "​something you know" (parola propriului cont). Scopul proiectului este implementarea unei metode "​something you are", mai exact recunoasterea faciala, oferind accesul ​fara necesitatea de a memora sau a detine ​un obiect anume. +  * 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 ​un cod sau a deține ​un obiect anume. 
-  * Proiectul ​isi propune controlarea unei incuietori ​electrice pe baza capturilor realizate de o camera ​atasata si a rezultatului dat de un server extern ​in urma procesarii ​imaginilor.+  * 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 ​generala ​===== +===== Descriere ​generală ​===== 
-Ansamblul va avea atasat ​camera ​VGA ce va realiza capturi la apasarea ​butonului. Imaginile vor fi trimise la un server extern folosind un modul Ethernet, unde acestea vor avea rol de input pentru modelul de recunoastere faciala ​implementat, ​urmand ca raspunsul sa fie transmis ​placutei ​Arduino. Microcontrolerul va putea atunci ​sa actioneze ​asupra incuietoarei prin intermediul unui releu.\\ +Ansamblul va avea atașată ​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.\\ 
-{{https://​ocw.cs.pub.ro/​courses/​_media/​pm/​prj2021/​cghenea/​face_recognition_locker_diagram.jpg?​575x200}}+{{https://​ocw.cs.pub.ro/​courses/​_media/​pm/​prj2021/​cghenea/​face_recognition_locker_diagram.jpg?​450x150}}
  
 ===== Hardware Design ===== ===== Hardware Design =====
Line 15: Line 15:
   * Arduino UNO R3   * Arduino UNO R3
   * Modul extern Ethernet   * Modul extern Ethernet
-  * Camera ​VGA+  * Cameră ​VGA
   * Modul releu 12V   * Modul releu 12V
-  * Incuietoare ​electrica ​12V+  * Incuietoare ​electrică ​12V
   * Push button   * Push button
   * Cablu UTP   * Cablu UTP
-  * Rezistente ​2x4,7k, 2x10k+  * Rezistențe ​2x4,7k, 2x10k
   * Conectori de pini   * Conectori de pini
-  * Placa PCB de prototipare +  * Placă ​PCB de prototipare 
-{{https://​ocw.cs.pub.ro/​courses/​_media/​pm/​prj2021/​cghenea/​face_recognition_locker_hardware.jpg?​300x200}}{{https://​ocw.cs.pub.ro/​courses/​_media/​pm/​prj2021/​cghenea/​face_recognition_locker_front.jpg?​200x150}}{{https://​ocw.cs.pub.ro/​courses/​_media/​pm/​prj2021/​cghenea/​face_recognition_locker_back.jpg?​200x150}}+{{https://​ocw.cs.pub.ro/​courses/​_media/​pm/​prj2021/​cghenea/​face_recognition_locker_hardware.jpg?​300x200}}\\ 
 +{{https://​ocw.cs.pub.ro/​courses/​_media/​pm/​prj2021/​cghenea/​face_recognition_locker_front.jpg?​200x150}} 
 +{{https://​ocw.cs.pub.ro/​courses/​_media/​pm/​prj2021/​cghenea/​face_recognition_locker_back.jpg?​200x150}}
  
-==== Schema ​electrica ​==== +==== Schema ​electrică ​==== 
-Initial, proiectul ​isi propusese ​sa adauge un card SD pentru stocarea imaginilor ​si un numpad pentru o metoda alternativa ​de autentificare prin introducerea parolei, ​insa s-a renuntat ​la acestea din moment ce toti pinii pentru uz general au fost folositi ​(camera ​necesita ​conectarea a 18 pini) si a fost necesara si remaparea pinilor.\\ +{{https://​ocw.cs.pub.ro/​courses/​_media/​pm/​prj2021/​cghenea/​face_recognition_locker_schema_electrica.jpg?​480x240}}\\ 
-Microcontroller-ul comunica cu shield-ul Ethernet prin pinii ICSP, fiind astfel ​necesara ​nefolosirea pinilor 10-13 (sunt conectati ​intern la pinii ICSP). Analog, pinii SCL si SDA corespund cu pinii A5, respectiv A4.\\ +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.\\ 
-Pinii RX si TX sunt folositi ​pentru buton si releu, la releu fiind de asemenea ​atasat ​un alimentator de 12V pentru ​incuietoare.+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 ===== ===== Software Design =====
-Atat codul scris pentru ​placuta ​Arduino, ​cat si cel folosit pe server au fost urcate folosind [[https://​github.com/​aptrazvan/​FacialRecognitionLocker|git]]. Pentru programarea pe microcontroller s-a folosit Arduino IDE, iar pe server se gaseste ​un script bash ce lanseaza ​3 terminale care ruleaza in paralel script-uri Python.+Atât codul scris pentru ​plăcuța ​Arduino, ​cât și cel folosit pe server au fost urcate folosind [[https://​github.com/​aptrazvan/​FacialRecognitionLocker|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 ==== ==== Arduino IDE ====
-Codul sursa se afla in folder-ul "​Ethernet_Camera"​. Implementarea s-a inceput ​de la codul oferit de urmatorul ​[[https://​circuitdigest.com/​microcontroller-projects/​how-to-use-ov7670-camera-module-with-arduino|ghid]],​ care la randul ​lui a folosit ​urmatoarea ​[[https://​github.com/​ComputerNerd/​ov7670-no-ram-arduino-uno|sursa]]. La apasarea ​butonului, se va trimite un batch de 5 imagini, din moment ce unele imagini pot avea probleme de luminozitate sau pozitionare.\\ +Codul sursă ​se află în folder-ul "​Ethernet_Camera"​. Implementarea s-a început ​de la codul oferit de următorul ​[[https://​circuitdigest.com/​microcontroller-projects/​how-to-use-ov7670-camera-module-with-arduino|ghid]],​ care la rândul ​lui a folosit ​următoarea ​[[https://​github.com/​ComputerNerd/​ov7670-no-ram-arduino-uno|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 initializare, se configureaza ​pinul 6 ca si PWM clock pentru camera VGA si se configureaza ​adresele MAC si IP, urmate de port-ul pentru transmiterea UDP. In urma testelor nu s-a observat o pierdere ​semnificativa ​a datelor ​in comparatie ​cu protocolul TCP, UDP oferind ​totodata ​viteza ​mai mare de transmitere a pachetelor.\\ +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ă ​viteză ​mai mare de transmitere a pachetelor.\\ 
-Pe masura ​ce se citesc pixelii, ​acestia ​sunt salvati intr-un buffer de dimensiune 1280 bytes (4 linii din imagine, a fost necesara ​optimizarea memoriei din moment ce SRAM-ul ​placutei ​Arduino are capacitate ​maxima ​de 2048 bytes), ​urmand ​a se transmite pachetul la umplerea acestuia. Microcontroller-ul va primi un pachet UDP in caz afirmativ, ​urmand sa deschida incuietoarea ​pentru 2 secunde.+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 ==== ==== Python ====
-Prin rularea script-ului run.sh se lanseaza in executie ​script-urile python3: +Prin rularea script-ului run.sh se lansează în execuție ​script-urile python3: 
-  * udp_server - sterge ​imaginile salvate anterior ​si preia datele de la microcontroller, ​salvandu-le in format .txt in urma primirii unui fisier intreg +  * 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 fisierul ​.txt, dupa care le scrie sub forma RGB si adauga ​header-ul BMP, urmand sa salveze rezultatul ​intr-un fisier ​bmp +  * 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 - compara ​encodarea imaginii bmp obtinute ​cu encodarea imaginii de referinta ​folosind ​libraria ​"​face_recognition"​. ​Daca functia returneaza ​True, script-ul va trimite pachete UDP pentru batch-ul curent de imagini. +  * 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 ​Obtinute ​=====+ 
 +===== Rezultate ​Obținute ​===== 
 +În prima jumătate a execuției din [[https://​youtu.be/​h58WgDPylpk|demo]],​ s-au obținut imaginile (primele 5):\\ 
 +{{https://​ocw.cs.pub.ro/​courses/​_media/​pm/​prj2021/​cghenea/​face_recognition_locker_photos.png?​250x200}}\\ 
 +Având ca imagine de referință ultima captură din set, programul a returnat valorile False, True, True, True, respectiv True, după care încuietoarea se deschide. Se observă o "​shiftare"​ sau decupare a pozelor (posibil un bug la sincronizare),​ însă din moment ce se realizează 5 capturi iar "​shiftarea"​ pare uniformă, nu este afectat rezultatul final (cel puțin într-o imagine se găsește fața întreagă). După boot-are, primele 2-3 poze ies întotdeauna cu luminozitate crescută, după care se stabilizează și restul pozelor au un rezultat normal, obținându-se o corectitudine consistentă.\\ 
 +În a doua jumătate a demo-ului, se testează cazul negativ prin capturarea unor imagini ce nu conțin nicio față, și prin urmare încuietoarea nu se deschide.
 ===== Concluzii ===== ===== Concluzii =====
 +Utilizarea unei camere pe un Arduino Uno R3 este un bun exemplu de testare a limitelor acestui microcontroller. Atât numărul de pini cât și memoria SRAM au fost utilizate aproape la maxim, aducând dificultăți în implementare pe partea de optimizare și remapare a pinilor. Au existat conflicte în utilizarea pinilor din moment ce shield-ul Ethernet necesită ca pinii 10-13 să fie neutilizați,​ iar schema originală a camerei se folosea parțial de acești pini. Proiectul și-a atins scopul propus, însă ar putea fi îmbunătățit în câteva puncte în condiția în care se utilizează un microcontroller cu mai multe resurse:
 +  * sistemul de lock are câteva vulnerabilități. Pentru a nu permite accesul unei persoane care deține o poză cu proprietarul,​ serverul ar putea face autentificarea folosindu-se de mai multe poze în diverse poziții sau de o filmare. De asemenea, semnalul trimis pentru deschiderea incuietorii ar trebui să conțină o măsură de securitate. În momentul de față, dacă un atacator se poate conecta la rețeaua locală și află adresa IP și portul microcontroller-ului,​ acesta poate trimite orice pachet UDP pentru descuiere
 +  * se pot adauga mai multe funcționalități,​ precum autentificarea printr-o parolă introdusă la numpad și configurarea dispozitivului folosind tastatura și un display LCD.
 ===== Download ===== ===== Download =====
 +[[https://​github.com/​aptrazvan/​FacialRecognitionLocker|Github - FacialRecognitionLocker]]
 ===== Jurnal ===== ===== Jurnal =====
-  * 25 Aprilie - Alegerea temei proiectului ​si crearea paginii de documentatie +  * 25 Aprilie - Alegerea temei proiectului ​și crearea paginii de documentație 
-  * 2-3 Mai - Testarea ​separata ​a componentelor ​exceptand ​camera +  * 2-3 Mai - Testarea ​separată ​a componentelor ​exceptând ​camera 
-  * 5-6 Mai - Acomodarea cu librariile ​de lucru si realizarea unui ansamblu de autentificare printr-o ​parola introdusa ​prin numpad +  * 5-6 Mai - Acomodarea cu librăriile ​de lucru și realizarea unui ansamblu de autentificare printr-o ​parolă introdusă ​prin numpad 
-  * 10-14 Mai - Procurarea unor materiale ​aditionale si documentarea pentru folosirea camerei pe Arduino+  * 10-14 Mai - Procurarea unor materiale ​adiționale și documentarea pentru folosirea camerei pe Arduino
   * 17 Mai - Testarea camerei   * 17 Mai - Testarea camerei
   * 20-22 Mai - Realizarea lipiturilor pentru conexiuni   * 20-22 Mai - Realizarea lipiturilor pentru conexiuni
-  * 23-25 Mai - Implementarea programului pentru ​placuta ​Arduino ​si a script-urilor de pe server +  * 23-25 Mai - Implementarea programului pentru ​plăcuța ​Arduino ​și a script-urilor de pe server 
-  * 26-28 Mai - Debugging ​si testare +  * 26-28 Mai - Debugging ​și testare 
-  * 30 Mai - Realizarea ​documentatiei+  * 30 Mai - Realizarea ​documentației
 ===== Bibliografie/​Resurse ===== ===== Bibliografie/​Resurse =====
-PDF: [[https://​ocw.cs.pub.ro/​courses/​pm/​prj2021/​cghenea/​facial-recognition-locker?​do=export_pdf]]+Documentație cameră:\\ 
 +[[https://​www.instructables.com/​OV7670-Arduino-Camera-Sensor-Module-Framecapture-T/​]]\\ 
 +[[https://​circuitdigest.com/​microcontroller-projects/​how-to-use-ov7670-camera-module-with-arduino]]\\ 
 +[[https://​github.com/​ComputerNerd/​ov7670-no-ram-arduino-uno]]\\ 
 +[[https://​ww1.microchip.com/​downloads/​en/​DeviceDoc/​Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf|ATmega328P Datasheet]]\\ 
 +[[https://​www.arduino.cc/​reference/​en/​language/​variables/​utilities/​progmem/​|PROGMEM]]\\ 
 +[[https://​www.arduino.cc/​en/​Reference/​Ethernet|Arduino Ethernet]]\\ 
 +[[https://​pypi.org/​project/​face-recognition/​|Librăria Python face_recognition]]\\ 
 +[[https://​linuxhint.com/​send_receive_udp_python/​|Model client-server în Python]]\\ 
 +[[https://​en.wikipedia.org/​wiki/​BMP_file_format|Formatul BMP]]\\ 
 +[[https://​ocw.cs.pub.ro/​courses/​pm/​prj2021/​cghenea/​facial-recognition-locker?​do=export_pdf|PDF]]
pm/prj2021/cghenea/facial-recognition-locker.1622381556.txt.gz · Last modified: 2021/05/30 16:32 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