From ec452ccbef51fc5b547a60d243b4dbd6191fccf3 Mon Sep 17 00:00:00 2001 From: shamaksx Date: Tue, 20 Sep 2022 06:08:55 -0700 Subject: [PATCH 01/15] bug fix in OVEP csharp sample --- .../yolov3_object_detection/Program.cs | 23 +++++++++++-------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/c_sharp/OpenVINO_EP/yolov3_object_detection/Program.cs b/c_sharp/OpenVINO_EP/yolov3_object_detection/Program.cs index 8ac757e1c..cdddc5628 100644 --- a/c_sharp/OpenVINO_EP/yolov3_object_detection/Program.cs +++ b/c_sharp/OpenVINO_EP/yolov3_object_detection/Program.cs @@ -133,17 +133,20 @@ static void Main(string[] args) for (int i = 0; i < indices.Length; i = i + 3) { out_classes[count] = indices[i + 1]; - out_scores[count] = scores[indices[i], indices[i + 1], indices[i + 2]]; - predictions.Add(new Prediction + if (indices[i + 1] > -1) { - Box = new Box(boxes[indices[i], indices[i + 2], 1], - boxes[indices[i], indices[i + 2], 0], - boxes[indices[i], indices[i + 2], 3], - boxes[indices[i], indices[i + 2], 2]), - Class = LabelMap.Labels[out_classes[count]], - Score = out_scores[count] - }); - count++; + out_scores[count] = scores[indices[i], indices[i + 1], indices[i + 2]]; + predictions.Add(new Prediction + { + Box = new Box(boxes[indices[i], indices[i + 2], 1], + boxes[indices[i], indices[i + 2], 0], + boxes[indices[i], indices[i + 2], 3], + boxes[indices[i], indices[i + 2], 2]), + Class = LabelMap.Labels[out_classes[count]], + Score = out_scores[count] + }); + count++; + } } // Put boxes, labels and confidence on image and save for viewing From 1616747293b84fa0759ccece5cd90c1ff33346b7 Mon Sep 17 00:00:00 2001 From: nmaajidk Date: Wed, 28 Sep 2022 12:12:39 +0530 Subject: [PATCH 02/15] Samples updated --- .../squeezenet_classification/squeezenet_cpp_app.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/c_cxx/OpenVINO_EP/Linux/squeezenet_classification/squeezenet_cpp_app.cpp b/c_cxx/OpenVINO_EP/Linux/squeezenet_classification/squeezenet_cpp_app.cpp index 7e0786260..e2473cc93 100644 --- a/c_cxx/OpenVINO_EP/Linux/squeezenet_classification/squeezenet_cpp_app.cpp +++ b/c_cxx/OpenVINO_EP/Linux/squeezenet_classification/squeezenet_cpp_app.cpp @@ -230,7 +230,8 @@ int main(int argc, char* argv[]) std::cout << "Number of Input Nodes: " << numInputNodes << std::endl; std::cout << "Number of Output Nodes: " << numOutputNodes << std::endl; - const char* inputName = session.GetInputName(0, allocator); + auto inputNodeName = session.GetInputNameAllocated(0, allocator); + const char* inputName = inputNodeName.get(); std::cout << "Input Name: " << inputName << std::endl; Ort::TypeInfo inputTypeInfo = session.GetInputTypeInfo(0); @@ -242,7 +243,8 @@ int main(int argc, char* argv[]) std::vector inputDims = inputTensorInfo.GetShape(); std::cout << "Input Dimensions: " << inputDims << std::endl; - const char* outputName = session.GetOutputName(0, allocator); + auto outputNodeName = session.GetOutputNameAllocated(0, allocator); + const char* outputName = outputNodeName.get(); std::cout << "Output Name: " << outputName << std::endl; Ort::TypeInfo outputTypeInfo = session.GetOutputTypeInfo(0); @@ -311,7 +313,7 @@ int main(int argc, char* argv[]) so we have to prepare an array of Ort::Value instances for inputs and outputs respectively even if we only have one input and one output. */ - std::vector inputNames{inputName}; + std::vector inputNames{"data_0"}; std::vector outputNames{outputName}; std::vector inputTensors; std::vector outputTensors; From b64c316b50de340d7ef46f5f72de6d198760fded Mon Sep 17 00:00:00 2001 From: shamaksx Date: Wed, 28 Sep 2022 03:18:04 -0700 Subject: [PATCH 03/15] cpp sample update --- .../Linux/squeezenet_classification/squeezenet_cpp_app.cpp | 3 +-- .../squeezenet_classification/squeezenet_cpp_app_io.cpp | 7 +++++-- .../squeezenet_classification/squeezenet_cpp_app.cpp | 6 ++++-- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/c_cxx/OpenVINO_EP/Linux/squeezenet_classification/squeezenet_cpp_app.cpp b/c_cxx/OpenVINO_EP/Linux/squeezenet_classification/squeezenet_cpp_app.cpp index e2473cc93..721b69344 100644 --- a/c_cxx/OpenVINO_EP/Linux/squeezenet_classification/squeezenet_cpp_app.cpp +++ b/c_cxx/OpenVINO_EP/Linux/squeezenet_classification/squeezenet_cpp_app.cpp @@ -1,7 +1,6 @@ /* Copyright (C) 2021, Intel Corporation SPDX-License-Identifier: Apache-2.0 - Portions of this software are copyright of their respective authors and released under the MIT license: - ONNX-Runtime-Inference, Copyright 2020 Lei Mao. For licensing see https://github.com/leimao/ONNX-Runtime-Inference/blob/main/LICENSE.md */ @@ -313,7 +312,7 @@ int main(int argc, char* argv[]) so we have to prepare an array of Ort::Value instances for inputs and outputs respectively even if we only have one input and one output. */ - std::vector inputNames{"data_0"}; + std::vector inputNames{inputName}; std::vector outputNames{outputName}; std::vector inputTensors; std::vector outputTensors; diff --git a/c_cxx/OpenVINO_EP/Linux/squeezenet_classification/squeezenet_cpp_app_io.cpp b/c_cxx/OpenVINO_EP/Linux/squeezenet_classification/squeezenet_cpp_app_io.cpp index c0642d03f..ec84669d6 100644 --- a/c_cxx/OpenVINO_EP/Linux/squeezenet_classification/squeezenet_cpp_app_io.cpp +++ b/c_cxx/OpenVINO_EP/Linux/squeezenet_classification/squeezenet_cpp_app_io.cpp @@ -1,6 +1,7 @@ /* Copyright (C) 2021, Intel Corporation SPDX-License-Identifier: Apache-2.0 + Portions of this software are copyright of their respective authors and released under the MIT license: - ONNX-Runtime-Inference, Copyright 2020 Lei Mao. For licensing see https://github.com/leimao/ONNX-Runtime-Inference/blob/main/LICENSE.md */ @@ -260,7 +261,8 @@ int main(int argc, char* argv[]) std::cout << "Number of Input Nodes: " << numInputNodes << std::endl; std::cout << "Number of Output Nodes: " << numOutputNodes << std::endl; - const char* inputName = session.GetInputName(0, allocator); + auto inputNodeName = session.GetInputNameAllocated(0, allocator); + const char* inputName = inputNodeName.get(); std::cout << "Input Name: " << inputName << std::endl; Ort::TypeInfo inputTypeInfo = session.GetInputTypeInfo(0); @@ -272,7 +274,8 @@ int main(int argc, char* argv[]) std::vector inputDims = inputTensorInfo.GetShape(); std::cout << "Input Dimensions: " << inputDims << std::endl; - const char* outputName = session.GetOutputName(0, allocator); + auto outputNodeName = session.GetOutputNameAllocated(0, allocator); + const char* outputName = outputNodeName.get(); std::cout << "Output Name: " << outputName << std::endl; Ort::TypeInfo outputTypeInfo = session.GetOutputTypeInfo(0); diff --git a/c_cxx/OpenVINO_EP/Windows/squeezenet_classification/squeezenet_cpp_app.cpp b/c_cxx/OpenVINO_EP/Windows/squeezenet_classification/squeezenet_cpp_app.cpp index fe1a70a66..3349494ca 100644 --- a/c_cxx/OpenVINO_EP/Windows/squeezenet_classification/squeezenet_cpp_app.cpp +++ b/c_cxx/OpenVINO_EP/Windows/squeezenet_classification/squeezenet_cpp_app.cpp @@ -235,7 +235,8 @@ int main(int argc, char* argv[]) std::cout << "Number of Input Nodes: " << numInputNodes << std::endl; std::cout << "Number of Output Nodes: " << numOutputNodes << std::endl; - const char* inputName = session.GetInputName(0, allocator); + auto inputNodeName = session.GetInputNameAllocated(0, allocator); + const char* inputName = inputNodeName.get(); std::cout << "Input Name: " << inputName << std::endl; Ort::TypeInfo inputTypeInfo = session.GetInputTypeInfo(0); @@ -247,7 +248,8 @@ int main(int argc, char* argv[]) std::vector inputDims = inputTensorInfo.GetShape(); std::cout << "Input Dimensions: " << inputDims << std::endl; - const char* outputName = session.GetOutputName(0, allocator); + auto outputNodeName = session.GetOutputNameAllocated(0, allocator); + const char* outputName = outputNodeName.get(); std::cout << "Output Name: " << outputName << std::endl; Ort::TypeInfo outputTypeInfo = session.GetOutputTypeInfo(0); From 101afa22e90f9e7f90f38e64fbdd64aad22987ac Mon Sep 17 00:00:00 2001 From: Hector Li Date: Mon, 20 Jun 2022 10:48:17 -0700 Subject: [PATCH 04/15] Improve the SNPE EP sample with command line option to switch SNPE backend (#120) * Improve the sample with command line option to switch SNPE backend, and set the input file path. Fix an issue for Android build, need to use libc++_shared.so from SNPE SDK. * 1. Update the API call according the API change in Ort, SessionOptionsAppendExecutionProvider_SNPE -> SessionOptionsAppendExecutionProvider 2. format update --- c_cxx/Snpe_EP/CMakeLists.txt | 8 ++++++- c_cxx/Snpe_EP/README.md | 11 ++++++++-- c_cxx/Snpe_EP/main.cpp | 42 ++++++++++++++++++++++++++++++------ 3 files changed, 51 insertions(+), 10 deletions(-) diff --git a/c_cxx/Snpe_EP/CMakeLists.txt b/c_cxx/Snpe_EP/CMakeLists.txt index dadf40c10..5531959de 100644 --- a/c_cxx/Snpe_EP/CMakeLists.txt +++ b/c_cxx/Snpe_EP/CMakeLists.txt @@ -16,7 +16,13 @@ ADD_EXECUTABLE(snpe_ep_sample main.cpp) if(HAVE_TENSORRT_PROVIDER_FACTORY_H) target_compile_definitions(snpe_ep_sample PRIVATE -DHAVE_TENSORRT_PROVIDER_FACTORY_H) endif() -target_link_libraries(snpe_ep_sample onnxruntime) + +set(ORT_LIBS onnxruntime) +if(ANDROID) +list(APPEND ORT_LIBS libc++_shared.so) +endif() +target_link_libraries(snpe_ep_sample ${ORT_LIBS}) + if(MSVC) target_link_directories(snpe_ep_sample PRIVATE ${ONNXRUNTIME_ROOTDIR}/build/Windows/Release/Release) else() diff --git a/c_cxx/Snpe_EP/README.md b/c_cxx/Snpe_EP/README.md index 9fa1f8797..2ec1cbbed 100644 --- a/c_cxx/Snpe_EP/README.md +++ b/c_cxx/Snpe_EP/README.md @@ -74,7 +74,12 @@ chairs.raw -- from $SNPE_ROOT/models/inception_v3/data/cropped imagenet_slim_labels.txt -- from $SNPE_ROOT/models/inception_v3/data - Run snpe_ep_sample.exe, it will output: + Run + ``` + snpe_ep_sample.exe --cpu chairs.raw + ``` + + it will output: ``` 832, 0.299591, studio couch @@ -103,6 +108,7 @@ adb push [$SNPE_ROOT]/lib/dsp/*.so /data/local/tmp/snpeexample adb push [$Onnxruntime_ROOT]/build/Android/Release/libonnxruntime.so /data/local/tmp/snpeexample adb push [$SNPE_ROOT]/models/inception_v3/data/cropped/chairs.raw /data/local/tmp/snpeexample + adb push [$SNPE_ROOT]/models/inception_v3/data/imagenet_slim_labels.txt /data/local/tmp/snpeexample adb push [$SNPE_ROOT]/models/inception_v3/snpe_inception_v3.onnx /data/local/tmp/snpeexample adb push ./onnxruntime-inference-examples/c_cxx/Snpe_EP/build_android/snpe_ep_sample /data/local/tmp/snpeexample ``` @@ -115,7 +121,8 @@ chmod +x * export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/data/local/tmp/snpeexample export PATH=$PATH:/data/local/tmp/snpeexample - snpe_ep_sample + snpe_ep_sample --cpu chairs.raw + snpe_ep_sample --dsp chairs.raw ``` it will output: diff --git a/c_cxx/Snpe_EP/main.cpp b/c_cxx/Snpe_EP/main.cpp index 213815869..1c5a8907b 100644 --- a/c_cxx/Snpe_EP/main.cpp +++ b/c_cxx/Snpe_EP/main.cpp @@ -16,12 +16,12 @@ bool CheckStatus(const OrtApi* g_ort, OrtStatus* status) { const char* msg = g_ort->GetErrorMessage(status); std::cerr << msg << std::endl; g_ort->ReleaseStatus(status); - throw std::exception(); + throw Ort::Exception(msg, OrtErrorCode::ORT_EP_FAIL); } return true; } -void run_ort_snpe_ep() { +void run_ort_snpe_ep(std::string backend, std::string input_path) { #ifdef _WIN32 const wchar_t* model_path = L"snpe_inception_v3.onnx"; #else @@ -38,10 +38,10 @@ void run_ort_snpe_ep() { CheckStatus(g_ort, g_ort->SetSessionGraphOptimizationLevel(session_options, ORT_ENABLE_BASIC)); std::vector options_keys = {"runtime", "buffer_type"}; - std::vector options_values = {"CPU", "FLOAT"}; // set to TF8 if use quantized data + std::vector options_values = {backend.c_str(), "FLOAT"}; // set to TF8 if use quantized data - CheckStatus(g_ort, g_ort->SessionOptionsAppendExecutionProvider_SNPE(session_options, options_keys.data(), - options_values.data(), options_keys.size())); + CheckStatus(g_ort, g_ort->SessionOptionsAppendExecutionProvider(session_options, "SNPE", options_keys.data(), + options_values.data(), options_keys.size())); OrtSession* session; CheckStatus(g_ort, g_ort->CreateSession(env, model_path, session_options, &session)); @@ -124,7 +124,7 @@ void run_ort_snpe_ep() { size_t input_data_length = input_data_size * sizeof(float); std::vector input_data(input_data_size, 1.0); - std::ifstream input_raw_file("chairs.raw", std::ios::binary); + std::ifstream input_raw_file(input_path, std::ios::binary); input_raw_file.seekg(0, std::ios::end); const size_t num_elements = input_raw_file.tellg() / sizeof(float); input_raw_file.seekg(0, std::ios::beg); @@ -162,7 +162,35 @@ void run_ort_snpe_ep() { printf("%d, %f, %s \n", max_index, *max, label_table[max_index].c_str()); } +void PrintHelp() { + std::cout << "To run the sample, use the following command:" << std::endl; + std::cout << "Example: ./snpe_ep_sample --cpu " << std::endl; + std::cout << "To Run with SNPE CPU backend. Example: ./snpe_ep_sample --cpu chairs.raw" << std::endl; + std::cout << "To Run with SNPE DSP backend. Example: ./snpe_ep_sample --dsp chairs.raw" << std::endl; +} + +constexpr const char* CPUBACKEDN = "--cpu"; +constexpr const char* DSPBACKEDN = "--dsp"; + int main(int argc, char* argv[]) { - run_ort_snpe_ep(); + std::string backend = "CPU"; + + if (argc != 3) { + PrintHelp(); + return 1; + } + + if (strcmp(argv[1], CPUBACKEDN) == 0) { + backend = "CPU"; + } else if (strcmp(argv[1], DSPBACKEDN) == 0) { + backend = "DSP"; + } else { + std::cout << "This sample only support CPU, DSP." << std::endl; + PrintHelp(); + return 1; + } + std::string input_path(argv[2]); + + run_ort_snpe_ep(backend, input_path); return 0; } From febe79a269798c3d1417e8de5d7a8f11ee68ff78 Mon Sep 17 00:00:00 2001 From: "Nat Kershaw (MSFT)" Date: Mon, 27 Jun 2022 13:53:07 -0700 Subject: [PATCH 05/15] Add table of contents to Python samples (#115) --- python/README.md | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/python/README.md b/python/README.md index 0a160cbbf..b4e653f50 100644 --- a/python/README.md +++ b/python/README.md @@ -1,5 +1,15 @@ # Samples +## API + +[Run the ONNX Runtime session creation and inference API](https://github.com/microsoft/onnxruntime-inference-examples/tree/main/python/api) + +## OpenVINO Execution Provider + [tiny_yolo_v2_object_detection](https://github.com/microsoft/onnxruntime-inference-examples/tree/main/python/OpenVINO_EP/tiny_yolo_v2_object_detection). -[yolov4_object_detection](https://github.com/microsoft/onnxruntime-inference-examples/tree/main/python/OpenVINO_EP/yolov4_object_detection). \ No newline at end of file +[yolov4_object_detection](https://github.com/microsoft/onnxruntime-inference-examples/tree/main/python/OpenVINO_EP/yolov4_object_detection). + +## AzureML + +[Question answering with BERT on AzureML](https://github.com/microsoft/onnxruntime-inference-examples/tree/main/python/azureml) From 13b22a55c31a3f1351419d0f98bb6f2565534a9f Mon Sep 17 00:00:00 2001 From: Hector Li Date: Thu, 30 Jun 2022 16:42:01 -0700 Subject: [PATCH 06/15] update doc for Snpe EP to reflect the API change (#122) * update doc for snpe to reflect the API change --- c_cxx/Snpe_EP/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/c_cxx/Snpe_EP/README.md b/c_cxx/Snpe_EP/README.md index 2ec1cbbed..9fa5251cd 100644 --- a/c_cxx/Snpe_EP/README.md +++ b/c_cxx/Snpe_EP/README.md @@ -47,8 +47,8 @@ std::vector options_keys = {"runtime", "buffer_type"}; std::vector options_values = {"CPU", "TF8"}; // set to TF8 if use quantized data - CheckStatus(g_ort, g_ort->SessionOptionsAppendExecutionProvider_SNPE(session_options, options_keys.data(), - options_values.data(), options_keys.size())); + g_ort->SessionOptionsAppendExecutionProvider(session_options, "SNPE", options_keys.data(), + options_values.data(), options_keys.size()); ``` Please refers to the unit test case [Snpe_ConvertFromAbs.QuantizedModelTf8Test](https://github.com/microsoft/onnxruntime/blob/5ecfaef042380995fb15587ccf6ff77f9d3a01d2/onnxruntime/test/contrib_ops/snpe_op_test.cc#L209-L251) for more details. From e269fdaa2cc09decba8fca6a413da1b107bba56c Mon Sep 17 00:00:00 2001 From: Yufeng Li Date: Tue, 5 Jul 2022 09:11:30 -1000 Subject: [PATCH 07/15] Set default format to QuantFormat.QDQ (#123) --- quantization/image_classification/cpu/run.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/quantization/image_classification/cpu/run.py b/quantization/image_classification/cpu/run.py index 100057cf9..3f48057f9 100644 --- a/quantization/image_classification/cpu/run.py +++ b/quantization/image_classification/cpu/run.py @@ -89,7 +89,7 @@ def get_args(): parser.add_argument("--output_model", required=True, help="output model") parser.add_argument("--calibrate_dataset", default="./test_images", help="calibration data set") parser.add_argument("--quant_format", - default=QuantFormat.QOperator, + default=QuantFormat.QDQ, type=QuantFormat.from_string, choices=list(QuantFormat)) parser.add_argument("--per_channel", default=False, type=bool) From d56abe4cdbcb8b3fe6ab08badd5e1bb9f37a0474 Mon Sep 17 00:00:00 2001 From: Scott McKay Date: Fri, 29 Jul 2022 07:21:36 +1000 Subject: [PATCH 08/15] Add MAUI example for mobile targets (#128) --- .../MauiVisionSample/MauiVisionSample.sln | 27 + .../MauiVisionSample/App.xaml | 14 + .../MauiVisionSample/App.xaml.cs | 11 + .../MauiVisionSample/AppShell.xaml | 14 + .../MauiVisionSample/AppShell.xaml.cs | 9 + .../MauiVisionSample/ExecutionProviders.cs | 12 + .../MauiVisionSample/IVisionSample.cs | 16 + .../MauiVisionSample/MainPage.xaml | 77 ++ .../MauiVisionSample/MainPage.xaml.cs | 319 ++++++ .../MauiVisionSample/MauiProgram.cs | 21 + .../MauiVisionSample/MauiVisionSample.csproj | 56 + .../Mobilenet/MobilenetImageProcessor.cs | 76 ++ .../Models/Mobilenet/MobilenetLabelMap.cs | 1010 +++++++++++++++++ .../Models/Mobilenet/MobilenetPrediction.cs | 11 + .../Models/Mobilenet/MobilenetSample.cs | 84 ++ .../Ultraface/UltrafaceImageProcessor.cs | 69 ++ .../Models/Ultraface/UltrafacePrediction.cs | 11 + .../Models/Ultraface/UltrafaceSample.cs | 98 ++ .../Platforms/Android/AndroidManifest.xml | 11 + .../Platforms/Android/MainActivity.cs | 10 + .../Platforms/Android/MainApplication.cs | 22 + .../Android/Resources/values/colors.xml | 6 + .../Platforms/Windows/App.xaml | 8 + .../Platforms/Windows/App.xaml.cs | 24 + .../Platforms/Windows/Package.appxmanifest | 44 + .../Platforms/Windows/app.manifest | 15 + .../Platforms/iOS/AppDelegate.cs | 9 + .../MauiVisionSample/Platforms/iOS/Info.plist | 38 + .../MauiVisionSample/Platforms/iOS/Program.cs | 15 + .../PrePostProcessing/IImageProcessor.cs | 21 + .../ImageProcessingResult.cs | 17 + .../PrePostProcessing/PredictionBox.cs | 21 + .../SkiaSharpImageProcessor.cs | 88 ++ .../Properties/launchSettings.json | 8 + .../Resources/AppIcon/appicon.svg | 4 + .../Resources/AppIcon/appiconfg.svg | 8 + .../Resources/Fonts/OpenSans-Regular.ttf | Bin 0 -> 107140 bytes .../Resources/Fonts/OpenSans-Semibold.ttf | Bin 0 -> 111048 bytes .../Resources/Raw/AboutAssets.txt | 15 + .../Raw/Ultraface_version-RFB-320.onnx | Bin 0 -> 1220755 bytes .../Resources/Raw/mobilenetv2-12.onnx | Bin 0 -> 13964571 bytes .../MauiVisionSample/Resources/Raw/satya.jpg | Bin 0 -> 95137 bytes .../MauiVisionSample/Resources/Raw/wolves.jpg | Bin 0 -> 132688 bytes .../Resources/Splash/splash.svg | 8 + .../Resources/Styles/Colors.xaml | 44 + .../Resources/Styles/Styles.xaml | 384 +++++++ .../MauiVisionSample/Utils.cs | 91 ++ .../MauiVisionSample/VisionSampleBase.cs | 102 ++ .../examples/Maui/MauiVisionSample/readme.md | 106 ++ 49 files changed, 3054 insertions(+) create mode 100644 mobile/examples/Maui/MauiVisionSample/MauiVisionSample.sln create mode 100644 mobile/examples/Maui/MauiVisionSample/MauiVisionSample/App.xaml create mode 100644 mobile/examples/Maui/MauiVisionSample/MauiVisionSample/App.xaml.cs create mode 100644 mobile/examples/Maui/MauiVisionSample/MauiVisionSample/AppShell.xaml create mode 100644 mobile/examples/Maui/MauiVisionSample/MauiVisionSample/AppShell.xaml.cs create mode 100644 mobile/examples/Maui/MauiVisionSample/MauiVisionSample/ExecutionProviders.cs create mode 100644 mobile/examples/Maui/MauiVisionSample/MauiVisionSample/IVisionSample.cs create mode 100644 mobile/examples/Maui/MauiVisionSample/MauiVisionSample/MainPage.xaml create mode 100644 mobile/examples/Maui/MauiVisionSample/MauiVisionSample/MainPage.xaml.cs create mode 100644 mobile/examples/Maui/MauiVisionSample/MauiVisionSample/MauiProgram.cs create mode 100644 mobile/examples/Maui/MauiVisionSample/MauiVisionSample/MauiVisionSample.csproj create mode 100644 mobile/examples/Maui/MauiVisionSample/MauiVisionSample/Models/Mobilenet/MobilenetImageProcessor.cs create mode 100644 mobile/examples/Maui/MauiVisionSample/MauiVisionSample/Models/Mobilenet/MobilenetLabelMap.cs create mode 100644 mobile/examples/Maui/MauiVisionSample/MauiVisionSample/Models/Mobilenet/MobilenetPrediction.cs create mode 100644 mobile/examples/Maui/MauiVisionSample/MauiVisionSample/Models/Mobilenet/MobilenetSample.cs create mode 100644 mobile/examples/Maui/MauiVisionSample/MauiVisionSample/Models/Ultraface/UltrafaceImageProcessor.cs create mode 100644 mobile/examples/Maui/MauiVisionSample/MauiVisionSample/Models/Ultraface/UltrafacePrediction.cs create mode 100644 mobile/examples/Maui/MauiVisionSample/MauiVisionSample/Models/Ultraface/UltrafaceSample.cs create mode 100644 mobile/examples/Maui/MauiVisionSample/MauiVisionSample/Platforms/Android/AndroidManifest.xml create mode 100644 mobile/examples/Maui/MauiVisionSample/MauiVisionSample/Platforms/Android/MainActivity.cs create mode 100644 mobile/examples/Maui/MauiVisionSample/MauiVisionSample/Platforms/Android/MainApplication.cs create mode 100644 mobile/examples/Maui/MauiVisionSample/MauiVisionSample/Platforms/Android/Resources/values/colors.xml create mode 100644 mobile/examples/Maui/MauiVisionSample/MauiVisionSample/Platforms/Windows/App.xaml create mode 100644 mobile/examples/Maui/MauiVisionSample/MauiVisionSample/Platforms/Windows/App.xaml.cs create mode 100644 mobile/examples/Maui/MauiVisionSample/MauiVisionSample/Platforms/Windows/Package.appxmanifest create mode 100644 mobile/examples/Maui/MauiVisionSample/MauiVisionSample/Platforms/Windows/app.manifest create mode 100644 mobile/examples/Maui/MauiVisionSample/MauiVisionSample/Platforms/iOS/AppDelegate.cs create mode 100644 mobile/examples/Maui/MauiVisionSample/MauiVisionSample/Platforms/iOS/Info.plist create mode 100644 mobile/examples/Maui/MauiVisionSample/MauiVisionSample/Platforms/iOS/Program.cs create mode 100644 mobile/examples/Maui/MauiVisionSample/MauiVisionSample/PrePostProcessing/IImageProcessor.cs create mode 100644 mobile/examples/Maui/MauiVisionSample/MauiVisionSample/PrePostProcessing/ImageProcessingResult.cs create mode 100644 mobile/examples/Maui/MauiVisionSample/MauiVisionSample/PrePostProcessing/PredictionBox.cs create mode 100644 mobile/examples/Maui/MauiVisionSample/MauiVisionSample/PrePostProcessing/SkiaSharpImageProcessor.cs create mode 100644 mobile/examples/Maui/MauiVisionSample/MauiVisionSample/Properties/launchSettings.json create mode 100644 mobile/examples/Maui/MauiVisionSample/MauiVisionSample/Resources/AppIcon/appicon.svg create mode 100644 mobile/examples/Maui/MauiVisionSample/MauiVisionSample/Resources/AppIcon/appiconfg.svg create mode 100644 mobile/examples/Maui/MauiVisionSample/MauiVisionSample/Resources/Fonts/OpenSans-Regular.ttf create mode 100644 mobile/examples/Maui/MauiVisionSample/MauiVisionSample/Resources/Fonts/OpenSans-Semibold.ttf create mode 100644 mobile/examples/Maui/MauiVisionSample/MauiVisionSample/Resources/Raw/AboutAssets.txt create mode 100644 mobile/examples/Maui/MauiVisionSample/MauiVisionSample/Resources/Raw/Ultraface_version-RFB-320.onnx create mode 100644 mobile/examples/Maui/MauiVisionSample/MauiVisionSample/Resources/Raw/mobilenetv2-12.onnx create mode 100644 mobile/examples/Maui/MauiVisionSample/MauiVisionSample/Resources/Raw/satya.jpg create mode 100644 mobile/examples/Maui/MauiVisionSample/MauiVisionSample/Resources/Raw/wolves.jpg create mode 100644 mobile/examples/Maui/MauiVisionSample/MauiVisionSample/Resources/Splash/splash.svg create mode 100644 mobile/examples/Maui/MauiVisionSample/MauiVisionSample/Resources/Styles/Colors.xaml create mode 100644 mobile/examples/Maui/MauiVisionSample/MauiVisionSample/Resources/Styles/Styles.xaml create mode 100644 mobile/examples/Maui/MauiVisionSample/MauiVisionSample/Utils.cs create mode 100644 mobile/examples/Maui/MauiVisionSample/MauiVisionSample/VisionSampleBase.cs create mode 100644 mobile/examples/Maui/MauiVisionSample/readme.md diff --git a/mobile/examples/Maui/MauiVisionSample/MauiVisionSample.sln b/mobile/examples/Maui/MauiVisionSample/MauiVisionSample.sln new file mode 100644 index 000000000..afe383e14 --- /dev/null +++ b/mobile/examples/Maui/MauiVisionSample/MauiVisionSample.sln @@ -0,0 +1,27 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.0.31611.283 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MauiVisionSample", "MauiVisionSample\MauiVisionSample.csproj", "{B181D00F-FFC0-489C-A59B-27665CD58015}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {B181D00F-FFC0-489C-A59B-27665CD58015}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B181D00F-FFC0-489C-A59B-27665CD58015}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B181D00F-FFC0-489C-A59B-27665CD58015}.Debug|Any CPU.Deploy.0 = Debug|Any CPU + {B181D00F-FFC0-489C-A59B-27665CD58015}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B181D00F-FFC0-489C-A59B-27665CD58015}.Release|Any CPU.Build.0 = Release|Any CPU + {B181D00F-FFC0-489C-A59B-27665CD58015}.Release|Any CPU.Deploy.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {61F7FB11-1E47-470C-91E2-47F8143E1572} + EndGlobalSection +EndGlobal diff --git a/mobile/examples/Maui/MauiVisionSample/MauiVisionSample/App.xaml b/mobile/examples/Maui/MauiVisionSample/MauiVisionSample/App.xaml new file mode 100644 index 000000000..a5e3f56e5 --- /dev/null +++ b/mobile/examples/Maui/MauiVisionSample/MauiVisionSample/App.xaml @@ -0,0 +1,14 @@ + + + + + + + + + + + diff --git a/mobile/examples/Maui/MauiVisionSample/MauiVisionSample/App.xaml.cs b/mobile/examples/Maui/MauiVisionSample/MauiVisionSample/App.xaml.cs new file mode 100644 index 000000000..d35e96edf --- /dev/null +++ b/mobile/examples/Maui/MauiVisionSample/MauiVisionSample/App.xaml.cs @@ -0,0 +1,11 @@ +namespace MauiVisionSample; + +public partial class App : Application +{ + public App() + { + InitializeComponent(); + + MainPage = new AppShell(); + } +} diff --git a/mobile/examples/Maui/MauiVisionSample/MauiVisionSample/AppShell.xaml b/mobile/examples/Maui/MauiVisionSample/MauiVisionSample/AppShell.xaml new file mode 100644 index 000000000..8aee3ef57 --- /dev/null +++ b/mobile/examples/Maui/MauiVisionSample/MauiVisionSample/AppShell.xaml @@ -0,0 +1,14 @@ + + + + + + diff --git a/mobile/examples/Maui/MauiVisionSample/MauiVisionSample/AppShell.xaml.cs b/mobile/examples/Maui/MauiVisionSample/MauiVisionSample/AppShell.xaml.cs new file mode 100644 index 000000000..c2cd6a274 --- /dev/null +++ b/mobile/examples/Maui/MauiVisionSample/MauiVisionSample/AppShell.xaml.cs @@ -0,0 +1,9 @@ +namespace MauiVisionSample; + +public partial class AppShell : Shell +{ + public AppShell() + { + InitializeComponent(); + } +} diff --git a/mobile/examples/Maui/MauiVisionSample/MauiVisionSample/ExecutionProviders.cs b/mobile/examples/Maui/MauiVisionSample/MauiVisionSample/ExecutionProviders.cs new file mode 100644 index 000000000..b0dc39395 --- /dev/null +++ b/mobile/examples/Maui/MauiVisionSample/MauiVisionSample/ExecutionProviders.cs @@ -0,0 +1,12 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +namespace MauiVisionSample +{ + public enum ExecutionProviders + { + CPU, // CPU execution provider is always available by default + NNAPI, // NNAPI is available on Android + CoreML // CoreML is available on iOS/macOS + } +} \ No newline at end of file diff --git a/mobile/examples/Maui/MauiVisionSample/MauiVisionSample/IVisionSample.cs b/mobile/examples/Maui/MauiVisionSample/MauiVisionSample/IVisionSample.cs new file mode 100644 index 000000000..a9eda3e34 --- /dev/null +++ b/mobile/examples/Maui/MauiVisionSample/MauiVisionSample/IVisionSample.cs @@ -0,0 +1,16 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +using System.Threading.Tasks; + +namespace MauiVisionSample +{ + public interface IVisionSample + { + string Name { get; } + string ModelName { get; } + Task InitializeAsync(); + Task UpdateExecutionProviderAsync(ExecutionProviders executionProvider); + Task ProcessImageAsync(byte[] image); + } +} diff --git a/mobile/examples/Maui/MauiVisionSample/MauiVisionSample/MainPage.xaml b/mobile/examples/Maui/MauiVisionSample/MauiVisionSample/MainPage.xaml new file mode 100644 index 000000000..226ce8012 --- /dev/null +++ b/mobile/examples/Maui/MauiVisionSample/MauiVisionSample/MainPage.xaml @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +