onepanel icon indicating copy to clipboard operation
onepanel copied to clipboard

Explore CVAT serverless implementation, and design our knative implementation

Open aleksandrmelnikov opened this issue 4 years ago • 7 comments

Explore CVAT implementation https://github.com/openvinotoolkit/cvat/pull/1767 and https://github.com/openvinotoolkit/cvat/tree/e7585b8ce900cec2c9dd6ef2dc1092e6567780b1/cvat/apps/lambda_manager so we can design our Knative implementation in a way that it is easily pluggable into CVAT.

aleksandrmelnikov avatar Nov 17 '20 18:11 aleksandrmelnikov

CVAT kicks off the serverless piece with an HTTP request (trigger)

  • Right now, each serverless function returns an HTTP response
# GET  /api/v1/lambda/functions - get list of functions
# GET  /api/v1/lambda/functions/<int:fid> - get information about the function
# POST /api/v1/labmda/requests - call a function
# { "function": "<id>", "mode": "online|offline", "job": "<jid>", "frame": "<n>",
#   "points": [...], }
# GET  /api/v1/lambda/requests - get list of requests
# GET  /api/v1/lambda/requests/<int:rid> - get status of the request
# DEL  /api/v1/lambda/requests/<int:rid> - cancel a request (don't delete)

CVAT deploys the functions for Nuclio with deploy.sh.

  • There are functions and configuration files inside serverless

Nuclio, for k8s, converts the code into an image, CRD in k8s, and relevant resources in k8s (ingress, deployment, services)

  • init "context", a shared object
  • main function, takes "context, event"

CVAT has lambda_manager as a django app.

  • There are a couple of functions there, matched to the Routes
  • Some of the routes are used by the UI to list the models that can be executed
  • The offline / online piece is if the serverless should report to the UI or execute just on the server

aleksandrmelnikov avatar Nov 17 '20 19:11 aleksandrmelnikov

@rushtehrani This is the response for the "models" page in CVAT. I deployed all their models via a deploy.sh file they have, running nuclio locally.

Some comments on the fields:

  • id: Not displayed on the models page, used for requests
  • kind: This is the "interactor" or "detector" you see when annotating an image, and selecting a function to annotate that image
  • labels: They pass in all the labels that are supported by the model, used by "Labels" column
  • state: Not rendered in models page
  • description: Models page description
  • framework: Models page column "framework"
  • name: Not rendered in models page

The request is simple GET http://localhost:7000/api/v1/lambda/functions Response:

