GstInference/Example pipelines with hierarchical metadata/PC: Difference between revisions

From RidgeRun Developer Wiki
No edit summary
 
(15 intermediate revisions by the same user not shown)
Line 22: Line 22:


[[File:Inference example.png|1000px|thumb|center|Detection with new metadata]]
[[File:Inference example.png|1000px|thumb|center|Detection with new metadata]]
<html>
<html>
<head>
<head>
Line 123: Line 122:


<div class="container">
<div class="container">
   <form action="/action_page.php">
   <form action="/action_page.php" id="gen_form">
    <div class="row">
      <div class="col-25">
        <label for="platform">Platform</label>
      </div>
      <div class="col-75">
        <select id="platform" name="platform" onchange="dynamic_platform_dropdown(this.options[this.selectedIndex].value)">
          <option value="" disabled selected>Select your platform</option>
          <option value="pc">PC</option>
          <option value="jetson">Jetson</option>
        </select>
      </div>
    </div>
     <div class="row">
     <div class="row">
       <div class="col-25">
       <div class="col-25">
Line 129: Line 140:
       </div>
       </div>
       <div class="col-75">
       <div class="col-75">
         <select id="backend" name="backend" onchange="backend_selection()">
         <select id="backend" name="backend" onchange="backend_selection(this.options[this.selectedIndex].value)">
           <option value="" disabled selected>Select your backend</option>
           <option value="" disabled selected>Select your backend</option>
          <option value="ncsdk">NCSDK</option>
           <option value="tensorflow">TensorFlow</option>
           <option value="tensorflow">TensorFlow</option>
           <option value="tflite">TFLite</option>
           <option value="tflite">TFLite</option>
Line 149: Line 159:
           <option value="inceptionv4">Inceptionv4</option>
           <option value="inceptionv4">Inceptionv4</option>
           <option value="mobilenetv2">MobileNetv2</option>
           <option value="mobilenetv2">MobileNetv2</option>
           <option value="resnet50v1">Resnet50v1</option>
           <option value="facenetv1">FaceNet</option>
           <option value="tinyyolov2">TinyYolov2</option>
           <option value="tinyyolov2">TinyYolov2</option>
          <option value="tinyyolov3">TinyYolov3</option>
          <option value="facenetv1">FaceNet</option>
         </select>
         </select>
       </div>
       </div>
Line 197: Line 205:
           <option value=" multifilesrc">Image file</option>  
           <option value=" multifilesrc">Image file</option>  
           <option value=" filesrc">Video file</option>
           <option value=" filesrc">Video file</option>
           <option value=" v4l2src">Camera stream</option>
           <option value=" v4l2src">Camera stream (v4l2)</option>
         </select>
         </select>
       </div>
       </div>
Line 212: Line 220:
           <option value="" disabled selected>Select your sink</option>
           <option value="" disabled selected>Select your sink</option>
           <option value=" fakesink" >fakesink</option>  
           <option value=" fakesink" >fakesink</option>  
           <option value=" xvimagesink">xvimagesink</option>
           <option value=" videoconvert ! xvimagesink sync=false async=false qos=false">xvimagesink</option>
         </select>
         </select>
       </div>
       </div>
Line 233: Line 241:
       </div>
       </div>
       <div class="col-25">
       <div class="col-25">
         <input type="text" id="thickness" placeholder="thickness" disabled="true">
         <input type="text" id="thickness" placeholder="Thickness" disabled="true">
       </div>
       </div>
       <div class="col-25">
       <div class="col-25">
         <input type="text" id="fontscale" placeholder="fontscale" disabled="true">
         <input type="text" id="fontscale" placeholder="Fontscale" disabled="true">
       </div>
       </div>
       <div class="col-25">
       <div class="col-25">
Line 257: Line 265:
     </div>
     </div>
     <div class="row">
     <div class="row">
      <input type="reset" class="button" value="Reset"/>
    <button type="button" class="button" onclick="reset_all()">Reset</button>
     <button type="button" class="button" onclick="print()">Generate!</button>
     <button type="button" class="button" onclick="print()">Generate!</button>
     </div>
     </div>
Line 263: Line 271:
</div>
</div>


<!-- ****************************************************** -->
<!-- ********************** Variables and dicts ******************************** -->


