Partilhar via


Operações de Análise Espacial

Importante

Em 30 de março de 2025, o Azure AI Vision Spatial Analysis será desativado. Faça a transição para o Azure AI Video Indexer ou outra solução de código aberto antes da data especificada. Recomendamos que você faça a mudança mais cedo para obter os benefícios mais ricos 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 do Azure AI Vision e o Azure AI Video Indexer.

Caraterística Análise Espacial do Azure AI Vision Azure AI Video Indexer
Suporte de borda Sim Sim
Deteção de Objetos Pessoas e apenas deteção de veículos Deteta 1000+ objetos
Processamento de Áudio/Fala Não suportado Suportado (inclui transcrição, tradução e sumarização de fala)
Suportado >(inclui transcrição de fala e análise de sentimento)
Deteção de eventos e rastreamento Suportado (rastreamento de pessoas e veículos, deteção de eventos) Ainda não é suportado no Edge. É parcialmente suportado na nuvem.
Suporte do Azure Arc Não suportado Suporte nativo
Área de foco Análise visual com acompanhamento especializado Análise abrangente de conteúdo áudio e visual

De agora até 30 de março de 2025, você pode continuar a usar a Análise Espacial do Azure AI Vision ou fazer a transição para o Azure AI Video Indexer antes da data especificada. Após 30 de março de 2025, o contentor de Análise Espacial deixará de ser suportado e deixará de processar novos fluxos.

A Análise Espacial permite-lhe analisar fluxos de vídeo a partir de dispositivos de câmara em tempo real. Para cada dispositivo de câmera configurado, as operações de Análise Espacial gerarão um fluxo de saída de mensagens JSON enviadas para sua instância do Hub IoT do Azure.

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

Identificador da operação Description
cognitiveservices.vision.spatialanalysis-personcount Conta pessoas em uma zona designada no campo de visão da câmera. A zona deve ser totalmente coberta por uma única câmera para que o PersonCount grave um total preciso.
Emite um evento inicial personCountEvent e, em seguida, eventos personCountEvent quando a contagem é alterada.
cognitiveservices.vision.spatialanalysis-personcrossingline Rastreia 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 direcionais.
cognitiveservices.vision.spatialanalysis-personcrossingpolygon Emite um evento personZoneEnterExitEvent quando uma pessoa entra ou sai da zona designada e fornece informações direcionais com o lado da zona que foi cruzada. Emite um personZoneDwellTimeEvent quando a pessoa sai da zona e fornece informações direcionais, bem como o número de milissegundos que a pessoa passou dentro da zona.
cognitiveservices.vision.spatialanalysis-persondistance Rastreia quando as pessoas violam uma regra de distância mínima.
Emite um personDistanceEvent periodicamente com a localização 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 .debug versão do serviço (por exemplo, cognitiveservices.vision.spatialanalysis-personcount.debug). O Debug tem a capacidade de visualizar quadros de vídeo enquanto eles estão sendo processados. Você precisará executar xhost + no computador host para permitir a visualização de quadros de vídeo e eventos.

Importante

Os modelos de IA do Azure AI Vision detetam e localizam a presença humana em imagens de vídeo e produzem uma caixa delimitadora ao redor do corpo humano. Os modelos de IA não tentam descobrir as identidades ou demografias dos indivíduos.

Parâmetros de operação

Seguem-se os parâmetros exigidos por cada uma das operações de Análise Espacial.

