はじめに
Jev系で画像を扱えるOSSモデルであるimajevを手持ちのMacBook Pro(M4 Pro)で試す方法を紹介する。imajevは、判断特化型AIのJevと互換性のあるリクエスト・レスポンス形式を採用し、Jevにはない画像入力にも対応している。本記事ではuvとMLXでローカル起動し、画像内のノートPCの台数を判定する。
動作確認環境
- MacBook Pro(M4 Pro)
- メモリ:24GB
- uv
- version: 0.12.22 (Homebrew 2026-10-01 aarch64-apple-darwin)
方法
Python本体の準備と仮想環境の作成をまとめて行うため、今回はuvを使用する。uvはインストール済みとする。
公式ドキュメントのQuickstartでは、uvを使っていないので、コマンドを一部変更してuvで実行する。
uvでPythonの仮想環境を作成
最初に、imajevを任意のワークスペースにクローンする。
git clone https://github.com/mohit67890/imajev
cd imajev
uvでPython 3.11の仮想環境を作成する。
uv venv --python 3.11
以下のようにメッセージが出ればOK。
Using CPython 3.11.17
Creating virtual environment at: .venv
Activate with: source .venv/bin/activate
仮想環境を有効にする。
source .venv/bin/activate
仮想環境を有効にすると、プロンプトに (imajev) が表示される。
仮想環境内で、依存関係をインストールする。
uv pip install -e ".[serve,mlx]"
必要なパッケージがインストールされる。
インストールログ(クリックで展開)
Resolved 56 packages in 1.12s
Built imajev @ file:///Users/{username}/Documents/GitHub/
Prepared 56 packages in 22.81s
Installed 56 packages in 167ms
+ annotated-doc==0.0.5
+ annotated-types==0.8.0
+ anyio==4.15.1
+ certifi==2026.7.22
+ cffi==2.1.1
+ charset-normalizer==3.5.2
+ click==8.5.0
+ fastapi==0.142.2
+ filelock==4.0.9
+ fsspec==2026.9.0
+ h11==0.16.0
+ hf-xet==1.6.0
+ httpcore==1.0.9
+ httpx==0.28.1
+ huggingface-hub==1.33.0
+ idna==3.20
+ imajev==1.0.0 (from file:///Users/{username}/Documents/GitHub/imajev)
+ jinja2==3.1.6
+ llguidance==1.9.1
+ markdown-it-py==4.2.0
+ markupsafe==3.0.3
+ mdurl==0.1.2
+ miniaudio==1.71
+ mlx==0.32.3
+ mlx-audio==0.5.7
+ mlx-metal==0.32.3
+ mlx-vlm==0.7.1
+ numpy==2.4.6
+ opencv-python==5.0.0.93
+ opentelemetry-api==1.45.0
+ packaging==26.3
+ pillow==12.3.0
+ pycparser==3.0
+ pydantic==2.13.5
+ pydantic-core==2.46.5
+ pygments==2.21.0
+ python-multipart==0.0.32
+ pyyaml==6.0.3
+ regex==2026.9.29
+ requests==2.34.2
+ rich==15.0.0
+ safetensors==0.8.0
+ scipy==1.17.1
+ sentencepiece==0.2.2
+ shellingham==1.5.4
+ sounddevice==0.5.6
+ starlette==1.7.0
+ tokenizers==0.23.2
+ tqdm==4.70.1
+ transformers==5.18.0
+ typer==0.27.2
+ typing-extensions==4.16.0
+ typing-inspection==0.4.4
+ urllib3==2.8.0
+ uvicorn==0.54.0
+ websockets==17.1
モデルをダウンロード
ここでは、imajev-4Bをダウンロードする。
まず、ベースモデルのQwen3.5-4Bをダウンロードする。
python scripts/download_model.py --model 4b
以下のようにダウンロードが開始される。
Downloading Qwen/Qwen3.5-4B@851bf6e806efd8d0a36b00ddf55e13ccb7b8cd0a: 8.70 GiB
Downloading bytes: | 0.00B Warning: You are sending unauthenticated requests to the HF Hub. Please set a HF_TOKEN to enable higher rate limits and faster downloads. | 0/12 [00:00<?, ?it/s]
Fetching 12 files: 100%|████████████████████████████████████████| 12/12 [04:10<00:00, 20.90s/it]
Download complete: █████████████████████████████████████████████████████████| 8.07GB, 14.7MB/s /Users/{username}/Documents/GitHub/imajev/.cache/huggingface/hub/models--Qwen--Qwen3.5-4B/snapshots/851bf6e806efd8d0a36b00ddf55e13ccb7b8cd0a
Download complete: █████████████████████████████████████████████████████████| 8.07GB, 14.7MB/s
Reconstruction complete: 100%|█████████████████████████████████████| 9.34GB / 9.34GB, 87.3MB/s
次に、imajev-4bのアダプタと確率校正用ファイルなどをダウンロードする。
hf download mohit67890/imajev-4b --local-dir adapters/imajev-4b
以下のようにダウンロードが開始される。
int: A new version of huggingface_hub (2.1.1) is available! You are using version 1.33.0.
Hint: The `hf-cli` skill is not installed. Run `hf skills add -g` to teach your AI agents how touse the `hf` CLI.
Downloading bytes: | 0.00B Still waiting to acquire lock on /Users/{username}/Documents/GitHub/imajev/adapters/imajev-4b/.cache/huggingface/.gitignore.lock (elapsed: 0.1 seconds) | 0/32 [00:00<?, ?it/s]
Still waiting to acquire lock on /Users/{username}/Documents/GitHub/imajev/adapters/imajev-4b/.cache/huggingface/.gitignore.lock (elapsed: 0.1 seconds)
Warning: You are sending unauthenticated requests to the HF Hub. Please set a HF_TOKEN to enablehigher rate limits and faster downloads.
Fetching 32 files: 100%|████████████████████████████████████████| 32/32 [00:33<00:00, 1.06s/it]
Download complete: █████████████████████████████████████████████████████████| 929MB, 15.9MB/s ✓ Downloadedion complete: 100%|█████████████████████████████████████| 983MB / 983MB, 57.0MB/s
path: /Users/{username}/Documents/GitHub/imajev/adapters/imajev-4b
Download complete: █████████████████████████████████████████████████████████| 929MB, 15.9MB/s
Reconstruction complete: 100%|█████████████████████████████████████| 983MB / 983MB, 57.0MB/s
全てのダウンロードが完了すればOK。
起動
Apple Silicon搭載Macでは、--backend mlxをつける。
PYTHONPATH=src:scripts python scripts/playground/server.py \
--backend mlx \
--model-bundle artifacts/model-qwen4b.json \
--adapter adapters/imajev-4b/mlx \
--calibration adapters/imajev-4b/calibration.json \
--model-name imajev-4b \
--port 8765
以下のようなメッセージが出ればOK。
backend=mlx model=imajev-4b adapter=adapters/imajev-4b/mlx load_seconds=5.9 readout_codes=256 prompt_layout=standard
ブラウザで、http://localhost:8765/にアクセスして以下のような画面が出ればローカルサーバーの起動成功である。
動作確認
画像を使って動作確認する。今回は、COCOデータセットから、ノートPC(laptop)の台数を数える問題を解かせる。
Imagesには以下の3枚を1枚ずつアップロードし、同じ質問で個別に実行する。次の画像を試す際は、前の画像を削除して入れ替える。
今回は画像だけで判断するため、Stateには空のJSONオブジェクト {} を入力する。
{
}
Questionsは以下のようにする。
{
"laptop_count": {
"type": "choice",
"instructions": "画像にノートPCは何台ありますか? 外付けモニターは数えないでください。",
"criteria": {
"0": null,
"1": null,
"2": null,
"3_or_more": "3台以上"
}
}
}
- confidence はモデルが返す確信度であり、実測した正解率ではない
- 3_or_more は正確な台数ではなく「3台以上」という分類
以下のように結果が表示される。
各画像に対する結果を以下の表に示す。
なお、処理時間は画面に表示された処理時間を記載した。
| テスト画像 | laptop_count | confidence | 処理時間(ms) |
|---|---|---|---|
![]() |
1 | 97% | 1917 |
![]() |
2 | 94% | 1958 |
![]() |
3_or_more | 89% | 1822 |
今回試した3枚では、ノートPCの台数を「1台」「2台」「3台以上」に分類できた。処理時間は今回の実行では約1.8〜2.0秒だった。
まとめ
uvとMLXを使い、MacBook Pro(M4 Pro)でimajev-4bを動かした。今回試した3枚では、ノートPCの台数を指定した選択肢に正しく分類でき、処理時間は約2秒だった。今後は、物体が小さい画像や一部が隠れた画像でも試し、誤答や判断保留の傾向を確認したい。
参考




