LabHub

ブログ

Vision モデル開発・fine-tuning 完全ガイド 2026 — CNN、ViT、DETR、SAM 2、VLM の実戦 decision tree

한국어English日本語

プロローグ — 2026 年の vision engineer が向き合う本当の問い

2026 年 5 月のある月曜日、vision チームのリードに届いた 1 行のチケット:

「工場ラインの camera 映像から不良部品を mark してください。class は 12 個、1 日 30 万枚処理、accuracy 95% 以上、edge デバイス(Jetson Orin Nano) で 30 fps。」

同じ要件を 2018 年に受けていたら答えは明確だった — ResNet50 backbone に RetinaNet head、COCO で事前学習してから自前データで fine-tune。終わり。

2026 年の答えは 8 個ほどある。

  1. YOLOv11/12 で普通に fine-tune
  2. RT-DETR で transformer ベースの detection
  3. SAM 2 で mask を出して classifier を載せる
  4. Florence-2 のような vision foundation model に prompt だけ投げる
  5. Gemini 2.5 Vision や Claude Vision に写真を送って自然言語で結果を受け取る
  6. CLIP で embedding を取って kNN で classify
  7. OWLv2/Grounding DINO で text prompt ベースの zero-shot detection
  8. 上記の 2、3 個を pipeline として組み合わせる

この記事はその 8 個の選択肢をいつ、なぜ、どう選ぶかの指針だ。単に「最新のモデルが良い」ではなく、データ規模・accuracy 要求・latency 予算・運用 cost の 4 軸で decision tree を作る。

2026 年の vision engineer のコアスキルは、もはや「モデル学習」ではない。「どのモデルを学習するか、そもそも学習が必要なのかを決めること」だ。


1 章 · architecture ファミリー — CNN から VLM まで一望

vision モデルは結局「画像 → 何か」であって、その「何か」が何かによって architecture のファミリーが分かれる。

ファミリー代表モデル出現時期入力処理強み弱み
CNNResNet、EfficientNet、ConvNeXt v22012 年〜convolution + poolingデータ少、速いglobal context 弱い
ViTViT、DeiT、Swin v2、EVA-022020 年〜patch + self-attentionデータ多いと最強データ少いと弱い
DETR 系DETR、Deformable DETR、RT-DETR2020 年〜encoder-decoder + queryNMS 不要の detection学習収束が遅い
SAM 系SAM、SAM 2、HQ-SAM2023 年〜ViT backbone + mask decoderpromptable segmentationsemantic label 出せず
VLMLLaVA-1.6、Qwen2.5-VL、Gemini Vision、Claude Vision、GPT-4V2023 年〜image encoder + LLM自然言語で reasoning、OCR、VQA高い・遅い・非決定的
multimodal foundationFlorence-2、InternVL3、DINOv22023 年〜統合 ViT、multi-task headzero-shot・few-shotfine-tuning のノウハウ必要

この表は暗記する価値がある。次の 8 章で各行を展開する。

コア原理: 全ての vision モデルは結局 「画像を token の sequence として見る」 — CNN は空間 grid として、ViT は patch sequence として、SAM は prompt と一緒に、VLM は LLM の入力 token として。representation がモデルを定義する。


2 章 · CNN は死んでいない — 2026 年での位置

ViT が全部呑み込んだという marketing と違って、2026 年でも CNN は生きている。特に次のような場合に。

CNN を選ぶべきとき

  1. データが少ない — label 1 万枚以下。ViT は事前学習なしではほぼ学習が進まない。
  2. edge で動かす必要がある — Jetson、Coral、携帯。ConvNeXt-Tiny は ViT-Tiny より同じ FLOPs で速い。
  3. latency が本当に厳しい — 1 ms 以下。小さい CNN は GPU で 0.5 ms も可能。
  4. 解像度が極めて高い — 4K の medical 画像。ViT は patch 数が爆発する。

timm でモデルを 1 行 load

PyTorch Image Models(timm) は 2026 年でも vision backbone の事実上の標準だ。1,000 以上の事前学習済み backbone を 1 行で呼べる。

import timm
import torch

# ConvNeXt v2 large、ImageNet-22k 事前学習、22k-1k で fine-tune
model = timm.create_model(
    'convnextv2_large.fcmae_ft_in22k_in1k_384',
    pretrained=True,
    num_classes=12,  # 我々の task の class 数
)

# 入力 transform はモデルが教えてくれる
data_config = timm.data.resolve_model_data_config(model)
transform = timm.data.create_transform(**data_config, is_training=True)

