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

最简单的情况是目标定位(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、注意力机制将带我们进入另一个精彩的领域:让机器理解和生成语言。