Opérations d’analyse spatiale

L’analyse spatiale vous permet d’analyser les flux vidéo des caméras en temps réel. Pour chaque caméra que vous configurez, les opérations d’analyse spatiale génèrent un flux de sortie de messages JSON envoyés à votre instance Azure IoT Hub.

Le conteneur d’analyse spatiale implémente les opérations suivantes. Vous pouvez configurer ces opérations dans le manifeste de déploiement de votre conteneur.

Identificateur d'opération Description
cognitiveservices.vision.spatialanalysis-personcount Compte les personnes dans une zone désignée dans le champ de vue de la caméra. La zone doit être entièrement couverte par une seule caméra pour permettre à PersonCount d’enregistrer un total précis.
Émet un événement initial personCountEvent, puis des événements personCountEvent lorsque le nombre change.
cognitiveservices.vision.spatialanalysis-personcrossingline Effectue le suivi lorsqu’une personne traverse une ligne désignée dans le champ de vue de la caméra.
Émet un événement personLineEvent lorsque la personne traverse la ligne, et fournit des informations directionnelles.
cognitiveservices.vision.spatialanalysis-personcrossingpolygon Émet un événement personZoneEnterExitEvent quand une personne entre ou quitte la zone désignée, et fournit des informations directionnelles avec le côté de la zone qui a été franchie. Émet un événement personZoneDwellTimeEvent quand la personne quitte la zone et fournit des informations directionnelles ainsi que le nombre de millisecondes que la personne a passées à l’intérieur de la zone.
cognitiveservices.vision.spatialanalysis-persondistance Effectue le suivi lorsqu’une personne enfreint une règle de distance minimale.
Émet régulièrement un personDistanceEvent avec l’emplacement de chaque infraction de distance.
cognitiveservices.vision.spatialanalysis Opération générique qui peut être utilisée pour exécuter tous les scénarios mentionnés ci-dessus. Cette option est plus utile lorsque vous souhaitez exécuter plusieurs scénarios sur la même caméra ou utiliser des ressources système (par exemple, le GPU) de manière plus efficace.

Toutes les opérations ci-dessus sont également disponibles dans la version .debug du service (par exemple, cognitiveservices.vision.spatialanalysis-personcount.debug). Le débogage permet de visualiser les images vidéo à mesure qu’elles sont traitées. Vous devrez exécuter xhost + sur l’ordinateur hôte pour activer la visualisation des images et des événements vidéo.

Important

Les modèles d’IA de la Vision Azure AI détectent et localisent la présence humaine dans les images vidéo, et génèrent un cadre englobant autour du corps de la personne détectée. Les modèles d’IA n’essaient pas de découvrir les identités ou données démographiques des individus.

Paramètres d’opération

Les paramètres suivants sont exigés par chacune des opérations d’analyse spatiale.

