Pertemuan XI: Deteksi Obyek dengan ESP32 Cam dan Tensorflow

 LAPORAN PRAKTIKUM KOMPUTASI PERVASIVE

 DETEKSI OBYEK DENGAN ESP32 CAM DAN TENSORFLOW




 Nama Kelompok

Aulia Wahyuni

( 1903421035 )

Putri Apriliani H.

( 1903421014 )

 

BM 6B

 

 

 

PROGRAM STUDI BROADBAND MULTIMEDIA

JURUSAN TEKNIK ELEKTRO

POLITEKNIK NEGERI JAKARTA

2022


       I.            TUJUAN PRAKTIKUM

Tujuan dari praktikum ini yaitu untuk mendeteksi nama objek menggunakan ESP32 sehingga informasi tersebut dapat ditampilkan pada web.

 

    II.            TEORI SINGKAT

A.    TensorFlow

TensorFlow memungkinkan pengembang untuk membuat diagram aliran data, struktur yang menjelaskan bagaimana data bergerak melalui diagram atau serangkaian node pemrosesan. Setiap node dalam diagram mewakili operasi matematika, dan setiap koneksi atau tepi antara node adalah array data multidimensi atau tarik. TensorFlow menyediakan semua proses ini melalui bahasa Python. Sangat mudah untuk belajar dan bekerja dengan Python dan menyediakan cara yang nyaman untuk mengekspresikan abstraksi tingkat tinggi bersama-sama. Tetapi matematika sebenarnya tidak dilakukan dengan Python. Pustaka yang tersedia untuk TensorFlow ditulis dalam biner C berperforma tinggi. Python hanya mengarahkan lalu lintas antar komponen dan menyediakan abstrak pemrograman tingkat tinggi untuk menghubungkannya.

 

B.     Model Pendeteksian Obyek

Dalam pembelajaran mesin, ada topik yang disebut model, yang sebenarnya adalah objek dan hal-hal yang ingin kita kenali, misalnya, mengenali wajah manusia, jadi untuk ini kita harus mengajari mesin kita bahwa penampilan manusia, wanita atau laki-laki, Kecil atau besar, tua atau muda. Untuk ini kami harus memperkenalkan gambar yang berbeda ke mobil kami untuk meningkatkan kemampuan mendeteksi mobil kami. Hasil dari proses ini disebut pemodelan, yang merupakan ciri khas mesin kami, dan kemudian semua model ini harus diberi label agar hasilnya dapat dipahami secara visual oleh pengguna.

 

C.    ESP32-CAM

ESP32 adalah generasi lanjutan dari ESP8266. Salah satu perbedaannya adalah Bluetooth bawaannya. Ini juga memiliki inti WiFi 2,4 GHz dan Bluetooth built-in dengan teknologi 40-nanometer dari TSMC. Modul ini memiliki kinerja terbaik dalam konsumsi energi, yaitu memberikan hasil terbaik bagi kami dengan konsumsi energi paling sedikit. Jika kita ingin melihat lebih dekat pada papan ini, kita harus mengatakan bahwa ini adalah chip di mana platform NodeMCU diimplementasikan, yang juga disebut Sistem pada mikrokontroler chip.

 

D.    Cara Mendeteksi Objek Dengan Kamera

Dalam proyek ini, dengan mengalirkan gambar menggunakan papan ESP32-CAM dan menerima serta menampilkannya di browser, kami juga akan menggunakan Tensorflow.JS untuk memproses gambar menggunakan model default yang diterapkan. Segera setelah gambar diterima oleh server web yang berjalan di browser, ia akan mengantisipasi dan menganalisis item dalam gambar. Dalam proyek ini, hanya objek default yang dapat dikenali. Seperti yang Anda ketahui, Tensorflow memiliki beberapa model terlatih yang dapat kita gunakan untuk mulai mempelajari mesin dengan mudah. COCO-SSD adalah model ML yang digunakan untuk melokalisasi dan mengidentifikasi objek dalam sebuah gambar. Model yang sama digunakan dalam tutorial ini.

 

 III.            KOMPONEN YANG DIGUNAKAN

·         Modul ESP32-CAM

·         Modul konverter FT232 untuk program


       I.            RANGKAIAN SISTEM



Tampilan Web Servernya


       I.            KODE PROGRAM

const char* ssid     = "haha";  

const char* password = "satusatu";  

 

const char* apssid = "ESP32-CAM";

const char* appassword = "12345678";   

 

#include <WiFi.h>

#include <WiFiClientSecure.h>

#include "esp_camera.h"        

#include "soc/soc.h"           

#include "soc/rtc_cntl_reg.h"  

 

String Feedback="";  

 

String Command="",cmd="",P1="",P2="",P3="",P4="",P5="",P6="",P7="",P8="",P9="";

 

byte ReceiveState=0,cmdState=1,strState=1,questionstate=0,equalstate=0,semicolonstate=0;

 

 

 

 

#define PWDN_GPIO_NUM     32

#define RESET_GPIO_NUM    -1

#define XCLK_GPIO_NUM      0

