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 código aberto antes da data especificada. Recomendamos que você faça a mudança o quanto antes para aproveitar os melhores benefícios do Azure AI Video Indexer. Além dos recursos conhecidos que você está usando, aqui está uma rápida comparação 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 ao Edge | Sim | Sim |
Detecção de objetos | Somente detecção de pessoas e veículos | Detecta mais de 1.000 objetos |
Processamento de áudio/fala | Sem suporte | Com suporte (inclui tradução, resumo e transcrição de fala) 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 |
Até 30 de março de 2025, você pode continuar usando 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:
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.
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. |