# batch 次元を含む tensor の形は `B x C x H x W`
x = torch.randn(2, 3, 384, 384)
logits = model(x)  # shape: 2 x 12

timm.list_models('convnext*', pretrained=True) で候補を確認できる。pretrained_cfg の中に meanstdinput_sizecrop_pct が入っているので transform を統一しやすい。

CNN 学習レシピ — 小さなデータでうまく動かす方法


3 章 · ViT — データが十分なときの champion

ViT(Vision Transformer) は画像を 16x16 のような patch に切って sequence にし、その上に Transformer を載せる。核心の洞察は 「画像に inductive bias が少ないモデルは、データさえあれば CNN を超える」 だった。

2026 年の ViT 派生

ViT を選ぶべきとき

条件推奨
ラベルデータ 10 万枚以上ViT または Swin
ラベル少だが画像が 100 万枚以上(自己教師あり可能)DINOv2 事前学習 → head のみ fine-tune
OCR・text が多い画像SigLIP 2 または ViT-L patch 14
多言語 OCR・表認識InternVL3 の ViT backbone

Hugging Face transformers で ViT classifier を 1 行

from transformers import AutoImageProcessor, AutoModelForImageClassification
import torch
from PIL import Image

processor = AutoImageProcessor.from_pretrained('facebook/dinov2-large')
model = AutoModelForImageClassification.from_pretrained(
    'facebook/dinov2-large',
    num_labels=12,
    ignore_mismatched_sizes=True,  # head のみ新しく
)

img = Image.open('part.jpg').convert('RGB')
inputs = processor(images=img, return_tensors='pt')
with torch.no_grad():
    outputs = model(**inputs)
pred = outputs.logits.argmax(-1).item()

facebook/dinov2-large の代わりに microsoft/swinv2-large-patch4-window12-192-22k のような backbone でも同じ API だ。


4 章 · object detection — YOLO vs DETR vs RT-DETR

detection は「どこに何があるか」を同時に解く task だ。2026 年時点で実務は大きく 2 つに分かれる。

YOLO family — 圧倒的な実戦シェア

Ultralytics の YOLOv8 から YOLOv12 まで、そして YOLO-NAS、YOLOv9、YOLOv10 などの派生。速度と deployment のしやすさで YOLO はまだ 1 位だ。

from ultralytics import YOLO

# 事前学習モデル load
model = YOLO('yolo11x.pt')

# 自前データセットで fine-tune
results = model.train(
    data='factory_parts.yaml',  # train/val の path + class 名
    epochs=100,
    imgsz=640,
    batch=32,
    device=0,
    optimizer='AdamW',
    lr0=0.001,
    cos_lr=True,
    patience=20,  # early stopping
    project='runs/factory',
)

# ONNX に export(edge 配備)
model.export(format='onnx', dynamic=True, simplify=True)
# TensorRT に export(Jetson)
model.export(format='engine', half=True)

factory_parts.yaml はこんな形だ。

path: /data/factory
train: images/train
val: images/val
names:
  0: scratch
  1: dent
  2: discoloration
  3: missing_screw

YOLO の弱み: NMS ベースなので密集した小さい object に弱く、DETR 系より global context が弱い

DETR family — NMS 不要の transformer detection

DETR(DEtection TRansformer) は object query と Hungarian matching で NMS を取り除いた。2026 年では RT-DETR が実用的な選択だ。

from transformers import RTDetrV2ForObjectDetection, RTDetrImageProcessor

processor = RTDetrImageProcessor.from_pretrained('PekingU/rtdetr_v2_r50vd')
model = RTDetrV2ForObjectDetection.from_pretrained(
    'PekingU/rtdetr_v2_r50vd',
    num_labels=12,
    ignore_mismatched_sizes=True,
)

YOLO vs DETR — 意思決定

状況推奨
30 fps 以上の edge 推論YOLO
COCO 並の object 密度YOLO
密な小さい object(衛星、medical)RT-DETR または Co-DETR
text prompt で unseen class を detectGrounding DINO / OWLv2
動画 tracking まで必要YOLO + ByteTrack または SAM 2

OpenMMLab はいつ使うか

mmdetectionmmsegmentation などの OpenMMLab エコシステムは研究・実験に強い。同じ codebase で 50 種類以上の detection モデルを比較でき、config 1 行で backbone を入れ替えられる。ただし学習曲線が急で、deployment は別 tool が必要。production の最初のモデルとしては Ultralytics の方が圧倒的に速い。


