2025年6月18日水曜日

RoboBrain2.0をAPEXのアプリケーションから呼び出し画像の説明を求める

北京智源人工智能研究院(The Beijing Academy of Artificial Intelligence - BAAI)がリリースしている画像や動画をソースとして推論を行うLLM - RoboBrain2.0を、APEXアプリケーションから呼び出してみました。

RoboBrain2.0については、以下のサイトで紹介されています。

RoboBrain2.0: See Better. Think Harder. Do Smarter.

Hugging FaceにはLM Studioで実行できるGGUF形式のモデルがありますが、与えた画像とLLMが返す座標が一致しないため、RoboBrain2.0のGitHubリポジトリに含まれるSimpleInferenceクラス(inference.pyに含まれる)を呼び出すFastAPIのサーバーを実行し、それをAPEXアプリケーションから呼び出しています。

作成したAPEXアプリケーションは以下のように動作します。


プロンプトには「ミャクミャク」と入力していますが、Taskとしてgroundingを選択しているためLLMに以下のプロンプトが渡されます。
Please provide the bounding box coordinate of the region this sentence describes: ミャクミャク.
Enable Thinkingにチェックを入れているので推論の過程も返されます。以下はthinkingとして返された英語を、日本語に翻訳した内容です。

視覚的な情報から、このアート作品は、大きな青い胴体を持ち、一般的に「ミスター・ポテトヘッド」として知られるキャラクターに似ていることで明確に識別できます。青い体と赤い風船が組み合わさっており、視覚的に非常に印象的で記憶に残るデザインとなっています。さらに、足元、もしくは階段のように見える部分も青く縁取られており、彫刻全体のデザインをより際立たせています。

このタスクでは、画像内でこのアート作品を特定し、その位置を見つけ出す必要があります。作品は黒と赤のプラットフォーム上に目立って配置されており、地面とのコントラストがはっきりしているため、その存在を明確に認識できます。彫刻自体はかなり高い台座の上に置かれており、独特で目を引くデザインによって、見る者の視線を上方へと導きます。

鮮やかな色使い、精緻なデザイン、台座上の配置といった視覚的手がかりを踏まえると、このアート作品は大きな青い「ミスター・ポテトヘッド」風のフィギュアを中心に構成されていることは明らかです。この分析は、指定された座標情報とも一致しており、この彫刻がシーンの中心的存在であることを裏付けています。したがって、視覚的観察と空間的推論に基づいた結論として、このアート作品は「大きな青い『ミスター・ポテトヘッド』風の彫刻」であると断定できます。

「ミャクミャク」は認識していませんが、「大きな青い『ミスター・ポテトヘッド』風の彫刻」を囲む矩形の座標が返されています。

実際には、temperatureとして0.7を指定しているせいか、または、FastAPIでSimpleInferenceを呼び出しているせいか、レスポンスが安定しません。レスポンスに含まれる推論や座標が途中で切れたり、推論中に例外が発生したりします。そのため実用性はまったくありませんが、「こんなレスポンスを返すLLMがある」ということを知ることはできます。

今回作成したAPEXアプリケーションのエクスポートを以下に置きました。
https://github.com/ujnak/apexapps/blob/master/exports/sample-robobrain2-apex-app.zip

macOSのpodman上に作成しているAPEX環境にインポートして実行しています。

以下よりRoboBrain2.0を呼び出す作業を紹介します。

最初にRoboBrain2.0による推論を呼び出すFastAPIのサーバーを実行します。uvを使います。

プロジェクトのディレクトリとしてRoboBrainを作成し、作成後に移動します。

uv init -p 3.10 RoboBrain
cd RoboBrain

% uv init -p 3.10 RoboBrain

Initialized project `robobrain` at `/Users/ynakakoshi/Documents/RoboBrain`

% cd RoboBrain

RoboBrain % 


RoboBrain2.0のGitHubリポジトリよりinference.pyを取得し、このディレクトリに配置します。


inference.pyの93行目に以下の記述があります。

