Xamarin.iOS에서 CoreML 소개Introduction to CoreML in Xamarin.iOS

CoreML iOS machine learning은 – 앱 문제를 해결 하려면 이미지 인식에서 모든 종류의 작업을 수행 하려면 학습 된 기계 학습 모델을 활용할 수 있습니다.CoreML brings machine learning to iOS – apps can take advantage of trained machine learning models to perform all sorts of tasks, from problem solving to image recognition.

이 소개에는 다음 내용을 다룹니다.This introduction covers the following:

CoreML 시작Getting Started with CoreML

이러한 단계는 CoreML iOS 프로젝트를 추가 하는 방법을 설명 합니다.These steps describe how to add CoreML to an iOS project. 참조 된 Mars Habitat Pricer 샘플 실용적인 예제입니다.Refer to the Mars Habitat Pricer sample for a practical example.

Mars Habitat 가격 예측자 샘플 스크린 샷

1. CoreML 모델 프로젝트에 추가1. Add the CoreML model to the project

CoreML 모델 추가 (파일을를 .mlmodel 확장)에 리소스 프로젝트의 디렉터리입니다.Add a CoreML model (a file with the .mlmodel extension) to the Resources directory of the project.

모델 파일의 속성에서 해당 빌드 작업 로 설정 된 CoreMLModel합니다.In the model file's properties, its Build action is set to CoreMLModel. 로 컴파일할 수는이 의미는 .mlmodelc 응용 프로그램을 빌드할 때 파일입니다.This means that it will be compiled into an .mlmodelc file when the application is built.

2. 모델 로드2. Load the model

사용 하 여 모델을 로드 합니다 MLModel.Create 정적 메서드입니다.Load the model using the MLModel.Create static method:

var assetPath = NSBundle.MainBundle.GetUrlForResource("NameOfModel", "mlmodelc");
model = MLModel.Create(assetPath, out NSError error1);

3. 매개 변수를 설정 합니다.3. Set the parameters

시작 및 종료를 구현 하는 컨테이너 클래스를 사용 하 여 모델 매개 변수는 전달 IMLFeatureProvider합니다.Model parameters are passed in and out using a container class that implements IMLFeatureProvider.

기능 공급자 클래스 문자열의 사전 처럼 동작 하 고 MLFeatureValues, 각 기능 값 있는 간단한 문자열 또는 숫자, 배열 또는 데이터 또는 이미지를 포함 하는 픽셀 버퍼 수입니다.Feature provider classes behave like a dictionary of string and MLFeatureValues, where each feature value could be a simple string or number, an array or data, or a pixel buffer containing an image.

단일 값 기능은 공급자에 대 한 코드 아래에 나와 있습니다.Code for a single-value feature provider is shown below:

