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 で四角を切り取り、四角の中の文字を認識させるという流れになります。モデルを自作できるとよいのですが・・・