Parâmetros de operação Description
Operation ID O identificador de operação da tabela acima.
enabled Booleano: verdadeiro ou falso
VIDEO_URL O URL RTSP para o dispositivo de câmera (exemplo: rtsp://username:password@url). A Análise Espacial suporta fluxo codificado H.264 através de RTSP, http ou mp4. Video_URL pode ser fornecido como um valor de cadeia de caracteres base64 ofuscado usando criptografia AES e, se a url do vídeo for ofuscada, precisará KEY_ENV IV_ENV ser fornecida como variáveis de ambiente. Exemplo de utilitário para gerar chaves e criptografia pode ser encontrado aqui.
VIDEO_SOURCE_ID Um nome amigável para o dispositivo de câmera ou fluxo de vídeo. Isso será retornado com a saída JSON do evento.
VIDEO_IS_LIVE Verdadeiro para dispositivos de 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 o mesmo que em gpu_index outra configuração de nó como DETECTOR_NODE_CONFIG e CAMERACALIBRATOR_NODE_CONFIG.
INPUT_VIDEO_WIDTH Largura do quadro de vídeo/fluxo de entrada (por exemplo, 1920). Este é um campo opcional e, se fornecido, o quadro será dimensionado para esta dimensão, preservando a proporção.
DETECTOR_NODE_CONFIG JSON indicando em qual GPU executar o nó do detetor. Deve estar no seguinte formato: "{ \"gpu_index\": 0 }",
TRACKER_NODE_CONFIG JSON indicando se a velocidade deve ser calculada no nó do rastreador ou não. Deve estar no seguinte formato: "{ \"enable_speed\": true }",
CAMERA_CONFIG JSON indicando os parâmetros da câmera calibrada para várias câmeras. Se a habilidade que você usou requer calibração e você já tem o parâmetro da câmera, você pode usar essa configuração para fornecê-los diretamente. 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. Pode ser obtido a source_info partir do evento que publicamos. Só entrará em vigor quando do_calibration=false estiver em DETECTOR_NODE_CONFIG.
CAMERACALIBRATOR_NODE_CONFIG JSON indicando em qual GPU executar o nó do calibrador da câmera e se deve usar a calibração ou não. Deve estar no seguinte formato: "{ \"gpu_index\": 0, \"do_calibration\": true, \"enable_orientation\": true}",
CALIBRATION_CONFIG JSON indicando parâmetros para controlar como funciona a calibração da câmera. Deve estar no seguinte formato: "{\"enable_recalibration\": true, \"quality_check_frequency_seconds\": 86400}",
SPACEANALYTICS_CONFIG Configuração JSON para zona e linha, conforme descrito abaixo.
ENABLE_FACE_MASK_CLASSIFIER True para permitir a deteção de pessoas usando máscaras faciais no fluxo de vídeo, False para desativá-lo. Por padrão, isso está desativado. A deteção de máscara facial requer que o parâmetro de largura de vídeo de entrada seja 1920 "INPUT_VIDEO_WIDTH": 1920. O atributo de máscara facial não será retornado se as pessoas detetadas não estiverem voltadas para a câmera ou estiverem muito longe dela. Para obter mais informações, consulte o posicionamento da câmera.
STATIONARY_TARGET_REMOVER_CONFIG JSON indicando os parâmetros para a remoção de alvos estacionários, o 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 de parâmetros do nó do detetor

Segue-se DETECTOR_NODE_CONFIG um exemplo dos parâmetros para todas as operações de Análise Espacial.

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

Configurações de parâmetros do nó de calibração da câmera

Segue-se CAMERACALIBRATOR_NODE_CONFIG um exemplo dos parâmetros para todas as operações de análise espacial.

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

Configuração de calibração

Este é um exemplo dos parâmetros para todas as operações de CALIBRATION_CONFIG 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 Description
enable_recalibration booleano Indica se a recalibração automática está ativada. A predefinição é true.
calibration_quality_check_frequency_seconds número inteiro Número mínimo de segundos entre cada verificação de qualidade para determinar se é ou não necessária uma recalibração. O padrão é 86400 (24 horas). Utilizado apenas quando enable_recalibration=True.
calibration_quality_check_sample_collect_frequency_seconds número inteiro Número mínimo de segundos entre a recolha de novas amostras de dados para recalibração e verificação da qualidade. O padrão é 300 (5 minutos). Utilizado apenas quando enable_recalibration=True.
calibration_quality_check_one_round_sample_collect_num número inteiro Número mínimo de novas amostras de dados a recolher por ronda de recolha de amostras. A predefinição é 10. Utilizado apenas quando enable_recalibration=True.
calibration_quality_check_queue_max_size número inteiro Número máximo de amostras de dados para armazenar quando o modelo da câmera é calibrado. A predefinição é 1000. Utilizado apenas quando enable_recalibration=True.
calibration_event_frequency_seconds número inteiro Frequência de saída (segundos) dos eventos de calibração da câmara. Um valor indica que a calibração da câmera não deve ser enviada, a menos que as informações de calibração da -1 câmera tenham sido alteradas. A predefinição é -1.

Saída de calibração da câmera

A seguir está um exemplo da saída da calibração da câmera, se habilitada. As elipses 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
      }
    ]
  }
}

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

