Waymo自動運転車のデータセットを覗いてみた

# Waymo自動運転車のデータセットを覗いてみた

![Screenshot from 2019-08-23 22-20-57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388647/c8c70b53-17a7-f87e-07f4-6bce6bebfdc6.png)

自動運転の世界でトップを走るGoogle系列のWaymoからデータセットが発表されましたね!
とってもエキサイティング！
なんと合計１TBのデータセット！どうやら後にはコンペが控えているみたいなので今から用意しようZE！

(初記事なのでアドバイス等、間違いの指摘等いただけるとありがたいです)

## この記事ですること

1. Waymo Open Dataset(以下WOD)の概要
2. WODのクイックスタートガイド
3. データの覗き方

※GoogleColab使用は最低限、オフライン前提でウォークスルーします
##

## 1.Waymo Open Datasetの概要
https://waymo.com/open

Waymoは自動運転業界のトップと言われている企業。
そんな会社が、大規模データセットを出したって！

データセットは:

* ２０秒をワンシーンとして１０００シーンを収集
* １０Hzで収集
* センサデータは中距離LIDAR x1, 短距離LIDAR x4, カメラ x5
* その他LIDAR-カメラ投影パラメータ、車両姿勢、センサキャリブレーションデータも提供されている

* ラベリング
  * ４つの種別「車両」「歩行者」「サイクリスト」「標識」
  * １２００万の３D bounding boxのタグ、１２０万のカメラ 2D bounding boxのタグ
  * 高品質のカメラとLIDARデータのタグ（カメラに関しては全部ついていない 08/23/2019時点）
* Github: https://github.com/waymo-research/waymo-open-dataset
* ラベリングフォーマット：https://github.com/waymo-research/waymo-open-dataset/blob/master/docs/labeling_specifications.md

![Screenshot from 2019-08-23 23-07-45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388647/89cfe835-e95b-f05a-b465-6ce7c41291b9.png)

このカラフルな世界を覗いてみたくないか？覗いてみたいよね。



## 2.WODのクイックスタートガイド

