모델 바인딩
기계 학습 모델에는 모델 내외부로 정보를 전달하는 입력 및 출력 기능이 있습니다.
모델을 LearningModel로 로드한 후에 LearningModel.InputFeatures와 LearningModel.OutputFeatures를 사용하여 ILearningModelFeatureDescriptor 개체를 가져올 수 있습니다. 여기에는 모델에 필요한 입력 및 출력 기능 유형이 나열됩니다.
LearningModelBinding을 사용하여 값을 기능에 바인딩하고 Name 속성으로 ILearningModelFeatureDescriptor를 참조합니다.
다음 비디오에서는 기계 학습 모델의 바인딩 기능에 대해 간략히 설명합니다.
기능 유형
Windows ML은 LearningModelFeatureKind에 열거된 모든 ONNX 기능 유형을 지원합니다. 이러한 기능은 다양한 기능 설명자 클래스에 매핑됩니다.
- 텐서: TensorFeatureDescriptor
- 시퀀스: SequenceFeatureDescriptor
- 맵: MapFeatureDescriptor
- 이미지: ImageFeatureDescriptor
텐서
텐서는 다차원 배열이며 가장 일반적인 텐서는 32비트 float 텐서입니다. 텐서의 차원은 행 중심이며, 각 차원을 나타내는 연속 데이터가 밀집되어 있습니다. 텐서의 전체 크기는 각 차원의 크기의 곱입니다.
시퀀스
시퀀스는 값의 벡터입니다. 시퀀스 유형의 일반적인 사용은 float 확률 벡터이며, 일부 분류 모델은 각 예측에 대한 정확도 등급을 나타내기 위해 반환됩니다.
Maps
맵은 정보의 키/값 쌍입니다. 분류 모델은 일반적으로 레이블이 지정된 각 분류 이름의 float 확률을 설명하는 문자열/float 맵을 반환합니다. 예를 들어 그림에서 강아지의 품종을 예측하려는 모델의 출력은 ["Boston terrier", 90.0], ["Golden retriever", 7.4], ["Poodle", 2.6]
일 수 있습니다.
스칼라
대부분의 맵과 시퀀스에는 스칼라 값이 있습니다. 이것은 TensorFeatureDescriptor.Shape.Size가 0인 위치에 표시됩니다. 이 경우 맵 또는 시퀀스는 스칼라 형식이 됩니다.
float
이 가장 일반적입니다. 예를 들어 문자열-float 맵은 다음과 같습니다.
MapFeatureDescriptor.KeyKind == TensorKind.String
MapFeatureDescriptor.ValueDescriptor.Kind == LearningModelFeatureKind.Tensor
MapFeatureDescriptor.ValueDescriptor.as<TensorFeatureDescriptor>().Shape.Size == 0
실제 맵 기능 값은 IMap<string, float>
입니다.
맵 시퀀스
맵 시퀀스는 키/값 쌍의 벡터일 뿐입니다. 문자열-float 맵 시퀀스는 IVector<IMap<string, float>>
형식입니다. 위의 강아지 품종 예측에 대한 출력 ["Boston terrier", 90.0], ["Golden retriever", 7.4], ["Poodle", 2.6]
은 맵 시퀀스의 예입니다.
이미지
이미지로 작업하는 경우 이미지 형식과 텐서화(tensorization)에 대해 알고 있어야 합니다.
이미지 형식
모델은 이미지 학습 데이터로 학습되며 해당 학습 세트에 맞게 가중치가 저장되고 조정됩니다. 이미지 입력을 모델에 전달할 때는 그 형식이 학습 이미지의 형식과 일치해야 합니다.
대부분의 경우 모델은 필요한 이미지 형식을 설명합니다. ONNX 모델은 메타데이터를 사용하여 필요한 이미지 형식을 설명할 수 있습니다.
대부분의 모델은 다음 형식을 사용하지만 모든 모델에 보편적인 것은 아닙니다.
- Image.BitmapPixelFormat: Bgr8
- Image.ColorSpaceGamma: SRGB
- Image.NominalPixelRange: NominalRange_0_255
텐서화(Tensorization)
이미지는 Windows ML에서 텐서 형식으로 표시됩니다. 텐서화(Tensorization)는 이미지를 텐서로 변환하는 프로세스이며 바인딩하는 동안 발생합니다.
Windows ML은 이미지를 "NCHW 텐서 형식"의 32비트 float 4차원 텐서로 변환합니다.
- N: 일괄 처리 크기(또는 이미지 수). Windows ML은 현재 일괄 처리 크기 N, 1을 지원합니다.
- C: 채널 수(Gray8의 경우 1, Bgr8의 경우 3).
- H: 높이.
- W: 너비.
이미지의 각 픽셀은 0-255 범위 내에 저장되고 32비트 float로 채워지는 8비트 색 번호입니다.
이미지를 모델에 전달하는 방법
이미지를 모델에 전달할 수 있는 방법은 두 가지입니다.
-
ImageFeatureValue를 사용하여 이미지를 입력 및 출력으로 바인딩하는 것이 좋습니다. 그러면 변환 및 텐서화(tensorization)가 모두 처리되기 때문에 이미지가 모델의 필수 이미지 형식과 일치합니다. 현재 지원되는 모델 형식은 Gray8, Rgb8 및Bgr8이며 현재 지원되는 픽셀 범위는 0-255입니다.
정적 메서드 ImageFeatureValue.CreateFromVideoFrame을 사용하여 ImageFeatureValue를 만들 수 있습니다.
모델에 필요한 형식을 찾기 위해 WinML은 다음과 같은 논리와 우선 순위를 사용합니다.
- Bind(String, Object, IPropertySet)는 모든 이미지 설정을 재정의합니다.
- 그러면 모델 메타데이터가 확인되고 사용이 가능한 경우 사용됩니다.
- 모델 메타데이터가 제공되지 않고 호출자가 제공한 속성이 없으면 런타임은 가장 일치하는 항목을 시도합니다.
- 텐서가 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이 모델의 색 형식이나 픽셀 범위를 지원하지 않으면 변환 및 텐서화(tensorization)를 구현할 수 있습니다. 입력 값으로 32비트 float에 대한 NCHW 4차원 텐서를 생성합니다. 이 작업을 수행하는 방법에 대한 예제는 사용자 지정 텐서화 샘플을 참조하세요.
이 메서드를 사용하면 모델의 이미지 메타데이터가 무시됩니다.
예제
다음 예제는 모델의 입력에 바인딩하는 방법을 보여줍니다. 이 경우 session에서 바인딩을 만들고 inputFrame에서 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에 대한 기술적인 질문을 하거나 질문에 답하려면, Stack Overflow에서 windows-machine-learning 태그를 사용하세요.
- 버그를 보고하려면 GitHub에서 문제를 제출하세요.