🐷

大規模言語モデルを使って自動車走行時の状況説明をさせてみる? -社内LLMハッカソン記-

2023/06/30に公開

Turing株式会社の自動運転MLチームでエンジニアをしている岩政です。

Turingの自動運転MLチームでは、完全自動運転の開発に向けて、走行データから自動走行が可能な深層学習モデルの作成およびデータ基盤の整備視覚情報以外にも言語を活用したマルチモーダルな基盤モデルの作成に取り組んでいます。

本記事では、視覚情報を認識するモデル大規模言語モデルを組み合わせて、「自動車走行時の特に危険な状況を説明することができないか?」という観点から、社内ハッカソンで取り組んだことを紹介します。

社内LLMハッカソン

事の発端は、4月のある1日に急遽開催された大規模言語モデル(以下LLM)を活用した社内ハッカソンでした。高度な自動運転の実現において、一般的な社会常識のもと複雑な状況を理解して適切に行動するための「知能」は必要不可欠です。現在、Turingでは、LLMはその知能として高いポテンシャルがあるのではないかと考えています。

今回のハッカソンはLLMと仲良くなる必要があるという話のもと、ルールとしては「LLMを使って何かすごそうなことをやる」と「5分で発表する」の2つで行いました。

自動運転やマルチモーダルといったテーマは何でもよく、とにかく何かすごそうなことをやる、という自由度の高さに逆に困りました。

走行情報を説明を行いたい

何かアイディアはないかと考えていたところ、Twitterでこの動画を見つけました。

この動画はツイート文の通り、ライダーの方が山道を走行する際に、どこに視線を向けて何を注意しているのかを実際の動画とともに紹介されています。バイクに乗ったことがない私は、道路中の落ち葉や段差といったものにあまり注意を払ったことがなかったため、非常に面白く勉強になるなぁと感心しました。

同様に自動車であっても、危険がありそうなところに視線を向けることや、先の状況を見てスムーズに運転するにはどうすべきかと考えながら運転します。

この「考える」行為が、LLMで実現できたら面白いかも!と思い、実際の走行画像からどこが危険で、なぜ危険なのかと、それを避けるためにどのように運転すべきか、の3つを出力するシステムを構築しました。

1. 視覚情報をどうLLMに入力すべきか

単に静止画像情報から走行時の状況を説明するなら、BLIP[Li+ 22]BLIP-2[Li+ 23]でEnd-to-endで画像キャプショニングすることが実現できます。一方で、なぜその状況が注意すべきかについて十分に伝わらないためLLMを活用が考えられます。

2023年の4月現在、ChatGPTなどのLLMのAPIに対して、画像とテキストのマルチモーダルの両方を入力することはできません。GPT-4を始めとする画像も入力可能な基盤モデルは研究されていますが、一般には公開されていません(Flamingo[Deepmind, 22], PaLM-E[Google, 23])。

そのため現時点では、画像からテキストを生成するキャプショニングと、その情報を用いて状況説明を行うLLMを2つ分けて構築することにしました。

2. 視覚情報の抽出

画像からテキスト情報を抽出して、LLMに受け渡す方法としてImage2Paragraphというリポジトリを参考にしました。

Image2Paragraph Main Pipeline

Image2Paragraphでの画像のキャプショニングは、画像全体、各物体ごと、領域ごとに行います。特に物体ごとのキャプショニングは、Dense Captioningと言われる手法で物体検出よりも高い情報量が得られます。

GRiT Main Figure

それぞれのパートのモデルは、画像キャプショニングはBLIP-2、Dense CaptioningはGRiT[Wu+ 22]、領域の意味抽出はSegment Anything(SAM)[Meta, 23]を用います。

本ハッカソンでは、SAMの計算時間が比較的掛かったため、BLIP-2とGRiTを用いて画像からテキスト情報を抽出しました。現在では、SAMを高速に実行できるFastSAM[Zhao+, 23]などが活用できそうです。

3. LLMを活用した状況説明

LLMのプロンプトのテンプレートは以下のようにしました。

Question: Now you are the AI of a fully automated car. You are currently driving in Japan at speed, carefully watching for potential accidents, especially with people and cars.
Generate an informative and nature paragraph based on the given information(a,b,c,d) and finally generate it according to the rules to json format:
    a. Image Resolution:  {画像の解像度};
    b. Image Caption: {BLIP-2の出力};
    c. Dense Caption: {GRiTの出力(物体のBounding Boxとそのキャプション)};
    d. Region Semantic: 
