Quickstart: Aan de slag met Azure Video Analyzer

edge-pictogram
U kunt ook de onderwerpen bekijken onder Videotoepassingen maken in de service.


In deze quickstart doorloopt u de stappen om aan de slag te gaan met Azure Video Analyzer. In het artikel worden Azure-VM als IoT Edge-apparaat gebruikt en wordt een gesimuleerde live videostream gebruikt.

Nadat u de installatiestappen hebt uitgevoerd, kunt u de gesimuleerde livevideostream uitvoeren via een pijplijn die beweging in die stream detecteert en rapporteert. In het volgende diagram wordt die pijplijn grafisch weergegeven.

Beweging detecteren

Vereisten

Tip

Wanneer u de extensie Azure IoT Tools, wordt u mogelijk gevraagd om Docker te installeren. U mag dit negeren.

Azure-resources instellen

Implementeren in Azure

Het implementatieproces duurt ongeveer 20 minuten. Na voltooiing hebt u bepaalde Azure-resources geïmplementeerd in het Azure-abonnement, waaronder:

  1. Video Analyzer-account: deze cloudservice wordt gebruikt om de Video Analyzer Edge-module te registreren en om opgenomen video- en videoanalyses af te spelen.
  2. Storage account: voor het opslaan van opgenomen video en videoanalyse.
  3. Beheerde identiteit: dit is de door de gebruiker toegewezen beheerde identiteit die wordt gebruikt voor het beheren van de toegang tot het bovenstaande opslagaccount.
  4. Virtuele machine: dit is een virtuele machine die als uw gesimuleerde edge-apparaat zal fungeren.
  5. IoT Hub: dit fungeert als een centrale berichtenhub voor bi-directionele communicatie tussen uw IoT-toepassing, IoT Edge modules en de apparaten die verantwoordelijk zijn voor het beheer.

De ontwikkelomgeving instellen

Uw IoT Hub connection string

  1. Navigeer Azure Portal naar de IoT Hub u hebt gemaakt als onderdeel van de bovenstaande in te stellen stap
  2. Zoek naar de optie Beleid voor gedeelde toegang in het navigatiedeelvenster aan de linkerkant en klik daar.
  3. Klik op het beleid met de naam iothubowner
  4. Kopieer de primaire connection string - deze ziet er als HostName=xxx.azure-devices.net;SharedAccessKeyName=iothubowner;SharedAccessKey=XXX

Verbinding maken aan de IoT Hub

  1. Open Visual Studio Code en selecteer View > Explorer. Of selecteer Ctrl+Shift+E.
  2. Selecteer Azure IoT Hub in de linkerbenedenhoek van het tabblad Verkenner.
  3. Selecteer het pictogram Meer opties om het contextmenu weer te geven. Selecteer vervolgens IoT Hub-verbindingsreeks instellen.
  4. Wanneer er een invoervak verschijn,. voert u uw IoT Hub-verbindingsreeks in.
  5. Vernieuw Azure IoT Hub in ongeveer 30 seconden in de sectie linksonder. Als het goed is, ziet u het avasample-iot-edge-device edge-apparaat waarop de volgende modules moeten zijn geïmplementeerd:
    • Edge-module van Video Analyzer (modulenaam avaedge)
    • RTSP-simulator (modulenaam rtspsim)

Het knooppunt Modules uitbreiden

Tip

Als u Video Analyzer handmatig hebt geïmplementeerd op een edge-apparaat (zoals een ARM64-apparaat), wordt de module onder dat apparaat onder de Azure IoT Hub. U kunt deze module selecteren en de rest van de onderstaande stappen volgen.

Het bewaken van de modules voorbereiden

