研究開発部Architectグループの堤と申します。新任マネージャーとして自身のキャッチアップも兼ねて、研究開発部の技術や成果物について紹介する記事を書いています。
第二弾となる今回は、「スマキャプ」と社内で呼んでいる技術について紹介します。スマキャプではスマホ上で機械学習モデルの推論処理をオンデバイスで行っているのですが、筆者がもともとiOSエンジニアだったこともあり、本記事ではそちらについて厚めに解説しようと思います。
OCR結果を即時に返すSmart Captured(スマキャプ)
営業DXサービス「Sansan」やキャリアプロフィール「Eight」を縁の下で支える社内システムのひとつが、「GEES」と呼ばれる名刺のデータ化システムです。GEESは、セキュアに、高精度に、低コストに名刺をデータ化するためのシステムです。
GEESのデータ化は人手を介したフローもあるため、非常に高精度である代わりに、読み取り直後にデータ化できるというわけではありません。
そこで、即時に名刺のOCR結果を返すサービスとして開発したのが「Smart Captured」略して「スマキャプ」です。アプリから直接OCRサーバを叩いて結果を即時に返すため、ユーザーはすぐに名刺の認識結果を確認することができます。 1
GEESのデータ化が終わったら差分更新することで、速度と精度を両立します。
スマキャプのフロー
スマキャプの処理の流れとしては、モバイル上で名刺の検出・切り取りを行い、名刺画像をサーバーに転送してOCR結果を受け取ります。
スマキャプはSansan, Eight両サービスのiOS・Androidアプリ両方に実装されています。
オンデバイスでのリアルタイム名刺認識
前述の通りスマキャプでは「モバイル上で名刺の検出・切り取りを行う」のですが、これはすなわち以下の推論処理をオンデバイスで行っていることを意味します。
- 名刺検出(名刺の矩形を検出)
- 名刺切り出し(セグメンテーション)
それぞれのモデルはTensorFlowで学習し、前処理・推論処理・後処理をC++で実装したものをiOS, Androidそれぞれに組み込んでいます。
Core ML化によるパフォーマンス向上
さらにiOSでは、モデルをCore MLに変換することで、矩形検出のパフォーマンスを300%高速化しています。
上のGIFアニメーションではUIの「Old」「New」で
- Old: TensorFlowのモデルをそのまま組み込んだもの
- New: Core ML化したモデルを組み込んだもの
を切り替えており、Core ML化により明らかにリアルタイム検出の追従性が向上していることがわかります。
なぜ大幅に高速化するかというと、従来の .pb
モデルではすべてCPUで処理されていたものが、Core ML化によりGPU(Metal), Neural Engineでも処理されるようになるためです。
さらに、機械学習モデルの推論処理のためのCPU負荷が下がることで、UIの描画やユーザーインタラクションのレスポンスも改善されます。下図は、Old, Newのモデル切り替え検証時のCPU使用率を可視化したものになります。
山が旧モデル(TensorFlowから出力したモデルそのまま)使用時、谷が新モデル(Core ML)使用時です。CPU負荷についても顕著な違いがあることがわかります。
物体検出(矩形検出)モデルだけでなく、セグメンテーションモデルもCore ML化しており、推論自体は1枚あたり0.01〜0.02sで処理できるようになっています2。
Core ML化の具体的な手順や勘所についてはまた別記事で詳しく書きたいと思います。
(2022.12.13追記)Core ML化の具体的な手順や勘所について、以下の記事に詳細を書きました。
まとめ
Sansanの名刺データ化システムにおいてOCR結果を即座にユーザーに返す体験を担う「スマキャプ」という技術について紹介しました。
なお、私自身は研究開発部のArchitectグループという、研究開発成果をプロダクトとして外に出していくための諸々を担当しているエンジニアチームのマネージャーをやっています。多くのR&D成果に関わることができ、MLOps/DevOpsやデータ基盤構築など、エンジニアリングとしても非常におもしろいことを経験できるチームかと思います。気になる方はぜひ以下からご応募ください。
求人内容も更新したのでぜひご検討いただけますと幸いです。
弊チームの求人が588万〜1208万だったのを、800万〜1500万に更新してもらいました。
— Shuichi Tsutsumi (@shu223) 2022年7月4日
R&D MLOps/DevOpsエンジニア | Sansan株式会社 https://t.co/zqkcIb1y8g