一覧に戻る

iOS ネイティブAPIのクラウド認識

2017.09.22iOSネイティブAPI

クラウド認識

このトピックではAR.ImageTrackerクラスとAR.CloudRecognitionServiceクラスを使用してクラウドサーバー上の画像を認識し、拡張する方法を示します。
まずは、より良く理解できるように、このドキュメントで使用する画像認識型ARに関する用語の定義を以下に示します。
  • ターゲット: 認識対象の画像と認識に必要とされる抽出データ。
  • ターゲットコレクション: ターゲットの集合体。認識対象の画像すべてを含むディレクトリと見なすことができます。Wikitude SDKでは2種類の異なるターゲットコレクションを扱うことができます。
    • オンデバイスターゲットコレクション: 認識対象の画像と認識に必要とされる抽出データを含む静的なwtcファイル。格納できるターゲットの数は最大1,000です。
    • クラウドターゲットコレクション: Wikitudeサーバーに保存されたターゲットコレクション。下記の「クラウドアーカイブ」を参照してください。格納できるターゲットの数は最大50,000です。
  • クラウドアーカイブ: サーバーに保存されている、クラウド認識用に最適化されたアーカイブ。ターゲットコレクションから生成され、AR.CloudRecognitionServiceと組み合わせて使用されます。
  • CloudRecognitionService: AR.CloudRecognitionServiceは、カメラビューからの入力をデバイスで直接分析および計算するのではなく、カメラで撮影した画像をWikitude Cloud Recognitionサーバーに送信します。サーバーは送られてきた画像を指定されたクラウドアーカイブ内のターゲットとマッチングします。AR.CloudRecognitionServiceを使用すると大規模な画像データベースを検索できる利点があり、さらにはほとんどのケースで全体的なパフォーマンスも向上します。特にターゲット数の多いターゲットコレクションや性能がそれほど高くないデバイスを使用するときに効果的です。

以下のクラウド認識のサンプルではどちらも、外部レンダリングを使用します。詳細はiOS ネイティブAPIのレンダリングを参照してください。

CloudRecognitionServiceには、随時認識モードと連続認識モードの2種類の実行モードがあります。随時認識モードでは認識サイクルが1回だけ実行され、連続認識モードでは可変の間隔で連続的に認識が実行されます。サンプルを基にそれぞれのモードについて説明します。

地域サーバーのエンドポイント

最初に、SDKの接続対象となるWikitudeの地域分散型サーバーを選択する必要があります。
WTTrackerManagerのsetCloudRecognitionServerRegionを呼び出すことにより、クラウド認識サーバーの地域を選択することができます。地域サーバーを指定するには、パラメータとしてWTCloudRecognitionServerRegionの値を渡します。その後、作成したすべてのクラウド認識サービスは指定されたサーバーに通信します。

随時認識モード

WTOnClickCloudRecognitionクラスを確認します。-viewDidLoadでWTWikitudeNativeSDKの新しいインスタンスを作成し、有効なライセンスキーを指定して初期化します。

self.wikitudeSDK = [[WTWikitudeNativeSDK alloc] initWithRenderingMode:WTRenderingMode_External delegate:self];
[self.wikitudeSDK setLicenseKey:kWTLicenseKey];

次に-viewDidAppear:で、-start:completion:メソッドを使用してWikitude SDK ネイティブAPIを起動します。SDKが起動した場合、WTTrackerManagerファクトリメソッドの- createCloudRecognitionServiceWithClientToken:targetCollectionId:completionを使用してWTCloudRecognitionService型のオブジェクトを作成します。返されたポインタを保持するため、stringプロパティに格納します。コンプリートブロックでは、クラウド認識サービスが正常に初期化されているかどうかを確認する必要があります。その場合は、-createImageTrackerFromCloudRecognitionService:delegate:configurationファクトリメソッドを使用して画像トラッカーを作成できます。

[self.wikitudeSDK start:nil completion:^(BOOL isRunning, NSError * __nonnull error) {
    if ( !isRunning ) {
        NSLog(@"Wikitude SDK is not running. Reason: %@", [error localizedDescription]);
    }
    else
    {
        __weak typeof(self) weakSelf = self;

        self.cloudRecognitionService = [self.wikitudeSDK.trackerManager createCloudRecognitionServiceWithClientToken:@"b277eeadc6183ab57a83b07682b3ceba" targetCollectionId:@"54e4b9fe6134bb74351b2aa3" completion:^(BOOL success, NSError * error) {
            if ( !success )
            {
                NSLog(@"Cloud recognition service failed to initialize with error: %@", [error localizedDescription]);
            }
            else
            {
                NSLog(@"Creating image tracker");
                weakSelf.imageTracker = [weakSelf.wikitudeSDK.trackerManager createImageTrackerFromCloudRecognitionService:weakSelf.cloudRecognitionService delegate:weakSelf configuration:nil];
            }
        }];
    }
}];