#define SIOD_GPIO_NUM     26

#define SIOC_GPIO_NUM     27

 

#define Y9_GPIO_NUM       35

#define Y8_GPIO_NUM       34

#define Y7_GPIO_NUM       39

#define Y6_GPIO_NUM       36

#define Y5_GPIO_NUM       21

#define Y4_GPIO_NUM       19

#define Y3_GPIO_NUM       18

#define Y2_GPIO_NUM        5

#define VSYNC_GPIO_NUM    25

#define HREF_GPIO_NUM     23

#define PCLK_GPIO_NUM     22

 

WiFiServer server(80);

 

void ExecuteCommand()

{

  //Serial.println("");

  //Serial.println("Command: "+Command);

  if (cmd!="getstill") {

    Serial.println("cmd= "+cmd+" ,P1= "+P1+" ,P2= "+P2+" ,P3= "+P3+" ,P4= "+P4+" ,P5= "+P5+" ,P6= "+P6+" ,P7= "+P7+" ,P8= "+P8+" ,P9= "+P9);

    Serial.println("");

  }

 

  if (cmd=="your cmd") {

    // You can do anything.

    // Feedback="<font color=\"red\">Hello World</font>";

  }

  else if (cmd=="ip") {

    Feedback="AP IP: "+WiFi.softAPIP().toString();   

    Feedback+=", ";

    Feedback+="STA IP: "+WiFi.localIP().toString();

  } 

  else if (cmd=="mac") {

    Feedback="STA MAC: "+WiFi.macAddress();

  } 

  else if (cmd=="resetwifi") { 

    WiFi.begin(P1.c_str(), P2.c_str());

    Serial.print("Connecting to ");

    Serial.println(P1);

    long int StartTime=millis();

    while (WiFi.status() != WL_CONNECTED)

    {

        delay(500);

        if ((StartTime+5000) < millis()) break;

    }

    Serial.println("");

    Serial.println("STAIP: "+WiFi.localIP().toString());

    Feedback="STAIP: "+WiFi.localIP().toString();

  }   

  else if (cmd=="restart") {

    ESP.restart();

  }   

  else if (cmd=="digitalwrite") {

    ledcDetachPin(P1.toInt());

    pinMode(P1.toInt(), OUTPUT);

    digitalWrite(P1.toInt(), P2.toInt());

  }  

  else if (cmd=="analogwrite") {

    if (P1="4") {

      ledcAttachPin(4, 4); 

      ledcSetup(4, 5000, 8);  

      ledcWrite(4,P2.toInt()); 

    }

    else {

      ledcAttachPin(P1.toInt(), 5);

      ledcSetup(5, 5000, 8);

      ledcWrite(5,P2.toInt());

    }

  }   

  else if (cmd=="flash") {

    ledcAttachPin(4, 4); 

    ledcSetup(4, 5000, 8);  

     

    int val = P1.toInt();

    ledcWrite(4,val); 

  } 

  else if (cmd=="framesize") {

    sensor_t * s = esp_camera_sensor_get(); 

    if (P1=="QQVGA")

      s->set_framesize(s, FRAMESIZE_QQVGA);

    else if (P1=="HQVGA")

      s->set_framesize(s, FRAMESIZE_HQVGA);

    else if (P1=="QVGA")

      s->set_framesize(s, FRAMESIZE_QVGA);

    else if (P1=="CIF")

      s->set_framesize(s, FRAMESIZE_CIF);

    else if (P1=="VGA")

      s->set_framesize(s, FRAMESIZE_VGA); 

    else if (P1=="SVGA")

      s->set_framesize(s, FRAMESIZE_SVGA);

    else if (P1=="XGA")

      s->set_framesize(s, FRAMESIZE_XGA);

    else if (P1=="SXGA")

      s->set_framesize(s, FRAMESIZE_SXGA);

    else if (P1=="UXGA")

      s->set_framesize(s, FRAMESIZE_UXGA);          

    else

      s->set_framesize(s, FRAMESIZE_QVGA);    

  }

  else if (cmd=="quality") {

    sensor_t * s = esp_camera_sensor_get();

    int val = P1.toInt();

    s->set_quality(s, val);

  }

  else if (cmd=="contrast") {

    sensor_t * s = esp_camera_sensor_get();

    int val = P1.toInt();

    s->set_contrast(s, val);

  }

  else if (cmd=="brightness") {

    sensor_t * s = esp_camera_sensor_get();

    int val = P1.toInt(); 

    s->set_brightness(s, val); 

  }

  else if (cmd=="serial") {

    Serial.println(P1);

  }    

  else if (cmd=="detectCount") {

    Serial.println(P1+" = "+P2);

  }

  else if (cmd=="tcp") {

    String domain=P1;

    int port=P2.toInt();

    String request=P3;

    int wait=P4.toInt();      // wait = 0 or 1

 

    if ((port==443)||(domain.indexOf("https")==0)||(domain.indexOf("HTTPS")==0))

      Feedback=tcp_https(domain,request,port,wait);

    else

      Feedback=tcp_http(domain,request,port,wait); 

  }

  else if (cmd=="linenotify") {    //message=xxx&stickerPackageId=xxx&stickerId=xxx

    String token = P1;

    String request = P2;

    Feedback=LineNotify(token,request,1);

    if (Feedback.indexOf("status")!=-1) {

      int s=Feedback.indexOf("{");

      Feedback=Feedback.substring(s);

      int e=Feedback.indexOf("}");

      Feedback=Feedback.substring(0,e);

      Feedback.replace("\"","");

      Feedback.replace("{","");

      Feedback.replace("}","");

    }

  }

  else if (cmd=="sendCapturedImageToLineNotify") {

    Feedback=sendCapturedImageToLineNotify(P1);

    if (Feedback=="") Feedback="The image failed to send. <br>The framesize may be too large.";

  }

  else {

    Feedback="Command is not defined.";

  }

  if (Feedback=="") Feedback=Command; 

}

 