### 環境
* Ubuntu 18.04 LTS, i7-9700K, RTX2080
* Python 3.6.8
* Tensorflow-gpu 1.12.0 (tensorflow cpuはなし）
* Nvidia-driver 410.104
* CUDA 9.0
* Cudnn7.4.1
* conda4.6.14(JupyterNotebook環境含む）

### 参考
https://github.com/waymo-research/waymo-open-dataset/blob/master/docs/quick_start.md

### このrepo何が入ってるの
* データセットフォーマットの解説
* 検出結果評価用のメトリック＋評価ソースコード
* モデル生成用のヘルパー関数

このセクションでは主にメトリック系をどう動かすかを解説。
QuickStartガイドをなぞり、トラブルバスティングしていくよ。

### ステップ１: repositoryのクローン

ブランチをr1.0にするのを忘れずに。

```bash
git clone https://github.com/waymo-research/waymo-open-dataset.git waymo-od
cd waymo-od
git checkout remotes/origin/r1.0
```

### ステップ2: Bazel系のインストール。
こいつをインストールすることによって、repositoryに含まれる検出結果を自動評価するコード等が使えるようになる。

```bash
sudo apt-get install --assume-yes pkg-config zip g++ zlib1g-dev unzip python3 python3-pip
BAZEL_VERSION=0.28.0
wget https://github.com/bazelbuild/bazel/releases/download/0.28.0/bazel-${BAZEL_VERSION}-installer-linux-x86_64.sh
sudo bash bazel-${BAZEL_VERSION}-installer-linux-x86_64.sh
sudo apt install build-essential
```

### ステップ3: Bazelのconfigure

人によってはここでつっかかる

```bash
./configure.sh
```

##

当方のマシンでは、tensorflow-gpuのみが入っており、tensorflow(CPU版）がないためここでつっかかった
その場合はconfigure.shファイルを強引に編集（tensorflowをインストールしてtensorflow-gpu環境を汚したくないため）
この方法で今のところ問題は出ていない。

適当なエディタで、installation check部分を強引に書き換えてしまおう。
tensorflow-gpuの呼び出しも tensorflow as tfで事足りる。



```bash
# Check if it's installed
TF_CFLAGS=""
TF_LFLAGS=""
echo 'Using installed tensorflow'
TF_CFLAGS=( $(python3 -c 'import tensorflow as tf; print(" ".join(tf.sysconfig.get_compile_flags()))') )
TF_LFLAGS="$(python3 -c 'import tensorflow as tf; print(" ".join(tf.sysconfig.get_link_flags()))')"
```
書き換えた後、./configure.shを走らせてみると
↓のように表示されて少し待つと、configure終了。
![Screenshot from 2019-08-23 23-04-39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388647/086b3c64-03a0-00f2-861a-e4beccaaf8ce.png)

### ステップ4:検出結果と真値を使って自動評価
metricテストを行う。
モデルの検出結果と真値を比較して評価してくれる。

WODには、コンペ＆評価用に下記のmetricが用意されている

* 3D 検出
    * Mean average precision(mAP)
    * Mean average precision weighted by heading(mAPH)
* 3D トラッキング
    * Multiple Object Tracking Accuracy(MOTA)
    * Multiple Objecy Tracking Precision(MOTP)

これらをオートで計算してくれるソースコードが用意されておりそれらをビルドする。

まずはmetricテストをする。これで正しくビルドされているかがわかる。

```bash
bazel test waymo_open_dataset/metrics:all
```

結果はこんな感じ

```bash
INFO: Analyzed 18 targets (48 packages loaded, 8042 targets configured).
INFO: Found 10 targets and 8 test targets...
INFO: Elapsed time: 218.470s, Critical Path: 97.99s
INFO: 483 processes: 483 linux-sandbox.
INFO: Build completed successfully, 637 total actions
//waymo_open_dataset/metrics:breakdown_generator_test                    PASSED in 0.1s
//waymo_open_dataset/metrics:detection_metrics_test                      PASSED in 0.1s
//waymo_open_dataset/metrics:hungarian_test                              PASSED in 0.3s
//waymo_open_dataset/metrics:iou_test                                    PASSED in 0.5s
//waymo_open_dataset/metrics:matcher_test                                PASSED in 0.1s
//waymo_open_dataset/metrics:metrics_utils_test                          PASSED in 0.1s
//waymo_open_dataset/metrics:mot_test                                    PASSED in 0.1s
//waymo_open_dataset/metrics:tracking_metrics_test                       PASSED in 0.2s

Executed 8 out of 8 tests: 8 tests pass.
There were tests whose specified size is too big. Use the --test_verbose_timeout_warnings command line optiINFO: Build completed successfully, 637 total actions
```

じゃテストも終わったことだし
自分の検出結果で評価したいよ、というときは下記の通り

```bash
bazel build waymo_open_dataset/metrics/tools/compute_detection_metrics_main
bazel-bin/waymo_open_dataset/metrics/tools/compute_detection_metrics_main waymo_open_dataset/metrics/tools/fake_predictions.bin  waymo_open_dataset/metrics/tools/fake_ground_truths.bin
```

自分の検出結果で評価したいときは

```bash
bazel-bin/waymo_open_dataset/metrics/tools/compute_detection_metrics_main 予測結果のパス/予測結果ファイル.bin  真値ファイルのパス/真値ファイル.bin
```

評価をすると下記のような結果が。
mAP, mAPHなどのメトリックの他に、LEVELが存在する。
物体が内包する点群の数で難易度Lv1,Lv2で変わってくるようだ。
点群の数が少なければ判断の材料が少ないので難易度が高い→Lv2だそうだ。
（今後Lvは更新されていくんだってさ）

```bash
OBJECT_TYPE_TYPE_VEHICLE_LEVEL_2: [mAP 0.0650757] [mAPH 0.055601]
OBJECT_TYPE_TYPE_PEDESTRIAN_LEVEL_2: [mAP 0.101786] [mAPH 0.0473937]
OBJECT_TYPE_TYPE_SIGN_LEVEL_2: [mAP 0.0500082] [mAPH 0.0366725]
OBJECT_TYPE_TYPE_CYCLIST_LEVEL_2: [mAP 0] [mAPH 0]
RANGE_TYPE_VEHICLE_[0, 30)_LEVEL_2: [mAP 0.0784186] [mAPH 0.0709105]
RANGE_TYPE_VEHICLE_[30, 50)_LEVEL_2: [mAP 0.133955] [mAPH 0.103888]
RANGE_TYPE_VEHICLE_[50, +inf)_LEVEL_2: [mAP 0.0522752] [mAPH 0.0460845]
RANGE_TYPE_PEDESTRIAN_[0, 30)_LEVEL_2: [mAP 0.0458333] [mAPH 2.20291e-09]
RANGE_TYPE_PEDESTRIAN_[30, 50)_LEVEL_2: [mAP 0.110526] [mAPH 0.0512746]
RANGE_TYPE_PEDESTRIAN_[50, +inf)_LEVEL_2: [mAP 0.15] [mAPH 0.074034]
RANGE_TYPE_SIGN_[0, 30)_LEVEL_2: [mAP 0.128993] [mAPH 0.100171]
RANGE_TYPE_SIGN_[30, 50)_LEVEL_2: [mAP 0.0354839] [mAPH 0.0171309]
RANGE_TYPE_SIGN_[50, +inf)_LEVEL_2: [mAP 0.0164904] [mAPH 0.01548]
RANGE_TYPE_CYCLIST_[0, 30)_LEVEL_2: [mAP 0] [mAPH 0]
RANGE_TYPE_CYCLIST_[30, 50)_LEVEL_2: [mAP 0] [mAPH 0]
RANGE_TYPE_CYCLIST_[50, +inf)_LEVEL_2: [mAP 0] [mAPH 0]
```

### 次は何する？
repositoryのクイックスタートガイドは以上。
え、これだけ？
データを覗かせてよ、キラキラの点群世界を俺に見せてくれ！！

というわけで、google colaboratoryの手順に従ってデータセットを覗いてみよう。

## 3.データの覗き方

###オンラインでやりたい方向け
下記のリンクからgoogle colabへ

データブラウジングチュートリアル
https://colab.research.google.com/github/waymo-research/waymo-open-dataset/blob/r1.0/tutorial/tutorial.ipynb

![Screenshot from 2019-08-24 00-42-21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388647/be416926-b2b8-bffd-6890-3380ade958b5.png)

リンク先の”Colab”ボタンをクリック
開けたら、各セルの[]を一つずつrunしていけば問題なくすべて実行可能。

###オフラインでやる方向け
データブラウジングチュートリアルのipynbファイルをダウンロード。
jupyter-notebook環境でデータセットのデータをブラウジングしていこう。

###ステップ1:必要なファイルをGoogle Colabからダウンロード
おい、貴様オフラインでやるといったな？
すまない、あれは嘘だ。ここだけGoogle Colab使います。

Google Colab上にて、セルを作成、下記のコードで必要なファイル3つをダウンロード。（要google chrome)

```bash
from google.colab import files
files.download('/content/waymo-od/bazel-genfiles/waymo_open_dataset/label_pb2.py') 
files.download('/content/waymo-od/bazel-genfiles/waymo_open_dataset/dataset_pb2.py')
files.download('/content/waymo-od/tutorial/frames')
```

###ステップ2: jupyter notebook実行の下準備

Load waymo_open_dataset packageのセル、Read one frameのセルにあるパスを修正。
ステップ１でダウンロードしたファイルを読み込みます。

###ステップ3: オープンデータセットの読み込み
オープンデータセットを読み込みたい場合は下記からダウンロード
https://waymo.com/open/download

試しにtraining_0000.tarをダウンロード、解凍する
フォルダの中身は.tfrecordファイル

それを読み込むためには、jupyter notebookのRead One frameを下記の様に変更
試しに一つの.tfrecordを読んでみる

```bash
FILENAME = '/データのおいてあるパス/training_0000/segment-1208303279778032257_1360_000_1380_000_with_camera_labels.tfrecord'
dataset = tf.data.TFRecordDataset(FILENAME)
for data in dataset:
    frame = open_dataset.Frame()
    frame.ParseFromString(bytearray(data.numpy()))
    break
```


###ステップ4:データの中身をチェック！
基本jupyter notebookの手順にそいます。
下記に各セル名と実行結果をリストします。

* Visualize Camera Images
![Screenshot from 2019-08-24 01-44-55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388647/d2644f08-2320-521c-3093-9dc762c544ed.png)

Waymo自動運転車のてっぺんについているカメラユニット５台からの画像
アメリカの郊外で駐車車両が大量にあるシーン

* Visualize Range Images
![Screenshot from 2019-08-24 01-45-04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388647/8ceccc96-ec77-64f3-02fc-9bbbc7053c6c.png)

LIDARの距離画像

* Show Point Cloud
※まだ実装されていないので予告、らしい(GoogleColabより）
![Screenshot from 2019-08-24 02-16-09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388647/2bc9212f-e6d5-f7bd-d348-fd551fe8321c.png)

今後PointCloudを３Dで表示、かつ物票もつけてくれるメソッドを作ってくれるらしい

* Visualize Camera Projection
![Screenshot from 2019-08-24 02-17-11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388647/a3392182-6820-ac8e-ce6b-ba3d60598662.png)

LIDARの点群を画像に重畳。これでカメラ＋LIDARの３D物体検出ができるようになる。



## 4.おわりに
以上が08/23/2019時点であがっているWaymo Open Datasetのウォークスルーです。
個人的な希望で、今後のアップデートにこんなものがあればいいなぁ。

・より充実したvisualization
・訓練のメソッド(Tensorflow Object Detection APIとの連携等）

おそらくこれらが出る前に、チュートリアルに沿ってデータをパースして自分で学習するほうが早いかも。

今後は自動運転系のプロジェクトのウォークスルーを上げていく予定です。
気に入った人はぜひLikeください！
それでは〜

※追記 可視化の詳細なウォークスルーを記事にしました、見てね！
[Waymo自動運転データセットを可視化するんだよ！](https://qiita.com/chin_self_driving_car/items/6ca4c8c6960d3dc4d77d)