EasyClassifyMultiThreadInference

Support

Required licenses

EasyClassify

Recommended images

In the Deep Learning Additional Resources, the images from the folder EasyClassify/MiniWaffles/Images

Location

[…]C:\Users\Public\Documents\Euresys\Open eVision 24.02\Sample Programs
\[LANGUAGE] samples
\Deep Learning Inspection\EasyClassifyMultiThreadInference

- In C++, the sample EasySegmentSupervisedMultiThreadInference illustrates a multithread inference for EasySegment Supervised.
- In Qt, the sample EasyLocateMultiThreadInference illustrates a multithread inference for EasyLocate.

Purpose

This sample program demonstrates how to:

Perform a multithread inference with EasyClassify.
Implement external and internal multithreading.

Code highlights

1. Launch one acquisition thread running the function ImageLoop.
ThreadParameters param = new ThreadParameters(this, engine.SelectedItem.ToString(), device.SelectedItem.ToString(), precision.SelectedItem.ToString(), (int)internalThreads.Value, (int)batchSize.Value);		
acquisitionThread = new Thread(ImageLoop);				
acquisitionThread.Start(param);

2. The function ImageLoop pushes the images into an image queue.
ImageBatch batch = new ImageBatch(numImagesPerInference);

for (int j = 0; j < numImagesPerInference; j++)
{
  batch.Images[j] = new EImageC24();
  batch.Images[j].Load(mainForm.m_images[i + j]);
  batch.ImagesId[j] = i + j;
}

// Adds the batch of images to the queue and signals the processing threads about the new data.
lock (mainForm.locker)
{
  queue.Enqueue(batch);
  Monitor.PulseAll(mainForm.locker);
}
3. The NumExternalThreads processing threads are created and run the function ClassificationLoop.
// Create the external threads
processingThreads = new Thread[((int)externalThreads.Value)];
for (int i = 0; i < externalThreads.Value; i++)
{
  processingThreads[i] = new Thread(ClassificationLoop);
  processingThreads[i].Start(param);
}
4. The function ClassificationLoop invokes a delegate to pass the computed result to the main UI thread.
// Invoke the delegate with the results for updating the user interface.
mainForm.Invoke(mainForm.m_classificationFinishedDelegate, batch.ImagesId, result, stopWatch.ElapsedMilliseconds);
5. The delegate calls the method ClassificationFinished that updates the UI to display the result and the processing time for each image.
public void ClassificationFinished(int[] imagesId, EClassificationResult[] results, long processingTime)
{
  try
  {
    for (int i = 0; i < imagesId.Length; i++)
    {
      m_detectedClasses[imagesId[i]] = results[i].BestLabel;
      m_processingTime[imagesId[i]] = processingTime;
      m_processed += 1;
      listView1.Items[imagesId[i]].SubItems[1].Text = results[i].BestLabel;
      listView1.Items[imagesId[i]].SubItems[2].Text = String.Format("{0} ms for {1} images", processingTime, imagesId.Length);
      listView1.Items[imagesId[i]].SubItems[3].Text = String.Format("{0} ms", processingTime / imagesId.Length);
    }
    ...
  }
}