Paramètres d’opération Description
Operation ID Identificateur d’opération de la table ci-dessus.
enabled Booléen : true ou false
VIDEO_URL URL RTSP de la caméra (exemple : rtsp://username:password@url). L’analyse spatiale prend en charge les flux encodés en H.264 via RTSP, http ou mp4. Video_URL peut être fourni en tant que valeur de chaîne base64 masquée à l’aide du chiffrement AES, et si l’URL de la vidéo est masquée, KEY_ENV et IV_ENV doivent être fournis en tant que variables d’environnement. L’exemple d’utilitaire permettant de générer des clés et un chiffrement est disponible ici.
VIDEO_SOURCE_ID Nom convivial de la caméra ou du flux vidéo. Retourné avec la sortie JSON de l’événement.
VIDEO_IS_LIVE True pour les caméras ; false pour les vidéos enregistrées.
VIDEO_DECODE_GPU_INDEX Le GPU pour décoder la trame vidéo. 0 par défaut. Doit être identique à gpu_index dans les autres configurations de nœud, comme DETECTOR_NODE_CONFIG et CAMERACALIBRATOR_NODE_CONFIG.
INPUT_VIDEO_WIDTH Largeur d’image de la vidéo/du flux d’entrée (par exemple, 1920). Il s’agit d’un champ facultatif. S’il est fourni, l’image est mise à l’échelle avec cette dimension, tout en préservant les proportions.
DETECTOR_NODE_CONFIG JSON indiquant le GPU sur lequel exécuter le nœud de détecteur. Il doit être au format suivant : "{ \"gpu_index\": 0 }",
TRACKER_NODE_CONFIG JSON indiquant s’il faut, ou non, calculer la vitesse dans le nœud de suivi. Il doit être au format suivant : "{ \"enable_speed\": true }",
CAMERA_CONFIG JSON indiquant les paramètres de caméra étalonnée pour plusieurs caméras. Si la compétence que vous avez utilisée nécessite un étalonnage et que vous avez déjà les paramètres de la caméra, vous pouvez utiliser cette configuration pour les fournir directement. Doit respecter le format suivant : "{ \"cameras\": [{\"source_id\": \"endcomputer.0.persondistancegraph.detector+end_computer1\", \"camera_height\": 13.105561256408691, \"camera_focal_length\": 297.60003662109375, \"camera_tiltup_angle\": 0.9738943576812744}] }" ; source_id est utilisé pour identifier chaque caméra. Il peut être obtenu à partir de la valeur source_info de l’événement que nous avons publié. Il ne prend effet que quand do_calibration=false dans DETECTOR_NODE_CONFIG.
CAMERACALIBRATOR_NODE_CONFIG JSON indiquant le GPU sur lequel exécuter le nœud de calibrage de la caméra et s’il faut ou non utiliser le calibrage. Il doit être au format suivant : "{ \"gpu_index\": 0, \"do_calibration\": true, \"enable_orientation\": true}",
CALIBRATION_CONFIG JSON indiquant les paramètres permettant de contrôler le fonctionnement du calibrage de la caméra. Il doit être au format suivant : "{\"enable_recalibration\": true, \"quality_check_frequency_seconds\": 86400}",
SPACEANALYTICS_CONFIG Configuration JSON pour la zone et la ligne, comme indiqué ci-dessous.
ENABLE_FACE_MASK_CLASSIFIER True pour activer la détection des personnes qui portent des masques dans le flux vidéo, False pour la désactiver. Par défaut, cette fonctionnalité est désactivée. La détection des masques nécessite que le paramètre de largeur de vidéo d’entrée soit égal à 1920 ("INPUT_VIDEO_WIDTH": 1920). L’attribut de masque n’est pas retourné si les personnes détectées ne font pas face à la caméra ou sont trop éloignées de celle-ci. Pour plus d’informations, consultez Guide de positionnement de la caméra.
STATIONARY_TARGET_REMOVER_CONFIG Code JSON indiquant les paramètres de suppression des cibles stationnaires, qui ajoutent la capacité d’apprendre et d’ignorer les cibles faussement positives et stationnaires à long terme, telles que les mannequins de vitrine ou les personnes représentées sur des affiches. La configuration doit être au format suivant : "{\"enable\": true, \"bbox_dist_threshold-in_pixels\": 5, \"buffer_length_in_seconds\": 3600, \"filter_ratio\": 0.2 }"

Paramètres du nœud de détection

Voici un exemple de paramètres DETECTOR_NODE_CONFIG pour toutes les opérations d’analyse spatiale.

{
"gpu_index": 0,
"enable_breakpad": false
}
Nom Type Description
gpu_index string Index GPU sur lequel cette opération s’exécutera.
enable_breakpad bool Indique s’il faut activer la fonctionnalité breakpad, qui est utilisée pour générer le vidage sur incident à des fins de débogage. La valeur par défaut de ce paramètre est false. Si vous le définissez sur true, vous devez également ajouter "CapAdd": ["SYS_PTRACE"] dans la HostConfig partie du conteneur createOptions. Par défaut, le vidage sur incident est chargé sur l’application AppCenter RealTimePersonTracking ; si vous souhaitez que les vidages sur incident soient chargés sur votre application AppCenter, vous pouvez remplacer la variable d’environnement RTPT_APPCENTER_APP_SECRET par le secret d’application de votre application.

Paramètres du nœud de calibrage de la caméra

Voici un exemple de paramètres CAMERACALIBRATOR_NODE_CONFIG pour toutes les opérations d’analyse spatiale.

{
  "gpu_index": 0,
  "do_calibration": true,
  "enable_breakpad": false,
  "enable_orientation": true
}
Nom Type Description
do_calibration string Indique que l’étalonnage est activé. do_calibration doit avoir la valeur true pour que cognitiveservices.vision.spatialanalysis-persondistance fonctionne correctement. do_calibration est défini par défaut sur True.
enable_breakpad bool Indique s’il faut activer la fonctionnalité breakpad, qui est utilisée pour générer le vidage sur incident à des fins de débogage. La valeur par défaut de ce paramètre est false. Si vous le définissez sur true, vous devez également ajouter "CapAdd": ["SYS_PTRACE"] dans la HostConfig partie du conteneur createOptions. Par défaut, le vidage sur incident est chargé sur l’application AppCenter RealTimePersonTracking ; si vous souhaitez que les vidages sur incident soient chargés sur votre application AppCenter, vous pouvez remplacer la variable d’environnement RTPT_APPCENTER_APP_SECRET par le secret d’application de votre application.
enable_orientation bool Indique si vous voulez calculer, ou non, l’orientation pour les personnes détectées. enable_orientation est défini par défaut sur True.

Configuration du calibrage

Il s’agit d’un exemple de paramètres CALIBRATION_CONFIG pour toutes les opérations d’analyse spatiale.

{
  "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
}
Nom Type Description
enable_recalibration bool Indique si le réétalonnage automatique est activé. La valeur par défaut est true.
calibration_quality_check_frequency_seconds int Nombre minimal de secondes entre chaque contrôle de qualité pour déterminer si le réétalonnage est nécessaire. La valeur par défaut est 86400 (24 heures). Utilisé uniquement si enable_recalibration=True.
calibration_quality_check_sample_collect_frequency_seconds int Nombre minimal de secondes entre la collecte de nouveaux échantillons de données pour le réétalonnage et le contrôle de la qualité. La valeur par défaut est 300 (5 minutes). Utilisé uniquement si enable_recalibration=True.
calibration_quality_check_one_round_sample_collect_num int Nombre minimal de nouveaux échantillons de données à collecter par cycle de collecte d’échantillons. La valeur par défaut est 10. Utilisé uniquement si enable_recalibration=True.
calibration_quality_check_queue_max_size int Nombre maximal d’échantillons de données à stocker quand le modèle de caméra est étalonné. La valeur par défaut est 1000. Utilisé uniquement si enable_recalibration=True.
calibration_event_frequency_seconds int Fréquence de sortie (en secondes) des événements d’étalonnage de l’appareil photo. La valeur -1 indique que l’étalonnage de la caméra ne doit pas être envoyé, sauf si les informations d’étalonnage ont été modifiées. La valeur par défaut est -1.

Sortie d’étalonnage de l’appareil photo

Voici un exemple de sortie de l’étalonnage de la caméra si celui-ci est activé. Les points de suspension indiquent la présence d’objets du même type dans une liste.

{
  "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
      }
    ]
  }
}