<script>
<script>
Line 323: Line 331:
   facenetv1: "imagenet_labels.txt"
   facenetv1: "imagenet_labels.txt"
};
};
/**********************************************************************
* General
***********************************************************************/
function reset_all() {
  document.getElementById("gen_form").reset();
  backend = "";
  src = "";
  model = "";
  model_props = "";
  tee = "";
  filter = "";
  crop = "";
  overlay = "";
  sink = "";
  disable_element("filter_class_id");
}
function disable_element(element) {
  document.getElementById(element).disabled=true;
  document.getElementById(element).value=null;
}
function enable_element(element) {
  document.getElementById(element).disabled=false;
}
function search_option(child_id, label, parent, mode) {
  var done="false";
  var selectobject = document.getElementById(parent);
  for (var i=0; i<selectobject.length; i++) {
      if (selectobject.options[i].value == child_id) {
        if(mode == "remove") {
          selectobject.remove(i);
        }
        done="true";
      }
  }
  if (done =="false") {
    if (mode == "add") {
      var new_option = document.createElement("option");
      new_option.text = label;
      new_option.value = child_id;
      document.getElementById(parent).appendChild(new_option);
    }
  }
}
/**********************************************************************
* Elements selection
***********************************************************************/
function dynamic_platform_dropdown(platform) {
  reset_all();
  document.getElementById("platform").value = platform;
 
  if (platform == "pc") {
    search_option("ncsdk","NCSDK","backend","add");
    search_option(" nvarguscamerasrc","nvarguscamerasrc","source","remove");
    search_option(" videoconvert ! 'video/x-raw,format=I420' ! nvvidconv ! nvoverlaysink","nvoverlaysink","sink","remove");
  } else {
    search_option("ncsdk","NCSDK","backend","remove");
    search_option(" nvarguscamerasrc","nvarguscamerasrc","source","add");
    search_option(" videoconvert ! 'video/x-raw,format=I420' ! nvvidconv ! nvoverlaysink","nvoverlaysink","sink","add");
  }
}
function backend_selection(backend) {
  var option_rn = document.createElement("option");
  switch (backend)
  {
    case "tensorflow" :
      search_option("tinyyolov3","TinyYolov3","model","add");
      search_option("resnet50v1","Resnet50V1","model","add");
      if( document.getElementById("model").value != "") {
        document.getElementById("inputlayer").value = input_layers[document.getElementById("model").value];
        document.getElementById("outputlayer").value = output_layers[document.getElementById("model").value];
      }
      enable_element("inputlayer");
      enable_element("outputlayer");
      break;
    case "tflite" :
      search_option("tinyyolov3","TinyYolov3","model","add");
      search_option("resnet50v1","Resnet50V1","model","add");
      disable_element("inputlayer");
      disable_element("outputlayer");
      break;
    case "ncsdk":
      search_option("tinyyolov3","TinyYolov3","model","remove");
      search_option("resnet50v1","Resnet50V1","model","remove");
      disable_element("inputlayer");
      disable_element("outputlayer");
      break;
  }
}


