Что вы сделали
Основываясь на своем коде, вы делаете следующее:
- Получите
PersonGroup
его PersonGroupId
или создайте, если не существует - Затем для каждой фотографии, представленной в параметрах метода:
- Определить, есть ли лица, используя метод
Detect
из Face API: если найдено 0 или более 1, выдается исключение
- Создайте новый
Person
, добавленный к предыдущему PersonGroup
- Затем для каждой фотографии, предоставленной в параметрах метода: добавьте лицо к созданному Персоне
- Наконецобучите
PersonGroup
Избегайте создания новых Person
для существующих людей
Если вы хотите избежать создания нового Person
, если у вас уже есть фотографиилицо одного и того же человека, вы можете просто вызвать метод Identify
с одной из фотографий (любой из них, если вы знаете, что все от одного человека, как, кажется, подсказывает ваш код).
Этошаг должен быть сделан до следующей строки:
var person = await _faceServiceClient.CreatePersonAsync(personGroupId, Guid.NewGuid().ToString());
Здесь вы можете сделать сомкак-то так (я использовал методы из последнего пакета Nuget Package for Face API, доступного здесь :
public async Task<Guid> Register(IEnumerable<MediaFile> photos)
{
var personGroupId = "XYXNXNX";
var allPersonGroups = await _faceClient.PersonGroup.ListAsync();
if (allPersonGroups?.Any(x => x.PersonGroupId == personGroupId) == false)
{
await _faceClient.PersonGroup.CreateAsync(personGroupId, "HFFGFGFD"); // creating a new person group if not exits.
}
var facesIdFromPhotos = new List<Guid>();
foreach (var photo in photos)
{
using (var stream = photo.GetStream())
{
var faces = await _faceClient.Face.DetectWithStreamAsync(stream);
if (faces?.Length == 0)
{
throw new Exception("NoFaceFound");
}
if (faces?.Length > 1)
{
throw new Exception("MultipleFacesFound");
}
facesIdFromPhotos.Add(((Microsoft.Azure.CognitiveServices.Vision.Face.Models.DetectedFace)faces[0]).FaceId);
}
}
// Check similarity, with 1 face from the previous detected faces
var similarityPerson = await _faceClient.Face.IdentifyAsync(facesIdFromPhotos.Take(1).ToList(), personGroupId);
Guid targetPersonId;
if (similarityPerson[0].Candidates?.Count > 0)
{
targetPersonId = similarityPerson[0].Candidates[0].PersonId;
}
else
{
var createdPerson = await _faceClient.PersonGroupPerson.CreateAsync(personGroupId, Guid.NewGuid().ToString());
targetPersonId = createdPerson.PersonId;
}
// Add faces to Person (already existing or not)
foreach (var photo in photos)
{
await _faceClient.PersonGroupPerson.AddFaceFromStreamAsync(personGroupId, targetPersonId, photo.GetStream());
}
await _faceClient.PersonGroup.TrainAsync(personGroupId);
return targetPersonId;
}
Последнее: почему вы бросаете исключение?Разве вы не можете просто пропустить фотографии с 0 или более чем одним лицом?