Carlaでセマンティック・セグメンテーション

Image from Gyazo

セマンティック・セグメンテーション

セマンティック・セグメンテーション は人間の目の役割を担う技術のことであり,自動運転車の実現のために必須です. 具体的には,車両に取り付けられたカメラから取得される画像の, 各ピクセル(画素)に対し,「自動車」「人」「道路」などラベルを設定する仕組みのことです.

一般にセマンティック・セグメンテーションを実現するには,ディープラーニング が用いられます. 特にケンブリッジ大学の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)

Image from Gyazo

Image from Gyazo

カメラの実装

セマンティック・セグメンテーションのためのカメラを環境に追加します. ここでは,カメラの視野角(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")

Image from Gyazo

これを解決するための方法もCARLAでは用意されており, image_converter のメソッドを用いることで,それぞれのラベルを色分けしたデータを取得することができます. 結果を確認すると,人物や道路が色分けされていることがわかります.

rgb_array = image_converter.labels_to_cityscapes_palette(image)
pil_image = Image.fromarray(rgb_array)
pil_image.save("screen.png")

Image from Gyazo

リアルタイム処理

PyGameを利用してリアルタイムにセマンティック・セグメンテーションの結果を描画してみます. フレームレートを維持するため,カメラは320x180のサイズとしました.

スポンサーリンク