void setup() {

  WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0); 

 

  Serial.begin(115200);

  Serial.setDebugOutput(true); 

  Serial.println();

 

 

  camera_config_t config;

  config.ledc_channel = LEDC_CHANNEL_0;

  config.ledc_timer = LEDC_TIMER_0;

  config.pin_d0 = Y2_GPIO_NUM;

  config.pin_d1 = Y3_GPIO_NUM;

  config.pin_d2 = Y4_GPIO_NUM;

  config.pin_d3 = Y5_GPIO_NUM;

  config.pin_d4 = Y6_GPIO_NUM;

  config.pin_d5 = Y7_GPIO_NUM;

  config.pin_d6 = Y8_GPIO_NUM;

  config.pin_d7 = Y9_GPIO_NUM;

  config.pin_xclk = XCLK_GPIO_NUM;

  config.pin_pclk = PCLK_GPIO_NUM;

  config.pin_vsync = VSYNC_GPIO_NUM;

  config.pin_href = HREF_GPIO_NUM;

  config.pin_sscb_sda = SIOD_GPIO_NUM;

  config.pin_sscb_scl = SIOC_GPIO_NUM;

  config.pin_pwdn = PWDN_GPIO_NUM;

  config.pin_reset = RESET_GPIO_NUM;

  config.xclk_freq_hz = 20000000;

  config.pixel_format = PIXFORMAT_JPEG;

  //init with high specs to pre-allocate larger buffers

  if(psramFound()){

    config.frame_size = FRAMESIZE_UXGA;

    config.jpeg_quality = 10;  //0-63 lower number means higher quality

    config.fb_count = 2;

  } else {

    config.frame_size = FRAMESIZE_SVGA;

    config.jpeg_quality = 12;  //0-63 lower number means higher quality

    config.fb_count = 1;

  }

 

  // camera init

  esp_err_t err = esp_camera_init(&config);

  if (err != ESP_OK) {

    Serial.printf("Camera init failed with error 0x%x", err);

    delay(1000);

    ESP.restart();

  }

 

  //drop down frame size for higher initial frame rate

  sensor_t * s = esp_camera_sensor_get();

  s->set_framesize(s, FRAMESIZE_QVGA);  //UXGA|SXGA|XGA|SVGA|VGA|CIF|QVGA|HQVGA|QQVGA 

 

  ledcAttachPin(4, 4); 

  ledcSetup(4, 5000, 8);   

 

  WiFi.mode(WIFI_AP_STA);

 

  //WiFi.config(IPAddress(192, 168, 201, 100), IPAddress(192, 168, 201, 2), IPAddress(255, 255, 255, 0));

 

  WiFi.begin(ssid, password);   

 

  delay(1000);

  Serial.println("");

  Serial.print("Connecting to ");

  Serial.println(ssid);

 

  long int StartTime=millis();

  while (WiFi.status() != WL_CONNECTED)

  {

      delay(500);

      if ((StartTime+10000) < millis()) break;  

  }

 

  if (WiFi.status() == WL_CONNECTED) {   

    WiFi.softAP((WiFi.localIP().toString()+"_"+(String)apssid).c_str(), appassword);       

    Serial.println("");

    Serial.println("STAIP address: ");

    Serial.println(WiFi.localIP()); 

 

    for (int i=0;i<5;i++) {  

      ledcWrite(4,10);

      delay(200);

      ledcWrite(4,0);

      delay(200);   

    }        

  }

  else {

    WiFi.softAP((WiFi.softAPIP().toString()+"_"+(String)apssid).c_str(), appassword);        

 

    for (int i=0;i<2;i++) {   

      ledcWrite(4,10);

      delay(1000);

      ledcWrite(4,0);

      delay(1000);   

    }

  }    

 

  

  //WiFi.softAPConfig(IPAddress(192, 168, 4, 1), IPAddress(192, 168, 4, 1), IPAddress(255, 255, 255, 0));

  Serial.println("");

  Serial.println("APIP address: ");

  Serial.println(WiFi.softAPIP());   

 

  pinMode(4, OUTPUT);

  digitalWrite(4, LOW); 

 

  server.begin();         

}

 

