mcpField
C
Computer Vision Helper

Computer Vision Helper

github.com/jmsktm开发10213 次安装40 周前更新
代码仓库

关于 Computer Vision Helper

Computer Vision Helper 是面向实现图像分析与视觉 AI 任务的技能,帮助开发者根据数据、精度和部署限制选择方法,并覆盖从分类到分割的流程。

主要功能

  1. 01按任务和资源选择视觉方法
  2. 02实现图像分类与模型训练
  3. 03涵盖检测、分割和 OCR
  4. 04优化模型并部署推理流程
  5. 05介绍视觉语言模型零样本分析

适用场景

  1. 01为新视觉任务比较可用方法
  2. 02用小型数据集训练图像分类器
  3. 03将视觉模型优化后部署
  4. 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:选择计算机视觉方法
  1. 定义任务:
    • 分类:这张图像属于什么类别?
    • 检测:这张图像中的物体在哪里?
    • 分割:确定物体的像素级边界
    • OCR:从图像中提取文本
    • 相似度:查找相似图像
    • 生成:创建或修改图像
  2. 评估可用资源:
    • 训练数据的数量和质量
    • 计算预算(训练和推理)
    • 延迟要求
    • 准确率需求
  3. 选择方法:
    任务无训练数据小型数据集大型数据集
    分类CLIP、GPT-4V迁移学习微调/训练
    检测GPT-4V、Grounding DINO微调 YOLO自定义训练
    分割SAM微调 SAM自定义训练
    OCR云 API、Tesseract微调自定义训练
  4. 规划实现方案
  5. 记录方法选择依据
工作流 2:实现图像分类
  1. 准备数据:
    # 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)
    
  2. 设置模型:
    # 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. 使用验证集进行训练
  4. 在测试集上评估
  5. 优化以便部署
工作流 3:部署视觉模型
  1. 优化模型:
    • 量化(INT8)
    • 剪枝
    • 导出 ONNX
    • TensorRT 优化
  2. 设置推理流水线:
    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]
    
  3. 将模型部署到目标环境
  4. 监控性能

快速参考

操作命令/触发语
选择方法“针对 [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 进行视觉分析

使用多模态大模型处理复杂视觉任务:

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"

应避免的常见陷阱

  • 明明可以使用迁移学习,却从头开始训练
  • 未针对任务恰当地增强数据
  • 训练集和测试集划分不当导致数据泄漏
  • 忽视训练数据中的类别不平衡
  • 未使用正则化,导致对训练数据过拟合
  • 未在多样化的真实图像上进行测试
  • 未测试延迟和吞吐量就部署
  • 未经测试就假定模型适用于所有类型的图像

评论

支持 Markdown