Группировка лиц персоны в базе данных

Вы можете интегрировать FindFace Enterprise Server SDK в системы видеонаблюдения и видеоаналитики. Для этого задействуйте функцию группировки лиц, принадлежащих одному человеку (персоне).

В этом разделе:

Принцип работы

persons_ru

  • Содержащее лицо изображение (например, захваченное в кадре видеодетектором лиц) отправляется на Сервер FindFace для идентификации через запрос /face POST.
  • При идентификации персоны Сервер использует свойство лица person_id. Для каждой персоны в базе данных значение данного свойства должно быть уникально.
  • Сервер FindFace получает новое лицо и находит наиболее похожее на него в базе данных (так называемое опорное лицо). В случае если схожесть лиц равна или превышает порог, указанный в файле конфигурации findface-facenapi.ini (person_identify_threshold), новое лицо добавляется в базу данных с присвоением того же значения параметра person_id, что и у опорного лица. Оно также наследует некоторые другие свойства опорного лица (например, метаданные). Это означает, что новое лицо было распознано как принадлежащее существующей персоне.
  • Если схожесть между лицами не превышает заданного порогового значения, Сервер рассматривает новое лицо как нераспознанное. В этом случае новое лицо добавляется в базу данных как принадлежащее новой персоне, с новым значением person_id.
  • В обоих случаях Сервер возвращает ответ, содержащий значение person_id, присвоенное добавленному лицу. Данное значение может быть далее использовано в аналитике.

Предупреждение

Похожие лица, принадлежащие разным людям, могут быть распознаны как лица одной персоны и получить одинаковые значения параметра person_id. Для того чтобы избежать подобной ситуации, рекомендуется периодически просматривать базу данных, вручную разрешая каждый конфликт идентичности.

Включение группировки лиц

По умолчанию лица персоны не группируются. Это означает, что всем вновь добавленным лицам не назначается свойство person_id, а разные люди Сервером не различаются.

Для того чтобы включить группировку лиц персоны, выполните следующие действия:

  1. Откройте для редактирования файл конфигурации findface-facenapi.ini.

    sudo vi /etc/findface-facenapi.ini
    
  2. Отредактируйте настройки.

    Предупреждение

    Содержимое файла findface-facenapi.ini должно представлять собой синтаксически верный код Python.

    Раскомментируйте и отредактируйте строку person_identify = False, чтобы включить группировку лиц.

    → person_identify = True
    

    По умолчанию группировка лиц выполняется отдельно по каждой видеокамере. Для слияния результатов группировки по всем видеокамерам раскомментируйте и отредактируйте строку person_identify_global = False. Данную опцию можно использовать в небольших системах до 5 камер. Если камер больше, оставьте опцию выключенной.

    → person_identify_global = True
    

    Раскомментируйте строку и установите порог для идентификации персоны от 0 до 1.

    → person_identify_threshold = 0.75
    
  3. Перезапустите сервис findface-facenapi.

    sudo service findface-facenapi restart
    

Последовательность REST API для анализа данных персоны

Существует множество способов задействовать группировку лиц персон в аналитике. Типичная последовательность REST API для идентификации персоны и последующей работы с ее данными представлена ниже:

№ п/п Метод Описание
1 /face POST Добавьте лицо в базу данных и получите информацию о добавленном лице в формате JSON, в том числе значение параметра person_id.
2 /history/search POST Найдите все события по видеокамерам, связанные с персоной, чей person_id вы получили в ответе на запрос /face POST.

Метод /face POST

Запрос

POST /v0/face/ HTTP/1.1
Host: 127.0.0.1
Authorization: Token e93437ccdae66d57a45a5c6d9aa7602e
Content-Type: application/json
Content-Length: [length]

{
    "photo": "http://static.findface.pro/sample.jpg"
}

Ответ

HTTP/1.1 200 OK
Date: Mon, 13 Jun 2016 12:23:56 GMT
Content-Type: application/json
Content-Length: [length]

{
  "results": {
    "[595, 127, 812, 344]": [
      {
        "confidence": 1,
        "face": {
          "friend": false,
          "galleries": [
            "default"
          ],
          "id": 2,
          "meta": "Jack Smith",
          "normalized": "http://192.168.113.76:3333/uploads/20170418/1492509569217098.jpeg",
          "person_id": 2,
          "photo": "http://192.168.113.76:3333/uploads/20170418/14925095692111893.jpeg",
          "photo_hash": "53477c4a72f52c6efc951d9c7ece42bc",
          "thumbnail": "http://192.168.113.76:3333/uploads/20170418/14925095692159095.jpeg",
          "timestamp": "2017-04-18T09:59:29.211000",
          "x1": 595,
          "x2": 812,
          "y1": 127,
          "y2": 344
        }
      }
    ]
  }
}

Метод /history/search POST

