Принципы написания плагина

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

Архитектура плагина

После того как компонент findface-video-worker обнаруживает лицо, он отправляет его в компонент findface-facerouter в виде HTTP API запроса. Для обработки запроса каждый плагин должен экспортировать функцию activate(app, ctx, plugin_name, plugin_source).

Параметры функции activate:

  • app: сущность tornado.web.Application компонента findface-facerouter.
  • ctx: контекст, передаваемый плагину при активации.
  • plugin_name: имя активируемого плагина.
  • plugin_source: объект источника, из которого загружается плагин.

При активации плагину передается следующий контекст:

  1. request.ctx.sfapi: настроенный экземпляр ntech.sfapi_client.Client, к которому можно обращаться напрямую для обработки результата видеодетекции (создание новой галереи, добавление лица в галерею и т. д.).
  2. plugins: OrderedDict со всеми плагинами (key: имя плагина, value: результат, возвращенный функцией activate).
  3. idgen: генератор id, который может вызываться как ctx.idgen().

Функция activate(app, ctx, plugin_name, plugin_source) должна вернуть объект со следующими методами:

  1. preprocess,
  2. process,
  3. shutdown (опционально).

Метод preprocess

В данном методе плагин решает, интересует ли его полученное лицо, и если да, возвращает кортеж или список, содержащий одну или несколько строк: ‘facen’, ‘gender’, ‘age’, ‘emotions’, что соответственно означает, что нужно извлечь вектор признаков, распознать пол, возраст и/или эмоции. Если возвращенные кортеж или список непусты, компонент findface-facerouter перенаправляет обнаруженное лицо в компонент findface-sf-api в запросе /detect POST с соответствующими параметрами в query string (facen=on, gender=on, age=on, emotions=on).

Синтаксис базового метода preprocess, от которого следует наследоваться (см. класс Plugin):

preprocess(self, request: FrHTTPRequest, labels: typing.Mapping[str, str]) → typing.Tuple[str]
Параметры:
  • FrHTTPRequest (tornado.httpserver.HTTPRequest) – HTTP API запрос, который включает в себя дополнительный аргумент params
  • labels (dictionary) – пользовательский набор меток кадра, который задается в параметрах задания для компонента findface-video-worker и затем присваивается кадру

Аргумент params FrHTTPRequest содержит следующие поля:

Параметры:
  • photo (bytes) – кадр с лицом в формате JPEG
  • face0 (bytes) – нормализованное изображение лица
  • bbox (list of integers [[x1,y1,x2,y2]], where x1: x coordinate of the top-left corner, y1: y coordinate of the top-left corner, x2: x coordinate of the bottom-right corner, y2: y coordinate of the bottom-right corner) – координаты рамки с лицом в кадре
  • cam_id (string) – id видеокамеры
  • timestamp (datetime.datetime) – временная метка кадра
  • detectorParams (dictionary) – словарь со служебно-отладочной информацией от детектора
  • bs_type (string) – режим поиска лучшего кадра. Доступные опции: overall (буферный режим: на сервер отправляется кадр, который был лучшим за весь период нахождения лица в поле зрения видеокамеры), realtime (режим реального времени: на сервер отправляются кадры, считающиеся лучшими в последовательных интервалах).
  • labels (dictionary) – (дублирует params.labels) пользовательский набор меток кадра, который задается в параметрах задания для компонента findface-video-worker и затем присваивается кадру

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

Метод process

Данный метод вызывается, если метод preprocess вернул непустой кортеж или список (’facen’, ‘gender’, ‘age’, ‘emotions’). После того, как компонент findface-sf-api вернул ответ с результатом детекции (см. запрос /detect POST) со всеми запрошенными параметрами лица, компонент findface-facerouter вызывает метод `process плагина для выполнения собственно обработки лица.

Для выполнения обработки лица плагин использует request.ctx.sfapi.

Синтаксис базового метода process, от которого следует наследоваться (см. класс Plugin):

process(self, request: FrHTTPRequest, photo: bytes, bbox: typing.List[int], event_id: int, detection: DetectFace)

Метод shutdown

Данный метод вызывается только перед завершением работы компонента findface-facerouter.

Синтаксис базового метода shutdown, от которого следует наследоваться (см. класс Plugin):

shutdown(self)