图像分类回答“这是什么?”,目标检测回答“什么在哪里?”。自动驾驶需要检测行人、车辆、交通标志的位置;安防系统需要检测异常行为的区域;医疗影像分析需要定位病变。目标检测不仅识别物体类别,还要用边界框标出位置,是计算机视觉最实用的任务之一。

最简单的情况是目标定位(Object Localization):图像中只有一个物体,输出它的类别和位置。
输出不只是类别标签,还包括边界框(Bounding Box)的四个坐标:
损失函数需要同时考虑分类和定位:
边界框损失通常用L2(均方误差)或Smooth L1。
如何判断预测的边界框好不好?交并比(Intersection over Union, IoU)是标准指标。
IoU范围在[0, 1]:
def compute_iou(box1, box2):
"""
计算两个边界框的IoU
box: [x1, y1, x2, y2] 左上角和右下角坐标
"""
# 计算交集区域
x1_inter = max(box1[0], box2[0])
y1_inter = max(box1[1], box2[1])
x2_inter = min(box1[2], box2[2])
y2_inter = min(box1[3], box2[3
目标检测算法可能对同一个物体输出多个边界框(略微不同的位置)。非极大值抑制(Non-Max Suppression, NMS)保留最好的检测,去除重复。
算法:
def non_max_suppression(boxes, scores, iou_threshold=0.5):
"""
非极大值抑制
boxes: list of [x1, y1, x2, y2]
scores: list of confidence scores
"""
# 按分数降序排列
order = sorted(range(len(scores)), key=lambda i: scores[i], reverse=True)
keep = []
while order:
# 选择分数最高的
i = order[
多类别NMS:对每个类别分别执行NMS,因为不同类别的物体可能重叠(如人骑在马上)。

传统目标检测(如R-CNN)分两步:先提议候选区域,再分类。YOLO(You Only Look Once)将检测视为回归问题,一次前向传播完成检测,实现实时处理(45 FPS)。
核心思想:
输出张量形状:
其中5是 , 是类别数。
训练目标:
优势:
劣势:
YOLOv2、v3、v4持续改进,v5、v7在速度和精度上继续提升,成为工业界最常用的检测算法之一。
如果两个物体的中心落在同一个网格怎么办?YOLO原版只能检测一个,Anchor Boxes解决了这个问题。
思路:预定义几种不同形状的Anchor(如高瘦的、宽扁的),每个Anchor预测一个物体。
假设每个网格有3个Anchor,输出变成 。训练时,每个真实物体分配给与它IoU最大的Anchor。
def assign_anchor(object_box, anchors):
"""
将物体分配给最匹配的anchor
object_box: [w, h] 归一化的宽高
anchors: list of [w, h] 预定义的anchor形状
"""
ious = []
for anchor in anchors:
# 计算IoU(假设中心对齐)
inter = min(object_box[0], anchor[0]) * min(object_box[1], anchor[1])
union = object_box[0]*object_box[
Anchor的选择:通常通过聚类训练集中的物体尺寸来确定。YOLO v2用k-means聚类找到5个Anchor,v3用9个。
用预训练的YOLOv5进行检测:
import torch
# 加载预训练的YOLOv5
model = torch.hub.load('ultralytics/yolov5', 'yolov5s', pretrained=True)
# 推理
img = 'path/to/image.jpg'
results = model(img)
# 显示结果
results.show() # 显示带框的图像
# 获取检测结果
detections = results.pandas().xyxy[0] # x1, y1, x2, y2, confidence, class, name
print(detections)自定义数据集训练:
# data.yaml
train: ./images/train
val: ./images/val
nc: 3 # 类别数
names: ['person', 'car', 'bicycle']# 训练
!python train.py --data data.yaml --weights yolov5s.pt --epochs 50标注工具推荐:LabelImg、CVAT、Roboflow。标注格式通常是YOLO格式(每张图一个txt,每行是 class x_center y_center width height)或COCO格式(JSON)。
目标检测的标准评估指标是平均精度均值(mean Average Precision, mAP)。
步骤:
mAP@0.5:IoU阈值为0.5时的mAP
mAP@[0.5:0.95]:IoU从0.5到0.95每隔0.05计算一次,取平均(COCO数据集标准)
from sklearn.metrics import average_precision_score
def compute_map(all_predictions, all_ground_truths, iou_threshold=0.5):
"""
计算mAP
all_predictions: list of (class, confidence, box)
all_ground_truths: list of (class, box)
"""
aps = []
for class_id in unique_classes:
# 该类别的预测和真实框
preds = [p for p in all_predictions if p[0] ==
高mAP意味着模型既准确(高精确率)又全面(高召回率)。SOTA模型在COCO数据集上的mAP@0.5通常在60-70%。
目标检测的应用前景
目标检测是计算机视觉商业化最成功的领域之一:
2026年,边缘设备(NVIDIA Jetson、手机NPU)上的实时检测已成为现实,为更多应用场景打开了可能。
我们已经完成了CNN模块的学习。在下面的几节中,我们将转向序列模型——处理时间序列和自然语言的核心技术。RNN、LSTM、注意力机制将带我们进入另一个精彩的领域:让机器理解和生成语言。