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
- Docker
- Python 2.7
iotedgectl
installed 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 threemodule.json
files 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.
Right-click the 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.
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 .exe
file.
Also be sure to share the C drive with Docker using the Docker for Windows settings.
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 labels.txt
to model.pbtxt
and replace the model.pb
and 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 Scott
and NotScott
.
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.