Consultez Sortie de l’opération d’analyse spatiale pour plus de détails sur source_info.

Nom du champ ZonePlacementInfo Type Description
optimalZonePolygon object Polygone dans l’image de l’appareil photo dans lequel il est possible de placer des lignes ou des zones pour vos opérations en vue de résultats optimaux.
Chaque paire de valeurs représente x et y pour les vertex d’un polygone. Le polygone représente les zones dans lesquelles les personnes sont suivies ou comptées, et les points de polygone sont basés sur des coordonnées normalisées (0-1), où le coin supérieur gauche est (0,0, 0,0) et le coin inférieur droit est (1,0, 1,0).
fairZonePolygon object Polygone dans l’image de l’appareil photo dans lequel il est possible de placer des lignes ou des zones pour vos opérations en vue de résultats corrects, mais éventuellement pas optimaux.
Consultez optimalZonePolygon ci-dessus pour obtenir une explication détaillée du contenu.
uniformlySpacedPersonBoundingBoxes list Liste des zones englobantes des personnes dans l’image de l’appareil photo, distribuées uniformément dans l’espace réel. Les valeurs sont basées sur les coordonnées normalisées (0-1).
personBoundingBoxGroundPoints list Liste de coordonnées au niveau du sol par rapport à l’appareil photo. Chaque coordonnée correspond au coin inférieur droit du cadre englobant dans uniformlySpacedPersonBoundingBoxes avec le même index.
Pour plus de détails sur le calcul des coordonnées au niveau du sol, consultez les champs centerGroundPointX/centerGroundPointY de la section Format JSON pour Insights AI cognitiveservices.vision.spatialanalysis-persondistance.

Exemple de sortie d’informations de placement de zone visualisées sur une image vidéo : Zone placement info visualization

Les informations sur le placement des zones fournissent des suggestions pour vos configurations, mais il convient de suivre scrupuleusement les directives de Configuration de l’appareil photo pour obtenir les meilleurs résultats.

Paramètres du nœud du traqueur

Vous pouvez configurer le calcul de la vitesse par le biais des paramètres du nœud de suivi.

{
"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
}
Nom Type Description
enable_speed bool Indique si vous voulez calculer, ou non, la vitesse pour les personnes détectées. enable_speed est défini par défaut sur True. Il est fortement recommandé d’activer à la fois la vitesse et l’orientation pour obtenir les meilleures valeurs estimées.
remove_stationary_objects bool Indique si vous souhaitez supprimer les objets stationnaires. remove_stationary_objects est défini par défaut sur True.
stationary_objects_dist_threshold_in_pixels int Seuil de distance de voisinage pour décider si deux zones de détection peuvent être traitées comme une même détection. stationary_objects_dist_threshold_in_pixels est défini par défaut sur 5.
stationary_objects_buffer_length_in_seconds int Durée minimale (en secondes) pendant laquelle le système doit revenir en arrière pour décider si une cible est stationnaire ou non. stationary_objects_buffer_length_in_seconds est défini par défaut sur 3600.
stationary_objects_filter_ratio float Si une cible est détectée à plusieurs reprises au même emplacement (défini dans stationary_objects_dist_threshold_in_pixels) pendant une période supérieure au stationary_objects_filter_ratio (0,2 signifie 20 %) de l’intervalle de temps stationary_objects_buffer_length_in_seconds, elle est considérée comme une cible stationnaire. stationary_objects_filter_ratio est défini par défaut sur 0,2.

