HMS ML KitのOCR（テキスト認識）機能の実装入門

テキスト認識とは文字画像（イメージ型）を文字列（String型）に変換する技術です。
たとえば、次の写真があるとします。

![IMG_20210903_153231.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704548/6161cac4-1b94-23be-dc90-42091072b5d3.jpeg)

上記の写真をテキスト認識で変換すると、次の結果が得られます。

![Screenshot_20210903_154009_com.sample.hmssample.ml.textrecognitiondemo.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704548/a6b5c7dc-e116-b202-604e-7c900714489b.jpeg)

# AndroidアプリにHMSのテキスト認識を導入する方法

## AppGallery Connectの作業
1. AppGallery Connectに入って、[My projects]を選びます。
2. リストから対象アプリに切り替えます。
3. [Project settings] -> [Manage APIs]に入って、ML Kitを有効にします。（デフォルトではすでに有効になっているはずです）

こちらもご参照ください。

https://developer.huawei.com/consumer/en/doc/development/hiai-Guides/config-agc-0000001050990353

https://developer.huawei.com/consumer/en/doc/development/hiai-Guides/enable-service-0000001050038078

## HMS SDKの導入
1. agconnect-services.jsonをプロジェクト内に配置します。
2. プロジェクトのbuild.gradleにSDKを追加します。
3. モジュールのbuild.gradleにSDKを追加します。

テキスト認識のライブラリはこちらです。

```gradle:build.gradle
implementation 'com.huawei.hms:ml-computer-vision-ocr:2.0.5.301'
implementation 'com.huawei.hms:ml-computer-vision-ocr-latin-model:2.0.5.301'
implementation 'com.huawei.hms:ml-computer-vision-ocr-jk-model:2.0.5.301'
implementation 'com.huawei.hms:ml-computer-vision-ocr-cn-model:2.0.5.301'
```

こちらもご参照ください。

https://developer.huawei.com/consumer/jp/doc/development/hiai-Guides/text-sdk-0000001050040033

## AndroidManifest.xml
HMS ML Kitのテキスト認識の定義をAndroidManifest.xmlに追加します。

```xml:AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="xxx">
    ...
    <meta-data
        android:name="com.huawei.hms.ml.DEPENDENCY"
        android:value= "ocr"/>
    ...
</manifest>
```

## テキスト認識の流れ
１．MLTextAnalyzerを生成します。

```kotlin
val textAnalyzer = MLTextAnalyzer.Factory(context)
    .setLocalOCRMode(MLLocalTextSetting.OCR_DETECT_MODE)
    .setLanguage("ja")
    .create()
}
```

<b>動画の場合</b>
２－１．setTransactor()でMLTextAnalyzerに認識結果のコールバックを設定します。

```kotlin
textAnalyzer?.setTransactor((object : MLAnalyzer.MLTransactor<MLText.Block> {
        override fun transactResult(results: MLAnalyzer.Result<MLText.Block>?) {
            binding.overlayView.setResults(results)
        }

        override fun destroy() {
        }
    }))
```

２－２．カメラを設定します。

```kotlin
val lensEngine = LensEngine.Creator(applicationContext, textAnalyzer)
         .setLensType(LensEngine.BACK_LENS)
         .applyDisplayDimension(1440, 1080)
         .applyFps(30.0f)
         .enableAutomaticFocus(true)
         .create()

try {
    lensEngine.run({SurfaceViewのオブジェクト}.holder)
} catch (e: IOException) {
}
```


<b>静止画の場合</b>
２－１．静止画をMLTextAnalyzerに渡し、認識結果をコールバックで受け取ります。

```kotlin
val frame = MLFrame.fromBitmap(bitmap)

val task = textAnalyzer.asyncAnalyseFrame(frame)
task.addOnSuccessListener {
}.addOnFailureListener {
}
```

３．リソースを解放します。

```kotlin
textAnalyzer?.let {
    try {
        it.stop()
    } catch (ioException: IOException) {
        ioException.printStackTrace()
    }
    textAnalyzer = null
}
lensEngine?.let {
    it.release()
    lensEngine = null
}

```

## テキスト認識結果オブジェクトについて
認識結果はMLAnalyzer.Result<MLText.Block>型のanalyseListにあります。

```kotlin
val mlList: SparseArray<MLText.Block> = {MLAnalyzer.Result<MLText.Block>のオブジェクト}.analyseList

mlList.forEach { key, value ->
    value.contents.forEach { content ->
        // content.border : 判断対象の範囲
        // content.stringValue : 判断したテキスト
        // content.possibility : 判断の正確さ
        // content.languageList : 判断した言語
    }
}
```


実装は以上になります。


# GitHub
https://github.com/Rei2020GitHub/MyPublicProject/tree/master/ml/TextRecognitionDemo

# 参考
* HMS：[https://developer.huawei.com/consumer/jp/](https://developer.huawei.com/consumer/jp/)
* HMS ML Kitの紹介：[https://developer.huawei.com/consumer/jp/hms/huawei-mlkit](https://developer.huawei.com/consumer/jp/hms/huawei-mlkit)
* HMS ML Kitのドキュメント：[https://developer.huawei.com/consumer/jp/doc/development/HMSCore-Guides/service-introduction-0000001050040017](https://developer.huawei.com/consumer/jp/doc/development/HMSCore-Guides/service-introduction-0000001050040017)
* HMS ML Kitのテキスト認識の概要：[https://developer.huawei.com/consumer/jp/doc/development/hiai-Guides/text-recognition-0000001050040053](https://developer.huawei.com/consumer/jp/doc/development/hiai-Guides/text-recognition-0000001050040053)
* Huawei Developers：[https://forums.developer.huawei.com/forumPortal/en/home](https://forums.developer.huawei.com/forumPortal/en/home)
* Facebook Huawei Developersグループ：[https://www.facebook.com/Huaweidevs/](https://www.facebook.com/Huaweidevs/)