5 章 · segmentation と SAM 2

segmentation は「pixel 単位でどこ」だ。2026 年では SAM 2 がほぼ全ケースの出発点になる。

SAM 2 — 画像と動画の両方を扱う promptable segmentation

Meta が 2024 年 7 月に公開した SAM 2 は 「click・box・mask の prompt を与えれば、どんな object でも分割し、video frame 間で自動 tracking する」 モデルだ。要点:

from sam2.build_sam import build_sam2
from sam2.sam2_image_predictor import SAM2ImagePredictor
import numpy as np
from PIL import Image

sam2 = build_sam2('configs/sam2.1/sam2.1_hiera_l.yaml', 'sam2.1_hiera_large.pt')
predictor = SAM2ImagePredictor(sam2)

img = np.array(Image.open('part.jpg'))
predictor.set_image(img)

# click 1 回で mask
point_coords = np.array([[450, 320]])
point_labels = np.array([1])  # 1 = foreground
masks, scores, _ = predictor.predict(
    point_coords=point_coords,
    point_labels=point_labels,
    multimask_output=True,
)

SAM 2 の本当の使い方 — 「分割は SAM、分類は別」

SAM 2 はそれが何かを教えてくれない。「この mask は object 1、あの mask は object 2」 と言うだけだ。semantic label が欲しければ 2 段階の pipeline になる。

  1. SAM 2 で mask 生成
  2. 各 mask 領域を切り出して CLIP または SigLIP で分類

これが 2026 年の「zero-shot segmentation」の標準レシピだ。label データなしで動く。

HQ-SAM、MobileSAM、EfficientSAM の位置


6 章 · VLM — 自然言語で画像を扱う時代

Vision-Language Model は 「画像を LLM の入力 token に変換」 する。user は自然言語で問い、モデルは自然言語で答える。

2026 年の主要 VLM

モデル強み弱み
Claude Sonnet/Opus Visionchart・diagram・document OCR・reasoningAPI only、価格
Gemini 2.5 Pro Vision長い video、multi image、多言語 OCRAPI only
GPT-5 Vision一般 reasoning、code との結合API only
Qwen2.5-VL 72B / 7Bopen weight、GUI 理解、videoself-host が必要
LLaVA-OneVision / LLaVA-1.6学習レシピ公開、研究向けfrontier より弱い
InternVL3 78B / 8Bmulti image、document、open weight の覇者VRAM 要求が大きい
Molmopointing 能力、データ透明accuracy 平均的
Pixtral 12BMistral の open VLMOCR が弱い

VLM を「prompt だけ」で使うとき

label データがほぼなく、class が頻繁に変わり、「なぜそう判断したか」の説明が必要な場合 — VLM に写真と system prompt だけ投げるのが ROI 最高だ。

import anthropic
import base64

client = anthropic.Anthropic()

with open('part.jpg', 'rb') as f:
    img_b64 = base64.standard_b64encode(f.read()).decode()

resp = client.messages.create(
    model='claude-opus-4-7',
    max_tokens=512,
    system=(
        'あなたは自動車部品の検査員だ。写真を見て、次の JSON のみで答えよ。'
        'schema: {"defect": one of [scratch, dent, discoloration, missing_screw, none], '
        '"severity": one of [low, medium, high], "reasoning": short string}'
    ),
    messages=[{
        'role': 'user',
        'content': [
            {'type': 'image', 'source': {'type': 'base64', 'media_type': 'image/jpeg', 'data': img_b64}},
            {'type': 'text', 'text': 'この部品を検査せよ。'},
        ],
    }],
)
print(resp.content[0].text)

VLM の限界 — 万能ではない


7 章 · どの task → どの architecture matrix

上の 6 章を 1 枚の表に圧縮する。最初のモデルを選ぶときはこの表だけで 80% は正解できる。

taskデータ 1k 以下データ 10k〜100kデータ 100k 以上label ほぼなし
image classificationCLIP zero-shot または ConvNeXt-T fine-tuneConvNeXt-Base、ViT-BEVA-02、DINOv2-L 事前学習後 headCLIP/SigLIP zero-shot
object detectionYOLO11n + 強い augmentationYOLO11x または RT-DETRDETR 派生 + 自前 backbone 事前学習Grounding DINO、OWLv2
segmentationSAM 2 + CLIP labelSAM 2 fine-tune または Mask2FormerMask2Former + Swin v2SAM 2 zero-shot
OCRTrOCR fine-tuneTrOCR または PaddleOCR自前学習 + データ合成Claude/Gemini Vision
captioningBLIP-2 promptBLIP-2 または LLaVA fine-tuneInternVL3 fine-tuneVLM 直接呼ぶ
visual QAVLM API 直接LLaVA-OneVision LoRAQwen2.5-VL 72B fine-tuneVLM API 直接
anomaly detectionPatchCore、PaDiMEfficientAD自前学習 + 合成欠陥DINOv2 embedding + kNN