static const char PROGMEM INDEX_HTML[] = R"rawliteral(

  <!DOCTYPE html>

  <head>

  <meta charset="utf-8">

  <meta name="viewport" content="width=device-width,initial-scale=1">

  <script src="https:\/\/ajax.googleapis.com/ajax/libs/jquery/1.8.0/jquery.min.js"></script>

  <script src="https:\/\/cdn.jsdelivr.net/npm/@tensorflow/tfjs@1.3.1/dist/tf.min.js"> </script>

  <script src="https:\/\/cdn.jsdelivr.net/npm/@tensorflow-models/coco-ssd@2.1.0"> </script>  

  </head><body>

  <img id="ShowImage" src="" style="display:none">

  <canvas id="canvas" width="0" height="0"></canvas> 

  <table>

  <tr>

    <td><input type="button" id="restart" value="Restart"></td>

    <td colspan="2"><input type="button" id="getStill" value="Start Detect" style="display:none"></td>

  </tr>

  <tr>

    <td>Object</td>

    <td colspan="2">

        <select id="object" onchange="count.innerHTML='';">

          <option value="person">person</option>

          <option value="bicycle">bicycle</option>

          <option value="car">car</option>

          <option value="motorcycle">motorcycle</option>

          <option value="airplane">airplane</option>

          <option value="bus">bus</option>

          <option value="train">train</option>

          <option value="truck">truck</option>

          <option value="boat">boat</option>

          <option value="traffic light">traffic light</option>

          <option value="fire hydrant">fire hydrant</option>

          <option value="stop sign">stop sign</option>

          <option value="parking meter">parking meter</option>

          <option value="bench">bench</option>

          <option value="bird">bird</option>

          <option value="cat">cat</option>

          <option value="dog">dog</option>

          <option value="horse">horse</option>

          <option value="sheep">sheep</option>

          <option value="cow">cow</option>

          <option value="elephant">elephant</option>

          <option value="bear">bear</option>

          <option value="zebra">zebra</option>

          <option value="giraffe">giraffe</option>

          <option value="backpack">backpack</option>

          <option value="umbrella">umbrella</option>

          <option value="handbag">handbag</option>

          <option value="tie">tie</option>

          <option value="suitcase">suitcase</option>

          <option value="frisbee">frisbee</option>

          <option value="skis">skis</option>

          <option value="snowboard">snowboard</option>

          <option value="sports ball">sports ball</option>

          <option value="kite">kite</option>

          <option value="baseball bat">baseball bat</option>

          <option value="baseball glove">baseball glove</option>

          <option value="skateboard">skateboard</option>

          <option value="surfboard">surfboard</option>

          <option value="tennis racket">tennis racket</option>

          <option value="bottle">bottle</option>

          <option value="wine glass">wine glass</option>

          <option value="cup">cup</option>

          <option value="fork">fork</option>

          <option value="knife">knife</option>

          <option value="spoon">spoon</option>

          <option value="bowl">bowl</option>

          <option value="banana">banana</option>

          <option value="apple">apple</option>

          <option value="sandwich">sandwich</option>

          <option value="orange">orange</option>

          <option value="broccoli">broccoli</option>

          <option value="carrot">carrot</option>

          <option value="hot dog">hot dog</option>

          <option value="pizza">pizza</option>

          <option value="donut">donut</option>

          <option value="cake">cake</option>

          <option value="chair">chair</option>

          <option value="couch">couch</option>

          <option value="potted plant">potted plant</option>

          <option value="bed">bed</option>

          <option value="dining table">dining table</option>

          <option value="toilet">toilet</option>

          <option value="tv">tv</option>

          <option value="laptop">laptop</option>

          <option value="mouse">mouse</option>

          <option value="remote">remote</option>

          <option value="keyboard">keyboard</option>

          <option value="cell phone">cell phone</option>

          <option value="microwave">microwave</option>

          <option value="oven">oven</option>

          <option value="toaster">toaster</option>

          <option value="sink">sink</option>

          <option value="refrigerator">refrigerator</option>

          <option value="book">book</option>

          <option value="clock">clock</option>

          <option value="vase">vase</option>

          <option value="scissors">scissors</option>

          <option value="teddy bear">teddy bear</option>

          <option value="hair drier">hair drier</option>

          <option value="toothbrush">toothbrush</option>

        </select>

    </td>

    <td><span id="count" style="color:red"><span></td>

  </tr>

  <tr>

    <td>ScoreLimit</td>

    <td colspan="2">

      <select id="score">

        <option value="1.0">1</option>

        <option value="0.9">0.9</option>

        <option value="0.8">0.8</option>

        <option value="0.7">0.7</option>

        <option value="0.6">0.6</option>

        <option value="0.5">0.5</option>

        <option value="0.4">0.4</option>

        <option value="0.3">0.3</option>

        <option value="0.2">0.2</option>

        <option value="0.1">0.1</option>

        <option value="0" selected="selected">0</option>

      </select>

    </td>

  </tr>

  <tr>

    <td>MirrorImage</td>

    <td colspan="2"> 

      <select id="mirrorimage">

        <option value="1">yes</option>

        <option value="0">no</option>

      </select>

    </td>

  </tr>    

  <tr>

    <td>Resolution</td>

    <td colspan="2">

      <select id="framesize">

        <option value="UXGA">UXGA(1600x1200)</option>

        <option value="SXGA">SXGA(1280x1024)</option>

        <option value="XGA">XGA(1024x768)</option>

        <option value="SVGA">SVGA(800x600)</option>

        <option value="VGA">VGA(640x480)</option>

        <option value="CIF">CIF(400x296)</option>

        <option value="QVGA" selected="selected">QVGA(320x240)</option>

        <option value="HQVGA">HQVGA(240x176)</option>

        <option value="QQVGA">QQVGA(160x120)</option>

      </select>

    </td>

  </tr>   

  <tr>

    <td>Flash</td>

    <td colspan="2"><input type="range" id="flash" min="0" max="255" value="0"></td>

  </tr>

  <tr>

    <td>Quality</td>

    <td colspan="2"><input type="range" id="quality" min="10" max="63" value="10"></td>

  </tr>

  <tr>

    <td>Brightness</td>

    <td colspan="2"><input type="range" id="brightness" min="-2" max="2" value="0"></td>

  </tr>

  <tr>

    <td>Contrast</td>

    <td colspan="2"><input type="range" id="contrast" min="-2" max="2" value="0"></td>

  </tr>

 

  </table>

  <div id="result" style="color:red"><div>

  </body>

  </html>

 

  <script>

    var getStill = document.getElementById('getStill');

    var ShowImage = document.getElementById('ShowImage');

    var canvas = document.getElementById("canvas");

    var context = canvas.getContext("2d");

    var object = document.getElementById('object');

    var score = document.getElementById("score");

    var mirrorimage = document.getElementById("mirrorimage");     

    var count = document.getElementById('count');

    var result = document.getElementById('result');

    var flash = document.getElementById('flash');

    var lastValue="";

    var myTimer;

    var restartCount=0;

    var Model;   

    getStill.onclick = function (event) {

      clearInterval(myTimer); 

      myTimer = setInterval(function(){error_handle();},5000);

      ShowImage.src=location.origin+'/?getstill='+Math.random();

    }

    function error_handle() {

      restartCount++;

      clearInterval(myTimer);

      if (restartCount<=2) {

        result.innerHTML = "Get still error. <br>Restart ESP32-CAM "+restartCount+" times.";

        myTimer = setInterval(function(){getStill.click();},10000);

      }

      else

        result.innerHTML = "Get still error. <br>Please close the page and check ESP32-CAM.";

    }   

    ShowImage.onload = function (event) {

      clearInterval(myTimer);

      restartCount=0;

      canvas.setAttribute("width", ShowImage.width);

      canvas.setAttribute("height", ShowImage.height);

      if (mirrorimage.value==1) {

        context.translate((canvas.width + ShowImage.width) / 2, 0);

        context.scale(-1, 1);

        context.drawImage(ShowImage, 0, 0, ShowImage.width, ShowImage.height);

        context.setTransform(1, 0, 0, 1, 0, 0);

      }

      else

        context.drawImage(ShowImage,0,0,ShowImage.width,ShowImage.height);

      if (Model) {

        DetectImage();

      }         

    }    

   

    restart.onclick = function (event) {

      fetch(location.origin+'/?restart=stop');

    }   

    framesize.onclick = function (event) {

      fetch(document.location.origin+'/?framesize='+this.value+';stop');

    } 

    flash.onchange = function (event) {

      fetch(location.origin+'/?flash='+this.value+';stop');

    }

    quality.onclick = function (event) {

      fetch(document.location.origin+'/?quality='+this.value+';stop');

    }

    brightness.onclick = function (event) {

      fetch(document.location.origin+'/?brightness='+this.value+';stop');

    }

    contrast.onclick = function (event) {

      fetch(document.location.origin+'/?contrast='+this.value+';stop');

    }                            

   

    function ObjectDetect() {

      result.innerHTML = "Please wait for loading model.";

      cocoSsd.load().then(cocoSsd_Model => {

        Model = cocoSsd_Model;

        result.innerHTML = "";

        getStill.style.display = "block";

      });

    }

   

    function DetectImage() {

      Model.detect(canvas).then(Predictions => {   

        var s = (canvas.width>canvas.height)?canvas.width:canvas.height;

        var objectCount=0;

       

        //console.log('Predictions: ', Predictions);

        if (Predictions.length>0) {

          result.innerHTML = "";

          for (var i=0;i<Predictions.length;i++) {

            const x = Predictions[i].bbox[0];

            const y = Predictions[i].bbox[1];

            const width = Predictions[i].bbox[2];

            const height = Predictions[i].bbox[3];

            context.lineWidth = Math.round(s/200);

            context.strokeStyle = "#00FFFF";

            context.beginPath();

            context.rect(x, y, width, height);

            context.stroke();

            context.lineWidth = "2";

            context.fillStyle = "red";

            context.font = Math.round(s/30) + "px Arial";

            context.fillText(Predictions[i].class, x, y);

            //context.fillText(i, x, y);

            result.innerHTML+= "[ "+i+" ] "+Predictions[i].class+", "+Math.round(Predictions[i].score*100)+"%, "+Math.round(x)+", "+Math.round(y)+", "+Math.round(width)+", "+Math.round(height)+"<br>";

           

            if (Predictions[i].class==object.value&&Predictions[i].score>=score.value) {

              objectCount++;

            } 

          }

          count.innerHTML = objectCount;

        }

        else {

          result.innerHTML = "Unrecognizable";

          count.innerHTML = "0";

        }

   

      //if (count.innerHTML != lastValue) {

          lastValue = count.innerHTML;

          if (objectCount>0) {

            //$.ajax({url: document.location.origin+'/?serial='+object.value+';stop', async: false});

            $.ajax({url: document.location.origin+'/?detectCount='+object.value+';'+String(objectCount)+';stop', async: false});

          } 

      //}

        try {

          document.createEvent("TouchEvent");

          setTimeout(function(){getStill.click();},250);

        }

        catch(e) {

          setTimeout(function(){getStill.click();},150);

        }

      });

    }

    function getFeedback(target) {

      var data = $.ajax({

      type: "get",

      dataType: "text",

      url: target,

      success: function(response)

        {

          result.innerHTML = response;

        },

        error: function(exception)

        {

          result.innerHTML = 'fail';

        }

      });

    }     

    window.onload = function () { ObjectDetect(); }   

  </script>  

)rawliteral";

 

 

 