Nome do campo ZonePlacementInfo Tipo Description
optimalZonePolygon objeto Um polígono na imagem da câmara onde podem ser colocadas linhas ou zonas para as suas operações para obter os melhores resultados.
Cada par de valores representa o x,y para vértices de um polígono. O polígono representa as áreas nas quais as pessoas são rastreadas ou contadas e os pontos do polígono são baseados em coordenadas normalizadas (0-1), onde 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 onde linhas ou zonas para suas operações podem ser colocadas para bons resultados, mas possivelmente não ideais.
Veja optimalZonePolygon acima uma explicação detalhada do conteúdo.
uniformlySpacedPersonBoundingBoxes list Uma lista de caixas delimitadoras de pessoas dentro da imagem da câmera distribuída uniformemente no espaço real. Os valores são baseados em coordenadas normalizadas (0-1).
personBoundingBoxGroundPoints list Uma lista de coordenadas no plano do chão em relação à câmera. Cada coordenada corresponde ao canto inferior direito da caixa delimitadora com uniformlySpacedPersonBoundingBoxes o mesmo índice.
Consulte os centerGroundPointX/centerGroundPointY campos sob o formato JSON para a seção cognitiveservices.vision.spatialanalysis-persondistance AI Insights para obter mais detalhes sobre como as coordenadas no plano do piso são calculadas.

Exemplo da 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 da zona fornecem sugestões para suas configurações, mas as diretrizes em Configuração da câmera ainda devem ser seguidas para obter melhores resultados.

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

Você pode configurar o cálculo de velocidade através das configurações de parâmetros 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 Description
enable_speed booleano Indica se você deseja calcular a velocidade para as pessoas detetadas ou não. enable_speed é definido por padrão como True. É altamente recomendável que você habilite a velocidade e a orientação para ter os melhores valores estimados.
remove_stationary_objects booleano Indica se você deseja remover objetos estacionários. remove_stationary_objects é definido por padrão como True.
stationary_objects_dist_threshold_in_pixels número inteiro O limite de distância de vizinhança para decidir se duas caixas de deteção podem ser tratadas como a mesma deteção. stationary_objects_dist_threshold_in_pixels é definido por padrão como 5.
stationary_objects_buffer_length_in_seconds número inteiro O período mínimo de tempo em segundos que o sistema tem que 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 3600.
stationary_objects_filter_ratio flutuante Se um alvo for repetidamente detetado no mesmo local (definido em stationary_objects_dist_threshold_in_pixels) para maior stationary_objects_filter_ratio (0,2 significa 20%) do stationary_objects_buffer_length_in_seconds intervalo de tempo, ele será tratado como um alvo estacionário. stationary_objects_filter_ratio é definido por padrão como 0,2.

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

Configuração de zona para contagem de pessoas

A seguir está um exemplo de uma 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 para esta zona.
polygon list Cada par de valores representa o x,y para vértices de um polígono. O polígono representa as áreas em que as pessoas são rastreadas ou contadas. Os pontos do polígono são baseados em coordenadas normalizadas (0-1), onde o canto superior esquerdo é (0,0, 0,0) e o canto inferior direito é (1,0, 1,0).
threshold flutuante Os eventos são egressos quando a pessoa é maior do que esse número de pixels dentro da zona. Este é um campo opcional e o valor está na proporção (0-1). Por exemplo, o valor 0,0253 será 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 suportados destinam-se event ao envio de eventos quando a contagem é alterada ou interval ao envio de eventos periodicamente, independentemente de a contagem ter sido alterada ou não.
output_frequency número inteiro A velocidade com que os eventos são egressos. Quando output_frequency = X, cada evento X é egresso, ex. output_frequency = 2 significa que todos os outros eventos são saída. O output_frequency é aplicável a ambos e intervalevent .
focus string A localização do ponto dentro da caixa delimitadora da pessoa usada para calcular eventos. O valor do foco pode ser footprint (a pegada da pessoa), bottom_center (o centro inferior da caixa delimitadora da pessoa), center (o centro da caixa delimitadora da pessoa).

