【问题标题】:how to debug/fix Microsoft Face API Project Oxford DetectAsync not completing request如何调试/修复 Microsoft Face API Project Oxford DetectAsync 未完成请求
【发布时间】:2019-10-28 12:03:53
【问题描述】:

我正在实现面部识别功能。我可以上传一个人和一张图片,但是当我尝试发送图片进行比较时,DetectAsync 方法失败并且没有错误消息。我不确定问题出在方法上(我已在其他项目中成功实现)还是我通过 javascript 或其他方式发送网络摄像头/图像的方式。

我正在使用 javascript 在网络摄像头上检测人脸并拍照。图片被发送到转换为流并发送到 DetectAsync(stream)。它在一个 try-catch 块中,但我没有收到异常,它只是返回到它似乎被冻结的 UI,我无法重新加载页面或导航到另一个页面。在 Quickwatch 窗口中,我键入 faceServiceClient.DetectAsync(stream) 然后强制执行,我得到以下信息:

  • 异常:空
  • 编号:643
  • 状态:等待激活
  • 结果:null(尚未计算)

其他一些,但这些似乎是最相关的

我希望获得一组 FaceID (GUIDS)。图像中的每张脸。或错误消息。获得 GUIDS 后,我可以尝试在我的 personGroup 中找到匹配的面孔。如果我找到匹配项,我会将用户名返回到我的 UI。我已经让它在 MVC 应用程序中工作。这是一个 ASP.NET 应用程序。

代码:

public async Task<string> DoFacialRecognition(string image)
{
    string response = "";
    FaceServiceClient faceServiceClient = new FaceServiceClient(subscriptionKey);
    try
    {  
        var imageToSend = ConvertBase64ToImage(image.Substring(22));

        Stream stream = ConvertToStream(imageToSend, ImageFormat.Png);

        var faces = await faceServiceClient.DetectAsync(stream, true, false);
        var faceIds = faces.Select(face => face.FaceId).ToArray();
    }
....
}

【问题讨论】:

    标签: c# microsoft-cognitive


    【解决方案1】:

    问题在于线程或线程...我不确定技术性或术语,但我会尽我所能解释。这是一个对异步方法进行 ajax 调用的 aspx 页面。这是我所期待的行为:
    aspx-> ajax-> async method A-> async method B-> back to A-> back to ajax-> ajax 处理响应。

    实际发生了什么:
    aspx-> ajax-> 异步方法 A-> 异步方法 B-> 回到 ajax 或 aspx.

    但是 ajax 正在等待来自方法 A 的响应,所以它忽略了来自方法 B 的响应(可能甚至不是正确的格式)。该页面仍处于“活动”状态,但当用户尝试执行任何操作时,服务器没有响应,因为方法 A 仍在等待 B 的响应并锁定代码。

    如果您对线程和异步调用有更多了解,请随时纠正我的理解!

    解决: 我需要解决的信息由 Stephen Cleary 在这篇文章中提供:How to call asynchronous method from synchronous method in C#?

    您需要从 ajax 调用中“隐藏”异步方法。为此,Stephen 有一个名为 Nito.AsyncEx 的 nuget 包。

    然后序列看起来像:
    aspx-> ajax-> 方法 A-> 异步方法 B-> 返回 A-> 返回 ajax-> ajax 处理响应。
    请注意,方法 A 不再是异步的。

    代码如下所示:

    using Nito.AsyncEx;
    [WebMethod]
        public static string CheckImage(string image)
        {
            var result =  AsyncContext.Run(() => MyAsyncMethod(image));           
            return result; 
        }
    
        private static async Task<string> MyAsyncMethod(string image)
        {
            //do async stuff
        }
    

    【讨论】:

      猜你喜欢
      • 2016-06-27
      • 2017-03-24
      • 1970-01-01
      • 2016-07-31
      • 2017-11-11
      • 1970-01-01
      • 2016-10-25
      • 2020-04-12
      • 1970-01-01
      相关资源
      最近更新 更多