Configuration et sortie des opérations d’analyse spatiale

Configuration de zone pour le nombre de personnes

Voici un exemple d’entrée JSON pour le paramètre SPACEANALYTICS_CONFIG qui configure une zone. Vous pouvez configurer plusieurs zones pour cette opération.

{
  "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"
          }
        }
      ]
    }
  ]
}
Nom Type Description
zones list Liste de zones.
name string Nom convivial de cette zone.
polygon list Chaque paire de valeurs représente x et y pour les vertex d’un polygone. Le polygone représente les zones dans lesquelles les personnes sont suivies ou comptées. Les points du polygone sont basés sur des coordonnées normalisées (0-1), où l’angle supérieur gauche a les valeurs (0,0, 0,0) et l’angle inférieur droit a les valeurs (1,0, 1,0).
threshold float Les événements sont envoyés lorsque la personne dépasse ce nombre de pixels à l’intérieur de la zone. Il s’agit d’un champ facultatif dont la valeur est exprimée en ratio (0-1). Par exemple, la valeur 0,0253 sera de 13 pixels sur une vidéo dont la largeur d’image = 512 (0,0253 X 512 = ~13).
type string Pour cognitiveservices.vision.spatialanalysis-personcount, cela doit être count.
trigger string Type de déclencheur pour l’envoi d’un événement. Les valeurs prises en charge sont event pour l’envoi d’événements lorsque le nombre change ou interval pour envoyer des événements régulièrement, que le nombre ait changé ou non.
output_frequency int Vitesse à laquelle les événements sont émis. Lorsque output_frequency = X, un envoi est effectué tous les X événements, par ex. output_frequency = 2 signifie qu’un événement sur deux fait l’objet d’une sortie. La valeur output_frequency s’applique à la fois à event et à interval.
focus string Position du point dans le cadre englobant de la personne utilisé pour calculer les événements. La valeur de focus peut être footprint (l’encombrement de la personne), bottom_center (la partie centrale inférieure du cadre englobant de la personne) ou center (le centre du cadre englobant de la personne).

Configuration de ligne pour personcrossingline

Voici un exemple d’entrée JSON pour le paramètre SPACEANALYTICS_CONFIG qui configure une ligne. Vous pouvez configurer plusieurs lignes de croisement pour cette opération.

{
   "lines": [
       {
           "name": "doorcamera",
           "line": {
               "start": {
                   "x": 0,
                   "y": 0.5
               },
               "end": {
                   "x": 1,
                   "y": 0.5
               }
           },
           "events": [
               {
                   "type": "linecrossing",
                   "config": {
                       "trigger": "event",
                       "focus": "footprint"
                   }
               }
           ]
       }
   ]
}
Nom Type Description
lines list Liste de lignes.
name string Nom convivial de cette ligne.
line list Définition de la ligne. Il s’agit d’une ligne directionnelle qui vous permet de comprendre les « Enter » par rapport aux « Exit ».
start Paire de valeurs Coordonnées x, y pour le point de départ de la ligne. Les valeurs float représentent la position du vertex par rapport au coin supérieur gauche. Pour calculer les valeurs x, y absolues, vous multipliez ces valeurs par la taille de cadre.
end Paire de valeurs Coordonnées x, y pour le point de fin de la ligne. Les valeurs float représentent la position du vertex par rapport au coin supérieur gauche. Pour calculer les valeurs x, y absolues, vous multipliez ces valeurs par la taille de cadre.
threshold float Les événements sont envoyés lorsque la personne dépasse ce nombre de pixels à l’intérieur de la zone. Il s’agit d’un champ facultatif dont la valeur est exprimée en ratio (0-1). Par exemple, la valeur 0,0253 sera de 13 pixels sur une vidéo dont la largeur d’image = 512 (0,0253 X 512 = ~13).
type string Pour cognitiveservices.vision.spatialanalysis-personcrossingline, cela doit être linecrossing.
trigger string Type de déclencheur pour l’envoi d’un événement.
Valeurs prises en charge : « event » : se déclenche quand quelqu’un traverse la ligne.
focus string Position du point dans le cadre englobant de la personne utilisé pour calculer les événements. La valeur de focus peut être footprint (l’encombrement de la personne), bottom_center (la partie centrale inférieure du cadre englobant de la personne) ou center (le centre du cadre englobant de la personne). La valeur par défaut est footprint.

