Вебхуки
Вы можете настроить FindFace Multi для автоматической отправки уведомлений об определенных событиях, эпизодах, скриншотах счетчиков на заданный URL-адрес. Для этого создайте и настройте вебхук. При возникновении нужного события/эпизода/скриншота счетчика FindFace Multi отправит HTTP-запрос на URL-адрес, указанный в настройках вебхука.
Вебхуки можно использовать для решения разнообразных задач, например, для уведомления пользователя об определенном событии, вызова определенных действий на целевом веб-сайте, при решении задач безопасности, таких как удаленное автоматическое управление доступом и др.
В этом разделе:
Настройка вебхука
Важно
Для создания вебхука необходимы права администратора.
Примечание
Перед использованием вебхуков убедитесь, что хотя бы один из следующих параметров задан в файле /opt/findface-multi/configs/findface-multi-legacy/findface-multi-legacy.py
: SERVICE_EXTERNAL_ADDRESS
или EXTERNAL_ADDRESS
.
Для создания вебхука выполните следующие действия:
Перейдите на вкладку Настройки. Выберите Вебхуки.
Нажмите + Новый вебхук.
Введите заголовок вебхука.
Укажите адрес, на который будут отправляться оповещения.
Вы можете отправлять уведомления в пакетном режиме. Укажите максимальное количество уведомлений в пакете. Фактическое количество может быть меньшим.
Укажите максимальное количество попыток отправить уведомление. Интервал между попытками увеличивается экспоненциально с максимумом 100 секунд.
Важно
Для того чтобы получить все сообщения с момента потери соединения, если оно имеет место, установите значение
0
. Установите1
, чтобы пропустить старые сообщения.FindFace Multi будет автоматически отправлять оповещения о событиях, эпизодах, скриншотах счетчика, удовлетворяющих заданным фильтрам. Фильтровать события можно по следующим параметрам:
Универсальные фильтры для событий распознавания (лицо, силуэт, транспортное средство):
Секции:
face_events
,body_events
,car_events
."allowed_bs_types"
: режим отслеживания объектов на видео, возможные значения:overall
,realtime
."camera_group_in"
: id группы камер, число."camera_in"
: id камеры, число."confidence_gte"
: минимальное значение уверенности алгоритма, число."matched_lists_in"
: id списка наблюдения, число."matched_card_in"
: id совпавшей карточки, число."matched"
: результат сопоставления с картотекой, логическое значение. Установитеtrue
илиfalse
, если отправку оповещения должны вызывать только события с совпадениями или только события без совпадений.
Фильтры для событий распознавания лиц:
Секция:
face_events
."liveness_gte"
: минимальное значение уверенности алгоритма в том, что лицо витально, десятичное число."headpose_yaw_angle_gte"
: минимальный поворот головы, число (градусы). Если голова полностью повернута влево, угол равен-180
. Если полностью повернута вправо, то180
. Нейтральное положение головы соответствует0
."headpose_yaw_angle_lte"
: максимальный поворот головы, число (градусы). Если голова полностью повернута влево, угол равен-180
. Если полностью повернута вправо, то180
. Нейтральное положение головы соответствует0
."headpose_pitch_angle_gte"
: минимальный наклон головы, число (градусы). Если голова наклонена вперед, а подбородок касается груди, угол равен-180
. Если голова наклонена назад и обращена к небу, то180
. Нейтральное положение головы соответствует0
."headpose_pitch_angle_lte"
: максимальный наклон головы, число (градусы). Если голова наклонена вперед, а подбородок касается груди, угол равен-180
. Если голова наклонена назад и обращена к небу, то180
. Нейтральное положение головы соответствует0
."gender_in"
: пол, словарь строк. Возможные значения:"male"
,"female"
."age_lte"
: максимальный возраст, число."age_lte"
: минимальный возраст, число."glasses_in"
: очки, словарь строк. Возможные значения:"none"
,"eye"
(очки),"sun"
(солнцезащитные очки)."emotions_in"
: эмоции, словарь строк. Возможные значения:"any"
,"angry"
,"fear"
,"sad"
,"neutral"
,"disgust"
,"happy"
,"surprise"
."beard_in"
: борода, словарь строк. Возможные значения:"none"
,"beard"
."medmask_in"
: медицинская маска, словарь строк. Возможные значения:"correct"
,"incorrect"
,"none"
."liveness_in"
: оценка витальности liveness, словарь строк. Возможные значения:"real"
,"fake"
.
Фильтры для событий распознавания силуэтов:
Секция:
body_events
."headwear_in"
: тип головного убора (шапка/кепка, капюшон/платок, без убора), словарь строк. Возможные значения:"hat"
,"hood"
,"none"
."upper_clothes_in"
: обобщенная категория одежды верхней части тела (с длинными рукавами, с короткими рукавами, без рукавов), словарь строк. Возможные значения:"long_sleeves"
,"short_sleeves"
,"without_sleeves"
.”detailed_upper_clothes_in”
: детализированный тип одежды верхней части тела (куртка, пальто, жилет без рукавов, толстовка, футболка, рубашка, платье), словарь строк. Возможные значения:”jacket”`, ``”coat”
,”sleeveless”
,”sweatshirt”
,”t-shirt”
,”shirt”
,”dress”
."top_color_in"
: цвет одежды верхней части тела, словарь строк. Возможные значения:white
,"black"
,"grey"
,"brown"
,"red"
,"orange"
,"yellow"
,"green"
,"lightblue"
,"blue"
,"purple"
,"pink"
,"beige"
,"violet"
."lower_clothes_in"
: тип одежды нижней части тела (брюки, юбка, шорты, неопределенный), словарь строк. Возможные значения:"pants"
,"obscured"
,"skirt"
,"shorts"
."bottom_color_in"
: цвет одежды нижней части тела, словарь строк. Возможные значения:white
,"black"
,"grey"
,"brown"
,"red"
,"orange"
,"yellow"
,"green"
,"lightblue"
,"blue"
,"purple"
,"pink"
,"beige"
,"violet"
."bag_hand_in"
: наличие сумки в руке(ах), словарь строк. Возможные значения:"none"
,"hand"
."bag_back_in"
: наличие сумки на спине, словарь строк. Возможные значения:"none"
,"back"
."vest_type_score_gte"
: минимальная достоверность распознавания наличия жилета, число."vest_type_score_lte"
: максимальная достоверность распознавания наличия жилета, число."vest_type_in"
: наличие средства индивидуальной защиты в виде жилета, словарь строк. Возможные значения:"green/yellow"
,"orange"
,"not_visible"
,"none"
."helmet_type_score_lte"
: максимальная достоверность распознавания наличия шлема, число."helmet_type_score_gte"
: минимальная достоверность распознавания наличия шлема, число."helmet_type_in"
: наличие средства индивидуальной защиты в виде шлема, словарь строк. Возможные значения:"red/orange"
,"white"
,"other"
,"not_visible"
,"none"
."age_group_score_lte"
: максимальная достоверность распознавания возрастной группы, число."age_group_score_gte"
: минимальная достоверность распознавания возрастной группы, число."age_group_in"
: возраст по группе, словарь строк. Возможные значения:"0-16"
,"17-35"
,"36-50"
,"50+"
."gender_score_lte"
: максимальная достоверность распознавания пола, число."gender_score_gte"
: минимальная достоверность распознавания пола, число."gender_in"
: пол, словарь строк. Возможные значения:"male"
,"female"
.
Фильтры для событий распознавания транспортных средств:
Секция:
car_events
."category_confidence_gte"
: минимальная достоверность распознавания категории транспортного средства, число."category_confidence_lte"
: максимальная достоверность распознавания категории транспортного средства, число."category_type_in"
: категория транспортного средства, словарь строк. Возможные значения:"unknown"
,"A"
,"B"
,"BE"
,"C"
,"CE"
,"D"
,"DE"
,"other"
."color_in"
цвет транспортного средства, словарь строк. Возможные значения:"beige"
,"black"
,"blue"
,"brown"
,"cyan"
,"gold"
,"green"
,"grey"
,"orange"
,"pink"
,"purple"
,"red"
,"violet"
,"white"
,"yellow"
,"coming_soon"
,"unknown"
."body_in"
: тип кузова транспортного средства, словарь строк. Возможные значения:"suv"
,"sedan"
,"crossover"
,"convertible"
,"coupe"
,"wagon"
,"cab"
,"minibus"
,"minivan"
,"limousine"
,"coming_soon"
,"unknown"
."make_in"
: марка транспортного средства, словарь строк. Ознакомьтесь с соответствующим фильтром событий, чтобы узнать, какие производители поддерживаются в текущей версии."model_in"
: модель транспортного средства, словарь строк. Ознакомьтесь с соответствующим фильтром событий, чтобы узнать, какие модели поддерживаются в текущей версии."license_plate_number_in"
: регистрационный номер транспортного средства, словарь строк. Подстановочные знаки не поддерживаются."license_plate_color_in"
: цвет номерного знака, словарь строк. Возможные значения:"unknown"
,"white"
,"yellow"
,"blue"
,"green"
,"grey"
."license_plate_color_confidence_lte"
: максимальная достоверность распознавания цвета номерного знака, число."license_plate_color_confidence_gte"
: минимальная достоверность распознавания цвета номерного знака, число."license_plate_country_in"
: страна номерного знака, словарь строк. Ознакомьтесь с соответствующим фильтром событий, чтобы узнать, какие страны поддерживаются в текущей версии."license_plate_region_in"
: регион номерного знака, словарь строк. Ознакомьтесь с соответствующим фильтром событий, чтобы узнать, какие регионы поддерживаются в текущей версии."special_vehicle_type_in"
: спецназначение транспортного средства, словарь строк. Возможные значения:"taxi"
,"route_transport"
,"car_sharing"
,"ambulance"
,"police"
,"rescue_service"
,"gas_service"
,"military"
,"road_service"
,"other_special"
,"not_special"
,"unknown"
."weight_type_in"
: весовая категория транспортного средства. Возможные значения:"B_light"
,"B_heavy"
,"C_light"
,"C_heavy"
,"D_light"
,"D_long"
,"other"
."weight_type_confidence_lte"
: максимальная достоверность распознавания весовой категории транспортного средства, число."weight_type_confidence_gte"
: минимальная достоверность распознавания весовой категории транспортного средства, число."orientation_in"
: ракурс транспортного средства, словарь строк. Возможные значения:"front"
,"back"
,"side"
."orientation_confidence_lte"
: максимальная достоверность распознавания ракурса автомобиля, число."orientation_confidence_gte"
: минимальная достоверность распознавания ракурса автомобиля, число.
Эпизоды с людьми:
Секция:
human_episodes
."allowed_types"
: статус эпизода, возможные значения: открытие эпизода (episode_open
), добавление нового события в эпизод (episode_event
), закрытие эпизода (episode_close
)."camera_group_in"
: id группы камер, число."camera_in"
: id камеры, число."matched_lists_in"
: id списка наблюдения, число."face_matched"
: статус совпадения лица в эпизоде с картотекой, логическое значение. Установитеtrue
, если только эпизоды с совпадениями лиц, илиfalse
, если только эпизоды без совпадений лиц должны вызывать отправку оповещения."body_matched"
: статус совпадения силуэта в эпизоде с картотекой, логическое значение. Установитеtrue
, если только эпизоды с совпадениями силуэтов, илиfalse
, если только эпизоды без совпадений силуэтов должны вызывать отправку оповещения."events_count_gte"
: минимальное количество событий в эпизоде, число."events_count_lte"
: максимальное количество событий в эпизоде, число.
Эпизоды с транспортными средствами:
Секция:
car_episodes
."allowed_types"
: статус эпизода, возможные значения: открытие эпизода (episode_open
), добавление нового события в эпизод (episode_event
), закрытие эпизода (episode_close
)."camera_group_in"
: id группы камер, число."camera_in"
: id камеры, число."matched_lists_in"
: id списка наблюдения, число."car_matched"
: статус совпадения транспортного средства в эпизоде с картотекой, логическое значение. Установитеtrue
, если только эпизоды с совпадениями ТС, илиfalse
, если только эпизоды без совпадений ТС должны вызывать отправку оповещения."events_count_gte"
: минимальное количество событий в эпизоде, число."events_count_lte"
: максимальное количество событий в эпизоде, число.
Скриншоты счетчиков:
Секция:
counters
."counter_in"
: id счетчика, число."camera_group_in"
: id группы камер, число."camera_in"
: id камеры, число."faces_gte"
: минимальное количество лиц в скриншоте счетчика, число."faces_lte"
: максимальное количество лиц в скриншоте счетчика, число."silhouettes_gte"
: минимальное количество силуэтов в скриншоте счетчика, число."silhouettes_lte"
: максимальное количество силуэтов в скриншоте счетчика, число."cars_gte"
: минимальное количество транспортных средств в скриншоте счетчика, число."cars_lte"
: максимальное количество транспортных средств в скриншоте счетчика, число."proximity_min_lte"
: отправить оповещение, если минимальное задетектированное расстояние в метрах меньше указанной величины, число."proximity_min_gte"
: отправить оповещение, если минимальное задетектированное расстояние в метрах больше указанной величины, число."proximity_avg_lte"
: отправить оповещение, если среднее задетектированное расстояние в метрах меньше указанной величины, число."proximity_avg_gte"
: отправить оповещение, если среднее задетектированное расстояние в метрах больше указанной величины, число."proximity_max_lte"
: отправить оповещение, если максимальное задетектированное расстояние в метрах меньше указанной величины, число."proximity_max_gte"
: отправить оповещение, если максимальное задетектированное расстояние в метрах больше указанной величины, число.
{ "face_events": { "matched_lists_in": [], "camera_group_in": [], "camera_in": [], "matched_card_in": [], "matched": true, "confidence_gte": 0.75, "allowed_bs_types": [ "overall", "realtime" ], "liveness_gte": 0.65, "headpose_yaw_angle_gte": -180, "headpose_yaw_angle_lte": 180, "headpose_pitch_angle_gte": -180, "headpose_pitch_angle_lte": 180, "gender_in": [], "age_lte": 0, "age_gte": 0, "glasses_in": [], "emotions_in": [], "beard_in": [], "medmask_in": [], "liveness_in": [] }, "body_events": { "matched_lists_in": [], "camera_group_in": [], "camera_in": [], "matched_card_in": [], "matched": true, "confidence_gte": 0.75, "allowed_bs_types": [ "overall", "realtime" ], "headwear_in": [], "upper_clothes_in": [], "detailed_upper_clothes_in": [], "top_color_in": [], "lower_clothes_in": [], "bottom_color_in": [], "bag_hand_in": [], "bag_back_in": [], "vest_type_score_gte": 0, "vest_type_score_lte": 0, "vest_type_in": [], "helmet_type_score_lte": 0, "helmet_type_score_gte": 0, "helmet_type_in": [], "age_group_score_lte": 0, "age_group_score_gte": 0, "age_group_in": [], "gender_score_lte": 0, "gender_score_gte": 0, "gender_in": [] }, "car_events": { "matched_lists_in": [], "camera_group_in": [], "camera_in": [], "matched_card_in": [], "matched": true, "confidence_gte": 0.75, "allowed_bs_types": [ "overall", "realtime" ], "category_confidence_gte": 0, "category_confidence_lte": 0, "category_type_in": [], "color_in": [], "body_in": [], "make_in": [], "model_in": [], "license_plate_number_in": [], "license_plate_color_in": [], "license_plate_color_confidence_lte": 0, "license_plate_color_confidence_gte": 0, "license_plate_country_in": [], "license_plate_region_in": [], "special_vehicle_type_in": [], "weight_type_in": [], "weight_type_confidence_lte": 0, "weight_type_confidence_gte": 0, "orientation_in": [], "orientation_confidence_lte": 0, "orientation_confidence_gte": 0 }, "human_episodes": { "allowed_types": [ "episode_open", "episode_event", "episode_close" ], "matched_lists_in": [], "camera_in": [], "camera_group_in": [], "events_count_gte": 0, "events_count_lte": 999, "face_matched": true, "body_matched": true }, "car_episodes": { "allowed_types": [ "episode_open", "episode_event", "episode_close" ], "matched_lists_in": [], "camera_in": [], "camera_group_in": [], "events_count_gte": 0, "events_count_lte": 999, "car_matched": true }, "counters": { "counter_in": [], "camera_in": [], "camera_group_in": [], "faces_gte": 1, "faces_lte": 100, "silhouettes_gte": 1, "silhouettes_lte": 100, "cars_gte": 1, "cars_lte": 100, "proximity_min_lte": 100, "proximity_min_gte": 0, "proximity_avg_lte": 100, "proximity_avg_gte": 0, "proximity_max_lte": 100, "proximity_max_gte": 0 } }
Важно
Используйте только фильтры, соответствующие цели поиска. Для выключения фильтра удалите его из вебхука. Не оставляйте фильтр пустым (
[]
), поскольку в этом случае фильтр вернет пустой результат.Примечание
Для получения всех оповещений передайте скобки без вложенных фильтров:
{}
Совет
Пример №1. Получение оповещений обо всех событиях c транспортными средствами:
{ "car_events": {} }
Пример №2. Получение оповещений об открытии эпизодов с людьми с совпадениями в картотеке по лицам и силуэтам:
{ "human_episodes": { "allowed_types": ["episode_open"], "face_matched": true, "body_matched": true }}
Примечание
Вы можете задать несколько значений в фильтрах с квадратными скобками. В этом случае вебхук будет активироваться при совпадении одного из значений фильтра. В примере ниже вы будете оповещены о событии с силуэтом с группы камер
1
или3
, если совпала карточка с id12
или25
.{ "body_events": { "camera_group_in": [1, 3], "matched_card_in": [12, 25] } }
Поставьте флажок Активный.
Нажмите Сохранить.
Как работает вебхук
Для тестирования работы вебхука можно использовать следующий простой веб-сервер на Python, обеспечивающий захват отправленных вебхуком оповещений о событиях:
from pprint import pprint
from aiohttp import web
async def handle(request):
pprint(await request.json())
return web.Response(status=200)
app = web.Application()
# for aiohttp v 3.x
# app.add_routes([web.post('/', handle)])
# for aiohttp v 2.x
app.router.add_post('/', handle)
web.run_app(app, port=8888)
Важно
Используемый вами сервер-ловушка оповещений по вебхуку должен возвращать ответ HTTP 200
после получения вебхука от FindFace Multi, по аналогии с примером выше.
Если для вебхука не задано ни одного фильтра, данный веб-сервер будет получать оповещения обо всех произошедших в системе событиях, эпизодах, скриншотах счетчиков.
Для просмотра статуса отправки вебхука в FindFace Multi выполните следующую команду:
sudo journalctl CONTAINER_NAME=findface-multi-findface-multi-legacy-1 -f | grep 'Webhook'
Подробные данные в вебхуках (Verbose)
По умолчанию оповещения по вебхуку содержат только идентификаторы таких сущностей, как карточки, списки наблюдения, камеры и группы камер. Для того чтобы получать подробную информацию по данным сущностям, включите подробный режим оповещений по вебхукам (режим verbose).
Для этого откройте файл конфигурации /opt/findface-multi/configs/findface-multi-legacy/findface-multi-legacy.py
и установите в нем 'VERBOSE_WEBHOOKS': True
:
sudo vi /opt/findface-multi/configs/findface-multi-legacy/findface-multi-legacy.py
...
FFSECURITY = {
...
# send serialized cards, card-lists, camera and camera groups in webhooks
'VERBOSE_WEBHOOKS': True,
...
}
...
После внесения изменений обязательно перезапустите контейнер findface-multi-findface-multi-legacy-1
.
sudo docker container restart findface-multi-findface-multi-legacy-1