Wanneer u deze quickstart gebruikt, worden er gebeurtenissen verzonden naar de IoT Hub. Volg deze stappen om deze gebeurtenissen te bekijken:

  1. Open Visual Studio Code het tabblad Extensions (of druk op Ctrl+Shift+X) en zoek naar Azure IoT Hub.

  2. Klik met de rechtermuisknop en selecteer Extensie-instellingen.

    Selecteer Extensie Instellingen

  3. Zoek en schakel 'Uitgebreid bericht tonen' in.

    Uitgebreid bericht tonen

  4. Open het deelvenster Explorer in Visual Studio Code en zoek Azure IoT Hub in de linkerbenedenhoek.

  5. Vouw het knooppunt Apparaten uit.

  6. Klik met de rechtermuisknop op avasample-iot-edge-device en selecteer Bewaking van ingebouwd gebeurtenis-eindpunt starten.

    Notitie

    U wordt mogelijk gevraagd om ingebouwde eindpuntgegevens op te geven voor de IoT Hub. Om die informatie op te halen, gaat Azure Portal naar uw IoT Hub en gaat u naar de optie Ingebouwde eindpunten in het linkernavigatiedeelvenster. Klik hier en zoek naar het event hub-compatibele eindpunt onder de sectie Eindpunt dat compatibel is met Event Hub. Kopieer en gebruik de tekst in het vak. Het eindpunt ziet er als het volgende uit: Endpoint=sb://iothub-ns-xxx.servicebus.windows.net/;SharedAccessKeyName=iothubowner;SharedAccessKey=XXX;EntityPath=<IoT Hub name>

Aanroepen van directe methoden gebruiken

U kunt nu livevideostreams analyseren door directe methoden aan teroepen die worden blootgesteld door de Edge-module van Video Analyzer. Lees directe methoden van Video Analyzer om alle directe methoden van de module te onderzoeken. Het schema voor de directe methoden vindt u hier.

Pijplijnologieën opsnoemen

In deze stap worden alle pijplijn-topologies in de module opsnoemd.

  1. Klik met de rechtermuisknop op de module 'avaedge' en selecteer Directe methode voor module aanroepen in het contextmenu.
  2. Er verschijnt een bewerkingsvak middenin het bovenste deel van het Visual Studio Code-venster. Voer pipelineTopologyList in het bewerkingsvak in en druk op Enter.
  3. Kopieer vervolgens de onderstaande JSON-nettolading, plak deze in het bewerkingsvak en druk op Enter.
{
    "@apiVersion" : "1.1"
}

Binnen een paar seconden ziet u in het venster Uitvoer het volgende antwoord verschijnen:

[DirectMethod] Invoking Direct Method [pipelineTopologyList] to [avasample-iot-edge-device/avaedge] ...
[DirectMethod] Response from [avasample-iot-edge-device/avaedge]:
{
  "status": 200,
  "payload": {
    "value": []
  }
}

Het bovenstaande antwoord wordt verwacht, omdat er geen pijplijn-topologies zijn gemaakt.

Een pijplijntopologie instellen

Met dezelfde stappen als hierboven kunt u aanroepen om een pijplijntopologie in te stellen met behulp van pipelineTopologySet de volgende JSON als nettolading. U maakt een pijplijntopologie met de naam MotionDetection.

