Differences

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

Link to this comparison view

iothings:laboratoare:lab9 [2024/07/12 13:08]
laura.ruse [Exerciții]
iothings:laboratoare:lab9 [2024/07/12 17:26] (current)
laura.ruse [Exerciții]
Line 1: Line 1:
-===== Laborator 09. ESP32CAM ​și detecția obiectelor =====+===== Laborator 09. ESP32-CAM ​și detecția obiectelor ​folosind TensorFlow ​=====
  
  
Line 10: Line 10:
  
 Dorim să rulăm un server web pe ESP32-CAM ​ pe care îl vom folosi pentru a obține imaginile.  ​ Dorim să rulăm un server web pe ESP32-CAM ​ pe care îl vom folosi pentru a obține imaginile.  ​
-  * În Arduino IDE 2, mergi la File > Examples > ESP32 > Camera și deschide exemplul CameraWebServer. +  * În Arduino IDE 2, mergeți ​la ''​File > Examples > ESP32 > Camera'' ​și deschideți exemplul CameraWebServer. 
-  * Decomentează ​linia ''#​define CAMERA_MODEL_AI_THINKER'',​ pentru a selecta modelul de placa. Comentează linia ''#​define CAMERA_MODEL_ESP_EYE''​. +  * Decomentați ​linia ''#​define CAMERA_MODEL_AI_THINKER'',​ pentru a selecta modelul de placă. Comentați ​linia ''#​define CAMERA_MODEL_ESP_EYE''​. 
-  * Completează ​SSID-ul și parola Wi-Fi-ului. +  * Completați ​SSID-ul și parola Wi-Fi-ului. Recomandăm folosirea unui hotspot.  
-  * La Tools > Board selectează ​AI-Thinker ESP32-CAM. +  * La ''​Tools > Board''​ selectați ​AI-Thinker ESP32-CAM. 
-  * La Tools > Port selectează ​portul COM la care este conectat ESP32. +  * La ''​Tools > Port''​ selectați ​portul COM la care este conectat ESP32. 
-  * Apasă butonul de upload pentru a încărca codul. +  * Apăsați butonul de upload pentru a încărca codul. 
-  * Deschide Serial Monitor la o viteză de transfer de 115200 baud.  +  * Deschideți Serial Monitor la o viteză de transfer de 115200 baud.  
-  * Apasă butonul de Reset de pe placa ESP32-CAM.+  * Apăsați butonul de Reset de pe placa ESP32-CAM.
   * Adresa IP a ESP32 ar trebui să fie afișată în Serial Monitor.   * Adresa IP a ESP32 ar trebui să fie afișată în Serial Monitor.
-  * Deschide un browser și introdu ​adresa IP a plăcii ESP32-CAM. +  * Deschideți un browser și introduceți ​adresa IP a plăcii ESP32-CAM. 
-  * Putem descărca o fotografie folosind butonul ''​Save''​. De asemenea se poate accesa URL-ul ''​adr_IP/​capture''​ pentru a obține o imagine instant.+  * Apăsați pe butonul ''​Start Stream''​ pentru a vizualiza stream-ul video. 
 +  * Puteți ​descărca o fotografie folosind butonul ''​Save''​. De asemenea se poate accesa URL-ul ''​adr_IP/​capture''​ pentru a obține o imagine instant.
  
