Analyse vidéo de flux

Stream Video Analysis est un service d'analyse vidéo en temps réel entièrement géré et accéléré par GPU sur Oracle Cloud Infrastructure (OCI). Il traite les flux RTSP en direct pour fournir des informations en temps réel à l'aide des capacités d'IA.

Les principales caractéristiques sont les suivantes :

  • Détection d'objets : Détecte des objets, par exemple des personnes ou des véhicules, et renvoie des zones englobantes.
  • Détection de visage : Identifie les faces avec des sorties de zone englobante.
  • Suivi d'objet : À l'aide du suivi d'objet, vous pouvez suivre les objets détectés (actuellement limités aux faces) sur les images vidéo. En affectant un identifiant unique (ID de suivi) à chaque face, le système maintient la continuité de l'identité lorsqu'une personne se déplace dans la vue de la caméra. En cas de suivi du visage, le suivi d'une caméra unique et le suivi multicaméra sont pris en charge.
    • Suivi de caméra unique : Suivi des faces dans les limites d'un flux de caméra unique. Cela signifie que vous pouvez identifier et suivre les individus lorsqu'ils se déplacent dans le champ de vision d'une caméra spécifique.
    • Suivi multicaméra : Le suivi multicaméra vous permet d'identifier de manière cohérente plusieurs flux de caméra. Les caméras peuvent être logiquement regroupées afin qu'une face détectée dans un flux puisse être reconnue dans un autre flux.

Performances et évolutivité

Le service d'analyse vidéo Stream est conçu pour fournir des analyses à faible latence et haute performance optimisées par l'accélération GPU. Par défaut, le service prend en charge une seule tâche de flux par utilisateur. Si vous devez évoluer au-delà de cette limite, vous pouvez demander des ressources supplémentaires au moyen du canal de soutien OCI.

Connectivité de l'appareil photo

L'analyse vidéo en continu nécessite l'accès au flux vidéo, à l'aide de l'Internet public ou sur un réseau privé, à l'aide d'une connexion rapide.

Option 1 : Connectivité publique à l'aide d'une adresse IP statique et d'un transfert de port

  1. Demandez une adresse IP publique statique à votre fournisseur d'accès Internet (FAI) pour votre routeur domestique ou de bureau.
    Cette adresse IP sert de point d'accès externe à votre réseau de caméras.
  2. Connectez la caméra à votre routeur via un câble LAN ou WiFi
  3. Affectez à la caméra une adresse IP privée statique.
  4. Activer le réacheminement de port sur le routeur.
    1. Ouvrez le panneau d'administration du routeur.

    2. Configurez une règle de réacheminement de port :

      • Port externe : 554 (standard pour RTSP)

      • Transmettre à IP : Il s'agit de l'adresse IP privée statique à l'étape 3.

      • Port interne : 554

  5. Accédez au flux RSTP.
    Le flux RTSP est accessible au public à partir de :
    rtsp://<Static_Public_IP>:554/stream
  6. Créez un VCN avec un sous-réseau ayant accès à cette adresse IP statique :
    1. Créer un réseau VCN :
      resource "oci_core_vcn" "vcn" {
        cidr_block     = "10.0.0.0/16"
        compartment_id = <compartment_id>
        display_name   = "vcn"
      }
    2. Créer un sous-réseau privé :
      resource "oci_core_subnet" "private_subnet" {
        compartment_id              = <comparment_id>
        vcn_id                      = <vcn_id created in previous step>
        cidr_block                  = "10.0.0.0/24"
        display_name                = "private-subnet"
      }
    3. Ajoutez une règle de routage :
      resource "oci_core_route_table" "route" {
        compartment_id = <compartment_id>
        vcn_id         = <vcn_id>
       
        route_rules {
          destination       = "0.0.0.0/0"
          destination_type  = "CIDR_BLOCK"
          network_entity_id = oci_core_nat_gateway.natgw.id
          description       = "NAT Gateway for outbound internet traffic"
        }
      }
  7. Vous pouvez maintenant créer un point d'extrémité privé à l'aide de ce sous-réseau.

Option 2 : RPV site à site