There are some rules:
    Show object, color and position.
    The coordinates is (left, top, right, bottom).
    Use nouns rather than coordinates to show position information of each object.
    No more than 7 sentences.
    Only use one paragraph.
    Describe position of each object.
    Do not appear number.
    Describe the important points to pay attention to while driving.
    Finally, follow the format below to output one piece of information that should be given the most attention in your current driving. The keys are coordinates, information, reason and how to drive.
    Be sure to output as per the following example format:
    (example) Output: coordinates: [left, top, right, bottom] or [None, None, None, None]; information: A group of pedestrians are crossing the street; reason: The pedestrians safely cross the streetm; how: Drivers should stop and wait.

このプロンプトを要約すると以下の通りです。

- 前提条件
    - あなたは完全自動運転車のAIです。あなたは人や車との事故の可能性に注目しています。
    - 与えられた情報に基づいて、意味のある、自然な文章を生成し、最後のルールに従ってjson形式で返してください。
- Image Captioning
    - 画像の解像度
    - Image Captioning
        - 画像から生成したキャプション
    - Dense Captioning
        - 物体のBounding Box座標とその物体のキャプション
    - Segment Anything
        - なし
- ルール
    - オブジェクトの位置情報を示すには、座標ではなく、名詞を使う
    - 文章は7つまで。
    - 段落は1つまで。
    - 運転中に注意すべき点を記述する
    - 以下のフォーマットに従って現在の運転で最も注意を払うべき情報を1つ出力する
        - Output: coordinates: [left, top, right, bottom]; information: 歩行者のグループが道路を横断している; reason: 歩行者は安全に道路を横断している; how: ドライバーは停止して待つべきである

これをもとにGPT-3.5-turboで文章を生成しました。

結果

次の画像を入力することを考えます。

この状況としては、対向車はおらず前方に自転車を漕いでいる人がいるが、追い越し禁止線のため無理に追い越すことはできません。また、右奥の交差点から車が来る可能性もあります。

一連のモデルにこの画像を入力すると以下のようになりました。

ChatGPT Response: As the autonomous car drives down the long paved road in Japan, it approaches a man riding a bike wearing a blue coat. The white bicycle he rides is visible as it moves alongside the yellow line on the road. To the left of the street, there is a tree with no leaves and a grassy area, where the green grass is prominent. On the metal grate of the sidewalk, there is a red and yellow ball. Further down the road, a building with a window can be seen. A tree stands tall in a city, not far from where the man on the bike is riding. It is important to pay attention to the bike rider, as he is the only moving object among the stationary ones. The most crucial point to notice in this driving scenario is the presence of the person riding the bike since the car must maintain a safe distance and prevent any possible collision with the biker. Output: coordinates: [630, 485, 729, 732]; information: A person riding a bike is present; reason: To avoid a potential accident with the biker; how: Decrease speed and maintain a safe distance.

日本語に翻訳すると以下の通りです。

自動運転車が日本の長い舗装道路を走行していると、青いコートを着た自転車に乗った男性が現れます。彼が乗っている白い自転車は、道路の黄色い線に沿って動いているのが見えます。通りの左側には、葉のない木と緑の草が目立つ草地があります。歩道の金属製のグレートには、赤と黄色のボールがあります。道路を少し進むと、窓のある建物が見えます。自転車に乗った男性のすぐ近くの都市には、高い木が立っています。静止している物体の中で唯一動いている自転車に乗った人に注意を払うことが重要です。この運転シナリオで最も重要な点は、自転車に乗った人の存在であり、車は安全な距離を保ち、バイカーとの衝突を防ぐ必要があります。出力:座標:[630、485、729、732];情報:自転車に乗った人がいる;理由:バイカーとの潜在的な事故を避けるため;方法:速度を減らし、安全な距離を保ちます。

この結果ですが、かなり細かな状況を説明することが可能で、実際に人が走行しているときでも同じように考えて、行動するのではないかと思われます。

また、この出力をjson形式に変更することで、以下のように画像に注目物体を可視化させることや、それに関する説明や対処を返すことが可能です。これに関して、2023年の6月13日のOpenAIのアップデートにあるFunctions機能を用いることでより簡単にjson形式で返すことができます。