{
    "@apiVersion": "1.1",
    "name": "MotionDetection",
    "properties": {
        "description": "Analyzing live video to detect motion and emit events",
        "parameters": [
            {
                "name": "rtspUrl",
                "type": "string",
                "description&quot;: &quot;rtspUrl"
            },
            {
                "name": "rtspUserName",
                "type": "string",
                "description": "rtspUserName",
                "default&quot;: &quot;dummyUserName"
            },
            {
                "name": "rtspPassword",
                "type": "string",
                "description": "rtspPassword",
                "default&quot;: &quot;dummypw"
            }
        ],
        "sources": [
            {
                "@type": "#Microsoft.VideoAnalyzer.RtspSource",
                "name": "rtspSource",
                "transport": "tcp",
                "endpoint": {
                    "@type": "#Microsoft.VideoAnalyzer.UnsecuredEndpoint",
                    "credentials": {
                        "@type": "#Microsoft.VideoAnalyzer.UsernamePasswordCredentials",
                        "username": "${rtspUserName}",
                        "password&quot;: &quot;${rtspPassword}"
                    },
                    "url&quot;: &quot;${rtspUrl}"
                }
            }
        ],
        "processors": [
            {
                "@type": "#Microsoft.VideoAnalyzer.MotionDetectionProcessor",
                "sensitivity": "medium",
                "name": "motionDetection",
                "inputs": [
                    {
                        "nodeName": "rtspSource",
                        "outputSelectors": []
                    }
                ]
            }
        ],
        "sinks": [
            {
                "hubOutputName": "inferenceOutput",
                "@type": "#Microsoft.VideoAnalyzer.IotHubMessageSink",
                "name": "iotHubSink",
                "inputs": [
                    {
                        "nodeName&quot;: &quot;motionDetection"
                    }
                ]
            }
        ]
    }
}