[
  {
    "id": "openvino.dextr",
    "kind": "interactor",
    "labels": [],
    "state": "ready",
    "description": "Deep Extreme Cut",
    "framework": "openvino",
    "name": "DEXTR"
  },
  {
    "id": "openvino.omz.intel.person-reidentification-retail-0300",
    "kind": "reid",
    "labels": [],
    "state": "ready",
    "description": "Person reidentification model for a general scenario",
    "framework": "openvino",
    "name": "Person reidentification"
  },
  {
    "id": "openvino.omz.intel.text-detection-0004",
    "kind": "detector",
    "labels": [
      "text"
    ],
    "state": "ready",
    "description": "Text detector based on PixelLink architecture with MobileNetV2-like as a backbone for indoor/outdoor scenes.",
    "framework": "openvino",
    "name": "Text detection v4"
  },
  {
    "id": "openvino.omz.public.faster_rcnn_inception_v2_coco",
    "kind": "detector",
    "labels": [
      "person",
      "bicycle",
      "car",
      "motorcycle",
      "airplane",
      "bus",
      "train",
      "truck",
      "boat",
      "traffic_light",
      "fire_hydrant",
      "stop_sign",
      "parking_meter",
      "bench",
      "bird",
      "cat",
      "dog",
      "horse",
      "sheep",
      "cow",
      "elephant",
      "bear",
      "zebra",
      "giraffe",
      "backpack",
      "umbrella",
      "handbag",
      "tie",
      "suitcase",
      "frisbee",
      "skis",
      "snowboard",
      "sports_ball",
      "kite",
      "baseball_bat",
      "baseball_glove",
      "skateboard",
      "surfboard",
      "tennis_racket",
      "bottle",
      "wine_glass",
      "cup",
      "fork",
      "knife",
      "spoon",
      "bowl",
      "banana",
      "apple",
      "sandwich",
      "orange",
      "broccoli",
      "carrot",
      "hot_dog",
      "pizza",
      "donut",
      "cake",
      "chair",
      "couch",
      "potted_plant",
      "bed",
      "dining_table",
      "toilet",
      "tv",
      "laptop",
      "mouse",
      "remote",
      "keyboard",
      "cell_phone",
      "microwave",
      "oven",
      "toaster",
      "sink",
      "refrigerator",
      "book",
      "clock",
      "vase",
      "scissors",
      "teddy_bear",
      "hair_drier",
      "toothbrush"
    ],
    "state": "ready",
    "description": "Faster RCNN inception v2 COCO via Intel OpenVINO toolkit",
    "framework": "openvino",
    "name": "Faster RCNN"
  },
  {
    "id": "openvino.omz.public.mask_rcnn_inception_resnet_v2_atrous_coco",
    "kind": "detector",
    "labels": [
      "person",
      "bicycle",
      "car",
      "motorcycle",
      "airplane",
      "bus",
      "train",
      "truck",
      "boat",
      "traffic_light",
      "fire_hydrant",
      "stop_sign",
      "parking_meter",
      "bench",
      "bird",
      "cat",
      "dog",
      "horse",
      "sheep",
      "cow",
      "elephant",
      "bear",
      "zebra",
      "giraffe",
      "backpack",
      "umbrella",
      "handbag",
      "tie",
      "suitcase",
      "frisbee",
      "skis",
      "snowboard",
      "sports_ball",
      "kite",
      "baseball_bat",
      "baseball_glove",
      "skateboard",
      "surfboard",
      "tennis_racket",
      "bottle",
      "wine_glass",
      "cup",
      "fork",
      "knife",
      "spoon",
      "bowl",
      "banana",
      "apple",
      "sandwich",
      "orange",
      "broccoli",
      "carrot",
      "hot_dog",
      "pizza",
      "donut",
      "cake",
      "chair",
      "couch",
      "potted_plant",
      "bed",
      "dining_table",
      "toilet",
      "tv",
      "laptop",
      "mouse",
      "remote",
      "keyboard",
      "cell_phone",
      "microwave",
      "oven",
      "toaster",
      "sink",
      "refrigerator",
      "book",
      "clock",
      "vase",
      "scissors",
      "teddy_bear",
      "hair_drier",
      "toothbrush"
    ],
    "state": "ready",
    "description": "Mask RCNN inception resnet v2 COCO via Intel OpenVINO",
    "framework": "openvino",
    "name": "Mask RCNN"
  },
  {
    "id": "openvino.omz.public.yolo-v3-tf",
    "kind": "detector",
    "labels": [
      "person",
      "bicycle",
      "car",
      "motorbike",
      "aeroplane",
      "bus",
      "train",
      "truck",
      "boat",
      "traffic light",
      "fire hydrant",
      "stop sign",
      "parking meter",
      "bench",
      "bird",
      "cat",
      "dog",
      "horse",
      "sheep",
      "cow",
      "elephant",
      "bear",
      "zebra",
      "giraffe",
      "backpack",
      "umbrella",
      "handbag",
      "tie",
      "suitcase",
      "frisbee",
      "skis",
      "snowboard",
      "sports ball",
      "kite",
      "baseball bat",
      "baseball glove",
      "skateboard",
      "surfboard",
      "tennis racket",
      "bottle",
      "wine glass",
      "cup",
      "fork",
      "knife",
      "spoon",
      "bowl",
      "banana",
      "apple",
      "sandwich",
      "orange",
      "broccoli",
      "carrot",
      "hot dog",
      "pizza",
      "donut",
      "cake",
      "chair",
      "sofa",
      "pottedplant",
      "bed",
      "diningtable",
      "toilet",
      "tvmonitor",
      "laptop",
      "mouse",
      "remote",
      "keyboard",
      "cell phone",
      "microwave",
      "oven",
      "toaster",
      "sink",
      "refrigerator",
      "book",
      "clock",
      "vase",
      "scissors",
      "teddy bear",
      "hair drier",
      "toothbrush"
    ],
    "state": "ready",
    "description": "YOLO v3 via Intel OpenVINO",
    "framework": "openvino",
    "name": "YOLO v3"
  },
  {
    "id": "openvino.omz.semantic-segmentation-adas-0001",
    "kind": "detector",
    "labels": [
      "road",
      "sidewalk",
      "building",
      "wall",
      "fence",
      "pole",
      "traffic light",
      "traffic sign",
      "vegetation",
      "terrain",
      "sky",
      "person",
      "rider",
      "car",
      "truck",
      "bus",
      "train",
      "motorcycle",
      "bicycle",
      "ego-vehicle",
      "background"
    ],
    "state": "ready",
    "description": "Segmentation network to classify each pixel into typical 20 classes for ADAS",
    "framework": "openvino",
    "name": "Semantic segmentation for ADAS"
  },
  {
    "id": "pth.foolwood.siammask",
    "kind": "tracker",
    "labels": [],
    "state": "ready",
    "description": "Fast Online Object Tracking and Segmentation",
    "framework": "pytorch",
    "name": "SiamMask"
  },
  {
    "id": "tf.faster_rcnn_inception_v2_coco",
    "kind": "detector",
    "labels": [
      "person",
      "bicycle",
      "car",
      "motorcycle",
      "airplane",
      "bus",
      "train",
      "truck",
      "boat",
      "traffic_light",
      "fire_hydrant",
      "stop_sign",
      "parking_meter",
      "bench",
      "bird",
      "cat",
      "dog",
      "horse",
      "sheep",
      "cow",
      "elephant",
      "bear",
      "zebra",
      "giraffe",
      "backpack",
      "umbrella",
      "handbag",
      "tie",
      "suitcase",
      "frisbee",
      "skis",
      "snowboard",
      "sports_ball",
      "kite",
      "baseball_bat",
      "baseball_glove",
      "skateboard",
      "surfboard",
      "tennis_racket",
      "bottle",
      "wine_glass",
      "cup",
      "fork",
      "knife",
      "spoon",
      "bowl",
      "banana",
      "apple",
      "sandwich",
      "orange",
      "broccoli",
      "carrot",
      "hot_dog",
      "pizza",
      "donut",
      "cake",
      "chair",
      "couch",
      "potted_plant",
      "bed",
      "dining_table",
      "toilet",
      "tv",
      "laptop",
      "mouse",
      "remote",
      "keyboard",
      "cell_phone",
      "microwave",
      "oven",
      "toaster",
      "sink",
      "refrigerator",
      "book",
      "clock",
      "vase",
      "scissors",
      "teddy_bear",
      "hair_drier",
      "toothbrush"
    ],
    "state": "ready",
    "description": "Faster RCNN from Tensorflow Object Detection API",
    "framework": "tensorflow",
    "name": "Faster RCNN via Tensorflow"
  },
  {
    "id": "tf.matterport.mask_rcnn",
    "kind": "detector",
    "labels": [
      "BG",
      "person",
      "bicycle",
      "car",
      "motorcycle",
      "airplane",
      "bus",
      "train",
      "truck",
      "boat",
      "traffic_light",
      "fire_hydrant",
      "stop_sign",
      "parking_meter",
      "bench",
      "bird",
      "cat",
      "dog",
      "horse",
      "sheep",
      "cow",
      "elephant",
      "bear",
      "zebra",
      "giraffe",
      "backpack",
      "umbrella",
      "handbag",
      "tie",
      "suitcase",
      "frisbee",
      "skis",
      "snowboard",
      "sports_ball",
      "kite",
      "baseball_bat",
      "baseball_glove",
      "skateboard",
      "surfboard",
      "tennis_racket",
      "bottle",
      "wine_glass",
      "cup",
      "fork",
      "knife",
      "spoon",
      "bowl",
      "banana",
      "apple",
      "sandwich",
      "orange",
      "broccoli",
      "carrot",
      "hot_dog",
      "pizza",
      "donut",
      "cake",
      "chair",
      "couch",
      "potted_plant",
      "bed",
      "dining_table",
      "toilet",
      "tv",
      "laptop",
      "mouse",
      "remote",
      "keyboard",
      "cell_phone",
      "microwave",
      "oven",
      "toaster",
      "sink",
      "refrigerator",
      "book",
      "clock",
      "vase",
      "scissors",
      "teddy_bear",
      "hair_drier",
      "toothbrush"
    ],
    "state": "ready",
    "description": "An implementation of Mask RCNN on Python 3, Keras, and TensorFlow.\n",
    "framework": "tensorflow",
    "name": "Mask RCNN via Tensorflow"
  }
]

