VK Cloud logo
Обновлена31 октября 2023 г. в 06:09

Пример интеграции на Python

Попробуем распознать лица на фотографии:

Скачайте файл smarty.py.

1python examples/python/smarty.py \
2-u "https://smarty.mail.ru/api/v1/persons/recognize?oauth_provider="mcs&oauth_token=e50b000614a371ce99c01a80a4558d8ed93b313737363830" \
3-p examples/friends1.jpg \
4--meta '{"space":"1", "create_new":false}' \
5-v

Получим ответ:

1{
2    "status":200,
3    "body":{
4        "objects": [
5            {
6            "status":0,
7            "name":"file_0",
8            "persons":[
9                {"tag":"undefined","coord":[102,30,184,134],"confidence":0.99999,"awesomeness":0.5025},
10                {"tag":"undefined","coord":[393,74,461,166],"confidence":0.99987,"awesomeness":0.548},
11                {"tag":"undefined","coord":[458,48,535,149],"confidence":0.99976,"awesomeness":0.4766},
12                {"tag":"undefined","coord":[273,45,352,147],"confidence":0.99963,"awesomeness":0.504},
13                {"tag":"undefined","coord":[525,81,600,184],"confidence":0.99954,"awesomeness":0.4849},
14                {"tag":"undefined","coord":[194,76,258,167],"confidence":0.9984,"awesomeness":0.5725}
15            ]
16            }
17        ],
18        "aliases_changed":false
19    },
20    "htmlencoded":false,
21    "last_modified":0
22}

Как видим, на фотографии нашлось 6 лиц, но все они "undefined". Что значит "undefined"?Это значит, что в базе данных еще нет ни одной распознанной персоны.

Обратите внимание на параметры "space":"1" и "create_new":"false", их значение вскоре станет понятно из примеров.

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

Попробуем добавить в базу данных персону. На этой фотографии одна персона:

Мы установим, что эта персона имеет id=1 в базе данных. Сделаем это с помощью следующего запроса и параметра "person_id":1.

1python examples/python/smarty.py \
2-u "https://smarty.mail.ru/api/v1/persons/set?oauth_provider=mcs&oauth_token=e50b000614a371ce99c01a80a4558d8ed93b313737363830" \
3-p examples/rachel-green.jpg \
4--meta '{"space":"1", "images":[{"person_id":1}]}' \
5-v

Если запрос верный, ответ будет такой:

1{
2    "status":200,
3    "body":{
4        "objects":[
5            {"status":0,"name":"file_0"}
6        ]
7    },
8    "htmlencoded":false,
9    "last_modified":0
10}

Теперь попробуем поискать лица снова. Выполняем тот же запрос:

1python examples/python/smarty.py \
2-u "https://smarty.mail.ru/api/v1/persons/recognize?oauth_provider=mcs&oauth_token=e50b000614a371ce99c01a80a4558d8ed93b313737363830" \
3-p examples/friends1.jpg \
4--meta '{"space":"1", "create_new":false}' \
5-v

На этот раз получим ответ:

1{
2    "status":200,
3    "body":{
4        "objects": [
5        {
6            "status":0,
7            "name":"file_0",
8            "persons":[
9                {"tag":"undefined","coord":[102,30,184,134],"confidence":0.99999,"awesomeness":0.5025},
10                {"tag":"undefined","coord":[393,74,461,166],"confidence":0.99987,"awesomeness":0.548},
11                {"tag":"undefined","coord":[458,48,535,149],"confidence":0.99976,"awesomeness":0.4766},
12                {"tag":"undefined","coord":[273,45,352,147],"confidence":0.99963,"awesomeness":0.504},
13                {"tag":"undefined","coord":[525,81,600,184],"confidence":0.99954,"awesomeness":0.4849},
14                {"tag":"person1","coord":[194,76,258,167],"confidence":0.9984,"awesomeness":0.5725}
15            ]
16        }
17        ],
18        "aliases_changed":false
19    },
20    "htmlencoded":false,
21    "last_modified":0
22}

Теперь на фотографии с шестью персонами мы находим персону, которую мы загрузили с помощью метода persons/set. Мы загружали в базу данных персону с id=1, и теперь она распознана:

"tag":"person1"

Параметр create_new

Теперь вернемся в самое начало и представим, что мы еще не загружали персоны в базу данных. Попробуем выполнить запрос с "create_new":true:

1python examples/python/smarty.py \
2-u "https://smarty.mail.ru/api/v1/persons/recognize?oauth_provider=mcs&oauth_token=e50b000614a371ce99c01a80a4558d8ed93b313737363830" \
3-p examples/friends1.jpg \
4--meta '{"space":"1", "create_new":true}' \
5-v

В ответе:

1{
2    "status":200,
3    "body":{
4        "objects": [
5            {
6                "status":0,
7                "name":"file_0",
8                "persons":[
9                    {"tag":"person1","coord":[102,30,184,134],"confidence":0.99999,"awesomeness":0.5025},
10                    {"tag":"person2","coord":[393,74,461,166],"confidence":0.99987,"awesomeness":0.548},
11                    {"tag":"person3","coord":[458,48,535,149],"confidence":0.99976,"awesomeness":0.4766},
12                    {"tag":"person4","coord":[273,45,352,147],"confidence":0.99963,"awesomeness":0.504},
13                    {"tag":"person5","coord":[525,81,600,184],"confidence":0.99954,"awesomeness":0.4849},
14                    {"tag":"person6","coord":[194,76,258,167],"confidence":0.9984,"awesomeness":0.5725}
15                ]
16            }
17        ],
18        "aliases_changed":false
19    },
20    "htmlencoded":false,
21    "last_modified":0
22}

Видно, что все найденные персоны автоматически записались в базу данных, и им присвоены id. Если теперь поискать Рейчел методом persons/recognize, то теперь она будет распознана как "person6".

Параметр space

Позволяет создавать непересекающиеся наборы персон. Например, в "space":"1" можно загрузить (persons/set) всех персонажей сериала "Друзья", а в "space":"2" - всех персонажей сериала "Бригада". Теперь можно создать автоматическую пропускную систему:

  • на голливудской киностудии стоит искать (вызывать persons/recognize) в "space":"1",
  • в московской — в "space":"2".

Удаление персоны из базы данных

Если нужно почистить спейс (space) или какую-то персону добавили в базу данных по ошибке, необходимо использовать запрос persons/delete.

1python examples/python/smarty.py \
2-u "https://smarty.mail.ru/api/v1/persons/delete?oauth_provider=mcs&oauth_token=e50b000614a371ce99c01a80a4558d8ed93b313737363830" \
3--meta '{"space":"1", "images":[{"name":"myname", "person_id":1}]}' \
4-v

Если запрос верный, ответ будет такой:

1{
2    "status":200,
3    "body":
4    {
5        "objects":
6        [
7            {"status":0,"name":"myname"}
8        ]
9    },
10    "htmlencoded":false,
11    "last_modified":0
12}

Для этого запроса не требуется передавать картинку, достаточно только мета-информации c указанием id персоны, которую надо удалить.

В настоящий момент этот запрос требуется делать с помощью multipart/form"-data, как и предыдущие запросы.

В будущем планируется возможность вызывать такие запросы (не требующие передачи файла на сервер) через обычный application/json или даже с помощью обычного GET-запроса.