目录

1 目标检测

1.1 边界框(Bounding box)

1.2 代码

1.3 常用算法

1.3.1 R-CNN

1.3.2 Fast R-CNN

1.3.3 Faster R-CNN

1.3.4 Mask R-CNN

1.3.5 单发多框检测SSD

多尺度目标检测

1.3.6 YOLO

1.3.7 小结

2 语义分割Semantic Segmentation

3 序列模型


1 目标检测

1.1 边界框(Bounding box)

用来描述对象的空间位置。 边界框是矩形的,由矩形左上角的以及右下角的𝑥和𝑦坐标决定。 另一种常用的边界框表示方法是边界框中心的(𝑥,𝑦)轴坐标以及框的宽度和高度。

1.2 代码

(1)库

%matplotlib inline
import torch
from d2l import torch as d2l

d2l.set_figsize()
img = d2l.plt.imread('../img/catdog.jpg')
d2l.plt.imshow(img);

(2)边界框

#@save
def box_corner_to_center(boxes):
    """从(左上,右下)转换到(中间,宽度,高度)"""
    x1, y1, x2, y2 = boxes[:, 0], boxes[:, 1], boxes[:, 2], boxes[:, 3]
    cx = (x1 + x2) / 2
    cy = (y1 + y2) / 2
    w = x2 - x1
    h = y2 - y1
    boxes = torch.stack((cx, cy, w, h), axis=-1)
    return boxes

#@save
def box_center_to_corner(boxes):
    """从(中间,宽度,高度)转换到(左上,右下)"""
    cx, cy, w, h = boxes[:, 0], boxes[:, 1], boxes[:, 2], boxes[:, 3]
    x1 = cx - 0.5 * w
    y1 = cy - 0.5 * h
    x2 = cx + 0.5 * w
    y2 = cy + 0.5 * h
    boxes = torch.stack((x1, y1, x2, y2), axis=-1)
    return boxes

# bbox是边界框的英文缩写
dog_bbox, cat_bbox = [60.0, 45.0, 378.0, 516.0], [400.0, 112.0, 655.0, 493.0]

torch.stack((cx, cy, w, h), axis=-1):

#@save
def bbox_to_rect(bbox, color):
    # 将边界框(左上x,左上y,右下x,右下y)格式转换成matplotlib格式:
    # ((左上x,左上y),宽,高)
    return d2l.plt.Rectangle(
        xy=(bbox[0], bbox[1]), width=bbox[2]-bbox[0], height=bbox[3]-bbox[1],
        fill=False, edgecolor=color, linewidth=2)

fig = d2l.plt.imshow(img)
fig.axes.add_patch(bbox_to_rect(dog_bbox, 'blue'))
fig.axes.add_patch(bbox_to_rect(cat_bbox, 'red'));

1.3 常用算法
1.3.1 R-CNN

2014,它先找出可能有物体的区域(候选框),再用CNN对每个区域做分类和位置回归。

工作流程:

(1)Selective Search找候选区域(region proposals)

  • 输入一张图片

  • 使用传统算法(不是CNN)生成大约 2000 个候选框(Region proposals)

  • 这些框可能包含物体

(2)对每个候选框做裁剪 + resize + CNN 特征提取

   对每个 Region 裁剪出来后

  • resize 到固定大小(如 224×224)

  • 输入到 CNN(如 AlexNet)

  • 输出特征向量(4096 维)

(3)使用 SVM 分类 + 回归框调整

  CNN 提取的特征用于:

  • SVM分类器 → 判断框里是 猫 / 狗 / 人 / 背景

  • 回归器(regressor) → 调整框的位置(更准确)

1.3.2 Fast R-CNN

2015,整张图只做一次CNN → 得到特征图 → 在特征图上裁剪候选框 → 分类 + 回归。

相比R-CNN,它把速度从几十秒/张 → 0.2秒/张。

1.3.3 Faster R-CNN

2015,Faster R-CNN = Fast R-CNN + 用CNN来生成候选框Region Proposal Network(RPN)

1.3.4 Mask R-CNN

2017,Mask R-CNN = Faster R-CNN + 实例分割(Instance Segmentation)

1.3.5 单发多框检测SSD

一次前向就同时预测各位置的类别和边界框(多个预设框/anchor),速度快且精度不错,适合实时检测。

多尺度目标检测

多尺度:模型能够检测图像中不同大小的目标。

%matplotlib inline
import torch
from d2l import torch as d2l

img = d2l.plt.imread('../img/catdog.jpg')
h, w = img.shape[:2]
h, w

def display_anchors(fmap_w, fmap_h, s):
    d2l.set_figsize()
    # 前两个维度上的值不影响输出
    fmap = torch.zeros((1, 10, fmap_h, fmap_w))
    anchors = d2l.multibox_prior(fmap, sizes=s, ratios=[1, 2, 0.5])
    bbox_scale = torch.tensor((w, h, w, h))
    d2l.show_bboxes(d2l.plt.imshow(img).axes,
                    anchors[0] * bbox_scale)

display_anchors(fmap_w=4, fmap_h=4, s=[0.15])

display_anchors(fmap_w=2, fmap_h=2, s=[0.4])

display_anchors(fmap_w=1, fmap_h=1, s=[0.8])
1.3.6 YOLO

把检测看成回归问题,网络一次前向就同时预测每个网格的类别和框(速度非常快,适合实时)。

1.3.7 小结

上述算法目前已经淘汰,了解即可,目前SLAM+大模型+具身智能主流算法:

(1)实时机器人检测(SLAM 前端)

  • YOLOv8 / YOLOv9(速度最快)

  • RT-DETR(高精度 + transformer)


(2)建图 / 语义 SLAM(多任务 dense 特征)

  • DINOv2(最强 dense feature)

  • SAM / SAM2(大模型分割)

  • Mask2Former(语义分割)


(3)具身智能(Embodied AI + 大模型)

视觉backbone:

  • SigLIP

  • DINOv2

  • ViT-L / ViT-H

  • SAM2(mask-aware reasoning)

前端检测可选:

  • YOLO-World(支持开放词汇检测)

  • DINO-DETR

2 语义分割Semantic Segmentation

语义分割将图片中的每个像素分类到对应的类别。

目前主流使用Mask2Former。

3 序列模型

目标参数随时间变化而变化。典型例子量化模型,股价预测。

建模:在时间t观察到x_{t},那么得道T个不独立的随机变量(x_{1},...,x_{T})\sim p(x),条件概率展开p(a,b)=p(a)p(b|a)=p(a)p(a|b)

p(x)=p(x_{1})p(x_{2}|x_{1})p(x_{3}|x_{1},x_{2})...p(x_{T}|x_{1},...,x_{T-1})

对条件概率建模p(x_{t})p(x_{1},...,x_{T-1})=p(x_{t}|f(x_{1},...,x_{t-1}),其中f是对见过的数据建模,亦称自回归模型。

自回归模型计算方法有:

(1)马尔科夫假设

(2)潜变量模型

Logo

更多推荐