public async Task <IActionResult> Compare(FacePattern model) { var tokenString = Request.Headers["Authorization"].ToString().Remove(0, 7); var handler = new JwtSecurityTokenHandler(); var jsonToken = handler.ReadToken(tokenString); var token = handler.ReadToken(tokenString) as JwtSecurityToken; var updaterId = token.Claims.First(claim => claim.Type == "nameid").Value; var isPasswordChangeRequired = Convert.ToBoolean(token.Claims.First(claim => claim.Type == "password_change_required").Value); if (isPasswordChangeRequired) { return(Forbid()); } var criminals = await _criminalService.CompareWithPattern(model); var criminalsModel = _mapper.Map <IList <CriminalModel> >(criminals); return(Ok(criminalsModel)); }
public async Task <IEnumerable <Criminal> > CompareWithPattern(FacePattern facePattern) { var asyncSession = _store.OpenAsyncSession("CriminalFinder.Criminals"); var photos = await asyncSession.Query <Photo>().ToListAsync(); List <Criminal> criminals = new List <Criminal>(); List <ComparisonModel> filteredCriminals = new List <ComparisonModel>(); foreach (var photo in photos) { double a = 0.0; double accuracy = 0.0; if (photo.PhotoOwner.Gender == facePattern.FaceAttributes.Gender) { if (photo.FaceModel.FaceAttributes.Age <= facePattern.FaceAttributes.Age + 8 && photo.FaceModel.FaceAttributes.Age >= facePattern.FaceAttributes.Age - 8) { a++; } if (photo.PhotoOwner.Gender.Equals("male")) { if (photo.FaceModel.FaceAttributes.FacialHair.Moustache == 0.0 && facePattern.FaceAttributes.FacialHair.Moustache == 0.0) { a++; } if (photo.FaceModel.FaceAttributes.FacialHair.Beard == 0.0 && facePattern.FaceAttributes.FacialHair.Beard == 0.0) { a++; } if (photo.FaceModel.FaceAttributes.FacialHair.Sideburns == 0.0 && facePattern.FaceAttributes.FacialHair.Sideburns == 0.0) { a++; } if ((photo.FaceModel.FaceAttributes.FacialHair.Moustache < 0.5 && photo.FaceModel.FaceAttributes.FacialHair.Moustache > 0.0) && (facePattern.FaceAttributes.FacialHair.Moustache < 0.5 && facePattern.FaceAttributes.FacialHair.Moustache > 0.0)) { a++; } if ((photo.FaceModel.FaceAttributes.FacialHair.Beard < 0.5 && photo.FaceModel.FaceAttributes.FacialHair.Beard > 0.0) && (facePattern.FaceAttributes.FacialHair.Beard < 0.5 && facePattern.FaceAttributes.FacialHair.Beard > 0.0)) { a++; } if ((photo.FaceModel.FaceAttributes.FacialHair.Sideburns < 0.5 && photo.FaceModel.FaceAttributes.FacialHair.Sideburns > 0.0) && (facePattern.FaceAttributes.FacialHair.Sideburns < 0.5 && facePattern.FaceAttributes.FacialHair.Sideburns > 0.0)) { a++; } if (photo.FaceModel.FaceAttributes.FacialHair.Moustache == 0.5 && facePattern.FaceAttributes.FacialHair.Moustache == 0.5) { a++; } if (photo.FaceModel.FaceAttributes.FacialHair.Beard == 0.5 && facePattern.FaceAttributes.FacialHair.Beard == 0.5) { a++; } if (photo.FaceModel.FaceAttributes.FacialHair.Sideburns == 0.5 && facePattern.FaceAttributes.FacialHair.Sideburns == 0.5) { a++; } if (photo.FaceModel.FaceAttributes.FacialHair.Moustache > 0.5 && facePattern.FaceAttributes.FacialHair.Moustache > 0.5) { a++; } if (photo.FaceModel.FaceAttributes.FacialHair.Beard > 0.5 && facePattern.FaceAttributes.FacialHair.Beard > 0.5) { a++; } if (photo.FaceModel.FaceAttributes.FacialHair.Sideburns > 0.5 && facePattern.FaceAttributes.FacialHair.Sideburns > 0.5) { a++; } } if (photo.FaceModel.FaceAttributes.Glasses.Equals("NoGlasses") && facePattern.FaceAttributes.Glasses.Equals("NoGlasses")) { a++; } if (!photo.FaceModel.FaceAttributes.Glasses.Equals("NoGlasses") && !facePattern.FaceAttributes.Glasses.Equals("NoGlasses")) { a++; } if (photo.FaceModel.FaceAttributes.Hair.Bald < 0.5 && facePattern.FaceAttributes.Hair.Bald < 0.5) { a++; } if (photo.FaceModel.FaceAttributes.Hair.Bald == 0.5 && facePattern.FaceAttributes.Hair.Bald == 0.5) { a++; } if (photo.FaceModel.FaceAttributes.Hair.Bald > 0.5 && facePattern.FaceAttributes.Hair.Bald > 0.5) { a += 2.0; } else { List <HairColor> recognizedHairs = new List <HairColor>(); foreach (var hairColor in photo.FaceModel.FaceAttributes.Hair.HairColor) { if (hairColor.Confidence >= 0.9) { recognizedHairs.Add(hairColor); } } List <HairColor> recognizedHairsSorted = recognizedHairs.OrderByDescending(h => h.Confidence).ToList(); string recognizedHair = string.Empty; if (recognizedHairsSorted.Count > 0) { recognizedHair = recognizedHairsSorted[0].Color; } string recognizedHairFromPattern = facePattern.FaceAttributes.Hair.HairColor.Color; if (recognizedHair.Equals(recognizedHairFromPattern)) { a += 1.7; } } if (photo.PhotoOwner.Gender.Equals("male")) { accuracy = a / 8; } else { accuracy = a / 5; } if (accuracy > 0.8) { filteredCriminals.Add(new ComparisonModel { Criminal = photo.PhotoOwner, Accuracy = accuracy }); } } } List <ComparisonModel> filteredCriminalsSorted = filteredCriminals.OrderByDescending(c => c.Accuracy).ToList(); foreach (var item in filteredCriminalsSorted) { criminals.Add(item.Criminal); } return(criminals); }