1 行ルール: データ少なら事前学習済みの巨大 backbone + 小さな head。データ多なら自前学習。label がないなら VLM または embedding。


8 章 · データ — どれくらい、どうやって、どこから

「モデルよりデータが重要」というクリシェは 2026 年でも事実だ。

必要なデータ量(目安)

taskclass あたり最小推奨十分
classification(強い事前学習を使う)505005,000
object detection200 box2,000 box20,000 box
segmentation(SAM 2 で減らせる)50 mask500 mask5,000 mask
OCR(line 単位)1,000 line10,000 line100,000 line
VLM fine-tune(LoRA)200 例2,000 例20,000 例

2026 年でも生きている公開データセット

labeling tool — 2026 年の実用比較

tool強み弱み価格
Label Studioopen source、全 task 対応UI 重い無料 / Enterprise 有料
CVATvideo detection・segmentation 最強、open sourcehost 負担無料 / Cloud 有料
Roboflow立ち上げ速い、自動 labeling、SAM 統合cloud 依存Free/Team/Enterprise
V7 Darwinmedical・複雑な workflow価格有料
Encordvideo・LLM/VLM 評価価格有料
Scale AI / Surge AIhuman annotation 外注単価時間または label 単位

2026 年の labeling の秘密: 1 次は SAM 2 + Grounding DINO で自動 labeling → Roboflow/CVAT で人が修正。labeling 時間が 5〜10 倍縮む。


9 章 · train vs fine-tune vs prompt — cost モデル

戦略データ要求学習 cost推論 cost変更 costaccuracy 上限
ゼロから学習1 億画像以上10 万ドル以上最も低い非常に大きい非常に高い
全 fine-tune1 万〜100 万100〜1 万ドル低い小さい高い
LoRA/QLoRA fine-tune200〜5 万10〜1,000 ドル低い非常に小さい中〜高
prompt(VLM)0〜数十例0 ドル最も高い0モデルの限界まで
embedding + kNN50〜5,0000〜100 ドル低い小さい

ルール: データが増えるほど学習 cost が正当化される。推論 traffic が増えるほど自前モデルが正当化される。 両軸を同時に見る必要がある。

LoRA / QLoRA — VLM fine-tune の実戦標準

VLM を full fine-tune するのは 80 GB VRAM 4 枚時代でも厳しい。LoRA が答えだ。

from transformers import AutoModelForVision2Seq, AutoProcessor
from peft import LoraConfig, get_peft_model
from trl import SFTTrainer, SFTConfig
import torch

model_id = 'Qwen/Qwen2.5-VL-7B-Instruct'
processor = AutoProcessor.from_pretrained(model_id)
model = AutoModelForVision2Seq.from_pretrained(
    model_id,
    torch_dtype=torch.bfloat16,
    device_map='auto',
)

lora_cfg = LoraConfig(
    r=16,
    lora_alpha=32,
    target_modules=['q_proj', 'k_proj', 'v_proj', 'o_proj'],
    lora_dropout=0.05,
    bias='none',
    task_type='CAUSAL_LM',
)
model = get_peft_model(model, lora_cfg)
model.print_trainable_parameters()  # 通常 0.1〜1% のみ学習

cfg = SFTConfig(
    output_dir='runs/qwen-vl-defect',
    num_train_epochs=3,
    per_device_train_batch_size=2,
    gradient_accumulation_steps=8,
    learning_rate=1e-4,
    lr_scheduler_type='cosine',
    warmup_ratio=0.03,
    bf16=True,
    gradient_checkpointing=True,
    logging_steps=20,
    save_strategy='epoch',
)

# train_dataset は {"image": PIL.Image, "messages": [...]} の sequence
trainer = SFTTrainer(model=model, args=cfg, train_dataset=train_ds, processing_class=processor)
trainer.train()

QLoRA(4 bit 量子化 + LoRA) なら 24 GB VRAM 1 枚で 7B の VLM の fine-tune が可能だ。70B 級は 80 GB 1 枚。


10 章 · deployment — ONNX、TensorRT、Core ML、TFLite

