asken テックブログ

askenエンジニアが日々どんなことに取り組み、どんな「学び」を得ているか、よもやま話も織り交ぜつつ綴っていきます。 皆さまにも一緒に学びを楽しんでいただけたら幸いです! <br> 食事管理アプリ『あすけん』 について <br> https://www.asken.jp/ <br>

バーコードスキャンの精度を劇的に改善!ML Kitへの移行で得られた知見と意思決定の裏側

はじめに

こんにちは。Androidエンジニアの佐藤です。

今回は、アプリのバーコードスキャン機能の精度改善を行なった時のお話をいたします。

ユーザー体験の向上を目指して古いライブラリからGoogleのML Kitへ移行したのですが、その過程では技術選定のトレードオフや、思わぬ「速さの弊害」など、多くの学びがありました。

この記事が、同じような課題に直面している開発者の皆さんにとって、少しでも参考になれば嬉しいです。

すべての始まりは「読み取りにくい」というユーザーの声

私たちのアプリには、商品のバーコードを読み取って食事を記録する機能があります。

しかし、ユーザーの皆様から「バーコードがなかなか読み取れない」「フォーカスが合わなくて時間がかかる」といったフィードバックが寄せられていました。

調査してみると、原因は明らかでした。

私たちが使っていたバーコードスキャンライブラリは、もう4年ほどアップデートされていません。

これでは、最新のデバイスやOSで最適なパフォーマンスを発揮できないと考えました。

ユーザーに快適な体験を届けるため、Androidチームで協議し、ライブラリの移行を決意しました。

【課題の可視化:旧ライブラリの実際の動き】

動画を見ていたくとわかる通り、ピントが合うまでに時間がかかり、ユーザーを待たせてしまっている状態でした。

(すみません、、この動画では最後までスキャンすることができませんでした。)

解決策の検討:Googleの「ML Kit」

新しいライブラリとして、私たちはGoogleが公式に提供している ML Kit に注目しました。

ML Kitは、機械学習の専門知識がなくても、強力な機能をアプリに組み込めるライブラリです。

バーコードスキャンにおいても、高速かつ高精度な読み取りが期待できます。

このML Kitを導入するには、大きく分けて2つの方法がありました。

パターン1:お手軽実装! play-services-code-scanner

これは、ML Kitの機能を内包し、Google Play Service上で動作するAPIです。

developers.google.com

  • メリット
    • Googleが動作を保証してくれる安心感
    • 数行のコードで実装できる手軽さ
  • デメリット
    • UIのカスタマイズが一切できない
    • 連続スキャンができないため、一度スキャンするたびに画面が閉じてしまう

UIのカスタマイズができないのは大きな問題でした。既存の操作性は「カメラをかざし続けると連続でスキャンできる」というもの。しかし、この方法ではスキャン成功のたびに画面が中断されてしまい、ユーザー体験が大きく変わってしまいます。

play-services-code-scanner の動作イメージ(Google公式サイトより)】

出典:https://developers.google.com/ml-kit/images/auto_zoom.gif

https://developers.google.com/ml-kit/images/auto_zoom.gif

実装は簡単ですが、UXの観点からは受け入れがたい選択肢でした。

パターン2:自由度MAX! CameraX + mlkit:ScanCode API

developers.google.com

こちらは、カメラのプレビュー表示を CameraX で自前で実装し、その映像を直接ML KitのAPIに連携させる方法です。

  • メリット
    • 画面UIを自由にカスタマイズできる
    • 連続スキャンなど、既存の操作性を完全に再現可能
  • デメリット
    • カメラの描画やML Kitとの連携など、コードが複雑になる
    • 自前でライブラリのメンテナンス(バージョンアップ追従など)が必要になる

意思決定:最高のユーザー体験のために

2つのパターンを比較し、私たちのチームが出した結論はパターン2(CameraX + ML Kit)の採用でした。

実装の複雑さというデメリットはありましたが、「最高のユーザー体験を提供する」という目的を達成するためには、UI/UXの自由度が不可欠だと判断したからです。

万が一に備えて、新機能をRemoteConfigでON/OFFを切り替えられるようにし、問題が発生した際にはすぐに旧バージョンに戻せる保険もかけました。

(後にこの修正によるクラッシュを検出し、保険を活かすことになりました。。)

【そして、これが完成形!】

この圧倒的な速さ!

旧バージョンとは比べ物にならないほど、スムーズにバーコードを検出できています。

速すぎるがゆえの新たな課題

しかし、ここで予期せぬ問題が浮上します。

それは、「読み取りが速すぎて、誤検出することも多い」というものでした。

カメラをかざした瞬間にバーコードを検出してくれますが、手ブレしていたりすると、誤検出が多くなりました。

私たちは、この課題に対して、読み取りデータのフィルタリング処理を自前で行うようにしました。

具体的には、取得したデータがN回一致したら、正確なデータとして扱うようにしています。

これで、誤検出を極力減らすことに成功しました!

まとめ

今回のプロジェクトを通じて、私たちは古い技術的負債を解消し、ユーザー体験を劇的に向上させることができました。

  • 課題: 古いライブラリによってバーコードスキャン精度が低い
  • 解決策: CameraXML Kit を用いたスキャン機能の再実装
  • 学び:
    • ライブラリの定期的なアップデート、メンテナンスは重要
    • パフォーマンスの劇的な向上は、時として予期せぬ課題を生むことがある
      • チーム一丸となってアイディアをだし、改善していくことが大切

技術選定の道のりは単純ではありませんが、目的を見失わずにチームで議論を重ねることで、最良の答えにたどり着けると改めて感じました。

最後まで読んでいただき、ありがとうございました!

採用について

askenでは、ユーザー体験の改善を技術的な側面から考えられる/していきたいエンジニアを絶賛募集中です。

まずはカジュアルにお話しできればと思いますので、ぜひお気軽にご連絡ください!

https://hrmos.co/pages/asken/jobs

asken techのXアカウントで、askenのテックブログやイベント情報など、エンジニアリングに関する最新情報を発信していますので、ぜひフォローをお願いします!