Configuration de zone pour personcrossingpolygon

Voici un exemple d’entrée JSON pour le paramètre SPACEANALYTICS_CONFIG qui configure une zone. Vous pouvez configurer plusieurs zones pour cette opération.

{
"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"
               }
           }]
   }]
}
Nom Type Description
zones list Liste de zones.
name string Nom convivial de cette zone.
polygon list Chaque paire de valeurs représente x et y pour les vertex d’un polygone. Le polygone représente les zones dans lesquelles les personnes sont suivies ou comptées. Les valeurs float représentent la position du vertex par rapport au coin supérieur gauche. Pour calculer les valeurs x, y absolues, vous multipliez ces valeurs par la taille de cadre.
target_side int Spécifie un côté de la zone définie par polygon pour mesurer la durée pendant laquelle les utilisateurs sont tournés de ce côté pendant qu’ils se trouvent dans la zone. « dwellTimeForTargetSide » génère cette durée estimée. Chaque côté est un bord numéroté entre les deux sommets du polygone qui représente votre zone. Par exemple, le bord entre les deux premiers sommets du polygone représente le premier côté : 'side'=1. La valeur de target_side est comprise entre [0,N-1]N est le nombre de côtés de l’élément polygon. Ce champ est facultatif.
threshold float Les événements sont envoyés lorsque la personne dépasse ce nombre de pixels à l’intérieur de la zone. Il s’agit d’un champ facultatif dont la valeur est exprimée en ratio (0-1). Par exemple, la valeur 0,074 sera de 38 pixels sur une vidéo dont la largeur d’image = 512 (0,074 X 512 = ~38).
type string Pour cognitiveservices.vision.spatialanalysis-personcrossingpolygon, cela doit être zonecrossing ou zonedwelltime.
trigger string Type de déclencheur pour l’envoi d’un événement
Valeurs prises en charge : « event » : se déclenche quand une personne entre ou quitte la zone.
focus string Position du point dans le cadre englobant de la personne utilisé pour calculer les événements. La valeur de focus peut être footprint (l’encombrement de la personne), bottom_center (la partie centrale inférieure du cadre englobant de la personne) ou center (le centre du cadre englobant de la personne). La valeur par défaut est footprint.

Configuration de zone pour persondistance

Voici un exemple d’entrée JSON pour le paramètre SPACEANALYTICS_CONFIG qui configure une zone pour cognitiveservices.vision.spatialanalysis-persondistance. Vous pouvez configurer plusieurs zones pour cette opération.

{
"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"
          }
          }]
   }]
}
Nom Type Description
zones list Liste de zones.
name string Nom convivial de cette zone.
polygon list Chaque paire de valeurs représente x et y pour les vertex d’un polygone. Le polygone représente les zones dans lesquelles les utilisateurs sont comptés et la distance entre les personnes. Les valeurs float représentent la position du vertex par rapport au coin supérieur gauche. Pour calculer les valeurs x, y absolues, vous multipliez ces valeurs par la taille de cadre.
threshold float Les événements sont envoyés lorsque la personne dépasse ce nombre de pixels à l’intérieur de la zone. Il s’agit d’un champ facultatif dont la valeur est exprimée en ratio (0-1). Par exemple, la valeur 0,0253 sera de 13 pixels sur une vidéo dont la largeur d’image = 512 (0,0253 X 512 = ~13).
type string Pour cognitiveservices.vision.spatialanalysis-persondistance, cela doit être persondistance.
trigger string Type de déclencheur pour l’envoi d’un événement. Les valeurs prises en charge sont event pour l’envoi d’événements lorsque le nombre change ou interval pour envoyer des événements régulièrement, que le nombre ait changé ou non.
output_frequency int Vitesse à laquelle les événements sont émis. Lorsque output_frequency = X, un envoi est effectué tous les X événements, par ex. output_frequency = 2 signifie qu’un événement sur deux fait l’objet d’une sortie. La valeur output_frequency s’applique à la fois à event et à interval.
minimum_distance_threshold float Distance en pieds qui déclenchera un événement « TooClose » lorsque les personnes sont moins éloignées que cette distance.
maximum_distance_threshold float Distance en pieds qui déclenchera un événement « TooFar » lorsque les personnes sont plus éloignées que cette distance.
aggregation_method string La méthode pour le résultat persondistance agrégé. La méthode d’agrégation s’applique à la fois à mode et à average.
focus string Position du point dans le cadre englobant de la personne utilisé pour calculer les événements. La valeur de focus peut être footprint (l’encombrement de la personne), bottom_center (la partie centrale inférieure du cadre englobant de la personne) ou center (le centre du cadre englobant de la personne).

