From ce65275edf8540248ba2b721ae2c7351c3284edd Mon Sep 17 00:00:00 2001
From: Marcus Turewicz <24448509+marcusturewicz@users.noreply.github.com>
Date: Fri, 14 Aug 2020 10:05:01 +1000
Subject: [PATCH] C# samples: Faster R-CNN (#4733)
* C# sample: Faster R-CNN
* Add link to new sample in samples README
* Remove duplicate image
---
.../LabelMap.cs | 87 +++++++++
...oft.ML.OnnxRuntime.FasterRcnnSample.csproj | 15 ++
.../Prediction.cs | 26 +++
.../Program.cs | 107 +++++++++++
.../README.md | 172 ++++++++++++++++++
.../demo.jpg | Bin 0 -> 171271 bytes
.../out.jpg | Bin 0 -> 315789 bytes
samples/README.md | 1 +
8 files changed, 408 insertions(+)
create mode 100644 csharp/sample/Microsoft.ML.OnnxRuntime.FasterRcnnSample/LabelMap.cs
create mode 100644 csharp/sample/Microsoft.ML.OnnxRuntime.FasterRcnnSample/Microsoft.ML.OnnxRuntime.FasterRcnnSample.csproj
create mode 100644 csharp/sample/Microsoft.ML.OnnxRuntime.FasterRcnnSample/Prediction.cs
create mode 100644 csharp/sample/Microsoft.ML.OnnxRuntime.FasterRcnnSample/Program.cs
create mode 100644 csharp/sample/Microsoft.ML.OnnxRuntime.FasterRcnnSample/README.md
create mode 100644 csharp/sample/Microsoft.ML.OnnxRuntime.FasterRcnnSample/demo.jpg
create mode 100644 csharp/sample/Microsoft.ML.OnnxRuntime.FasterRcnnSample/out.jpg
diff --git a/csharp/sample/Microsoft.ML.OnnxRuntime.FasterRcnnSample/LabelMap.cs b/csharp/sample/Microsoft.ML.OnnxRuntime.FasterRcnnSample/LabelMap.cs
new file mode 100644
index 0000000000..3dccd927b7
--- /dev/null
+++ b/csharp/sample/Microsoft.ML.OnnxRuntime.FasterRcnnSample/LabelMap.cs
@@ -0,0 +1,87 @@
+namespace Microsoft.ML.OnnxRuntime.FasterRcnnSample
+{
+ public class LabelMap
+ {
+ public static readonly string[] Labels = new[] {"__background",
+ "person",
+ "bicycle",
+ "car",
+ "motorcycle",
+ "airplane",
+ "bus",
+ "train",
+ "truck",
+ "boat",
+ "traffic light",
+ "fire hydrant",
+ "stop sign",
+ "parking meter",
+ "bench",
+ "bird",
+ "cat",
+ "dog",
+ "horse",
+ "sheep",
+ "cow",
+ "elephant",
+ "bear",
+ "zebra",
+ "giraffe",
+ "backpack",
+ "umbrella",
+ "handbag",
+ "tie",
+ "suitcase",
+ "frisbee",
+ "skis",
+ "snowboard",
+ "sports ball",
+ "kite",
+ "baseball bat",
+ "baseball glove",
+ "skateboard",
+ "surfboard",
+ "tennis racket",
+ "bottle",
+ "wine glass",
+ "cup",
+ "fork",
+ "knife",
+ "spoon",
+ "bowl",
+ "banana",
+ "apple",
+ "sandwich",
+ "orange",
+ "broccoli",
+ "carrot",
+ "hot dog",
+ "pizza",
+ "donut",
+ "cake",
+ "chair",
+ "couch",
+ "potted plant",
+ "bed",
+ "dining table",
+ "toilet",
+ "tv",
+ "laptop",
+ "mouse",
+ "remote",
+ "keyboard",
+ "cell phone",
+ "microwave",
+ "oven",
+ "toaster",
+ "sink",
+ "refrigerator",
+ "book",
+ "clock",
+ "vase",
+ "scissors",
+ "teddy bear",
+ "hair drier",
+ "toothbrush"};
+ }
+}
\ No newline at end of file
diff --git a/csharp/sample/Microsoft.ML.OnnxRuntime.FasterRcnnSample/Microsoft.ML.OnnxRuntime.FasterRcnnSample.csproj b/csharp/sample/Microsoft.ML.OnnxRuntime.FasterRcnnSample/Microsoft.ML.OnnxRuntime.FasterRcnnSample.csproj
new file mode 100644
index 0000000000..757ca6ab5a
--- /dev/null
+++ b/csharp/sample/Microsoft.ML.OnnxRuntime.FasterRcnnSample/Microsoft.ML.OnnxRuntime.FasterRcnnSample.csproj
@@ -0,0 +1,15 @@
+
+
+
+ Exe
+ netcoreapp3.1
+ 8.0
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/csharp/sample/Microsoft.ML.OnnxRuntime.FasterRcnnSample/Prediction.cs b/csharp/sample/Microsoft.ML.OnnxRuntime.FasterRcnnSample/Prediction.cs
new file mode 100644
index 0000000000..4857f2d83f
--- /dev/null
+++ b/csharp/sample/Microsoft.ML.OnnxRuntime.FasterRcnnSample/Prediction.cs
@@ -0,0 +1,26 @@
+namespace Microsoft.ML.OnnxRuntime.FasterRcnnSample
+{
+ public class Prediction
+ {
+ public Box Box { get; set; }
+ public string Label { get; set; }
+ public float Confidence { get; set; }
+ }
+
+ public class Box
+ {
+ public float Xmin { get; set; }
+ public float Ymin { get; set; }
+ public float Xmax { get; set; }
+ public float Ymax { get; set; }
+
+ public Box(float xmin, float ymin, float xmax, float ymax)
+ {
+ Xmin = xmin;
+ Ymin = ymin;
+ Xmax = xmax;
+ Ymax = ymax;
+
+ }
+ }
+}
\ No newline at end of file
diff --git a/csharp/sample/Microsoft.ML.OnnxRuntime.FasterRcnnSample/Program.cs b/csharp/sample/Microsoft.ML.OnnxRuntime.FasterRcnnSample/Program.cs
new file mode 100644
index 0000000000..88edca5c77
--- /dev/null
+++ b/csharp/sample/Microsoft.ML.OnnxRuntime.FasterRcnnSample/Program.cs
@@ -0,0 +1,107 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using Microsoft.ML.OnnxRuntime.Tensors;
+using SixLabors.ImageSharp;
+using SixLabors.ImageSharp.Formats;
+using SixLabors.ImageSharp.PixelFormats;
+using SixLabors.ImageSharp.Processing;
+using SixLabors.ImageSharp.Drawing.Processing;
+using SixLabors.Fonts;
+
+namespace Microsoft.ML.OnnxRuntime.FasterRcnnSample
+{
+ class Program
+ {
+ public static void Main(string[] args)
+ {
+ // Read paths
+ string modelFilePath = args[0];
+ string imageFilePath = args[1];
+ string outImageFilePath = args[2];
+
+ // Read image
+ using Image image = Image.Load(imageFilePath, out IImageFormat format);
+
+ // Resize image
+ float ratio = 800f / Math.Min(image.Width, image.Height);
+ using Stream imageStream = new MemoryStream();
+ image.Mutate(x => x.Resize((int)(ratio * image.Width), (int)(ratio * image.Height)));
+ image.Save(imageStream, format);
+
+ // Preprocess image
+ var paddedHeight = (int)(Math.Ceiling(image.Height / 32f) * 32f);
+ var paddedWidth = (int)(Math.Ceiling(image.Width / 32f) * 32f);
+ Tensor input = new DenseTensor(new[] { 3, paddedHeight, paddedWidth });
+ var mean = new[] { 102.9801f, 115.9465f, 122.7717f };
+ for (int y = paddedHeight - image.Height; y < image.Height; y++)
+ {
+ Span pixelSpan = image.GetPixelRowSpan(y);
+ for (int x = paddedWidth - image.Width; x < image.Width; x++)
+ {
+ input[0, y, x] = pixelSpan[x].B - mean[0];
+ input[1, y, x] = pixelSpan[x].G - mean[1];
+ input[2, y, x] = pixelSpan[x].R - mean[2];
+ }
+ }
+
+ // Setup inputs and outputs
+ var inputs = new List
+ {
+ NamedOnnxValue.CreateFromTensor("image", input)
+ };
+
+ // Run inference
+ using var session = new InferenceSession(modelFilePath);
+ using IDisposableReadOnlyCollection results = session.Run(inputs);
+
+ // Postprocess to get predictions
+ var resultsArray = results.ToArray();
+ float[] boxes = resultsArray[0].AsEnumerable().ToArray();
+ long[] labels = resultsArray[1].AsEnumerable().ToArray();
+ float[] confidences = resultsArray[2].AsEnumerable().ToArray();
+ var predictions = new List();
+ var minConfidence = 0.7f;
+ for (int i = 0; i < boxes.Length - 4; i += 4)
+ {
+ var index = i / 4;
+ if (confidences[index] >= minConfidence)
+ {
+ predictions.Add(new Prediction
+ {
+ Box = new Box(boxes[i], boxes[i + 1], boxes[i + 2], boxes[i + 3]),
+ Label = LabelMap.Labels[labels[index]],
+ Confidence = confidences[index]
+ });
+ }
+ }
+
+ // Put boxes, labels and confidence on image and save for viewing
+ using var outputImage = File.OpenWrite(outImageFilePath);
+ Font font = SystemFonts.CreateFont("Arial", 16);
+ foreach (var p in predictions)
+ {
+ image.Mutate(x =>
+ {
+ x.DrawLines(Color.Red, 2f, new PointF[] {
+
+ new PointF(p.Box.Xmin, p.Box.Ymin),
+ new PointF(p.Box.Xmax, p.Box.Ymin),
+
+ new PointF(p.Box.Xmax, p.Box.Ymin),
+ new PointF(p.Box.Xmax, p.Box.Ymax),
+
+ new PointF(p.Box.Xmax, p.Box.Ymax),
+ new PointF(p.Box.Xmin, p.Box.Ymax),
+
+ new PointF(p.Box.Xmin, p.Box.Ymax),
+ new PointF(p.Box.Xmin, p.Box.Ymin)
+ });
+ x.DrawText($"{p.Label}, {p.Confidence:0.00}", font, Color.White, new PointF(p.Box.Xmin, p.Box.Ymin));
+ });
+ }
+ image.Save(outputImage, format);
+ }
+ }
+}
\ No newline at end of file
diff --git a/csharp/sample/Microsoft.ML.OnnxRuntime.FasterRcnnSample/README.md b/csharp/sample/Microsoft.ML.OnnxRuntime.FasterRcnnSample/README.md
new file mode 100644
index 0000000000..5b042da0c6
--- /dev/null
+++ b/csharp/sample/Microsoft.ML.OnnxRuntime.FasterRcnnSample/README.md
@@ -0,0 +1,172 @@
+# C# Sample: Faster R-CNN
+
+The sample walks through how to run a pretrained Faster R-CNN object detection ONNX model using the ONNX Runtime C# API.
+
+The source code for this sample is available [here](Program.cs).
+
+## Prerequisites
+
+To run this sample, you'll need the following things:
+
+1. Install [.NET Core 3.1](https://dotnet.microsoft.com/download/dotnet-core/3.1) or higher for you OS (Mac, Windows or Linux).
+2. Download the [Faster R-CNN](https://github.com/onnx/models/blob/master/vision/object_detection_segmentation/faster-rcnn/model/FasterRCNN-10.onnx) ONNX model to your local system.
+3. Download [this demo image](demo.jpg) to test the model. You can also use any image you like.
+
+## Getting Started
+
+Now we have everything set up, we can start adding code to run the model on the image. We'll do this in the main method of the program for simplicity.
+
+### Read paths
+
+Firstly, let's read the path to the model, path to the image we want to test, and path to the output image:
+
+```cs
+string modelFilePath = args[0];
+string imageFilePath = args[1];
+string outImageFilePath = args[2];
+```
+
+### Read image
+
+Next, we will read the image in using the cross-platform image library [ImageSharp](https://www.nuget.org/packages/SixLabors.ImageSharp):
+
+```cs
+using Image image = Image.Load(imageFilePath, out IImageFormat format);
+```
+
+Note, we're specifically reading the `Rgb24` type so we can efficiently preprocess the image in a later step.
+
+### Resize image
+
+Next, we will resize the image to the appropriate size that the model is expecting; it is recommended to resize the image such that both height and width are within the range of [800, 1333].
+
+```cs
+float ratio = 800f / Math.Min(image.Width, image.Height);
+using Stream imageStream = new MemoryStream();
+image.Mutate(x => x.Resize((int)(ratio * image.Width), (int)(ratio * image.Height)));
+image.Save(imageStream, format);
+```
+
+### Preprocess image
+
+Next, we will preprocess the image according to the [requirements of the model](https://github.com/onnx/models/tree/master/vision/object_detection_segmentation/faster-rcnn#preprocessing-steps):
+
+```cs
+var paddedHeight = (int)(Math.Ceiling(image.Height / 32f) * 32f);
+var paddedWidth = (int)(Math.Ceiling(image.Width / 32f) * 32f);
+Tensor input = new DenseTensor(new[] { 3, paddedHeight, paddedWidth });
+var mean = new[] { 102.9801f, 115.9465f, 122.7717f };
+for (int y = paddedHeight - image.Height; y < image.Height; y++)
+{
+ Span pixelSpan = image.GetPixelRowSpan(y);
+ for (int x = paddedWidth - image.Width; x < image.Width; x++)
+ {
+ input[0, y, x] = pixelSpan[x].B - mean[0];
+ input[1, y, x] = pixelSpan[x].G - mean[1];
+ input[2, y, x] = pixelSpan[x].R - mean[2];
+ }
+}
+```
+
+Here, we're creating a Tensor of the required size `(channels, paddedHeight, paddedWidth)`, accessing the pixel values, preprocessing them and finally assigning them to the tensor at the appropriate indicies.
+
+### Setup inputs
+
+Next, we will create the inputs to the model:
+
+```cs
+var inputs = new List
+{
+ NamedOnnxValue.CreateFromTensor("image", input)
+};
+```
+
+To check the input node names for an ONNX model, you can use [Netron](https://github.com/lutzroeder/netron) to visualise the model and see input/output names. In this case, this model has `image` as the input node name.
+
+### Run inference
+
+Next, we will create an inference session and run the input through it:
+
+```cs
+using var session = new InferenceSession(modelFilePath);
+using IDisposableReadOnlyCollection results = session.Run(inputs);
+```
+
+### Postprocess output
+
+Next, we will need to postprocess the output to get boxes and associated label and confidence scores for each box:
+
+```cs
+var resultsArray = results.ToArray();
+float[] boxes = resultsArray[0].AsEnumerable().ToArray();
+long[] labels = resultsArray[1].AsEnumerable().ToArray();
+float[] confidences = resultsArray[2].AsEnumerable().ToArray();
+var predictions = new List();
+var minConfidence = 0.7f;
+for (int i = 0; i < boxes.Length - 4; i += 4)
+{
+ var index = i / 4;
+ if (confidences[index] >= minConfidence)
+ {
+ predictions.Add(new Prediction
+ {
+ Box = new Box(boxes[i], boxes[i + 1], boxes[i + 2], boxes[i + 3]),
+ Label = LabelMap.Labels[labels[index]],
+ Confidence = confidences[index]
+ });
+ }
+}
+```
+
+Note, we're only taking boxes that have a confidence above 0.7 to remove false positives.
+
+### View prediction
+
+Next, we'll draw the boxes and associated labels and confidence scores on the image to see how the model went:
+
+```cs
+using var outputImage = File.OpenWrite(outImageFilePath);
+Font font = SystemFonts.CreateFont("Arial", 16);
+foreach (var p in predictions)
+{
+ image.Mutate(x =>
+ {
+ x.DrawLines(Color.Red, 2f, new PointF[] {
+
+ new PointF(p.Box.Xmin, p.Box.Ymin),
+ new PointF(p.Box.Xmax, p.Box.Ymin),
+
+ new PointF(p.Box.Xmax, p.Box.Ymin),
+ new PointF(p.Box.Xmax, p.Box.Ymax),
+
+ new PointF(p.Box.Xmax, p.Box.Ymax),
+ new PointF(p.Box.Xmin, p.Box.Ymax),
+
+ new PointF(p.Box.Xmin, p.Box.Ymax),
+ new PointF(p.Box.Xmin, p.Box.Ymin)
+ });
+ x.DrawText($"{p.Label}, {p.Confidence:0.00}", font, Color.White, new PointF(p.Box.Xmin, p.Box.Ymin));
+ });
+}
+image.Save(outputImage, format);
+```
+
+For each box prediction, we're using ImageSharp to draw red lines to create the boxes, and drawing the label and confidence text.
+
+## Running the program
+
+Now the program is created, we can run it will the following command:
+
+```
+dotnet run [path-to-model] [path-to-image] [path-to-output-image]
+```
+
+e.g. running:
+
+```
+dotnet run ~/Downloads/FasterRCNN-10.onnx ~/Downloads/demo.jpg ~/Downloads/out.jpg
+```
+
+detects the following objects in the image:
+
+
\ No newline at end of file
diff --git a/csharp/sample/Microsoft.ML.OnnxRuntime.FasterRcnnSample/demo.jpg b/csharp/sample/Microsoft.ML.OnnxRuntime.FasterRcnnSample/demo.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..3a54056b7843c4af02dff7766aa09b82407a1eaf
GIT binary patch
literal 171271
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