public class MyInput : NSObject, IMLFeatureProvider
{
  public double MyParam { get; set; }
  public NSSet<NSString> FeatureNames => new NSSet<NSString>(new NSString("myParam"));
  public MLFeatureValue GetFeatureValue(string featureName)
  {
    if (featureName == "myParam")
      return MLFeatureValue.FromDouble(MyParam);
    return MLFeatureValue.FromDouble(0); // default value
  }

다음과 같은 클래스를 사용 하 여, 입력된 매개 변수를 CoreML에서 인식 하는 방식으로 제공할 수 있습니다.Using classes like this, input parameters can be provided in a way that is understood by CoreML. 기능 이름 (같은 myParam 코드 예제에서) 모델에 필요한 것과 일치 해야 합니다.The names of the features (such as myParam in the code example) must match what the model expects.

4. 모델 실행4. Run the model

모델을 사용 하는 기능은 공급자가 인스턴스화될 수 및 매개 변수를 설정 해야 하는 GetPrediction 메서드를 호출 합니다.Using the model requires that the feature provider to be instantiated and parameters set, then that the GetPrediction method be called:

var input = new MyInput {MyParam = 13};
var outFeatures = model.GetPrediction(inputFeatures, out NSError error2);

5. 결과 추출 합니다.5. Extract the results

예측 결과 outFeatures 인스턴스의 이기도 IMLFeatureProvider; output를 사용 하 여 값에 액세스할 수 있습니다 GetFeatureValue 의 각 출력 매개 변수 이름 (같은 theResult)이이 예제와 같이:The prediction result outFeatures is also an instance of IMLFeatureProvider; output values can be accessed using GetFeatureValue with the name of each output parameter (such as theResult), as in this example:

var result = outFeatures.GetFeatureValue("theResult").DoubleValue; // eg. 6227020800

CoreML 비전 프레임 워크 사용Using CoreML with the Vision Framework

CoreML 데도 사용할 수 있습니다 비전 프레임 워크와 함께에서 이미지, 도형 인식, 개체 id 및 기타 작업 등에서 작업을 수행 합니다.CoreML can also be used in conjunction with the Vision framework to perform operations on image, such as shape recognition, object identification, and other tasks.

다음 단계에서는 어떻게 CoreML 및 시각에서 함께 사용 합니다 CoreMLVision 샘플합니다.The steps below describe how CoreML and Vision are used together in the CoreMLVision sample. 샘플 결합 합니다 사각형 인식 사용 하 여 비전 프레임 워크에서는 MNINSTClassifier 사진에서 필기 한 숫자를 식별 하는 CoreML 모델.The sample combines the rectangles recognition from the Vision framework with the MNINSTClassifier CoreML model to identify a handwritten digit in a photograph.

숫자 3의 이미지 인식 숫자 5의 이미지 인식

1. 비전 CoreML 모델 만들기1. Create a Vision CoreML model

CoreML 모델 MNISTClassifier 로드 되어 다음에 래핑된를 VNCoreMLModel 그러면 모델 비전 작업에 사용할 수 있습니다.The CoreML model MNISTClassifier is loaded and then wrapped in a VNCoreMLModel which makes the model available for Vision tasks. 이 코드는 또한 두 비전 요청을 만듭니다: 먼저 이미지의 사각형을 찾기에 다음 CoreML 모델을 사용 하 여 사각형을 처리 합니다.This code also creates two Vision requests: first for finding rectangles in an image, and then for processing a rectangle with the CoreML model:

// Load the ML model
var bundle = NSBundle.MainBundle;
var assetPath = bundle.GetUrlForResource("MNISTClassifier", "mlmodelc");
NSError mlErr, vnErr;
var mlModel = MLModel.Create(assetPath, out mlErr);
var model = VNCoreMLModel.FromMLModel(mlModel, out vnErr);

// Initialize Vision requests
RectangleRequest = new VNDetectRectanglesRequest(HandleRectangles);
ClassificationRequest = new VNCoreMLRequest(model, HandleClassification);

클래스를 구현 해야 합니다 HandleRectanglesHandleClassification 3-4 단계 아래에 표시 된 Vision 요청에 대 한 메서드.The class still needs to implement the HandleRectangles and HandleClassification methods for the Vision requests, shown in steps 3 and 4 below.

2. 비전 처리 시작2. Start the Vision processing

다음 코드는 요청 처리를 시작 합니다.The following code starts processing the request. CoreMLVision 샘플에서이 코드는 사용자가 이미지를 선택한 후에 실행 합니다.In the CoreMLVision sample, this code runs after the user has selected an image:

// Run the rectangle detector, which upon completion runs the ML classifier.
var handler = new VNImageRequestHandler(ciImage, uiImage.Orientation.ToCGImagePropertyOrientation(), new VNImageOptions());
DispatchQueue.DefaultGlobalQueue.DispatchAsync(()=>{
  handler.Perform(new VNRequest[] {RectangleRequest}, out NSError error);
});

이 처리기에 전달 합니다 ciImage 비전 framework VNDetectRectanglesRequest 1 단계에서 생성 된 합니다.This handler passes the ciImage to the Vision framework VNDetectRectanglesRequest that was created in step 1.

3. 비전 처리의 결과 처리 합니다.3. Handle the results of Vision processing

사각형 검색이 완료 되 면 실행을 HandleRectangles 메서드 첫 번째 사각형을 추출 하려면 이미지를 자릅니다, 사각형이 이미지를 회색조로, 변환 및 분류에 대 한 CoreML 모델에 전달 합니다.Once the rectangle detection is complete, it executes the HandleRectangles method, which crops the image to extract the first rectangle, converts the rectangle image to greyscale, and passes it to the CoreML model for classification.

request 비전 요청의 세부 정보를 포함 하는이 메서드에 전달 된 매개 변수를 사용 하 고는 GetResults<VNRectangleObservation>() 메서드를 이미지에 있는 사각형의 목록을 반환 합니다.The request parameter passed to this method contains the details of the Vision request, and using the GetResults<VNRectangleObservation>() method, it returns a list of rectangles found in the image. 첫 번째 사각형 observations[0] 추출 및 CoreML 모델에 전달 됩니다.The first rectangle observations[0] is extracted and passed to the CoreML model:

void HandleRectangles(VNRequest request, NSError error) {
  var observations = request.GetResults<VNRectangleObservation>();
  // ... omitted error handling ...
  var detectedRectangle = observations[0]; // first rectangle
  // ... omitted cropping and greyscale conversion ...
  // Run the Core ML MNIST classifier -- results in handleClassification method
  var handler = new VNImageRequestHandler(correctedImage, new VNImageOptions());
  DispatchQueue.DefaultGlobalQueue.DispatchAsync(() => {
    handler.Perform(new VNRequest[] {ClassificationRequest}, out NSError err);
  });
}

합니다 ClassificationRequest 사용 하 여 1 단계에서 초기화 된는 HandleClassification 다음 단계에 정의 된 메서드.The ClassificationRequest was initialized in step 1 to use the HandleClassification method defined in the next step.

4. CoreML 처리4. Handle the CoreML

request CoreML 요청의 세부 정보를 포함 하는이 메서드에 전달 된 매개 변수를 사용 하 고는 GetResults<VNClassificationObservation>() 메서드를 신뢰 하 여 정렬 가능한 결과의 목록을 반환 합니다 (가장 높은 신뢰도 첫 번째):The request parameter passed to this method contains the details of the CoreML request, and using the GetResults<VNClassificationObservation>() method, it returns a list of possible results ordered by confidence (highest confidence first):

void HandleClassification(VNRequest request, NSError error){
  var observations = request.GetResults<VNClassificationObservation>();
  // ... omitted error handling ...
  var best = observations[0]; // first/best classification result
  // render in UI
  DispatchQueue.MainQueue.DispatchAsync(()=>{
    ClassificationLabel.Text = $"Classification: {best.Identifier} Confidence: {best.Confidence * 100f:#.00}%";
  });
}

샘플Samples

하려는 CoreML 샘플 세 가지가 있습니다.There are three CoreML samples to try:

  • 합니다 Mars Habitat 가격 예측자 샘플 단순 숫자 입력 및 출력 합니다.The Mars Habitat Price Predictor sample has simple numeric inputs and outputs.

  • 합니다 비전 및 CoreML 샘플 이미지 매개 변수를 받아들이고 비전 프레임 워크를 사용 하 여 자리를 인식 하는 CoreML 모델에 전달 되는 이미지의 사각형 영역을 식별 합니다.The Vision & CoreML sample accepts an image parameter, and uses the Vision framework to identify square regions in the image, which are passed to a CoreML model that recognizes single digits.

  • 마지막으로, 합니다 CoreML 이미지 인식 샘플 CoreML를 사용 하 여 사진에서 기능을 식별 합니다.Finally, the CoreML Image Recognition sample uses CoreML to identify features in a photo. 기본적으로 사용 하 여 더 작은 SqueezeNet 모델 (5MB) 하지만 쓰인 다운로드 하 고 더 큰 숫자를 통합할 수 있도록 VGG16 모델 (553 MB)입니다.By default it uses the smaller SqueezeNet model (5MB), but it's been written so that you can download and incorporate the larger VGG16 model (553MB). 자세한 내용은 참조는 샘플의 추가 정보합니다.For more information, see the sample's readme.