AirSim自動運転チュートリアル--モデルのテスト

10720 ワード

その後の更新は、次の時点で最初に公開されます.
https://
github.com/EVYang1992/A
utonomousDrivingCookbook
あ、watchとforkへようこそ
Step 2-モデルのテスト
このドキュメントでは、Step 1で訓練したモデルを使用してAirSimで車を駆動します.モデルの性能をいくつか観測し,モデルを改善する潜在的な実験の提案を提出する.
まず、いくつかのライブラリをインポートします.
from keras.models import load_model
import sys
import numpy as np

if ('../../PythonClient/' not in sys.path):
    sys.path.insert(0, '../../PythonClient/')
from AirSimClient import *

# <<   >>  
MODEL_PATH = 'model/models/sample_model.h5'

次に,モデルをロードし,AirSimシミュレータを景観図環境に接続する.異なるプロセスが終了するまでシミュレータが実行されていることを確認してください.
model = load_model(MODEL_PATH)

client = CarClient()
client.confirmConnection()
client.enableApiControl(True)
car_controls = CarControls()

自動車の初期状態とモデルから出力を格納するためのバッファを設定します.
car_controls.steering = 0
car_controls.throttle = 0
car_controls.brake = 0

image_buf = np.zeros((1, 59, 255, 3))
state_buf = np.zeros((1,4))

AirSimからRGBピクチャを読み出し、モデルに使用するためのヘルプ関数を定義します.
def get_image():
    image_response = client.simGetImages([ImageRequest(0, AirSimImageType.Scene, False, False)])[0]
    image1d = np.fromstring(image_response.image_data_uint8, dtype=np.uint8)
    image_rgba = image1d.reshape(image_response.height, image_response.width, 4)
    
    return image_rgba[76:135,0:255,0:3].astype(float)

最後に、車の運転を実行するための制御ボックスがあります.私たちのモデルは速度を予測していないので、私たちの車を均一な速度5 m/sで運転してみます.次のボックスを実行すると、モデルが車を駆動します!
while (True):
    car_state = client.getCarState()
    
    if (car_state.speed < 5):
        car_controls.throttle = 1.0
    else:
        car_controls.throttle = 0.0
    
    image_buf[0] = get_image()
    state_buf[0] = np.array([car_controls.steering, car_controls.throttle, car_controls.brake, car_state.speed])
    model_output = model.predict([image_buf, state_buf])
    car_controls.steering = round(0.5 * float(model_output[0][0]), 2)
    
    print('Sending steering = {0}, throttle = {1}'.format(car_controls.steering, car_controls.throttle))
    
    client.setCarControls(car_controls)

観察とその後の試験
やった!自動車は道路を完璧に走っており、ほとんどの時点で正しい形式の側に維持されており、すべての大きな転向時刻と道路から逸脱する可能性のあるすべての時刻を慎重にナビゲートしています.しかし、あなたは突然他のことに気づきます.まず、車の移動は緩やかで、特に橋にあります.次に、モデルをしばらく(5分以上)運転すると、車がランダムに道路からずれて衝突していることに気づきます.でもがっかりする必要はありません!私たちは表面的にこれらの問題にほとんど遭遇していないことを覚えておいてください.実際、自動車が非常に小さなデータセットでほぼ完璧に走ることを学ぶことができること自体が誇りに思っています.
思考訓練2.1:
車が橋の上で緩やかに運行していないことに気づいたかもしれませんが.何が原因なのか考えられますか.Step 0で紹介した技術でこの問題を解決できますか?
思考訓練2.2:
車がそれらの小山の一部を登ってみると、衝突するようだ.原因を考え出せますか?どうやってこの問題を解決しますか.(ヒント:車が衝突したときに車が何を見ているかを見に行きたいかもしれません)
AirSimは可能性に満ちた世界を開いた.より複雑なモデルを訓練したり、他の学習戦略を使ったりしても、新鮮なことを試してみることを制限しません.ここでは、このドキュメントで提供されているコード(ヘルプ関数を含む)を変更する必要があるかもしれませんが、現実的でない条件は必要ありません.
アイデアを探る2.1:
もしあなたが機械学習の背景があれば、あなたはすでにこのような質問をしたことがあります:どうして私たちは同じ環境の中で訓練とテストを行いますか?それはフィットしすぎませんか?はい、両側で論証することができます.同じ環境を使用して訓練とテストを行うと、この環境でフィットが発生したように見えますが、同じ確率分布からサンプルを抽出したと見なすこともできます.訓練とテストデータは異なりますが、同じ分布から来ています.モデルがこれまで出会ったことのない環境では、どのような状況になるのでしょうか.
他の非常に異なる可能性のある車が出会ったことがない環境を与えると、現在のモデルはうまく表現されない可能性があります(交差点、交通道路、建築など).しかし、このような環境の中で不公平を表現させます.山道で運転したことがない人や、生きている間に他の車や交差点を見たことがない人に、突然都市で運転させたいと思っています.彼らがどれだけよくできるか想像できますか?
反対の状況はおもしろいはずだ.訓練は都市環境から収集したデータが山道にもっと簡単に使われますか?自分で解決してみる.
アイデアを探る2.2:
回帰問題を用いてこの問題を記述した-連続的に変化する変数を予測している.逆に,分類問題でこの問題を記述することができる.より正確には、ステアリング角に一連の数(...,-0.1,-0.05,0,0.05,0.1,...)を定義することができます.bucketizeラベルは、各ピクチャに正しいbucketを予測します.このように変えたら何が起こるの?
アイデアを探る2.3:
現在のモデルは、1つの単一モデルと個別の状態を見るたびに予測されます.しかし、すべての履歴データを適用できます.過去のN枚のピクチャと状態(例えば過去の3枚のピクチャと過去の3つの状態を与えて、次のステアリング角を予測することができます)?(ヒント:RNNモデルを使用する必要があるかもしれません)
アイデアを探る2.4:
AirSimは私たちが提供したデータセットよりずっと多いです.初心者には、カメラを1つだけ使用し、RGBモードのみを使用します.AirSimは、可能なカメラごとに深さ図、分割図、surface normal viewなどを採取することができます.したがって、各インスタンスシーン(ここでは1枚のピクチャしか使用しません)に20の異なるピクチャ(5つのカメラが4つのモード)を持つことができます.これらの情報をどのように組み合わせて訓練するモデルを向上させるか