This is a code sample for an IoT Edge solution that takes images from a camera feed on an edge device, runs them through a custom vision module, and pushes the results to an Azure Function on the device to take an action. The model included with the sample will classify images containing Scott Guthrie. You can easily replace the model with any Custom Vision Service model
- Visual Studio Code
- Docker Extension
- Azure IoT Hub Extension
- Python 2.7
iotedgectlinstalled on devices (Windows or Linux/Raspberry Pi)
- Azure Subscription (free trial is fine)
- Azure IoT Hub
If you plan to run on a Raspberry Pi, it's recommended to use a Raspberry Pi 3 with a
picamera enabled camera and a SenseHat running linux.
If you plan to run on a Windows PC, be sure to read the following
- Clone the repository and open it in Visual Studio Code
- Open the Azure IoT Hub Devices extension and connect to an IoT Hub in Azure
- Configure the docker registry you want to publish the container images. Azure Container Registry is a great choice. Update the
[registry]placeholder in the three
module.jsonfiles with the registry you have authorization to use.
There are two templates included with the samples located in the
templates/ directory. Depending on where you are planning to build and deploy (Windows or Linux Raspberry Pi), copy the
deployment.template.json file to the base of the project. This will enable you to right-click the template and Build the IoT Edge Solution
To build the solution, copy a
deployment.template.json file to the base of the project, right-click the file, and select Build the IoT Edge Solution. This will build the docker images and publish them to your docker registry. It will also generate a
config/deployment.json file you can use to deploy to an edge device.
config/deployment.json file to Create Deployment for IoT Edge Device. This will allow you to select the IoT Edge device running
iotedgectl to deploy the solution.
Be sure to note in the
deployment.template.json file and the generated
deployment.json file is an environment variable for the AzureFunctionContainer that contains the URL for the Logic App to call to post a tweet. This should be replaced with the URL of your own Logic App that has an HTTP Request trigger.
Running the solution on a Windows machine
Currently Docker for Windows doesn't allow sharing devices from the host operating system with containers, even when using the
--privileged flag. The issue is being tracked here and should be resolved in an upcoming release. In the meantime the Windows deployment template includes an environment variable that will pull the image from
C:\Image\picture.jpg instead of the webcam. If you want to automatically generate
picture.jpg files in real-time from the webcam you can use this simple console application which will take the camera feed and save
picture.jpg files. Extract all of the files in a directory and then run the
Also be sure to share the C drive with Docker using the Docker for Windows settings.
Personalizing the sample
Changing the model
You can replace the model in this sample with a different TensorFlow model. The Azure Custom Vision allows you to easily create and train models using sample images. After training an image set, select Export and choose Android / TensorFlow. Rename
model.pbtxt and replace the
model.pbtxt files in the CustomVisionContainer with the generated entities. You'll also likely want to change the code in the
run.csx file for the AzureFunctionContainer to not be looking for the tags
Rebuild and deploy your solution (? don't forget to increment the version in the
module.json file) to have solution leverage your own custom model.