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


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

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

После загрузки модели в качестве LearningModel можно использовать LearningModel.InputFeatures и LearningModel.OutputFeatures для получения объектов ILearningModelFeatureDescriptor . В этом списке ожидаемые типы функций входных и выходных данных модели.

Вы используете LearningModelBinding для привязки значений к функции, ссылаясь на ILearningModelFeatureDescriptor по свойству Name .

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


Типы функций

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

Тензоры

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

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

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

Карты

Карты — это пары сведений с ключом и значением. Модели классификации обычно возвращают карту строк/чисел с плавающей запятой, описывающую вероятность для каждого имени классификации. Например, выходные данные модели, пытающейся предсказать породу собак на рисунке, могут быть ["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 могут использовать метаданные для описания ожидаемых форматов изображений.

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

  • Изображение.BitmapPixelФормат: Bgr8
  • Изображение.ColorSpaceGamma: SRGB
  • Изображение.NominalPixelRange: NominalRange_0_255

Тензоризация

Изображения представлены в машинном обучении Windows в тензорном формате. Tensorization — это процесс преобразования изображения в тензор и происходит во время привязки.

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

  • 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 , чтобы выбрать, какой раздел изображения они хотели бы использовать. Если это не указано, среда выполнения масштабирует изображение до размера модели (с учетом пропорций), а затем выполнит центральное обрезание.

  • ТензорФлоатинг

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

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

Пример

В следующем примере показано, как выполнить привязку к входным данным модели. В этом случае мы создадим привязку из сеанса, создадим ImageFeatureValue из входного кадра и привяжем изображение к входным данным модели, 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 ML.

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