Configuração de linha para personcrossingline

A seguir está um exemplo de uma entrada JSON para o SPACEANALYTICS_CONFIG parâmetro 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 para esta linha.
line list A definição da linha. Esta é uma linha direcional que lhe permite entender "entrada" vs. "saída".
start par de valores x, y coordenadas para o ponto de partida da linha. Os valores float representam a posição do vértice em relação ao canto superior esquerdo. Para calcular os valores absolutos x, y, multiplique esses valores pelo tamanho do quadro.
end par de valores x, y coordenadas para o 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 x, y, multiplique esses valores pelo tamanho do quadro.
threshold flutuante Os eventos são egressos quando a pessoa é maior do que esse número de pixels dentro da zona. Este é um campo opcional e o valor está na proporção (0-1). Por exemplo, o valor 0,0253 será 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 suportados: "evento": disparar quando alguém cruza a linha.
focus string A localização do ponto dentro da caixa delimitadora da pessoa usada para calcular eventos. O valor do foco pode ser footprint (a pegada da pessoa), bottom_center (o centro inferior da caixa delimitadora da pessoa), center (o centro da caixa delimitadora da pessoa). O valor padrão é footprint.

Configuração de zona para personcrossingpolygon

Este é um exemplo de uma entrada JSON para o SPACEANALYTICS_CONFIG parâmetro 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 para esta zona.
polygon list Cada par de valores representa o x,y para vértices de polígono. O polígono representa as áreas em que 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 x, y, multiplique esses valores pelo tamanho do quadro.
target_side número inteiro Especifica um lado da zona definido por polygon para medir quanto tempo as pessoas enfrentam esse lado enquanto estão na zona. 'dwellTimeForTargetSide' produzirá esse tempo estimado. Cada lado é uma aresta numerada entre os dois vértices do polígono que representa a sua zona. Por exemplo, a aresta entre os dois primeiros vértices do polígono representa o primeiro lado, 'lado'=1. O valor de target_side está entre [0,N-1] onde N está o número de lados do polygon. Este é um campo opcional.
threshold flutuante Os eventos são egressos quando a pessoa é maior do que esse número de pixels dentro da zona. Este é um campo opcional e o valor está na proporção (0-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 isso deve ser zonecrossing ou zonedwelltime.
trigger string O tipo de gatilho para enviar um evento
Valores suportados: "evento": disparar quando alguém entra ou sai da zona.
focus string A localização do ponto dentro da caixa delimitadora da pessoa usada para calcular eventos. O valor do foco pode ser footprint (a pegada da pessoa), bottom_center (o centro inferior da caixa delimitadora da pessoa), center (o centro da caixa delimitadora da pessoa). O valor padrão é footprint.

Configuração de zona para persondistance

Este é um exemplo de uma entrada JSON para o SPACEANALYTICS_CONFIG parâmetro 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 para esta zona.
polygon list Cada par de valores representa o x,y para vértices de 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 x, y, multiplique esses valores pelo tamanho do quadro.
threshold flutuante Os eventos são egressos quando a pessoa é maior do que esse número de pixels dentro da zona. Este é um campo opcional e o valor está na proporção (0-1). Por exemplo, o valor 0,0253 será 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 suportados destinam-se event ao envio de eventos quando a contagem é alterada ou interval ao envio de eventos periodicamente, independentemente de a contagem ter sido alterada ou não.
output_frequency número inteiro A velocidade com que os eventos são egressos. Quando output_frequency = X, cada evento X é egresso, ex. output_frequency = 2 significa que todos os outros eventos são saída. O output_frequency é aplicável a ambos e intervalevent .
minimum_distance_threshold flutuante Uma distância em pés que desencadeará um evento "TooClose" quando as pessoas estiverem a menos de distância entre si.
maximum_distance_threshold flutuante Uma distância em pés que desencadeará um evento "TooFar" quando as pessoas estiverem separadas por mais do que essa distância.
aggregation_method string O método do resultado agregado persondistance . O aggregation_method é aplicável a ambos e mode average.
focus string A localização do ponto dentro da caixa delimitadora da pessoa usada para calcular eventos. O valor do foco pode ser footprint (a pegada da pessoa), bottom_center (o centro inferior da caixa delimitadora da pessoa), center (o centro da caixa delimitadora da pessoa).

Configuração para análise espacial

A seguir está um exemplo de uma entrada JSON para o SPACEANALYTICS_CONFIG parâmetro que configura uma linha e zona para cognitiveservices.vision.spatialanalysis. Você pode configurar várias linhas/zonas para esta operação e cada linha/zona 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âmara

Consulte 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 enviados para o Hub IoT do Azure no formato JSON.

Formato JSON para contagem de pessoas AI Insights

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 Description
id string ID do Evento
type string Tipo de evento
detectionsId matriz Matriz de tamanho 1 de identificador exclusivo da deteção de pessoa que disparou esse evento
properties Coleção Recolha de valores
trackinId string Identificador único da pessoa detetada
zone string O campo "nome" do polígono que representa a zona que foi cruzada
trigger string O tipo de gatilho é 'evento' ou 'intervalo', dependendo do valor de trigger in SPACEANALYTICS_CONFIG
Nome do campo de deteções Tipo Description
id string ID de deteção
type string Tipo de deteção
region Coleção Recolha de valores
type string Tipo de região
points Coleção Pontos superiores esquerdo e inferior direito quando o tipo de região é RECTANGLE
confidence flutuante Confiança no algoritmo
attributes matriz 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 detetada está usando uma máscara facial)
confidence (attribute) flutuante O valor de confiança do atributo com intervalo de 0 a 1 (por exemplo, {confidence: 0.9, label: face_nomask} indica que a pessoa detetada não está usando uma máscara facial)
task string A tarefa/classe de classificação de atributos
Nome do campo SourceInfo Tipo Description
id string ID da câmara
timestamp data Data UTC em que a carga JSON foi emitida
width número inteiro Largura do quadro de vídeo
height número inteiro Altura do quadro de vídeo
frameId número inteiro Identificador de quadro
cameraCallibrationInfo Coleção Recolha de valores
status string O estado da calibração no formato de state[;progress description]. O estado pode ser Calibrating, Recalibrating (se a recalibração estiver habilitada) ou Calibrated. A parte de descrição do progresso só é válida quando está em Calibrating e Recalibrating estado, que é usado para mostrar o progresso do processo de calibração atual.
cameraHeight flutuante A altura da câmera acima do solo em pés. Isto é inferido a partir da autocalibração.
focalLength flutuante A distância focal da câmera em pixels. Isto é inferido a partir da autocalibração.
tiltUpAngle flutuante O ângulo de inclinação da câmera da vertical. Isto é inferido a partir da autocalibração.