inputs = inputs.to("cuda")

本記事はmacOSで作業をしているためNVIDIA GPUの指定であるcudaを、以下のようにApple Siliconの指定であるmpsに変更しています。

inputs = inputs.to("mps")

cudaの代わりにcpuを指定することにより、NVIDIA GPUおよびApple Silicon以外でも動作するかもしれませんが、確認はできていません(Apple SiliconのMacでcpuを指定すると、mpsを使ってください、というエラーが発生するため)。

次に以下のmain.pyをダウンロードします。SimpleInferenceクラスによる推論を呼び出すFastAPIのサーバーです。全てClaude Sonnet 4に書いてもらいました。


pyproject.tomlを以下に置き換えます。

依存関係をインストールします。

uv sync

RoboBrain % uv sync

Using CPython 3.10.15 interpreter at: /opt/homebrew/opt/python@3.10/bin/python3.10

Creating virtual environment at: .venv

Resolved 61 packages in 162ms

Installed 44 packages in 372ms

 + accelerate==1.7.0

 + annotated-types==0.7.0

 + anyio==4.9.0

 + av==14.4.0

 + certifi==2025.6.15

 + charset-normalizer==3.4.2

 + click==8.2.1

 + exceptiongroup==1.3.0

 + fastapi==0.115.12

 + filelock==3.18.0

 + fsspec==2025.5.1

 + h11==0.16.0

 + hf-xet==1.1.4

 + huggingface-hub==0.33.0

 + idna==3.10

 + jinja2==3.1.6

 + markupsafe==3.0.2

 + mpmath==1.3.0

 + networkx==3.4.2

 + numpy==2.2.6

 + opencv-python==4.11.0.86

 + packaging==25.0

 + pillow==11.2.1

 + psutil==7.0.0

 + pydantic==2.11.7

 + pydantic-core==2.33.2

 + pyyaml==6.0.2

 + qwen-vl-utils==0.0.11

 + regex==2024.11.6

 + requests==2.32.4

 + safetensors==0.5.3

 + setuptools==80.9.0

 + sniffio==1.3.1

 + starlette==0.46.2

 + sympy==1.14.0

 + tokenizers==0.21.1

 + torch==2.7.1

 + torchvision==0.22.1

 + tqdm==4.67.1

 + transformers==4.52.4

 + typing-extensions==4.14.0

 + typing-inspection==0.4.1

 + urllib3==2.4.0

 + uvicorn==0.34.3

RoboBrain % 


FastAPIサーバーを実行します。Hugging Faceよりモデルをダウンロードするため、初回実行時は起動までに時間がかかります。

uv run main.py

RoboBrain % uv run main.py

INFO:     Started server process [29096]

INFO:     Waiting for application startup.

Initializing model...

Loading Checkpoint ...

Loading checkpoint shards: 100%|█████████████████████| 4/4 [00:07<00:00,  1.96s/it]

Using a slow image processor as `use_fast` is unset and a slow processor was saved with this model. `use_fast=True` will be the default behavior in v4.52, even if the model was saved with a slow processor. This will result in minor differences in outputs. You'll still be able to use a slow processor with `use_fast=False`.

You have video processor config saved in `preprocessor.json` file which is deprecated. Video processor configs should be saved in their own `video_preprocessor.json` file. You can rename the file or load and save the processor back which renames it automatically. Loading from `preprocessor.json` will be removed in v5.0.

Model initialized successfully

INFO:     Application startup complete.

INFO:     Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)



Uvicornがhttp://0.0.0.0:8000で実行されているとメッセージが表示されれば、RoboBrain2.0を呼び出せる状態です。

作成したAPEXアプリケーションについて説明します。

Image Fileをクリックし、推論の対象とする画像ファイルを選択します。画像ファイルを選択した後にボタンSet Imageをクリックします。画像ファイルが大きい場合(縦横で1000pxを超えるようなサイズ)は、推論を実行する際にエラーが発生するようです。そのため、画像が大きい場合は、あらかじめリサイズしておきます。


