ポリリズムの提案可能技術紹介2 - CoreML+AR+LiDARを用いたiOSアプリケーション
ポリリズムのR&D部門のNです。提案可能技術紹介の第二回目は、第一回目で紹介したYOLOの物体検出技術にARとLiDARを組み合わせて応用したアプリケーションについて紹介します。アプリケーションの紹介やデモに入る前に、まずはLiDARの周辺について軽く紹介できればと思います。CoreMLとYOLOに関しては以前投稿した弊社研究開発ブログで紹介しています。
LiDARについて
LiDARは「Light Detection and Ranging」の頭文字を取ったもので「ライダー」と読みます。数メートル先に赤外線を照射し、反射して戻るまでの時間から距離や対象物の性質を分析する光センサー技術のことをいいます。特に近年では、自動運転を実現するための技術としてとても注目されています。(障害物の形状や車間距離などを把握するために必要不可欠な技術のようです)iPhoneでは、iPhone 12からLiDARセンサーが搭載され、ARKit経由で3Dメッシュや深度にアクセスできます。これにより、従来のARKitでは難しかった、物体までの距離や位置、形状を(それなりに)検出できるようになりました。
LiDARを用いたモバイルアプリケーション
AppStoreを覗いてみると、LiDARを用いたアプリとして、家具配置アプリや計測アプリ、空間のスキャンアプリなどが配布されています。これらはいずれも空間にあるものの形状を取得し、対象との距離を測るという部分にLiDARを用いています。
深層学習+LiDAR
LiDARはあくまでセンサーなので、取得した点群(ポイントクラウド)だけでは対象が車なのか人なのか、はたまた他のものなのかといったことまでは判定できません。そこで用いられるひとつのソリューションが深層学習です。参考文献[1]のPointNetでは(簡単に言うと)点群そのものをニューラルネットワークに学習させることで、CNNで行う画像認識のように3Dの物体を認識させる提案となっています。PointNetはイメージ画像のように、点群を元にクラス分類(Classification)や分割(Segmentation)などが可能です。
PointNet [1]のイメージ
しかし、PointNetは例えば車載システムにおける物体検出のタスクなどにあまり向かないことが挙げられています。そこで、二次元の物体検出とPointNetsを組み合わせて物体検出タスクの精度を向上させる手法として参考文献[2]のFrustum PointNetsが提案されています。Frustum PointNetsでは、2DベースR-CNNで物体のある方向を円錐で絞り込んでから、円錐内の点群に対してPointNetにかけることで3D物体検出を行うという内容になっています。また、屋内と屋外の双方に対応している点も強みと論文中で語られています。
Frustum PointNets [2] のイメージ
その他にも深層学習とLiDARを用いた物体検出技術は多くの提案がありますので、気になる方は論文等を探してみてください。
CoreML(YOLO)+LiDARを用いた3D物体検出の提案
今回紹介したPointNetやFrustum PointNetsをCoreMLに移植することでiOSでも同様に3Dの物体検出を行えるであろうと予想できます。しかし、実装コストや未知の点群のデータセットを用意するというタスクがなかなかに重く、簡単に試してみようというには敷居が高いように思えます。そこでポリリズムではより簡単に深層学習とLiDARセンサーを用いた物体検出が行えないかということで、YOLOとLiDARを組み合わせた物体検出が可能であるかを検証してみました。提案手法としては次のようなイメージです。
1. YOLO(CNN)で物体を検出し2Dバウンディングボックスを得る
2. LiDARを用いて2Dバウンディングボックス内のポイントクラウドを取得する
3. ポイントクラウドから物体の奥行きを推定し、3Dバウンディングボックスを作成する(PointNetを用いない)
Frustum PointNetsに近い検出フローとなっていますが、相違点としては、2D-CNN部にYOLOを用いており、PointNetによる点群の分類部分が独自の奥行き推定アルゴリズムに変わっているという点です。奥行き推定アルゴリズムの内容としてはkmeansや線形代数(Surgeを利用)を用いたプリミティブな実装で特に確率的に推論しているとものではなく、もう少し単純なものとなっています。この提案手法のPros & Consとしては次のようになります。
Pros
・必要なデータセットはYOLOのタスクに必要な画像データとラベルおよび 矩形情報のみ(PointNetを用いないため、点群データの準備が不要)
・用意するディープラーニングモデルはYOLOのみ
・動作が軽快で高速
Cons
・PointNetを用いないため検出精度が落ちる(物体の重なりなどに弱い)
今回は生活必需品が何個あるかをカウントするためのアプリケーションを作成して、この提案手法の実用性を検証してみました。
iPhone実機でのデモ
作成したアプリケーションをiPhone実機で動作させるデモを以下で紹介します。対象となる生活必需品は次の4クラスです。
1. ティッシュ箱
2. トイレットペーパー
3. アルコールスプレー
4. 歯磨き粉
これらは予めYOLOで学習を行い、CoreMLモデル化しています。
デモ1(単体検出)
アルコールスプレーを立体検出する様子です。YOLOの検出結果である2Dのバウンディングボックスが出現し、その後LiDARでバウンディングボックス内の点群を取得し、その情報を元に3Dのバウンディングボックスを形成しています。(ただし、バウンディングボックス内のすべての点群をスキャンしてしまうため、奥行きを取りすぎてしまう問題があります。この問題に対し、先に挙げた独自の奥行き推定アルゴリズムを適用し、余分な点群を間引くようにしています)その他に、この検出手法の優れた点は、360度商品をスキャンする必要がなく正面から素早く奥行きを推定できる点です。また、「Show Results」ボタンを押すことでこれまでに検出した物体のクラスと個数が見えるようになっています。
デモ2(複数同時検出)
次のデモは、歯磨き粉とアルコールスプレーを同時検出する様子です。ほとんど同時タイミングで高速に検出が出来ています。
デモ3(4クラスの検出)
最後にティッシュ箱、トイレットーペーパー、歯磨き粉とアルコールスプレーを全て検出する様子です。奥行きの推定が完全とは言えませんが、それなりに全ての物体を3D検出できています。
最後に
いかがでしたでしょうか。今回提案した手法によって、PointNetを使わずともそれなりの精度で高速に物体の3D検出が行えそうだということが分かりました。ただし、基本的には屋内での利用を想定しており、また厳密に物体の境界を判定できるものでもありません。
今回のテーマを用いた技術開発に興味がある企業様はoffice@porhy.com までお問い合わせください。その他の画像認識や機械学習システムに関するお問い合わせも受け付けております。
参考文献
[1] PointNet
[2] Frustum PointNets for 3D Object Detection from RGB-D Data