aleksandrmelnikov avatar Nov 18 '20 18:11 aleksandrmelnikov

@aleksandrmelnikov how are things like labels, kind, framework, etc stored? Are they actually coming from the wrapper code for each model?

rushtehrani avatar Nov 18 '20 21:11 rushtehrani

They are actually stored via function.yaml file for each model. For example: serverless/tensorflow/matterport/mask_rcnn/nuclio/function.yaml

They store the information via metadata in the spec, and they load it inside main.py, inside the init_context function.

Example yaml:

metadata:
  name: tf.matterport.mask_rcnn
  namespace: cvat
  annotations:
    name: Mask RCNN via Tensorflow
    type: detector
    framework: tensorflow
    spec: |
      [
        { "id": 0, "name": "BG" },
        { "id": 1, "name": "person" },
        { "id": 2, "name": "bicycle" },
        { "id": 3, "name": "car" },
        { "id": 4, "name": "motorcycle" },
        { "id": 5, "name": "airplane" },
        { "id": 6, "name": "bus" },
        { "id": 7, "name": "train" },
        { "id": 8, "name": "truck" },
        { "id": 9, "name": "boat" },
        { "id": 10, "name": "traffic_light" },
        { "id": 11, "name": "fire_hydrant" },
        { "id": 12, "name": "stop_sign" },
        { "id": 13, "name": "parking_meter" },
        { "id": 14, "name": "bench" },
        { "id": 15, "name": "bird" },
        { "id": 16, "name": "cat" },
        { "id": 17, "name": "dog" },
        { "id": 18, "name": "horse" },
        { "id": 19, "name": "sheep" },
        { "id": 20, "name": "cow" },
        { "id": 21, "name": "elephant" },
        { "id": 22, "name": "bear" },
        { "id": 23, "name": "zebra" },
        { "id": 24, "name": "giraffe" },
        { "id": 25, "name": "backpack" },
        { "id": 26, "name": "umbrella" },
        { "id": 27, "name": "handbag" },
        { "id": 28, "name": "tie" },
        { "id": 29, "name": "suitcase" },
        { "id": 30, "name": "frisbee" },
        { "id": 31, "name": "skis" },
        { "id": 32, "name": "snowboard" },
        { "id": 33, "name": "sports_ball" },
        { "id": 34, "name": "kite" },
        { "id": 35, "name": "baseball_bat" },
        { "id": 36, "name": "baseball_glove" },
        { "id": 37, "name": "skateboard" },
        { "id": 38, "name": "surfboard" },
        { "id": 39, "name": "tennis_racket" },
        { "id": 40, "name": "bottle" },
        { "id": 41, "name": "wine_glass" },
        { "id": 42, "name": "cup" },
        { "id": 43, "name": "fork" },
        { "id": 44, "name": "knife" },
        { "id": 45, "name": "spoon" },
        { "id": 46, "name": "bowl" },
        { "id": 47, "name": "banana" },
        { "id": 48, "name": "apple" },
        { "id": 49, "name": "sandwich" },
        { "id": 50, "name": "orange" },
        { "id": 51, "name": "broccoli" },
        { "id": 52, "name": "carrot" },
        { "id": 53, "name": "hot_dog" },
        { "id": 54, "name": "pizza" },
        { "id": 55, "name": "donut" },
        { "id": 56, "name": "cake" },
        { "id": 57, "name": "chair" },
        { "id": 58, "name": "couch" },
        { "id": 59, "name": "potted_plant" },
        { "id": 60, "name": "bed" },
        { "id": 61, "name": "dining_table" },
        { "id": 62, "name": "toilet" },
        { "id": 63, "name": "tv" },
        { "id": 64, "name": "laptop" },
        { "id": 65, "name": "mouse" },
        { "id": 66, "name": "remote" },
        { "id": 67, "name": "keyboard" },
        { "id": 68, "name": "cell_phone" },
        { "id": 69, "name": "microwave" },
        { "id": 70, "name": "oven" },
        { "id": 71, "name": "toaster" },
        { "id": 72, "name": "sink" },
        { "id": 73, "name": "refrigerator" },
        { "id": 74, "name": "book" },
        { "id": 75, "name": "clock" },
        { "id": 76, "name": "vase" },
        { "id": 77, "name": "scissors" },
        { "id": 78, "name": "teddy_bear" },
        { "id": 79, "name": "hair_drier" },
        { "id": 80, "name": "toothbrush" }
      ]

spec:
  description: |
    An implementation of Mask RCNN on Python 3, Keras, and TensorFlow.

  runtime: "python:3.6"
  handler: main:handler
  eventTimeout: 30s
  env:
    - name: MASK_RCNN_DIR
      value: /opt/nuclio/Mask_RCNN
  build:
    image: cvat/tf.matterport.mask_rcnn
    baseImage: tensorflow/tensorflow:2.1.0-py3
    directives:
      postCopy:
      - kind: WORKDIR
        value: /opt/nuclio
      - kind: RUN
        value: apt update && apt install --no-install-recommends -y git curl libsm6 libxext6 libxrender-dev
      - kind: RUN
        value: git clone https://github.com/matterport/Mask_RCNN.git
      - kind: RUN
        value: curl -L https://github.com/matterport/Mask_RCNN/releases/download/v2.0/mask_rcnn_coco.h5 -o Mask_RCNN/mask_rcnn_coco.h5
      - kind: RUN
        value: pip3 install -r Mask_RCNN/requirements.txt
      - kind: RUN
        value: pip3 install pycocotools tensorflow==1.13.1 keras==2.1.0 pillow pyyaml

  triggers:
    myHttpTrigger:
      maxWorkers: 2
      kind: "http"
      workerAvailabilityTimeoutMilliseconds: 10000
      attributes:
        maxRequestBodySize: 33554432 # 32MB

  platform:
    attributes:
      restartPolicy:
        name: always
        maximumRetryCount: 3