void loop() {

  Feedback="";Command="";cmd="";P1="";P2="";P3="";P4="";P5="";P6="";P7="";P8="";P9="";

  ReceiveState=0,cmdState=1,strState=1,questionstate=0,equalstate=0,semicolonstate=0;

 

   WiFiClient client = server.available();

 

  if (client) {

    String currentLine = "";

 

    while (client.connected()) {

      if (client.available()) {

        char c = client.read();            

       

        getCommand(c);  

               

        if (c == '\n') {

          if (currentLine.length() == 0) {   

           

            if (cmd=="getstill") {

            

              camera_fb_t * fb = NULL;

              fb = esp_camera_fb_get(); 

              if(!fb) {

                Serial.println("Camera capture failed");

                delay(1000);

                ESP.restart();

              }

 

              client.println("HTTP/1.1 200 OK");

              client.println("Access-Control-Allow-Origin: *");             

              client.println("Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept");

              client.println("Access-Control-Allow-Methods: GET,POST,PUT,DELETE,OPTIONS");

              client.println("Content-Type: image/jpeg");

              client.println("Content-Disposition: form-data; name=\"imageFile\"; filename=\"picture.jpg\"");

              client.println("Content-Length: " + String(fb->len));            

              client.println("Connection: close");

              client.println();

             

              uint8_t *fbBuf = fb->buf;

              size_t fbLen = fb->len;

              for (size_t n=0;n<fbLen;n=n+1024) {

                if (n+1024<fbLen) {

                  client.write(fbBuf, 1024);

                  fbBuf += 1024;

                }

                else if (fbLen%1024>0) {

                  size_t remainder = fbLen%1024;

                  client.write(fbBuf, remainder);

                }

              } 

             

              esp_camera_fb_return(fb);

           

              pinMode(4, OUTPUT);

              digitalWrite(4, LOW);              

            }

            else {

             

              client.println("HTTP/1.1 200 OK");

              client.println("Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept");

              client.println("Access-Control-Allow-Methods: GET,POST,PUT,DELETE,OPTIONS");

              client.println("Content-Type: text/html; charset=utf-8");

              client.println("Access-Control-Allow-Origin: *");

              client.println("Connection: close");

              client.println();

             

              String Data="";

              if (cmd!="")

                Data = Feedback;

              else {

                Data = String((const char *)INDEX_HTML);

              }

              int Index;

              for (Index = 0; Index < Data.length(); Index = Index+1000) {

                client.print(Data.substring(Index, Index+1000));

              }          

             

              client.println();

            }

                       

            Feedback="";

            break;

          } else {

            currentLine = "";

          }

        }

        else if (c != '\r') {

          currentLine += c;

        }

 

        if ((currentLine.indexOf("/?")!=-1)&&(currentLine.indexOf(" HTTP")!=-1)) {

          if (Command.indexOf("stop")!=-1) {   http://192.168.xxx.xxx/?cmd=aaa;bbb;ccc;stop

            client.println();

            client.println();

            client.stop();

          }

          currentLine="";

          Feedback="";

          ExecuteCommand();

        }

      }

    }

    delay(1);

    client.stop();

  }

}

 

 

