Computer Vision Helper について
Computer Vision Helperは、画像解析やビジュアルAIを実装する開発者向けのスキルです。データ、精度、デプロイ制約に応じた手法選びを支援し、分類からセグメンテーションまでの手順を扱います。
主な機能
- 01タスクとリソースに応じた手法選定
- 02画像分類とモデル学習の実装
- 03検出、セグメンテーション、OCRの解説
- 04モデル最適化と推論パイプラインのデプロイ
- 05ビジョン言語モデルによるゼロショット分析
活用シーン
- 01新しいビジョンタスクの手法比較
- 02小規模データセットでの画像分類器学習
- 03ビジョンモデルの最適化とデプロイ
- 04学習データなしでの画像分類
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ jmsktm/ claude-settings --skill computer-vision-helperインストール後、Claude Code で/computer-vision-helperを入力して読み込まれたか確認します。
詳細
コンピュータービジョンヘルパー
コンピュータービジョンヘルパーのスキルでは、画像分析やビジュアル AI タスクの実装を支援します。基本的な画像分類から複雑な物体検出やセグメンテーションまで、このスキルを活用することで、最新のコンピュータービジョン技術を効果的に利用できます。
コンピュータービジョンは、ディープラーニング、そして現在ではビジョン言語モデルによって大きく変化しています。このスキルでは、従来のアプローチ(CNN、事前学習済みモデル)と最先端の技術(CLIP、GPT-4V、Segment Anything)の両方を扱います。精度要件、利用可能なデータ、デプロイの制約に基づいて、適切なアプローチを選択するのに役立ちます。
製品認識、ドキュメント分析、医療画像、その他のビジュアル AI アプリケーションを構築する場合でも、このスキルを使えば、全体像を理解し、実用的なソリューションを実装できます。
主要なワークフロー
ワークフロー 1:コンピュータービジョンのアプローチを選択する
- タスクを定義します:
- 分類:この画像はどのカテゴリに属しますか?
- 検出:この画像内の物体はどこにありますか?
- セグメンテーション:ピクセルレベルの物体境界
- OCR:画像からテキストを抽出する
- 類似度:類似した画像を見つける
- 生成:画像を作成または変更する
- 利用可能なリソースを評価します:
- トレーニングデータの量と品質
- 計算予算(トレーニングと推論)
- レイテンシ要件
- 必要な精度
- アプローチを選択します:
タスク トレーニングデータなし 小規模データセット 大規模データセット 分類 CLIP、GPT-4V 転移学習 ファインチューニング/トレーニング 検出 GPT-4V、Grounding DINO YOLO のファインチューニング カスタムモデルのトレーニング セグメンテーション SAM SAM のファインチューニング カスタムモデルのトレーニング OCR クラウド API、Tesseract ファインチューニング カスタムモデルのトレーニング - 実装を計画します
- アプローチの根拠を記録します
ワークフロー 2:画像分類を実装する
- データを準備します:
# Data loading with augmentation transform = transforms.Compose([ transforms.Resize(256), transforms.CenterCrop(224), transforms.RandomHorizontalFlip(), transforms.ColorJitter(brightness=0.2, contrast=0.2), transforms.ToTensor(), transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) ]) dataset = ImageFolder(root='data/', transform=transform) dataloader = DataLoader(dataset, batch_size=32, shuffle=True) - モデルをセットアップします:
# Transfer learning from pretrained model model = models.resnet50(pretrained=True) # Freeze early layers for param in model.parameters(): param.requires_grad = False # Replace classifier head model.fc = nn.Linear(model.fc.in_features, num_classes) - 検証を行いながらトレーニングします
- テストセットで評価します
- デプロイに向けて最適化します
ワークフロー 3:ビジョンモデルをデプロイする
- モデルを最適化します:
- 量子化(INT8)
- プルーニング
- ONNX エクスポート
- TensorRT 最適化
- 推論パイプラインをセットアップします:
class VisionPipeline: def __init__(self, model_path): self.model = load_optimized_model(model_path) self.preprocessor = ImagePreprocessor() def predict(self, image): # Preprocess tensor = self.preprocessor.process(image) # Inference with torch.no_grad(): output = self.model(tensor) # Postprocess return self.postprocess(output) def predict_batch(self, images): tensors = [self.preprocessor.process(img) for img in images] batch = torch.stack(tensors) with torch.no_grad(): outputs = self.model(batch) return [self.postprocess(out) for out in outputs] - 対象環境にデプロイします
- パフォーマンスを監視します
クイックリファレンス
| 操作 | コマンド/トリガー |
|---|---|
| アプローチを選択する | 「[task] に適した CV アプローチは?」 |
| 画像を分類する | 「画像分類器を構築する」 |
| 物体を検出する | 「[use case] 向けの物体検出」 |
| テキストを抽出する | 「画像から OCR」 |
| ゼロショットビジョン | 「トレーニングデータなしで画像を分類する」 |
| モデルを最適化する | 「ビジョンモデルを高速化する」 |
ベストプラクティス
-
事前学習済みモデルから始める:必要な場合を除き、ゼロからトレーニングしないでください
- 汎用的なビジョンには ImageNet 事前学習済みモデルを使用する
- 利用可能であれば、ドメイン固有のモデルを使用する
- ゼロショット機能には CLIP/GPT-4V を使用する
-
量よりデータ品質を重視する:クリーンでバランスの取れたデータが重要です
- ラベルの誤りがある画像や重複画像を削除する
- クラスのバランスを取るか、重み付きトレーニングを使用する
- テストセットにエッジケースを含める
-
拡張は慎重に行う:拡張は実際の変動を反映する必要があります
- 本番環境の条件を再現する拡張を使用する
- タスクに関連する特徴を損なうような拡張は避ける
- 拡張が有効かテストし、決めつけない
-
正しく検証する:画像データはリークしやすいです
- 拡張されたバージョンではなく、一意な画像ごとに分割する
- 被写体単位での分割を検討する(同じ人物が別々の写真に写っている場合など)
- 完全に学習から分離されたデータでテストする
-
対象ハードウェアに合わせて最適化する:推論が重要です
- デプロイの制約(エッジかクラウドか)を把握する
- ボトルネックをプロファイリングして最適化する
- スループットを考慮してバッチサイズを検討する
-
エッジケースに対応する:実際の画像にはさまざまな問題があります
- さまざまな照明条件
- 回転、ぼけ、オクルージョン
- 一般的でないアスペクト比
- 分布外の入力
高度な技術
ゼロショット向けビジョン言語モデル
トレーニングなしの分類には CLIP を使用します:
import clip
model, preprocess = clip.load("ViT-B/32")
def zero_shot_classify(image, labels):
# Prepare image
image_tensor = preprocess(image).unsqueeze(0)
# Prepare text prompts
text_prompts = [f"a photo of a {label}" for label in labels]
text_tokens = clip.tokenize(text_prompts)
# Get embeddings
with torch.no_grad():
image_features = model.encode_image(image_tensor)
text_features = model.encode_text(text_tokens)
# Compute similarities
similarities = (image_features @ text_features.T).softmax(dim=-1)
return {label: sim.item() for label, sim in zip(labels, similarities[0])}
視覚分析のためのGPT-4V
複雑なビジョンタスクにマルチモーダルLLMを使用します:
def analyze_image(image_path, question):
import base64
from openai import OpenAI
# Encode image
with open(image_path, "rb") as f:
image_data = base64.b64encode(f.read()).decode()
client = OpenAI()
response = client.chat.completions.create(
model="gpt-4-vision-preview",
messages=[{
"role": "user",
"content": [
{"type": "text", "text": question},
{"type": "image_url", "image_url": {
"url": f"data:image/jpeg;base64,{image_data}"
}}
]
}],
max_tokens=500
)
return response.choices[0].message.content
YOLOによる物体検出
高速で高精度な物体検出:
from ultralytics import YOLO
# Load pretrained model
model = YOLO("yolov8n.pt")
# Fine-tune on custom dataset
model.train(
data="custom_dataset.yaml",
epochs=100,
imgsz=640,
batch=16
)
# Inference
results = model.predict(source="image.jpg", conf=0.5)
for result in results:
boxes = result.boxes
for box in boxes:
xyxy = box.xyxy[0].tolist() # Bounding box
conf = box.conf[0].item() # Confidence
cls = box.cls[0].item() # Class ID
print(f"Detected {cls} at {xyxy} with confidence {conf}")
Segment Anything(SAM)
汎用的なセグメンテーション:
from segment_anything import sam_model_registry, SamPredictor
# Load SAM
sam = sam_model_registry["vit_h"](checkpoint="sam_vit_h.pth")
predictor = SamPredictor(sam)
# Set image
predictor.set_image(image)
# Segment with point prompt
masks, scores, logits = predictor.predict(
point_coords=np.array([[500, 375]]), # Click point
point_labels=np.array([1]), # 1 = foreground
multimask_output=True
)
# Segment with box prompt
masks, scores, logits = predictor.predict(
box=np.array([x1, y1, x2, y2])
)
モデル最適化パイプライン
モデルを本番環境向けに準備します:
def optimize_for_deployment(model, sample_input):
# Step 1: Export to ONNX
torch.onnx.export(
model,
sample_input,
"model.onnx",
opset_version=13,
dynamic_axes={"input": {0: "batch"}}
)
# Step 2: Quantize (INT8)
from onnxruntime.quantization import quantize_dynamic
quantize_dynamic(
"model.onnx",
"model_quantized.onnx",
weight_type=QuantType.QInt8
)
# Step 3: Benchmark
import onnxruntime as ort
session = ort.InferenceSession("model_quantized.onnx")
benchmark_inference(session, sample_input)
return "model_quantized.onnx"
避けるべきよくある落とし穴
- 転移学習で対応できるのに、ゼロから学習する
- タスクに応じた適切なデータ拡張を行わない
- 不適切な訓練/テストデータ分割によるデータリーク
- 訓練データのクラス不均衡を無視する
- 正則化を行わずに訓練データに過剰適合する
- 多様な実世界の画像でテストしない
- レイテンシとスループットのテストを行わずにデプロイする
- テストせずに、あらゆる種類の画像でモデルが動作すると想定する