aleksandrmelnikov avatar Nov 18 '20 21:11 aleksandrmelnikov

Example structure: image

aleksandrmelnikov avatar Nov 18 '20 21:11 aleksandrmelnikov

These were investigated from create new task -> actions -> automatic annotation

Kick off serverless function. http://localhost:7000/api/v1/lambda/requests POST /api/v1/lambda/requests JSON Payload

/* Request */
{
  "threshold": 0.5,
  "max_distance": 50,
  "task": 1,
  "function": "openvino.omz.intel.person-reidentification-retail-0300"
}

/* Response */
{
  "id": "6dd018f2-64fa-4c8f-948b-121c92be4bd1",
  "function": {
    "id": "openvino.omz.intel.person-reidentification-retail-0300",
    "threshold": 0.5,
    "task": 1
  },
  "status": "queued",
  "progress": 0,
  "enqueued": "2020-11-18T19:05:49.161191",
  "started": null,
  "ended": null,
  "exc_info": null
}

Status and progress check on the serverless execution.

GET http://localhost:7000/api/v1/lambda/requests/6dd018f2-64fa-4c8f-948b-121c92be4bd1
{
  "id": "6dd018f2-64fa-4c8f-948b-121c92be4bd1",
  "function": {
    "id": "openvino.omz.intel.person-reidentification-retail-0300",
    "threshold": 0.5,
    "task": 1
  },
  "status": "finished", //queued, started, finished
  "progress": 100, //starts with 0, goes to 100
  "enqueued": "2020-11-18T19:05:49.161191",
  "started": "2020-11-18T19:05:49.174984",
  "ended": "2020-11-18T19:05:49.313751",
  "exc_info": null
}

Cancelling a serverless execution

DELETE /api/v1/lambda/requests/f73af3f3-bb09-4afb-9ad7-fc0084af9781

Returns 204 No Content

aleksandrmelnikov avatar Nov 18 '20 21:11 aleksandrmelnikov

Recording request and responses for annotation kicked off from annotation page (of a given task).

Request

POST http://localhost:8080/api/v1/lambda/functions/openvino-mask-rcnn-inception-resnet-v2-atrous-coco

Body

{
  "mapping": {
    "person": "person",
    "car": "car"
  },
  "cleanup": false, //deletes task data from database
  "frame": 0,
  "task": 1
}
POST http://localhost:8080/api/v1/lambda/functions/openvino-omz-intel-text-detection-0004

Body

{
  "mapping": {
    "text": "person"
  },
  "cleanup": false,
  "frame": 0,
  "task": 1
}

Response

[
  {
    "confidence": null,
    "label": "person",
    "points": [
      496,
      132,
      531,
      132,
      531,
      142,
      496,
      142
    ],
    "type": "polygon"
  },
  {
    "confidence": null,
    "label": "person",
    "points": [
      528,
      210,
      555,
      210,
      555,
      224,
      528,
      224
    ],
    "type": "polygon"
  },
  //...continues...
]

Request

POST http://localhost:8080/api/v1/lambda/functions/openvino-omz-public-faster_rcnn_inception_v2_coco

Body

{
  "mapping": {
    "person": "person",
    "car": "car"
  },
  "cleanup": false,
  "frame": 0,
  "task": 1
}

Response

[
  {
    "confidence": "0.99303883",
    "label": "person",
    "points": [
      1176.3516235351562,
      374.1847229003906,
      1280.0,
      699.4732475280762
    ],
    "type": "rectangle"
  },
  {
    "confidence": "0.98096424",
    "label": "person",
    "points": [
      83.2307243347168,
      359.85846519470215,
      198.68478775024414,
      662.8982162475586
    ],
    "type": "rectangle"
  }
  //...
]

Request

POST http://localhost:8080/api/v1/lambda/functions/openvino-omz-public-yolo-v3-tf
{
  "mapping": {
    "person": "person",
    "car": "car"
  },
  "cleanup": false,
  "frame": 0,
  "task": 1
}

Response

[
  {
    "confidence": "0.99985194",
    "label": "person",
    "points": [
      61,
      344,
      217,
      670
    ],
    "type": "rectangle"
  },
  {
    "confidence": "0.9997302",
    "label": "person",
    "points": [
      849,
      354,
      1061,
      720
    ],
    "type": "rectangle"
  }
  //...
]

Request

POST http://localhost:8080/api/v1/lambda/functions/openvino-omz-semantic-segmentation-adas-0001
{
  "mapping": {
    "person": "person",
    "car": "car"
  },
  "cleanup": false,
  "frame": 0,
  "task": 1
}

Response

