как группировать фотографии с похожими лицами - PullRequest
4 голосов
/ 29 августа 2011

В большинстве SDK для распознавания лиц он предоставляет только две основные функции

  1. обнаружение лиц и извлечение шаблонов из фотографий, это называется обнаружением.
  2. Сравнивая два шаблона и возвращая одинаковый результат, это называется распознаванием.

Однако помимо этих двух функций я ищу алгоритм или SDK для группировки фотографий с похожими лицами, например, на основе аналогичных оценок.

Спасибо

1 Ответ

2 голосов
/ 29 августа 2011

Сначала выполните шаг 1 для извлечения шаблонов, затем сравните каждый шаблон со всеми остальными, применив шаг два ко всем возможным парам, получив их оценки сходства.

Сортировка совпадений на основе этого показателя сходствавыберите пороговое значение и сгруппируйте те шаблоны, которые превышают его.

Возьмите, например, следующий случай:

Десять шаблонов: A, B, C,D, E, F, G, H, I, J.
Баллы между: 0 и 100.
Порог сходства: 80.

Таблица сходства:

   A   B   C   D   E   F   G   H   I   J
A  100 85  8   0   1   50  55  88  90  10

B  85  100 5   30  99  60  15  23  8   2 

C  8   5   100 60  16  80  29  33  5   8

D  0   30  60  100 50  50  34  18  2   66

E  1   99  16  50  100 8   3   2   19  6

F  50  60  80  50  8   100 20  55  13  90

G  55  15  29  34  3   20  100 51  57  16

H  88  23  33  18  2   55  51  100 8   0

I  90  8   5   2   19  13  57  8   100 3

J  10  2   8   66  6   90  16  0   3   100

Список отсортированных матчей:

AI 90
FJ 90
BE 99
AH88
AB 85
CF 80
------- <- <strong>Линия отсечки порога
DJ 66
.......

Итерация по списку до пороговой точки, где значения больше не превышают ее, поддерживает полный набор шаблонов и наборы ассоциаций для каждого шаблона, получая окончательные группы:

// Empty initial full templates set
fullSet = {};

// Iterate through the pairs list
foreach (templatePair : pairList)
{
  // If the full set contains the first template from the pair
  if (fullSet.contains(templatePair.first))
  {
     // Add the second template to its group
     templatePair.first.addTemplateToGroup(templatePair.second);

     // If the full set also contains the second template
     if (fullSet.contains(templatePair.second))
     {
        // The second template is removed from the full set
        fullSet.remove(templatePair.second);

        // The second template's group is added to the first template's group
        templatePair.first.addGroupToGroup(templatePair.second.group);
     }
  }
  else
  {
    // If the full set contains only the second template from the pair
    if (fullSet.contains(templatePair.second))
    {
      // Add the first template to its group
      templatePair.second.addTemplateToGroup(templatePair.first);
    }
  }
  else
  {
     // If none of the templates are present in the full set, add the first one
     // to the full set and the second one to the first one's group
     fullSet.add(templatePair.first);
     templatePair.first.addTemplateToGroup(templatePair.second);
  } 
}

Детали выполнения в списке:

AI: fullSet.add(A); A.addTemplateToGroup(I);
FJ: fullSet.add(F); F.addTemplateToGroup(J);
BE: fullSet.add(B); B.addTemplateToGroup(E);
AH: A.addTemplateToGroup(H);
AB: A.addTemplateToGroup(B); fullSet.remove(B); A.addGroupToGroup(B.group);
CF: C.addTemplateToGroup(F);

В итоге вы получите следующие группы сходства:

A - I, H, B, E
C - F, J
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...