はじめに
Appleが公開したFastVLM-0.5Bは、「小型で速いマルチモーダルモデル」。画像を理解してテキストで答える、いわゆるVQA(Visual Question Answering)やキャプション生成を得意としています。
実際にいくつかのジャンルの画像を食べさせてみると、その「得意・不得意」が見えてきました。
ケース1:駅の看板画像(OCR寄り)
質問 : "この画像を1文で説明してください。", "画像内のテキストを読み取ってください。",
モデルのこたえ:
・日本の駅の駅名や場所を明確にし、東京駅の東京メイドリドリやアオヤマドリを示しています。
・日本語、日本の駅名 (1) JR山本線 (2) JR香奈河線 (3) JR新宿線
観察:
・「JR山手線」「JR埼京線」などは拾える
・ただし出力がノイズっぽく、重複や謎の単語も混ざる
まとめ:
OCR的に「読める」けど「正しく整理する」のは苦手。文字認識はまぁまぁ、でも整形は下手。
ケース2:公園イラスト(人数カウント)
モデルの答え:
この絵には、バケツとシャベルを使って遊び場で遊ぶ3人の子供たちが描かれています。
観察:
・大枠のシーン(公園・遊具・イラスト調)は正確
・でも人数カウントは盛大に間違う。モデルの答えは3人。正確には4人。
まとめ:
ざっくりキャプションは得意、正確な数え上げは苦手。イラスト教材などに使うと「速いけど人数がズレる」現象が目立ちます。
ケース3:猫+桜イラスト(情景描写)
モデルの答え:
桜が咲く公園のベンチに猫が座っています。
観察:
・猫・桜・ベンチという主要要素を正確に捉える。
・文体も自然で、そのままキャプションに使える。
まとめ:
抽象的で情景的な説明タスクは大得意。フォトジェニックな画像には強さを発揮します。
総まとめ:FastVLM-0.5Bの性格
✅ 速い:TTFTはおおよそ2秒、総時間3〜4秒で返答
✅ 情景や大枠のキャプション生成は得意
❌ 正確な文字再現や人数カウントは苦手
❌ 言語が混ざるとノイズ(英語・日本語・中国語が混在)
一言でいうと
「速くて大雑把。雰囲気キャプションはうまいが、細かい正確さはツメが甘い」
おすすめの使い方
・ブログ・SNSでの画像キャプション生成
→ 桜と猫の例のように、そのまま使える一文をサッと出せる
・教育向けの教材づくりの下書き
→ 公園イラストなどを説明させてから、人が人数や細部を直す
・プロトタイピングや研究用途の実験
→ OCRやカウントの弱点を逆手にとって比較実験に活かす
手順
1. Colab環境準備
!pip -q install --upgrade transformers accelerate pillow timm einops sentencepiece
2. モデル読み込み
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM
MODEL_ID = "apple/FastVLM-0.5B"
dtype = torch.float16 if torch.cuda.is_available() else torch.float32
tok = AutoTokenizer.from_pretrained(MODEL_ID, trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained(
MODEL_ID,
torch_dtype=dtype,
device_map="auto",
trust_remote_code=True,
)
device = model.device
3. 画像アップロード
from google.colab import files
uploaded = files.upload()
img_path = list(uploaded.keys())[0]
4. 推論関数
from PIL import Image
import time
from transformers import TextIteratorStreamer
from threading import Thread
IMAGE_TOKEN_ID = -200
def build_inputs(question: str):
messages = [{"role":"user","content": f"<image>\n{question}"}]
rendered = tok.apply_chat_template(messages, add_generation_prompt=True, tokenize=False)
pre, post = rendered.split("<image>", 1)
pre_ids = tok(pre, return_tensors="pt", add_special_tokens=False).input_ids
post_ids = tok(post, return_tensors="pt", add_special_tokens=False).input_ids
img_tok = torch.tensor([[IMAGE_TOKEN_ID]], dtype=pre_ids.dtype)
input_ids = torch.cat([pre_ids, img_tok, post_ids], dim=1).to(device)
attn_mask = torch.ones_like(input_ids, device=device)
return input_ids, attn_mask
def vqa_one(img_path, question="この画像を1文で説明してください。"):
img = Image.open(img_path).convert("RGB")
px = model.get_vision_tower().image_processor(images=img, return_tensors="pt")["pixel_values"].to(device, dtype=dtype)
input_ids, attn_mask = build_inputs(question)
streamer = TextIteratorStreamer(tok, skip_prompt=True, skip_special_tokens=True)
start = time.time()
th = Thread(target=model.generate, kwargs=dict(
inputs=input_ids, attention_mask=attn_mask, images=px,
max_new_tokens=64, streamer=streamer
))
th.start()
out, first = "", None
for token in streamer:
if first is None:
first = time.time()
out += token
total = time.time() - start
ttft = first - start if first else total
return out.strip(), ttft, total
5. 実行
answer, ttft, total = vqa_one(img_path, "この画像を1文で説明してください。")
print("Answer:", answer)
print(f"TTFT={ttft:.3f}s, Total={total:.3f}s")
これで、アップロードした画像に対して「一文キャプション」や「人数を数えて」などの質問を投げかけられます。
まとめ
FastVLM-0.5Bを試したところ、駅の看板では文字を拾えるものの誤りやノイズが混ざり、公園のイラストでは雰囲気を的確に説明できても人数は大きく間違えました。一方で桜と猫のイラストでは、情景を自然で美しい一文にまとめることができ、得意分野がはっきり見えました。応答は二秒ほどと非常に速く、正確さよりも大枠のキャプション生成に強みを持つモデルといえます。つまり、FastVLM-0.5Bは速くて雰囲気を伝えるのが得意、細かい正確さは弱いモデルです。
フリーランスエンジニアです。
AIや画像生成の記事色々書いているのでプロフィール見てみてください。
もし以下のようなご要望をお持ちでしたらお気軽にご相談ください。
AIサービスを開発したい、ビジネスにAIを組み込んで効率化したい、AIを使ったスマホアプリを開発したい、
ARを使ったアプリケーションを作りたい、スマホアプリを作りたいけどどこに相談したらいいかわからない…
いずれも中間コストを省いたリーズナブルな価格でお請けできます。
お仕事のご相談はこちらまで
rockyshikoku@gmail.com
機械学習やAR技術を使ったアプリケーションを作っています。
機械学習/AR関連の情報を発信しています。