随着云托管解决方案的兴起被用作服务模型,组织的目标是购买其现代应用程序的订阅,以支持客户和用户的高端需求。其目的是,他们可以忽略与此类服务相关的管理,开发和运营成本。Azure Cognitive Services就是这样一种服务,它为机器学习(ML)提供最先进的解决方案,使开发人员能够快速将智能组件添加到他们的应用程序中。在本文中,我将演示如何在基于.NET Core的应用程序中集成Cognitive Services SDK,并探索如何使用Microsoft提供的ML服务解决实际场景。
认知服务作为PaaS组件提供,您可以使用它们编写自己的应用程序。认知服务包括一个Emotion API,可用于检测图像中人物的情绪,并用一些已知的情绪标记它,如快乐,悲伤,愤怒等。认知服务是由Microsoft培训的一组ML / AI模型。Azure使用这些ML模型处理您的输入,然后返回带有情绪的响应以及对该情绪的置信度。信心表明认知服务对结果的准确程度。因此,您可以利用Microsoft在Azure Cognitive Services中培训和发布的模型,而不是培训和发布您自己的ML模型。
目前,此服务已合并到Face API中,并且还将针对Face API更新SDK以支持情感检测。我将使用Face API来检测照片中的情感,并将演示如何扩展SDK本身以编写自己的帮助函数来解析响应并生成UI。
设置环境
我假设您已经拥有Azure订阅,并且您已经安装并配置了.NET Core以及Xamarin(如果您还要探索Android示例)。在Azure门户上,您将搜索“Face”,并在AI类别下选择Microsoft的“Face”解决方案。在“创建”选项卡上,输入名称,然后选择订阅和定价层。由于我们仅测试您可以选择任何位置(出于生产目的,请阅读结论部分)。此外,对于资源组,将其命名为“Emotion-Detection-RG”。
您还可以将Docker容器用于Azure Cognitive Services,并自行托管这些实例。为了快速入门,我建议使用Azure作为托管服务,而不是Docker替代方案。
与.NET Core集成
首先,我将演示如何在常见的.NET Core应用程序中使用Face API SDK。这将帮助您继续使用Xamarin应用程序并在其中集成SDK。
通过终端或使用您喜欢的IDE创建新的.NET Core应用程序。
接下来,将NuGet包“ Microsoft.Azure.CognitiveServices.Vision.Face ” 安装到项目中。例如,您可以在NuGet包管理器控制台中使用以下命令:
PM> Install-Package Microsoft.Azure.CognitiveServices.Vision.Face -Version 2.2.0-preview
对于这部分,我将使用离线图像文件并检测该图片中的情绪。要使用的代码非常简单:
static async Task detectEmotion(string filepath) { using (var client = new FaceClient( new ApiKeyServiceClientCredentials("<your-face-api-key-here>"), new System.Net.Http.DelegatingHandler[] { })) { client.Endpoint = faceEndpoint; using (var filestream = File.OpenRead(filepath)) { var detectionResult = await client.Face.DetectWithStreamAsync(filestream, returnFaceId: true, returnFaceAttributes: emotionAttribute, returnFaceLandmarks: true); foreach (var face in detectionResult) { Console.WriteLine(JsonConvert.SerializeObject(face.FaceAttributes.Emotion)); var highestEmotion = getEmotion(face.FaceAttributes.Emotion); Console.WriteLine($"This face has emotional traits of {highestEmotion.Emotion} ({highestEmotion.Value} confidence)."); } } } }
在此代码中,我传入文件路径,程序读取文件并将文件作为流发送到Azure,在Azure中进行处理和分析。请注意,这些对象中的大多数都是.NET Core本机类型,并支持本机.NET Framework功能,例如async / await。
我把变量faceEndpoint和emotionAttribute变量放在一边,因为它们在代码中是可访问的并且非常不言自明。
由于SDK没有提供内置方法来知道哪种情绪最高,我编写了一个辅助函数来检测最高情绪的值:
static (string Emotion, double Value) getEmotion(Emotion emotion) { var emotionProperties = emotion.GetType().GetProperties(); (string Emotion, double Value) highestEmotion = ("Anger", emotion.Anger); foreach (var e in emotionProperties) { if (((double)e.GetValue(emotion, null)) > highestEmotion.Value) { highestEmotion.Emotion = e.Name; highestEmotion.Value = (double)e.GetValue(emotion, null); } } return highestEmotion; }
在这段代码中,我使用C#元组来返回最大情绪和与之相关的置信度值。利用反射(因为JSON响应现在是运行时对象的形式),我正在读取情感值列表并捕获这些值的最大值。然后使用此最大值来呈现输出。我稍后也会在Xamarin应用程序中使用此功能。
main函数内的代码只调用此函数并等待键输入继续,如下所示:
现在,让我们将此模块添加到Xamarin应用程序中,以检测捕获的照片的情绪。
将Emotion功能添加到原生Xamarin应用程序
在Xamarin.Forms应用程序中,我刚刚创建了一个允许用户捕获图片的页面。Xam.Plugin.Media是一个开源中间件,支持跨平台相机捕获功能。您可以按照此GitHub指南将该软件包集成到您自己的Xamarin应用程序中。
集成后,您需要做的就是:
- 从.NET Core应用程序复制代码以进行Face API集成。
- 编写代码以捕获图像并将其转发到Face API对象以检测情绪。
为了保持简单,并保持一定的单一责任,我创建了一个单独的类来为我做这件事。代码就像上面分享的那样,所以我们不会再添加该代码。现在在主页面中,这是捕获图像然后将其转发到Azure进行分析的代码:
private async Task captureBtn_Clicked(object sender, EventArgs e) { if (await CrossMedia.Current.Initialize()) { if (CrossMedia.Current.IsCameraAvailable) { // 50% compression and a unique file name. var file = await CrossMedia.Current.TakePhotoAsync(new Plugin.Media.Abstractions.StoreCameraMediaOptions { Name = Guid.NewGuid().ToString(), CompressionQuality = 50 }); if (file == null) { await DisplayAlert("Cannot capture", "We cannot store the file in the system, possibly permission issues.", "Okay"); } else { // Load the image in view emotionResults.Text = "Processing the image..."; imageView.Source = ImageSource.FromStream(() => { return file.GetStream(); }); await processImage(file); } } else { await DisplayAlert("Cannot select picture", "Your device needs to have a camera, or needs to support photo selection.", "Okay"); } } else { await DisplayAlert("Problem", "Cannot initialize the low-level APIs.", "Okay"); } }
在成功构建并在Android设备上运行后,实现了以下结果:
您可以捕获图像并将其发送到服务器以分析和检测图像流中用户的情绪 - 或者您可以遵循更高级的路径并使用Azure Cognitive Services的流服务来分析图像流,该图像流具有几乎零延迟的好处。
清理资源
完成此操作后,清除Azure平台上的所有资源通常是一种很好的做法,这样您就不会收取任何不必要的费用。如果您按照本文进行操作,那么您将拥有一个名为“ Emotion-Detection-RG ”的资源组,您可以找到并删除该资源,以便快速删除本文中创建的所有内容。
结论
在本文中,我们讨论了如何快速轻松地将Azure Cognitive Services合并到应用程序中,以添加最先进的机器学习情感传感功能。我讨论了如何利用Azure认知服务的Face API为我们的Xamarin应用程序添加情感检测功能,或者更为通用,添加到基于.NET Core的应用程序。
在开发基于Cognitive Services的生产软件时,您应该考虑一些最佳实践:
- 您的端点密钥不得暴露给外部用户。您应该考虑始终保持安全,例如在Azure Key Vault中,或使用代理应用程序作为中间件。
- 您的认知服务可能对其有限制,因此将代码保留在try ... catch或类似的块中,以处理Azure拒绝您的配额违规请求的情况。
- 由于Azure Cognitive Services可在全球不同地区使用,因此请考虑使用更接近用户的实例,以减少延迟。
在Microsoft Azure上,您拥有自己的数据,并且要遵循欧洲的GDPR规则,您可以请求Microsoft删除用户在使用服务时生成的数据。