Deze JSON-nettolading maakt een topologie die drie parameters definieert, waarbij twee ervan standaardwaarden hebben. De topologie heeft één bron-knooppunt(RTSP-bron),één processor-knooppunt ( bewegingsdetectieprocessor en één sink-knooppunt (IoT Hub message sink). De visuele weergave van de topologie wordt hierboven weergegeven.

Binnen een paar seconden ziet u in het venster UITVOER het volgende antwoord verschijnen.

{
  "status": 201,
  "payload": {
    "systemData": {
      "createdAt": "2021-03-21T18:16:46.491Z",
      "lastModifiedAt": "2021-03-21T18:16:46.491Z"
    },
    "name": "MotionDetection",
    "properties": {
      "description": "Analyzing live video to detect motion and emit events",
      "parameters": [
        {
          "name": "rtspPassword",
          "type": "string",
          "description": "rtspPassword",
          "default": "dummypw"
        },
        {
          "name": "rtspUrl",
          "type": "string",
          "description": "rtspUrl"
        },
        {
          "name": "rtspUserName",
          "type": "string",
          "description": "rtspUserName",
          "default": "dummyUserName"
        }
      ],
      "sources": [
        {
          "@type": "#Microsoft.VideoAnalyzer.RtspSource",
          "name": "rtspSource",
          "transport": "tcp",
          "endpoint": {
            "@type": "#Microsoft.VideoAnalyzer.UnsecuredEndpoint",
            "url": "${rtspUrl}",
            "credentials": {
              "@type": "#Microsoft.VideoAnalyzer.UsernamePasswordCredentials",
              "username": "${rtspUserName}",
              "password": "${rtspPassword}"
            }
          }
        }
      ],
      "processors": [
        {
          "@type": "#Microsoft.VideoAnalyzer.MotionDetectionProcessor",
          "sensitivity": "medium",
          "eventAggregationWindow": "PT1S",
          "name": "motionDetection",
          "inputs": [
            {
              "nodeName": "rtspSource",
              "outputSelectors": []
            }
          ]
        }
      ],
      "sinks": [
        {
          "@type": "#Microsoft.VideoAnalyzer.IotHubMessageSink",
          "hubOutputName": "inferenceOutput",
          "name": "iotHubSink",
          "inputs": [
            {
              "nodeName": "motionDetection",
              "outputSelectors": []
            }
          ]
        }
      ]
    }
  }
}

De geretourneerde status is 201. De status geeft aan dat een nieuwe topologie is gemaakt.

Voer de volgende stappen uit:

  1. Roep pipelineTopologySet opnieuw aan. De geretourneerde statuscode is 200. Deze statuscode geeft aan dat een bestaande topologie is bijgewerkt.
  2. Roep pipelineTopologySet opnieuw aan, maar wijzig de tekenreeks voor de beschrijving. De geretourneerde statuscode is 200 en de beschrijving is bijgewerkt naar de nieuwe waarde.
  3. Roep pipelineTopologyList aan zoals beschreven in de vorige sectie. Nu ziet u de topologie MotionDetection in de geretourneerde nettolading.

De pijplijntopologie lezen

Roep pipelineTopologyGet aan met behulp van de volgende nettolading.

{
    "@apiVersion" : "1.1",
    "name" : "MotionDetection"
}

Binnen een paar seconden ziet u in het venster UITVOER het volgende antwoord verschijnen:

{
  "status": 200,
  "payload": {
    "systemData": {
      "createdAt": "2021-03-21T18:16:46.491Z",
      "lastModifiedAt": "2021-03-21T18:16:46.491Z"
    },
    "name": "MotionDetection",
    "properties": {
      "description": "Analyzing live video to detect motion and emit events",
      "parameters": [
        {
          "name": "rtspPassword",
          "type": "string",
          "description": "rtspPassword",
          "default": "dummypw"
        },
        {
          "name": "rtspUrl",
          "type": "string",
          "description": "rtspUrl"
        },
        {
          "name": "rtspUserName",
          "type": "string",
          "description": "rtspUserName",
          "default": "dummyUserName"
        }
      ],
      "sources": [
        {
          "@type": "#Microsoft.VideoAnalyzer.RtspSource",
          "name": "rtspSource",
          "transport": "tcp",
          "endpoint": {
            "@type": "#Microsoft.VideoAnalyzer.UnsecuredEndpoint",
            "url": "${rtspUrl}",
            "credentials": {
              "@type": "#Microsoft.VideoAnalyzer.UsernamePasswordCredentials",
              "username": "${rtspUserName}",
              "password": "${rtspPassword}"
            }
          }
        }
      ],
      "processors": [
        {
          "@type": "#Microsoft.VideoAnalyzer.MotionDetectionProcessor",
          "sensitivity": "medium",
          "eventAggregationWindow": "PT1S",
          "name": "motionDetection",
          "inputs": [
            {
              "nodeName": "rtspSource",
              "outputSelectors": []
            }
          ]
        }
      ],
      "sinks": [
        {
          "@type": "#Microsoft.VideoAnalyzer.IotHubMessageSink",
          "hubOutputName": "inferenceOutput",
          "name": "iotHubSink",
          "inputs": [
            {
              "nodeName": "motionDetection",
              "outputSelectors": []
            }
          ]
        }
      ]
    }
  }
}

In de nettolading van het antwoord ziet u deze details:

  • De statuscode is 200, die aangeeft dat de bewerking geslaagd is.
  • De nettolading bevat de tijdstempel createdAt en de tijdstempel lastModifiedAt.

Een live-pijplijn maken met behulp van de topologie

Maak vervolgens een live-pijplijn die verwijst naar de bovenstaande pijplijntopologie. Roep de livePipelineSet directe methode aan met de volgende nettolading:

{
    "@apiVersion" : "1.1",
    "name": "mdpipeline1",
    "properties": {
        "topologyName": "MotionDetection",
        "description": "Sample pipeline description",
        "parameters": [
            {
                "name": "rtspUrl",
                "value": "rtsp://rtspsim:554/media/camera-300s.mkv"
            },
            {
                "name": "rtspUserName",
                "value": "testuser"
            },
            {
                "name": "rtspPassword",
                "value": "testpassword"
            }
        ]
    }
}

Merk op dat deze nettolading:

  • Met de bovenstaande nettolading wordt de topologie ('MotionDetection') opgegeven die door de live-pijplijn moet worden gebruikt.
  • De nettolading bevat parameterwaarde voor rtspUrl , die geen standaardwaarde heeft in de nettolading van de topologie. Deze waarde is een koppeling naar de onderstaande voorbeeldvideo:

Binnen een paar seconden ziet u in het venster UITVOER het volgende antwoord verschijnen:

{
  "status": 201,
  "payload": {
    "systemData": {
      "createdAt": "2021-03-21T18:27:41.639Z",
      "lastModifiedAt": "2021-03-21T18:27:41.639Z"
    },
    "name": "mdpipeline1",
    "properties": {
      "state": "Inactive",
      "description": "Sample pipeline description",
      "topologyName": "MotionDetection",
      "parameters": [
        {
          "name": "rtspPassword",
          "value": "testpassword"
        },
        {
          "name": "rtspUrl",
          "value": "rtsp://rtspsim:554/media/camera-300s.mkv"
        },
        {
          "name": "rtspUserName",
          "value": "testuser"
        }
      ]
    }
  }
}

In de nettolading van het antwoord ziet u dat:

  • Statuscode is 201, wat aangeeft dat er een nieuwe live-pijplijn is gemaakt.
  • De status is 'Inactive', wat aangeeft dat de live-pijplijn is gemaakt, maar niet is geactiveerd. Zie pijplijn-staten voor meer informatie.

Probeer de volgende directe methoden uit als de volgende stappen:

  • Roep livePipelineSet opnieuw aan met dezelfde nettolading en merk op dat de geretourneerde statuscode nu 200 is.
  • Roep opnieuw aan, maar met een andere beschrijving en noteer de bijgewerkte beschrijving in de nettolading van het antwoord, waarmee wordt aangegeven dat de livePipelineSet live-pijplijn is bijgewerkt.
  • Roep livePipelineSet aan, maar wijzig de naam in 'mdpipeline2' en rtspUrl in 'rtsp://rtspsim:554/media/lots_015.mkv'. In de nettolading van het antwoord ziet u de zojuist gemaakte live-pijplijn (statuscode 201).

    Notitie

    Zoals uitgelegd in Pijplijntopologieënkunt u meerdere live-pijplijnen maken om live videostreams van veel camera's te analyseren met behulp van dezelfde pijplijntopologie. Als u extra live-pijplijnen maakt, moet u deze verwijderen tijdens de opschoonstap.

De live-pijplijn activeren

Vervolgens kunt u de live-pijplijn activeren, waarmee de stroom van (gesimuleerde) livevideo door de pijplijn wordt gestart. Roep de directe methode livePipelineActivate aan met de volgende nettolading:

{
    "@apiVersion" : "1.1",
    "name" : "mdpipeline1"
}

Binnen een paar seconden ziet u in het venster UITVOER het volgende antwoord verschijnen.

{
  "status": 200,
  "payload": null
}

De statuscode 200 geeft aan dat de live-pijplijn is geactiveerd.

De status van de live-pijplijn controleren

Roep nu de livePipelineGet directe methode aan met de volgende nettolading:

{
    "@apiVersion" : "1.1",
    "name" : "mdpipeline1"
}

Binnen een paar seconden ziet u in het venster UITVOER het volgende antwoord verschijnen.

{
  "status": 200,
  "payload": {
    "systemData": {
      "createdAt": "2021-03-21T18:27:41.639Z",
      "lastModifiedAt": "2021-03-21T18:27:41.639Z"
    },
    "name": "mdpipeline1",
    "properties": {
      "state": "Active",
      "description": "Sample pipeline description",
      "topologyName": "MotionDetection",
      "parameters": [
        {
          "name": "rtspPassword",
          "value": "testpassword"
        },
        {
          "name": "rtspUrl",
          "value": "rtsp://rtspsim:554/media/camera-300s.mkv"
        },
        {
          "name": "rtspUserName",
          "value": "testuser"
        }
      ]
    }
  }
}

In de nettolading van het antwoord ziet u de volgende details:

  • De statuscode is 200, die aangeeft dat de bewerking geslaagd is.
  • De status is Actief, wat aangeeft dat de live-pijplijn nu actief is.

Resultaten bekijken

De live-pijplijn die u hierboven hebt gemaakt en geactiveerd, maakt gebruik van het knooppunt van de bewegingsdetectieprocessor om beweging in de binnenkomende livevideostream te detecteren en verzendt gebeurtenissen naar IoT Hub sink. Deze gebeurtenissen worden vervolgens doorgegeven aan uw IoT Hub berichten, die nu kunnen worden waargenomen. U ziet berichten in het uitvoervenster met de volgende 'body':

{
  "timestamp": 145471641211899,
  "inferences": [
    {
      "type": "motion",
      "motion": {
        "box": {
          "l": 0.514644,
          "t": 0.574627,
          "w": 0.3375,
          "h": 0.096296
        }
      }
    }
  ]
}

Let op deze details:

  • De sectie deferences geeft aan dat het type beweging is. Het biedt aanvullende gegevens over de bewegingsgebeurtenis en biedt een begrendingsvak voor het gebied van het videoframe (op het opgegeven tijdstempel) waar beweging is gedetecteerd.

Aanvullende directe methodeaanroepen aanroepen om op te schonen

Vervolgens kunt u directe methoden aanroepen om de live-pijplijn te deactiveren en te verwijderen (in die volgorde).

De live-pijplijn deactiveren

Roep de livePipelineDeactivate directe methode aan met de volgende nettolading:

{
    "@apiVersion" : "1.1",
    "name" : "mdpipeline1"
}

Binnen een paar seconden ziet u in het venster UITVOER het volgende antwoord verschijnen:

{
  "status": 200,
  "payload": null
}

De statuscode 200 geeft aan dat de live-pijplijn is gedeactiveerd.

Probeer vervolgens livePipelineGet aan te roepen zoals eerder in dit artikel beschreven. Bekijk de statuswaarde.

De live-pijplijn verwijderen

Roep de directe methode aan livePipelineDelete met de volgende nettolading

{
    "@apiVersion" : "1.1",
    "name" : "mdpipeline1"
}

Binnen een paar seconden ziet u in het venster UITVOER het volgende antwoord verschijnen:

{
  "status": 200,
  "payload": null
}

De statuscode 200 geeft aan dat de live-pijplijn is verwijderd.

Als u ook de pijplijn 'mdpipeline2' hebt gemaakt, kunt u de pijplijntopologie niet verwijderen zonder ook deze extra pijplijn te verwijderen. Roep de directe methode livePipelineDelete opnieuw aan met behulp van de volgende nettolading:

{
    "@apiVersion" : "1.1",
    "name" : "mdpipeline2"
}

Binnen een paar seconden ziet u het volgende antwoord in het venster UITVOER:

{
  "status": 200,
  "payload": null
}

De statuscode 200 geeft aan dat de live-pijplijn is verwijderd.

U kunt livePipelineList aanroepen met behulp van dezelfde nettolading als pipelineTopologyList . U ziet dat er geen live-pijplijnen worden geïndeereerd.

De pijplijntopologie verwijderen

Nadat alle live-pijplijnen zijn verwijderd, kunt u de pipelineTopologyDelete directe methode aanroepen met de volgende nettolading:

{
    "@apiVersion" : "1.1",
    "name" : "MotionDetection"
}

Binnen een paar seconden ziet u in het venster UITVOER het volgende antwoord verschijnen.

{
  "status": 200,
  "payload": null
}

De statuscode 200 geeft aan dat de topologie is verwijderd.

U kunt proberen aan te pipelineTopologyList roepen en te zien dat de module geen topologies bevat.

Resources opschonen

Als u andere quickstarts of zelfstudies wilt proberen, bewaar dan de resources die u hebt gemaakt. Anders gaat u in de Azure-portal naar de resourcegroepen, selecteert u de resourcegroep waar u deze quickstart hebt uitgevoerd en verwijdert u vervolgens alle resources.

Volgende stappen