【受付時間】 10:00〜18:00(土日祝日を除く)

前回は、SynSense社のAIチップ付きイベントカメラSpeck™を紹介し、学習済みのジェスチャー認識モデルをチップに載せて動かしました。「目(イベントカメラ)」と「脳(スパイキングCNN)」が1チップに載っていること、そして認識がカメラの中で完結することを確認しました。
今回は、イベントカメラを用いたRetinaというAI研究の成果を用いて、Speck™で視線・瞳孔の追跡を行ってみたいと思います。

1. イベントカメラのAI研究について

イベントカメラの出力は「変化した画素だけが点在する」疎(スパース)なデータで、普通のカメラの画像とはまるで形が違います。この違いのため、イベントカメラでAIを動かすには、普通の画像AIとは別の以下のような難しさが存在しています。

  • 学習データがない。画像の世界にはImageNetのような巨大なデータセットがありますが、イベントデータにはそれに相当するものがほとんどありません。しかもイベントは時間方向に意味があり、正解ラベル(たとえば瞳孔の座標)を1コマずつ付ける必要があるため、集めるのも作るのも重い作業です。
  • 普通のAIが、イベントを苦手にしている。画像でよく用いられるCNNは「全画素が値で埋まった1枚のフレーム」を前提にします。イベントを扱うためのスパイキングCNN(SNN)では発火が微分できないなど学習が難しく、専用の工夫が要ります。

今回取り上げるRetinaという研究はこれらをクリアし、瞳孔追跡を行うことができるAIを作ったという研究になります。

2. Retinaはどんな研究か?

RetinaはiniVation・SynSenseの共同研究先であるチューリッヒ工科大学の研究です。
https://arxiv.org/abs/2312.00425
どのような研究か一言で言うと、Speckを使って極めて低い消費電力で瞳孔(目の位置)を追跡するというものです。
カメラやセンサを用いた瞳孔の追跡はこれまでも多くの研究で行われており、瞳孔の動きによる精神状態の予測やスポーツや技能熟練者の視線分析などに用いられています。
Retinaでは下図のような眼鏡のフレームにイベントカメラを設置し、瞳孔の追跡を行いました。

Retinaで使用されているデバイス(論文の図より抜粋)

Retinaの主な研究成果をまとめると以下になります。

  • 学習用データとして30人以上の被験者からイベントカメラで取得した目の動きのデータを用意
  • Speckで動かすことができるように比較的小さいAIモデルでありながら、精度の高いモデルを構築した

そして何より、このデータとそれを用いて学習した学習済みモデルが誰でも使える形で公開されています。つまり私たちは、自分で一からデータを集めて学習させなくても、この成果をSpeckの実機で試すことができます。以降でその手順を追っていきます。

3. Retinaの成果物をSpeck™で動かすには?

Retinaは学習させたAIモデルを公開しています。これをダウンロードしてSpeckに書き込めば動かすことができるのですが、ここでは入力と出力について若干注意が必要な部分について述べておきます。

カメラの写し方について

Retinaはある決まった目の撮り方の映像で学習しています。眼鏡にカメラを固定し、目のすぐ近くから撮った、目が画面いっぱいに写る映像です。なので、このAIモデルにイベントカメラのデータを与えるときはなるべく目のすぐ近くから撮ったデータを使うようにします。

AIから出てくる出力について

前回のジェスチャー認識では、Speckは「11種類のうちどれか」という分類の答えをそのまま出してくれました。一方で今回の視線追跡が出すは「目がどこにあるか」という位置(座標)です。Speckの標準の出力は分類用なので、これはそのままでは受け取れません。
そこで、AIの最終段が出す信号をPC側で読み取り、瞳孔の位置に翻訳するという処理を加えます。

4. RetinaをSpeck™で動かしてみる

3章での注意点を踏まえ、RetinaをSpeckで動かすためのコードを以下に公開しています。
https://github.com/nanoxeed/retina-speck
このプロジェクトの構成を見ると以下のようになっています。

devディレクトリは開発用のコードが入ったディレクトリなので一旦無視して、modelディレクトリを見るとsaved_model_step_791.ptというファイルがあります。
これがRetinaの研究で学習されたAIのモデルパラメータが保存されたファイルになります。
次に、pupil_tracking.pyがこのプロジェクトのメインと言えるコードで、上記のAIモデルをSpeckに送信し、瞳孔の追跡を行うコードになります。
動かし方は前回の記事と同様、uvとpythonを用いて以下のように実行します。

このコマンドをSpeckを接続した状態で実行し、できるだけ、目の近くにカメラを持ってきて撮影してみてください。そして撮影時に目を左右や上下に動かしてみます。
コマンド終了後に、pupil.gifという動画ファイルが生成されるので、それを見てみると瞳孔の動きに伴って、緑の点が動いているのが分かるかと思います。

実際に動画を見てみると、瞳孔の動きに正確に追従できているかというと微妙な感じになると思います。
これは今回のRetinaの研究で使われているデータが特定のデバイスを用いて特定の方向から取得したものであり、かつそれを用いてAIの学習が行われているため、我々がSpeckを使用して得られる画像とかなり性質が異なっているというのが考えられます。
このような学習時のデータと実際に推論時のデータの撮られ方が異なることでうまく推論できない状態をドメインギャップといいます。汎用的なAIモデルを作る場合に如何にこのドメインギャップを起こさないように汎用性のあるデータを取得するかというのが非常に大事になります。

5. まとめ

今回は、Retinaという研究で公開されている学習済みモデルを、Speckの実機で動かし、実際に視線の動きを何となくではありますが、捉えられているのを確認できました。
ここから、論文のレベルで精度を上げていくには、自前でデータを取ってみることや、AIモデルを学習させる際にモデルのパラメータや学習方法の調整を行なっていく必要があると考えられます。
この記事を読んで、このカメラ面白いなと感じていただけた方はぜひ下記リンクよりお問い合わせ下さい。

最後までお読み頂きありがとうございました。

お客様用ご相談/お問い合わせ

製品に関するご相談、デモ機器、お見積・納期などに関して お気軽に問い合わせ下さい

※は入力必須項目となります。

下記フォームにてお客様情報・問い合わせ内容をご記入の上、確認ボタンをお願いします

お問い合わせ内容必須
会社/団体名必須
所属/担当
お名前(漢字)必須
お名前(フリガナ)
電話番号必須

- -

〒 郵便番号(ハイフン無し)必須
住所(建物名まで記入)必須
メールアドレス(個人アドレス、フリーアドレス不可)必須
お問い合わせの製品名

ナノシード製品を知ったきっかけ (いくつでも可)

どういったジャンルの製品に関心がありますか(いくつでも可)

気になる海外メーカー/製品はありますか (自由記入)

お問い合わせの内容必須
個人情報の取り扱いに同意する