void getCommand(char c)

{

  if (c=='?') ReceiveState=1;

  if ((c==' ')||(c=='\r')||(c=='\n')) ReceiveState=0;

 

  if (ReceiveState==1)

  {

    Command=Command+String(c);

   

    if (c=='=') cmdState=0;

    if (c==';') strState++;

 

    if ((cmdState==1)&&((c!='?')||(questionstate==1))) cmd=cmd+String(c);

    if ((cmdState==0)&&(strState==1)&&((c!='=')||(equalstate==1))) P1=P1+String(c);

    if ((cmdState==0)&&(strState==2)&&(c!=';')) P2=P2+String(c);

    if ((cmdState==0)&&(strState==3)&&(c!=';')) P3=P3+String(c);

    if ((cmdState==0)&&(strState==4)&&(c!=';')) P4=P4+String(c);

    if ((cmdState==0)&&(strState==5)&&(c!=';')) P5=P5+String(c);

    if ((cmdState==0)&&(strState==6)&&(c!=';')) P6=P6+String(c);

    if ((cmdState==0)&&(strState==7)&&(c!=';')) P7=P7+String(c);

    if ((cmdState==0)&&(strState==8)&&(c!=';')) P8=P8+String(c);

    if ((cmdState==0)&&(strState>=9)&&((c!=';')||(semicolonstate==1))) P9=P9+String(c);

   

    if (c=='?') questionstate=1;

    if (c=='=') equalstate=1;

    if ((strState>=9)&&(c==';')) semicolonstate=1;

  }

}

 

