跳转至

计算机视觉(CV)

概述

计算机视觉(Computer Vision,CV)是AI的重要分支,让计算机能够理解和分析图像/视频数据。

图像基础

图像表示

import cv2
import numpy as np
from PIL import Image

# 读取图像
img = cv2.imread('image.jpg')
print(f"图像形状: {img.shape}")  # (高度, 宽度, 通道)

# 转灰度
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 显示图像
cv2.imshow('Image', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

图像预处理

import torch
from torchvision import transforms

# 定义预处理流程
transform = transforms.Compose([
    transforms.Resize((224, 224)),
    transforms.ToTensor(),
    transforms.Normalize(
        mean=[0.485, 0.456, 0.406],
        std=[0.229, 0.224, 0.225]
    )
])

# 加载图像
from PIL import Image
img = Image.open('image.jpg')
img_tensor = transform(img)
print(f"张量形状: {img_tensor.shape}")  # [3, 224, 224]

图像分类

使用预训练模型

import torch
from torchvision import models, transforms
from PIL import Image

# 加载预训练的ResNet
model = models.resnet50(pretrained=True)
model.eval()

# 预处理
transform = transforms.Compose([
    transforms.Resize(256),
    transforms.CenterCrop(224),
    transforms.ToTensor(),
    transforms.Normalize([0.485, 0.456, 0.406], 
                        [0.229, 0.224, 0.225])
])

# 加载和预处理图像
img = Image.open('cat.jpg')
img_tensor = transform(img).unsqueeze(0)

# 预测
with torch.no_grad():
    output = model(img_tensor)
    probabilities = torch.nn.functional.softmax(output[0], dim=0)

# 获取Top-5预测
top5_prob, top5_idx = torch.topk(probabilities, 5)
for prob, idx in zip(top5_prob, top5_idx):
    print(f"Class {idx.item()}: {prob.item():.2%}")

目标检测

YOLO目标检测

from ultralytics import YOLO

# 加载YOLO模型
model = YOLO('yolov8n.pt')

# 检测
results = model('image.jpg')

# 可视化
for result in results:
    boxes = result.boxes
    for box in boxes:
        x1, y1, x2, y2 = box.xyxy[0]
        conf = box.conf[0]
        cls = box.cls[0]
        print(f"Class: {int(cls)}, Confidence: {conf:.2f}")

检测结果可视化

import cv2

def draw_boxes(image, detections):
    for det in detections:
        x1, y1, x2, y2 = det['bbox']
        label = det['class']
        conf = det['confidence']

        # 绘制边界框
        cv2.rectangle(image, (x1, y1), (x2, y2), (0, 255, 0), 2)

        # 添加标签
        text = f"{label}: {conf:.2f}"
        cv2.putText(image, text, (x1, y1-10), 
                    cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)

    return image

图像分割

语义分割

import torch
from torchvision import models

# 加载预训练的分割模型
model = models.segmentation.deeplabv3_resnet50(pretrained=True)
model.eval()

# 预处理
transform = transforms.Compose([
    transforms.ToTensor(),
    transforms.Normalize(mean=[0.485, 0.456, 0.406],
                        std=[0.229, 0.224, 0.225])
])

# 分割
with torch.no_grad():
    output = model(img_tensor)['out']
    predictions = torch.argmax(output.squeeze(), dim=0)

实例分割(Mask R-CNN)

from torchvision.models.detection import maskrcnn_resnet50_fpn

# 加载Mask R-CNN
model = maskrcnn_resnet50_fpn(pretrained=True)
model.eval()

# 预测
with torch.no_grad():
    predictions = model(img_tensor.unsqueeze(0))

# 获取预测结果
boxes = predictions[0]['boxes']
labels = predictions[0]['labels']
scores = predictions[0]['scores']
masks = predictions[0]['masks']

人脸识别

使用face_recognition库

import face_recognition

# 加载已知人脸
known_image = face_recognition.load_image_file("known_face.jpg")
known_encoding = face_recognition.face_encodings(known_image)[0]

# 加载待识别图像
unknown_image = face_recognition.load_image_file("unknown_face.jpg")
unknown_encodings = face_recognition.face_encodings(unknown_image)

# 比较人脸
for encoding in unknown_encodings:
    matches = face_recognition.compare_faces(
        [known_encoding], encoding, tolerance=0.6
    )
    if matches[0]:
        print("匹配成功!")
    else:
        print("未匹配")

图像生成

GAN基础

import torch
import torch.nn as nn

# 生成器
class Generator(nn.Module):
    def __init__(self, latent_dim=100):
        super(Generator, self).__init__()
        self.model = nn.Sequential(
            nn.Linear(latent_dim, 128),
            nn.LeakyReLU(0.2),
            nn.Linear(128, 256),
            nn.BatchNorm1d(256),
            nn.LeakyReLU(0.2),
            nn.Linear(256, 512),
            nn.BatchNorm1d(512),
            nn.LeakyReLU(0.2),
            nn.Linear(512, 784),
            nn.Tanh()
        )

    def forward(self, z):
        return self.model(z)

# 判别器
class Discriminator(nn.Module):
    def __init__(self):
        super(Discriminator, self).__init__()
        self.model = nn.Sequential(
            nn.Linear(784, 512),
            nn.LeakyReLU(0.2),
            nn.Linear(512, 256),
            nn.LeakyReLU(0.2),
            nn.Linear(256, 1),
            nn.Sigmoid()
        )

    def forward(self, img):
        return self.model(img)

Stable Diffusion图像生成

from diffusers import StableDiffusionPipeline
import torch

# 加载模型
pipe = StableDiffusionPipeline.from_pretrained(
    "runwayml/stable-diffusion-v1-5",
    torch_dtype=torch.float16
)
pipe = pipe.to("cuda")

# 生成图像
prompt = "A beautiful landscape painting, mountains and lake"
image = pipe(prompt).images[0]
image.save("generated_image.png")

视频分析

视频流处理

import cv2

# 打开视频
cap = cv2.VideoCapture('video.mp4')

while cap.isOpened():
    ret, frame = cap.read()
    if not ret:
        break

    # 处理帧
    # ... 在这里添加你的处理逻辑

    # 显示
    cv2.imshow('Frame', frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

运动检测

import cv2
import numpy as np

# 背景减除器
bg_subtractor = cv2.createBackgroundSubtractorMOG2()

cap = cv2.VideoCapture('video.mp4')

while cap.isOpened():
    ret, frame = cap.read()
    if not ret:
        break

    # 前景掩码
    mask = bg_subtractor.apply(frame)

    # 形态学操作
    kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5))
    mask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel)

    # 寻找轮廓
    contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, 
                                   cv2.CHAIN_APPROX_SIMPLE)

    for contour in contours:
        if cv2.contourArea(contour) > 500:
            x, y, w, h = cv2.boundingRect(contour)
            cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2)

数据增强

Albumentations库

import albumentations as A
from albumentations.pytorch import ToTensorV2

# 定义增强流程
transform = A.Compose([
    A.RandomCrop(224, 224),
    A.HorizontalFlip(p=0.5),
    A.VerticalFlip(p=0.5),
    A.RandomBrightnessContrast(p=0.2),
    A.Rotate(limit=30, p=0.5),
    A.Normalize(mean=(0.485, 0.456, 0.406), 
                std=(0.229, 0.224, 0.225)),
    ToTensorV2()
])

# 应用增强
augmented = transform(image=image)
image_tensor = augmented['image']

评估指标

指标 适用任务 说明
Accuracy 分类 整体准确率
mAP 检测 平均精度均值
IoU 分割 交并比
PSNR 超分辨率 峰值信噪比
SSIM 超分辨率 结构相似性

下一步学习

  1. 深入学习CNN架构(ResNet, EfficientNet)
  2. 探索目标检测算法(YOLO, Faster R-CNN)
  3. 研究图像生成模型(GAN, Diffusion)