关于 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 进行视觉分析
使用多模态大模型处理复杂视觉任务:
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