String tcp_http(String domain,String request,int port,byte wait)

{

    WiFiClient client_tcp;

 

    if (client_tcp.connect(domain.c_str(), port))

    {

      Serial.println("GET " + request);

      client_tcp.println("GET " + request + " HTTP/1.1");

      client_tcp.println("Host: " + domain);

      client_tcp.println("Connection: close");

      client_tcp.println();

 

      String getResponse="",Feedback="";

      boolean state = false;

      int waitTime = 3000;   // timeout 3 seconds

      long startTime = millis();

      while ((startTime + waitTime) > millis())

      {

        while (client_tcp.available())

        {

            char c = client_tcp.read();

            if (state==true) Feedback += String(c);         

            if (c == '\n')

            {

              if (getResponse.length()==0) state=true;

              getResponse = "";

            }

            else if (c != '\r')

              getResponse += String(c);

            if (wait==1)

              startTime = millis();

         }

         if (wait==0)

          if ((state==true)&&(Feedback.length()!= 0)) break;

      }

      client_tcp.stop();

      return Feedback;

    }

    else

      return "Connection failed"; 

}

 

String tcp_https(String domain,String request,int port,byte wait)

{

    WiFiClientSecure client_tcp;

    client_tcp.setInsecure();   //run version 1.0.5 or above

 

    if (client_tcp.connect(domain.c_str(), port))

    {

      Serial.println("GET " + request);

      client_tcp.println("GET " + request + " HTTP/1.1");

      client_tcp.println("Host: " + domain);

      client_tcp.println("Connection: close");

      client_tcp.println();

 

      String getResponse="",Feedback="";

      boolean state = false;

      int waitTime = 3000;   // timeout 3 seconds

      long startTime = millis();

      while ((startTime + waitTime) > millis())

      {

        while (client_tcp.available())

        {

            char c = client_tcp.read();

            if (state==true) Feedback += String(c);          

            if (c == '\n')

            {

              if (getResponse.length()==0) state=true;

              getResponse = "";

            }

            else if (c != '\r')

              getResponse += String(c);

            if (wait==1)

              startTime = millis();

         }

         if (wait==0)

          if ((state==true)&&(Feedback.length()!= 0)) break;

      }

      client_tcp.stop();

      return Feedback;

    }

    else

      return "Connection failed"; 

}

 

String LineNotify(String token, String request, byte wait)

{

  request.replace("%","%25"); 

  request.replace(" ","%20");

  request.replace("&","%20");

  request.replace("#","%20");

  //request.replace("\'","%27");

  request.replace("\"","%22");

  request.replace("\n","%0D%0A");

  request.replace("%3Cbr%3E","%0D%0A");

  request.replace("%3Cbr/%3E","%0D%0A");

  request.replace("%3Cbr%20/%3E","%0D%0A");

  request.replace("%3CBR%3E","%0D%0A");

  request.replace("%3CBR/%3E","%0D%0A");

  request.replace("%3CBR%20/%3E","%0D%0A");

  request.replace("%20stickerPackageId","&stickerPackageId");

  request.replace("%20stickerId","&stickerId");   

 

  WiFiClientSecure client_tcp;

  client_tcp.setInsecure();   //run version 1.0.5 or above

 

  if (client_tcp.connect("notify-api.line.me", 443))

  {

    client_tcp.println("POST /api/notify HTTP/1.1");

    client_tcp.println("Connection: close");

    client_tcp.println("Host: notify-api.line.me");

    client_tcp.println("User-Agent: ESP8266/1.0");

    client_tcp.println("Authorization: Bearer " + token);

    client_tcp.println("Content-Type: application/x-www-form-urlencoded");

    client_tcp.println("Content-Length: " + String(request.length()));

    client_tcp.println();

    client_tcp.println(request);

    client_tcp.println();

   

    String getResponse="",Feedback="";

    boolean state = false;

    int waitTime = 3000;   // timeout 3 seconds

    long startTime = millis();

    while ((startTime + waitTime) > millis())

    {

      while (client_tcp.available())

      {

          char c = client_tcp.read();

          if (state==true) Feedback += String(c);       

          if (c == '\n')

          {

            if (getResponse.length()==0) state=true;

            getResponse = "";

          }

          else if (c != '\r')

            getResponse += String(c);

          if (wait==1)

            startTime = millis();

       }

       if (wait==0)

        if ((state==true)&&(Feedback.length()!= 0)) break;

    }

    client_tcp.stop();

    return Feedback;

  }

  else

    return "Connection failed"; 

}

 

