Operações de Análise Espacial

Importante

Em 30 de março de 2025, a Análise Espacial da Visão de IA do Azure será desativada. Faça a transição para o Azure AI Video Indexer ou outra solução de software livre antes da data especificada. Recomendamos que você faça a transição mais cedo para obter os benefícios mais avançados do Azure AI Video Indexer. Além dos recursos familiares que você está usando, aqui está uma comparação rápida entre a Análise Espacial da Visão de IA do Azure e o Azure AI Video Indexer.

Recurso Análise Espacial da Visão de IA do Azure Azure AI Video Indexer
Suporte do Edge Sim Sim
Detecção de objetos Somente detecção de pessoas e veículos Detecta mais de 1000 objetos
Processamento de áudio/fala Sem suporte Com suporte (inclui transcrição de fala, tradução e resumo)
Com suporte >(inclui transcrição de fala e análise de sentimento)
Detecção e acompanhamento de eventos Com suporte (acompanhamento de pessoas e veículos, detecção de eventos) Ainda não há suporte no Edge. Há suporte parcial na nuvem.
Suporte ao Azure Arc Sem suporte Suporte nativo
Área de foco Análise visual com acompanhamento especializado Análise abrangente do conteúdo de áudio e visual

De agora até 30 de março de 2025, você pode continuar a usar a Análise Espacial da Visão de IA do Azure ou fazer a transição para o Azure AI Video Indexer antes da data especificada. Após 30 de março de 2025, o contêiner de análise espacial não terá mais suporte e deixará de processar novos fluxos.

A análise espacial permite que você analise fluxos de vídeo de dispositivos de câmera em tempo real. Para cada dispositivo de câmera configurado, as operações da análise espacial vão gerar um fluxo de saída de mensagens JSON enviadas à sua instância do Hub IoT do Azure.

O contêiner de Análise Espacial implementa as seguintes operações. Você pode configurar essas operações no manifesto de implantação do contêiner.

Identificador da operação Descrição
cognitiveservices.vision.spatialanalysis-personcount Conta as pessoas em uma zona designada no campo de visão da câmera. A zona precisa ser coberta totalmente por uma mesma câmera para que PersonCount registre um total preciso.
Emite um evento personCountEvent inicial e, depois, eventos personCountEvent quando a contagem é alterada.
cognitiveservices.vision.spatialanalysis-personcrossingline Controla quando uma pessoa cruza uma linha designada no campo de visão da câmera.
Emite um evento personLineEvent quando a pessoa cruza a linha e fornece informações de direção.
cognitiveservices.vision.spatialanalysis-personcrossingpolygon Emite um evento personZoneEnterExitEvent quando uma pessoa entra na zona designada ou sai dela e fornece informações de direção com o lado da zona que foi cruzado. Emite um personZoneDwellTimeEvent quando a pessoa sai da zona e fornece informações de direção, bem como o número de milissegundos que a pessoa permaneceu dentro da zona.
cognitiveservices.vision.spatialanalysis-persondistance Controla quando as pessoas violam uma regra de distância mínima.
Emite um personDistanceEvent periodicamente com o local de cada violação de distância.
cognitiveservices.vision.spatialanalysis A operação genérica, que pode ser usada para executar todos os cenários mencionados acima. Essa opção é mais útil quando você deseja executar vários cenários na mesma câmera ou usar recursos do sistema (a GPU, por exemplo) com mais eficiência.

Todas as operações acima também estão disponíveis na versão .debug do serviço (por exemplo, cognitiveservices.vision.spatialanalysis-personcount.debug). A depuração tem a capacidade de visualizar quadros de vídeo à medida que eles são processados. Será necessário executar xhost + no computador host para habilitar a visualização de eventos e quadros de vídeo.

Importante

Os modelos de IA do Azure detectam e localizam a presença humana no vídeo e geram uma caixa delimitadora em torno do corpo humano. Os modelos de IA não tentam descobrir as identidades nem os dados demográficos dos indivíduos.

Parâmetros de operação

Veja a seguir os parâmetros necessários para cada uma das operações da análise espacial.