function model_selection() {
function model_selection() {
  // Default values from dictionary for Tensorflow models
   if( document.getElementById("backend").value == "tensorflow") {
   if( document.getElementById("backend").value == "tensorflow") {
     document.getElementById("inputlayer").value = input_layers[document.getElementById("model").value];
     document.getElementById("inputlayer").value = input_layers[document.getElementById("model").value];
     document.getElementById("outputlayer").value = output_layers[document.getElementById("model").value];
     document.getElementById("outputlayer").value = output_layers[document.getElementById("model").value];
    document.getElementById("inputlayer").disabled=false;
    document.getElementById("outputlayer").disabled=false;
  }
  else {
    document.getElementById("inputlayer").disabled=true;
    document.getElementById("inputlayer").value=null;
    document.getElementById("outputlayer").disabled=true;
    document.getElementById("outputlayer").value=null;
   }
   }
   document.getElementById("model_location").value = model_names[document.getElementById("model").value];
   document.getElementById("model_location").value = model_names[document.getElementById("model").value];
Line 346: Line 439:
   crop = " inferencecrop aspect-ratio=" + document.getElementById("aspect_ratio").value + " ! ";
   crop = " inferencecrop aspect-ratio=" + document.getElementById("aspect_ratio").value + " ! ";
}
}
function model_props_selection() {
  if (model != "") {
    model_props = " name=net model-location=" + document.getElementById("model_location").value + " backend=" + document.getElementById("backend").value + " labels=\"$(cat " +document.getElementById("labels").value + ")\"";
    if (backend == "tensorflow") {
      model_props = model_props + " backend::input-layer=" + document.getElementById("inputlayer").value + " backend::output-layer=" + document.getElementById("outputlayer").value;
    }
  } else {
    model_props = "";
  }
}
// TODO: modify for platform
function tee_selection() {
  if (model != "") {
    switch (platform) {
      case "jetson":
        tee = " tee name=t t. ! nvvidconv !  queue ! net.sink_model t. ! nvvidconv !  video/x-raw,format=RGBA ! queue ! net.sink_bypass net.src_model";
      break;
      case "pc":
        tee = " tee name=t t. ! queue ! videoconvert ! videoscale !  net.sink_model t. ! queue ! videoconvert ! net.sink_bypass  net.src_model !";
      break;
      default:
        tee = "";
      break;
    }
  } else {
    tee = "";
  }
}
function jetson_src_selection() {
  switch(src) {
    case " multifilesrc":
      src = src + " location=" + document.getElementById("source_location").value + " start-index=0 stop-index=0 loop=true ! jpegparse ! nvjpegdec ! 'video/x-raw' ! nvvidconv ! 'video/x-raw(memory:NVMM),format=NV12' ! nvvidconv ! queue !";
    break;
    case " filesrc":
      src = src + " location=" + document.getElementById("source_location").value + " qtdemux name=demux ! h264parse ! omxh264dec ! nvvidconv ! queue !";
    break;
    case " v4l2src":
      src = src + " device=" + document.getElementById("source_location").value + " ! nvvidconv ! queue !";
    break;
    case " nvarguscamerasrc":
      src = src + " sensor-id=0 ! 'video/x-raw(memory:NVMM), format=(string)NV12' ! nvvidconv ! queue !";
    break;
    default:
      src = "";
    break;
  }
}
function pc_src_selection() {
  switch(src) {
    case " multifilesrc":
      src = src + " location=" + document.getElementById("source_location").value + " start-index=0 stop-index=0 loop=true ! jpegparse ! jpegdec ! videoconvert ! videoscale ! queue !";
    break;
    case " filesrc":
      src = src + " location=" + document.getElementById("source_location").value + " ! decodebin ! videoconvert ! videoscale ! queue !";
    break;
    case " v4l2src":
      src = src + " device=" + document.getElementById("source_location").value + " ! videoconvert ! videoscale ! queue !";
    break;
    default:
      src = "";
    break;
  }
}
function src_props_selection() {
  switch(platform) {
    case "pc":
      pc_src_selection();
    break;
    case "jetson":
      jetson_src_selection();
    break;
  }
}
/**********************************************************************
* Optional utilities - enable
***********************************************************************/


function enable_overlay() {     
function enable_overlay() {     
   var checkbox = document.getElementById('en_inference_overlay');
   var checkbox = document.getElementById('en_inference_overlay');
   if(checkbox.checked == true) {
   if(checkbox.checked == true) {
     document.getElementById("thickness").disabled=false;
     enable_element("thickness");
     document.getElementById("style").disabled=false;
     enable_element("fontscale");
     document.getElementById("fontscale").disabled=false;
     enable_element("style");
     overlay = " inferenceoverlay";
     overlay = " fakesink net.src_bypass ! queue ! inferenceoverlay !";
   } else {
   } else {
     document.getElementById("thickness").disabled=true;
     disable_element("thickness");
     document.getElementById("style").disabled=true;
     disable_element("fontscale");
    document.getElementById("fontscale").disabled=true;
     disable_element("style");
    document.getElementById("thickness").value = null;
     document.getElementById("style").value = null;
    document.getElementById("fontscale").value = null;
     overlay = "";
     overlay = "";
   }
   }
Line 368: Line 542:
   var checkbox = document.getElementById('en_inferencefilter');
   var checkbox = document.getElementById('en_inferencefilter');
   if(checkbox.checked == true) {
   if(checkbox.checked == true) {
     document.getElementById("filter_class_id").disabled=false;
     enable_element("filter_class_id");
     filter = " inferencefilter";
     filter = " inferencefilter";
   } else {
   } else {
     document.getElementById("filter_class_id").disabled=true;
     disable_element("filter_class_id");
     filter = "";
     filter = "";
    document.getElementById("filter_class_id").value = null;
   }
   }
}
}
Line 380: Line 553:
   var checkbox = document.getElementById('en_inferencecrop');
   var checkbox = document.getElementById('en_inferencecrop');
   if(checkbox.checked == true) {
   if(checkbox.checked == true) {
     document.getElementById("aspect_ratio").disabled=false;
     enable_element("aspect_ratio");
     crop = " inferencecrop";
     crop = " inferencecrop";
   } else {
   } else {
     document.getElementById("aspect_ratio").disabled=true;
     disable_element("aspect_ratio");
     crop = "";
     crop = "";
    document.getElementById("aspect_ratio").value = null;
   }
   }
}
}
/**********************************************************************
* print final pipeline
***********************************************************************/


