ML KitのBarcode Scanning機能を試してみた

トリスタinsideに投稿された記事の再掲載です。

f:id:bookwalker_developers:20210930194258p:plain アプリチームのKです。Android版ニコニコ漫画 / 読書メーターの開発を担当しています。 日々アプリの価値向上を目的に様々な機能追加・改善を行っています。読書メーターの機能の1つにバーコードスキャンがあります。読書メーターでは既にZXing & ZBarをベースにしたlibを使ってバーコードスキャンを実現していますが、当該Libは既に長期間メンテナンスされていない状態で、オーナーの方も代替Libへの移行を提案されています。提案されていたLibの1つであるML Kit Barcode Scanningが代替となり得るのかを検証しましたのでその結果を紹介していきます。

環境

検証環境は次の通りです。

target version
Android Studio 4.1.2
kotlin 1.4.31
com.google.mlkit:barcode-scanning 16.1.1

モデルの種類

MLKit Barcode Scanningを利用するにあたっては、最初にバーコードスキャン(画像解析処理)で必要となるモデルの種類を選択する必要があります。Unbundled・bundledの2種類があり、それぞれメリットデメリットが存在します。興味がある方は公式ドキュメントを参照ください。今回の検証ではbundled版を使用しました。Unbundled版では結果が異なるかもしれませんのでその点ご留意ください。

アプリサイズ

公式ドキュメントには次のように記載されています。

App size: About 2.2 MB model size.

モデルサイズが記載されていますが、恐らくそのサイズ分アプリサイズが大きくなることを意味していると思われます。実際にアプリのサイズを確認してみました。ここでは読書メーターアプリのサイズを比較しています。

apk(debug build版)サイズを比較

|通常|バンドル版| |:--|:--| |12,033,355|13,813,315| 単位はバイト

1.8MB程度の差という概ね記載通りの違いがありました。

対応フォーマット

現バージョンの読書メーターアプリはEAN-131のみ対応しています。MLKit版では次のフォーマットをサポートしています。

  • Code 128 (FORMAT_CODE_128)
  • Code 39 (FORMAT_CODE_39)
  • Code 93 (FORMAT_CODE_93)
  • Codabar (FORMAT_CODABAR)
  • EAN-13 (FORMAT_EAN_13)
  • EAN-8 (FORMAT_EAN_8)
  • ITF (FORMAT_ITF)
  • UPC-A (FORMAT_UPC_A)
  • UPC-E (FORMAT_UPC_E)
  • QR Code (FORMAT_QR_CODE)
  • PDF417 (FORMAT_PDF417)
  • Aztec (FORMAT_AZTEC)
  • Data Matrix (FORMAT_DATA_MATRIX)

EAN-13をサポートしているのでフォーマット上の問題はないことがわかりました。以降はEAN-13を読み込み対象とした結果となります。その為、検出フォーマットによっては結果が異なるかもしれません。なお自動的にフォーマットを検出することも可能ですが、その場合はスキャン速度に影響があると記載されていますので不要なコードはサポートしないようにした方が良さそうです。

実装

ドキュメント通りに実装すれば問題いなく動作すると思います。実装上の注意点があるので、実装前に一読しておくと良いかもしれません。

スキャン(動作比較)

次のテーブルは読書メーターアプリの現行版とMLKit版のスキャン機能を比較した結果となります。

- 現行版 MLKit版
同時検知可能数 1 実装次第
方向 縦のみ 方向に関係なくスキャン可能

次の動画をご覧ください。実際にMLKit Barcode Scanningを使いバーコードを検知しているシーンとなります。

f:id:bookwalker_developers:20210930194701g:plain

終わりに

今回検証した限りにおいては特にMLKit版を利用することに問題はなさそうでした。本格的な移行を視野に今後も評価し続けたいと思います。


  1. EANコードは、商品識別コードおよびバーコード規格のひとつ。日本の規格は「JANコード」と呼ばれる。