├── .gitattributes
├── .github
└── workflows
│ └── build.yml
├── .gitignore
├── Directory.Build.props
├── Directory.Build.targets
├── EmotionRecognizer
├── EmotionRecognizer.cs
├── EmotionRecognizer.licenseheader
├── IntelligentAPI_EmotionRecognizer.csproj
├── Properties
│ ├── AssemblyInfo.cs
│ └── IntelligentAPI_EmotionRecognizer.rd.xml
└── Scripts
│ └── script.ps1
├── ImageClassifier
├── Assets
│ └── Labels.json
├── ImageClassifier.licenseheader
├── IntelligentAPI_ImageClassifier.csproj
├── Properties
│ ├── AssemblyInfo.cs
│ └── IntelligentAPI_ImageClassifier.rd.xml
├── Scripts
│ └── script.ps1
├── SqueezeNetImageClassifier.cs
└── model.cs
├── IntelligentAPIs.sln
├── IntelligentAPIsTester
├── App.xaml
├── App.xaml.cs
├── Assets
│ ├── LockScreenLogo.scale-200.png
│ ├── SplashScreen.scale-200.png
│ ├── Square150x150Logo.scale-200.png
│ ├── Square44x44Logo.scale-200.png
│ ├── Square44x44Logo.targetsize-24_altform-unplated.png
│ ├── StoreLogo.png
│ ├── Wide310x150Logo.scale-200.png
│ └── background.jpg
├── IntelligentLabsTest.csproj
├── MainPage.xaml
├── MainPage.xaml.cs
├── Package.appxmanifest
├── Properties
│ ├── AssemblyInfo.cs
│ └── Default.rd.xml
├── ResultsPage.xaml
├── ResultsPage.xaml.cs
└── Scripts
│ └── script.ps1
├── License.md
├── ObjectDetector
├── Assets
│ └── Yolo.cs
├── IntelligentAPI_ObjectDetector.csproj
├── IntelligentAPI_ObjectDetector.pri
├── ObjectDetector.licenseheader
├── Properties
│ ├── AssemblyInfo.cs
│ └── IntelligentAPI_ObjectDetector.rd.xml
├── Scripts
│ └── script.ps1
├── YOLOObjectDetector.cs
└── Yolo.cs
├── README.md
├── ThirdPartyNotices.txt
├── Windows.Toolkit.Common.props
├── global.json
└── nuget.png
/.gitattributes:
--------------------------------------------------------------------------------
1 | *.onnx filter=lfs diff=lfs merge=lfs -text
2 |
--------------------------------------------------------------------------------
/.github/workflows/build.yml:
--------------------------------------------------------------------------------
1 |
2 | # This is a basic workflow to help you get started with Actions
3 |
4 | name: CI
5 |
6 | # Controls when the action will run.
7 | on:
8 | # Triggers the workflow on push or pull request events but only for the main branch
9 | push:
10 | branches: [ main ]
11 | pull_request:
12 | branches: [ main ]
13 |
14 | # Allows you to run this workflow manually from the Actions tab
15 | workflow_dispatch:
16 |
17 |
18 | # A workflow run is made up of one or more jobs that can run sequentially or in parallel
19 | jobs:
20 | # This workflow contains a single job called "build"
21 | build:
22 | # The type of runner that the job will run on
23 | runs-on: windows-latest
24 |
25 | # Steps represent a sequence of tasks that will be executed as part of the job
26 | steps:
27 | - name: Install .NET Core SDK
28 | uses: actions/setup-dotnet@v1
29 | with:
30 | dotnet-version: '5.0.302'
31 |
32 | # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
33 | - uses: actions/checkout@v2
34 | # Runs a set of commands using the runners shell
35 | - name: Add msbuild to PATH
36 | uses: microsoft/setup-msbuild@v1.0.3
37 |
38 | - name: MSBuild
39 | # working-directory: ./ImageClassifier
40 | run: msbuild.exe IntelligentAPIs.sln /restore -p:Configuration=Packages
41 |
42 | - name: pack ImageClassifier
43 | working-directory: ./ImageClassifier
44 | run: msbuild -t:pack /p:Configuration=Release /p:DebugType=Portable
45 |
46 | - name: pack ObjectDetector
47 | working-directory: ./ObjectDetector
48 | run: msbuild -t:pack /p:Configuration=Release /p:DebugType=Portable
49 |
50 | - name: pack EmotionRecognizer
51 | working-directory: ./EmotionRecognizer
52 | run: msbuild -t:pack /p:Configuration=Release /p:DebugType=Portable
53 |
54 | - name: Add source
55 | run: dotnet nuget add source "https://pkgs.dev.azure.com/dotnet/CommunityToolkit/_packaging/CommunityToolkit-Labs/nuget/v3/index.json" --name LabsFeed --username dummy --password ${{ secrets.DEVOPS_PACKAGE_PUSH_TOKEN }}
56 |
57 | - name: Push packages
58 | if: ${{github.ref == 'refs/heads/main'}}
59 | run: dotnet nuget push "**/*.nupkg" --api-key dummy --source LabsFeed --skip-duplicate
60 |
61 |
62 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | ## Ignore Visual Studio temporary files, build results, and
2 | ## files generated by popular Visual Studio add-ons.
3 | ##
4 | ## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
5 |
6 |
7 |
8 |
9 | # Ignore .onnx files
10 | **/*.onnx
11 |
12 | # User-specific files
13 | *.rsuser
14 | *.suo
15 | *.user
16 | *.userosscache
17 | *.sln.docstates
18 |
19 | # User-specific files (MonoDevelop/Xamarin Studio)
20 | *.userprefs
21 |
22 | # Mono auto generated files
23 | mono_crash.*
24 |
25 | # Build results
26 | [Dd]ebug/
27 | [Dd]ebugPublic/
28 | [Rr]elease/
29 | [Rr]eleases/
30 | x64/
31 | x86/
32 | [Aa][Rr][Mm]/
33 | [Aa][Rr][Mm]64/
34 | bld/
35 | [Bb]in/
36 | [Oo]bj/
37 | [Ll]og/
38 | [Ll]ogs/
39 |
40 | # Visual Studio 2015/2017 cache/options directory
41 | .vs/
42 | # Uncomment if you have tasks that create the project's static files in wwwroot
43 | #wwwroot/
44 |
45 | # Visual Studio 2017 auto generated files
46 | Generated\ Files/
47 |
48 | # MSTest test Results
49 | [Tt]est[Rr]esult*/
50 | [Bb]uild[Ll]og.*
51 |
52 | # NUnit
53 | *.VisualState.xml
54 | TestResult.xml
55 | nunit-*.xml
56 |
57 | # Build Results of an ATL Project
58 | [Dd]ebugPS/
59 | [Rr]eleasePS/
60 | dlldata.c
61 |
62 | # Benchmark Results
63 | BenchmarkDotNet.Artifacts/
64 |
65 | # .NET Core
66 | project.lock.json
67 | project.fragment.lock.json
68 | artifacts/
69 |
70 | # StyleCop
71 | StyleCopReport.xml
72 |
73 | # Files built by Visual Studio
74 | *_i.c
75 | *_p.c
76 | *_h.h
77 | *.ilk
78 | *.meta
79 | *.obj
80 | *.iobj
81 | *.pch
82 | *.pdb
83 | *.ipdb
84 | *.pgc
85 | *.pgd
86 | *.rsp
87 | *.sbr
88 | *.tlb
89 | *.tli
90 | *.tlh
91 | *.tmp
92 | *.tmp_proj
93 | *_wpftmp.csproj
94 | *.log
95 | *.vspscc
96 | *.vssscc
97 | .builds
98 | *.pidb
99 | *.svclog
100 | *.scc
101 |
102 | # Chutzpah Test files
103 | _Chutzpah*
104 |
105 | # Visual C++ cache files
106 | ipch/
107 | *.aps
108 | *.ncb
109 | *.opendb
110 | *.opensdf
111 | *.sdf
112 | *.cachefile
113 | *.VC.db
114 | *.VC.VC.opendb
115 |
116 | # Visual Studio profiler
117 | *.psess
118 | *.vsp
119 | *.vspx
120 | *.sap
121 |
122 | # Visual Studio Trace Files
123 | *.e2e
124 |
125 | # TFS 2012 Local Workspace
126 | $tf/
127 |
128 | # Guidance Automation Toolkit
129 | *.gpState
130 |
131 | # ReSharper is a .NET coding add-in
132 | _ReSharper*/
133 | *.[Rr]e[Ss]harper
134 | *.DotSettings.user
135 |
136 | # TeamCity is a build add-in
137 | _TeamCity*
138 |
139 | # DotCover is a Code Coverage Tool
140 | *.dotCover
141 |
142 | # AxoCover is a Code Coverage Tool
143 | .axoCover/*
144 | !.axoCover/settings.json
145 |
146 | # Visual Studio code coverage results
147 | *.coverage
148 | *.coveragexml
149 |
150 | # NCrunch
151 | _NCrunch_*
152 | .*crunch*.local.xml
153 | nCrunchTemp_*
154 |
155 | # MightyMoose
156 | *.mm.*
157 | AutoTest.Net/
158 |
159 | # Web workbench (sass)
160 | .sass-cache/
161 |
162 | # Installshield output folder
163 | [Ee]xpress/
164 |
165 | # DocProject is a documentation generator add-in
166 | DocProject/buildhelp/
167 | DocProject/Help/*.HxT
168 | DocProject/Help/*.HxC
169 | DocProject/Help/*.hhc
170 | DocProject/Help/*.hhk
171 | DocProject/Help/*.hhp
172 | DocProject/Help/Html2
173 | DocProject/Help/html
174 |
175 | # Click-Once directory
176 | publish/
177 |
178 | # Publish Web Output
179 | *.[Pp]ublish.xml
180 | *.azurePubxml
181 | # Note: Comment the next line if you want to checkin your web deploy settings,
182 | # but database connection strings (with potential passwords) will be unencrypted
183 | *.pubxml
184 | *.publishproj
185 |
186 | # Microsoft Azure Web App publish settings. Comment the next line if you want to
187 | # checkin your Azure Web App publish settings, but sensitive information contained
188 | # in these scripts will be unencrypted
189 | PublishScripts/
190 |
191 | # NuGet Packages
192 | **/nuget.exe
193 | *.nupkg
194 | # NuGet Symbol Packages
195 | *.snupkg
196 | # The packages folder can be ignored because of Package Restore
197 | **/[Pp]ackages/*
198 | # except build/, which is used as an MSBuild target.
199 | !**/[Pp]ackages/build/
200 | # Uncomment if necessary however generally it will be regenerated when needed
201 | #!**/[Pp]ackages/repositories.config
202 | # NuGet v3's project.json files produces more ignorable files
203 | *.nuget.props
204 | *.nuget.targets
205 |
206 | # Microsoft Azure Build Output
207 | csx/
208 | *.build.csdef
209 |
210 | # Microsoft Azure Emulator
211 | ecf/
212 | rcf/
213 |
214 | # Windows Store app package directories and files
215 | AppPackages/
216 | BundleArtifacts/
217 | Package.StoreAssociation.xml
218 | _pkginfo.txt
219 | *.appx
220 | *.appxbundle
221 | *.appxupload
222 |
223 | # Visual Studio cache files
224 | # files ending in .cache can be ignored
225 | *.[Cc]ache
226 | # but keep track of directories ending in .cache
227 | !?*.[Cc]ache/
228 |
229 | # Others
230 | ClientBin/
231 | ~$*
232 | *~
233 | *.dbmdl
234 | *.dbproj.schemaview
235 | *.jfm
236 | *.pfx
237 | *.publishsettings
238 | orleans.codegen.cs
239 |
240 | # Including strong name files can present a security risk
241 | # (https://github.com/github/gitignore/pull/2483#issue-259490424)
242 | #*.snk
243 |
244 | # Since there are multiple workflows, uncomment next line to ignore bower_components
245 | # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
246 | #bower_components/
247 |
248 | # RIA/Silverlight projects
249 | Generated_Code/
250 |
251 | # Backup & report files from converting an old project file
252 | # to a newer Visual Studio version. Backup files are not needed,
253 | # because we have git ;-)
254 | _UpgradeReport_Files/
255 | Backup*/
256 | UpgradeLog*.XML
257 | UpgradeLog*.htm
258 | ServiceFabricBackup/
259 | *.rptproj.bak
260 |
261 | # SQL Server files
262 | *.mdf
263 | *.ldf
264 | *.ndf
265 |
266 | # Business Intelligence projects
267 | *.rdl.data
268 | *.bim.layout
269 | *.bim_*.settings
270 | *.rptproj.rsuser
271 | *- [Bb]ackup.rdl
272 | *- [Bb]ackup ([0-9]).rdl
273 | *- [Bb]ackup ([0-9][0-9]).rdl
274 |
275 | # Microsoft Fakes
276 | FakesAssemblies/
277 |
278 | # GhostDoc plugin setting file
279 | *.GhostDoc.xml
280 |
281 | # Node.js Tools for Visual Studio
282 | .ntvs_analysis.dat
283 | node_modules/
284 |
285 | # Visual Studio 6 build log
286 | *.plg
287 |
288 | # Visual Studio 6 workspace options file
289 | *.opt
290 |
291 | # Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
292 | *.vbw
293 |
294 | # Visual Studio LightSwitch build output
295 | **/*.HTMLClient/GeneratedArtifacts
296 | **/*.DesktopClient/GeneratedArtifacts
297 | **/*.DesktopClient/ModelManifest.xml
298 | **/*.Server/GeneratedArtifacts
299 | **/*.Server/ModelManifest.xml
300 | _Pvt_Extensions
301 |
302 | # Paket dependency manager
303 | .paket/paket.exe
304 | paket-files/
305 |
306 | # FAKE - F# Make
307 | .fake/
308 |
309 | # CodeRush personal settings
310 | .cr/personal
311 |
312 | # Python Tools for Visual Studio (PTVS)
313 | __pycache__/
314 | *.pyc
315 |
316 | # Cake - Uncomment if you are using it
317 | # tools/**
318 | # !tools/packages.config
319 |
320 | # Tabs Studio
321 | *.tss
322 |
323 | # Telerik's JustMock configuration file
324 | *.jmconfig
325 |
326 | # BizTalk build output
327 | *.btp.cs
328 | *.btm.cs
329 | *.odx.cs
330 | *.xsd.cs
331 |
332 | # OpenCover UI analysis results
333 | OpenCover/
334 |
335 | # Azure Stream Analytics local run output
336 | ASALocalRun/
337 |
338 | # MSBuild Binary and Structured Log
339 | *.binlog
340 |
341 | # NVidia Nsight GPU debugger configuration file
342 | *.nvuser
343 |
344 | # MFractors (Xamarin productivity tool) working folder
345 | .mfractor/
346 |
347 | # Local History for Visual Studio
348 | .localhistory/
349 |
350 | # BeatPulse healthcheck temp database
351 | healthchecksdb
352 |
353 | # Backup folder for Package Reference Convert tool in Visual Studio 2017
354 | MigrationBackup/
355 |
356 | # Ionide (cross platform F# VS Code tools) working folder
357 | .ionide/
358 | /ObjectDetector/makepri.exe
359 | /ObjectDetector/resources.pri.xml
360 |
--------------------------------------------------------------------------------
/Directory.Build.props:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | $(MSBuildThisFileDirectory)
5 |
6 |
7 |
8 |
9 |
10 | 10.0.19041.0
11 | 10.0.17763.0
12 | false
13 | uap10.0.17763
14 |
15 |
16 |
17 | Embedded
18 | bin\Package
19 | .pdb
20 | true
21 | true
22 |
23 |
24 |
--------------------------------------------------------------------------------
/Directory.Build.targets:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 | $(CommonTags);UWP;WinML;ML
10 | $(CommonTags);$(PackageTags)
11 | $(CommonTags)
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/EmotionRecognizer/EmotionRecognizer.cs:
--------------------------------------------------------------------------------
1 | // Licensed to the .NET Foundation under one or more agreements.
2 | // The .NET Foundation licenses this file to you under the MIT license.
3 | // See the LICENSE file in the project root for more information.
4 | using System;
5 | using System.Collections.Generic;
6 | using System.Linq;
7 | using System.Text;
8 | using System.Threading.Tasks;
9 | using Windows.AI.MachineLearning;
10 | using Windows.Foundation;
11 | using Windows.Graphics.Imaging;
12 | using Windows.Media;
13 | using Windows.Media.FaceAnalysis;
14 | using Windows.Storage;
15 | using Windows.Storage.Streams;
16 |
17 | namespace CommunityToolkit.Labs.Intelligent.EmotionRecognition
18 | {
19 | ///
20 | /// Detection result class that contains the index and emotion of a face in the input image.
21 | ///
22 | public class DetectedEmotion
23 | {
24 | ///
25 | /// Index of the result in the array ["Neutral","Happiness","Surprise","Sadness","Anger","Disgust","Fear","Contempt"]
26 | ///
27 | public int emotionIndex;
28 |
29 | ///
30 | /// Emotion result
31 | ///
32 | public string emotion;
33 | }
34 |
35 | ///
36 | /// EmotionRecognizer class
37 | ///
38 | public class EmotionRecognizer
39 | {
40 | ///
41 | /// Model file
42 | ///
43 | private LearningModel _model = null;
44 |
45 | ///
46 | /// Session instance
47 | ///
48 | private LearningModelSession _session = null;
49 |
50 | ///
51 | /// Binding
52 | ///
53 | private LearningModelBinding _binding = null;
54 |
55 | ///
56 | /// EmotionRecognizer instance
57 | ///
58 | private static EmotionRecognizer instance = null;
59 |
60 | ///
61 | /// List of labels
62 | ///
63 | private static List labels;
64 |
65 |
66 | private async Task InitModelAsync()
67 | {
68 | // load model file
69 | var file = await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///IntelligentAPI_EmotionRecognizer/Assets/model_emotion.onnx"));
70 |
71 | //Loads the mdoel from the file
72 | _model = await LearningModel.LoadFromStorageFileAsync(file);
73 |
74 | //Creating a session that binds the model to the device running the model
75 | _session = new LearningModelSession(_model, new LearningModelDevice(GetDeviceKind()));
76 | }
77 |
78 | ///
79 | /// Load labels
80 | ///
81 | private void LoadLabels()
82 | {
83 | labels = new List()
84 | {
85 | "Neutral",
86 | "Happiness",
87 | "Surprise",
88 | "Sadness",
89 | "Anger",
90 | "Disgust",
91 | "Fear",
92 | "Contempt"
93 | };
94 | }
95 |
96 | LearningModelDeviceKind GetDeviceKind()
97 | {
98 | return LearningModelDeviceKind.Cpu;
99 | }
100 |
101 | ///
102 | /// Detect Faces in image
103 | ///
104 | ///
105 | ///
106 | private async static Task> DetectFacesInImageAsync(SoftwareBitmap bitmap)
107 | {
108 | FaceDetector faceDetector = await FaceDetector.CreateAsync();
109 | var convertedBitmap = SoftwareBitmap.Convert(bitmap, BitmapPixelFormat.Gray8);
110 | return await faceDetector.DetectFacesAsync(convertedBitmap);
111 |
112 | }
113 |
114 | ///
115 | /// Detect emotion on a face in an input image
116 | ///
117 | ///
118 | ///
119 | /// Returns detected emotion in DetectedEmotion object, null if no face was detected.
120 | ///
121 | public async static Task DetectEmotion(SoftwareBitmap bitmap)
122 | {
123 | if (instance == null)
124 | {
125 | instance = new EmotionRecognizer();
126 | }
127 |
128 | return await instance.EvaluateFrame(bitmap);
129 | }
130 |
131 | ///
132 | /// Detect emotion on a face in an input image
133 | ///
134 | ///
135 | ///
136 | /// Returns detected emotion in DetectedEmotion object, null if no face was detected.
137 | ///
138 | public async static Task DetectEmotion(StorageFile storageFile)
139 | {
140 | SoftwareBitmap bitmap = await GenerateSoftwareBitmapFromStorageFile(storageFile);
141 | return await DetectEmotion(bitmap);
142 | }
143 |
144 | ///
145 | /// Evaluate frame
146 | ///
147 | ///
148 | ///
149 | private async Task EvaluateFrame(SoftwareBitmap softwareBitmap)
150 | {
151 | await InitModelAsync();
152 | LoadLabels();
153 | DetectedFace detectedFace = await DetectFace(softwareBitmap);
154 | if (detectedFace != null)
155 | {
156 | return await EvaluateEmotionInFace(detectedFace, softwareBitmap);
157 | }
158 | return null;
159 | }
160 |
161 | ///
162 | /// Evaluate emotion in face
163 | ///
164 | ///
165 | ///
166 | ///
167 | private async Task EvaluateEmotionInFace(DetectedFace detectedFace, SoftwareBitmap softwareBitmap)
168 | {
169 |
170 | var boundingBox = new Rect(detectedFace.FaceBox.X,
171 | detectedFace.FaceBox.Y,
172 | detectedFace.FaceBox.Width,
173 | detectedFace.FaceBox.Height);
174 |
175 | softwareBitmap = SoftwareBitmap.Convert(softwareBitmap, BitmapPixelFormat.Bgra8);
176 |
177 | var croppedFace = await Crop(softwareBitmap, boundingBox);
178 | LearningModelEvaluationResult emotionResults = await BindAndEvaluateModelAsync(croppedFace);
179 |
180 | // to get percentages, you'd need to run the output through a softmax function
181 | // we don't need percentages, we just need max value
182 | TensorFloat emotionIndexTensor = emotionResults.Outputs["Plus692_Output_0"] as TensorFloat;
183 |
184 | var emotionList = emotionIndexTensor.GetAsVectorView().ToList();
185 | var emotionIndex = emotionList.IndexOf(emotionList.Max());
186 |
187 | return new DetectedEmotion() { emotionIndex = emotionIndex, emotion = labels[emotionIndex] };
188 |
189 |
190 | }
191 |
192 | ///
193 | /// Detect face
194 | ///
195 | ///
196 | ///
197 | private static async Task DetectFace(SoftwareBitmap softwareBitmap)
198 | {
199 | var faces = await DetectFacesInImageAsync(softwareBitmap);
200 |
201 | // if there is a face in the frame, evaluate the emotion
202 | var detectedFace = faces.FirstOrDefault();
203 | return detectedFace;
204 | }
205 |
206 | ///
207 | /// Converts object of type StorageFile to SoftwareBitmap
208 | ///
209 | ///
210 | ///
211 | private static async Task GenerateSoftwareBitmapFromStorageFile(StorageFile selectedStorageFile)
212 | {
213 | SoftwareBitmap softwareBitmap;
214 | using (IRandomAccessStream stream = await selectedStorageFile.OpenAsync(FileAccessMode.Read))
215 | {
216 | // Create the decoder from the stream
217 | BitmapDecoder decoder = await BitmapDecoder.CreateAsync(stream);
218 |
219 | // Get the SoftwareBitmap representation of the file in BGRA8 format
220 | softwareBitmap = await decoder.GetSoftwareBitmapAsync();
221 | softwareBitmap = GetSoftwareBitmap(softwareBitmap);
222 | }
223 |
224 | return softwareBitmap;
225 | }
226 |
227 | ///
228 | /// Get Software Bitmap
229 | ///
230 | ///
231 | ///
232 | private static SoftwareBitmap GetSoftwareBitmap(SoftwareBitmap softwareBitmap)
233 | {
234 | if (softwareBitmap.BitmapPixelFormat != BitmapPixelFormat.Bgra8 || (softwareBitmap.BitmapAlphaMode != BitmapAlphaMode.Ignore && softwareBitmap.BitmapAlphaMode != BitmapAlphaMode.Premultiplied))
235 | {
236 | softwareBitmap = SoftwareBitmap.Convert(softwareBitmap, BitmapPixelFormat.Bgra8, BitmapAlphaMode.Premultiplied);
237 | }
238 | return softwareBitmap;
239 | }
240 |
241 | private static async Task Crop(SoftwareBitmap softwareBitmap, Rect bounds)
242 | {
243 | VideoFrame vid = VideoFrame.CreateWithSoftwareBitmap(softwareBitmap);
244 | vid = await Crop(vid, bounds);
245 | return vid.SoftwareBitmap;
246 |
247 | }
248 | private static async Task Crop(VideoFrame videoFrame, Rect bounds)
249 | {
250 | BitmapBounds cropBounds = new BitmapBounds()
251 | {
252 | Width = (uint)bounds.Width,
253 | Height = (uint)bounds.Height,
254 | X = (uint)bounds.X,
255 | Y = (uint)bounds.Y
256 | };
257 | VideoFrame result = new VideoFrame(BitmapPixelFormat.Bgra8,
258 | (int)cropBounds.Width,
259 | (int)cropBounds.Height,
260 | BitmapAlphaMode.Premultiplied);
261 |
262 | await videoFrame.CopyToAsync(result, cropBounds, null);
263 |
264 | return result;
265 | }
266 |
267 |
268 | private async Task BindAndEvaluateModelAsync(SoftwareBitmap croppedFace)
269 | {
270 | //Create Learning model binding which binds
271 | _binding = new LearningModelBinding(_session);
272 | _binding.Bind("Input3", VideoFrame.CreateWithSoftwareBitmap(croppedFace));
273 | var emotionResults = await _session.EvaluateAsync(_binding, "id");
274 | return emotionResults;
275 | }
276 |
277 | }
278 | }
279 |
--------------------------------------------------------------------------------
/EmotionRecognizer/EmotionRecognizer.licenseheader:
--------------------------------------------------------------------------------
1 | extensions: designer.cs generated.cs
2 | extensions: .cs
3 | // Licensed to the .NET Foundation under one or more agreements.
4 | // The .NET Foundation licenses this file to you under the MIT license.
5 | // See the LICENSE file in the project root for more information.
--------------------------------------------------------------------------------
/EmotionRecognizer/IntelligentAPI_EmotionRecognizer.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 | IntelligentAPI.EmotionRecognition
4 |
5 |
6 | CommunityToolkit.Labs.Intelligent.EmotionRecognition
7 |
8 | This package performs Emotion Recognition on an input image by using the Emotion FERPlus model.
9 |
10 | 0.0.2
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
--------------------------------------------------------------------------------
/EmotionRecognizer/Properties/AssemblyInfo.cs:
--------------------------------------------------------------------------------
1 | // Licensed to the .NET Foundation under one or more agreements.
2 | // The .NET Foundation licenses this file to you under the MIT license.
3 | // See the LICENSE file in the project root for more information.
4 | using System.Reflection;
5 | using System.Runtime.CompilerServices;
6 | using System.Runtime.InteropServices;
7 |
8 | // General Information about an assembly is controlled through the following
9 | // set of attributes. Change these attribute values to modify the information
10 | // associated with an assembly.
11 | [assembly: AssemblyTrademark("")]
12 | [assembly: AssemblyCulture("")]
13 |
14 | // Version information for an assembly consists of the following four values:
15 | //
16 | // Major Version
17 | // Minor Version
18 | // Build Number
19 | // Revision
20 | //
21 | // You can specify all the values or you can default the Build and Revision Numbers
22 | // by using the '*' as shown below:
23 | // [assembly: AssemblyVersion("1.0.*")]
24 | [assembly: ComVisible(false)]
--------------------------------------------------------------------------------
/EmotionRecognizer/Properties/IntelligentAPI_EmotionRecognizer.rd.xml:
--------------------------------------------------------------------------------
1 |
2 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
--------------------------------------------------------------------------------
/EmotionRecognizer/Scripts/script.ps1:
--------------------------------------------------------------------------------
1 | $ProgressPreference = 'SilentlyContinue'
2 |
3 | $emotionferplusfile = "./Assets/model_emotion.onnx"
4 | $folderPath = "./Assets"
5 |
6 | if (-not(Test-Path -Path $emotionferplusfile -PathType Leaf)) {
7 | If(!(test-path $folderPath)) {
8 | New-Item -ItemType Directory -Force -Path $folderPath
9 | }
10 | try {
11 | Invoke-WebRequest -URI "https://github.com/onnx/models/raw/main/vision/body_analysis/emotion_ferplus/model/emotion-ferplus-8.onnx" -OutFile $emotionferplusfile
12 | Write-Host "The file [$emotionferplusfile] has been created."
13 | }
14 | catch {
15 | throw $_.Exception.Message
16 | }
17 | }
18 | else {
19 | Write-Host "The file [$emotionferplusfile] exists."
20 | }
21 |
--------------------------------------------------------------------------------
/ImageClassifier/Assets/Labels.json:
--------------------------------------------------------------------------------
1 | {
2 | "0": "tench, Tinca tinca",
3 | "1": "goldfish, Carassius auratus",
4 | "2": "great white shark, white shark, man-eater, man-eating shark, Carcharodon carcharias",
5 | "3": "tiger shark, Galeocerdo cuvieri",
6 | "4": "hammerhead, hammerhead shark",
7 | "5": "electric ray, crampfish, numbfish, torpedo",
8 | "6": "stingray",
9 | "7": "cock",
10 | "8": "hen",
11 | "9": "ostrich, Struthio camelus",
12 | "10": "brambling, Fringilla montifringilla",
13 | "11": "goldfinch, Carduelis carduelis",
14 | "12": "house finch, linnet, Carpodacus mexicanus",
15 | "13": "junco, snowbird",
16 | "14": "indigo bunting, indigo finch, indigo bird, Passerina cyanea",
17 | "15": "robin, American robin, Turdus migratorius",
18 | "16": "bulbul",
19 | "17": "jay",
20 | "18": "magpie",
21 | "19": "chickadee",
22 | "20": "water ouzel, dipper",
23 | "21": "kite",
24 | "22": "bald eagle, American eagle, Haliaeetus leucocephalus",
25 | "23": "vulture",
26 | "24": "great grey owl, great gray owl, Strix nebulosa",
27 | "25": "European fire salamander, Salamandra salamandra",
28 | "26": "common newt, Triturus vulgaris",
29 | "27": "eft",
30 | "28": "spotted salamander, Ambystoma maculatum",
31 | "29": "axolotl, mud puppy, Ambystoma mexicanum",
32 | "30": "bullfrog, Rana catesbeiana",
33 | "31": "tree frog, tree-frog",
34 | "32": "tailed frog, bell toad, ribbed toad, tailed toad, Ascaphus trui",
35 | "33": "loggerhead, loggerhead turtle, Caretta caretta",
36 | "34": "leatherback turtle, leatherback, leathery turtle, Dermochelys coriacea",
37 | "35": "mud turtle",
38 | "36": "terrapin",
39 | "37": "box turtle, box tortoise",
40 | "38": "banded gecko",
41 | "39": "common iguana, iguana, Iguana iguana",
42 | "40": "American chameleon, anole, Anolis carolinensis",
43 | "41": "whiptail, whiptail lizard",
44 | "42": "agama",
45 | "43": "frilled lizard, Chlamydosaurus kingi",
46 | "44": "alligator lizard",
47 | "45": "Gila monster, Heloderma suspectum",
48 | "46": "green lizard, Lacerta viridis",
49 | "47": "African chameleon, Chamaeleo chamaeleon",
50 | "48": "Komodo dragon, Komodo lizard, dragon lizard, giant lizard, Varanus komodoensis",
51 | "49": "African crocodile, Nile crocodile, Crocodylus niloticus",
52 | "50": "American alligator, Alligator mississipiensis",
53 | "51": "triceratops",
54 | "52": "thunder snake, worm snake, Carphophis amoenus",
55 | "53": "ringneck snake, ring-necked snake, ring snake",
56 | "54": "hognose snake, puff adder, sand viper",
57 | "55": "green snake, grass snake",
58 | "56": "king snake, kingsnake",
59 | "57": "garter snake, grass snake",
60 | "58": "water snake",
61 | "59": "vine snake",
62 | "60": "night snake, Hypsiglena torquata",
63 | "61": "boa constrictor, Constrictor constrictor",
64 | "62": "rock python, rock snake, Python sebae",
65 | "63": "Indian cobra, Naja naja",
66 | "64": "green mamba",
67 | "65": "sea snake",
68 | "66": "horned viper, cerastes, sand viper, horned asp, Cerastes cornutus",
69 | "67": "diamondback, diamondback rattlesnake, Crotalus adamanteus",
70 | "68": "sidewinder, horned rattlesnake, Crotalus cerastes",
71 | "69": "trilobite",
72 | "70": "harvestman, daddy longlegs, Phalangium opilio",
73 | "71": "scorpion",
74 | "72": "black and gold garden spider, Argiope aurantia",
75 | "73": "barn spider, Araneus cavaticus",
76 | "74": "garden spider, Aranea diademata",
77 | "75": "black widow, Latrodectus mactans",
78 | "76": "tarantula",
79 | "77": "wolf spider, hunting spider",
80 | "78": "tick",
81 | "79": "centipede",
82 | "80": "black grouse",
83 | "81": "ptarmigan",
84 | "82": "ruffed grouse, partridge, Bonasa umbellus",
85 | "83": "prairie chicken, prairie grouse, prairie fowl",
86 | "84": "peacock",
87 | "85": "quail",
88 | "86": "partridge",
89 | "87": "African grey, African gray, Psittacus erithacus",
90 | "88": "macaw",
91 | "89": "sulphur-crested cockatoo, Kakatoe galerita, Cacatua galerita",
92 | "90": "lorikeet",
93 | "91": "coucal",
94 | "92": "bee eater",
95 | "93": "hornbill",
96 | "94": "hummingbird",
97 | "95": "jacamar",
98 | "96": "toucan",
99 | "97": "drake",
100 | "98": "red-breasted merganser, Mergus serrator",
101 | "99": "goose",
102 | "100": "black swan, Cygnus atratus",
103 | "101": "tusker",
104 | "102": "echidna, spiny anteater, anteater",
105 | "103": "platypus, duckbill, duckbilled platypus, duck-billed platypus, Ornithorhynchus anatinus",
106 | "104": "wallaby, brush kangaroo",
107 | "105": "koala, koala bear, kangaroo bear, native bear, Phascolarctos cinereus",
108 | "106": "wombat",
109 | "107": "jellyfish",
110 | "108": "sea anemone, anemone",
111 | "109": "brain coral",
112 | "110": "flatworm, platyhelminth",
113 | "111": "nematode, nematode worm, roundworm",
114 | "112": "conch",
115 | "113": "snail",
116 | "114": "slug",
117 | "115": "sea slug, nudibranch",
118 | "116": "chiton, coat-of-mail shell, sea cradle, polyplacophore",
119 | "117": "chambered nautilus, pearly nautilus, nautilus",
120 | "118": "Dungeness crab, Cancer magister",
121 | "119": "rock crab, Cancer irroratus",
122 | "120": "fiddler crab",
123 | "121": "king crab, Alaska crab, Alaskan king crab, Alaska king crab, Paralithodes camtschatica",
124 | "122": "American lobster, Northern lobster, Maine lobster, Homarus americanus",
125 | "123": "spiny lobster, langouste, rock lobster, crawfish, crayfish, sea crawfish",
126 | "124": "crayfish, crawfish, crawdad, crawdaddy",
127 | "125": "hermit crab",
128 | "126": "isopod",
129 | "127": "white stork, Ciconia ciconia",
130 | "128": "black stork, Ciconia nigra",
131 | "129": "spoonbill",
132 | "130": "flamingo",
133 | "131": "little blue heron, Egretta caerulea",
134 | "132": "American egret, great white heron, Egretta albus",
135 | "133": "bittern",
136 | "134": "crane",
137 | "135": "limpkin, Aramus pictus",
138 | "136": "European gallinule, Porphyrio porphyrio",
139 | "137": "American coot, marsh hen, mud hen, water hen, Fulica americana",
140 | "138": "bustard",
141 | "139": "ruddy turnstone, Arenaria interpres",
142 | "140": "red-backed sandpiper, dunlin, Erolia alpina",
143 | "141": "redshank, Tringa totanus",
144 | "142": "dowitcher",
145 | "143": "oystercatcher, oyster catcher",
146 | "144": "pelican",
147 | "145": "king penguin, Aptenodytes patagonica",
148 | "146": "albatross, mollymawk",
149 | "147": "grey whale, gray whale, devilfish, Eschrichtius gibbosus, Eschrichtius robustus",
150 | "148": "killer whale, killer, orca, grampus, sea wolf, Orcinus orca",
151 | "149": "dugong, Dugong dugon",
152 | "150": "sea lion",
153 | "151": "Chihuahua",
154 | "152": "Japanese spaniel",
155 | "153": "Maltese dog, Maltese terrier, Maltese",
156 | "154": "Pekinese, Pekingese, Peke",
157 | "155": "Shih-Tzu",
158 | "156": "Blenheim spaniel",
159 | "157": "papillon",
160 | "158": "toy terrier",
161 | "159": "Rhodesian ridgeback",
162 | "160": "Afghan hound, Afghan",
163 | "161": "basset, basset hound",
164 | "162": "beagle",
165 | "163": "bloodhound, sleuthhound",
166 | "164": "bluetick",
167 | "165": "black-and-tan coonhound",
168 | "166": "Walker hound, Walker foxhound",
169 | "167": "English foxhound",
170 | "168": "redbone",
171 | "169": "borzoi, Russian wolfhound",
172 | "170": "Irish wolfhound",
173 | "171": "Italian greyhound",
174 | "172": "whippet",
175 | "173": "Ibizan hound, Ibizan Podenco",
176 | "174": "Norwegian elkhound, elkhound",
177 | "175": "otterhound, otter hound",
178 | "176": "Saluki, gazelle hound",
179 | "177": "Scottish deerhound, deerhound",
180 | "178": "Weimaraner",
181 | "179": "Staffordshire bullterrier, Staffordshire bull terrier",
182 | "180": "American Staffordshire terrier, Staffordshire terrier, American pit bull terrier, pit bull terrier",
183 | "181": "Bedlington terrier",
184 | "182": "Border terrier",
185 | "183": "Kerry blue terrier",
186 | "184": "Irish terrier",
187 | "185": "Norfolk terrier",
188 | "186": "Norwich terrier",
189 | "187": "Yorkshire terrier",
190 | "188": "wire-haired fox terrier",
191 | "189": "Lakeland terrier",
192 | "190": "Sealyham terrier, Sealyham",
193 | "191": "Airedale, Airedale terrier",
194 | "192": "cairn, cairn terrier",
195 | "193": "Australian terrier",
196 | "194": "Dandie Dinmont, Dandie Dinmont terrier",
197 | "195": "Boston bull, Boston terrier",
198 | "196": "miniature schnauzer",
199 | "197": "giant schnauzer",
200 | "198": "standard schnauzer",
201 | "199": "Scotch terrier, Scottish terrier, Scottie",
202 | "200": "Tibetan terrier, chrysanthemum dog",
203 | "201": "silky terrier, Sydney silky",
204 | "202": "soft-coated wheaten terrier",
205 | "203": "West Highland white terrier",
206 | "204": "Lhasa, Lhasa apso",
207 | "205": "flat-coated retriever",
208 | "206": "curly-coated retriever",
209 | "207": "golden retriever",
210 | "208": "Labrador retriever",
211 | "209": "Chesapeake Bay retriever",
212 | "210": "German short-haired pointer",
213 | "211": "vizsla, Hungarian pointer",
214 | "212": "English setter",
215 | "213": "Irish setter, red setter",
216 | "214": "Gordon setter",
217 | "215": "Brittany spaniel",
218 | "216": "clumber, clumber spaniel",
219 | "217": "English springer, English springer spaniel",
220 | "218": "Welsh springer spaniel",
221 | "219": "cocker spaniel, English cocker spaniel, cocker",
222 | "220": "Sussex spaniel",
223 | "221": "Irish water spaniel",
224 | "222": "kuvasz",
225 | "223": "schipperke",
226 | "224": "groenendael",
227 | "225": "malinois",
228 | "226": "briard",
229 | "227": "kelpie",
230 | "228": "komondor",
231 | "229": "Old English sheepdog, bobtail",
232 | "230": "Shetland sheepdog, Shetland sheep dog, Shetland",
233 | "231": "collie",
234 | "232": "Border collie",
235 | "233": "Bouvier des Flandres, Bouviers des Flandres",
236 | "234": "Rottweiler",
237 | "235": "German shepherd, German shepherd dog, German police dog, alsatian",
238 | "236": "Doberman, Doberman pinscher",
239 | "237": "miniature pinscher",
240 | "238": "Greater Swiss Mountain dog",
241 | "239": "Bernese mountain dog",
242 | "240": "Appenzeller",
243 | "241": "EntleBucher",
244 | "242": "boxer",
245 | "243": "bull mastiff",
246 | "244": "Tibetan mastiff",
247 | "245": "French bulldog",
248 | "246": "Great Dane",
249 | "247": "Saint Bernard, St Bernard",
250 | "248": "Eskimo dog, husky",
251 | "249": "malamute, malemute, Alaskan malamute",
252 | "250": "Siberian husky",
253 | "251": "dalmatian, coach dog, carriage dog",
254 | "252": "affenpinscher, monkey pinscher, monkey dog",
255 | "253": "basenji",
256 | "254": "pug, pug-dog",
257 | "255": "Leonberg",
258 | "256": "Newfoundland, Newfoundland dog",
259 | "257": "Great Pyrenees",
260 | "258": "Samoyed, Samoyede",
261 | "259": "Pomeranian",
262 | "260": "chow, chow chow",
263 | "261": "keeshond",
264 | "262": "Brabancon griffon",
265 | "263": "Pembroke, Pembroke Welsh corgi",
266 | "264": "Cardigan, Cardigan Welsh corgi",
267 | "265": "toy poodle",
268 | "266": "miniature poodle",
269 | "267": "standard poodle",
270 | "268": "Mexican hairless",
271 | "269": "timber wolf, grey wolf, gray wolf, Canis lupus",
272 | "270": "white wolf, Arctic wolf, Canis lupus tundrarum",
273 | "271": "red wolf, maned wolf, Canis rufus, Canis niger",
274 | "272": "coyote, prairie wolf, brush wolf, Canis latrans",
275 | "273": "dingo, warrigal, warragal, Canis dingo",
276 | "274": "dhole, Cuon alpinus",
277 | "275": "African hunting dog, hyena dog, Cape hunting dog, Lycaon pictus",
278 | "276": "hyena, hyaena",
279 | "277": "red fox, Vulpes vulpes",
280 | "278": "kit fox, Vulpes macrotis",
281 | "279": "Arctic fox, white fox, Alopex lagopus",
282 | "280": "grey fox, gray fox, Urocyon cinereoargenteus",
283 | "281": "tabby, tabby cat",
284 | "282": "tiger cat",
285 | "283": "Persian cat",
286 | "284": "Siamese cat, Siamese",
287 | "285": "Egyptian cat",
288 | "286": "cougar, puma, catamount, mountain lion, painter, panther, Felis concolor",
289 | "287": "lynx, catamount",
290 | "288": "leopard, Panthera pardus",
291 | "289": "snow leopard, ounce, Panthera uncia",
292 | "290": "jaguar, panther, Panthera onca, Felis onca",
293 | "291": "lion, king of beasts, Panthera leo",
294 | "292": "tiger, Panthera tigris",
295 | "293": "cheetah, chetah, Acinonyx jubatus",
296 | "294": "brown bear, bruin, Ursus arctos",
297 | "295": "American black bear, black bear, Ursus americanus, Euarctos americanus",
298 | "296": "ice bear, polar bear, Ursus Maritimus, Thalarctos maritimus",
299 | "297": "sloth bear, Melursus ursinus, Ursus ursinus",
300 | "298": "mongoose",
301 | "299": "meerkat, mierkat",
302 | "300": "tiger beetle",
303 | "301": "ladybug, ladybeetle, lady beetle, ladybird, ladybird beetle",
304 | "302": "ground beetle, carabid beetle",
305 | "303": "long-horned beetle, longicorn, longicorn beetle",
306 | "304": "leaf beetle, chrysomelid",
307 | "305": "dung beetle",
308 | "306": "rhinoceros beetle",
309 | "307": "weevil",
310 | "308": "fly",
311 | "309": "bee",
312 | "310": "ant, emmet, pismire",
313 | "311": "grasshopper, hopper",
314 | "312": "cricket",
315 | "313": "walking stick, walkingstick, stick insect",
316 | "314": "cockroach, roach",
317 | "315": "mantis, mantid",
318 | "316": "cicada, cicala",
319 | "317": "leafhopper",
320 | "318": "lacewing, lacewing fly",
321 | "319": "dragonfly, darning needle, devil's darning needle, sewing needle, snake feeder, snake doctor, mosquito hawk, skeeter hawk",
322 | "320": "damselfly",
323 | "321": "admiral",
324 | "322": "ringlet, ringlet butterfly",
325 | "323": "monarch, monarch butterfly, milkweed butterfly, Danaus plexippus",
326 | "324": "cabbage butterfly",
327 | "325": "sulphur butterfly, sulfur butterfly",
328 | "326": "lycaenid, lycaenid butterfly",
329 | "327": "starfish, sea star",
330 | "328": "sea urchin",
331 | "329": "sea cucumber, holothurian",
332 | "330": "wood rabbit, cottontail, cottontail rabbit",
333 | "331": "hare",
334 | "332": "Angora, Angora rabbit",
335 | "333": "hamster",
336 | "334": "porcupine, hedgehog",
337 | "335": "fox squirrel, eastern fox squirrel, Sciurus niger",
338 | "336": "marmot",
339 | "337": "beaver",
340 | "338": "guinea pig, Cavia cobaya",
341 | "339": "sorrel",
342 | "340": "zebra",
343 | "341": "hog, pig, grunter, squealer, Sus scrofa",
344 | "342": "wild boar, boar, Sus scrofa",
345 | "343": "warthog",
346 | "344": "hippopotamus, hippo, river horse, Hippopotamus amphibius",
347 | "345": "ox",
348 | "346": "water buffalo, water ox, Asiatic buffalo, Bubalus bubalis",
349 | "347": "bison",
350 | "348": "ram, tup",
351 | "349": "bighorn, bighorn sheep, cimarron, Rocky Mountain bighorn, Rocky Mountain sheep, Ovis canadensis",
352 | "350": "ibex, Capra ibex",
353 | "351": "hartebeest",
354 | "352": "impala, Aepyceros melampus",
355 | "353": "gazelle",
356 | "354": "Arabian camel, dromedary, Camelus dromedarius",
357 | "355": "llama",
358 | "356": "weasel",
359 | "357": "mink",
360 | "358": "polecat, fitch, foulmart, foumart, Mustela putorius",
361 | "359": "black-footed ferret, ferret, Mustela nigripes",
362 | "360": "otter",
363 | "361": "skunk, polecat, wood pussy",
364 | "362": "badger",
365 | "363": "armadillo",
366 | "364": "three-toed sloth, ai, Bradypus tridactylus",
367 | "365": "orangutan, orang, orangutang, Pongo pygmaeus",
368 | "366": "gorilla, Gorilla gorilla",
369 | "367": "chimpanzee, chimp, Pan troglodytes",
370 | "368": "gibbon, Hylobates lar",
371 | "369": "siamang, Hylobates syndactylus, Symphalangus syndactylus",
372 | "370": "guenon, guenon monkey",
373 | "371": "patas, hussar monkey, Erythrocebus patas",
374 | "372": "baboon",
375 | "373": "macaque",
376 | "374": "langur",
377 | "375": "colobus, colobus monkey",
378 | "376": "proboscis monkey, Nasalis larvatus",
379 | "377": "marmoset",
380 | "378": "capuchin, ringtail, Cebus capucinus",
381 | "379": "howler monkey, howler",
382 | "380": "titi, titi monkey",
383 | "381": "spider monkey, Ateles geoffroyi",
384 | "382": "squirrel monkey, Saimiri sciureus",
385 | "383": "Madagascar cat, ring-tailed lemur, Lemur catta",
386 | "384": "indri, indris, Indri indri, Indri brevicaudatus",
387 | "385": "Indian elephant, Elephas maximus",
388 | "386": "African elephant, Loxodonta africana",
389 | "387": "lesser panda, red panda, panda, bear cat, cat bear, Ailurus fulgens",
390 | "388": "giant panda, panda, panda bear, coon bear, Ailuropoda melanoleuca",
391 | "389": "barracouta, snoek",
392 | "390": "eel",
393 | "391": "coho, cohoe, coho salmon, blue jack, silver salmon, Oncorhynchus kisutch",
394 | "392": "rock beauty, Holocanthus tricolor",
395 | "393": "anemone fish",
396 | "394": "sturgeon",
397 | "395": "gar, garfish, garpike, billfish, Lepisosteus osseus",
398 | "396": "lionfish",
399 | "397": "puffer, pufferfish, blowfish, globefish",
400 | "398": "abacus",
401 | "399": "abaya",
402 | "400": "academic gown, academic robe, judge's robe",
403 | "401": "accordion, piano accordion, squeeze box",
404 | "402": "acoustic guitar",
405 | "403": "aircraft carrier, carrier, flattop, attack aircraft carrier",
406 | "404": "airliner",
407 | "405": "airship, dirigible",
408 | "406": "altar",
409 | "407": "ambulance",
410 | "408": "amphibian, amphibious vehicle",
411 | "409": "analog clock",
412 | "410": "apiary, bee house",
413 | "411": "apron",
414 | "412": "ashcan, trash can, garbage can, wastebin, ash bin, ash-bin, ashbin, dustbin, trash barrel, trash bin",
415 | "413": "assault rifle, assault gun",
416 | "414": "backpack, back pack, knapsack, packsack, rucksack, haversack",
417 | "415": "bakery, bakeshop, bakehouse",
418 | "416": "balance beam, beam",
419 | "417": "balloon",
420 | "418": "ballpoint, ballpoint pen, ballpen, Biro",
421 | "419": "Band Aid",
422 | "420": "banjo",
423 | "421": "bannister, banister, balustrade, balusters, handrail",
424 | "422": "barbell",
425 | "423": "barber chair",
426 | "424": "barbershop",
427 | "425": "barn",
428 | "426": "barometer",
429 | "427": "barrel, cask",
430 | "428": "barrow, garden cart, lawn cart, wheelbarrow",
431 | "429": "baseball",
432 | "430": "basketball",
433 | "431": "bassinet",
434 | "432": "bassoon",
435 | "433": "bathing cap, swimming cap",
436 | "434": "bath towel",
437 | "435": "bathtub, bathing tub, bath, tub",
438 | "436": "beach wagon, station wagon, wagon, estate car, beach waggon, station waggon, waggon",
439 | "437": "beacon, lighthouse, beacon light, pharos",
440 | "438": "beaker",
441 | "439": "bearskin, busby, shako",
442 | "440": "beer bottle",
443 | "441": "beer glass",
444 | "442": "bell cote, bell cot",
445 | "443": "bib",
446 | "444": "bicycle-built-for-two, tandem bicycle, tandem",
447 | "445": "bikini, two-piece",
448 | "446": "binder, ring-binder",
449 | "447": "binoculars, field glasses, opera glasses",
450 | "448": "birdhouse",
451 | "449": "boathouse",
452 | "450": "bobsled, bobsleigh, bob",
453 | "451": "bolo tie, bolo, bola tie, bola",
454 | "452": "bonnet, poke bonnet",
455 | "453": "bookcase",
456 | "454": "bookshop, bookstore, bookstall",
457 | "455": "bottlecap",
458 | "456": "bow",
459 | "457": "bow tie, bow-tie, bowtie",
460 | "458": "brass, memorial tablet, plaque",
461 | "459": "brassiere, bra, bandeau",
462 | "460": "breakwater, groin, groyne, mole, bulwark, seawall, jetty",
463 | "461": "breastplate, aegis, egis",
464 | "462": "broom",
465 | "463": "bucket, pail",
466 | "464": "buckle",
467 | "465": "bulletproof vest",
468 | "466": "bullet train, bullet",
469 | "467": "butcher shop, meat market",
470 | "468": "cab, hack, taxi, taxicab",
471 | "469": "caldron, cauldron",
472 | "470": "candle, taper, wax light",
473 | "471": "cannon",
474 | "472": "canoe",
475 | "473": "can opener, tin opener",
476 | "474": "cardigan",
477 | "475": "car mirror",
478 | "476": "carousel, carrousel, merry-go-round, roundabout, whirligig",
479 | "477": "carpenter's kit, tool kit",
480 | "478": "carton",
481 | "479": "car wheel",
482 | "480": "cash machine, cash dispenser, automated teller machine, automatic teller machine, automated teller, automatic teller, ATM",
483 | "481": "cassette",
484 | "482": "cassette player",
485 | "483": "castle",
486 | "484": "catamaran",
487 | "485": "CD player",
488 | "486": "cello, violoncello",
489 | "487": "cellular telephone, cellular phone, cellphone, cell, mobile phone",
490 | "488": "chain",
491 | "489": "chainlink fence",
492 | "490": "chain mail, ring mail, mail, chain armor, chain armour, ring armor, ring armour",
493 | "491": "chain saw, chainsaw",
494 | "492": "chest",
495 | "493": "chiffonier, commode",
496 | "494": "chime, bell, gong",
497 | "495": "china cabinet, china closet",
498 | "496": "Christmas stocking",
499 | "497": "church, church building",
500 | "498": "cinema, movie theater, movie theatre, movie house, picture palace",
501 | "499": "cleaver, meat cleaver, chopper",
502 | "500": "cliff dwelling",
503 | "501": "cloak",
504 | "502": "clog, geta, patten, sabot",
505 | "503": "cocktail shaker",
506 | "504": "coffee mug",
507 | "505": "coffeepot",
508 | "506": "coil, spiral, volute, whorl, helix",
509 | "507": "combination lock",
510 | "508": "computer keyboard, keypad",
511 | "509": "confectionery, confectionary, candy store",
512 | "510": "container ship, containership, container vessel",
513 | "511": "convertible",
514 | "512": "corkscrew, bottle screw",
515 | "513": "cornet, horn, trumpet, trump",
516 | "514": "cowboy boot",
517 | "515": "cowboy hat, ten-gallon hat",
518 | "516": "cradle",
519 | "517": "crane",
520 | "518": "crash helmet",
521 | "519": "crate",
522 | "520": "crib, cot",
523 | "521": "Crock Pot",
524 | "522": "croquet ball",
525 | "523": "crutch",
526 | "524": "cuirass",
527 | "525": "dam, dike, dyke",
528 | "526": "desk",
529 | "527": "desktop computer",
530 | "528": "dial telephone, dial phone",
531 | "529": "diaper, nappy, napkin",
532 | "530": "digital clock",
533 | "531": "digital watch",
534 | "532": "dining table, board",
535 | "533": "dishrag, dishcloth",
536 | "534": "dishwasher, dish washer, dishwashing machine",
537 | "535": "disk brake, disc brake",
538 | "536": "dock, dockage, docking facility",
539 | "537": "dogsled, dog sled, dog sleigh",
540 | "538": "dome",
541 | "539": "doormat, welcome mat",
542 | "540": "drilling platform, offshore rig",
543 | "541": "drum, membranophone, tympan",
544 | "542": "drumstick",
545 | "543": "dumbbell",
546 | "544": "Dutch oven",
547 | "545": "electric fan, blower",
548 | "546": "electric guitar",
549 | "547": "electric locomotive",
550 | "548": "entertainment center",
551 | "549": "envelope",
552 | "550": "espresso maker",
553 | "551": "face powder",
554 | "552": "feather boa, boa",
555 | "553": "file, file cabinet, filing cabinet",
556 | "554": "fireboat",
557 | "555": "fire engine, fire truck",
558 | "556": "fire screen, fireguard",
559 | "557": "flagpole, flagstaff",
560 | "558": "flute, transverse flute",
561 | "559": "folding chair",
562 | "560": "football helmet",
563 | "561": "forklift",
564 | "562": "fountain",
565 | "563": "fountain pen",
566 | "564": "four-poster",
567 | "565": "freight car",
568 | "566": "French horn, horn",
569 | "567": "frying pan, frypan, skillet",
570 | "568": "fur coat",
571 | "569": "garbage truck, dustcart",
572 | "570": "gasmask, respirator, gas helmet",
573 | "571": "gas pump, gasoline pump, petrol pump, island dispenser",
574 | "572": "goblet",
575 | "573": "go-kart",
576 | "574": "golf ball",
577 | "575": "golfcart, golf cart",
578 | "576": "gondola",
579 | "577": "gong, tam-tam",
580 | "578": "gown",
581 | "579": "grand piano, grand",
582 | "580": "greenhouse, nursery, glasshouse",
583 | "581": "grille, radiator grille",
584 | "582": "grocery store, grocery, food market, market",
585 | "583": "guillotine",
586 | "584": "hair slide",
587 | "585": "hair spray",
588 | "586": "half track",
589 | "587": "hammer",
590 | "588": "hamper",
591 | "589": "hand blower, blow dryer, blow drier, hair dryer, hair drier",
592 | "590": "hand-held computer, hand-held microcomputer",
593 | "591": "handkerchief, hankie, hanky, hankey",
594 | "592": "hard disc, hard disk, fixed disk",
595 | "593": "harmonica, mouth organ, harp, mouth harp",
596 | "594": "harp",
597 | "595": "harvester, reaper",
598 | "596": "hatchet",
599 | "597": "holster",
600 | "598": "home theater, home theatre",
601 | "599": "honeycomb",
602 | "600": "hook, claw",
603 | "601": "hoopskirt, crinoline",
604 | "602": "horizontal bar, high bar",
605 | "603": "horse cart, horse-cart",
606 | "604": "hourglass",
607 | "605": "iPod",
608 | "606": "iron, smoothing iron",
609 | "607": "jack-o'-lantern",
610 | "608": "jean, blue jean, denim",
611 | "609": "jeep, landrover",
612 | "610": "jersey, T-shirt, tee shirt",
613 | "611": "jigsaw puzzle",
614 | "612": "jinrikisha, ricksha, rickshaw",
615 | "613": "joystick",
616 | "614": "kimono",
617 | "615": "knee pad",
618 | "616": "knot",
619 | "617": "lab coat, laboratory coat",
620 | "618": "ladle",
621 | "619": "lampshade, lamp shade",
622 | "620": "laptop, laptop computer",
623 | "621": "lawn mower, mower",
624 | "622": "lens cap, lens cover",
625 | "623": "letter opener, paper knife, paperknife",
626 | "624": "library",
627 | "625": "lifeboat",
628 | "626": "lighter, light, igniter, ignitor",
629 | "627": "limousine, limo",
630 | "628": "liner, ocean liner",
631 | "629": "lipstick, lip rouge",
632 | "630": "Loafer",
633 | "631": "lotion",
634 | "632": "loudspeaker, speaker, speaker unit, loudspeaker system, speaker system",
635 | "633": "loupe, jeweler's loupe",
636 | "634": "lumbermill, sawmill",
637 | "635": "magnetic compass",
638 | "636": "mailbag, postbag",
639 | "637": "mailbox, letter box",
640 | "638": "maillot",
641 | "639": "maillot, tank suit",
642 | "640": "manhole cover",
643 | "641": "maraca",
644 | "642": "marimba, xylophone",
645 | "643": "mask",
646 | "644": "matchstick",
647 | "645": "maypole",
648 | "646": "maze, labyrinth",
649 | "647": "measuring cup",
650 | "648": "medicine chest, medicine cabinet",
651 | "649": "megalith, megalithic structure",
652 | "650": "microphone, mike",
653 | "651": "microwave, microwave oven",
654 | "652": "military uniform",
655 | "653": "milk can",
656 | "654": "minibus",
657 | "655": "miniskirt, mini",
658 | "656": "minivan",
659 | "657": "missile",
660 | "658": "mitten",
661 | "659": "mixing bowl",
662 | "660": "mobile home, manufactured home",
663 | "661": "Model T",
664 | "662": "modem",
665 | "663": "monastery",
666 | "664": "monitor",
667 | "665": "moped",
668 | "666": "mortar",
669 | "667": "mortarboard",
670 | "668": "mosque",
671 | "669": "mosquito net",
672 | "670": "motor scooter, scooter",
673 | "671": "mountain bike, all-terrain bike, off-roader",
674 | "672": "mountain tent",
675 | "673": "mouse, computer mouse",
676 | "674": "mousetrap",
677 | "675": "moving van",
678 | "676": "muzzle",
679 | "677": "nail",
680 | "678": "neck brace",
681 | "679": "necklace",
682 | "680": "nipple",
683 | "681": "notebook, notebook computer",
684 | "682": "obelisk",
685 | "683": "oboe, hautboy, hautbois",
686 | "684": "ocarina, sweet potato",
687 | "685": "odometer, hodometer, mileometer, milometer",
688 | "686": "oil filter",
689 | "687": "organ, pipe organ",
690 | "688": "oscilloscope, scope, cathode-ray oscilloscope, CRO",
691 | "689": "overskirt",
692 | "690": "oxcart",
693 | "691": "oxygen mask",
694 | "692": "packet",
695 | "693": "paddle, boat paddle",
696 | "694": "paddlewheel, paddle wheel",
697 | "695": "padlock",
698 | "696": "paintbrush",
699 | "697": "pajama, pyjama, pj's, jammies",
700 | "698": "palace",
701 | "699": "panpipe, pandean pipe, syrinx",
702 | "700": "paper towel",
703 | "701": "parachute, chute",
704 | "702": "parallel bars, bars",
705 | "703": "park bench",
706 | "704": "parking meter",
707 | "705": "passenger car, coach, carriage",
708 | "706": "patio, terrace",
709 | "707": "pay-phone, pay-station",
710 | "708": "pedestal, plinth, footstall",
711 | "709": "pencil box, pencil case",
712 | "710": "pencil sharpener",
713 | "711": "perfume, essence",
714 | "712": "Petri dish",
715 | "713": "photocopier",
716 | "714": "pick, plectrum, plectron",
717 | "715": "pickelhaube",
718 | "716": "picket fence, paling",
719 | "717": "pickup, pickup truck",
720 | "718": "pier",
721 | "719": "piggy bank, penny bank",
722 | "720": "pill bottle",
723 | "721": "pillow",
724 | "722": "ping-pong ball",
725 | "723": "pinwheel",
726 | "724": "pirate, pirate ship",
727 | "725": "pitcher, ewer",
728 | "726": "plane, carpenter's plane, woodworking plane",
729 | "727": "planetarium",
730 | "728": "plastic bag",
731 | "729": "plate rack",
732 | "730": "plow, plough",
733 | "731": "plunger, plumber's helper",
734 | "732": "Polaroid camera, Polaroid Land camera",
735 | "733": "pole",
736 | "734": "police van, police wagon, paddy wagon, patrol wagon, wagon, black Maria",
737 | "735": "poncho",
738 | "736": "pool table, billiard table, snooker table",
739 | "737": "pop bottle, soda bottle",
740 | "738": "pot, flowerpot",
741 | "739": "potter's wheel",
742 | "740": "power drill",
743 | "741": "prayer rug, prayer mat",
744 | "742": "printer",
745 | "743": "prison, prison house",
746 | "744": "projectile, missile",
747 | "745": "projector",
748 | "746": "puck, hockey puck",
749 | "747": "punching bag, punch bag, punching ball, punchball",
750 | "748": "purse",
751 | "749": "quill, quill pen",
752 | "750": "quilt, comforter, comfort, puff",
753 | "751": "racer, race car, racing car",
754 | "752": "racket, racquet",
755 | "753": "radiator",
756 | "754": "radio, wireless",
757 | "755": "radio telescope, radio reflector",
758 | "756": "rain barrel",
759 | "757": "recreational vehicle, RV, R.V.",
760 | "758": "reel",
761 | "759": "reflex camera",
762 | "760": "refrigerator, icebox",
763 | "761": "remote control, remote",
764 | "762": "restaurant, eating house, eating place, eatery",
765 | "763": "revolver, six-gun, six-shooter",
766 | "764": "rifle",
767 | "765": "rocking chair, rocker",
768 | "766": "rotisserie",
769 | "767": "rubber eraser, rubber, pencil eraser",
770 | "768": "rugby ball",
771 | "769": "rule, ruler",
772 | "770": "running shoe",
773 | "771": "safe",
774 | "772": "safety pin",
775 | "773": "saltshaker, salt shaker",
776 | "774": "sandal",
777 | "775": "sarong",
778 | "776": "sax, saxophone",
779 | "777": "scabbard",
780 | "778": "scale, weighing machine",
781 | "779": "school bus",
782 | "780": "schooner",
783 | "781": "scoreboard",
784 | "782": "screen, CRT screen",
785 | "783": "screw",
786 | "784": "screwdriver",
787 | "785": "seat belt, seatbelt",
788 | "786": "sewing machine",
789 | "787": "shield, buckler",
790 | "788": "shoe shop, shoe-shop, shoe store",
791 | "789": "shoji",
792 | "790": "shopping basket",
793 | "791": "shopping cart",
794 | "792": "shovel",
795 | "793": "shower cap",
796 | "794": "shower curtain",
797 | "795": "ski",
798 | "796": "ski mask",
799 | "797": "sleeping bag",
800 | "798": "slide rule, slipstick",
801 | "799": "sliding door",
802 | "800": "slot, one-armed bandit",
803 | "801": "snorkel",
804 | "802": "snowmobile",
805 | "803": "snowplow, snowplough",
806 | "804": "soap dispenser",
807 | "805": "soccer ball",
808 | "806": "sock",
809 | "807": "solar dish, solar collector, solar furnace",
810 | "808": "sombrero",
811 | "809": "soup bowl",
812 | "810": "space bar",
813 | "811": "space heater",
814 | "812": "space shuttle",
815 | "813": "spatula",
816 | "814": "speedboat",
817 | "815": "spider web, spider's web",
818 | "816": "spindle",
819 | "817": "sports car, sport car",
820 | "818": "spotlight, spot",
821 | "819": "stage",
822 | "820": "steam locomotive",
823 | "821": "steel arch bridge",
824 | "822": "steel drum",
825 | "823": "stethoscope",
826 | "824": "stole",
827 | "825": "stone wall",
828 | "826": "stopwatch, stop watch",
829 | "827": "stove",
830 | "828": "strainer",
831 | "829": "streetcar, tram, tramcar, trolley, trolley car",
832 | "830": "stretcher",
833 | "831": "studio couch, day bed",
834 | "832": "stupa, tope",
835 | "833": "submarine, pigboat, sub, U-boat",
836 | "834": "suit, suit of clothes",
837 | "835": "sundial",
838 | "836": "sunglass",
839 | "837": "sunglasses, dark glasses, shades",
840 | "838": "sunscreen, sunblock, sun blocker",
841 | "839": "suspension bridge",
842 | "840": "swab, swob, mop",
843 | "841": "sweatshirt",
844 | "842": "swimming trunks, bathing trunks",
845 | "843": "swing",
846 | "844": "switch, electric switch, electrical switch",
847 | "845": "syringe",
848 | "846": "table lamp",
849 | "847": "tank, army tank, armored combat vehicle, armoured combat vehicle",
850 | "848": "tape player",
851 | "849": "teapot",
852 | "850": "teddy, teddy bear",
853 | "851": "television, television system",
854 | "852": "tennis ball",
855 | "853": "thatch, thatched roof",
856 | "854": "theater curtain, theatre curtain",
857 | "855": "thimble",
858 | "856": "thresher, thrasher, threshing machine",
859 | "857": "throne",
860 | "858": "tile roof",
861 | "859": "toaster",
862 | "860": "tobacco shop, tobacconist shop, tobacconist",
863 | "861": "toilet seat",
864 | "862": "torch",
865 | "863": "totem pole",
866 | "864": "tow truck, tow car, wrecker",
867 | "865": "toyshop",
868 | "866": "tractor",
869 | "867": "trailer truck, tractor trailer, trucking rig, rig, articulated lorry, semi",
870 | "868": "tray",
871 | "869": "trench coat",
872 | "870": "tricycle, trike, velocipede",
873 | "871": "trimaran",
874 | "872": "tripod",
875 | "873": "triumphal arch",
876 | "874": "trolleybus, trolley coach, trackless trolley",
877 | "875": "trombone",
878 | "876": "tub, vat",
879 | "877": "turnstile",
880 | "878": "typewriter keyboard",
881 | "879": "umbrella",
882 | "880": "unicycle, monocycle",
883 | "881": "upright, upright piano",
884 | "882": "vacuum, vacuum cleaner",
885 | "883": "vase",
886 | "884": "vault",
887 | "885": "velvet",
888 | "886": "vending machine",
889 | "887": "vestment",
890 | "888": "viaduct",
891 | "889": "violin, fiddle",
892 | "890": "volleyball",
893 | "891": "waffle iron",
894 | "892": "wall clock",
895 | "893": "wallet, billfold, notecase, pocketbook",
896 | "894": "wardrobe, closet, press",
897 | "895": "warplane, military plane",
898 | "896": "washbasin, handbasin, washbowl, lavabo, wash-hand basin",
899 | "897": "washer, automatic washer, washing machine",
900 | "898": "water bottle",
901 | "899": "water jug",
902 | "900": "water tower",
903 | "901": "whiskey jug",
904 | "902": "whistle",
905 | "903": "wig",
906 | "904": "window screen",
907 | "905": "window shade",
908 | "906": "Windsor tie",
909 | "907": "wine bottle",
910 | "908": "wing",
911 | "909": "wok",
912 | "910": "wooden spoon",
913 | "911": "wool, woolen, woollen",
914 | "912": "worm fence, snake fence, snake-rail fence, Virginia fence",
915 | "913": "wreck",
916 | "914": "yawl",
917 | "915": "yurt",
918 | "916": "web site, website, internet site, site",
919 | "917": "comic book",
920 | "918": "crossword puzzle, crossword",
921 | "919": "street sign",
922 | "920": "traffic light, traffic signal, stoplight",
923 | "921": "book jacket, dust cover, dust jacket, dust wrapper",
924 | "922": "menu",
925 | "923": "plate",
926 | "924": "guacamole",
927 | "925": "consomme",
928 | "926": "hot pot, hotpot",
929 | "927": "trifle",
930 | "928": "ice cream, icecream",
931 | "929": "ice lolly, lolly, lollipop, popsicle",
932 | "930": "French loaf",
933 | "931": "bagel, beigel",
934 | "932": "pretzel",
935 | "933": "cheeseburger",
936 | "934": "hotdog, hot dog, red hot",
937 | "935": "mashed potato",
938 | "936": "head cabbage",
939 | "937": "broccoli",
940 | "938": "cauliflower",
941 | "939": "zucchini, courgette",
942 | "940": "spaghetti squash",
943 | "941": "acorn squash",
944 | "942": "butternut squash",
945 | "943": "cucumber, cuke",
946 | "944": "artichoke, globe artichoke",
947 | "945": "bell pepper",
948 | "946": "cardoon",
949 | "947": "mushroom",
950 | "948": "Granny Smith",
951 | "949": "strawberry",
952 | "950": "orange",
953 | "951": "lemon",
954 | "952": "fig",
955 | "953": "pineapple, ananas",
956 | "954": "banana",
957 | "955": "jackfruit, jak, jack",
958 | "956": "custard apple",
959 | "957": "pomegranate",
960 | "958": "hay",
961 | "959": "carbonara",
962 | "960": "chocolate sauce, chocolate syrup",
963 | "961": "dough",
964 | "962": "meat loaf, meatloaf",
965 | "963": "pizza, pizza pie",
966 | "964": "potpie",
967 | "965": "burrito",
968 | "966": "red wine",
969 | "967": "espresso",
970 | "968": "cup",
971 | "969": "eggnog",
972 | "970": "alp",
973 | "971": "bubble",
974 | "972": "cliff, drop, drop-off",
975 | "973": "coral reef",
976 | "974": "geyser",
977 | "975": "lakeside, lakeshore",
978 | "976": "promontory, headland, head, foreland",
979 | "977": "sandbar, sand bar",
980 | "978": "seashore, coast, seacoast, sea-coast",
981 | "979": "valley, vale",
982 | "980": "volcano",
983 | "981": "ballplayer, baseball player",
984 | "982": "groom, bridegroom",
985 | "983": "scuba diver",
986 | "984": "rapeseed",
987 | "985": "daisy",
988 | "986": "yellow lady's slipper, yellow lady-slipper, Cypripedium calceolus, Cypripedium parviflorum",
989 | "987": "corn",
990 | "988": "acorn",
991 | "989": "hip, rose hip, rosehip",
992 | "990": "buckeye, horse chestnut, conker",
993 | "991": "coral fungus",
994 | "992": "agaric",
995 | "993": "gyromitra",
996 | "994": "stinkhorn, carrion fungus",
997 | "995": "earthstar",
998 | "996": "hen-of-the-woods, hen of the woods, Polyporus frondosus, Grifola frondosa",
999 | "997": "bolete",
1000 | "998": "ear, spike, capitulum",
1001 | "999": "toilet tissue, toilet paper, bathroom tissue"
1002 | }
--------------------------------------------------------------------------------
/ImageClassifier/ImageClassifier.licenseheader:
--------------------------------------------------------------------------------
1 | extensions: designer.cs generated.cs
2 | extensions: .cs
3 | // Licensed to the .NET Foundation under one or more agreements.
4 | // The .NET Foundation licenses this file to you under the MIT license.
5 | // See the LICENSE file in the project root for more information.
6 |
--------------------------------------------------------------------------------
/ImageClassifier/IntelligentAPI_ImageClassifier.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 | IntelligentAPI.ImageClassification
4 |
5 |
6 | CommunityToolkit.Labs.Intelligent.ImageClassification
7 |
8 | This package performs Image Classification on an input image by using the SqueezeNet Onnx model.
9 |
10 | 0.0.25
11 |
12 |
13 |
14 |
15 |
16 |
17 | 5.0.2
18 |
19 |
20 |
21 |
22 |
23 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
--------------------------------------------------------------------------------
/ImageClassifier/Properties/AssemblyInfo.cs:
--------------------------------------------------------------------------------
1 | // Licensed to the .NET Foundation under one or more agreements.
2 | // The .NET Foundation licenses this file to you under the MIT license.
3 | // See the LICENSE file in the project root for more information.
4 |
5 | using System.Reflection;
6 | using System.Runtime.CompilerServices;
7 | using System.Runtime.InteropServices;
8 |
9 | // General Information about an assembly is controlled through the following
10 | // set of attributes. Change these attribute values to modify the information
11 | // associated with an assembly.
12 | [assembly: AssemblyTrademark("")]
13 | [assembly: AssemblyCulture("")]
14 |
15 | // Version information for an assembly consists of the following four values:
16 | //
17 | // Major Version
18 | // Minor Version
19 | // Build Number
20 | // Revision
21 | //
22 | // You can specify all the values or you can default the Build and Revision Numbers
23 | // by using the '*' as shown below:
24 | // [assembly: AssemblyVersion("1.0.*")]
25 | [assembly: ComVisible(false)]
--------------------------------------------------------------------------------
/ImageClassifier/Properties/IntelligentAPI_ImageClassifier.rd.xml:
--------------------------------------------------------------------------------
1 |
2 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
--------------------------------------------------------------------------------
/ImageClassifier/Scripts/script.ps1:
--------------------------------------------------------------------------------
1 | $ProgressPreference = 'SilentlyContinue'
2 |
3 | $squeezenetfile = "./Assets/model.onnx"
4 | if (-not(Test-Path -Path $squeezenetfile -PathType Leaf)) {
5 | try {
6 | Invoke-WebRequest -URI "https://github.com/microsoft/Windows-Machine-Learning/raw/master/Samples/SqueezeNetObjectDetection/UWP/cs/Assets/model.onnx" -OutFile $squeezenetfile
7 | Write-Host "The file [$squeezenetfile] has been created."
8 | }
9 | catch {
10 | throw $_.Exception.Message
11 | }
12 | }
13 | else {
14 | Write-Host "The file [$squeezenetfile] exists."
15 | }
--------------------------------------------------------------------------------
/ImageClassifier/SqueezeNetImageClassifier.cs:
--------------------------------------------------------------------------------
1 | // Licensed to the .NET Foundation under one or more agreements.
2 | // The .NET Foundation licenses this file to you under the MIT license.
3 | // See the LICENSE file in the project root for more information.
4 |
5 | using System;
6 | using System.Collections.Generic;
7 | using System.IO;
8 | using System.Linq;
9 | using System.Reflection;
10 | using System.Text;
11 | using System.Threading.Tasks;
12 | using Windows.AI.MachineLearning;
13 | using Windows.Graphics.Imaging;
14 | using Windows.Media;
15 | using Windows.Storage;
16 | using Windows.Storage.Streams;
17 | using Windows.UI.Xaml.Media.Imaging;
18 | using System.Text.Json;
19 |
20 |
21 | namespace CommunityToolkit.Labs.Intelligent.ImageClassification
22 | {
23 | ///
24 | /// SqueezeNetImageClassifier is used to perform image classification using the SqueezeNet model.
25 | ///
26 | public class SqueezeNetImageClassifier
27 | {
28 | ///
29 | /// Model file name
30 | ///
31 | private const string _modelFileName = "model.onnx";
32 |
33 | ///
34 | /// Labels file name
35 | ///
36 | private const string _labelsFileName = "Labels.json";
37 |
38 | ///
39 | /// Learning model instance
40 | ///
41 | private LearningModel _model = null;
42 |
43 | ///
44 | /// LearningModelSession instance
45 | ///
46 | private LearningModelSession _session;
47 |
48 | ///
49 | /// list of labels that YOLOv4 can detect
50 | ///
51 | private List _labels = new List();
52 |
53 | ///
54 | /// Number of runs
55 | ///
56 | private int _runCount = 0;
57 | private static SqueezeNetImageClassifier instance;
58 |
59 | private SqueezeNetImageClassifier()
60 | {
61 | }
62 |
63 | ///
64 | /// Classifies image based on StorageFile input
65 | ///
66 | ///
67 | /// Top k results, accepts positive values up to 1000
68 | ///
69 | public static async Task> ClassifyImage(StorageFile selectedStorageFile, uint top=3)
70 | {
71 | CreateInstanceIfNone();
72 | SoftwareBitmap softwareBitmap = await GenerateSoftwareBitmapFromStorageFile(selectedStorageFile);
73 | VideoFrame videoFrame = GenerateVideoFrameFromBitmap(softwareBitmap);
74 | return await instance.EvaluateModel(videoFrame, top);
75 | }
76 |
77 | ///
78 | /// Classifies image based on SoftwareBitmap input
79 | ///
80 | ///
81 | /// Top k results, accepts positive values up to 1000
82 | ///
83 | public static async Task> ClassifyImage(SoftwareBitmap softwareBitmap, uint top=3)
84 | {
85 | CreateInstanceIfNone();
86 | softwareBitmap = GetSoftwareBitmap(softwareBitmap);
87 | VideoFrame videoFrame = GenerateVideoFrameFromBitmap(softwareBitmap);
88 | return await instance.EvaluateModel(videoFrame, top);
89 | }
90 |
91 | ///
92 | /// Classifies image based on VideoFrame input
93 | ///
94 | ///
95 | /// Top k results, accepts positive values up to 1000
96 | ///
97 | public static async Task> ClassifyImage(VideoFrame videoFrame, uint top=3)
98 | {
99 | CreateInstanceIfNone();
100 | return await instance.EvaluateModel(videoFrame, top);
101 | }
102 |
103 |
104 | ///
105 | /// Creates a new instance of SqueezeNetImageClassifier if it does not exist
106 | ///
107 | private static void CreateInstanceIfNone()
108 | {
109 | if (instance == null)
110 | {
111 | instance = new SqueezeNetImageClassifier();
112 | }
113 | }
114 |
115 | ///
116 | /// Evaluates the input image which is a VideoFrame instance
117 | ///
118 | ///
119 | ///
120 | ///
121 | public async Task> EvaluateModel(VideoFrame inputImage, uint top)
122 | {
123 | await LoadModelAsync();
124 | return await EvaluateVideoFrameAsync(inputImage, top);
125 | }
126 |
127 | ///
128 | /// Converts object of type SoftwareBitmap to VideoFrame
129 | ///
130 | ///
131 | ///
132 | private static VideoFrame GenerateVideoFrameFromBitmap(SoftwareBitmap softwareBitmap)
133 | {
134 | // Encapsulate the image within a VideoFrame to be bound and evaluated
135 | VideoFrame videoFrame = VideoFrame.CreateWithSoftwareBitmap(softwareBitmap);
136 | return videoFrame;
137 | }
138 |
139 |
140 | ///
141 | /// Converts object of type StorageFile to SoftwareBitmap
142 | ///
143 | ///
144 | ///
145 | private static async Task GenerateSoftwareBitmapFromStorageFile(StorageFile selectedStorageFile)
146 | {
147 | SoftwareBitmap softwareBitmap;
148 | using (IRandomAccessStream stream = await selectedStorageFile.OpenAsync(FileAccessMode.Read))
149 | {
150 | // Create the decoder from the stream
151 | BitmapDecoder decoder = await BitmapDecoder.CreateAsync(stream);
152 |
153 | // Get the SoftwareBitmap representation of the file in BGRA8 format
154 | softwareBitmap = await decoder.GetSoftwareBitmapAsync();
155 | softwareBitmap = GetSoftwareBitmap(softwareBitmap);
156 | }
157 |
158 | return softwareBitmap;
159 | }
160 |
161 |
162 |
163 | ///
164 | /// Get Software Bitmap
165 | ///
166 | ///
167 | ///
168 | private static SoftwareBitmap GetSoftwareBitmap(SoftwareBitmap softwareBitmap)
169 | {
170 | if (softwareBitmap.BitmapPixelFormat != BitmapPixelFormat.Bgra8 || (softwareBitmap.BitmapAlphaMode != BitmapAlphaMode.Ignore && softwareBitmap.BitmapAlphaMode != BitmapAlphaMode.Premultiplied))
171 | {
172 | softwareBitmap = SoftwareBitmap.Convert(softwareBitmap, BitmapPixelFormat.Bgra8, BitmapAlphaMode.Premultiplied);
173 | }
174 | return softwareBitmap;
175 | }
176 |
177 |
178 | ///
179 | /// Loads an onnx model from file and deserializes the JSON file containing the labels
180 | ///
181 | ///
182 | private async Task LoadModelAsync()
183 | {
184 | // just load the model one time.
185 | if (_model != null) return;
186 |
187 | try
188 | {
189 | // Parse labels from label json file. We know the file's
190 | // entries are already sorted in order.
191 | var file = await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///IntelligentAPI_ImageClassifier/Assets/" + _labelsFileName));
192 |
193 | var fileString = await FileIO.ReadTextAsync(file);
194 |
195 | var fileDict = JsonSerializer.Deserialize>(fileString);
196 |
197 | foreach (var kvp in fileDict)
198 | {
199 | _labels.Add(kvp.Value);
200 | }
201 |
202 |
203 | var modelFile = await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///IntelligentAPI_ImageClassifier/Assets/" + _modelFileName));
204 | _model = await LearningModel.LoadFromStorageFileAsync(modelFile);
205 |
206 | // Create the evaluation session with the model and device
207 | _session = new LearningModelSession(_model, new LearningModelDevice(GetDeviceKind()));
208 |
209 |
210 | }
211 | catch (Exception ex)
212 | {
213 | _model = null;
214 | throw ex;
215 | }
216 | }
217 |
218 | ///
219 | /// Gets type of device to evaluate the model on
220 | ///
221 | ///
222 | LearningModelDeviceKind GetDeviceKind()
223 | {
224 |
225 | return LearningModelDeviceKind.Default;
226 | }
227 |
228 | ///
229 | /// Evaluate the SqueezeNet model
230 | ///
231 | ///
232 | ///
233 | ///
234 | private async Task> EvaluateVideoFrameAsync(VideoFrame inputFrame, uint top)
235 | {
236 | List result = new List();
237 | if (inputFrame != null)
238 | {
239 | try
240 | {
241 | // create a binding object from the session
242 | LearningModelBinding binding = new LearningModelBinding(_session);
243 |
244 | // bind the input image
245 | ImageFeatureValue imageTensor = ImageFeatureValue.CreateFromVideoFrame(inputFrame);
246 | binding.Bind("data_0", imageTensor);
247 |
248 | // Process the frame with the model
249 | var results = await _session.EvaluateAsync(binding, $"Run { ++_runCount } ");
250 |
251 | // retrieve results from evaluation
252 | var resultTensor = results.Outputs["softmaxout_1"] as TensorFloat;
253 | var resultVector = resultTensor.GetAsVectorView();
254 |
255 | // Find the top 3 probabilities
256 | List<(int index, float probability)> indexedResults = new List<(int, float)>();
257 | for (int i = 0; i < resultVector.Count; i++)
258 | {
259 | indexedResults.Add((index: i, probability: resultVector.ElementAt(i)));
260 | }
261 | indexedResults.Sort((a, b) =>
262 | {
263 | if (a.probability < b.probability)
264 | {
265 | return 1;
266 | }
267 | else if (a.probability > b.probability)
268 | {
269 | return -1;
270 | }
271 | else
272 | {
273 | return 0;
274 | }
275 | });
276 |
277 | if(top < 0 || top > 1000)
278 | {
279 | throw new ArgumentOutOfRangeException("top", "Value is out of range, expected to be between 0 and 1000");
280 | }
281 | for (int i = 0; i < top; i++)
282 | {
283 | result.Add(new ClassificationResult(_labels[indexedResults[i].index], indexedResults[i].probability));
284 | }
285 |
286 |
287 | }
288 | catch (Exception ex)
289 | {
290 | throw ex;
291 | }
292 |
293 | }
294 |
295 | return result;
296 | }
297 | }
298 |
299 | ///
300 | /// Result of Image Classification model evaluation.
301 | ///
302 | public class ClassificationResult
303 | {
304 | ///
305 | /// Category that the image belongs to
306 | ///
307 | public string category;
308 |
309 | ///
310 | /// Confidence value of the predicted category.
311 | ///
312 | public float confidence;
313 | public ClassificationResult(string category, float confidence)
314 | {
315 | this.category = category;
316 | this.confidence = confidence;
317 | }
318 | }
319 |
320 | }
321 |
322 |
323 |
324 |
325 |
326 |
--------------------------------------------------------------------------------
/ImageClassifier/model.cs:
--------------------------------------------------------------------------------
1 | // Licensed to the .NET Foundation under one or more agreements.
2 | // The .NET Foundation licenses this file to you under the MIT license.
3 | // See the LICENSE file in the project root for more information.
4 |
5 | // This file was automatically generated by VS extension Windows Machine Learning Code Generator v3
6 | // from model file model.onnx
7 | // Warning: This file may get overwritten if you add add an onnx file with the same name
8 | using System;
9 | using System.Collections.Generic;
10 | using System.Threading.Tasks;
11 | using Windows.Media;
12 | using Windows.Storage;
13 | using Windows.Storage.Streams;
14 | using Windows.AI.MachineLearning;
15 |
16 | namespace CommunityToolkit.Labs.Intelligent.ImageClassification
17 | {
18 | ///
19 | /// Input for the SqueezeNet model
20 | ///
21 | public sealed class Input
22 | {
23 | public TensorFloat data_0; // shape(1,3,224,224)
24 | }
25 |
26 | ///
27 | /// Output of the SqueezeNet model
28 | ///
29 | public sealed class Output
30 | {
31 | public TensorFloat softmaxout_1; // shape(1,1000,1,1)
32 | }
33 |
34 | ///
35 | /// SqueezeNet Model
36 | ///
37 | public sealed class Model
38 | {
39 | ///
40 | /// LearningModel instance for the trained SqueezeNet model
41 | ///
42 | private LearningModel model;
43 |
44 | ///
45 | /// LearningModelSession instance that will be used to evaluate the model
46 | ///
47 | private LearningModelSession session;
48 |
49 | ///
50 | /// Bindings that will bind values to named input and output features.
51 | ///
52 | private LearningModelBinding binding;
53 |
54 | ///
55 | /// Loads the model, creates a session and binding instance.
56 | ///
57 | ///
58 | ///
59 | public static async Task CreateFromStreamAsync(IRandomAccessStreamReference stream)
60 | {
61 | Model learningModel = new Model();
62 | learningModel.model = await LearningModel.LoadFromStreamAsync(stream);
63 | learningModel.session = new LearningModelSession(learningModel.model);
64 | learningModel.binding = new LearningModelBinding(learningModel.session);
65 | return learningModel;
66 | }
67 |
68 | ///
69 | /// Asynchronously evaluate SqueezeNet model
70 | ///
71 | ///
72 | ///
73 | public async Task