DirectML Documentation

Windows Development

DirectML Object Detection - Custom Models

Explore how to leverage DirectML for efficient object detection using custom trained models. This guide provides insights into integrating your own machine learning models with DirectML for enhanced performance on Windows devices.

Introduction to Custom Object Detection with DirectML

DirectML empowers developers to accelerate machine learning inference directly on DirectX 12-compatible hardware. When it comes to object detection, this means faster, more responsive applications that can identify objects within images or video streams in real-time. This sample focuses on the process of taking a pre-trained custom object detection model and making it run efficiently using DirectML.

Supported Model Formats

DirectML supports several popular model formats, including ONNX (Open Neural Network Exchange). The workflow typically involves converting your trained model into an ONNX file.

Steps for Custom Model Integration:

  1. Model Training: Train your object detection model using your preferred framework (e.g., TensorFlow, PyTorch, YOLO).
  2. Model Conversion: Convert your trained model to the ONNX format. Tools like tf2onnx for TensorFlow or PyTorch's built-in ONNX exporter can be used.
  3. DirectML Inference: Load the ONNX model into your DirectML application. This involves setting up the DirectML device, command queue, and operator graph.
  4. Input/Output Handling: Prepare your input data (images) in the format expected by the model and process the model's output to draw bounding boxes and labels.

Example Workflow Snippets

Here are conceptual code snippets illustrating key DirectML operations for loading and running an ONNX model.

Loading an ONNX Model (Conceptual C++):


// Assume 'onnxModelPath' is the path to your converted ONNX file.
// Assume 'd3dDevice' is your initialized ID3D12Device.

Microsoft::WRL::ComPtr<IDMLOperatorSet> operatorSet;
HRESULT hr = DMLCreateOperatorSet(DML_EXECUTION_FLAG_NONE, IID_PPV_ARGS(&operatorSet));
if (SUCCEEDED(hr)) {
    Microsoft::WRL::ComPtr<IDMLBindingTable> bindingTable;
    Microsoft::WRL::ComPtr<IDMLCompiledOperator> compiledOperator;

    // 1. Create a Graph Descriptor from the ONNX file
    // This is a simplified representation; actual implementation involves DML_GRAPH_DESC, DML_INPUT_DESC, etc.
    auto graphDescriptor = CreateGraphDescriptorFromOnnx(onnxModelPath, d3dDevice);

    // 2. Compile the operator graph
    DML_EXECUTION_FLAG executionFlags = DML_EXECUTION_FLAG_NONE;
    Microsoft::WRL::ComPtr<IDMLOperator> graphOperator;
    hr = operatorSet->Compile(graphDescriptor.Get(), executionFlags, IID_PPV_ARGS(&graphOperator));

    if (SUCCEEDED(hr)) {
        // 3. Create a binding table for the operator
        Microsoft::WRL::ComPtr<IDMLBindingTable> bindingTable;
        hr = graphOperator->CreateBindingTable(IID_PPV_ARGS(&bindingTable));

        // ... bind input and output resources ...

        // 4. Create a Command Recorder and record the operator execution
        Microsoft::WRL::ComPtr<ID3D12CommandRecorder> commandRecorder;
        d3dDevice->CreateCommandRecorder(IID_PPV_ARGS(&commandRecorder));

        Microsoft::WRL::ComPtr<ID3D12CommandList> commandList;
        // ... create command list ...

        commandRecorder->RecordOperator(commandList.Get(), graphOperator.Get(), bindingTable.Get());

        // ... close command list and submit for execution ...
    }
}
            

Binding Resources (Conceptual C++):


// Assume 'inputGpuBuffer' and 'outputGpuBuffer' are pre-allocated ID3D12Resource objects.
// Assume 'bindingTable' is an initialized IDMLBindingTable.

// Bind input tensor (e.g., image data)
bindingTable->BindBufferResource(0, inputGpuBuffer.Get());

// Bind output tensor (e.g., bounding boxes, confidence scores)
bindingTable->BindBufferResource(1, outputGpuBuffer.Get());

// Dispatch binding table updates if necessary
bindingTable->Update();
            

Benefits of Using DirectML for Object Detection

Next Steps

Dive into the provided sample code to see a full implementation. Understand how to prepare your data, manage memory resources, and interpret the results. Experiment with different object detection models to find the best fit for your application.

Download the Custom Object Detection Sample