OpenCV AI Kitの到着に備えよう

* この記事は[OpenCV Advent Calendar 2020](http://qiita.com/advent-calendar/2020/opencv)の23日目の記事です。
* 他の記事は[目次](https://qiita.com/advent-calendar/2020/opencv)にまとめられています。

## はじめに
<https://www.kickstarter.com/projects/opencv/opencv-ai-kit>でOpenCV AI KitのPre-orderが始まりました（現在はkickstarterだけでなく、<https://store.opencv.ai/>からもPre-orderできるようになっているようです）。この記事を読んでいる方でPre-order済で到着を心待ちにしている方も多いのではないでしょうか？~~完全に余談ですが筆者はOpenCV Tシャツも勢いで注文してしまいました。~~

これから一家に一台（？）となるかもしれないOpenCV AI Kitに関して、web上にある公開情報を調べてみたのでこの記事で情報共有しようと思います。

## OpenCV AI Kitとは

<https://www.kickstarter.com/projects/opencv/opencv-ai-kit>の冒頭で

> To celebrate OpenCV’s 20th anniversary we are proud to introduce the OpenCV AI Kit (OAK), an MIT-licensed open source software and Myriad X-based hardware solution for computer vision at any scale. 

という説明があります。どうも、Myriad Xベースのハードウェア、MITライセンスのCVアルゴリズムのソフトウェアから構成されるソリューションを「OpenCV AI Kit (OAK)」と言っていそうです。

加えてこのページにはOpenCV AI Kitには

- OAK-1
- OAK-D

という2種類のデバイスがあることと、それぞれのデバイスのハードウェアスペックの説明があります。

まずはOAK-1についてです。RGBカメラが付いているモデルです。
※下図は<https://www.kickstarter.com/projects/opencv/opencv-ai-kit>から引用したものです。

![](https://ksr-ugc.imgix.net/assets/029/968/973/aba80d323bc5df97b2e77e8e18d7caa3_original.jpg?ixlib=rb-2.1.0&w=680&fit=max&v=1595878372&auto=format&frame=1&q=92&s=8afcdb514f6ee7fdb5b76718f312ac5a)

RGBカメラでの撮影サンプルは以下の動画を観るとよいでしょう。

- https://www.youtube.com/watch?v=vEq7LtGbECs
- https://www.youtube.com/watch?v=XRFWX1tBC5o

続いてOAK-Dについてです。こちらはRGBカメラだけでなくステレオカメラが付いています。
※下図は<https://www.kickstarter.com/projects/opencv/opencv-ai-kit>から引用したものです。

![](https://ksr-ugc.imgix.net/assets/029/968/977/6ad29df4cdd4874108173e96dc1036bd_original.jpg?ixlib=rb-2.1.0&w=680&fit=max&v=1595878395&auto=format&frame=1&q=92&s=599f344b79a6ca1d2e63610c2a054aae)

また、それぞれのデバイスでできることになる機能は以下のように紹介されています。
OAK-1、OAK-DともにDNNのinferenceだけでなく、オブジェクトトラッキング、Apriltag検出などができるようです。OAK-Dだとステレオカメラが付いているということもあり、depthを使った処理ができるようになっています。
※下図は<https://www.kickstarter.com/projects/opencv/opencv-ai-kit>から引用したものです。

![](https://ksr-ugc.imgix.net/assets/029/813/610/2189a0dc301cd986119942d8663e7239_original.png?ixlib=rb-2.1.0&w=680&fit=max&v=1594730486&auto=format&frame=1&lossless=true&s=33a181527e0b196d005135691c0854b0)

## ハードウェア
<https://luxonis.com/depthai>にはデータパスの情報がもう少し詳細に載っています。
以下にデータパスの図を引用します。

![](https://luxonis.com/img/shots/data-path.jpg)

この図を読むと、カメラ画像（RGBカメラ、ステレオカメラ）をMIPI経由で転送し、Myrad X上でコンピュータビジョン、画像処理関連の処理を行い、USB経由でホスト側で受け取るというデータの流れのようです。この図から見るとホスト側からOpenCV AI Kit側に処理を戻すことはできないように見えます。

### OAK-1
（おそらく）OAK-1のモジュール情報は以下にまとまっています。
<https://github.com/luxonis/depthai-hardware/tree/master/BK1096_OAK-1_Modular>

このページにある情報を以下に抜粋します。

- IMP378 12MP Camera
- USB 3.1 Gen1 Type-C data and power
- AUX 5V connector
- Access to SoM 1.8V I2C and UART

DepthAIのページでもPDF資料が公開されています。
<https://drive.google.com/file/d/1z7QiCn6SF3Yx977oH41Kcq68Ay6e9h3_/>

### OAK-D
（おそらく）OAK-Dのモジュール情報は以下にまとまっています。
<https://github.com/luxonis/depthai-hardware/tree/master/BW1098OBC_DepthAI_USB3C>

このページにある情報を以下に抜粋します。現時点でUART、GPIOをどういう用途で使うのかはイメージが付かないので届いてから要確認といった感じです。

- USB 3.1 Gen1 Type-C
- Optional resistor-jumper for USB power
- Pads for DepthAI SoM 1.8V SPI
- Pads for DepthAI SoM 3.3V SDIO
- Pads for DepthAI SoM 1.8V Aux Signals (I2C, UART, GPIO)
- 5V barrel jack input
- Support for 5V fan

DepthAIのページでもPDF資料が公開されています。
<https://drive.google.com/file/d/1g0bQDLNnpVC_1-AGaPmC8BaXtGaNNdTR/>

<https://www.kickstarter.com/projects/opencv/opencv-ai-kit/faqs>に重量に関する情報があります。

- OAK-1: ~1.0 oz. (29 grams)
- OAK-D: ~1.5 oz. (43 grams)

また、電源供給についても以下の記載があります。

> It heavily depends on the modes of operation, but OAK-1 is about 2.5W and OAK-D is about 4W.

> The OAK-D is designed with an ideal-diode-or between the barrel jack 5V power and the USB power.

## ソフトウェア
個人的には現時点でSDKに関してはDepthAI公式ドキュメントである<https://docs.luxonis.com/en/latest/>が一番まとまっているように感じています。また、現時点ではC++、PythonでAPIが提供されているようです。

- <https://github.com/luxonis/depthai-core>
  - C++ライブラリ
- <https://github.com/luxonis/depthai-python>
  - depthai-coreのPythonラッパー

ここでは現時点で情報が最も多いPython APIを軽く紹介することにします。

### Python API
APIリファレンスは<https://docs.luxonis.com/en/latest/pages/api/#api-reference>を参照ください。<https://docs.luxonis.com/en/latest/pages/samples/minimal/>にあるサンプルコードでシンプルな使い方がイメージできそうなのでこちらを用いて基本的な使い方を見てみましょう。

```python
import cv2
import depthai

# デバイス検知
device = depthai.Device('', False)

# パイプライン作成（DNNモデル情報、カメラのストリーム設定など）
p = device.create_pipeline(config={
    "streams": ["metaout", "previewout"],
    "ai": {
        "blob_file": "/path/to/depthai/resources/nn/mobilenet-ssd/mobilenet-ssd.blob",
        "blob_file_config": "/path/to/depthai/resources/nn/mobilenet-ssd/mobilenet-ssd.json"
    }
})

if p is None:
    raise RuntimeError("Error initializing pipelne")

detections = []

while True:
    # デバイスからパケットを取得
    nnet_packets, data_packets = p.get_available_nnet_and_data_packets()

    # object detectionの結果を取り出す
    for nnet_packet in nnet_packets:
        detections = list(nnet_packet.getDetectedObjects())

    for packet in data_packets:
        if packet.stream_name == 'previewout':
            # RGBカメラ画像を取り出す
            data = packet.getData()

            # CHW -> HWCに変換
            data0 = data[0, :, :]
            data1 = data[1, :, :]
            data2 = data[2, :, :]
            frame = cv2.merge([data0, data1, data2])

            img_h = frame.shape[0]
            img_w = frame.shape[1]

            # object detection結果を重畳する
            for detection in detections:
                pt1 = int(detection.x_min * img_w), int(detection.y_min * img_h)
                pt2 = int(detection.x_max * img_w), int(detection.y_max * img_h)

                cv2.rectangle(frame, pt1, pt2, (0, 0, 255), 2)

            cv2.imshow('previewout', frame)

    if cv2.waitKey(1) == ord('q'):
        break

# 終了処理
del p
del device
```

冒頭でApriltag検出ができるという話が出てきましたが、現時点の<https://docs.luxonis.com/en/latest/pages/api/#api-reference>には見当たりません。DepthAIのissueを眺めているとそれらしいものが見つかりました。
https://github.com/luxonis/depthai/issues/133

どうも本記事を執筆した時点では未対応のようです。これらの進展が気になる人は以下のページをウォッチするとよいかもしれません。
https://github.com/orgs/luxonis/projects


### OpenVINO対応
OpenCV AI KitではOpenVINOの学習済モデルを使用できるという記載があります。
<https://luxonis.com/depthai#awesome>にある図を以下に引用します。

![](https://luxonis.com/img/shots/comparison.jpg)

OpenCV AI Kit上だとMobileNet SSDが約25fpsで動作するようです。RasPi3上でこの速度で動いてくれると色々活用ができそうですね。このあたりは実機が来たら検証してみたいところです。

また、<https://docs.luxonis.com/en/latest/pages/tutorials/local_convert_openvino/>にOpenVINO IR modelをOpenCV AI Kitで使用するためのチュートリアルがあります。

### ROS対応
DiscourseでROS対応についてディスカッションがなされています。
<https://discourse.ros.org/t/opencv-ai-kit-oak/15406>

また、ROS2のラッパーも実装されているようです。
<https://github.com/luxonis/depthai_ros2>

### Micropython対応
<https://www.kickstarter.com/projects/opencv/opencv-ai-kit/faqs> に

> Micropython code directly on the Myriad X as a block in the pipeline.

という記載があり、2021年に対応予定があるようです。

## フォーラム
2021年1月からOpenCV AI Kitの公式フォーラムができるというアナウンスがありました。楽しみに待ちましょう！
<https://store.opencv.ai/blogs/learn-oak/oak-forum>

## その他
### Luxonisとは？

これまでの説明でLuxonisという単語が何度も出てきましたがOpenCV AI Kitとどう関連しているのか気になってきます。<https://www.kickstarter.com/projects/opencv/opencv-ai-kit/faqs>に以下の回答があります。

> Q. Who is Luxonis? What is their relationship with OpenCV?
> 
> A. Luxonis is behind writing the core capabilities and developing the hardware of the OpenCV AI Kit. Dr. Mallick approached Luxonis with the great idea to make this the OpenCV AI Kit and Luxonis loved the idea. So together Luxonis and OpenCV have been working towards that since (now for quite a long time).
> 
> Luxonis is also responsible for production of all of the OpenCV AI Kit and fulfillment of this KickStarter.

## おわりに
<https://www.kickstarter.com/projects/opencv/opencv-ai-kit/posts/3054589>を読むと配送周りで若干トラブルが起きていそうなので届くのは年明けになりそうかなという感じですが、事前準備としてOpenCV AI Kit関連の情報収集をしてこのページにまとめてみました。軽く調べた感じでは簡単に使えそうなので届くのが本当に楽しみです！

明日は[tetsu5902](https://qiita.com/tetsu5902)さんの記事です、楽しみにしましょう！

## 参考URL

- <https://github.com/luxonis/depthai>
  - DepthAIのリポジトリ
- <https://docs.luxonis.com/en/latest/pages/faq/>
  - DepthAI FAQ
- <https://docs.luxonis.com/en/latest/pages/troubleshooting/>
  - DepthAI トラブルシューティングガイド
- <https://github.com/luxonis/depthai-tutorials>
  - ドキュメントのチュートリアルコード
- <https://github.com/luxonis/depthai-experiments>
  - Experimentalなサンプルプロジェクト
- <https://github.com/luxonis/depthai-docker>
  - Docker上で開発環境を整えたい人向け
- <https://github.com/luxonis/depthai-gui>
  - DepthAIの処理を編集するGUIツール
  - https://www.youtube.com/watch?v=yNFgp1xrE80 を観るのがわかりやすい
- <https://discuss.luxonis.com/t/depthai>
  - DepthAIのフォーラム
- <https://store.opencv.ai/blogs/learn-oak/absurdly-easy-30-second-setup>
  - セットアップムービー
- <https://github.com/luxonis/depthai-hardware/blob/master/Mechanical-Designs.md>
  -  3Dプリンタで自作ケースを作りたい人はこの資料が参考になりそう