Configuration de l’analyse spatiale

Voici un exemple d’entrée JSON pour le paramètre SPACEANALYTICS_CONFIG qui configure une ligne et une zone pour cognitiveservices.vision.spatialanalysis. Vous pouvez configurer plusieurs lignes/zones pour cette opération et chaque ligne/zone peut avoir des événements différents.

{
  "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"
          }
        }
      ]
    }
  ]
}

Configuration de la caméra

Pour en savoir plus sur la configuration des zones et des lignes, consultez les instructions de positionnement de la caméra.

Sortie de l’opération d’analyse spatiale

Les événements de chaque opération sont émis vers Azure IoT Hub au format JSON.

Format JSON pour le nombre de personnes AI Insights

Exemple de code JSON pour une sortie d’événement par cette opération.

{
    "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"
}
Nom de champ d'événement Type Description
id string ID de l’événement
type string Type d'événement
detectionsId tableau Tableau de taille 1 de l’identificateur unique de la détection de personne qui a déclenché cet événement
properties collection Collection de valeurs
trackinId string Identificateur unique de la personne détectée
zone string Le champ « name » du polygone qui représente la zone qui a été franchie
trigger string Le type de déclencheur est « event » ou « interval » en fonction de la valeur de trigger dans SPACEANALYTICS_CONFIG
Nom du champ de détection Type Description
id string ID de détection
type string Type de détection
region collection Collection de valeurs
type string Type de région
points collection Points supérieur gauche et inférieur droit lorsque le type de région est RECTANGLE
confidence float Confiance de l’algorithme
attributes tableau Tableau d’attributs. Chaque attribut se compose d’une étiquette, d’une tâche et d’un niveau de confiance
label string Valeur de l’attribut (par exemple, {label: face_mask} indique que la personne détectée porte un masque)
confidence (attribute) float Niveau de confiance de l’attribut avec une plage allant de 0 à 1 (par exemple, {confidence: 0.9, label: face_nomask} indique que la personne détectée ne porte pas de masque)
task string Classe ou tâche de classification de l’attribut
Nom du champ SourceInfo Type Description
id string ID de la caméra
timestamp date Date UTC à laquelle la charge utile JSON a été émise
width int Largeur de l’image vidéo
height int Hauteur de l’image vidéo
frameId int Identificateur du frame
cameraCallibrationInfo collection Collection de valeurs
status string État de l’étalonnage au format state[;progress description]. L’état peut être Calibrating, Recalibrating (si le réétalonnage est activé) ou Calibrated. La partie description de la progression est valide uniquement quand elle est dans l’état Calibrating et Recalibrating, qui est utilisé pour afficher la progression du processus d’étalonnage actuel.
cameraHeight float Hauteur de la caméra au-dessus du sol, en mètres. Cette valeur est déduite de l’étalonnage automatique.
focalLength float Longueur focale de la caméra, en pixels. Cette valeur est déduite de l’étalonnage automatique.
tiltUpAngle float Angle d’inclinaison de la caméra par rapport à la verticale. Cette valeur est déduite de l’étalonnage automatique.

Format JSON pour personcrossingline AI Insights

Exemple de code JSON pour une sortie de détections par cette opération.

{
    "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"
}
Nom de champ d'événement Type Description
id string ID de l’événement
type string Type d'événement
detectionsId tableau Tableau de taille 1 de l’identificateur unique de la détection de personne qui a déclenché cet événement
properties collection Collection de valeurs
trackinId string Identificateur unique de la personne détectée
status string Direction des traversées de lignes, 'CrossLeft' ou 'CrossRight'. La direction est exprimée comme si vous étiez placé au « début » faisant face à la « fin » de la ligne. CrossRight va de gauche à droite. CrossLeft va de droite à gauche.
orientationDirection string Direction d’orientation de la personne détectée après qu’elle a franchi la ligne. La valeur peut être « Left », « Right » ou « Straight ». Cette valeur est générée si enable_orientation a la valeur True dans CAMERACALIBRATOR_NODE_CONFIG
zone string Le champ « Name » de la ligne qui a été franchie
Nom du champ de détection Type Description
id string ID de détection
type string Type de détection
region collection Collection de valeurs
type string Type de région
points collection Points supérieur gauche et inférieur droit lorsque le type de région est RECTANGLE
groundOrientationAngle float Angle en radians dans le sens horaire de l’orientation de la personne sur le plan de sol déduit
mappedImageOrientation float L’angle projeté en radians dans le sens horaire de l’orientation de la personne sur l’espace de l’image 2D
speed float Vitesse estimée de la personne détectée. L’unité est foot per second (ft/s)
confidence float Confiance de l’algorithme
attributes tableau Tableau d’attributs. Chaque attribut se compose d’une étiquette, d’une tâche et d’un niveau de confiance
label string Valeur de l’attribut (par exemple, {label: face_mask} indique que la personne détectée porte un masque)
confidence (attribute) float Niveau de confiance de l’attribut avec une plage allant de 0 à 1 (par exemple, {confidence: 0.9, label: face_nomask} indique que la personne détectée ne porte pas de masque)
task string Classe ou tâche de classification de l’attribut
Nom du champ SourceInfo Type Description
id string ID de la caméra
timestamp date Date UTC à laquelle la charge utile JSON a été émise
width int Largeur de l’image vidéo
height int Hauteur de l’image vidéo
frameId int Identificateur du frame