学習は終わりの始まりだ。deployment 段階で誤った選択をすると推論 cost が 10 倍かかる。

deployment target 別推奨

target推奨 format備考
NVIDIA GPU serverTensorRT または ONNX + TensorRT EPFP16/INT8 量子化、dynamic batch
CPU serverONNX Runtime、OpenVINOINT8 量子化必須、AVX-512 活用
Jetson(edge GPU)TensorRTmodel 別に engine build、JetPack version 一致
iOSCore MLcoremltools で変換、ANE 活用
AndroidTFLite、LiteRT、ONNX Runtime MobileNNAPI または GPU delegate
web browserONNX Runtime Web、WebGPUmodel サイズ 1〜50 MB
local desktop LLM/VLMllama.cpp(GGUF)、Ollama、MLXApple Silicon が強力

PyTorch → ONNX → TensorRT の流れ

import torch
import torch.onnx
from ultralytics import YOLO

model = YOLO('runs/factory/best.pt')

# 1) ONNX
model.export(format='onnx', dynamic=True, simplify=True, opset=17)

# 2) TensorRT(NVIDIA GPU) — Ultralytics が直接 support
model.export(format='engine', half=True, workspace=4)

手動でやるなら trtexec --onnx=model.onnx --saveEngine=model.engine --fp16 が最も簡単だ。INT8 量子化には calibration dataset が必要。

Core ML / TFLite — mobile

# Core ML
import coremltools as ct
mlmodel = ct.convert(traced_model, inputs=[ct.ImageType(shape=(1, 3, 224, 224))])
mlmodel.save('Model.mlpackage')

# TFLite(PyTorch → TF は ai-edge-torch 推奨)
import ai_edge_torch
edge_model = ai_edge_torch.convert(model.eval(), sample_inputs)
edge_model.export('model.tflite')

11 章 · failure mode — 現場でぶつかる本当の問題たち

症状原因対処
validation accuracy 99%、production 70%distribution shift(domain shift)production sample で追加学習または domain adaptation
1 つの class だけ良く当たるclass imbalancefocal loss、class-balanced sampler、oversampling
推論 memory 爆発dynamic shape、batch 1 のみで学習dynamic axes export、max batch 固定
同じ写真に違う結果nondeterminism、half precisionseed 固定、FP32 検証、torch.backends.cudnn.deterministic
小さい object を取りこぼす入力解像度が低い、anchor 不一致入力解像度を上げる、slice-and-merge(SAHI)
VLM が JSON を守らないprompt が弱いtool use を強制、または response_format=json_schema
label noiseannotation 品質が低いannotator 間合意(IAA) を測定、confident learning
学習後に汎化失敗data leak、validation set が train と重複hash ベース分割、時間基準分割
GPU 使用率 30%data loader bottleneckworker 増、persistent workers、NVIDIA DALI
学習が発散learning rate 過大、gradient explosionwarmup 延長、grad clip、mixed precision を切って debug

現場の格言: 「accuracy が出ないならモデルを変えるな、データを見直せ。5 回中 4 回はデータの問題だ。」


12 章 · decision tree — 30 秒で決める

新しい vision 問題が来たらこの順序で問う。

  1. 「この問題、VLM 1 発で解ける?」 — Claude/Gemini Vision に写真 10 枚を手で投げてみよう。90% accuracy が出るならそれが baseline だ。
  2. 「label データはあるか?」 — なければ VLM または zero-shot(CLIP、Grounding DINO、SAM 2)。
  3. 「label が 1 万枚以上あるか?」 — Yes なら自前学習。No なら事前学習 + fine-tune。
  4. 「edge で動かす必要があるか?」 — Yes なら CNN または小さい YOLO。No なら ViT 自由。
  5. 「30 fps 以上必要か?」 — Yes なら YOLO + TensorRT/Core ML。No なら DETR 系も OK。
  6. 「なぜそう判断したかの説明が必要か?」 — Yes なら VLM または attention 可視化。No なら通常モデル。
  7. **「エラーの代償が大きいか?」(medical・自動運転) — Yes なら ensemble、calibration、human-in-the-loop。

この 7 つの問いで最初のモデル選択の 80% は終わる。


エピローグ — checklist、anti-pattern、次回予告

最初の vision モデルを作る前の checklist

よく見る anti-pattern

次回予告


参考 / References

architecture 論文

tool / library

labeling tool

dataset

deployment / 推論

VLM API

コメント

まだコメントはありません。

ログインするとコメントできます