计算机视觉

返回应用领域

计算机视觉(CV)让机器能理解和处理图像与视频。深度学习极大推动了 CV 的发展,从分类到生成,现代 CV 模型在许多任务上已超越人类。


核心任务

任务说明代表模型
图像分类识别图像中的主体类别ResNet、ViT、EfficientNet
目标检测定位并识别图中所有目标(边界框 + 类别)YOLO、DETR、Faster R-CNN
语义分割每个像素分配类别标签SegFormer、DeepLab
实例分割区分同类别的不同个体Mask R-CNN、SAM
图像生成从文本/噪声生成图像Stable Diffusion、DALL-E、Flux
图像描述用自然语言描述图像内容BLIP-2、LLaVA
视频理解动作识别、视频摘要VideoMAE、Gemini
3D 视觉深度估计、点云处理DepthAnything、PointNet

核心架构演进

CNN 时代(2012–2020)

输入图像 → 卷积层(提取局部特征)→ 池化层(降维)→ 全连接层 → 输出

里程碑:

  • AlexNet(2012):深度学习进入 CV 的起点
  • VGG:更深的网络,3×3 小卷积核
  • ResNet:残差连接解决梯度消失,可训练 152 层
  • EfficientNet:复合缩放,精度效率最优

ViT 时代(2020–至今)

将图像切分为 Patch,用 Transformer 处理序列:

图像 → 切分为 16×16 patches → 线性投影为 token → Transformer → 分类头

优势:全局注意力,大数据下超越 CNN
代表:ViT、DeiT、Swin Transformer、CLIP

扩散模型(生成领域主流)

前向过程:图像 → 逐步加噪 → 纯噪声
逆向过程:纯噪声 → 逐步去噪 → 生成图像

YOLO 目标检测快速上手

from ultralytics import YOLO
 
# 加载预训练模型
model = YOLO("yolov8n.pt")  # nano 版本,速度最快
 
# 检测图像
results = model("image.jpg")
 
for result in results:
    boxes = result.boxes
    for box in boxes:
        cls = model.names[int(box.cls)]        # 类别名
        conf = float(box.conf)                  # 置信度
        x1, y1, x2, y2 = box.xyxy[0].tolist() # 坐标
        print(f"{cls}: {conf:.2f} @ [{x1:.0f},{y1:.0f},{x2:.0f},{y2:.0f}]")
 
# 实时视频检测
results = model(source=0, stream=True)  # source=0 为摄像头
for result in results:
    result.show()

SAM(Segment Anything Model)

Meta 的通用分割模型,支持点击/框/文字提示:

from segment_anything import sam_model_registry, SamPredictor
import numpy as np
 
sam = sam_model_registry["vit_h"](checkpoint="sam_vit_h.pth")
predictor = SamPredictor(sam)
 
# 设置图像
predictor.set_image(image_array)  # HxWx3 numpy array
 
# 通过点提示分割([x,y] 坐标)
masks, scores, _ = predictor.predict(
    point_coords=np.array([[500, 375]]),
    point_labels=np.array([1]),  # 1=前景点,0=背景点
    multimask_output=True,
)
best_mask = masks[scores.argmax()]

CLIP:视觉-语言对齐

OpenAI CLIP 将图像和文字映射到同一向量空间,实现零样本分类:

import torch
import clip
from PIL import Image
 
model, preprocess = clip.load("ViT-B/32", device="cuda")
 
image = preprocess(Image.open("photo.jpg")).unsqueeze(0).to("cuda")
text = clip.tokenize(["一只猫", "一只狗", "一辆车"]).to("cuda")
 
with torch.no_grad():
    image_features = model.encode_image(image)
    text_features = model.encode_text(text)
    
    # 计算相似度
    logits, _ = model(image, text)
    probs = logits.softmax(dim=-1)
    print(probs)  # 各类别概率

数据增强

import torchvision.transforms as T
 
train_transform = T.Compose([
    T.RandomHorizontalFlip(p=0.5),
    T.RandomRotation(degrees=15),
    T.ColorJitter(brightness=0.2, contrast=0.2, saturation=0.2),
    T.RandomResizedCrop(224, scale=(0.8, 1.0)),
    T.ToTensor(),
    T.Normalize(mean=[0.485, 0.456, 0.406],
                std=[0.229, 0.224, 0.225]),  # ImageNet 均值/标准差
])
 
# 更强的增强:AugMix / RandAugment / MixUp
from torchvision.transforms import v2
augmix = v2.AugMix()

迁移学习实践

import torchvision.models as models
import torch.nn as nn
 
# 加载 ImageNet 预训练模型
backbone = models.resnet50(weights=models.ResNet50_Weights.IMAGENET1K_V2)
 
# 冻结特征提取层
for param in backbone.parameters():
    param.requires_grad = False
 
# 替换分类头(适应自定义类别数)
num_classes = 10
backbone.fc = nn.Linear(backbone.fc.in_features, num_classes)
 
# 只训练分类头
optimizer = torch.optim.Adam(backbone.fc.parameters(), lr=1e-3)

相关文档