Important

Le modèle d’IA détecte une personne qu’elle soit orientée ou non vers la caméra. Le modèle IA n’exécute pas la reconnaissance des visages et n’émet aucune information biométrique.

Format JSON pour personcrossingpolygon AI Insights

Exemple de code JSON pour une sortie de détections par cette opération avec le type zonecrossing 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"
}

Exemple de code JSON pour une sortie de détections par cette opération avec le type zonedwelltime 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"
}
Nom de champ d'événement Type Description
id string ID de l’événement
type string Type d'événement. La valeur peut être personZoneDwellTimeEvent ou personZoneEnterExitEvent.
detectionsId tableau Tableau de taille 1 de l’identificateur unique de la détection de personne qui a déclenché cet événement
properties collection Collection de valeurs
trackinId string Identificateur unique de la personne détectée
status string Direction des polygones croisés, « Enter » ou « Exit »
side int Numéro du côté du polygone traversé par la personne. Chaque côté est un bord numéroté entre les deux sommets du polygone qui représente votre zone. Le bord entre les deux premiers sommets du polygone représente le premier côté. Le « côté » est vide lorsque l’événement n’est pas associé à un côté spécifique en raison d’une occlusion. Par exemple, une sortie s’est produite quand une personne a disparu mais n’a pas été observée traversant un côté de la zone, ou une entrée s’est produite quand une personne est apparue dans la zone, mais n’a pas été observée traversant un côté.
dwellTime float Nombre de millisecondes qui représentent le temps passé par la personne dans la zone. Ce champ est fourni quand le type d’événement est personZoneDwellTimeEvent
dwellFrames int Nombre de frames que la personne a passées à la zone. Ce champ est fourni quand le type d’événement est personZoneDwellTimeEvent
dwellTimeForTargetSide float Nombre de millisecondes représentant le temps que la personne a passé dans la zone et pendant lequel elle était tournée du côté target_side. Ce champ est fourni quand enable_orientation a la valeur True dans CAMERACALIBRATOR_NODE_CONFIG et que la valeur de target_side est définie dans SPACEANALYTICS_CONFIG
avgSpeed float Vitesse moyenne de la personne dans la zone. L’unité est foot per second (ft/s)
minSpeed float Vitesse minimale de la personne dans la zone. L’unité est foot per second (ft/s)
zone string Le champ « name » du polygone qui représente la zone qui a été franchie
Nom du champ de détection Type Description
id string ID de détection
type string Type de détection
region collection Collection de valeurs
type string Type de région
points collection Points supérieur gauche et inférieur droit lorsque le type de région est RECTANGLE
groundOrientationAngle float Angle en radians dans le sens horaire de l’orientation de la personne sur le plan de sol déduit
mappedImageOrientation float L’angle projeté en radians dans le sens horaire de l’orientation de la personne sur l’espace de l’image 2D
speed float Vitesse estimée de la personne détectée. L’unité est foot per second (ft/s)
confidence float Confiance de l’algorithme
attributes tableau Tableau d’attributs. Chaque attribut se compose d’une étiquette, d’une tâche et d’un niveau de confiance
label string Valeur de l’attribut (par exemple, {label: face_mask} indique que la personne détectée porte un masque)
confidence (attribute) float Niveau de confiance de l’attribut avec une plage allant de 0 à 1 (par exemple, {confidence: 0.9, label: face_nomask} indique que la personne détectée ne porte pas de masque)
task string Classe ou tâche de classification de l’attribut

Format JSON pour persondistance AI Insights

Exemple de code JSON pour une sortie de détections par cette opération.