function print() {
function print() {
  platform = document.getElementById("platform").value;
  backend = document.getElementById("backend").value;
   model = document.getElementById("model").value;
   model = document.getElementById("model").value;
   src = document.getElementById("source").value;
   src = document.getElementById("source").value;
Line 395: Line 573:
    
    
   if(model != "") {
   if(model != "") {
     model_props = " name=net model-location=" + document.getElementById("model_location").value +" backend=" + document.getElementById("backend").value + " backend::input-layer=" + document.getElementById("inputlayer").value  + " labels=\"$(cat " +document.getElementById("labels").value + ")\" backend::output-layer=" + document.getElementById("outputlayer").value;
     model_props_selection();
    tee = " tee name=t t. ! queue ! videoconvert ! videoscale ! net.sink_model t. ! queue ! videoconvert ! net.sink_bypass  net.src_model !";
  }
 
  if(src != "") {
  tee_selection();
  src_props_selection();   
   }
   }


  switch(src) {
    case " multifilesrc":
      src = src + " location=" + document.getElementById("source_location").value + " start-index=0 stop-index=0 loop=true ! jpegparse ! jpegdec ! videoconvert ! videoscale ! queue !";
      break;
    case " filesrc":
      src = src + " location=" + document.getElementById("source_location").value + " ! decodebin ! videoconvert ! videoscale ! queue !";
      break;
    case " v4l2src":
      src = src + " device=" + document.getElementById("source_location").value + " ! videoconvert ! videoscale ! queue !";
      break;
    default:
      src = "";
  }


   if(overlay != "") {
   if(overlay != "") {
     overlay = " inferenceoverlay";
     overlay = " fakesink net.src_bypass ! queue ! inferenceoverlay !";
     var thickness= document.getElementById("thickness").value;
     var thickness= document.getElementById("thickness").value;
     var fontscale=document.getElementById("fontscale").value;
     var fontscale=document.getElementById("fontscale").value;
Line 426: Line 595:
     }
     }
     if(style != "") {
     if(style != "") {
       overlay = overlay + " style=" + fontscale;
       overlay = overlay + " style=" + style;
     }
     }
     overlay = overlay + " !";
     overlay = overlay + " !";
   }
   }  
   
   
   if(filter != "") {
   if(filter != "") {
Line 438: Line 607:
       filter = filter + " !";
       filter = filter + " !";
     }
     }
   }
   }  
      
      
   if(crop != "") {
   if(crop != "") {
Line 447: Line 616:
       crop = crop + " !";
       crop = crop + " !";
     }
     }
   }
   }  
 
   document.getElementById("new_pipeline").value = "gst-launch-1.0 " + model + model_props + src + tee + filter + crop + overlay + sink;  
   document.getElementById("new_pipeline").value = "gst-launch-1.0 " + model + model_props + src + tee + filter + crop + overlay + sink;  
}
}
Line 457: Line 625:
</body>
</body>
</html>
</html>


= Advanced pipelines =
= Advanced pipelines =

Latest revision as of 16:32, 13 March 2020




Previous: Example pipelines Index Next: Example pipelines/NANO




Sample pipelines

The following section contains a tool for generating simple GStreamer pipelines with one model of a selected architecture using our hierarchical inference metadata. If you are using and older version, you chan check the legacy pipelines section. Please make sure to check the documentation to understand the property usage for each element.

The required elements are:

  • Backend
  • Model
  • Model location
  • Labels
  • Source
  • Sink

The optional elements include:

  • inferencefilter
  • inferencrop
  • inferenceoverlay
Detection with new metadata

Pipeline generator

The following tool will provide simple pipelines according to the selected elements.

Optional utilites

The following elements are optional yet very useful. Check the documentation for more details on their properties.


Advanced pipelines

Previous: Example pipelines Index Next: Example pipelines/NANO