Поделиться через


Привязка модели

Модель машинного обучения имеет выходные и выходные признаки для передачи информации в модель и из нее.

Выполнив загрузку модели в объект LearningModel, вы можете применить LearningModel.InputFeatures и LearningModel.OutputFeatures для получения объектов ILearningModelFeatureDescriptor. Они позволяют получить списки ожидаемых типов входных и выходных признаков модели.

Используйте LearningModelBinding для привязки значений к этим признакам, указав ссылку на ILearningModelFeatureDescriptor по значению свойства Name (Имя).

В следующем видео представлен краткий обзор процесса привязки признаков для модели машинного обучения.


Типы функций

Windows ML поддерживает все типы признаков ONNX, которые перечислены в LearningModelFeatureKind. Они сопоставляются с разными классами дескрипторов признаков.

Тензоры

Тензорами называют многомерные массивы, из которых наиболее распространены тензоры с 32-разрядными значениями с плавающей запятой. Размерности тензоров развертываются по строкам, а каждая размерность представлена плотно упакованными смежными данными. Общий размер тензора вычисляется как произведение размеров каждого измерения.

Последовательности

Последовательности — это векторы значений. Типы последовательностей чаще всего применяются для хранения вектора вероятностей с плавающей запятой, которые некоторые модели классификации возвращают как оценку точности каждого прогноза.

Maps

Карты содержат информацию в формате пар "ключ — значение". Модели классификации часто возвращают карту строковых значений и чисел с плавающей запятой, которые обозначают численную вероятность для каждой метки имен классификации. Например, выходные данные модели, прогнозирующей породу собаки на изображении, могут выглядеть так: ["Boston terrier", 90.0], ["Golden retriever", 7.4], ["Poodle", 2.6].

Скаляры

Большинство карт и последовательностей содержат скалярные значения. Они используются, когда значение TensorFeatureDescriptor.Shape.Size равно нулю (0). В этом случае карта или последовательность будет иметь скалярный тип. Наиболее распространенным является float. Например, карта сопоставления строк с числами с плавающей запятой будет выглядеть следующим образом:

MapFeatureDescriptor.KeyKind == TensorKind.String
MapFeatureDescriptor.ValueDescriptor.Kind == LearningModelFeatureKind.Tensor
MapFeatureDescriptor.ValueDescriptor.as<TensorFeatureDescriptor>().Shape.Size == 0

Фактическое значение признака карты выражается как IMap<string, float>.

Последовательность карт

Последовательность карт является простым вектором пар "ключ — значение". Например, последовательность карт для сопоставления строк и чисел с плавающей запятой будет иметь тип IVector<IMap<string, float>>. Приведенные выше выходные данные прогнозирования породы собак ["Boston terrier", 90.0], ["Golden retriever", 7.4], ["Poodle", 2.6]типичный пример последовательности карт.

Изображения

При работе с изображениями важно понимать форматы изображений и процесс преобразования в тензор.

Форматы изображений

Модели обучаются по обучающему набору изображений, для которого подбираются и сохраняются весовые коэффициенты. Формат изображения, передаваемого в качестве входных данных в эту модель, должен соответствовать формату обучающих изображений.

Во многих случаях модель сама описывает ожидаемый формат изображений. Например, модели ONNX могут использовать метаданные для описания ожидаемых форматов.

В большинстве моделей, хотя и не во всех, используются следующие форматы.

  • Image.BitmapPixelFormat: Bgr8
  • Image.ColorSpaceGamma: SRGB
  • Image.NominalPixelRange: NominalRange_0_255

Преобразование в тензор

В Windows ML изображения представлены в формате тензоров. Преобразование изображения в тензор выполняется во время привязки.

Windows ML позволяет преобразовать изображения в 4-мерные тензоры 32-разрядных чисел с плавающей запятой (формат NCHW).

  • N: размер пакета (количество изображений). В настоящее время Windows ML поддерживает только размер пакета N=1.
  • C: число каналов (1 для формата Gray8 или 3 для Bgr8).
  • H: высота изображения.
  • W: ширина изображения.

Каждый пиксель на изображении представлен 8-разрядным значением цвета в диапазоне от 0 до 255, которые упаковываются в 32-разрядные числа с плавающей запятой.

Передача изображений в модель

Существует два способа передать изображения в модель.

  • ImageFeatureValue

    Мы рекомендуем использовать объект ImageFeatureValue для привязки изображений в качестве входных и выходных данных, так как он выполняет преобразование формата и преобразование в тензор в соответствии с требованиями модели к изображениям. В настоящее время для моделей поддерживаются следующие типы форматов: Gray8, Rgb8 и Bgr8 с диапазоном значений пикселей от 0 до 255.

    Вы можете создать ImageFeatureValue с помощью статического метода ImageFeatureValue.CreateFromVideoFrame.

    Чтобы узнать, какой формат нужен для модели, WinML использует следующую логику и порядок очередности.

    1. Bind(String, Object, IPropertySet) переопределяет все параметры изображения.
    2. После этого проверяются и применяются метаданные модели, если они доступны.
    3. Если для модели не предоставлено ни метаданных, ни свойств от вызывающей стороны, среда выполнения пытается выбрать лучшее соответствие.
    • Если тензор имеет формат, близкий к NCHW (4-мерный со значениями float32, где N==1), среда выполнения применит формат Gray8 (C==1) или Bgr8 (C==3) в зависимости от количества каналов.
    • Подразумевается NominalRange_0_255
    • Подразумевается SRGB

    В вызов Bind(String, Object, IPropertySet) можно передать несколько необязательных свойств.

    • BitmapBounds. Это свойство используется для обозначения границ для обрезки перед отправкой изображения в модель.
    • BitmapPixelFormat. Это свойство используется как формат пикселей для модели во время преобразования изображения.

    Для размера изображений в модели можно указать определенную форму (например, SqueezeNet принимает размер 224×224) или произвольные размеры для изображения любой формы (многие модели типа StyleTransfer могут принимать изображения с переменным размером). Вызывающая сторона может применить BitmapBounds для выбора используемого фрагмента изображения. Если это значение не указано, среда выполнения масштабирует изображение до размера модели с сохранением пропорций, а затем обрезает его по центру.

  • TensorFloat

    Если Windows ML не поддерживает выбранный для модели цветовой формат или диапазон значений пикселей, вы можете реализовать собственную процедуру преобразования. Для входящего значения создайте четырехмерный тензор формата NCHW с 32-разрядными числами с плавающей запятой. Пример таких преобразований вы найдете здесь.

    При использовании этого метода игнорируются все заданные в модели метаданные изображения.

Пример

В следующем примере показано, как выполнить привязку ко входу модели. В нашем примере мы создаем привязку из сеанса, затем создаем ImageFeatureValue из inputName и выполняем привязку изображения ко входу модели (inputName).

private void BindModel(
    LearningModelSession session,
    VideoFrame inputFrame,
    string inputName)
{
    // Create a binding object from the session
    LearningModelBinding binding = new LearningModelBinding(session);

    // Create an image tensor from a video frame
    ImageFeatureValue image =
        ImageFeatureValue.CreateFromVideoFrame(inputFrame);

    // Bind the image to the input
    binding.Bind(inputName, image);
}

См. также раздел

Примечание

Используйте следующие ресурсы для получения справки по машинному обучению в Windows:

  • Чтобы задать технические вопросы о машинном обучении в Windows или ответить на них, используйте тег windows-machine-learning в Stack Overflow.
  • Сообщить об ошибке можно в нашем репозитории GitHub.