Formato JSON para personcrossingline AI Insights

Exemplo de JSON para deteções saídas 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 Description
id string ID do Evento
type string Tipo de evento
detectionsId matriz Matriz de tamanho 1 de identificador exclusivo da deteção de pessoa que disparou esse evento
properties Coleção Recolha de valores
trackinId string Identificador único da pessoa detetada
status string Direção dos cruzamentos de linha, 'CrossLeft' ou 'CrossRight'. A direção baseia-se em imaginar em pé no "início" de frente para o "fim" da linha. CrossRight é cruzar da esquerda para a direita. CrossLeft é cruzar da direita para a esquerda.
orientationDirection string A direção de orientação da pessoa detetada depois de cruzar a linha. O valor pode ser 'Esquerda', 'Direita' ou 'Reto'. Este valor é saída se enable_orientation estiver definido como True em CAMERACALIBRATOR_NODE_CONFIG
zone string O campo "nome" da linha que foi cruzada
Nome do campo de deteções Tipo Description
id string ID de deteção
type string Tipo de deteção
region Coleção Recolha de valores
type string Tipo de região
points Coleção Pontos superiores esquerdo e inferior direito quando o tipo de região é RECTANGLE
groundOrientationAngle flutuante O ângulo radiano no sentido horário da orientação da pessoa no plano de solo inferido
mappedImageOrientation flutuante O ângulo radiano projetado no sentido horário da orientação da pessoa no espaço de imagem 2D
speed flutuante A velocidade estimada da pessoa detetada. A unidade é foot per second (ft/s)
confidence flutuante Confiança no algoritmo
attributes matriz 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 detetada está usando uma máscara facial)
confidence (attribute) flutuante O valor de confiança do atributo com intervalo de 0 a 1 (por exemplo, {confidence: 0.9, label: face_nomask} indica que a pessoa detetada não está usando uma máscara facial)
task string A tarefa/classe de classificação de atributos
Nome do campo SourceInfo Tipo Description
id string ID da câmara
timestamp data Data UTC em que a carga JSON foi emitida
width número inteiro Largura do quadro de vídeo
height número inteiro Altura do quadro de vídeo
frameId número inteiro Identificador de quadro