{
    "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"
}
Nom de champ d'événement Type Description
id string ID de l’événement
type string Type d'événement
detectionsId tableau Tableau de taille 1 de l’identificateur unique de la détection de personne qui a déclenché cet événement
properties collection Collection de valeurs
personCount int Nombre de personnes détectées lors de l’émission de l’événement
averageDistance float Distance moyenne entre tous les individus détectés, en mètres
minimumDistanceThreshold float La distance en pieds qui déclenchera un événement « TooClose » lorsque les personnes sont moins éloignées que cette distance.
maximumDistanceThreshold float La distance en pieds qui déclenchera un événement « TooFar » lorsque les personnes sont plus éloignées que cette distance.
eventName string Le nom de l’événement est TooClose quand minimumDistanceThreshold est enfreint, TooFar quand maximumDistanceThreshold n’est pas enfreint ou unknown quand l’étalonnage automatique n’est pas terminé
distanceViolationPersonCount int Nombre de personnes détectées en violation de minimumDistanceThreshold ou maximumDistanceThreshold
zone string Le champ « name » du polygone qui représente la zone surveillée pour la distance entre personnes
trigger string Le type de déclencheur est « event » ou « interval » en fonction de la valeur de trigger dans SPACEANALYTICS_CONFIG
Nom du champ de détection Type Description
id string ID de détection
type string Type de détection
region collection Collection de valeurs
type string Type de région
points collection Points supérieur gauche et inférieur droit lorsque le type de région est RECTANGLE
confidence float Confiance de l’algorithme
centerGroundPointX/centerGroundPointY 2 valeurs float Valeurs x, y avec les coordonnées de l’emplacement déduit de la personne sur le sol, en mètres. x et y sont des coordonnées sur le plan de sol, en supposant que le sol est plat. La position de la caméra est l’origine.

Dans centerGroundPoint, x est le composant de la distance entre la caméra et la personne qui est perpendiculaire au plan d’image de la caméra. y est le composant de la distance qui est parallèle au plan d’image de la caméra.

Example center ground point

Dans cet exemple, centerGroundPoint est {centerGroundPointX: 4, centerGroundPointY: 5}. Cela signifie qu’il y a une personne située à 4 pieds (1,2 mètre) de la caméra et à 5 pieds (1,5 mètre) vers la droite, en regardant la salle du dessus.

Nom du champ SourceInfo Type Description
id string ID de la caméra
timestamp date Date UTC à laquelle la charge utile JSON a été émise
width int Largeur de l’image vidéo
height int Hauteur de l’image vidéo
frameId int Identificateur du frame
cameraCallibrationInfo collection Collection de valeurs
status string État de l’étalonnage au format state[;progress description]. L’état peut être Calibrating, Recalibrating (si le réétalonnage est activé) ou Calibrated. La partie description de la progression est valide uniquement quand elle est dans l’état Calibrating et Recalibrating, qui est utilisé pour afficher la progression du processus d’étalonnage actuel.
cameraHeight float Hauteur de la caméra au-dessus du sol, en mètres. Cette valeur est déduite de l’étalonnage automatique.
focalLength float Longueur focale de la caméra, en pixels. Cette valeur est déduite de l’étalonnage automatique.
tiltUpAngle float Angle d’inclinaison de la caméra par rapport à la verticale. Cette valeur est déduite de l’étalonnage automatique.

Format JSON pour spatialanalysis AI Insights

La sortie de cette opération dépend du paramètre events configuré. Par exemple, s’il existe un événement zonecrossing configuré pour cette opération, la sortie sera identique à cognitiveservices.vision.spatialanalysis-personcrossingpolygon.

Utiliser la sortie générée par le conteneur

Vous pouvez intégrer la détection ou les événements d’analyse spatiale dans votre application. Voici quelques approches à envisager :

  • Utilisez le SDK Azure Event Hubs pour le langage de programmation que vous avez choisi afin de vous connecter au point de terminaison Azure IoT Hub et de recevoir les événements. Pour plus d’informations, consultez Lire des messages appareil-à-cloud à partir du point de terminaison intégré.
  • Configurez le routage des messages sur votre instance IoT Hub Azure pour envoyer les événements à d’autres points de terminaison ou enregistrer les événements dans votre stockage de données. Pour plus d’informations, consultez Routage des messages IoT Hub.
  • Configurez un travail Azure Stream Analytics pour traiter les événements en temps réel à mesure qu’ils arrivent, et pour créer des visualisations.

Déployer des opérations d’analyse spatiale à grande échelle (plusieurs caméras)

Pour optimiser les performances et l’utilisation des GPU, vous pouvez déployer toutes les opérations d’analyse spatiale sur plusieurs caméras à l’aide d’instances de graphe. Vous trouverez ci-dessous un exemple de configuration pour l’exécution de l’opération cognitiveservices.vision.spatialanalysis-personcrossingline sur 15 caméras.

  "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>"
                }
            }
          }
        },
      }
  }
Nom Type Description
batch_size int Si toutes les caméras ont la même résolution, définissez batch_size sur le nombre de caméras qui seront utilisées dans cette opération ; sinon, attribuez la valeur 1 à batch_size ou laissez la valeur par défaut (1), ce qui indique qu’aucun lot n’est pris en charge.

Étapes suivantes