2017-11-28 21 views
1

Objective-C에 Apple의 CoreML을 사용하는 간단한 예를 만드는 데 문제가 있습니다. 나는 이미 단순히 지금 작동 python를 사용하여 모델 파일을 만들었습니다objective-C에서 coreml 실행하기

coreml_model_svm = coremltools.models.MLModel("svm.mlmodel") 
test_x = [1.0 for x in range(160)] 
predictions_coreml_svm = coreml_model_svm.predict({"input":test_x}) 

내가 Objective-C에서 위의 세 가지 라인을 재현하고 싶습니다. 내 데이터는 MLMultiArray이어야하며 모델은 MLModel에로드되어야 함을 알고 있습니다. 구문에 대한 정보를 찾으려고했지만 문서가 어떻게 작동하는지 이해하지 못하고 모든 예제가 Swift에 있습니다. 지금까지 내 코드가 있습니다. MLMultiArray을 주석 처리하면 MLModel을 초기화 할 때 예기치 않은 예외가 발생합니다. 덧글을 쓰지 않을 때 MLMultiArray 나는 no known class method for selector 'initWithShape:dataType:error'를 얻는다.

#import <Foundation/Foundation.h> 
#import <CoreML/CoreML.h> 

//clang -framework Foundation coremltest.m -o coremltest 
int main (int argc, const char * argv[]) 
{ 
     NSLog(@"start"); 

     NSArray * shape = [[NSArray alloc] init]; 
     MLMultiArrayDataType dataType = MLMultiArrayDataTypeDouble; 
     NSError * error = nil; 

     MLMultiArray * input = [MLMultiArray initWithShape:(NSArray*) shape 
          dataType:(MLMultiArrayDataType) dataType 
         error:(NSError **) error]; 

     MLModel * mymodel = [[MLModel init] initWithContentsOfFile:@"svm.mlmodel"]; 

     return 0; 
} 

감사합니다. 당신이 당신의 경우 SVM에서 모델 클래스를 가져올 필요의

+0

왜 Objective-C를 사용하고 싶은지 궁금합니다.위의 코드는 유효한 Obj-C가 아니기 때문에 내가 언어에 능숙하지 않다는 것을 알게됩니다. 그렇다면 왜 그것을 사용해야합니까? 어쨌든 코드는 다음과 같아야합니다 :'MLMultiArray * input = [MLMultiArray initWithShape : @ [@ 10, @ 10] dataType : MLMultiArrayDataTypeDouble 오류 : & error];'MLModel * model = [[MLModel alloc] initWithContentsOfFile : @ "name"];' –

답변

1

먼저 (SVM은 대문자로 시작하는 더 좋을 것이다) :

#import "svm.h" 

이 클래스 정의는 당신이 필요한 모든 정보를 포함 입력 및 출력 및 메소드 정의 왼쪽에있는 mlmodel 파일을 선택할 때 클래스 이름 바로 옆의 작은 화살표를 클릭하여 자동으로 생성 된 클래스 설명에서이 스펙을 찾을 수 있습니다. 귀하의 경우에는이 클래스의 설명

enter image description here

에서 입력은 벡터로 160 개 두 요소가있는 MLMultiArray입니다.

MLMultiArrayDataType dataType = MLMultiArrayDataTypeDouble; 
    NSError *error = nil; 

    MLMultiArray *theMultiArray = [[MLMultiArray alloc] initWithShape:(NSArray*)shape 
              dataType:(MLMultiArrayDataType)dataType 
              error:&error] ; 

    for (int i = 0; i < 160; i++) { 
     [theMultiArray setObject:[NSNumber numberWithDouble:1.0] atIndexedSubscript:(NSInteger)i]; 
    } 

사용 된 그래서 제

NSArray *shape = @[@1, @160]; 

이어서 (다시 자동 엑스 코드에 의해 정의 된) 예측 프로세스 대한 svmModelInput 될 MLMultiArray를 정의 형상 배열 크기를 정의

initWithShape

입니다. MLMul Apple의 tiArray 메소드. 테스트를 위해서 배열을 "1"로 채웠지 만, 나중에 실제 입력으로 바꿔야합니다.

모델을 얻을 필요가 없습니다, 당신의 SVM은 다시 엑스 코드에 의해 만들어진 클래스에서 인

predictionFromInput:

방법을 실행 인스턴스화 :

 svm *mySvm = [[svm alloc] init]; 

     svmOutput * svmModelOutput = [(svm *)mySvm predictionFromInput:theMultiArray error:&error]; 
     NSLog(@"SVM Model output = %lld -- %@", svmModelOutput.classLabel, svmModelOutput.classProbability); 

      if (!error) 
      { 
       NSLog(@"svm finished without error"); 
      } 
      else 
      { 
       NSLog(@"Error: %@", error.localizedDescription); 
      } 

을 당신은 을 인쇄하기 svmModelOutput (XCode에서 생성)을 사용하면 예상되는 classLabel을 정수로 확인하고 모든 레이블의 확률을 다음과 같이 확인할 수 있습니다.

2017-12-04 07:32:45.765015+0100 CoreML_test[2634:877638] SVM Model output = 2 -- { 
    11 = "0.002656571278812773"; 
    3 = "0.2121030282896462"; 
    10 = "0.004570897664662783"; 
    2 = "0.5825387375626612"; 
    9 = "0.02911120023388797"; 
    4 = "0.1690195649703292"; 
}