-Poți găsi un tutorial similar [[https://​randomnerdtutorials.com/​esp32-cam-video-streaming-face-recognition-arduino-ide/​|aici]].+Puteți găsi un tutorial similar [[https://​randomnerdtutorials.com/​esp32-cam-video-streaming-face-recognition-arduino-ide/​|aici]].
  
  
Line 30: Line 31:
  
 Setup: Setup:
-  * Asigură-te că ai Python 3.9–3.12. +  * Asigurați-vă că aveți ​Python 3.9–3.12. 
-  * Instalează ​modulul ''​venv''​.+  * Instalați ​modulul ''​venv/virtualenv''​.
 <​note>​ Dacă rulați pe Ubuntu sau WSL, e posibil să aveți nevoie să instalați pachetul ''​virtualenv''​ folosind comanda ''​sudo apt-get install python3-virtualenv''​. Alternativ, pentru o versiune mai specifica, puteti folosi ''​sudo apt-get install python3.x-virtualenv''​.\\ <​note>​ Dacă rulați pe Ubuntu sau WSL, e posibil să aveți nevoie să instalați pachetul ''​virtualenv''​ folosind comanda ''​sudo apt-get install python3-virtualenv''​. Alternativ, pentru o versiune mai specifica, puteti folosi ''​sudo apt-get install python3.x-virtualenv''​.\\
 Dacă rulați pe MacOS, e posibil să aveți nevoie să instalați pachetul ''​virtualenv''​ folosind comanda ''​brew install virtualenv''​. </​note>​ Dacă rulați pe MacOS, e posibil să aveți nevoie să instalați pachetul ''​virtualenv''​ folosind comanda ''​brew install virtualenv''​. </​note>​
-  * Crează ​un nou director: ''​mkdir env_new''​ +  * Creați ​un nou director: ''​mkdir env_new''​ 
-  * Crează ​un nou environment în acel director: ''​python3 -m venv env_new''​ +  * Creați ​un nou environment în acel director: ''​python3 -m venv env_new''​ 
-  * Activează ​noul environment:​ ''​source env_new/​bin/​activate''​ +  * Activați ​noul environment:​ ''​source env_new/​bin/​activate''​ 
-  * Actualizează ​pip: ''​pip install --upgrade pip''​ +  * Actualizați ​pip: ''​pip install --upgrade pip''​ 
-  * Instalează ​TensorFlow: ''​python3 -m pip install tensorflow''​ +  * Instalați ​TensorFlow: ''​python3 -m pip install tensorflow''​ 
-  * Instalează ​TensorFlow Hub: ''​pip install --upgrade tensorflow-hub''​ +  * Instalați ​TensorFlow Hub: ''​pip install --upgrade tensorflow-hub''​ 
-  * Instalează ​matplotlib: ''​pip install matplotlib''​+  * Instalați ​matplotlib: ''​pip install matplotlib''​
  
-1. Urmărește ​acest [[https://​www.tensorflow.org/​hub/​tutorials/​object_detection|tutorial]] pentru a implementa detecția obiectelor dintr-o anumită imagine. ​Salvează codul într-un fișier Python ''​object_detection.py''​.+1. Urmăriți acest [[https://​www.tensorflow.org/​hub/​tutorials/​object_detection|tutorial]] ​pas cu pas pentru a implementa detecția obiectelor dintr-o anumită imagine. ​Fără secțiunea "More images"​. Salvați ​codul într-un fișier Python ''​object_detection.py''​.
  
-2. Modifică ​codul din tutorial în modul următor:+2. Modificați ​codul din tutorial în modul următor:
  
-2.1. Modifică ​funcția ''​display_image''​ în modul următor pentru a salva pe disc și afișa imaginea rezultată:+2.1. Modificați ​funcția ''​display_image''​ în modul următor pentru a salva pe disc și afișa imaginea rezultată:
 <​code>​ <​code>​
 def display_image(image):​ def display_image(image):​
Line 56: Line 57:
 </​code>​ </​code>​
  
-2.2. Comentează ​linia ''​pil_image = ImageOps.fit(pil_image,​ (new_width, new_height),​ Image.LANCZOS)''​ din funcția ''​download_and_resize_image''​ pentru a nu face redimensionarea imaginii. Scoate parametri suplimentari atunci când este apelată funcția ''​download_and_resize_image'':​ ''​downloaded_image_path = download_and_resize_image(image_url)''​.+2.2. Comentați ​linia ''​pil_image = ImageOps.fit(pil_image,​ (new_width, new_height),​ Image.LANCZOS)''​ din funcția ''​download_and_resize_image''​ pentru a nu face redimensionarea imaginii. Scoateți parametri suplimentari atunci când este apelată funcția ''​download_and_resize_image'':​ ''​downloaded_image_path = download_and_resize_image(image_url)''​.
  
-<​note>​Codul final se găsește ​[[https://​drive.google.com/​file/​d/​1vFyeNVDNLr3WNE4abQhwJk_hKKtZwUPf/​view?​usp=sharing|aici]].</​note>​+<​note ​important>Găsiți codul modificat ​[[https://​drive.google.com/​file/​d/​1vFyeNVDNLr3WNE4abQhwJk_hKKtZwUPf/​view?​usp=sharing|aici]].</​note>​
  
-3. Rulează ​codul folosind comanda: ''​python3 object_detection.py''​.+3. Rulați ​codul folosind comanda: ''​python3 object_detection.py''​.
  
-4. Pentru a analiza imaginea produsă de ESP32-CAM ​folosește la url: ''​adr_IP/​capture''​. De exemplu:+4. Pentru a analiza imaginea produsă de ESP32-CAM ​folosiți URL-ul: ''​adr_IP/​capture''​. De exemplu:
 <​code>​ image_url = "​http://​192.168.142.118/​capture"</​code>​ <​code>​ image_url = "​http://​192.168.142.118/​capture"</​code>​
  
-5. Se pot folosi 2 module ​de detecție:​ +5. Se pot folosi 2 modele ​de detecție:​ 
-  * FasterRCNN+InceptionResNet V2: acuratețe ridicată. Folosiți: <​code>​module_handle = "​https://​tfhub.dev/​google/​faster_rcnn/​openimages_v4/​inception_resnet_v2/​1"</​code>​ +  * FasterRCNN+InceptionResNet V2: are acuratețe ridicată. Folosiți: <​code>​module_handle = "​https://​tfhub.dev/​google/​faster_rcnn/​openimages_v4/​inception_resnet_v2/​1"</​code>​ 
-  * ssd+mobilenet V2: mic și rapid. Folosiți: <​code>​module_handle = "​https://​tfhub.dev/​google/​openimages_v4/​ssd/​mobilenet_v2/​1"</​code>​+  * ssd+mobilenet V2: este mic și rapid. Folosiți: <​code>​module_handle = "​https://​tfhub.dev/​google/​openimages_v4/​ssd/​mobilenet_v2/​1"</​code>​
  
  
-=== (Bonus) ​Ex3. Generarea unei alerte în urma detecției unei persoane ​===+=== Ex3. Rezultatele produse de model ===
  
 În exercițiul 2, variabila ''​result''​ din funcția ''​run_detector()''​ include toate rezultatele numerice produse de model în urma analizei imaginii. Acestea pot fi folosite mai departe pentru a efectua alte acțiuni în funcție de obiectele detectate. În exercițiul 2, variabila ''​result''​ din funcția ''​run_detector()''​ include toate rezultatele numerice produse de model în urma analizei imaginii. Acestea pot fi folosite mai departe pentru a efectua alte acțiuni în funcție de obiectele detectate.
  
-Variabila result conține următoarele:​+Variabila ​''​result'' ​conține următoarele:​
   * '''​detection_class_labels'''​ = o listă de etichete numerice, unde fiecare etichetă numerică corespunde clasei unui obiect detectat în imagine.   * '''​detection_class_labels'''​ = o listă de etichete numerice, unde fiecare etichetă numerică corespunde clasei unui obiect detectat în imagine.
   * '''​detection_class_names'''​ = o listă de nume codificate sau identificatori pentru fiecare clasă detectată.   * '''​detection_class_names'''​ = o listă de nume codificate sau identificatori pentru fiecare clasă detectată.
   * '''​detection_class_entities'''​ = o listă de nume lizibile ale claselor detectate.   * '''​detection_class_entities'''​ = o listă de nume lizibile ale claselor detectate.
   * '''​detection_boxes'''​ = o listă de coordonate ale casetelor de delimitare (boxes) pentru fiecare obiect detectat.   * '''​detection_boxes'''​ = o listă de coordonate ale casetelor de delimitare (boxes) pentru fiecare obiect detectat.
-  * '''​detection_scores'''​ = o listă de numere între 0 și 1, unde fiecare număr corespunde scorului de încredere al detectării modelului pentru obiectul corespunzător din imagine. Un scor de 1 indică faptul că modelul este foarte încrezător în detectarea sa, în timp ce un scor mai aproape de 0 sugerează o încredere mai scăzută.+  * '''​detection_scores'''​ = o listă de numere între 0 și 1, unde fiecare număr corespunde scorului de încredere al detectării modelului pentru obiectul corespunzător din imagine. Un scor de 1 indică faptul că modelul este foarte încrezător în detectarea sa, în timp ce un scor mai aproape de 0 sugerează o încredere mai scăzută. Elementul '''​detection_scores'''​ este crucial pentru filtrarea detectărilor potențial inexacte. Puteți seta un prag (de exemplu: 0,5) și puteți lua în considerare doar obiectele cu scoruri peste acel prag pentru procesarea ulterioară.
  
-Elementul ​'''​detection_scores'''​ este crucial pentru filtrarea detectărilor potențial inexacte. Puteți seta un prag (de exemplu: 0,5) și puteți lua în considerare doar obiectele cu scoruri peste acel prag pentru procesarea ulterioară.+Modificați scriptul pentru a afișa în terminal conținutul variabilei ​''​result''​ și observați listele descrise mai sus
  
-Modificați scriptul pentru a afișa ​în terminal conținutul variabilei ''​result''​. ​Rulați scriptul în timp ce camera este îndreptată către o persoană. Observați că lista '''​detection_class_entities'''​ include ​descrierile ​'''​Person''',​ '''​Human face'''​ și altele. În '''​detection_scores'''​ sunt incluse scorurile pentru fiecare clasă din '''​detection_class_entities'''​. De exemplu un scor mare pentru '''​Human face'''​ indică faptul că este detectată o față umană în poză. ​+=== (Bonus) Ex4. Generarea unei alerte ​în urma detecției unei persoane === 
 + 
 +Rulați scriptul în timp ce camera este îndreptată către o persoană. Observați că lista '''​detection_class_entities'''​ include ​clasele ​'''​Person''',​ '''​Human face'''​ și altele. În lista '''​detection_scores'''​ sunt incluse scorurile pentru fiecare clasă din '''​detection_class_entities'''​. De exemplu un scor mare pentru '''​Human face'''​ indică faptul că este detectată o față umană în poză. ​
  
 Dacă detectați o persoană folosind camera de pe ESP32-CAM atunci generați o alertă către utilizator (un mesaj in terminal). ​ Dacă detectați o persoană folosind camera de pe ESP32-CAM atunci generați o alertă către utilizator (un mesaj in terminal). ​
  
  
-=== (Bonus) ​Ex4. Trimiterea unui email în urma detecției unei persoane ===+=== (Bonus) ​Ex5. Trimiterea unui email în urma detecției unei persoane ===
  
 Modificați codul anterior pentru a trimite către utilizator un email cu poza inițială și cea produsă de model. Modificați codul anterior pentru a trimite către utilizator un email cu poza inițială și cea produsă de model.
Line 95: Line 98:
  
  
-=== (Bonus) ​Ex5. Detecția automată obiectelor în stream video folosind TensorFlow.js (server web) ===+=== (Bonus) ​Ex6. Detecția automată obiectelor în stream video folosind TensorFlow.js (server web) ===
  
 În acest exercițiu dorim să detectăm automat obiecte/​persoane dintr-un stream video produs de ESP32-CAM. Pe placă va rula un server web care folosește TensorFlow.js pentru detecție. ​ În acest exercițiu dorim să detectăm automat obiecte/​persoane dintr-un stream video produs de ESP32-CAM. Pe placă va rula un server web care folosește TensorFlow.js pentru detecție. ​
  
 Pași: Pași:
-  * Descarcă acest [[https://​github.com/​cifertech/​ObjectDetection_ESP32cam|repo]].  +  * Descărcați ​acest [[https://​github.com/​cifertech/​ObjectDetection_ESP32cam|repo]].  
-  * Deschide ''​ObjectDetection_ESP32cam.ino''​ în Arduino IDE 2. +  * Deschideți ''​ObjectDetection_ESP32cam.ino''​ în Arduino IDE 2. 
-  * Completează ​SSID-ul și parola Wi-Fi-ului în cod. +  * Completați ​SSID-ul și parola Wi-Fi-ului în cod. 
-  * La Tools > Board selectează ​AI-Thinker ESP32-CAM. +  * La ''​Tools > Board''​ selectați ​AI-Thinker ESP32-CAM. 
-  * La Tools > Port selectează ​portul COM la care este conectat ESP32. +  * La ''​Tools > Port''​ selectați ​portul COM la care este conectat ESP32. 
-  * Apasă butonul de upload pentru a încărca codul. +  * Apăsați butonul de upload pentru a încărca codul. 
-  * Deschide Serial Monitor la o viteză de transfer de 115200 baud. +  * Deschideți Serial Monitor la o viteză de transfer de 115200 baud. 
-  * Apasă butonul de Reset de pe placa ESP32-CAM.+  * Apăsați butonul de Reset de pe placa ESP32-CAM.
   * Adresa IP a ESP32 ar trebui să fie afișată în Serial Monitor.   * Adresa IP a ESP32 ar trebui să fie afișată în Serial Monitor.
-  * Deschide un browser și introdu ​adresa IP a plăcii ESP32-CAM. +  * Deschideți un browser și introduceți ​adresa IP a plăcii ESP32-CAM. 
-  * Poți observa cum sunt detectate obiecte/​persoane în timp real din stream-ul video produs de ESP32-CAM. ​+  * Puteți observa cum sunt detectate obiecte/​persoane în timp real din stream-ul video produs de ESP32-CAM. ​
  
  
  
  
iothings/laboratoare/lab9.1720778894.txt.gz · Last modified: 2024/07/12 13:08 by laura.ruse
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