Importante

O modelo de IA deteta uma pessoa independentemente de a pessoa estar virada para ou longe da câmara. O modelo de IA não executa reconhecimento facial e não emite nenhuma informação biométrica.

Formato JSON para personcrossingpolygon AI Insights

Exemplo de JSON para deteções saídas por esta operação com zonecrossing o tipo 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 deteções saídas por esta operação com zonedwelltime o tipo 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 Description
id string ID do Evento
type string Tipo de evento. O valor pode ser personZoneDwellTimeEvent ou personZoneEnterExitEvent
detectionsId matriz Matriz de tamanho 1 de identificador exclusivo da deteção de pessoa que disparou esse evento
properties Coleção Recolha de valores
trackinId string Identificador único da pessoa detetada
status string Direção das travessias de polígonos, 'Enter' ou 'Exit'
side número inteiro O número do lado do polígono que a pessoa cruzou. Cada lado é uma aresta numerada entre os dois vértices do polígono que representa a sua zona. A aresta entre os dois primeiros vértices do polígono representa o primeiro lado. 'Lado' 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 atravessando um lado da zona, ou uma entrada ocorreu quando uma pessoa apareceu na zona, mas não foi vista atravessando um lado.
dwellTime flutuante O número de milissegundos que representam o tempo que a pessoa passou na zona. Este campo é fornecido quando o tipo de evento é personZoneDwellTimeEvent
dwellFrames número inteiro O número de quadros que a pessoa passou na zona. Este campo é fornecido quando o tipo de evento é personZoneDwellTimeEvent
dwellTimeForTargetSide flutuante O número de milissegundos que representam o tempo que a pessoa passou na zona e estava voltada para o target_side. Este campo é fornecido quando enable_orientation está True em CAMERACALIBRATOR_NODE_CONFIG e o valor de target_side é definido em SPACEANALYTICS_CONFIG
avgSpeed flutuante A velocidade média da pessoa na zona. A unidade é foot per second (ft/s)
minSpeed flutuante A velocidade mínima da pessoa na zona. A unidade é foot per second (ft/s)
zone string O campo "nome" do polígono que representa a zona que foi cruzada
Nome do campo de deteções Tipo Description
id string ID de deteção
type string Tipo de deteção
region Coleção Recolha de valores
type string Tipo de região
points Coleção Pontos superiores esquerdo e inferior direito quando o tipo de região é RECTANGLE
groundOrientationAngle flutuante O ângulo radiano no sentido horário da orientação da pessoa no plano de solo inferido
mappedImageOrientation flutuante O ângulo radiano projetado no sentido horário da orientação da pessoa no espaço de imagem 2D
speed flutuante A velocidade estimada da pessoa detetada. A unidade é foot per second (ft/s)
confidence flutuante Confiança no algoritmo
attributes matriz 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 detetada está usando uma máscara facial)
confidence (attribute) flutuante O valor de confiança do atributo com intervalo de 0 a 1 (por exemplo, {confidence: 0.9, label: face_nomask} indica que a pessoa detetada não está usando uma máscara facial)
task string A tarefa/classe de classificação de atributos

Formato JSON para persondistance AI Insights