Parâmetros de operação Descrição
Operation ID O identificador da operação da tabela acima.
enabled Booliano: true ou false
VIDEO_URL A URL RTSP para o dispositivo com câmera (por exemplo, rtsp://username:password@url ). A Análise Espacial dá suporte ao fluxo codificado em H.264 por meio de RTSP, HTTP ou mp4. Video_URL pode ser fornecido como um valor de cadeia de caracteres base64 ocultado usando criptografia AES. Se a URL do vídeo estiver ocultada, KEY_ENV e IV_ENV precisarão ser fornecidas como variáveis de ambiente. Um utilitário de exemplo para gerar chaves e criptografia pode ser encontrado aqui.
VIDEO_SOURCE_ID Um nome amigável para o dispositivo com câmera ou fluxo de vídeo. Será retornado com a saída do evento JSON.
VIDEO_IS_LIVE Verdadeiro para dispositivos com câmera; falso para vídeos gravados.
VIDEO_DECODE_GPU_INDEX Qual GPU decodificará o quadro de vídeo. Por padrão, é 0. Deve ser igual a gpu_index na configuração do outro nó, por exemplo, DETECTOR_NODE_CONFIG e CAMERACALIBRATOR_NODE_CONFIG.
INPUT_VIDEO_WIDTH Largura do quadro do vídeo/fluxo de entrada (por exemplo, 1.920). Esse é um campo opcional e, se fornecido, o quadro será escalado para essa dimensão, preservando a taxa de proporção.
DETECTOR_NODE_CONFIG JSON que indica em qual GPU executar o nó do detector. Ele deve estar no seguinte formato: "{ \"gpu_index\": 0 }",
TRACKER_NODE_CONFIG JSON que indica se a velocidade deve ser computada no nó do controlador. Ele deve estar no seguinte formato: "{ \"enable_speed\": true }",
CAMERA_CONFIG JSON que indica os parâmetros de câmera calibrados para várias câmeras. Se a habilidade usada requer calibragem e você já tem o parâmetro de câmera, você pode usar essa configuração para fornecê-los diretamente. Ele deve estar no seguinte formato: "{ \"cameras\": [{\"source_id\": \"endcomputer.0.persondistancegraph.detector+end_computer1\", \"camera_height\": 13.105561256408691, \"camera_focal_length\": 297.60003662109375, \"camera_tiltup_angle\": 0.9738943576812744}] }", o source_id é usado para identificar cada câmera. Ele pode ser obtido do source_info do evento que foi publicado. Ele só entrará em vigor quando do_calibration=false estiver em DETECTOR_NODE_CONFIG.
CAMERACALIBRATOR_NODE_CONFIG JSON indicando em qual GPU executar o nó calibrador da câmera e se a calibragem deve ser usada ou não. Ele deve estar no seguinte formato: "{ \"gpu_index\": 0, \"do_calibration\": true, \"enable_orientation\": true}",
CALIBRATION_CONFIG JSON indicando parâmetros para controlar como a calibragem da câmera funciona. Ele deve estar no seguinte formato: "{\"enable_recalibration\": true, \"quality_check_frequency_seconds\": 86400}",
SPACEANALYTICS_CONFIG Configuração de JSON para a zona e a linha, conforme descrito abaixo.
ENABLE_FACE_MASK_CLASSIFIER True para habilitar a detecção de pessoas usando máscaras que cobrem o rosto no fluxo de vídeo, False para desabilitá-la. Por padrão, fica desabilitado. A detecção de máscaras que cobrem o rosto exige que o parâmetro de largura do vídeo de entrada seja 1920 "INPUT_VIDEO_WIDTH": 1920. O atributo de máscara facial não será retornado se as pessoas detectadas não estiverem voltadas para a câmera ou se estiverem muito longe dela. Para saber mais, confira o posicionamento da câmera.
STATIONARY_TARGET_REMOVER_CONFIG JSON que indica os parâmetros para remoção de alvo estacionário, que adiciona a capacidade de aprender e ignorar alvos falsos positivos estacionários de longo prazo, como manequins ou pessoas em imagens. A configuração deve estar no seguinte formato: "{\"enable\": true, \"bbox_dist_threshold-in_pixels\": 5, \"buffer_length_in_seconds\": 3600, \"filter_ratio\": 0.2 }"

Configurações do parâmetro de nó do detector

Veja a seguir um exemplo dos parâmetros de DETECTOR_NODE_CONFIG para todas as operações da análise espacial.

{
"gpu_index": 0,
"enable_breakpad": false
}
Nome Tipo Descrição
gpu_index string O índice de GPU em que esta operação será executada.
enable_breakpad bool Indica se o breakpad deve ser habilitado, que é usado para gerar o despejo de memória para uso para depuração. Por padrão, é false. Se defini-lo como true, você também precisará adicionar "CapAdd": ["SYS_PTRACE"] na parte HostConfig do contêiner createOptions. Por padrão, o despejo de memória é carregado no aplicativo RealTimePersonTracking do App Center. Se quiser que os despejos de memória sejam carregados em seu aplicativo do App Center, você poderá substituir a variável de ambiente RTPT_APPCENTER_APP_SECRET pelo segredo do aplicativo.

Configurações de parâmetros do nó de calibragem de câmera

Veja a seguir um exemplo dos parâmetros de CAMERACALIBRATOR_NODE_CONFIG para todas as operações da análise espacial.

{
  "gpu_index": 0,
  "do_calibration": true,
  "enable_breakpad": false,
  "enable_orientation": true
}
Nome Tipo Descrição
do_calibration string Indica que a calibragem está ativada. do_calibration precisa ser verdadeiro para que cognitiveservices.vision.spatialanalysis-persondistance funcione corretamente. do_calibration é definido por padrão como True.
enable_breakpad bool Indica se o breakpad deve ser habilitado, que é usado para gerar o despejo de memória para uso para depuração. Por padrão, é false. Se defini-lo como true, você também precisará adicionar "CapAdd": ["SYS_PTRACE"] na parte HostConfig do contêiner createOptions. Por padrão, o despejo de memória é carregado no aplicativo RealTimePersonTracking do App Center. Se quiser que os despejos de memória sejam carregados em seu aplicativo do App Center, você poderá substituir a variável de ambiente RTPT_APPCENTER_APP_SECRET pelo segredo do aplicativo.
enable_orientation bool Indica se você deseja computar a orientação para as pessoas detectadas. enable_orientation é definido por padrão como True.

Configuração de calibragem

Este é um exemplo dos parâmetros de CALIBRATION_CONFIG para todas as operações de análise espacial.

{
  "enable_recalibration": true,
  "calibration_quality_check_frequency_seconds": 86400,
  "calibration_quality_check_sample_collect_frequency_seconds": 300,
  "calibration_quality_check_one_round_sample_collect_num": 10,
  "calibration_quality_check_queue_max_size": 1000,
  "calibration_event_frequency_seconds": -1
}
Nome Tipo Descrição
enable_recalibration bool Indica se a recalibragem automática está ativada. O padrão é true.
calibration_quality_check_frequency_seconds INT Número mínimo de segundos entre cada verificação de qualidade para determinar se a recalibragem é necessária. O padrão é 86400 (24 horas). Usado somente quando enable_recalibration=True.
calibration_quality_check_sample_collect_frequency_seconds INT Número mínimo de segundos entre a coleta de novas amostras de dados para recalibragem e a verificação de qualidade. O padrão é 300 (5 minutos). Usado somente quando enable_recalibration=True.
calibration_quality_check_one_round_sample_collect_num INT Número mínimo de novas amostras de dados a serem coletadas por rodada de coleta de amostra. O padrão é 10. Usado somente quando enable_recalibration=True.
calibration_quality_check_queue_max_size INT Número máximo de amostras de dados a serem armazenadas quando o modelo da câmera é calibrado. O padrão é 1000. Usado somente quando enable_recalibration=True.
calibration_event_frequency_seconds INT Frequência de saída (segundos) de eventos de calibragem de câmera. Um valor igual a -1 indica que a calibragem da câmera não deve ser enviada, a menos que as informações de calibragem da câmera tenham sido alteradas. O padrão é -1.

Saída de calibragem de câmera

Veja a seguir um exemplo da saída de calibragem da câmera, se ela estiver habilitada. As reticências indicam mais do mesmo tipo de objetos em uma lista.

{
  "type": "cameraCalibrationEvent",
  "sourceInfo": {
    "id": "camera1",
    "timestamp": "2021-04-20T21:15:59.100Z",
    "width": 512,
    "height": 288,
    "frameId": 531,
    "cameraCalibrationInfo": {
      "status": "Calibrated",
      "cameraHeight": 13.294151306152344,
      "focalLength": 372.0000305175781,
      "tiltupAngle": 0.9581864476203918,
      "lastCalibratedTime": "2021-04-20T21:15:59.058"
    }
  },
  "zonePlacementInfo": {
    "optimalZoneRegion": {
      "type": "POLYGON",
       "points": [
        {
          "x": 0.8403755868544601,
          "y": 0.5515320334261838
        },
        {
          "x": 0.15805946791862285,
          "y": 0.5487465181058496
        }
      ],
      "name": "optimal_zone_region"
    },
    "fairZoneRegion": {
      "type": "POLYGON",
      "points": [
        {
          "x": 0.7871674491392802,
          "y": 0.7437325905292479
        },
        {
          "x": 0.22065727699530516,
          "y": 0.7325905292479109
        }
      ],
      "name": "fair_zone_region"
    },
    "uniformlySpacedPersonBoundingBoxes": [
      {
        "type": "RECTANGLE",
        "points": [
          {
            "x": 0.0297339593114241,
            "y": 0.0807799442896936
          },
          {
            "x": 0.10015649452269171,
            "y": 0.2757660167130919
          }
        ]
      }
    ],
    "personBoundingBoxGroundPoints": [
      {
        "x": -22.944068908691406,
        "y": 31.487680435180664
      }
    ]
  }
}

Confira Saída da operação de análise espacial para obter detalhes sobre source_info.

Nome do campo ZonePlacementInfo Tipo Descrição
optimalZonePolygon objeto Um polígono na imagem da câmera em que as linhas ou zonas das suas operações podem ser colocadas para obter resultados ideais.
Cada par de valor representa o x,y para os vértices de um polígono. O polígono representa as áreas em que as pessoas são rastreadas ou contadas, e os pontos do polígono são baseados em coordenadas normalizadas (0-1), em que o canto superior esquerdo é (0,0; 0,0) e o canto inferior direito é (1,0; 1,0).
fairZonePolygon objeto Um polígono na imagem da câmera em que as linhas ou zonas das suas operações podem ser colocadas para obter resultados bons, mas possivelmente não ideais.
Veja optimalZonePolygon acima para obter uma explicação detalhada do conteúdo.
uniformlySpacedPersonBoundingBoxes list Uma lista de caixas delimitadoras de pessoas na imagem da câmera distribuídas uniformemente no espaço real. Os valores se baseiam em coordenadas normalizadas (0 e 1).
personBoundingBoxGroundPoints list Uma lista de coordenadas no plano de base em relação à câmera. Cada coordenada corresponde à parte inferior direita da caixa delimitadora no uniformlySpacedPersonBoundingBoxes com o mesmo índice.
Confira os campos centerGroundPointX/centerGroundPointY na seção Formato JSON dos Insights da IA de cognitiveservices.vision.spatialanalysis-persondistance para obter mais detalhes sobre como as coordenadas da planta baixa são calculadas.

Exemplo de saída de informações de posicionamento de zona visualizada em um quadro de vídeo: Visualização de informações de posicionamento de zona

As informações de posicionamento de zona fornecem sugestões para as suas configurações, mas as diretrizes na Configuração da câmera ainda precisam ser seguidas para obter melhores resultados.

Configurações do parâmetro de nó do rastreador

Você pode configurar a computação da velocidade por meio das configurações de parâmetro do nó do rastreador.

{
"enable_speed": true,
"remove_stationary_objects": true,
"stationary_objects_dist_threshold_in_pixels": 5,
"stationary_objects_buffer_length_in_seconds": 3600,
"stationary_objects_filter_ratio": 0.2
}
Nome Tipo Descrição
enable_speed bool Indica se você deseja computar a velocidade para as pessoas detectadas. enable_speed é definido por padrão como True. É altamente recomendável que a velocidade e a orientação sejam habilitadas para obter os melhores valores estimados.
remove_stationary_objects bool Indica se você deseja remover objetos estacionários. remove_stationary_objects é definido por padrão como true.
stationary_objects_dist_threshold_in_pixels INT O limite de distância da região para decidir se duas caixas de detecção podem ser tratadas como a mesma detecção. stationary_objects_dist_threshold_in_pixels é definido por padrão como 5.
stationary_objects_buffer_length_in_seconds INT O período mínimo em segundos que o sistema precisa olhar para trás para decidir se um alvo é um alvo estacionário ou não. stationary_objects_buffer_length_in_seconds é definido por padrão como 3.600.
stationary_objects_filter_ratio FLOAT Se um alvo for detectado repetidamente na mesma localização (definido em stationary_objects_dist_threshold_in_pixels) para uma stationary_objects_filter_ratio maior (0,2 significa 20%) do intervalo de tempo de stationary_objects_buffer_length_in_seconds, ele será tratado como um alvo estacionário. stationary_objects_filter_ratio é definido por padrão como 0,2.

Configuração e saída das operações de Análise Espacial

Configuração de zona para personcount

Veja a seguir um exemplo de entrada JSON para o parâmetro SPACEANALYTICS_CONFIG que configura uma zona. Você pode configurar várias zonas para esta operação.

{
  "zones": [
    {
      "name": "lobbycamera",
      "polygon": [[0.3,0.3], [0.3,0.9], [0.6,0.9], [0.6,0.3], [0.3,0.3]],
      "events": [
        {
          "type": "count",
          "config": {
            "trigger": "event",
            "focus": "footprint"
          }
        }
      ]
    }
  ]
}
Nome Tipo Description
zones list Lista de zonas.
name string Nome amigável da zona.
polygon list Cada par de valor representa o x,y para os vértices de um polígono. O polígono representa as áreas nas quais as pessoas são rastreadas ou contadas. Os pontos do polígono são baseados em coordenadas normalizadas (0-1), em que o canto superior esquerdo é (0,0, 0,0) e o canto inferior direito é (1,0, 1,0).
threshold FLOAT Os eventos são egressos quando a pessoa é maior que esse número de pixels dentro da zona. Esse é um campo opcional e o valor está na taxa (de 0 a 1). Por exemplo, o valor 0,0253 será de 13 pixels em um vídeo com largura de imagem = 512 (0,0253 X 512 = ~13).
type string Para cognitiveservices.vision.spatialanalysis-personcount, isso deve ser count.
trigger string O tipo de gatilho para enviar um evento. Os valores com suporte são event para enviar eventos quando a contagem é alterada ou interval para enviar eventos periodicamente, tenha a contagem sido alterada ou não.
output_frequency INT A taxa em que os eventos são gerados. Quando output_frequency = X, todo evento X é gerado. Por exemplo, output_frequency = 2 significa que um de cada dois eventos é gerado. O output_frequency é aplicável a event e interval.
focus string A localização do ponto na caixa delimitadora da pessoa usado para calcular eventos. O valor do foco pode ser footprint (o volume da pessoa), bottom_center (a parte inferior central da caixa delimitadora da pessoa), center (o centro da caixa delimitadora da pessoa).

Configuração de linha para personcrossingline

Veja a seguir um exemplo de entrada JSON para o parâmetro SPACEANALYTICS_CONFIG que configura uma linha. Você pode configurar várias linhas de cruzamento para esta operação.

{
   "lines": [
       {
           "name": "doorcamera",
           "line": {
               "start": {
                   "x": 0,
                   "y": 0.5
               },
               "end": {
                   "x": 1,
                   "y": 0.5
               }
           },
           "events": [
               {
                   "type": "linecrossing",
                   "config": {
                       "trigger": "event",
                       "focus": "footprint"
                   }
               }
           ]
       }
   ]
}
Nome Tipo Description
lines list Lista de linhas.
name string Nome amigável da linha.
line list A definição da linha. Essa é uma linha direcional que permite entender "entrada" versus "saída".
start par de valores Coordenadas x, y do ponto inicial da linha. Os valores float representam a posição do vértice em relação ao canto superior esquerdo. Para calcular os valores absolutos de x, y, você multiplica esses valores pelo tamanho do quadro.
end par de valores Coordenadas x, y do ponto final da linha. Os valores float representam a posição do vértice em relação ao canto superior esquerdo. Para calcular os valores absolutos de x, y, você multiplica esses valores pelo tamanho do quadro.
threshold FLOAT Os eventos são egressos quando a pessoa é maior que esse número de pixels dentro da zona. Esse é um campo opcional e o valor está na taxa (de 0 a 1). Por exemplo, o valor 0,0253 será de 13 pixels em um vídeo com largura de imagem = 512 (0,0253 X 512 = ~13).
type string Para cognitiveservices.vision.spatialanalysis-personcrossingline, isso deve ser linecrossing.
trigger string O tipo de gatilho para enviar um evento.
Valores com suporte: "event": disparar quando alguém cruza a linha.
focus string A localização do ponto na caixa delimitadora da pessoa usado para calcular eventos. O valor do foco pode ser footprint (o volume da pessoa), bottom_center (a parte inferior central da caixa delimitadora da pessoa), center (o centro da caixa delimitadora da pessoa). O valor padrão é volume.

Configuração de zona para personcrossingpolygon

Este é um exemplo de entrada JSON para o parâmetro SPACEANALYTICS_CONFIG que configura uma zona. Você pode configurar várias zonas para esta operação.

{
"zones":[
   {
       "name": "queuecamera",
       "polygon": [[0.3,0.3], [0.3,0.9], [0.6,0.9], [0.6,0.3], [0.3,0.3]],
       "events":[{
           "type": "zonecrossing",
           "config":{
               "trigger": "event",
               "focus": "footprint"
               }
           }]
   },
   {
       "name": "queuecamera1",
       "polygon": [[0.3,0.3], [0.3,0.9], [0.6,0.9], [0.6,0.3], [0.3,0.3]],
       "events":[{
           "type": "zonedwelltime",
           "config":{
               "trigger": "event",
               "focus": "footprint"
               }
           }]
   }]
}
Nome Tipo Description
zones list Lista de zonas.
name string Nome amigável da zona.
polygon list Cada par de valor representa o x,y para os vértices do polígono. O polígono representa as áreas nas quais as pessoas são rastreadas ou contadas. Os valores float representam a posição do vértice em relação ao canto superior esquerdo. Para calcular os valores absolutos de x, y, você multiplica esses valores pelo tamanho do quadro.
target_side INT Especifica um lado da zona definida por polygon para medir por quanto tempo as pessoas olham esse lado enquanto estão na zona. 'dwellTimeForTargetSide' vai gerar o tempo estimado. Cada lado é uma borda numerada entre os dois vértices do polígono que representa a zona. Por exemplo, a borda entre os dois primeiros vértices do polígono representa o primeiro lado, 'side'=1. O valor de target_side está entre [0,N-1], onde N é o número de lados do polygon. Esse é um campo opcional.
threshold FLOAT Os eventos são egressos quando a pessoa é maior que esse número de pixels dentro da zona. Esse é um campo opcional e o valor está na taxa (de 0 a 1). Por exemplo, o valor 0,074 será de 38 pixels em um vídeo com largura de imagem = 512 (0,074 X 512 = ~38).
type string Para cognitiveservices.vision.spatialanalysis-personcrossingpolygon, deve ser zonecrossing ou zonedwelltime.
trigger string O tipo de gatilho para enviar um evento
Valores com suporte: "event": disparar quando alguém entra ou sai da zona.
focus string A localização do ponto na caixa delimitadora da pessoa usado para calcular eventos. O valor do foco pode ser footprint (o volume da pessoa), bottom_center (a parte inferior central da caixa delimitadora da pessoa), center (o centro da caixa delimitadora da pessoa). O valor padrão é volume.

Configuração de zona para persondistance

Este é um exemplo de entrada JSON para o parâmetro SPACEANALYTICS_CONFIG que configura uma zona para cognitiveservices.vision.spatialanalysis-persondistance. Você pode configurar várias zonas para esta operação.

{
"zones":[{
   "name": "lobbycamera",
   "polygon": [[0.3,0.3], [0.3,0.9], [0.6,0.9], [0.6,0.3], [0.3,0.3]],
   "events":[{
       "type": "persondistance",
       "config":{
           "trigger": "event",
           "output_frequency":1,
           "minimum_distance_threshold":6.0,
           "maximum_distance_threshold":35.0,
           "aggregation_method": "average",
           "focus": "footprint"
          }
          }]
   }]
}
Nome Tipo Description
zones list Lista de zonas.
name string Nome amigável da zona.
polygon list Cada par de valor representa o x,y para os vértices do polígono. O polígono representa as áreas em que as pessoas são contadas e a distância entre as pessoas é medida. Os valores float representam a posição do vértice em relação ao canto superior esquerdo. Para calcular os valores absolutos de x, y, você multiplica esses valores pelo tamanho do quadro.
threshold FLOAT Os eventos são egressos quando a pessoa é maior que esse número de pixels dentro da zona. Esse é um campo opcional e o valor está na taxa (de 0 a 1). Por exemplo, o valor 0,0253 será de 13 pixels em um vídeo com largura de imagem = 512 (0,0253 X 512 = ~13).
type string Para cognitiveservices.vision.spatialanalysis-persondistance, isso deve ser persondistance.
trigger string O tipo de gatilho para enviar um evento. Os valores com suporte são event para enviar eventos quando a contagem é alterada ou interval para enviar eventos periodicamente, tenha a contagem sido alterada ou não.
output_frequency INT A taxa em que os eventos são gerados. Quando output_frequency = X, todo evento X é gerado. Por exemplo, output_frequency = 2 significa que um de cada dois eventos é gerado. O output_frequency é aplicável a event e interval.
minimum_distance_threshold FLOAT Uma distância em pés que dispara um evento "TooClose" quando as pessoas estão a uma distância inferior a esse valor.
maximum_distance_threshold FLOAT Uma distância em pés que dispara um evento "TooFar" quando as pessoas estão a uma distância superior a esse valor.
aggregation_method string O método para o resultado persondistance agregado. O aggregation_method é aplicável a mode e average.
focus string A localização do ponto na caixa delimitadora da pessoa usado para calcular eventos. O valor do foco pode ser footprint (o volume da pessoa), bottom_center (a parte inferior central da caixa delimitadora da pessoa), center (o centro da caixa delimitadora da pessoa).

Configuração para spatialanalysis

Veja a seguir um exemplo de entrada JSON para o parâmetro SPACEANALYTICS_CONFIG que configura uma linha e uma zona para cognitiveservices.vision.spatialanalysis. Você pode configurar várias linhas/zonas para essa operação, e cada uma delas pode ter eventos diferentes.

{
  "lines": [
    {
      "name": "doorcamera",
      "line": {
        "start": {
          "x": 0,
          "y": 0.5
        },
        "end": {
          "x": 1,
          "y": 0.5
        }
      },
      "events": [
        {
          "type": "linecrossing",
          "config": {
            "trigger": "event",
            "focus": "footprint"
          }
        }
      ]
    }
  ],
  "zones": [
    {
      "name": "lobbycamera",
      "polygon": [[0.3, 0.3],[0.3, 0.9],[0.6, 0.9],[0.6, 0.3],[0.3, 0.3]],
      "events": [
        {
          "type": "persondistance",
          "config": {
            "trigger": "event",
            "output_frequency": 1,
            "minimum_distance_threshold": 6.0,
            "maximum_distance_threshold": 35.0,
            "focus": "footprint"
          }
        },
        {
          "type": "count",
          "config": {
            "trigger": "event",
            "output_frequency": 1,
            "focus": "footprint"
          }
        },
        {
          "type": "zonecrossing",
          "config": {
            "focus": "footprint"
          }
        },
        {
          "type": "zonedwelltime",
          "config": {
            "focus": "footprint"
          }
        }
      ]
    }
  ]
}

Configuração da câmera

Confira as diretrizes de posicionamento da câmera para saber mais sobre como configurar zonas e linhas.

Saída da operação de análise espacial

Os eventos de cada operação são gerados para o Hub IoT do Azure no formato JSON.

Formato JSON para os Insights da IA de personcount

Exemplo de JSON para uma saída de evento por esta operação.

{
    "events": [
        {
            "id": "b013c2059577418caa826844223bb50b",
            "type": "personCountEvent",
            "detectionIds": [
                "bc796b0fc2534bc59f13138af3dd7027",
                "60add228e5274158897c135905b5a019"
            ],
            "properties": {
                "personCount": 2
            },
            "zone": "lobbycamera",
            "trigger": "event"
        }
    ],
    "sourceInfo": {
        "id": "camera_id",
        "timestamp": "2020-08-24T06:06:57.224Z",
        "width": 608,
        "height": 342,
        "frameId": "1400",
        "cameraCalibrationInfo": {
            "status": "Calibrated",
            "cameraHeight": 10.306597709655762,
            "focalLength": 385.3199462890625,
            "tiltupAngle": 1.0969393253326416
        },
        "imagePath": ""
    },
    "detections": [
        {
            "type": "person",
            "id": "bc796b0fc2534bc59f13138af3dd7027",
            "region": {
                "type": "RECTANGLE",
                "points": [
                    {
                        "x": 0.612683747944079,
                        "y": 0.25340268765276636
                    },
                    {
                        "x": 0.7185954043739721,
                        "y": 0.6425260577285499
                    }
                ]
            },
            "confidence": 0.9559211134910583,
            "metadata": {
                "centerGroundPointX": "2.6310102939605713",
                "centerGroundPointY": "0.0",
		"groundOrientationAngle": "1.3",
                "footprintX": "0.7306610584259033",
                "footprintY": "0.8814966493381893"
            },
           "attributes": [
                {
                    "label": "face_mask",
                    "confidence": 0.99,
                    "task": ""
                }
            ]
        },
        {
            "type": "person",
            "id": "60add228e5274158897c135905b5a019",
            "region": {
                "type": "RECTANGLE",
                "points": [
                    {
                        "x": 0.22326200886776573,
                        "y": 0.17830915618361087
                    },
                    {
                        "x": 0.34922296122500773,
                        "y": 0.6297955429344847
                    }
                ]
            },
            "confidence": 0.9389744400978088,
             "metadata": {
                "centerGroundPointX": "2.6310102939605713",
                "centerGroundPointY": "18.635927200317383",
		"groundOrientationAngle": "1.3",
                "footprintX": "0.7306610584259033",
                "footprintY": "0.8814966493381893"
            },
           "attributes": [
                {
                    "label": "face_mask",
                    "confidence": 0.99,
                    "task": ""
                }
            ]
       }
    ],
    "schemaVersion": "2.0"
}
Nome do campo do evento Tipo Descrição
id string ID do evento
type string Tipo de evento
detectionsId array Matriz de tamanho 1 do identificador exclusivo da detecção de pessoa que disparou este evento
properties collection Coleção de valores
trackinId string Identificador exclusivo da pessoa detectada
zone string O campo "name" do polígono que representa a zona que foi cruzada
trigger string O tipo de gatilho é 'event' ou 'interval' dependendo do valor de trigger em SPACEANALYTICS_CONFIG
Nome do campo de detecções Tipo Descrição
id string ID da detecção
type string Tipo de detecção
region collection Coleção de valores
type string Tipo de região
points collection Pontos superior esquerdo e inferior direito quando o tipo de região é RECTANGLE
confidence FLOAT Confiança do algoritmo
attributes array Matriz de atributos. Cada atributo consiste em rótulo, tarefa e confiança
label string O valor do atributo (por exemplo, {label: face_mask} indica que a pessoa detectada está usando uma máscara facial)
confidence (attribute) FLOAT O valor de confiança do atributo com um intervalo de 0 a 1 (por exemplo, {confidence: 0.9, label: face_nomask} indica que a pessoa detectada não está usando uma máscara facial)
task string A tarefa/classe de classificação de atributo
Nome do campo SourceInfo Tipo Descrição
id string ID da Câmera
timestamp date Data UTC quando a carga JSON foi emitida
width INT Largura do quadro do vídeo
height INT Altura do quadro do vídeo
frameId INT Identificador de quadro
cameraCallibrationInfo collection Coleção de valores
status string O status da calibragem no formato de state[;progress description]. O estado pode ser Calibrating, Recalibrating (se a recalibragem estiver habilitada) ou Calibrated. A parte de descrição do progresso só é válida quando está no estado Calibrating e Recalibrating, que é usado para mostrar o progresso do processo de calibragem atual.
cameraHeight FLOAT A altura da câmera acima do solo em pés. Isso é inferido com base na calibragem automática.
focalLength FLOAT A distância focal da câmera em pixels. Isso é inferido com base na calibragem automática.
tiltUpAngle FLOAT O ângulo de inclinação da câmera na vertical. Isso é inferido com base na calibragem automática.

Formato JSON para os Insights da IA de personcrossingline

Exemplo de JSON para a saída de detecções por esta operação.

{
    "events": [
        {
            "id": "3733eb36935e4d73800a9cf36185d5a2",
            "type": "personLineEvent",
            "detectionIds": [
                "90d55bfc64c54bfd98226697ad8445ca"
            ],
            "properties": {
                "trackingId": "90d55bfc64c54bfd98226697ad8445ca",
                "status": "CrossLeft"
            },
            "zone": "doorcamera"
        }
    ],
    "sourceInfo": {
        "id": "camera_id",
        "timestamp": "2020-08-24T06:06:53.261Z",
        "width": 608,
        "height": 342,
        "frameId": "1340",
        "imagePath": ""
    },
    "detections": [
        {
            "type": "person",
            "id": "90d55bfc64c54bfd98226697ad8445ca",
            "region": {
                "type": "RECTANGLE",
                "points": [
                    {
                        "x": 0.491627341822574,
                        "y": 0.2385801348769874
                    },
                    {
                        "x": 0.588894994635331,
                        "y": 0.6395559924387793
                    }
                ]
            },
            "confidence": 0.9005028605461121,
            "metadata": {
                "centerGroundPointX": "2.6310102939605713",
                "centerGroundPointY": "18.635927200317383",
		"groundOrientationAngle": "1.3",
                "trackingId": "90d55bfc64c54bfd98226697ad8445ca",
                "speed": "1.2",
                "footprintX": "0.7306610584259033",
                "footprintY": "0.8814966493381893"
            },
           "attributes": [
                {
                    "label": "face_mask",
                    "confidence": 0.99,
                    "task": ""
                }
            ]
        }
    ],
    "schemaVersion": "2.0"
}
Nome do campo do evento Tipo Descrição
id string ID do evento
type string Tipo de evento
detectionsId array Matriz de tamanho 1 do identificador exclusivo da detecção de pessoa que disparou este evento
properties collection Coleção de valores
trackinId string Identificador exclusivo da pessoa detectada
status string Direção dos cruzamentos de linha, 'CrossLeft' ou 'CrossRight'. A direção se baseia em imaginar a posição no "início", voltado para o "fim" da linha. CrossRight significa cruzar da esquerda para a direita. CrossLeft significa cruzar da direita para a esquerda.
orientationDirection string A direção de orientação da pessoa detectada após cruzar a linha. O valor pode ser 'Left', 'Right ou 'Straight'. Esse valor será a saída se enable_orientation estiver definido como True em CAMERACALIBRATOR_NODE_CONFIG
zone string O campo "name" da linha que foi cruzada
Nome do campo de detecções Tipo Descrição
id string ID da detecção
type string Tipo de detecção
region collection Coleção de valores
type string Tipo de região
points collection Pontos superior esquerdo e inferior direito quando o tipo de região é RECTANGLE
groundOrientationAngle FLOAT O ângulo radiano em sentido horário da orientação da pessoa no plano térreo inferido
mappedImageOrientation FLOAT O ângulo radiano no sentido horário projetado da orientação da pessoa no espaço de imagem 2D
speed FLOAT A velocidade estimada da pessoa detectada. A unidade é foot per second (ft/s)
confidence FLOAT Confiança do algoritmo
attributes array Matriz de atributos. Cada atributo consiste em rótulo, tarefa e confiança
label string O valor do atributo (por exemplo, {label: face_mask} indica que a pessoa detectada está usando uma máscara facial)
confidence (attribute) FLOAT O valor de confiança do atributo com um intervalo de 0 a 1 (por exemplo, {confidence: 0.9, label: face_nomask} indica que a pessoa detectada não está usando uma máscara facial)
task string A tarefa/classe de classificação de atributo
Nome do campo SourceInfo Tipo Descrição
id string ID da Câmera
timestamp date Data UTC quando a carga JSON foi emitida
width INT Largura do quadro do vídeo
height INT Altura do quadro do vídeo
frameId INT Identificador de quadro

Importante

O modelo de IA detecta pessoas voltadas para a câmera ou para a direção oposta. O modelo de IA não executa o reconhecimento facial nem emite informações biométricas.

Formato JSON para os Insights da IA de personcrossingpolygon

Exemplo de JSON para a saída de detecções por essa operação com o tipo de zonecrossing de SPACEANALYTICS_CONFIG.

{
    "events": [
        {
            "id": "f095d6fe8cfb4ffaa8c934882fb257a5",
            "type": "personZoneEnterExitEvent",
            "detectionIds": [
                "afcc2e2a32a6480288e24381f9c5d00e"
            ],
            "properties": {
                "trackingId": "afcc2e2a32a6480288e24381f9c5d00e",
                "status": "Enter",
                "side": "1"
            },
            "zone": "queuecamera"
        }
    ],
    "sourceInfo": {
        "id": "camera_id",
        "timestamp": "2020-08-24T06:15:09.680Z",
        "width": 608,
        "height": 342,
        "frameId": "428",
        "imagePath": ""
    },
    "detections": [
        {
            "type": "person",
            "id": "afcc2e2a32a6480288e24381f9c5d00e",
            "region": {
                "type": "RECTANGLE",
                "points": [
                    {
                        "x": 0.8135572734631991,
                        "y": 0.6653949670624315
                    },
                    {
                        "x": 0.9937645761590255,
                        "y": 0.9925406829655519
                    }
                ]
            },
            "confidence": 0.6267998814582825,
            "metadata": {
                "centerGroundPointX": "2.6310102939605713",
                "centerGroundPointY": "18.635927200317383",
		"groundOrientationAngle": "1.3",
                "trackingId": "afcc2e2a32a6480288e24381f9c5d00e",
                "speed": "1.2",
                "footprintX": "0.7306610584259033",
                "footprintY": "0.8814966493381893"
            },
           "attributes": [
		{
		    "label": "face_mask",
		    "confidence": 0.99,
		    "task": ""
		}
            ]
	}
    ],
    "schemaVersion": "2.0"
}

Exemplo de JSON para a saída de detecções por essa operação com o tipo de zonedwelltime de SPACEANALYTICS_CONFIG.

{
    "events": [
        {
            "id": "f095d6fe8cfb4ffaa8c934882fb257a5",
            "type": "personZoneDwellTimeEvent",
            "detectionIds": [
                "afcc2e2a32a6480288e24381f9c5d00e"
            ],
            "properties": {
                "trackingId": "afcc2e2a32a6480288e24381f9c5d00e",
                "status": "Exit",
                "side": "1",
	        "dwellTime": 7132.0,
	        "dwellFrames": 20            
            },
            "zone": "queuecamera"
        }
    ],
    "sourceInfo": {
        "id": "camera_id",
        "timestamp": "2020-08-24T06:15:09.680Z",
        "width": 608,
        "height": 342,
        "frameId": "428",
        "imagePath": ""
    },
    "detections": [
        {
            "type": "person",
            "id": "afcc2e2a32a6480288e24381f9c5d00e",
            "region": {
                "type": "RECTANGLE",
                "points": [
                    {
                        "x": 0.8135572734631991,
                        "y": 0.6653949670624315
                    },
                    {
                        "x": 0.9937645761590255,
                        "y": 0.9925406829655519
                    }
                ]
            },
            "confidence": 0.6267998814582825,
	    "metadata": {
                "centerGroundPointX": "2.6310102939605713",
                "centerGroundPointY": "18.635927200317383",
		"groundOrientationAngle": "1.2",
		"mappedImageOrientation": "0.3",
		"speed": "1.2",
		 "trackingId": "afcc2e2a32a6480288e24381f9c5d00e",
                "footprintX": "0.7306610584259033",
                "footprintY": "0.8814966493381893"
            }
        }
    ],
    "schemaVersion": "2.0"
}
Nome do campo do evento Tipo Descrição
id string ID do evento
type string Tipo de evento. O valor pode ser personZoneDwellTimeEvent ou personZoneEnterExitEvent
detectionsId array Matriz de tamanho 1 do identificador exclusivo da detecção de pessoa que disparou este evento
properties collection Coleção de valores
trackinId string Identificador exclusivo da pessoa detectada
status string Direção dos cruzamentos do polígono, 'Enter' ou 'Exit'
side INT O número do lado do polígono que a pessoa cruzou. Cada lado é uma borda numerada entre os dois vértices do polígono que representa a zona. A borda entre os dois primeiros vértices do polígono representa o primeiro lado. 'Side' fica vazio quando o evento não está associado a um lado específico devido à oclusão. Por exemplo, uma saída ocorreu quando uma pessoa desapareceu, mas não foi vista cruzando um lado da zona, ou uma entrada ocorreu quando uma pessoa apareceu na zona, mas não foi vista atravessando um lado.
dwellTime FLOAT O número de milissegundos que representam o tempo que a pessoa permaneceu na zona. Este campo é fornecido quando o tipo de evento é personZoneDwellTimeEvent
dwellFrames INT A quantidade de quadros em que a pessoa permaneceu na zona. Este campo é fornecido quando o tipo de evento é personZoneDwellTimeEvent
dwellTimeForTargetSide FLOAT O número de milissegundos que representam o tempo que a pessoa permaneceu na zona e estava voltada para o target_side. Esse campo é fornecido quando enable_orientation está True em CAMERACALIBRATOR_NODE_CONFIG , e o valor de target_side é definido em SPACEANALYTICS_CONFIG
avgSpeed FLOAT A velocidade média da pessoa na zona. A unidade é foot per second (ft/s)
minSpeed FLOAT A velocidade mínima da pessoa na zona. A unidade é foot per second (ft/s)
zone string O campo "name" do polígono que representa a zona que foi cruzada
Nome do campo de detecções Tipo Descrição
id string ID da detecção
type string Tipo de detecção
region collection Coleção de valores
type string Tipo de região
points collection Pontos superior esquerdo e inferior direito quando o tipo de região é RECTANGLE
groundOrientationAngle FLOAT O ângulo radiano em sentido horário da orientação da pessoa no plano térreo inferido
mappedImageOrientation FLOAT O ângulo radiano no sentido horário projetado da orientação da pessoa no espaço de imagem 2D
speed FLOAT A velocidade estimada da pessoa detectada. A unidade é foot per second (ft/s)
confidence FLOAT Confiança do algoritmo
attributes array Matriz de atributos. Cada atributo consiste em rótulo, tarefa e confiança
label string O valor do atributo (por exemplo, {label: face_mask} indica que a pessoa detectada está usando uma máscara facial)
confidence (attribute) FLOAT O valor de confiança do atributo com um intervalo de 0 a 1 (por exemplo, {confidence: 0.9, label: face_nomask} indica que a pessoa detectada não está usando uma máscara facial)
task string A tarefa/classe de classificação de atributo

Formato JSON para os Insights da IA de persondistance

Exemplo de JSON para a saída de detecções por esta operação.

{
    "events": [
        {
            "id": "9c15619926ef417aa93c1faf00717d36",
            "type": "personDistanceEvent",
            "detectionIds": [
                "9037c65fa3b74070869ee5110fcd23ca",
                "7ad7f43fd1a64971ae1a30dbeeffc38a"
            ],
            "properties": {
                "personCount": 5,
                "averageDistance": 20.807043981552123,
                "minimumDistanceThreshold": 6.0,
                "maximumDistanceThreshold": "Infinity",
                "eventName": "TooClose",
                "distanceViolationPersonCount": 2
            },
            "zone": "lobbycamera",
            "trigger": "event"
        }
    ],
    "sourceInfo": {
        "id": "camera_id",
        "timestamp": "2020-08-24T06:17:25.309Z",
        "width": 608,
        "height": 342,
        "frameId": "1199",
        "cameraCalibrationInfo": {
            "status": "Calibrated",
            "cameraHeight": 12.9940824508667,
            "focalLength": 401.2800598144531,
            "tiltupAngle": 1.057669997215271
        },
        "imagePath": ""
    },
    "detections": [
        {
            "type": "person",
            "id": "9037c65fa3b74070869ee5110fcd23ca",
            "region": {
                "type": "RECTANGLE",
                "points": [
                    {
                        "x": 0.39988183975219727,
                        "y": 0.2719132942065858
                    },
                    {
                        "x": 0.5051516984638414,
                        "y": 0.6488402517218339
                    }
                ]
            },
            "confidence": 0.948630690574646,
	    "metadata": {
                "centerGroundPointX": "-1.4638760089874268",
                "centerGroundPointY": "18.29732322692871",
		"groundOrientationAngle": "1.3",
                "footprintX": "0.7306610584259033",
                "footprintY": "0.8814966493381893"
            }
        },
        {
            "type": "person",
            "id": "7ad7f43fd1a64971ae1a30dbeeffc38a",
            "region": {
                "type": "RECTANGLE",
                "points": [
                    {
                        "x": 0.5200299714740954,
                        "y": 0.2875368218672903
                    },
                    {
                        "x": 0.6457497446160567,
                        "y": 0.6183311060855263
                    }
                ]
            },
            "confidence": 0.8235412240028381,
            "metadata": {
                "centerGroundPointX": "2.6310102939605713",
                "centerGroundPointY": "18.635927200317383",
		"groundOrientationAngle": "1.3",
                "footprintX": "0.7306610584259033",
                "footprintY": "0.8814966493381893"
            }
        }
    ],
    "schemaVersion": "2.0"
}
Nome do campo do evento Tipo Descrição
id string ID do evento
type string Tipo de evento
detectionsId array Matriz de tamanho 1 do identificador exclusivo da detecção de pessoa que disparou este evento
properties collection Coleção de valores
personCount INT Número de pessoas detectadas quando o evento foi emitido
averageDistance FLOAT A distância média entre todas as pessoas detectadas em pés
minimumDistanceThreshold FLOAT A distância em pés que dispara um evento "TooClose" quando as pessoas estão a uma distância inferior a esse valor.
maximumDistanceThreshold FLOAT A distância em pés que dispara um evento "TooFar" quando as pessoas estão a uma distância superior a esse valor.
eventName string O nome do evento é TooClose com o minimumDistanceThreshold violado, TooFar quando maximumDistanceThreshold é violado ou unknown quando a calibragem automática não foi concluída
distanceViolationPersonCount INT Número de pessoas detectadas em violação de minimumDistanceThreshold ou maximumDistanceThreshold
zone string O campo "name" do polígono que representa a zona que foi monitorada com relação ao distanciamento entre as pessoas
trigger string O tipo de gatilho é 'event' ou 'interval' dependendo do valor de trigger em SPACEANALYTICS_CONFIG
Nome do campo de detecções Tipo Descrição
id string ID da detecção
type string Tipo de detecção
region collection Coleção de valores
type string Tipo de região
points collection Pontos superior esquerdo e inferior direito quando o tipo de região é RECTANGLE
confidence FLOAT Confiança do algoritmo
centerGroundPointX/centerGroundPointY 2 valores flutuantes Valores x, y com as coordenadas do local inferido da pessoa no solo em pés. x e y são coordenadas no plano do solo, supondo que o solo seja nivelado. O local da câmera é a origem.

No centerGroundPoint, x é o componente de distância da câmera para a pessoa que está perpendicular ao plano de imagem da câmera. y é o componente da distância paralela ao plano de imagem da câmera.

Exemplo de ponto central no solo

Neste exemplo, centerGroundPoint é {centerGroundPointX: 4, centerGroundPointY: 5}. Isso significa que há uma pessoa a quatro pés a frente da câmera e a cinco pés à direita observando a sala de cima para baixo.

Nome do campo SourceInfo Tipo Descrição
id string ID da Câmera
timestamp date Data UTC quando a carga JSON foi emitida
width INT Largura do quadro do vídeo
height INT Altura do quadro do vídeo
frameId INT Identificador de quadro
cameraCallibrationInfo collection Coleção de valores
status string O status da calibragem no formato de state[;progress description]. O estado pode ser Calibrating, Recalibrating (se a recalibragem estiver habilitada) ou Calibrated. A parte de descrição do progresso só é válida quando está no estado Calibrating e Recalibrating, que é usado para mostrar o progresso do processo de calibragem atual.
cameraHeight FLOAT A altura da câmera acima do solo em pés. Isso é inferido com base na calibragem automática.
focalLength FLOAT A distância focal da câmera em pixels. Isso é inferido com base na calibragem automática.
tiltUpAngle FLOAT O ângulo de inclinação da câmera na vertical. Isso é inferido com base na calibragem automática.

Formato JSON para os Insights da IA de spatialanalysis

A saída dessa operação depende do events configurado. Por exemplo, se houver um evento zonecrossing configurado para a operação, a saída será igual a cognitiveservices.vision.spatialanalysis-personcrossingpolygon.

Usar a saída gerada pelo contêiner

Você pode desejar integrar a detecção ou eventos de Análise Espacial em seu aplicativo. Veja algumas abordagens a serem consideradas:

  • Use o SDK dos Hubs de Eventos do Azure da linguagem de programação escolhida para se conectar ao ponto de extremidade do Hub IoT do Azure e receber os eventos. Para saber mais, confira Ler as mensagens de dispositivo para nuvem do ponto de extremidade interno.
  • Configure o Roteamento de mensagens no Hub IoT do Azure para enviar os eventos para outros pontos de extremidade ou salve os eventos no armazenamento de dados. Para saber mais, confira Roteamento de mensagens do Hub IoT.
  • Configure um trabalho do Azure Stream Analytics para processar os eventos em tempo real à medida que eles chegam e criar visualizações.

Implantar operações da análise espacial em escala (várias câmeras)

Para obter o melhor desempenho e utilização das GPUs, você pode implantar qualquer operação de Análise Espacial em várias câmeras usando instâncias de grafo. Veja abaixo um exemplo de configuração para executar a operação cognitiveservices.vision.spatialanalysis-personcrossingline em 15 câmeras.

  "properties.desired": {
      "globalSettings": {
          "PlatformTelemetryEnabled": false,
          "CustomerTelemetryEnabled": true
      },
      "graphs": {
        "personzonelinecrossing": {
        "operationId": "cognitiveservices.vision.spatialanalysis-personcrossingline",
        "version": 1,
        "enabled": true,
        "sharedNodes": {
            "shared_detector0": {
                "node": "PersonCrossingLineGraph.detector",
                "parameters": {
                    "DETECTOR_NODE_CONFIG": "{ \"gpu_index\": 0, \"batch_size\": 7, \"do_calibration\": true}",
                }
            },
            "shared_calibrator0": {
                "node": "PersonCrossingLineGraph/cameracalibrator",
                "parameters": {
                    "CAMERACALIBRATOR_NODE_CONFIG": "{ \"gpu_index\": 0, \"do_calibration\": true, \"enable_zone_placement\": true}",
                    "CALIBRATION_CONFIG": "{\"enable_recalibration\": true, \"quality_check_frequency_seconds\": 86400}",
                }
        },
        "parameters": {
            "VIDEO_DECODE_GPU_INDEX": 0,
            "VIDEO_IS_LIVE": true
        },
        "instances": {
            "1": {
                "sharedNodeMap": {
                    "PersonCrossingLineGraph/detector": "shared_detector0",
		    "PersonCrossingLineGraph/cameracalibrator": "shared_calibrator0",
                },
                "parameters": {
                    "VIDEO_URL": "<Replace RTSP URL for camera 1>",
                    "VIDEO_SOURCE_ID": "camera 1",
                    "SPACEANALYTICS_CONFIG": "{\"zones\":[{\"name\":\"queue\",\"polygon\":[[0,0],[1,0],[0,1],[1,1],[0,0]]}]}"
                }
            },
            "2": {
                "sharedNodeMap": {
                    "PersonCrossingLineGraph/detector": "shared_detector0",
		    "PersonCrossingLineGraph/cameracalibrator": "shared_calibrator0",
                },
                "parameters": {
                    "VIDEO_URL": "<Replace RTSP URL for camera 2>",
                    "VIDEO_SOURCE_ID": "camera 2",
                    "SPACEANALYTICS_CONFIG": "<Replace the zone config value, same format as above>"
                }
            },
            "3": {
                "sharedNodeMap": {
                    "PersonCrossingLineGraph/detector": "shared_detector0",
		    "PersonCrossingLineGraph/cameracalibrator": "shared_calibrator0",
                },
                "parameters": {
                    "VIDEO_URL": "<Replace RTSP URL for camera 3>",
                    "VIDEO_SOURCE_ID": "camera 3",
                    "SPACEANALYTICS_CONFIG": "<Replace the zone config value, same format as above>"
                }
            },
            "4": {
                "sharedNodeMap": {
                    "PersonCrossingLineGraph/detector": "shared_detector0",
		    "PersonCrossingLineGraph/cameracalibrator": "shared_calibrator0",
                },
                "parameters": {
                    "VIDEO_URL": "<Replace RTSP URL for camera 4>",
                    "VIDEO_SOURCE_ID": "camera 4",
                    "SPACEANALYTICS_CONFIG": "<Replace the zone config value, same format as above>"
                }
            },
            "5": {
                "sharedNodeMap": {
                    "PersonCrossingLineGraph/detector": "shared_detector0",
		    "PersonCrossingLineGraph/cameracalibrator": "shared_calibrator0",
                },
                "parameters": {
                    "VIDEO_URL": "<Replace RTSP URL for camera 5>",
                    "VIDEO_SOURCE_ID": "camera 5",
                    "SPACEANALYTICS_CONFIG": "<Replace the zone config value, same format as above>"
                }
            },
            "6": {
                "sharedNodeMap": {
                    "PersonCrossingLineGraph/detector": "shared_detector0",
		    "PersonCrossingLineGraph/cameracalibrator": "shared_calibrator0",
                },
                "parameters": {
                    "VIDEO_URL": "<Replace RTSP URL for camera 6>",
                    "VIDEO_SOURCE_ID": "camera 6",
                    "SPACEANALYTICS_CONFIG": "<Replace the zone config value, same format as above>"
                }
            },
            "7": {
                "sharedNodeMap": {
                    "PersonCrossingLineGraph/detector": "shared_detector0",
		    "PersonCrossingLineGraph/cameracalibrator": "shared_calibrator0",
                },
                "parameters": {
                    "VIDEO_URL": "<Replace RTSP URL for camera 7>",
                    "VIDEO_SOURCE_ID": "camera 7",
                    "SPACEANALYTICS_CONFIG": "<Replace the zone config value, same format as above>"
                }
            },
            "8": {
                "sharedNodeMap": {
                    "PersonCrossingLineGraph/detector": "shared_detector0",
		    "PersonCrossingLineGraph/cameracalibrator": "shared_calibrator0",
                },
                "parameters": {
                    "VIDEO_URL": "<Replace RTSP URL for camera 8>",
                    "VIDEO_SOURCE_ID": "camera 8",
                    "SPACEANALYTICS_CONFIG": "<Replace the zone config value, same format as above>"
                }
            },
            "9": {
                "sharedNodeMap": {
                    "PersonCrossingLineGraph/detector": "shared_detector0",
		    "PersonCrossingLineGraph/cameracalibrator": "shared_calibrator0",
                },
                "parameters": {
                    "VIDEO_URL": "<Replace RTSP URL for camera 9>",
                    "VIDEO_SOURCE_ID": "camera 9",
                    "SPACEANALYTICS_CONFIG": "<Replace the zone config value, same format as above>"
                }
            },
            "10": {
                "sharedNodeMap": {
                    "PersonCrossingLineGraph/detector": "shared_detector0",
		    "PersonCrossingLineGraph/cameracalibrator": "shared_calibrator0",
                },
                "parameters": {
                    "VIDEO_URL": "<Replace RTSP URL for camera 10>",
                    "VIDEO_SOURCE_ID": "camera 10",
                    "SPACEANALYTICS_CONFIG": "<Replace the zone config value, same format as above>"
                }
            },
            "11": {
                "sharedNodeMap": {
                    "PersonCrossingLineGraph/detector": "shared_detector0",
		    "PersonCrossingLineGraph/cameracalibrator": "shared_calibrator0",
                },
                "parameters": {
                    "VIDEO_URL": "<Replace RTSP URL for camera 11>",
                    "VIDEO_SOURCE_ID": "camera 11",
                    "SPACEANALYTICS_CONFIG": "<Replace the zone config value, same format as above>"
                }
            },
            "12": {
                "sharedNodeMap": {
                    "PersonCrossingLineGraph/detector": "shared_detector0",
		    "PersonCrossingLineGraph/cameracalibrator": "shared_calibrator0",
                },
                "parameters": {
                    "VIDEO_URL": "<Replace RTSP URL for camera 12>",
                    "VIDEO_SOURCE_ID": "camera 12",
                    "SPACEANALYTICS_CONFIG": "<Replace the zone config value, same format as above>"
                }
            },
            "13": {
                "sharedNodeMap": {
                    "PersonCrossingLineGraph/detector": "shared_detector0",
		    "PersonCrossingLineGraph/cameracalibrator": "shared_calibrator0",
                },
                "parameters": {
                    "VIDEO_URL": "<Replace RTSP URL for camera 13>",
                    "VIDEO_SOURCE_ID": "camera 13",
                    "SPACEANALYTICS_CONFIG": "<Replace the zone config value, same format as above>"
                }
            },
            "14": {
                "sharedNodeMap": {
                    "PersonCrossingLineGraph/detector": "shared_detector0",
		    "PersonCrossingLineGraph/cameracalibrator": "shared_calibrator0",
                },
                "parameters": {
                    "VIDEO_URL": "<Replace RTSP URL for camera 14>",
                    "VIDEO_SOURCE_ID": "camera 14",
                    "SPACEANALYTICS_CONFIG": "<Replace the zone config value, same format as above>"
                }
            },
            "15": {
                "sharedNodeMap": {
                    "PersonCrossingLineGraph/detector": "shared_detector0",
		    "PersonCrossingLineGraph/cameracalibrator": "shared_calibrator0",
                },
                "parameters": {
                    "VIDEO_URL": "<Replace RTSP URL for camera 15>",
                    "VIDEO_SOURCE_ID": "camera 15",
                    "SPACEANALYTICS_CONFIG": "<Replace the zone config value, same format as above>"
                }
            }
          }
        },
      }
  }
Nome Tipo Descrição
batch_size INT Se todas as câmeras tiverem a mesma resolução, defina batch_size como o número de câmeras que serão usadas na operação. Caso contrário, defina batch_size como 1 ou deixe como padrão (1), o que indica que não há suporte para nenhum lote.

Próximas etapas