{
"coordinates": [630, 485, 729, 732],
"information": "A person riding a bike is present (自転車に乗った人がいる)", 
"reason": "To avoid a potential accident with the biker(バイカーとの潜在的な事故を避けるため)",
"how": "Decrease speed and maintain a safe distance(速度を減らし、安全な距離を保ちます)"
}

このjsonの中身を読むと走行データ画像に対して、どこに危険が潜んでいて、どのように運転すべきかが出力されていることがわかります。

他の画像でも試すと以下のような結果が得られました。

{
'coordinates': [1031, 416, 1392, 662],
'information': "A car is driving on the road(車が道路を走行している)",
'reason': "To avoid a collision with the car(車との衝突を避けるために)",
'how': "Adjust speed and keep a safe distance.(スピードを調節して安全な距離を保ってください)"
}

課題点と発展・応用先

LLMも交通シーンを理解できて面白い結果になった一方で、作成したプログラムは画像を入力してから約20秒で結果が返ってくるリアルタイム性の問題や、ChatGPTの狙った出力にする制御の難しさなど感じました。

特に感じたことがコンテキストの理解が不十分であることです。現状、LLMには画像キャプショニングモデルに依存したテキストプロンプトを入力とすることしかできません。画像をテキストに変換することを通すことで細かな情報は失われてしまいます。また、交差点の死角や何も物体がない注意箇所など、そもそも状況を生成することが困難な場合があり、実際の走行データは動画であるため静止画像には限界があります。

また、LLMが交通運転に特化しておらず、自動車レベルの身体性を持っていないため、人が危険と思う状況と乖離しています。他のテックブログでいのいちさんの基盤モデルを使ったTuringの完全自動運転戦略にも述べられているように、安全に運転を遂行するためには、やはり車の大きさや重さ、運動性能といった特性を一定以上理解しておく必要があります。

一方で、これらの課題点は着実に解決していくのだと思います。画像とテキスト両方が扱えるようなマルチモーダルな基盤モデルの発展はGPT-4をはじめ、オープンソースであってもOpenFlamingo[LAION, 23]や画像とテキスト以外にも、音声など別のドメインを用いるImageBind[Meta, 23]などが公開されています。

短期間で様々な基盤モデルが開発される状況は、基盤モデルのポテンシャルを非常に高め、自動運転に限らず様々なタスクを基盤モデルで解決することが可能になります。

自動運転データとしての応用性

交通運転に特化したマルチモーダルな基盤モデルを作成、特にデータ構築にもこのハッカソンでの技術は活用可能です。

LLMの学習において質が高い大量のデータが必要不可欠です。交通運転とその状況・行動に紐づいた画像-テキストデータはあまりなく、Berkeley Deep Drive-X (BDD-X) Dataset[Kim+, 18]など海外で撮影されたデータはあるものの日本で取得されたデータはほとんどありません。

一方で、近年ではLLMを活用した学習データの構築は注目されており、INSTRUCTION TUNING WITH GPT-4[Microsoft, 23]では、GPT-4で生成したInstraction-following data(命令追従データ)を活用することでZero-shotでの性能を向上させました。

言語も視覚も基盤モデルの活用をうまく進めることで、アノテーションコストを格段に下げることができ、交通運転に特化したマルチモーダル基盤モデルの学習データとして活用できるため、今後も、これらの技術を追っていきます。

終わりに

本記事では、TuringでLLMハッカソンを取り組んだ際に作成した自動車走行時の状況説明サービスをもとに、今のTuringの取り組みや注目している技術について紹介しました。基盤モデルを活用し、それを構築していくことは完全自動運転の達成の1つの鍵になると考えています。

TuringではLLMの研究開発を行っており、インターン生の藤井さんの分散並列学習の記事は非常に勉強になります!

また、LLMハッカソンでの別の作品は棚橋さんのGPT-3.5を活用した検索・要約エンジンも非常に面白く、様々なことに活用できます!

Turing では自動運転モデルの学習や、自動運転を支える基盤モデルの作成はこれからも熱く取り組んでいきます。興味がある方は、Turing の公式 Web サイト採用情報などをご覧ください。話を聞きたいという方はやAI チームのディレクターの山口さんのTwitter DM からでもお気軽にご連絡ください!

Tech Blog - Turing

Discussion