[
  {
    "confidence": null,
    "label": "person",
    "points": [
      0.0,
      323.37236285124135,
      6.0,
      324.0474398505345,
      15.0,
      312.00384387108494,
      20.0,
      311.0982009090489,
      30.0,
      322.080764686252,
      40.0,
      314.0945640011426,
      50.0,
      315.0491316160951,
      60.0,
      328.34740633562683,
      73.04631569391837,
      321.0,
      80.0,
      311.1112883342544,
      90.0,
      320.3486430694041,
      94.0,
      307.0201630502398,
      105.0,
      310.0227706337829,
      110.0,
      317.0251536983245,
      120.0,
      311.09508015085714,
      132.494829009255,
      312.0,
      150.0,
      307.0128049933534,
      156.98935181762772,
      315.0,
      159.0,
      331.0842018812,
      172.0,
      318.55084849423577,
      182.0,
      316.06506673666183,
      190.67774707788055,
      332.0,
      199.0,
      333.1516860066772,
      209.0,
      325.35884974491347,
      231.0,
      324.0506705816824,
      239.02297941787285,
      304.0,
      250.0,
      297.10454904961733,
      260.6684635517673,
      313.0,
      277.68845747767904,
      323.0,
      296.0,
      317.0183710297214,
      301.0,
      306.59491616867854,
      319.0,
      307.08144052685134,
      331.94103217703014,
      316.0,
      343.0,
      331.0726127529786,
      350.0757518263273,
      331.0,
      359.0,
      315.25797276182834,
      368.0,
      317.0117430921824,
      375.0,
      329.0462554779512,
      404.0,
      310.02247539566923,
      415.0,
      312.4455892753989,
      428.0,
      324.04767394694977,
      445.0,
      314.0945640011426,
      461.0,
      314.0849363832643,
      471.0,
      308.4651703698857,
      484.0,
      316.12599086164903,
      505.0,
      319.0545221374546,
      528.0,
      313.52408225677027,
      550.0,
      319.0900326085039,
      576.0,
      312.0088626333916,
      628.0,
      316.10284709862407,
      642.0,
      307.0320390882156,
      658.0,
      313.0383187096331,
      694.0,
      301.2618609651209,
      714.0,
      302.1594923954951,
      729.0,
      287.3053112685377,
      754.0,
      292.14905146947785,
      772.0,
      287.079127770434,
      788.0,
      287.5540832648252,
      799.0,
      295.1567198469649,
      804.0,
      288.06639523736555,
      822.0,
      288.1418354820172,
      829.0,
      281.03676724827875,
      831.0,
      284.01719323093164,
      838.0,
      281.0283968255487,
      863.0,
      285.1049240938825,
      868.0,
      275.06743184072565,
      879.0,
      282.1023008393633,
      898.0,
      281.0743777913505,
      911.0,
      274.0102790191164,
      934.0,
      284.04028249934066,
      938.0,
      276.0921489779281,
      943.0,
      276.0908430935164,
      944.9886432930049,
      279.0,
      938.0,
      288.07953746229254,
      958.0,
      288.1256184498406,
      964.0,
      276.0186700565305,
      976.0,
      283.0408561949083,
      989.0,
      278.3350249308497,
      1027.0,
      288.1418354820172,
      1050.0,
      283.16421718096063,
      1049.0211426102305,
      278.0,
      1054.0,
      274.00917291257224,
      1057.7679326741975,
      284.0,
      1076.0,
      281.01218381599904,
      1085.0,
      284.037867207903,
      1089.0,
      281.01088333135954,
      1095.8480959069284,
      288.0,
      1106.0,
      290.6108268456344,
      1107.0,
      305.40559189265895,
      1110.0,
      307.1118507747409,
      1120.5099102053518,
      285.0,
      1131.0,
      278.12004829065535,
      1135.3977600890803,
      283.0,
      1128.8712204679641,
      284.0,
      1126.9446128703871,
      291.0,
      1137.0,
      292.102884668471,
      1145.9832256890882,
      304.0,
      1132.8949558637546,
      310.0,
      1126.9510378657465,
      333.0,
      1140.9442632599732,
      366.0,
      1139.0,
      369.89451412645786,
      1129.0,
      367.48427734725595,
      1127.9797654671972,
      381.0,
      1132.9943118357103,
      397.0,
      1124.8850799165436,
      407.0,
      1123.3905951373736,
      420.0,
      1113.7858082079847,
      422.0,
      1109.8670001252606,
      432.0,
      1106.9129402826734,
      490.0,
      1111.0,
      495.0173565216377,
      1147.0,
      497.02181807038977,
      1164.0,
      506.01106013026066,
      1179.0,
      522.0475830583266,
      1188.003492593912,
      445.0,
      1183.014346038191,
      390.0,
      1189.092902282544,
      384.0,
      1177.0644757566283,
      377.0,
      1173.0146811187192,
      352.0,
      1187.10297640843,
      327.0,
      1184.0261863397004,
      311.0,
      1190.0,
      308.05909303028216,
      1199.1221619262933,
      312.0,
      1203.0121486702901,
      292.0,
      1201.001135134162,
      282.0,
      1209.0,
      280.0856100641939,
      1208.7395762108913,
      294.0,
      1219.0,
      295.01689906365664,
      1239.0,
      323.18907329811844,
      1244.0,
      320.0713265237664,
      1246.9324869216975,
      323.0,
      1251.8820231451618,
      332.0,
      1254.8356035999204,
      356.0,
      1258.8434430712487,
      360.0,
      1265.0,
      357.09284142137903,
      1268.0,
      348.02790104589263,
      1269.0,
      354.2320348768142,
      1274.0,
      351.08694218918197,
      1279.0,
      357.096503035196
    ],
    "type": "polygon"
  },
  {
    "confidence": null,
    "label": "person",
    "points": [
      1034.7221559550428,
      330.0,
      1044.3403315205298,
      315.0,
      1026.952746453593,
      319.0,
      1027.8689252091986,
      325.0,
      1034.7221559550428,
      330.0
    ],
    "type": "polygon"
  },
  //...
]

Request

POST http://localhost:8080/api/v1/lambda/functions/openvino.omz.intel.text-detection-0004
{
  "mapping": {
    "text": "car"
  },
  "cleanup": false,
  "frame": 0,
  "task": 1
}
POST http://localhost:8080/api/v1/lambda/functions/openvino.omz.public.faster_rcnn_inception_v2_coco
{
  "mapping": {
    "person": "person",
    "car": "car"
  },
  "cleanup": false,
  "frame": 0,
  "task": 1
}
POST http://localhost:8080/api/v1/lambda/functions/openvino.omz.public.mask_rcnn_inception_resnet_v2_atrous_coco
{
  "mapping": {
    "person": "person",
    "car": "car"
  },
  "cleanup": false,
  "frame": 0,
  "task": 1
}
POST http://localhost:8080/api/v1/lambda/functions/openvino.omz.public.yolo-v3-tf
{
  "mapping": {
    "person": "person",
    "car": "car"
  },
  "cleanup": false,
  "frame": 0,
  "task": 1
}
POST http://localhost:8080/api/v1/lambda/functions/openvino.omz.semantic-segmentation-adas-0001
{
  "mapping": {
    "person": "person",
    "car": "car"
  },
  "cleanup": false,
  "frame": 0,
  "task": 1
}
POST http://localhost:8080/api/v1/lambda/functions/tf-faster-rcnn-inception-v2-coco
{
  "mapping": {
    "person": "person",
    "car": "car"
  },
  "cleanup": false,
  "frame": 0,
  "task": 1
}

Response