画像トラッカーがクラウド認識サービスで初期化された場合、imageTrackerDidLoadTargetsとimageTracker:didFailToLoadTargetsは初期化中に呼び出されませんが、サーバーから有効な応答を受け取った後、トラッカーはサーバーから受信したターゲットを初期化して、初期化できるかどうかを通知します。

- (void)imageTrackerDidLoadTargets:(nonnull WTImageTracker *)imageTracker
{
    NSLog(@"Image tracker loaded");
}

- (void)imageTracker:(WTCloudTracker * __nonnull)imageTracker didFailToLoadTargets:(NSError * __nonnull)error
{
    NSLog(@"Image tracker failed to load with error: %@", [error localizedDescription]);
}

単一認識を開始するには、-recognize:メソッドを呼び出します。ブロック内の最初のパラメータは、クラウド認識サービスから返された応答です。-recognize:errorHandler:メソッドを呼び出すには、UIButtonはタッチされた後に特定のメソッドを呼び出すように設定します。

- (IBAction)sendCloudRecognitionRequest:(id)sender
{
    if ( self.cloudRecognitionService && self.cloudRecognitionService.initialized )
    {
        [self.cloudRecognitionService recognize:^(WTCloudRecognitionServiceResponse * _Nullable response, NSError * _Nullable error) {
            if ( response )
            {
                if ( response.recognized )
                {
                    NSLog(@"Recognized target '%@' which has a rating of '%ld'", [response.targetInformations objectForKey:WTCloudRecognitionServiceResponseKey_TargetName], (long)[[response.targetInformations objectForKey:WTCloudRecognitionServiceResponseKey_TargetRating] integerValue]);
                    NSLog(@"Associated (custom) metadata: %@", response.metadata);
                }
                else
                {
                    NSLog(@"No target image found in the analysed camera frame.\nKeep Calm \n\t&\nKeep Looking");
                }
            }
            else
            {
                NSLog(@"Cloud recognition recognition failed. Reason: %@", [error localizedDescription]);
            }
        }];
    }
}

クラウド認識サービスが初期化を完了した場合には、認識されたコールのみが行われます。サーバー通信が成功した場合、ブロック内の最初のパラメータは、サーバーの結果を表すWTCloudRecognitionServiceResponse型の有効なオブジェクトです。このオブジェクトには、画像ターゲットが見つかったかどうかとその名前、および指定されている場合は関連するメタデータが含まれます。エラーの場合、2番目のパラメータには、通信が失敗した理由に関する詳細情報を含む有効なNSErrorオブジェクトが含まれます。
単純な画像トラッキングとクラウド認識のトラッキングの両方がWTImageTrackerDelegateプロトコルを使用するので、認識されたターゲットの周りに拡張を描画するためのすべてのトラッキングに関連するメソッドも利用可能です。

連続認識モード

随時認識モードは特定のケースに便利ですが、おそらく連続認識モードの方がよく使用されると思われます。連続認識モードでは、CloudTrackerの認識メソッドを呼び出す間隔を設定します。
連続認識モードを開始するには、CloudTrackerのロードが完了した後に-startContinuousRecognitionWithInterval:interruptionHandler:responseHandler:メソッドを呼び出します。

if ( self.cloudRecognitionService && self.cloudRecognitionService.initialized )
{
    __weak typeof(self) weakSelf = self;
    [self.cloudRecognitionService startContinuousRecognitionWithInterval:1.5 interruptionHandler:nil responseHandler:^(WTCloudRecognitionServiceResponse *response, NSError * error) {
        if (response)
        {
            NSLog(@"received continuous response...");
            if ( response.recognized ) {
                NSLog(@"target recognized...");
                dispatch_async(dispatch_get_main_queue(), ^{
                    [weakSelf.cloudRecognitionService stopContinuousRecognition];
                    [weakSelf.continuousRecognitionButton setTitle:@"Start Continuous Recognition" forState:UIControlStateNormal];
                });
            }
            else
            {
                NSLog(@"target NOT recognized...");
            }
        }
        else
        {
            NSLog(@"Cloud Recognition Service error %ld occurred. %@", (long)error.code, [error localizedDescription]);
        }
    }];
    [self.continuousRecognitionButton setTitle:@"Stop Continuous Recognition" forState:UIControlStateNormal];
}
else
{
    NSLog(@"Cloud Recognition Service is not ready yet.");
}

随時認識モードの場合と同様に、このメソッドはUIButtonにタッチしたときに呼び出されます。
最初のパラメータでは、新しいカメラフレームをサーバーに送信する間隔を指定します。2番目のパラメータは、認識されたターゲットに関する情報を含むレスポンスハンドラであり、随時認識の場合と同じように動作します。
連続認識のセッションを停止するには、たとえばターゲットを見つけたらstopContinuousRecognitionメソッドを呼び出します。