Search code examples
c#.netazureasp.net-coreazure-cognitive-services

Problem with the SDK Azure for FACE API With FileStream picture


We try to use the sdk to use the cognitives services of Microsoft. We use the Interface IFaceOperatiosn which inside there's a method to send a picture by stream like:DetectWithStreamWithHttpMessagesAsync. When we try to use it, we reach a APIErrorException which the message is Bad request but don't know where is the problem so there's our code:

public async Task<List<FaceAPI.Face>> DetectFace(string picture)
        {
            try
            {
                Stream img = new FileStream(picture, FileMode.Open);
                var res = await detect.DetectWithStreamWithHttpMessagesAsync(img);
                List<FaceAPI.Face> result = new List<FaceAPI.Face>();
                for (int i = 0; i < res.Body.Count; i++)
                {
                    result.Add(new FaceAPI.Face { Age = (double)res.Body[i].FaceAttributes.Age, Bald = res.Body[i].FaceAttributes.Hair.Bald > 0.5 ? true : false, Beard = res.Body[i].FaceAttributes.FacialHair.Beard > 0.5 ? true : false, Gender = res.Body[i].FaceAttributes.Gender.Value.Equals(Gender.Male) ? true : false, Glasses = res.Body[i].FaceAttributes.Glasses.Value.Equals(GlassesType.NoGlasses) ? false : true, Hair = res.Body[i].FaceAttributes.Hair.HairColor.ToString(), Moustache = res.Body[i].FaceAttributes.FacialHair.Moustache > 0.5 ? true : false,Rectangle=new System.Drawing.Rectangle { X = res.Body[i].FaceRectangle.Left, Y = res.Body[i].FaceRectangle.Top, Height = res.Body[i].FaceRectangle.Height, Width = res.Body[i].FaceRectangle.Width } });
                }
                return result;
            }
            catch (APIErrorException e)
            {
                Debug.WriteLine(e.Message);
                return null;
            }
            catch (SerializationException e)
            {
                Debug.WriteLine(e.Message);
                return null;
            }
            catch (ValidationException e)
            {
                Debug.WriteLine(e.Message);
                return null;
            }
        }

Normally it returns a list of Face.


Solution

  • You need to put a wich attribute you want retrieve for the detection like this:

    var requiredFaceAttributes = new FaceAttributeType[] {
                        FaceAttributeType.Age,
                        FaceAttributeType.Hair,
                        FaceAttributeType.Gender,
                        FaceAttributeType.Smile,
                        FaceAttributeType.FacialHair,
                        FaceAttributeType.Glasses
                    };
                    var res = await detect.DetectWithStreamWithHttpMessagesAsync(picture,true,true,requiredFaceAttributes);