[
  {
    "confidence": "0.9955258",
    "label": "person",
    "points": [
      852.5807189941406,
      373.9480447769165,
      1062.0193481445312,
      713.2855939865112
    ],
    "type": "rectangle"
  },
  {
    "confidence": "0.9941553",
    "label": "person",
    "points": [
      1175.0753784179688,
      370.0285005569458,
      1280.0,
      695.2166891098022
    ],
    "type": "rectangle"
  }//...
]
POST http://localhost:8080/api/v1/lambda/functions/tf-matterport-mask-rcnn
{
  "mapping": {
    "person": "person",
    "car": "car"
  },
  "cleanup": false,
  "frame": 0,
  "task": 1
}
POST http://localhost:8080/api/v1/lambda/functions/tf.faster_rcnn_inception_v2_coco
{
  "mapping": {
    "person": "person",
    "car": "car"
  },
  "cleanup": false,
  "frame": 0,
  "task": 1
}
POST http://localhost:8080/api/v1/lambda/functions/tf.matterport.mask_rcnn
{
  "mapping": {
    "person": "person",
    "car": "car"
  },
  "cleanup": false,
  "frame": 0,
  "task": 1
}

Tracker across frames

POST http://localhost:8080/api/v1/lambda/functions/pth-foolwood-siammask
{
  "task": 1,
  "frame": 0,
  "shape": [
    1045.1845703125,
    487.4638671875,
    1230.0082702636719,
    714.9391784667969
  ]
}

Response