Exemplo de JSON para deteções saídas 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 Description
id string ID do Evento
type string Tipo de evento
detectionsId matriz Matriz de tamanho 1 de identificador exclusivo da deteção de pessoa que disparou esse evento
properties Coleção Recolha de valores
personCount número inteiro Número de pessoas detetadas quando o evento foi emitido
averageDistance flutuante A distância média entre todas as pessoas detetadas nos pés
minimumDistanceThreshold flutuante A distância em pés que desencadeará um evento "TooClose" quando as pessoas estiverem a menos de distância entre si.
maximumDistanceThreshold flutuante A distância em pés que desencadeará um evento "TooFar" quando as pessoas estão maiores do que a distância separada.
eventName string O nome do evento está TooClose com o é violado, TooFar quando maximumDistanceThreshold é violado ou unknown quando a minimumDistanceThreshold calibração automática não foi concluída
distanceViolationPersonCount número inteiro Número de pessoas detetadas em violação de minimumDistanceThreshold ou maximumDistanceThreshold
zone string O campo "nome" do polígono que representa a zona que foi monitorada para distanciamento entre as pessoas
trigger string O tipo de gatilho é 'evento' ou 'intervalo', dependendo do valor de trigger in SPACEANALYTICS_CONFIG
Nome do campo de deteções Tipo Description
id string ID de deteção
type string Tipo de deteção
region Coleção Recolha de valores
type string Tipo de região
points Coleção Pontos superiores esquerdo e inferior direito quando o tipo de região é RECTANGLE
confidence flutuante Confiança no algoritmo
centerGroundPointX/centerGroundPointY 2 valores flutuantes x, y valores com as coordenadas da localização inferida da pessoa no chão em pés. x e y são coordenadas no plano do piso, assumindo que o piso é nivelado. A localização da câmera é a origem.

Em centerGroundPoint, x é o componente de distância da câmera para a pessoa que é perpendicular ao plano de imagem da câmera. y é o componente de distância que é paralelo ao plano de imagem da câmera.

Exemplo de ponto de terra central

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

Nome do campo SourceInfo Tipo Description
id string ID da câmara
timestamp data Data UTC em que a carga JSON foi emitida
width número inteiro Largura do quadro de vídeo
height número inteiro Altura do quadro de vídeo
frameId número inteiro Identificador de quadro
cameraCallibrationInfo Coleção Recolha de valores
status string O estado da calibração no formato de state[;progress description]. O estado pode ser Calibrating, Recalibrating (se a recalibração estiver habilitada) ou Calibrated. A parte de descrição do progresso só é válida quando está em Calibrating e Recalibrating estado, que é usado para mostrar o progresso do processo de calibração atual.
cameraHeight flutuante A altura da câmera acima do solo em pés. Isto é inferido a partir da autocalibração.
focalLength flutuante A distância focal da câmera em pixels. Isto é inferido a partir da autocalibração.
tiltUpAngle flutuante O ângulo de inclinação da câmera da vertical. Isto é inferido a partir da autocalibração.

Formato JSON para análise espacial AI Insights

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

Use a saída gerada pelo contêiner

Você pode querer integrar a deteção de Análise Espacial ou eventos em seu aplicativo. Aqui estão algumas abordagens a considerar:

  • Use o SDK dos Hubs de Eventos do Azure para sua linguagem de programação escolhida para se conectar ao ponto de extremidade do Hub IoT do Azure e receber os eventos. Para obter mais informações, consulte Ler mensagens do dispositivo para a nuvem a partir do ponto de extremidade interno.
  • Configure o Roteamento de Mensagens em seu Hub IoT do Azure para enviar os eventos para outros pontos de extremidade ou salvá-los em seu armazenamento de dados. Para obter mais informações, consulte Roteamento de mensagens do Hub IoT.
  • Configure um trabalho do Azure Stream Analytics para processar os eventos em tempo real à medida que chegam e criar visualizações.

Implante operações de 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 gráficas. Abaixo está um exemplo de configuração para executar a cognitiveservices.vision.spatialanalysis-personcrossingline operação em 15 câmaras.

  "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 Description
batch_size número inteiro Se todas as câmeras tiverem a mesma resolução, defina batch_size o número de câmeras que serão usadas nessa operação, caso contrário, defina batch_size como 1 ou deixe-o como padrão (1), o que indica que nenhum lote é suportado.

Próximos passos