ボタンSet Imageをクリックすると、以下のPL/SQLコードが実行されます。APEX_APPLICATION_TEMP_FILESにアップロードされた画像ファイル(BLOB)をAPEXコレクションIMAGEに保存しています。


APEXコレクションに保存された画像は、ページの左半分に表示されます。


Promptに文字列の入力、Enable Thinkingのチェック、Taskの選択を行い、ボタンAskをクリックします。

ボタンAskのクリックでREST APIを経由して、SimpleInferenceクラスのファンクションinferenceが呼び出されます。inferenceの定義は以下になっています。

def inference(self, text:str, image: Union[list,str], task="general", plot=False, enable_thinking=True, do_sample=True, temperature=0.7):

Taskで選択した値が引数taskに渡されます。plotにTrueを与えるとSimpleInferenceクラスではパッケージcv2を使って画像に描画を行います。APEXではWeb上での描画に置き換えるため、plotは常にFalseにします。

ボタンAskをクリックすると、以下のPL/SQLコードが実行されます。


RoboBrain2.0のレスポンスはResponseに表示されます。レスポンスはJSONドキュメントで、属性thinkingに推論、属性answerに座標が返されます。


Taskとしてpointingを選択して推論しているため、answerには点の位置となるx,y座標が配列として返されます。

ボタンRenderをクリックすると、左の画像の上にanswerで返された点を描画します。


「オカピのツノ」がプロンプトですが、尖っている耳とお尻に点が表示されています。


意図した結果ではないかもしれませんが、thinkingに推論の過程が説明されているため、なぜそうなったのかを確認できます。

ボタンRenderをクリックすると、以下のJavaScriptコードを実行します。


ファンクションrenderは静的アプリケーション・ファイルとして作成したapp.jsに記述しています。Taskpointingであれば点、trajectoryであれば折れ線、affordanceまたはgroundingであれば矩形を表示します。それぞれの図形は、画像にDIV要素を重ね合わせて表示しています。


APEXアプリケーションの実装についての説明は以上です。

RoboBrain2.0のGitHubリポジトリには、RoboBrain2.0の紹介に使用しているJPEGファイルが含まれています。


trajectory.jpgをダウンロードして、RoboBrain2.0の紹介と同じプロンプトを与えて呼び出してみます。


5. Usage for Trajectory Prediction (Embodied)にあたる処理で、プロンプトはreach for the banana on the plate、Enable ThinkingはTrue、Taskはtrajectoryです。


temperatureが0.7なので同じレスポンスにはなりませんが、近い結果になります。

適切な座標値がとれませんが、LM Studioのローカル・サーバーにロードしたRoboBrain2.0を呼び出すページも作成しています。


動作確認のためにロードしたモデルは、bartowski/BAAI_RoboBrain2.0-7B-GGUFの量子化タイプがQ6_K_Lのものです。


ボタンAskをクリックしたときに実行するコードは以下です。レスポンスをJSONで返すようにプロンプトを変更しています。

LM StudioではFastAPIサーバーのように推論中に例外が発生することはありませんが、answerで返される座標が画像にうまく合いません。


推論を読むとプロンプトは認識されているので、LM Studioが行なっている画像の前処理の影響だろうと予想されます。

視覚入力には、2人の人物が互いに近くに座っている様子が映し出されています。1人は赤い帽子をかぶっており、バナナを食べているもう1人の人物と何らかの活動に関わっているように見えます。赤い帽子はその鮮やかな色のために目立ち、衣服の一部として容易に識別できます。このタスクでは、その人物が身につけている特定のアイテムを識別することが求められています。シーンを観察すると、私は赤い帽子をかぶった人物に注目し、視野内ではっきりと帽子をかぶっていることを確認します。この分析により、赤い帽子が識別対象の物体であると結論づけられます。

LM Studioで動かすことができればよいのですが、解決方法を見つけることができなかったので、現状は残念です。

今回の記事は以上になります。