{
  "shape": [
    1045.1845703125,
    487.4638671875,
    1230.0082702636719,
    714.9391784667969
  ],
  "state": {
    "im_h": "720",
    "im_w": "1280",
    "p": "{\"py/object\": \"utils.tracker_config.TrackerConfig\", \"instance_size\": 255, \"base_size\": 8, \"out_size\": 127, \"seg_thr\": 0.35, \"penalty_k\": 0.04, \"window_influence\": 0.4, \"lr\": 1.0, \"total_stride\": 8, \"ratios\": [0.33, 0.5, 1, 2, 3], \"scales\": [8], \"round_dight\": 0, \"score_size\": 25, \"anchor_num\": 5, \"anchor\": {\"py/reduce\": [{\"py/function\": \"numpy.core.multiarray._reconstruct\"}, {\"py/tuple\": [{\"py/type\": \"numpy.ndarray\"}, {\"py/tuple\": [0]}, {\"py/b64\": \"Yg==\"}]}, {\"py/tuple\": [1, {\"py/tuple\": [3125, 4]}, {\"py/reduce\": [{\"py/type\": \"numpy.dtype\"}, {\"py/tuple\": [\"f4\", 0, 1]}, {\"py/tuple\": [3, \"<\", null, null, null, -1, -1, 0]}]}, false, {\"py/b64\": \"<giant_base_64_string_of_image>\"}]}]}}",
    "avg_chans": "{\"py/reduce\": [{\"py/function\": \"numpy.core.multiarray._reconstruct\"}, {\"py/tuple\": [{\"py/type\": \"numpy.ndarray\"}, {\"py/tuple\": [0]}, {\"py/b64\": \"Yg==\"}]}, {\"py/tuple\": [1, {\"py/tuple\": [3]}, {\"py/reduce\": [{\"py/type\": \"numpy.dtype\"}, {\"py/tuple\": [\"f8\", 0, 1]}, {\"py/tuple\": [3, \"<\", null, null, null, -1, -1, 0]}]}, false, {\"py/b64\": \"vZp4VqhsWUDiWdFINI1YQN+8mnhi1FlA\"}]}]}",
    "window": "{\"py/reduce\": [{\"py/function\": \"numpy.core.multiarray._reconstruct\"}, {\"py/tuple\": [{\"py/type\": \"numpy.ndarray\"}, {\"py/tuple\": [0]}, {\"py/b64\": \"Yg==\"}]}, {\"py/tuple\": [1, {\"py/tuple\": [3125]}, {\"py/reduce\": [{\"py/type\": \"numpy.dtype\"}, {\"py/tuple\": [\"f8\", 0, 1]}, {\"py/tuple\": [3, \"<\", null, null, null, -1, -1, 0]}]}, false, {\"py/b64\": \"<base_64_image\"}]}]}",
    "target_pos": "{\"py/reduce\": [{\"py/function\": \"numpy.core.multiarray._reconstruct\"}, {\"py/tuple\": [{\"py/type\": \"numpy.ndarray\"}, {\"py/tuple\": [0]}, {\"py/b64\": \"Yg==\"}]}, {\"py/tuple\": [1, {\"py/tuple\": [2]}, {\"py/reduce\": [{\"py/type\": \"numpy.dtype\"}, {\"py/tuple\": [\"f8\", 0, 1]}, {\"py/tuple\": [3, \"<\", null, null, null, -1, -1, 0]}]}, false, {\"py/b64\": \"AAAAvGLGkUAAAAC4nMmCQA==\"}]}]}",
    "target_sz": "{\"py/reduce\": [{\"py/function\": \"numpy.core.multiarray._reconstruct\"}, {\"py/tuple\": [{\"py/type\": \"numpy.ndarray\"}, {\"py/tuple\": [0]}, {\"py/b64\": \"Yg==\"}]}, {\"py/tuple\": [1, {\"py/tuple\": [2]}, {\"py/reduce\": [{\"py/type\": \"numpy.dtype\"}, {\"py/tuple\": [\"f8\", 0, 1]}, {\"py/tuple\": [3, \"<\", null, null, null, -1, -1, 0]}]}, false, {\"py/b64\": \"AAAAwFsaZ0AAAADANW9sQA==\"}]}]}",
    "net.zf": "{\"py/reduce\": [{\"py/function\": \"torch._utils._rebuild_tensor_v2\"}, {\"py/tuple\": [{\"py/reduce\": [{\"py/function\": \"torch.storage._load_from_bytes\"}, {\"py/tuple\": [{\"py/b64\": \"<base_64_image>\"}]}]}, 64, {\"py/tuple\": [1, 256, 7, 7]}, {\"py/tuple\": [57600, 225, 15, 1]}, true, null]}]}"
  }
}
POST http://localhost:8080/api/v1/lambda/functions/pth-foolwood-siammask
{
  "task": 1,
  "frame": 2,
  "state": {
    "im_h": "720",
    "im_w": "1280",
    "p": "{\"py/object\": \"utils.tracker_config.TrackerConfig\", \"instance_size\": 255, \"base_size\": 8, \"out_size\": 127, \"seg_thr\": 0.35, \"penalty_k\": 0.04, \"window_influence\": 0.4, \"lr\": 1.0, \"total_stride\": 8, \"ratios\": [0.33, 0.5, 1, 2, 3], \"scales\": [8], \"round_dight\": 0, \"score_size\": 25, \"anchor_num\": 5, \"anchor\": {\"py/reduce\": [{\"py/function\": \"numpy.core.multiarray._reconstruct\"}, {\"py/tuple\": [{\"py/type\": \"numpy.ndarray\"}, {\"py/tuple\": [0]}, {\"py/b64\": \"Yg==\"}]}, {\"py/tuple\": [1, {\"py/tuple\": [3125, 4]}, {\"py/reduce\": [{\"py/type\": \"numpy.dtype\"}, {\"py/tuple\": [\"f4\", 0, 1]}, {\"py/tuple\": [3, \"<\", null, null, null, -1, -1, 0]}]}, false, {\"py/b64\": \"=\"}]}]}}",
    "avg_chans": "{\"py/reduce\": [{\"py/function\": \"numpy.core.multiarray._reconstruct\"}, {\"py/tuple\": [{\"py/type\": \"numpy.ndarray\"}, {\"py/tuple\": [0]}, {\"py/b64\": \"Yg==\"}]}, {\"py/tuple\": [1, {\"py/tuple\": [3]}, {\"py/reduce\": [{\"py/type\": \"numpy.dtype\"}, {\"py/tuple\": [\"f8\", 0, 1]}, {\"py/tuple\": [3, \"<\", null, null, null, -1, -1, 0]}]}, false, {\"py/b64\": \"vZp4VqhsWUDiWdFINI1YQN+8mnhi1FlA\"}]}]}",
    "window": "{\"py/reduce\": [{\"py/function\": \"numpy.core.multiarray._reconstruct\"}, {\"py/tuple\": [{\"py/type\": \"numpy.ndarray\"}, {\"py/tuple\": [0]}, {\"py/b64\": \"Yg==\"}]}, {\"py/tuple\": [1, {\"py/tuple\": [3125]}, {\"py/reduce\": [{\"py/type\": \"numpy.dtype\"}, {\"py/tuple\": [\"f8\", 0, 1]}, {\"py/tuple\": [3, \"<\", null, null, null, -1, -1, 0]}]}, false, {\"py/b64\": \"==\"}]}]}",
    "target_pos": "{\"py/reduce\": [{\"py/function\": \"numpy.core.multiarray._reconstruct\"}, {\"py/tuple\": [{\"py/type\": \"numpy.ndarray\"}, {\"py/tuple\": [0]}, {\"py/b64\": \"Yg==\"}]}, {\"py/tuple\": [1, {\"py/tuple\": [2]}, {\"py/reduce\": [{\"py/type\": \"numpy.dtype\"}, {\"py/tuple\": [\"f8\", 0, 1]}, {\"py/tuple\": [3, \"<\", null, null, null, -1, -1, 0]}]}, false, {\"py/b64\": \"AACAJhRzkUAAAKC2uuWCQA==\"}]}]}",
    "target_sz": "{\"py/reduce\": [{\"py/function\": \"numpy.core.multiarray._reconstruct\"}, {\"py/tuple\": [{\"py/type\": \"numpy.ndarray\"}, {\"py/tuple\": [0]}, {\"py/b64\": \"Yg==\"}]}, {\"py/tuple\": [1, {\"py/tuple\": [2]}, {\"py/reduce\": [{\"py/type\": \"numpy.dtype\"}, {\"py/tuple\": [\"f8\", 0, 1]}, {\"py/tuple\": [3, \"<\", null, null, null, -1, -1, 0]}]}, false, {\"py/b64\": \"4C/1Ka6AZkDg3/zEX2RtQA==\"}]}]}",
    "score": "{\"py/reduce\": [{\"py/function\": \"numpy.core.multiarray.scalar\"}, {\"py/tuple\": [{\"py/reduce\": [{\"py/type\": \"numpy.dtype\"}, {\"py/tuple\": [\"f4\", 0, 1]}, {\"py/tuple\": [3, \"<\", null, null, null, -1, -1, 0]}]}, {\"py/b64\": \"Nv5/Pw==\"}]}]}",
    "ploygon": "{\"py/reduce\": [{\"py/function\": \"numpy.core.multiarray._reconstruct\"}, {\"py/tuple\": [{\"py/type\": \"numpy.ndarray\"}, {\"py/tuple\": [0]}, {\"py/b64\": \"Yg==\"}]}, {\"py/tuple\": [1, {\"py/tuple\": [4, 2]}, {\"py/reduce\": [{\"py/type\": \"numpy.dtype\"}, {\"py/tuple\": [\"f4\", 0, 1]}, {\"py/tuple\": [3, \"<\", null, null, null, -1, -1, 0]}]}, false, {\"py/b64\": \"0X6XRJpNM0SFHYFEVvwyRJdRgUQkP/ND47KXRKzh80M=\"}]}]}",
    "net.zf": "{\"py/reduce\": [{\"py/function\": \"torch._utils._rebuild_tensor_v2\"}, {\"py/tuple\": [{\"py/reduce\": [{\"py/function\": \"torch.storage._load_from_bytes\"}, {\"py/tuple\": [{\"py/b64\": \"===\"}]}]}, 64, {\"py/tuple\": [1, 256, 7, 7]}, {\"py/tuple\": [57600, 225, 15, 1]}, true, null]}]}"
  }
}

Response