Une option plus sécurisée et plus évolutive est la configuration d'un RPV site à site entre votre routeur sur place et OCI.

  1. Obtenez une adresse IP publique statique de votre FAI pour votre routeur.
    Ceci est requis pour établir le tunnel RPV IPsec.
  2. Créer un objet CPE (équipement local d'abonné) dans OCI :
    1. Dans la console, sélectionnez Réseau.
    2. Sélectionnez Équipement local d'abonné.
    3. Sélectionnez Créer un équipement local d'abonné.
    4. Entrez l'adresse IP publique statique de votre routeur.
  3. Établissez le tunnel RPV IPsec.
    Pour plus d'informations, voir Configuration du RPV site à site.
  4. Créez un sous-réseau dans votre VCN OCI pour acheminer le trafic au moyen de cette connexion RPV.
  5. Mettez à jour la liste de sécurité du sous-réseau pour autoriser le trafic entrant et sortant vers et depuis le réseau de la caméra sur place (c'est-à-dire l'intervalle d'adresses IP internes de votre équipement local d'abonné).
  6. Lorsque le RPV est actif et que le routage est configuré, vous pouvez fournir l'OCID du sous-réseau dans la demande CreateStreamSource pour ingérer en toute sécurité des flux vidéo dans OCI.

Référence d'API

Créer un point d'extrémité privé Vision
Créer un point d'extrémité privé Vision
Attribut Valeur
Point d'extrémité d'API /latest/visionPrivateEndpoints
Méthode d'API POST
Exemple de corps de demande
{
    "subnetId": "<<Valid Subnet OCID // only one pe per vcn is allowed>>",
    "compartmentId": "<<Valid Compartment OCID where pe should be made>>"
}
Exemple de corps de réponse 202 Accepté
{
    "subnetId": "<<Valid Subnet OCID>>",
    "compartmentId": "<<Valid Compartment OCID>>"
    "id": "<newly vision pe OCID>",
    "compartmentId": "<compartment OCID>",
    "timeCreated": "2025-07-17T08:20:19.875Z",
    "timeUpdated": "2025-07-17T08:20:19.875Z",
    "displayName": "<generated display name>",
    "lifecycleState": "CREATING",
    "freeformTags": {
        "oci-freeform": "xyz"
    },
    "definedTags": {
        "Oracle-Tags": {
            "CreatedBy": "<OCID>",
            "CreatedOn": "<time stamp>"
        }
    },
    "systemTags": {}
}

Créer une source de flux

La création d'une source de flux prend en charge les types d'accès public et privé. La différence entre les points d'extrémité public et privé réside dans la façon dont le service d'analyse du flux Vision accède à votre flux vidéo.

  • Point d'extrémité privé : Les flux sont accessibles en toute sécurité au moyen d'un point d'extrémité privé sur le réseau interne d'OCI accessible dans votre réseau en nuage virtuel (VCN). Il s'agit de la méthode recommandée pour les configurations de production.
  • Point d'extrémité public : Expose le flux sur Internet au moyen d'une adresse IP publique.
Créer une source de flux avec les détails d'accès au réseau public
Attribut Valeur
Point d'extrémité d'API /latest/streamSources
Méthode d'API POST
Exemple de corps de demande
{
    "streamSourceDetails": {
        "sourceType": "RTSP",
        "cameraUrl": "<valid url>",
        "streamNetworkAccessDetails": {
            "streamAccessType": "PUBLIC"
        }
    },
    "compartmentId": "<valid compartment OCID>",
    "freeformTags": {
        "oci-freeform": ""
    },
    "definedTags": {
        "Oracle-Tags": {
            "CreatedBy": "<OCID>",
            "CreatedOn": "<time stamp>"
        }
    }
}
Exemple de corps de réponse 202 Accepté
{
    "streamSourceDetails": {
        "sourceType": "RTSP",
        "streamNetworkAccessDetails": {
            "streamAccessType": "PUBLIC"
        },
        "secretId": null,
        "cameraUrl": "<valid url>"
    },
    "id": "<newly created Stream Source OCID>",
    "compartmentId": "<valid compartment OCID>",
    "timeCreated": "2025-07-17T08:20:19.875Z",
    "timeUpdated": "2025-07-17T08:20:19.875Z",
    "displayName": "<generated display name>",
    "lifecycleState": "ACTIVE",
    "freeformTags": {
        "oci-freeform": "xyz"
    },
    "definedTags": {
        "Oracle-Tags": {
            "CreatedBy": "<OCID>",
            "CreatedOn": "<time stamp>"
        }
    },
    "systemTags": {}
}

Créer une source de flux avec des détails d'accès au réseau privé
Attribut Valeur
Point d'extrémité d'API /latest//streamSources
Méthode d'API POST
Exemple de corps de demande

{
    "streamSourceDetails": {
        "sourceType": "RTSP",
        "cameraUrl": "<valid url>",
        "streamNetworkAccessDetails": {
            "streamAccessType": "PRIVATE",
            "privateEndpointId": "<Vision Private Endpoint OCID>"
        }
    },
    "compartmentId": "<valid compartment OCID>",
    "freeformTags": {
        "oci-freeform": ""
    },
    "definedTags": {
        "Oracle-Tags": {
            "CreatedBy": "<OCID>",
            "CreatedOn": "<time stamp>"
        }
    }
}
Exemple de corps de réponse 202 Accepté

{
    "streamSourceDetails": {
        "sourceType": "RTSP",
        "streamNetworkAccessDetails": {
            "streamAccessType": "PRIVATE",
            "visionPrivateEndpoint": "<Vision Private Endpoint OCID>"
        },
        "secretId": null,
        "cameraUrl": "<valid url>"
    },
    "id": "<newly created Stream Source OCID>",
    "compartmentId": "<valid compartment OCID>",
    "timeCreated": "2025-07-17T08:20:19.875Z",
    "timeUpdated": "2025-07-17T08:20:19.875Z",
    "displayName": "<generated display name>",
    "lifecycleState": "ACTIVE",
    "freeformTags": {
        "oci-freeform": "xyz"
    },
    "definedTags": {
        "Oracle-Tags": {
            "CreatedBy": "<OCID>",
            "CreatedOn": "<time stamp>"
        }
    },
    "systemTags": {}
}

Créer une tâche de flux
Attribut Valeur
Point d'extrémité d'API /latest/streamJobs
Méthode d'API POST
Exemple de corps de demande
{
    "streamSourceId": "<<Valid Stream Source OCID>>",
    "streamOutputLocation": {
        "outputLocationType": "OBJECT_STORAGE",
        "namespaceName": "",
        "bucketName": "",
        "prefix": "",
        "oboToken": ""
    },
    "features": [
        {
            "featureType": "OBJECT_TRACKING",
            "trackingTypes": [
                {
                    "objects": [
                        "face"
                    ],
                    "shouldReturnLandmarks": true,
                    "maxResults": 50
                }
            ]
        }
    ],
    "compartmentId": "<<Valid Compartment OCID>>",
    "displayName": "Example Stream Job"
}
Exemple de corps de réponse 202 Accepté
{
    "id": "<<Generated Stream Job OCID>>",
    "streamSourceId": "<<Stream Source OCID>>",
    "compartmentId": "<<Compartment OCID>>",
    "displayName": "Example Stream Job",
    "features": [
        {
            "featureType": "OBJECT_TRACKING",
            "trackingTypes": [
                {
                    "objects": [
                        "face"
                    ],
                    "detectionModelId": null,
                    "trackingModelId": null,
                    "maxResults": 50,
                    "shouldReturnLandmarks": true,
                    "biometricStoreId": null,
                    "biometricStoreCompartmentId": null
                }
            ]
        }
    ],
    "streamOutputLocation": {
        "outputLocationType": "OBJECT_STORAGE",
        "namespaceName": "",
        "bucketName": "",
        "prefix": "",
        "oboToken": ""
    },
    "agentParticipantId": null,
    "lifecycleState": "INACTIVE",
    "lifecycleDetails": null,
    "timeCreated": "<<Timestamp>>",
    "timeUpdated": "<<Timestamp>>",
    "freeformTags": {},
    "definedTags": {},
 

Commencer la tâche de flux
Attribut Valeur
Point d'extrémité d'API /latest/streamJobs/<<Stream Job Ocid>>/actions/start
Méthode d'API POST
Exemple de corps de réponse 202 Accepté

Arrêter la tâche de flux
Attribut Valeur
Point d'extrémité d'API /latest/streamJobs/<Stream_Job_OCID>/actions/stop
Méthode d'API POST
Exemple de corps de réponse 202 Accepté

Obtenir la tâche de flux
Attribut Valeur
Point d'extrémité d'API /latest/streamJobs/<Stream_Job_OCID>
Méthode d'API GET
Exemple de corps de réponse 202 OK

Obtenir la source de flux
Attribut Valeur
Point d'extrémité d'API /latest/streamSources/<Stream_Job_OCID>
Méthode d'API GET
Exemple de corps de réponse 202 OK

Obtenir un point d'extrémité privé
Attribut Valeur
Point d'extrémité d'API /latest/visionPrivateEndpoint/<Stream_Job_OCID>
Méthode d'API GET
Exemple de corps de réponse 202 OK

Supprimer la tâche de flux
Attribut Valeur
Point d'extrémité d'API /latest/streamJobs/<Stream_Job_OCID>
Méthode d'API DELETE
Exemple de corps de réponse 202 OK

Supprimer la source de flux
Attribut Valeur
Point d'extrémité d'API /latest/streamSources/<Stream_Job_OCID>
Méthode d'API DELETE
Exemple de corps de réponse 202 Accepté

Supprimer le point d'extrémité privé
Attribut Valeur
Point d'extrémité d'API /latest/visionPrivateEndpoint/<Stream_Job_OCID>
Méthode d'API DELETE
Exemple de corps de réponse 202 Accepté

Des exemples complets de travail de bout en bout sont disponibles à l'adresse LiveLab.

Suivi multicaméra
Note

Disponible SEULEMENT pour les tâches de flux utilisant le suivi d'objet (limité aux faces). Cette fonction est facultative.
Groupe de flux
Attribut Valeur
Point d'extrémité d'API /latest/streamGroups
Méthode d'API POST
Exemple de corps de demande
{
  "compartment_id": "<valid compartment OCID>",
  "display_name": "human readable display name",
  "is_enabled": true,
  "stream_overlaps": [
    {
      "overlapping_streams": [<subset of stream_source_ids that overlap in field of view>]
    }
  ],
  "stream_source_ids": [
    <List of valid streamSource OCIDs>
  ],
  "freeformTags": {
        "oci-freeform": ""
    },
    "definedTags": {
        "Oracle-Tags": {
            "CreatedBy": "<OCID>",
            "CreatedOn": "<time stamp>"
        }
    }
}
Exemple de corps de réponse 200 OK
{
  "compartment_id": "<valid compartment OCID>",
  "display_name": "human readable display name",
  "id": "<StreamGroup OCID>",
  "is_enabled": true,
  "lifecycle_state": "ACTIVE",
  "stream_overlaps": null,
  "stream_source_ids": [
    <List of valid streamSource OCIDs>
  ],
  "time_created": "2025-07-17T23:39:18.264000+00:00",
  "time_updated": "2025-07-17T23:39:18.264000+00:00",
  "freeformTags": {
        "oci-freeform": "xyz"
    },
    "definedTags": {
        "Oracle-Tags": {
            "CreatedBy": "<OCID>",
            "CreatedOn": "<time stamp>"
        }
    },
    "systemTags": {}
}

Pour les API de suivi multicaméra CRUD complètes, voir la spécification StreamGroup API.

Résultats et résultats

Fonction Sortie
Détection d'étiquettes

Étiquette, confiance, horodatage

Détection d'objet

Étiquette et zone englobante, confiance

Détection de texte

Boîte de transcription et de délimitation

Détection de visage

Boîte de délimitation, métadonnées de visage

Suivi des objets

ObjectID et suivi des zones de délimitation au fil du temps

Recommandations pour les meilleures performances

  • La caméra produit une cadence d'images cohérente de 30 FPS.
  • Résolution de l'appareil photo non supérieure à 720p
  • Fournir des environnements cohérents et bien éclairés
  • Maintenir une proximité de sujet de 15 à 20 mètres