This shows you the differences between two versions of the page.
pm:prj2021:cghenea:facial-recognition-locker [2021/05/30 18:21] 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 o 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ă 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.\\ |
- | {{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ă ==== |
{{https://ocw.cs.pub.ro/courses/_media/pm/prj2021/cghenea/face_recognition_locker_schema_electrica.jpg?480x240}}\\ | {{https://ocw.cs.pub.ro/courses/_media/pm/prj2021/cghenea/face_recognition_locker_schema_electrica.jpg?480x240}}\\ | ||
- | 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.\\ | + | 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 necesara nefolosirea pinilor 10-13 (sunt conectati intern la pinii ICSP). Analog, pinii SCL si SDA corespund cu pinii A5, respectiv A4.\\ | + | 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 si TX sunt folositi pentru buton si releu, la releu fiind de asemenea atasat un alimentator de 12V pentru incuietoare. | + | 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 o 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ă o 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]] |