{
  "shape": [
    1190.830078125,
    718.5213012695312,
    1016.8630981445312,
    716.9252319335938,
    1018.958984375,
    488.47662353515625,
    1192.926025390625,
    490.07269287109375
  ],
  "state": {
    "im_h": "720",
    "im_w": "1280",
    "p": "{\"py/object\": \"utils.tracker_config.TrackerConfig\", \"instance_size\": 255, \"base_size\": 8, \"out_size\": 127, \"seg_thr\": 0.35, \"penalty_k\": 0.04, \"window_influence\": 0.4, \"lr\": 1.0, \"total_stride\": 8, \"ratios\": [0.33, 0.5, 1, 2, 3], \"scales\": [8], \"round_dight\": 0, \"score_size\": 25, \"anchor_num\": 5, \"anchor\": {\"py/reduce\": [{\"py/function\": \"numpy.core.multiarray._reconstruct\"}, {\"py/tuple\": [{\"py/type\": \"numpy.ndarray\"}, {\"py/tuple\": [0]}, {\"py/b64\": \"Yg==\"}]}, {\"py/tuple\": [1, {\"py/tuple\": [3125, 4]}, {\"py/reduce\": [{\"py/type\": \"numpy.dtype\"}, {\"py/tuple\": [\"f4\", 0, 1]}, {\"py/tuple\": [3, \"<\", null, null, null, -1, -1, 0]}]}, false, {\"py/b64\": \"=\"}]}]}}",
    "avg_chans": "{\"py/reduce\": [{\"py/function\": \"numpy.core.multiarray._reconstruct\"}, {\"py/tuple\": [{\"py/type\": \"numpy.ndarray\"}, {\"py/tuple\": [0]}, {\"py/b64\": \"Yg==\"}]}, {\"py/tuple\": [1, {\"py/tuple\": [3]}, {\"py/reduce\": [{\"py/type\": \"numpy.dtype\"}, {\"py/tuple\": [\"f8\", 0, 1]}, {\"py/tuple\": [3, \"<\", null, null, null, -1, -1, 0]}]}, false, {\"py/b64\": \"vZp4VqhsWUDiWdFINI1YQN+8mnhi1FlA\"}]}]}",
    "window": "{\"py/reduce\": [{\"py/function\": \"numpy.core.multiarray._reconstruct\"}, {\"py/tuple\": [{\"py/type\": \"numpy.ndarray\"}, {\"py/tuple\": [0]}, {\"py/b64\": \"Yg==\"}]}, {\"py/tuple\": [1, {\"py/tuple\": [3125]}, {\"py/reduce\": [{\"py/type\": \"numpy.dtype\"}, {\"py/tuple\": [\"f8\", 0, 1]}, {\"py/tuple\": [3, \"<\", null, null, null, -1, -1, 0]}]}, false, {\"py/b64\": \"==\"}]}]}",
    "target_pos": "{\"py/reduce\": [{\"py/function\": \"numpy.core.multiarray._reconstruct\"}, {\"py/tuple\": [{\"py/type\": \"numpy.ndarray\"}, {\"py/tuple\": [0]}, {\"py/b64\": \"Yg==\"}]}, {\"py/tuple\": [1, {\"py/tuple\": [2]}, {\"py/reduce\": [{\"py/type\": \"numpy.dtype\"}, {\"py/tuple\": [\"f8\", 0, 1]}, {\"py/tuple\": [3, \"<\", null, null, null, -1, -1, 0]}]}, false, {\"py/b64\": \"AAAAv+kvkUAAAJCe+OeCQA==\"}]}]}",
    "target_sz": "{\"py/reduce\": [{\"py/function\": \"numpy.core.multiarray._reconstruct\"}, {\"py/tuple\": [{\"py/type\": \"numpy.ndarray\"}, {\"py/tuple\": [0]}, {\"py/b64\": \"Yg==\"}]}, {\"py/tuple\": [1, {\"py/tuple\": [2]}, {\"py/reduce\": [{\"py/type\": \"numpy.dtype\"}, {\"py/tuple\": [\"f8\", 0, 1]}, {\"py/tuple\": [3, \"<\", null, null, null, -1, -1, 0]}]}, false, {\"py/b64\": \"dp3rDXpSZkBVSUusLz1tQA==\"}]}]}",
    "score": "{\"py/reduce\": [{\"py/function\": \"numpy.core.multiarray.scalar\"}, {\"py/tuple\": [{\"py/reduce\": [{\"py/type\": \"numpy.dtype\"}, {\"py/tuple\": [\"f4\", 0, 1]}, {\"py/tuple\": [3, \"<\", null, null, null, -1, -1, 0]}]}, {\"py/b64\": \"bPh/Pw==\"}]}]}",
    "ploygon": "{\"py/reduce\": [{\"py/function\": \"numpy.core.multiarray._reconstruct\"}, {\"py/tuple\": [{\"py/type\": \"numpy.ndarray\"}, {\"py/tuple\": [0]}, {\"py/b64\": \"Yg==\"}]}, {\"py/tuple\": [1, {\"py/tuple\": [4, 2]}, {\"py/reduce\": [{\"py/type\": \"numpy.dtype\"}, {\"py/tuple\": [\"f4\", 0, 1]}, {\"py/tuple\": [3, \"<\", null, null, null, -1, -1, 0]}]}, false, {\"py/b64\": \"kNqURF2hM0Q9N35ENzszRGC9fkQCPfRDoh2VRE4J9UM=\"}]}]}",
    "net.zf": "{\"py/reduce\": [{\"py/function\": \"torch._utils._rebuild_tensor_v2\"}, {\"py/tuple\": [{\"py/reduce\": [{\"py/function\": \"torch.storage._load_from_bytes\"}, {\"py/tuple\": [{\"py/b64\": \"==\"}]}]}, 64, {\"py/tuple\": [1, 256, 7, 7]}, {\"py/tuple\": [57600, 225, 15, 1]}, true, null]}]}"
  }
}

Request

POST http://localhost:8080/api/v1/lambda/functions/openvino-dextr
{
  "frame": 1,
  "points": [
    [
      741.5517578125,
      713.9072265625
    ],
    [
      697.884765625,
      585.9521484375
    ],
    [
      732.412109375,
      508.7724609375
    ],
    [
      665.3876953125,
      459.0126953125
    ]
  ],
  "task": 1
}

Response

[
  [
    708,
    530
  ],
  [
    707,
    530
  ],
  [
    705,
    534
  ],
  //...
]

Request

POST http://localhost:8080/api/v1/lambda/functions/pth-saic-vul-fbrs
{
  "frame": 1,
  "points": [
    [
      781.15625,
      580.8740234375
    ],
    [
      771.0009765625,
      382.8486328125
    ]
  ],
  "task": 1
}

aleksandrmelnikov avatar Nov 19 '20 21:11 aleksandrmelnikov