Carlaでセマンティック・セグメンテーション
セマンティック・セグメンテーション
セマンティック・セグメンテーション は人間の目の役割を担う技術のことであり,自動運転車の実現のために必須です. 具体的には,車両に取り付けられたカメラから取得される画像の, 各ピクセル(画素)に対し,「自動車」「人」「道路」などラベルを設定する仕組みのことです.
一般にセマンティック・セグメンテーションを実現するには,ディープラーニング が用いられます. 特にケンブリッジ大学のAlex Kendall氏が提案したSegNetが有名です. SegNetはRGB画像を入力とし,画像に存在する物体にラベルを設定することが出来ます. 下記はSegNetのデモ動画です.
CARLA Simulatorのセマンティック・セグメンテーションはあくまで疑似センサーであり,正確なラベル付けが可能です. 各画素のラベルは,赤・緑・青(RGB)の 赤(R) の値として表現されます. 設定されるラベルは下記の13種類です.
値 | ラベル |
---|---|
0 | なし |
1 | 建物 |
2 | フェンス |
3 | その他 |
4 | 歩行者 |
5 | 柱 |
6 | 道路線 |
7 | 道路 |
8 | 歩道 |
9 | 街路樹 |
10 | 車両 |
11 | 壁 |
12 | 信号 |
Pythonクライアントの実装
クライアントの初期化
それでは,セマンティック・セグメンテーションのラベルを得るためのPythonクライアントを実装しましょう. サーバーに接続するためのクライアントは with構文 を利用して生成します. このとき,サーバのIPアドレスとポート(デフォルトでは2000番)を指定します.
次にサーバの環境を設定します. ここでは,クライアントの同期(SynchronousMode),非プレイヤーの情報取得(SendNonPlayerAgentsInfo), 車両数(NumberOfVehicles),歩行者数(NumberOfPedestrians),天候(WeatherId),画質(QualityLevel)を設定しています. 天候は下記の15種類から選択可能です.
最後に,自車両のスタート位置を設定します. 選択可能な位置はマップに依存しますが,ここでは0番を指定しています.
値 | ラベル |
---|---|
0 | デフォルト |
1 | 晴・昼 |
2 | 雲・昼 |
3 | 晴・昼(湿潤) |
4 | 雲・昼(湿潤) |
5 | 雨・昼 |
6 | 強い雨・昼 |
7 | 弱い雨・昼 |
8 | 晴・夜 |
9 | 曇・夜 |
10 | 晴・夜(湿潤) |
11 | 曇・夜(湿潤) |
12 | 雨・夜 |
13 | 強い雨・夜 |
14 | 弱い雨・夜 |
from carla.client import make_carla_client
from carla.settings import CarlaSettings
from carla.tcp import TCPConnectionError
IP = "localhost"
PORT = 2000
with make_carla_client(IP, PORT) as client:
settings = CarlaSettings()
settings.set(
SynchronousMode = True,
SendNonPlayerAgentsInfo = False,
NumberOfVehicles = 20,
NumberOfPedestrians = 40,
WeatherId = 1,
QualityLevel = "Low"
)
settings.randomize_seeds()
client.load_settings(settings)
client.start_episode(0)
カメラの実装
セマンティック・セグメンテーションのためのカメラを環境に追加します. ここでは,カメラの視野角(FOV),サイズ(image_size),位置(position),向き(rotation)を設定しています. この設定は,車両の前方に向けて水平にカメラを設置していることになります.
from carla.sensor import Camera
camera = Camera('SemanticCamera', PostProcessing='SemanticSegmentation')
camera.set(FOV=90.0)
camera.set_image_size(800, 600)
camera.set_position(x=0.30, y=0, z=1.30)
camera.set_rotation(pitch=0, yaw=0, roll=0)
settings.add_sensor(camera)
画像の保存
カメラからデータを取得して,画像として保存します. 取得されるデータはNumPyのndarray型であり,上述したように,赤・緑・青(RGB)の 赤(R) の値として取得されます. このため,このままPNG画像として保存すると,真っ暗な画像になってしまいます.
from carla import image_converter
from PIL import Image
import numpy as np
measurements, sensor_data = client.read_data()
image = sensor_data["SemanticCamera"]
r_array = image_converter.to_rgb_array(image)
pil_image = Image.fromarray(r_array)
pil_image.save("screen.png")
これを解決するための方法もCARLAでは用意されており, image_converter のメソッドを用いることで,それぞれのラベルを色分けしたデータを取得することができます. 結果を確認すると,人物や道路が色分けされていることがわかります.
rgb_array = image_converter.labels_to_cityscapes_palette(image)
pil_image = Image.fromarray(rgb_array)
pil_image.save("screen.png")
リアルタイム処理
PyGameを利用してリアルタイムにセマンティック・セグメンテーションの結果を描画してみます. フレームレートを維持するため,カメラは320x180のサイズとしました.