计算机视觉
→ 返回应用领域
计算机视觉(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)