【論文読み】コンピュータは人間のように運転技術を習得できるのか

この記事は[京都大学人工知能研究会KaiRA Advent Calendar 2023](https://qiita.com/advent-calendar/2023/kyoto-kaira) 7日目の記事になります。

今回は、自動運転に関するNVIDIAの論文[End to End Learning for Self-Driving Cars](https://arxiv.org/abs/1604.07316v1)をご紹介します。

# 今回のテーマ
今回は車の運転に関する話題です。
運転経験のない方にもわかりやすく説明するので安心してください。

## 人間にとっては当たり前？ハンドルさばきの習得
自動車の運転を習得するために最も重要な技術のひとつは、ハンドル捌きです。
人間には当然のように思われますが、ハンドル捌きは実際にハンドルを動かしながら、教官から「曲がり過ぎ！」とか「もっとハンドル切って！」とか指導を受けながら加減を学びます。
簡単に言うと、
__道路の曲がり具合を見ながらきれいにカーブできるよう練習する__
ということですね。

## コンピュータにもハンドルの切り方を学習させよう
ではコンピュータに運転技術を習得してもらおうと思ったとき、どのように伝えればよいでしょうか。
コンピュータは人間と違い、ひとつひとつ言語化してあげないと思った通りに動いてくれません。
ということで、今回はコンピュータにハンドルの切り方を学んでもらうメカニズムについて学んでいきましょう。

## この記事のゴール
この記事では、 __CNN(畳み込みニューラルネットワーク)__ に正しい運転方法を学習させるプロジェクト紹介を通じて下記3点の結論に持っていきます。
- 運転プロセス全体をひとつのタスクとして学習できる
- 人間が細かく分解しなくても自習しといてくれる
- 比較的少ない運転データからでも十分に学習できる

### キーワード
ここで重要となる概念です。
__CNN(畳み込みニューラルネットワーク)__
__画像認識__
__end-to-end learning__

# 本日の目玉: DAVE-2プロジェクト

## 目的(モチベーション)
人間が道路の状態や交通状況を定義しなくても、コンピュータが勝手に学習してくれるように設計したい

そこで今回のメイントピックは、NVIDIAが取り組んだロバストシステムの構築です。
2016年の論文なので最近のものではありませんが、学ぶところは多いはずです。

今回ご紹介するプロジェクトは __DAVE-2__ といいます。

## DAVE-2の概要

DAVE-2がどのようにデータを収集するのかを説明します。

### 3台の車載カメラを使用
データ収集に使う車両には、3台のカメラを設置します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631758/dbf6b47c-5aad-382f-bfa2-bba839db014b.png)

### ハンドルさばきの学習

車載カメラから送られてくる画像データと、ハンドルから送られてくる回転角(ステアリング角と呼ばれます)を用いて、
__どんな状況でどうハンドルを回せばいいのか__ を学習します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631758/7e220806-5ce7-a97f-4495-acd578a66444.png)

### 視点変換
さて、車両には3台のカメラを設置していましたが、各カメラから送られてきた画像データをバラバラのままにしていては周囲の環境を正確に解析できません。

そこで __視点の変換__ が必要になりますが、複雑な処理を避けるため以下のような仮定をおきます。

- 仮定1. 道路や地面は平坦である
- 仮定2. 水平線よりも上にある点は無限遠に位置する

これらの仮定を前提として進めましょう。

# 3.データ収集

光の当たり具合や天候が変わっても安定して運転させるために、様々な条件下で車を走らせてCNNに学習させます。

# 4.ネットワークアーキテクチャ(基本構造)
人間が実際に行った運転時のステアリング角と、ネットワークが学習の結果するステアリング角のズレができるだけ小さくなるようネットワークを訓練します。
具体的には、両者における __平均二乗誤差__ を最小にするようネットワークの重みづけを決定します。

ネットワークは以下の3種/9層から構成され、それぞれ下記のような役割を果たします。
- 標準化層*1...画像の標準化(GPUを使って高速処理を行うために必要な処理)
- 畳み込み層*5...画像の特徴を抽出
- 全結合層*3...最終的な出力(どれぐらいハンドルを回すか)を生成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631758/4ae630d6-b4db-805a-626b-64bcec5f4e52.png)

↑ネットワークアーキテクチャ

# 5.CNNモデルのトレーニング
ニューラルネットワークの訓練を行います。
たくさん勉強して、正しい運転技術を身につけてもらいましょう。

人間のドライバーが運転して集めたデータは、以下のようにラベリングされています。
- 道路の種別
- 天候
- ドライバーのアクション(車線内部を走行, 車線変更, 方向転換)

今回のプロジェクトでは __車線に沿ってちゃんと走れるように__ ニューラルネットワークを訓練したいので、ドライバーが車線内部を走行している時のデータのみ残して他は削ぎ落とします。

そのあと動画データをサンプリングするのですが、1秒間に何百回もサンプリングしたところで __同じような画像しか得られずムダ__ ですよね。

このような観点に基づくと、 __1秒間に10回のサンプリング__ がちょうどいいらしいです。

# 6.シミュレーション
省略。
シミュレーションはすぐ下の"7.運転精度の評価手法"にも登場するため、そちらをお読みください。

# 7.運転精度の評価手法

運転技術の評価には、下記2点の評価手法が用いられました。

## 7.1 シミュレーションテスト
評価基準: ネットワークが、 __トータルの運転時間のうち何%を(自動で)運転できるか__
これは、人間のドライバーが介入した回数で判断します。

さながら教習中に隣で見張っている教官のようですね。
この教官は中央線から1m以上ずれたら介入するルールです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631758/c9afdaeb-1e0e-f2f3-0492-b353b60b7863.png)

ただし、軌道修正して再び自動運転モードに設定する時間を考慮し、人間による介入は1回あたり6秒とされています。

以上から、運転時間全体のうち自動運転が成立している割合は

$$
自動で運転できる時間の割合 = (1-\frac{人間による介入回数*6}{経過時間})*100
$$

で評価されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631758/3a2fa9ef-77d1-76a4-d83b-8e125c1bc617.png)
↑シミュレータのようす

## 7.2 実際の道路を走らせるテスト
シミュレータで上手に走れたら、いよいよ公道での運転テストです。
(いきなり公道に出てもし暴走したら大変ですからね...)

ネットワークはテスト走行用の車両に実装されます。

また評価は自動でハンドルを操作できた時間の割合によって行われました。
(ただし車線変更やUターンは含みません)

# 8. 結論
評価の結果、自動車の運転技術におけるCNNの学習能力について下記3点が結論づけられました。
- 運転のプロセス全体をひとつのタスクとして学習できる
- 人間の手でステップごとに分解しなくても自分で学習してくれる
- わずか100時間未満の運転データからでも十分に学習して、多様な走行環境に適応できる

# おわりに
ここまでお読みいただきありがとうございました。
だいぶ簡略化して説明しましたが、興味をもたれた方はぜひ下記リンクから原文にアクセスしてみてください。
[NVIDIA "End to End Learning for Self-Driving Cars"](https://arxiv.org/abs/1604.07316v1)