-
Notifications
You must be signed in to change notification settings - Fork 3.1k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
* C# sample: Faster R-CNN * Add link to new sample in samples README * Remove duplicate image
- Loading branch information
1 parent
de26852
commit ce65275
Showing
8 changed files
with
408 additions
and
0 deletions.
There are no files selected for viewing
87 changes: 87 additions & 0 deletions
87
csharp/sample/Microsoft.ML.OnnxRuntime.FasterRcnnSample/LabelMap.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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"}; | ||
} | ||
} |
15 changes: 15 additions & 0 deletions
15
...icrosoft.ML.OnnxRuntime.FasterRcnnSample/Microsoft.ML.OnnxRuntime.FasterRcnnSample.csproj
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,15 @@ | ||
<Project Sdk="Microsoft.NET.Sdk"> | ||
|
||
<PropertyGroup> | ||
<OutputType>Exe</OutputType> | ||
<TargetFramework>netcoreapp3.1</TargetFramework> | ||
<LangVersion>8.0</LangVersion> | ||
</PropertyGroup> | ||
|
||
<ItemGroup> | ||
<PackageReference Include="Microsoft.ML.OnnxRuntime" Version="1.4.0" /> | ||
<PackageReference Include="Sixlabors.ImageSharp" Version="1.0.0" /> | ||
<PackageReference Include="SixLabors.ImageSharp.Drawing" Version="1.0.0-beta0010" /> | ||
</ItemGroup> | ||
|
||
</Project> |
26 changes: 26 additions & 0 deletions
26
csharp/sample/Microsoft.ML.OnnxRuntime.FasterRcnnSample/Prediction.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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; | ||
|
||
} | ||
} | ||
} |
107 changes: 107 additions & 0 deletions
107
csharp/sample/Microsoft.ML.OnnxRuntime.FasterRcnnSample/Program.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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<Rgb24> image = Image.Load<Rgb24>(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<float> input = new DenseTensor<float>(new[] { 3, paddedHeight, paddedWidth }); | ||
var mean = new[] { 102.9801f, 115.9465f, 122.7717f }; | ||
for (int y = paddedHeight - image.Height; y < image.Height; y++) | ||
{ | ||
Span<Rgb24> 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> | ||
{ | ||
NamedOnnxValue.CreateFromTensor("image", input) | ||
}; | ||
|
||
// Run inference | ||
using var session = new InferenceSession(modelFilePath); | ||
using IDisposableReadOnlyCollection<DisposableNamedOnnxValue> results = session.Run(inputs); | ||
|
||
// Postprocess to get predictions | ||
var resultsArray = results.ToArray(); | ||
float[] boxes = resultsArray[0].AsEnumerable<float>().ToArray(); | ||
long[] labels = resultsArray[1].AsEnumerable<long>().ToArray(); | ||
float[] confidences = resultsArray[2].AsEnumerable<float>().ToArray(); | ||
var predictions = new List<Prediction>(); | ||
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); | ||
} | ||
} | ||
} |
Oops, something went wrong.