Как перестать добавлять того же человека снова в персонгруппе FaceAPI - PullRequest
0 голосов
/ 07 февраля 2019

Есть ли способ прекратить добавлять одного и того же человека в персонгруппу FaceAPI?Проблема в том, что пользователи, которые уже входят в личную группу, добавляют себя под разными именами.

Ниже приведен метод, который я написал.Возвращает GUID человека, который добавляется в группу людей.

public async Task<Guid> Register(IEnumerable<MediaFile> photos)
{
    var personGroupId = "XYXNXNX"

    var allPersonGroups = await _faceServiceClient.ListPersonGroupsAsync();

    if (allPersonGroups?.Any(x => x.PersonGroupId == personGroupId) == false)
    {
        await _faceServiceClient.CreatePersonGroupAsync(personGroupId, "HFFGFGFD"); // creating a new person group if not exits.
    }

    foreach (var photo in photos)
    {
        using (var stream = photo.GetStream())
        {
            var faces = await _faceServiceClient.DetectAsync(stream);

            if (faces?.Length == 0)
            {
                throw new CustomException(_translatorService.NoFaceFound);
            }

            if (faces?.Length > 1)
            {
                throw new CustomException(_translatorService.MultipleFacesFound);
            }
        }
    }

    var person = await _faceServiceClient.CreatePersonAsync(personGroupId, Guid.NewGuid().ToString());

    foreach (var photo in photos)
    {
        await _faceServiceClient.AddPersonFaceInPersonGroupAsync(personGroupId, person.PersonId, photo.GetStream());
    }

    await _faceServiceClient.TrainPersonGroupAsync(personGroupId);

    return person.PersonId;
}

1 Ответ

0 голосов
/ 07 февраля 2019

Что вы сделали

Основываясь на своем коде, вы делаете следующее:

  1. Получите PersonGroup его PersonGroupId или создайте, если не существует
  2. Затем для каждой фотографии, представленной в параметрах метода:
    • Определить, есть ли лица, используя метод Detect из Face API: если найдено 0 или более 1, выдается исключение
  3. Создайте новый Person, добавленный к предыдущему PersonGroup
  4. Затем для каждой фотографии, предоставленной в параметрах метода: добавьте лицо к созданному Персоне
  5. Наконецобучите 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 или более чем одним лицом?

...