This shows you the differences between two versions of the page.
iothings:laboratoare:lab9 [2024/07/12 12:01] 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 numere întregi, unde fiecare număr întreg corespunde clasei a 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 șiruri de bytes, unde fiecare șir corespunde clasei obiectului detectat | + | * '''detection_class_names''' = o listă de nume codificate sau identificatori pentru fiecare clasă detectată. |
- | * '''detection_class_entities''' = o listă de șiruri de bytes, unde fiecare șir este o descriere mai detaliată a obiectului detectat Poate fi mai specific decât numele claselor și poate depinde de setul de date pe care a fost antrenat modelul | + | * '''detection_class_entities''' = o listă de nume lizibile ale claselor detectate. |
- | * '''detection_boxes''' = o listă de dreptunghiuri delimitatoare pentru obiectele detectate din imagine | + | * '''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. |