当我尝试上传带口罩的图像时,认知面部检测不起作用
Posted
技术标签:
【中文标题】当我尝试上传带口罩的图像时,认知面部检测不起作用【英文标题】:Cognitive face detection is not working when I try to upload the image with a face mask 【发布时间】:2020-08-28 06:55:57 【问题描述】:关于如何在认知人脸识别中获取带面具的图像信息有什么建议吗? 当我上传带有头饰或眼镜的图像时,认知服务会返回图像信息,但在选择带面具的图像时,认知服务不会返回任何信息。这意味着我的认知服务实现无法识别带有面具的图像。如果有人遇到过这个问题并解决了,请给我一个解决方案。
public string subscriptionKey = "88c**************************f7";
public string uriBase = "https://westcentralus.api.cognitive.microsoft.com/face/v1.0/detect";
//Method to pick an image from the gallery
async void btnPick_Clicked(object sender, System.EventArgs e)
try
if (!CrossMedia.Current.IsPickPhotoSupported)
return;
var file = await CrossMedia.Current.PickPhotoAsync(new Plugin.Media.Abstractions.PickMediaOptions
PhotoSize = Plugin.Media.Abstractions.PhotoSize.Medium
);
if (file == null) return;
imgSelected.Source = ImageSource.FromStream(() =>
var stream = file.GetStream();
return stream;
);
MakeAnalysisRequest(file.Path);
catch (Exception ex)
string test = ex.Message;
> //convert Convert image to byte array
public byte[] GetImageAsByteArray(string imageFilePath)
using (FileStream fileStream =
new FileStream(imageFilePath, FileMode.Open, FileAccess.Read))
BinaryReader binaryReader = new BinaryReader(fileStream);
return binaryReader.ReadBytes((int)fileStream.Length);
> //Method to get image information from the detection Url
public async void MakeAnalysisRequest(string imageFilePath)
HttpClient client = new HttpClient();
client.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", subscriptionKey);
string requestParameters = "returnFaceId=true&returnFaceLandmarks=false" +
"&returnFaceAttributes=age,gender,headPose,smile,facialHair,glasses," +
"emotion,hair,makeup,occlusion,accessories,blur,exposure,noise";
string uri = uriBase + "?" + requestParameters;
HttpResponseMessage response;
byte[] byteData = GetImageAsByteArray(imageFilePath);
using (ByteArrayContent content = new ByteArrayContent(byteData))
content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
response = await client.PostAsync(uri, content);
string contentString = await response.Content.ReadAsStringAsync();
//***************************************************
//Here it return null in case of mask else its working fine
//***************************************************
List<ResponseModel> faceDetails = JsonConvert.DeserializeObject<List<ResponseModel>>(contentString);
if (faceDetails.Count != 0)
lblTotalFace.Text = "Total Faces : " + faceDetails.Count;
lblGender.Text = "Gender : " + faceDetails[0].faceAttributes.gender;
lblAge.Text = "Total Age : " + faceDetails[0].faceAttributes.age;
Console.WriteLine(faceDetails[0].faceAttributes.accessories.FirstOrDefault(x => x.type == "mask").confidence);
【问题讨论】:
【参考方案1】:您必须牢记两件事:
服务可能看不到某些面孔,请参阅doc:Face API 目前有 2 种检测模型:“detection_01”和“detection_02”。这个最新模型(如果我记得很清楚,自 2019 年 5 月以来就存在)具有更好的性能(尤其是对于旋转或部分隐藏的人脸),但没有提供模型 1 提供的所有输出信息。由于技术挑战,可能无法检测到某些面孔。 极端的面部角度(头部姿势)或面部遮挡(物体如 太阳镜或挡住部分面部的手)可能会影响检测。 正面和近正面效果最好。
检测模型的区别
我使用“认知工作台”演示门户(here)做了一个快速演示,其中包含以下图片:
检测_01:未找到人脸
使用 detection_02:找到了人脸,正如您在此捕获中看到的那样:
但如果您需要使用面部的特定属性,这可能无法解决您的问题。请参阅 API 文档摘录:
【讨论】:
以上是关于当我尝试上传带口罩的图像时,认知面部检测不起作用的主要内容,如果未能解决你的问题,请参考以下文章
当我尝试将用户上传的图像保存在视图中时,为啥 ImageField 中的 upload_to 根本不起作用