String sendCapturedImageToLineNotify(String token)

{

  String getAll="", getBody = "";

 

  camera_fb_t * fb = NULL;

  fb = esp_camera_fb_get(); 

  if(!fb) {

    Serial.println("Camera capture failed");

    delay(1000);

    ESP.restart();

    return "";

  } 

     

  WiFiClientSecure client_tcp;

  client_tcp.setInsecure();   //run version 1.0.5 or above

 

  Serial.println("Connect to notify-api.line.me");

 

  if (client_tcp.connect("notify-api.line.me", 443)) {

    Serial.println("Connection successful");

 

    String message = "Welcome to Taiwan.";

    String head = "--Taiwan\r\nContent-Disposition: form-data; name=\"message\"; \r\n\r\n" + message + "\r\n--Taiwan\r\nContent-Disposition: form-data; name=\"imageFile\"; filename=\"esp32-cam.jpg\"\r\nContent-Type: image/jpeg\r\n\r\n";

    String tail = "\r\n--Taiwan--\r\n";

 

    uint16_t imageLen = fb->len;

    uint16_t extraLen = head.length() + tail.length();

    uint16_t totalLen = imageLen + extraLen;

 

    client_tcp.println("POST /api/notify HTTP/1.1");

    client_tcp.println("Connection: close");

    client_tcp.println("Host: notify-api.line.me");

    client_tcp.println("Authorization: Bearer " + token);

    client_tcp.println("Content-Length: " + String(totalLen));

    client_tcp.println("Content-Type: multipart/form-data; boundary=Taiwan");

    client_tcp.println();

    client_tcp.print(head);

   

    uint8_t *fbBuf = fb->buf;

    size_t fbLen = fb->len;

    for (size_t n=0;n<fbLen;n=n+1024) {

      if (n+1024<fbLen) {

        client_tcp.write(fbBuf, 1024);

        fbBuf += 1024;

      }

      else if (fbLen%1024>0) {

        size_t remainder = fbLen%1024;

        client_tcp.write(fbBuf, remainder);

      }

    } 

   

    client_tcp.print(tail);

    esp_camera_fb_return(fb);

   

    int waitTime = 10000;   // timeout 10 seconds

    long startTime = millis();

    boolean state = false;

    while ((startTime + waitTime) > millis())

    {

      Serial.print(".");

      delay(100);     

      while (client_tcp.available())

      {

          char c = client_tcp.read();

          if (state==true) getBody += String(c);       

          if (c == '\n')

          {

            if (getAll.length()==0) state=true;

            getAll = "";

          }

          else if (c != '\r')

            getAll += String(c);

          startTime = millis();

       }

       if (getBody.length()>0) break;

    }

    client_tcp.stop();

    //Serial.println(getAll);

    Serial.println(getBody);

  }

  else {

    getAll="Connected to notify-api.line.me failed.";

    getBody="Connected to notify-api.line.me failed.";

    Serial.println("Connected to notify-api.line.me failed.");

  }

 

  //return getAll;

  return getBody;

}


       I.            HASIL PRAKTIKUM

Gambar 1. Hasil Deteksi Objek Payung

 

Gambar 2. Hasil Deteksi Objek Jam


Gambar 3. Hasil Deteksi Objek Cell Phone

 

Gambar 4. Hasil Deteksi Objek Backpack

 

Gambar 5. Hasil Deteksi Objek Person

 

Gambar 6. Hasil Deteksi Objek Laptop


ANALISA

Pada praktikum pertemuan XI ini kamu melakukan deteksi objek dengan menggunakan ESP32 CAM. Dengan mengcopy script code yang ada pada website lalu di upload menggunakan software Arduino.Uno maka akan menampilkan alamat IP pada bagian Serial Monitor setelah setelah selesai diupload. Akan ada 2 IP yang munculkan pada Serial Monitor, maka ambil IP yang bagian atas setelah itu buka browser untuk melihat hasil nya. Jika berhasil maka ESP32 CAM akan menampilkan tangkapan foto dan akan mendeteksi apakah gambar yang di tangkap sesuai dengan jenis Object yang dipilih. Untuk Gambar 1. jenis Objeck yang dipilih adalah “umbrella” maka ESP32 CAM akan mendeteksi object payung, begitupun untuk hasil dari gambar-gambar selanjutnya.

Comments

Popular posts from this blog

ESP32-CAM Web Server dengan OpenCV.js: Deteksi dan Pelacakan Warna