Laborator 09. ESP32-CAM și detecția obiectelor folosind TensorFlow

Exerciții

Ex1. Obținerea imaginilor folosind ESP32-CAM

Dorim să rulăm un server web pe ESP32-CAM pe care îl vom folosi pentru a obține imaginile.

  • În Arduino IDE 2, mergeți la File > Examples > ESP32 > Camera și deschideți exemplul CameraWebServer.
  • Decomentați linia #define CAMERA_MODEL_AI_THINKER, pentru a selecta modelul de placă. Comentați linia #define CAMERA_MODEL_ESP_EYE.
  • Completați SSID-ul și parola Wi-Fi-ului. Recomandăm folosirea unui hotspot.
  • La Tools > Board selectați AI-Thinker ESP32-CAM.
  • La Tools > Port selectați portul COM la care este conectat ESP32.
  • Apăsați butonul de upload pentru a încărca codul.
  • Deschideți Serial Monitor la o viteză de transfer de 115200 baud.
  • Apăsați butonul de Reset de pe placa ESP32-CAM.
  • Adresa IP a ESP32 ar trebui să fie afișată în Serial Monitor.
  • Deschideți un browser și introduceți adresa IP a plăcii ESP32-CAM.
  • 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.

Puteți găsi un tutorial similar aici.

Ex2. Detecția obiectelor folosind TensorFlow în Python (pe laptop)

În acest exercițiu vom folosi TensorFlow pentru a detecta obiectele dintr-o imagine. Imaginea se va da sub forma unui URL. Vom prelua o imagine de la ESP32-CAM și o vom trece prin model pentru a obține obiectele detectate.

Setup:

  • Asigurați-vă că aveți Python 3.9–3.12.
  • Instalați modulul venv/virtualenv.

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.

  • Creați un nou director: mkdir env_new
  • Creați un nou environment în acel director: python3 -m venv env_new
  • Activați noul environment: source env_new/bin/activate
  • Actualizați pip: pip install –upgrade pip
  • Instalați TensorFlow: python3 -m pip install tensorflow
  • Instalați TensorFlow Hub: pip install –upgrade tensorflow-hub
  • Instalați matplotlib: pip install matplotlib

1. Urmăriți acest 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. Modificați codul din tutorial în modul următor:

2.1. Modificați funcția display_image în modul următor pentru a salva pe disc și afișa imaginea rezultată:

def display_image(image):
  fig = plt.figure(figsize=(12, 8))
  plt.grid(False)
  plt.imshow(image)
  plt.savefig('result.jpg')
  plt.show()

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).

Găsiți codul modificat aici.

3. Rulați codul folosind comanda: python3 object_detection.py.

4. Pentru a analiza imaginea produsă de ESP32-CAM folosiți URL-ul: adr_IP/capture. De exemplu:

 image_url = "http://192.168.142.118/capture"

5. Se pot folosi 2 modele de detecție:

  • FasterRCNN+InceptionResNet V2: are acuratețe ridicată. Folosiți:
    module_handle = "https://tfhub.dev/google/faster_rcnn/openimages_v4/inception_resnet_v2/1"
  • ssd+mobilenet V2: este mic și rapid. Folosiți:
    module_handle = "https://tfhub.dev/google/openimages_v4/ssd/mobilenet_v2/1"

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.

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_names' = o listă de nume codificate sau identificatori pentru fiecare clasă detectată.
  • '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_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ă.

Modificați scriptul pentru a afișa în terminal conținutul variabilei result și observați listele descrise mai sus.

(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).

(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.

Găsiți aici informații despre trimiterea email-urilor din Python.

(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.

Pași:

  • Descărcați acest repo.
  • Deschideți ObjectDetection_ESP32cam.ino în Arduino IDE 2.
  • Completați SSID-ul și parola Wi-Fi-ului în cod.
  • La Tools > Board selectați AI-Thinker ESP32-CAM.
  • La Tools > Port selectați portul COM la care este conectat ESP32.
  • Apăsați butonul de upload pentru a încărca codul.
  • Deschideți Serial Monitor la o viteză de transfer de 115200 baud.
  • Apăsați butonul de Reset de pe placa ESP32-CAM.
  • Adresa IP a ESP32 ar trebui să fie afișată în Serial Monitor.
  • Deschideți un browser și introduceți adresa IP a plăcii ESP32-CAM.
  • Puteți observa cum sunt detectate obiecte/persoane în timp real din stream-ul video produs de ESP32-CAM.
iothings/laboratoare/lab9.txt · Last modified: 2024/07/12 17:26 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