Core Priority: High. Critical for low-latency localized processing and bandwidth optimization.
High Frequency: Configuring "Deployment Manifests" and "Environment Variables" for GPU/VPU passthrough.
Confusion Alert: Differentiating between "Cloud-based Inference" (latency-heavy) and "Edge-based Inference" (local-compute).
Scenario Logic: A factory needs to detect defects on a high-speed conveyor belt with sub-50ms latency. You must deploy a Custom Vision model to an NVIDIA Jetson or Intel NUC using Azure IoT Edge.
Version Delta: Migration from standard Docker containers to specialized "AIAgent" runtime containers with hardware access.
Failure Trigger: Incorrect HostConfig in the deployment manifest prevents the container from accessing the /dev/dri (Integrated GPU) or Myriad X VPU.
Operational Dependency: Requires a registered IoT Edge device with a supported Linux distro (Ubuntu 20.04/22.04).
The operational complexity of Edge Vision lies in the hardware-software binding required for acceleration. Standard containerization abstracts hardware, but vision workloads require direct access to silicon like Intel’s Integrated GPU or the Movidius Myriad X VPU via the OpenVINO toolkit. This is achieved through the Docker createOptions field in the Azure IoT Edge deployment manifest.
At the execution level, the vision module functions as a local HTTP or gRPC server. The camera stream (RTSP or USB) is captured by a separate "Camera Capture" module, which frames the video and posts the binary image data to the Inference module. The OpenVINO runtime inside the module loads a .xml (Intermediate Representation) model file. To optimize performance, the DEVICE environment variable is set to HETERO:GPU,CPU or MYRIAD. The inference engine then maps the neural network layers to the specific execution units (EUs) of the hardware. If the hardware binding fails, the system defaults to CPU execution, which typically results in a 5x to 10x increase in inference latency, potentially causing a buffer overflow in the video stream queue.
Object: Deployment Manifest createOptions
Attribute: Devices
Value Range: Path mapping (e.g., /dev/dri:/dev/dri or /dev/bus/usb:/dev/bus/usb)
Default State: Null (No hardware access)
Dependency: Requires Privileged: true or specific DeviceRequests
Failure State: Module starts but logs "Inference device not found; falling back to CPU"
Object: OpenVINO Inference Engine
Attribute: DEVICE_NAME
Value Range: CPU, GPU, MYRIAD, HETERO, MULTI
Default State: CPU
Dependency: Hardware driver (i915 for Intel) must be installed on the Host OS
Failure State: Container crash or RuntimeError: Device with name 'MYRIAD' is not registered
Identify the hardware acceleration target (e.g., Intel iGPU) on the target IoT Edge device using ls /dev/dri.
Access the Azure Portal > IoT Hub > IoT Edge > [Device Name] > Set Modules.
Add a Custom Module and specify the OpenVINO-optimized Docker image (e.g., [mcr.microsoft.com/azureiotedge-customvision-openvino](https://mcr.microsoft.com/azureiotedge-customvision-openvino)).
In "Container Create Options," insert the JSON block: {"HostConfig": {"Privileged": true, "Devices": [{"PathOnHost": "/dev/dri", "PathInContainer": "/dev/dri", "CgroupPermissions": "mrw"}]}}.
Set Environment Variables: DATA_SOURCE to the RTSP stream URL and TARGET_DEVICE to GPU.
Submit the deployment manifest and monitor the device using iotedge list.
Execute iotedge logs [ModuleName] -f to verify the initialization of the OpenVINO inference plugin.
Validate latency using watch -n 1 iotedge check or via custom metrics sent to Azure Monitor.
User Action: The user deploys a new vision model version via the IoT Hub portal.
Command Input: The IoT Edge Agent receives the updated $edgeAgent desired properties.
Policy Trigger: The Docker runtime engine pulls the specialized vision container image.
API Request: The engine invokes the create command with the hardware Devices mapping.
Workflow Execution: The container OS mounts the /dev/dri device into the module’s file system.
System Behavior: The OpenVINO Inference Engine queries the /dev/dri/renderD128 node to identify available EUs.
Protocol Response: The driver returns a hardware handle, allowing the model weights to be loaded into GPU memory.
Data Model Processing: Incoming frames are processed via OpenCL kernels on the GPU, returning bounding box coordinates to the Edge Hub.
| Task | Precise Command or Path | Verification Standard |
|---|---|---|
| Verify Device Access | docker exec -it [Module] ls -l /dev/dri |
Output shows card0 and renderD128 files within the container. |
| Check Acceleration | `iotedge logs [Module] \ | grep "Inference Device"` |
| Debug Port Bindings | `netstat -tulpn \ | grep 8080` (inside module) |
Core Priority: High. Critical for bridging physical vision data with 3D coordinate systems.
High Frequency: Configuring "Spatial Analysis" operations (PersonCount, FaceMaskDetection, ZoneCrossing) via Azure IoT Edge.
Confusion Alert: Differentiating between 2D pixel coordinates (x, y) and 3D world coordinates (x, y, z) mapped to a floor plan.
Scenario Logic: A retail facility requires real-time heatmaps of customer movement. You must configure a "Camera Calibration" JSON to map camera perspective distortion to a top-down architectural map.
Version Delta: Integration with Azure Digital Twins (ADT) using the "Signal" to "Twin" data flow via Event Grid.
Failure Trigger: Incorrect "Focal Length" or "Mounting Height" parameters in the spatial configuration lead to inaccurate distance measurements between objects.
Operational Dependency: Requires the Azure Video Indexer or Spatial Analysis container (Vision SDK) with GPU acceleration (T4/A100).
Spatial analysis operational logic moves beyond simple classification to "Geometric Contextualization." When a frame is captured, the inference engine detects an object (e.g., a person) and generates a bounding box. The "Spatial Analysis" module then applies a Homography Matrix—a mathematical transformation that maps the pixel coordinates of the bounding box's bottom-center to a 2D ground plane defined during configuration.
At the runtime level, this requires "Calibration Points." The operator defines four points in the camera view and maps them to real-world measurements (e.g., meters) on a floor plan. The module continuously calculates the "Euclidean Distance" between detected centroids to determine "Proximity" or "Dwell Time." This metadata is packaged as a JSON-LD (JSON for Linked Data) payload and injected with a UTC timestamp and a SourceID (Camera ID). The technical chain relies on the "Ingress Pipe" where this JSON is sent to an IoT Hub, processed by an Azure Function, and used to update the Location property of a specific "Asset Twin" in the Digital Twin graph, enabling a real-time 3D representation of the physical environment.
Object: Spatial Analysis Operation (e.g., cognitiveservices.vision.spatialanalysis-personcrossingline)
Attribute: detectorNodeConfiguration
Value Range: JSON configuration object (Thresholds, Regions, Lines)
Default State: Null
Dependency: Requires NVIDIA GPU with CUDA 11+ and the spatial-analysis container image
Failure State: High "Reprojection Error" resulting in objects appearing outside of defined floor plan boundaries
Object: Calibration Parameter
Attribute: camera_calibrator_settings
Value Range: focal_length, principal_point, distortion_coefficients
Default State: Standard pinhole model defaults
Dependency: Camera lens specification (mm)
Failure State: Radial distortion causes "fisheye" effect, skewing distance calculations at the edges of the frame
Deploy the spatial-analysis container to an IoT Edge device equipped with an NVIDIA T4 GPU.
Open the camera stream and identify four ground-level landmarks with known real-world distances between them.
Construct the space.json configuration file, defining the ZONE or LINE using pixel coordinates (e.g., [[10, 10], [10, 500], [500, 500], [500, 10]]).
Apply the TransformationMatrix inside the JSON to map the defined pixel quadrilateral to a square meter grid.
Set the outputFrequency to 1fps to prevent flooding the downstream IoT Hub with redundant telemetry.
Start the module and execute iotedge logs spatial-analysis to verify the "Calibration Successful" log entry.
Use the "Device Twin" in IoT Hub to verify that the personCount or occupancy metadata is being sent to the events endpoint.
Monitor the "Inference Latency" metric; if it exceeds 200ms, reduce the frameResolution or samplingRate.
User Action: A person walks into a restricted "Zone" in a warehouse.
Command Input: The camera captures the raw H.264 stream and feeds it into the Spatial Analysis container.
Policy Trigger: The "PersonDetection" model triggers a positive hit with a confidence score of 0.92.
API Request: The module invokes the "Spatial Engine" to calculate the centroid of the detection.
Workflow Execution: The engine applies the homography transformation, converting pixel [450, 800] to world coordinates [12.5m, 4.2m].
System Behavior: The module checks the "Zone Definition" and determines the world coordinates fall within the "RestrictedRegion" polygon.
Protocol Response: A JSON message is emitted: {"type": "zoneCrossing", "status": "enter", "location": [12.5, 4.2]}.
Data Model Processing: The IoT Hub routes this message to a Service Bus Queue, triggering an "Unauthorized Entry" alert in the security dashboard.
| Task | Precise Command or Path | Verification Standard |
|---|---|---|
| Define Spatial Zone | space.json > operations > zones > polygon |
Inference logs show "Object entered Zone: Restricted_Area_01". |
| Calibrate Perspective | calibrator.json > ground_plane_mapping |
Measured distance between two objects in the 3D view matches physical tape measurement within 5% error. |
| Monitor Stream Health | `iotedge logs spatial-analysis \ | grep "Frame drop"` |
Core Priority: High. Focuses on portability and performance of vision models across heterogeneous hardware.
High Frequency: Selecting the correct "Domain" (General vs. Compact) for exportability.
Confusion Alert: Distinguishing between "Standard" domains (cloud-only) and "Compact" domains (exportable).
Scenario Logic: An application requires offline image classification on a Windows IoT device. You must export a trained Custom Vision model and integrate it using the ONNX (Open Neural Network Exchange) runtime.
Version Delta: Use of ONNX 1.2+ for compatibility with Windows Machine Learning (WinML) APIs.
Failure Trigger: Attempting to export a model trained on a "General" domain results in the Export button being disabled.
Operational Dependency: Requires the Microsoft.ML.OnnxRuntime NuGet package or python library for execution.
The operational lifecycle of a mobile or edge vision solution depends on the "Compact" domain constraint. In Azure Custom Vision, models trained on "General" domains utilize complex architectures optimized for cloud-scale TPUs/GPUs that are not compatible with edge runtimes. By selecting a "Compact" domain, the service employs lighter architectures (like MobileNet or SqueezeNet) which support the quantization and pruning necessary for edge deployment.
Once exported as an ONNX file, the model's computation graph is frozen. The engineering challenge shifts to "Input Tensor Preprocessing." The ONNX runtime expects a specific multidimensional array format—typically a 4D tensor: [Batch_Size, Channels, Height, Width]. Most Custom Vision compact models require images resized to 224x224 pixels with RGB values normalized to a specific range (often 0-255 or 0-1). The runtime then executes the graph via "Execution Providers" (CPU, CUDA, or DirectML). DirectML is particularly critical for Windows devices as it allows the ONNX model to leverage any DirectX 12 compatible GPU, providing hardware acceleration without vendor-specific SDKs like CUDA.
Object: Custom Vision Domain
Attribute: Domain Type
Value Range: General, General [A1], Compact (S1), Food (Compact), Landmark (Compact)
Default State: General
Dependency: Must be selected at Project Creation; cannot be changed after training
Failure State: Export functionality unavailable in the Settings blade
Object: ONNX Runtime Execution Provider
Attribute: Provider Name
Value Range: CPUExecutionProvider, CUDAExecutionProvider, DmlExecutionProvider
Default State: CPUExecutionProvider
Dependency: Hardware-specific drivers (e.g., DX12 for DML)
Failure State: Fallback to CPU, resulting in increased frame-processing latency
Log in to the Custom Vision portal and ensure the Project Domain is set to "General (compact)".
Complete the training process using either "Quick Training" or "Advanced Training".
Navigate to the "Performance" tab and select the iteration to be deployed.
Click the "Export" button and select "ONNX" from the list of available platforms (Docker, CoreML, TensorFlow, etc.).
Download the .onnx model file and the associated labels.txt.
In the target application (e.g., C#), initialize the inference session: var session = new InferenceSession("model.onnx");.
Preprocess the input image: resize to 224x224, convert to DenseTensor<float>, and reorder channels to NCHW.
Call session.Run(inputs) and parse the output tensor to find the label with the highest confidence score.
User Action: The user triggers a "Capture" event in the edge application.
Command Input: The application passes the raw bitmap data to the preprocessing pipeline.
Policy Trigger: The code converts the bitmap to a normalized Float32 tensor.
API Request: The application calls the InferenceSession.Run method.
Workflow Execution: The ONNX Runtime maps the tensor to the input node of the frozen graph.
System Behavior: The DirectML execution provider schedules the convolution operations on the local GPU shaders.
Protocol Response: The model returns a 1xN tensor containing the probabilities for each class.
Data Model Processing: The application maps the index of the highest value to the corresponding string in labels.txt for display.
| Task | Precise Command or Path | Verification Standard |
|---|---|---|
| Export ONNX Model | Custom Vision Portal > Performance > Export > ONNX > Download | Local directory contains model.onnx (MB size) and labels.txt. |
| Initialize Session | new InferenceSession(modelPath, options) |
Object is not null and session.InputMetadata shows dimensions [1, 3, 224, 224]. |
| Verify Inference | session.Run(input).First().AsEnumerable<float>() |
Result is a float array where the sum of values equals 1.0 (Softmax output). |
Core Priority: High. Critical for large-scale identity management and high-availability facial recognition.
High Frequency: Implementing "LargePersonGroup" (up to 1M people) vs. "PersonGroup" (up to 10k people).
Confusion Alert: Differentiating between train (async operation) and recognition (inference availability).
Scenario Logic: A stadium security system needs to identify 500,000 individuals. You must transition from standard groups to LargePersonGroups and migrate trained state across regions for disaster recovery.
Version Delta: Use of the Snapshot API to move trained models without re-uploading source images.
Failure Trigger: Attempting to perform an Identify operation while the TrainingStatus is "running" or "failed".
Operational Dependency: Requires an Azure AI Face resource with an E0 (Standard) tier for large-scale group support.
The operational lifecycle of high-capacity facial recognition centers on the decoupled architecture of the LargePersonGroup. Unlike standard groups, LargePersonGroups utilize a specialized indexing structure that optimizes search across millions of facial templates. When a face is added to a Person object within the group, the system stores the feature vector (face print), but the search index remains unchanged.
The critical engineering gate is the Train call. This is an asynchronous background process that re-indexes the entire vector space. During this time, the group is "Locked" for identification if no previous successful training exists. To maintain 24/7 availability during updates or regional migrations, the Snapshot API is utilized. Instead of re-training in a secondary region (which would require re-sending all binary image data), the "Snapshot" captures the trained state, neural weights, and person-to-face mappings. This snapshot is exported to a shared Azure storage buffer and then "Applied" to a target region. This reduces the "Recovery Time Objective" (RTO) from hours of re-training to minutes of state application.
Object: LargePersonGroup
Attribute: recognitionModel
Value Range: recognition_01, recognition_02, recognition_03, recognition_04
Default State: recognition_01
Dependency: Cannot be changed after group creation
Failure State: Attempting to identify a face using a model version different from the group's model results in 400 Bad Request
Object: Training Status
Attribute: status
Value Range: nonstarted, running, succeeded, failed
Default State: nonstarted
Dependency: Must be succeeded before calling /identify
Failure State: PersonGroupNotTrained error during inference
Create a LargePersonGroup via PUT /largepersongroups/{id} specifying the recognitionModel.
Add Person objects and associate face images using POST /largepersongroups/{id}/persons/{pid}/persistedfaces.
Initiate the indexing process: POST /largepersongroups/{id}/train.
Poll the status using GET /largepersongroups/{id}/training until status returns succeeded.
Trigger a snapshot export: POST /Snapshots/take with the LargePersonGroup as the source and the SubscriptionID of the target region as the authorized recipient.
Retrieve the SnapshotID from the Operation-Location header.
In the target region, execute POST /Snapshots/apply using the SnapshotID.
Verify availability in the new region by calling GET /largepersongroups/{id}.
User Action: An administrator initiates a regional failover of the facial recognition system.
Command Input: The application triggers the Snapshots/take API call.
Policy Trigger: The Face API service validates the export permissions against the Entra ID (Azure AD) token.
API Request: The source region service bundles the trained vector index and metadata into a snapshot object.
Workflow Execution: The snapshot is temporarily moved to a global internal buffer.
System Behavior: The target region service pulls the snapshot and reconstructs the LargePersonGroup database entries.
Protocol Response: The apply operation returns a 202 Accepted, followed by a 200 OK once the state is live.
Data Model Processing: The identification engine in the secondary region begins accepting requests using the migrated feature vectors.
| Task | Precise Command or Path | Verification Standard |
|---|---|---|
| Check Training State | GET /largepersongroups/{id}/training |
JSON response contains "status": "succeeded" and a valid lastActionDateTime. |
| Migrate Trained State | POST /snapshots/take then POST /snapshots/apply |
Target region returns 201 Created for the new group ID. |
| Identify Individual | POST /identify with {"largePersonGroupId": "{id}", "faceIds": ["{id}"]} |
Response returns a candidates array with a confidence score > 0.5. |
What is the best deployment approach when a factory vision model needs sub-50 ms defect detection and limited network dependency?
Deploy the model at the edge with Azure IoT Edge and hardware-accelerated inference where supported.
Low-latency industrial inspection should avoid round trips to a remote cloud endpoint when milliseconds matter. Edge deployment can run a Custom Vision or ONNX model close to the camera stream, while GPU, VPU, or optimized CPU runtimes improve throughput. Exam scenarios usually expect local inference when latency, bandwidth, offline operation, or data locality is the main constraint.
Demand Score: 91
Exam Relevance Score: 96
Why must a Custom Vision project use a compact domain before it can be exported for offline inference?
Only exportable compact domains are designed to produce model artifacts that can run outside the hosted Custom Vision service.
Standard hosted domains are optimized for cloud service inference, while compact domains support export formats such as ONNX or other edge-compatible packages. If export is required after training, the project must be created with an exportable domain from the start or retrained appropriately. This is a common exam trap because choosing the wrong project domain can block the target deployment model.
Demand Score: 87
Exam Relevance Score: 94
What should be configured when spatial analysis results must align with a building floor plan or digital twin?
Configure camera calibration and map camera coordinates to the physical or digital twin coordinate system.
Spatial analysis outputs are only useful for occupancy, zone crossing, and heatmap scenarios when the camera perspective is translated into a meaningful physical layout. Calibration metadata corrects perspective distortion and maps detections to zones or coordinates used by downstream systems. AI-103 scenarios often test this bridge between raw vision detections and operational context.
Demand Score: 84
Exam Relevance Score: 92
Which Face API structure is appropriate for identifying hundreds of thousands of people?
Use a LargePersonGroup rather than a standard PersonGroup.
Standard PersonGroup resources are intended for smaller identity sets, while LargePersonGroup supports much larger collections. Large-scale identity workloads also require careful training, updates, and regional migration planning. The exam focus is selecting the correct Face API structure and understanding that training and snapshot operations become part of the operational lifecycle.
Demand Score: 86
Exam Relevance Score: 93
What should be verified first when an exported ONNX vision model performs slowly on an edge device?
Verify that the runtime, execution provider, model input size, and hardware acceleration path match the device capabilities.
Exporting to ONNX does not automatically guarantee optimized inference. Performance depends on runtime configuration, CPU/GPU/VPU support, model size, preprocessing, and batching behavior. In exam scenarios, the right answer usually checks deployment compatibility and acceleration settings before retraining the model or moving the workload back to the cloud.
Demand Score: 88
Exam Relevance Score: 94