CoreML を使って画像認識、Objective-C で書くと・・・

CoreML を使って文字の認識をしたくて、色々調べているのですが、Swift の記事ばかりで、Objective-C の例が全然ない。Swift の記述を Objective-C に置き換えればよい話なのですが、Swift を理解していないので辛い・・・。書籍は持っているのですが、なかなか覚えられないものです。そんな中、ようやく Objective-C で記述できたので、参考までに記載。

まず、カメラを使って写真を撮ります。その写真を VGG16 model で画像認識させて、写っている物体を認識させます。いろいろな記事を読んでいると、スッゲー簡単みたいなことが書いてありますが、Objective-C の記載ではないので前準備の変数定義部分からして???なんですが、ようやく形になったと。具体的にはこんな感じ・・・

 

- (void) imageClassification
{
    NSString* filepath = [[NSBundle mainBundle] pathForResource:@"VGG16" ofType:@"mlmodelc"];
    NSURL* modelUrl = [NSURL URLWithString:filepath];
    NSError* error;
    MLModel* model = [MLModel modelWithContentsOfURL:modelUrl error:&error];
    if ( error )
    {
        NSLog(@"cover search error: model not configure");
    }

    

    VNCoreMLModel* coreMLModel = [VNCoreMLModel modelForMLModel:model error:&error];
    NSDictionary* dictionary = [NSDictionary new];
    VNImageRequestHandler* handler = [[VNImageRequestHandler alloc]
                                      initWithCGImage:self.cameraImage.image.CGImage
                                      options:dictionary];

    

    VNCoreMLRequest* corerequest = [[VNCoreMLRequest alloc]
                                    initWithModel:coreMLModel
                                    completionHandler:(VNRequestCompletionHandler) ^(VNRequest *request, NSError *error){
                                        if ( error )
                                        {
                                            NSLog(@"error です");
                                        }
                                        else
                                        {
                                            VNClassificationObservation* firstObservation = [request.results firstObject];

                                            

                                            VNClassificationObservation* secondObservation = [request.results objectAtIndex:1];

                                            

                                            VNClassificationObservation* thirdObservation = [request.results objectAtIndex:2];
                                            NSLog(@"認識しました。%@", firstObservation.identifier);
                                            self.displayLog.text = [NSString stringWithFormat:@"%@\n%@\n%@", firstObservation.identifier, secondObservation.identifier, thirdObservation.identifier];
                                        } // end of if
                                    }
                                ]; // end of request

    

    [handler performRequests:@[ corerequest ] error:&error]; // ここで実行
    if ( error )
    {
        NSLog(@"%@", error);
    }
}

意外とハマるのが、結果の取り出し部分で、配列に結果が返ってくるのはわかっていても、具体的にどうやって取り出すのかよくわからなかったです。また、request.results 配列に結果が返ってきますが、どれくらいのサイズがあるのかというと、999 もありました。ので、この例では、上位  3 つを取り出しています。

次は、画像を読み込む、textdetection で四角を切り取り、四角の中の文字を認識させるという流れになります。モデルを自作できるとよいのですが・・・