AWS Amplify iOSでCoreMLフレームワークと統合された画像のテキスト解析を試してみた #reinvent

ネイティブアプリ用の新しいSDK「Amplify iOS」と「Amplify Android」がプレビューにて公開されました。iOSではPrediction(予測機能)についてCoreMLフレームワークとの組み合わせが実装されています。本記事では、Amplify iOSを使って画像のテキスト解析を試してみました。
2019.12.25

Amplify iOSではCoreMLフレームワークをサポート!

re:Invent 2019の期間中、ネイティブアプリ用の新しいSDKAmplify iOSAmplify Androidがプレビューにて公開されました。

【速報】モバイル向けの新しいSDK「Amplify iOS & Amplify Android」が公開されました! #reinvent

その中で、iOSでは Prediction(予測機能) について CoreMLフレームワークとの組み合わせ が実装されています。ML/AI系の機能を、AWSサービスとiOS Frameworkを組み合わせ、非常に高い精度の結果セットが得られるようになっています。

CoreMLフレームワークおよびCoreML VisionフレームワークはiOSの機械学習用のフレームワークで、学習モデルなどを扱う際に開発者が専門的な知識を必要とせずに扱えるように補助するフレームワークです。CPU、GPU、ニューラルエンジンを活用し、予測の作成、モデルのトレーニングや微調整をすべてユーザーのデバイス上で行うようになっています。

特にユーザーに合わせた画像認識機能などを実装する際に役立ちそうな機能アップデートです。オンラインでもオフラインでも精度の高い予測処理を、ワンコードで実装できるところがかなりメリットがありますね。

ということで本記事では、Amplify iOSを使って画像のテキスト解析を試してみました。

Amplify iOSでできること

以下はオンライン/オフラインのどちらでも使うことができるようになりました。

  • 画像テキスト解析
  • エンティティの認識
  • 実世界のオブジェクトへのラベル付け
  • テキストの解釈

以下はオンラインのみ対応しています。

  • ある言語から別の言語へのテキストの翻訳
  • テキストから音声への変換
  • 自動トレーニング用の画像のアップロード
  • 文字起こし

インストール

それではまずはインストールしていきます。なお、AmplifyのiOSアプリ向けプロジェクトはすでに作成済みの前提で進めます。また、今回は対話形式でのインストールが必要なためAmplify CLIを利用します。

まずは predictions というプラグインを追加します。

$ amplify add predictions

対話形式で、どのような機能を作りたいか問われます。

? Please select from one of the categories below : Identify
? What would you like to identify? : Identify Text
? Provide a friendly name for your resource : identifyTexte454f02b
? Would you also like to identify documents? : Yes
? Who should have access? : Auth and Guest users

以下のように分類されているので、自分の作りたい機能に合わせて設定します。本記事では Identify Text を選択しています。

また、最後の Who should have access?Auth and Guest users を選び、Cognito User Poolsの作成を行うようにします。これはAWSリソースへのアクセスを行うため必須になります。

Successfully added resource identifyTexte454f02b locally

ローカルでの設定が完了したので amplify push でAWSリソースを作成します。

$ amplify push

| Category    | Resource name         | Operation | Provider plugin   |
| ----------- | --------------------- | --------- | ----------------- |
| Predictions | identifyTexte454f02b  | Create    | awscloudformation |
| Api         | amplifyDatasource     | No Change | awscloudformation |
| Auth        | amplifysample93d65ae8 | No Change | awscloudformation |

以上でAWSリソースの作成は完了です。

次に AWSPredictionsPlugin というPodを追加します。Podfile 全体としては以下のようになります。

target 'AmplifySample' do
  # Comment the next line if you don't want to use dynamic frameworks
  use_frameworks!

  # Pods for AmplifySample
  pod 'amplify-tools'
  pod 'Amplify'
  pod 'AWSPluginsCore'
  pod 'AWSPredictionsPlugin'
  pod 'AWSMobileClient', '~> 2.12.0'
  pod 'AmplifyPlugins/AWSAPIPlugin'
end

最後に pod install を実行して終わりです。

$ pod install --repo-update

実装

今回は画像のテキスト解析を行いたいだけなので、iOSアプリでは画面なしで実装します。

まずは AppDelegate でセットアップする処理を書きます。

AppDelegate.swift

import UIKit
import Amplify
import AWSPredictionsPlugin
import AmplifyPlugins

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        let apiPlugin = AWSAPIPlugin(modelRegistration: AmplifyModels())
        let predictionsPlugin = AWSPredictionsPlugin()
        do {
            try Amplify.add(plugin: apiPlugin)
            try Amplify.add(plugin: predictionsPlugin)
            try Amplify.configure()
            print("Amplify initialized")
        } catch {
            print("Failed to configure Amplify \(error)")
        }
        return true
    }

}

次に ViewController で画像のテキスト解析を行う処理を実装します。雑ですが viewDidLoad() に実装します。

ViewController.swift

import UIKit
import Amplify

class ViewController: UIViewController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        predict()
    }
    
    func predict() {
        guard let path = Bundle.main.path(forResource: "sample-image-christmas", ofType: "jpg") else { return }
        let image = URL(fileURLWithPath: path)
        let options = PredictionsIdentifyRequest.Options(defaultNetworkPolicy: .offline, uploadToRemote: false)
        _ = Amplify.Predictions.identify(type: .detectText(.plain), image: image, options: options, listener: { (event) in
            switch event {
            case .completed(let result):
                let data = result as! IdentifyTextResult
                if let lines = data.rawLineText {
                    for line in lines {
                        print(line)
                    }
                }
            case .failed(let error):
                print(error)
            default:
                print("")
            }
        })
    }

}

対象の画像は URL で指定します。ローカルまたはWeb上の画像から指定します。

上記は sample-image-christmas.jpg という画像ファイルをXcodeプロジェクト内に追加した場合のコードです。オフラインでの動作を試したい場合はXcodeプロジェクトに追加するようにしてください。

試してみる

以下の画像を用意しました。素敵な写真はPexelsのYlanite Koppensさんからいただきました。御礼申し上げます。

実行するとコンソールに以下のような結果が表示されます。正しく解析できていますね!

なお、オフラインで実行した場合も同様の結果が得られます。ぜひ、実際に試してみてください。

iOSのフレームワークと統合されたAmplify

CoreML Vision FrameworkとAWSのML/AI系サービスの統合によって、かなりパワフルに働くようになりました。

モバイルアプリの場合は常に安定した通信環境が得られるとは限りませんので、本記事でご紹介したような機能を使うアプリの場合は非常に有効な手段だと思います。

Predictionsに含まれる機能は他にもあるので、試していきたいと思います。