Запрос

POST /v0/history/search    HTTP/1.1
Host:   127.0.0.1
Authorization:  Token   e93437ccdae66d57a45a5c6d9aa7602e
Content-Type:   application/json
Content-Length: [length]
{
    "person_id": 2,
}

Ответ

HTTP/1.1   200 OK
Date:   Mon, 13 Jun 2016 12:23:56 GMT
Content-Type:   application/json
Content-Length: [length]
{
   "next_page": "/v0/history/search?max_id=4",
   "results":[
      {
         "friend":false,
         "meta":"Jack Smith",
         "photo_hash":"9fda49f2444f93c33ad8aa914e20e53b",
         "cam_id":"12345678123456781234567812345678",
         "person_id":2,
         "timesamp":"2016-10-11T14:36:27.450000",
         "photo":"http://192.168.113.76:3333/uploads/20170418/149250956922566.jpeg",
         "id":20146,
         "y1":77,
         "x1":285,
         "x2":552,
         "y2":345
      },
      {
         "friend":false,
         "meta":"Jack Smith",
         "photo_hash":"dc7ac54590729669ca869a18d92cd05e",
         "cam_id":"12345678123456781234567812345678",
         "person_id":2,
         "timesamp":"2016-10-12T12:57:07.509000",
         "photo":"http://192.168.113.76:3333/uploads/20170418/14925095692111596.jpeg",
         "id":20147,
         "x1":236,
         "y1":345,
         "x2":311,
         "y2":419
      }
   ]
}

Другие методы API для работы с персоной в базе данных

Добавление и изменение person_id

Для добавления или изменения значения параметра person_id определенного лица используйте метод PUT /face/id/<face_id>.

Предупреждение

Поскольку свойство person_id назначается только вновь добавляемым лицам, прежние лица в базе данных не участвуют в идентификации персоны. Используйте метод PUT /face/id/<face_id> для решения данной проблемы.

Запрос

PUT /v0/face/id/5/ HTTP/1.1
Host: 127.0.0.1
Authorization: Token e93437ccdae66d57a45a5c6d9aa7602e
Content-Type: application/json
Content-Length: [length]

{
  "person_id": "4"
}

Ответ

HTTP/1.1 200 OK
Date: Mon, 13 Jun 2016 12:23:56 GMT
Content-Type: application/json
Content-Length: [length]

{
  "id": 5,
  "meta": "Jane Richardson",
  "person_id": "4",
  "photo": "http://static.findface.pro/sample2.jpg",
  "photo_hash": "dc7ac54590729669ca869a18d92cd05e",
  "timestamp": "2016-06-13T11:06:42.075754",
  "x1": 225,
  "x2": 307,
  "y1": 345,
  "y2": 428
}

Поиск событий, связанных с персоной

Для поиска в истории видеокамер всех событий, связанных с персоной с заданным person_id, используйте метод GET /person/history/id/<person_id> (наравне с методом /history/search POST).

Запрос

GET    v0/person/history/id/2001   HTTP/1.1
Host:   127.0.0.1
Authorization:  Token   e93437ccdae66d57a45a5c6d9aa7602e
Content-Type:   application/json
Content-Length: [length]
{
    "cam_ids":    [1, 25, 26, 27],
    "start":  "2016-06-13T11:00:00.000000",
    "end":    "2016-06-14T11:00:00.000000"
}

Ответ

HTTP/1.1   200 OK
Date:   Mon,    13  Jun 2016    12:23:56    GMT
Content-Type:   application/json
Content-Length: [length]
{
    "results":
    [
        {
            "person_id":  2001,
            "face_id":    240344,
            "cam_id": 25,
            "meta":   "Sam   Berry",
    "screenshot":"https://static.findface.pro/57726179d6946f02f3763824/dc7ac54590729669ca869a18d92cd05e_thumb.j
pg",
            "timestamp":  "2016-06-13T11:06:42.075754",
        },
        {
            "person_id":  2001,
            "face_id":    240422,
            "cam_id": 25,
            "meta":   "Sam   Berry",
            "screenshot": "https://static.findface.pro/57726179
d6946f02f3763824/dc7ac54590729669ca869a18d92cd05e_thumb.j
pg",
            "timestamp":  "2016-06-13T11:08:44.073452",
        }
    ]
}

Получение списка персон

Для получения списка всех существующих персон в базе данных, используйте метод GET /persons.

Запрос

GET /v0/persons HTTP/1.1
Host: 127.0.0.1
Authorization: Token e93437ccdae66d57a45a5c6d9aa7602e

Ответ

HTTP/1.1   200 OK
Date:   Mon,    13  Jun 2016    12:23:56    GMT
Content-Type:   application/json
Content-Length: [length]

{
  "results": [
    {
      "id": 2,
      "meta": ""
    }
  ]
}