- 教程
- 人工智能
- 机器学习
- 深度学习
【免费下载链接】AI-For-Beginners
12 Weeks, 24 Lessons, AI for All!
目标检测(Object Detection)是计算机视觉中继图像分类之后的下一级核心任务:不仅要回答"图像里有什么",还要回答"物体在哪里"。本文以 AI-For-Beginners 课程中「11-ObjectDetection」一课为主线,系统讲解目标检测的朴素思路、回归定位思想、IoU/AP/mAP 评估指标,以及 R-CNN 家族与 YOLO 等主流算法,并结合仓库配套的 ObjectDetection.ipynb 实验和 Hollywood Heads 实验作业,帮助你从理论到代码完整掌握目标检测的核心方法论。
从图像分类到目标检测:任务定义的升级
此前课程讨论的图像分类模型(如 MNIST 数字识别)输入一张图片,输出的是一个类别结果——例如"这是数字 5"。但在很多实际场景中,我们不仅需要知道图片中有某个物体,更希望确定它出现的精确位置。这正是目标检测要解决的问题:同时输出物体的类别与其边界框(Bounding Box)坐标。
本课在 4-ComputerVision 计算机视觉章节 中处于承上启下的位置,前面衔接了卷积神经网络(CNN)与迁移学习,后续衔接语义分割,属于"定位 + 分类"的综合任务。
目标检测的朴素思路:切块 + 分类
假设我们要在一张图片中找到一只猫,一个非常朴素的检测思路可以这样实现:
- 把图片切分成若干小块(tiles);
- 对每一小块分别运行图像分类;
- 激活值足够高的小块,即被认为包含目标物体。
在 ObjectDetection.ipynb 中,这一思路被具体落成了代码:首先用 OpenCV 读取并填充(pad)样例图片为方形,然后加载预训练的 VGG-16 模型(ImageNet 权重),由于 ImageNet 中猫类别的索引为 281~294,通过累加这些类别的预测概率得到"整图包含猫"的综合概率:
def predict(img): im = cv2.resize(img, (224, 224)) im = keras.applications.vgg16.preprocess_input(im) pr = vgg.predict(np.expand_dims(im, axis=0))[0] return np.sum(pr[281:294]) # VGG 中猫类别的索引区间接着,将图片划分为n×n网格,对每个网格分别求猫概率,即可生成一张"概率热力图":
def predict_map(img, n): dx = img.shape[0] // n res = np.zeros((n, n), dtype=np.float32) for i in range(n): for j in range(n): im = img[dx*i:dx*(i+1), dx*j:dx*(j+1)] res[i, j] = predict(im) return res这种朴素方法虽然直观,但远非理想:它只能非常粗略地定位物体的边界框。要做到精确定位,我们需要引入回归(Regression)思想——直接预测边界框的坐标——而这需要专门的标注数据集作为支撑。
用回归预测边界框:一个可直接运行的小实验
在真实世界中物体形状复杂,但在教学实验中可以用合成数据快速验证"回归定位"的核心机制。Notebook 中的generate_images函数生成了 10 万张 8×8 的图片,每张图片中随机放置一个黑色矩形(像素值为 1),并记录其边界框:
def generate_images(num_imgs, img_size=8, min_object_size=1, max_object_size=4): bboxes = np.zeros((num_imgs, 4)) imgs = np.zeros((num_imgs, img_size, img_size)) for i_img in range(num_imgs): w, h = np.random.randint(min_object_size, max_object_size, size=2) x = np.random.randint(0, img_size - w) y = np.random.randint(0, img_size - h) imgs[i_img, x:x+w, y:y+h] = 1. bboxes[i_img] = [x, y, w, h] return imgs, bboxes为了把网络输出限制在 [0,1] 区间,边界框坐标需要除以图像尺寸归一化(bboxes / 8.0)。这里采用一个简单的全连接网络完成回归,因为任务是回归问题,优化器选用随机梯度下降(SGD),损失函数选用均方误差(MSE):
model = keras.Sequential([ keras.layers.Flatten(input_shape=(8, 8)), keras.layers.Dense(200, activation='relu'), keras.layers.Dropout(0.2), keras.layers.Dense(4) ]) model.compile('sgd', 'mse')将输入数据标准化(减去均值、除以标准差)后训练 30 个 epoch,损失从约 0.056 稳步下降到约 0.0021。随后在 500 张测试图上计算预测框与真实框的 IoU 并求均值,得到约 0.715 的平均 IoU——这说明"用回归网络输出四个坐标值(x、y、宽、高)"的定位方案是可行且有效的。在真实场景中,物体形状更复杂时,应当用 CNN 而非全连接网络来处理该类任务。
目标检测常用数据集
训练目标检测模型需要同时提供类别标签与边界框坐标的专门数据集。本课提到两个最经典的基准:
- PASCAL VOC:共 20 个物体类别,是目标检测领域历史最悠久的标准数据集之一;
- COCO(Common Objects in Context):共 80 个类别,除边界框外还提供实例分割掩码(segmentation masks),覆盖面更广、难度更高,是当今目标检测与实例分割的主流评测基准。
评估指标:IoU、AP 与 mAP
与图像分类只需衡量类别是否正确不同,目标检测必须同时衡量类别正确性与边界框位置的精确度。
Intersection over Union(IoU,交并比)
IoU 用于衡量两个边界框(或任意两个区域)的重叠程度:用两区域交集面积除以并集面积。
- 两个完全相同的区域:IoU = 1;
- 两个完全不相交的区域:IoU = 0;
- 其余情况取值在 0 到 1 之间。
实践中我们通常只把 IoU 超过某个阈值的预测框视为有效检测。Notebook 给出了 IoU 的完整实现:
def IOU(bbox1, bbox2): '''计算两个边界框 [x, y, w, h] 的重叠程度:交集面积 / 并集面积''' x1, y1, w1, h1 = bbox1[0], bbox1[1], bbox1[2], bbox1[3] x2, y2, w2, h2 = bbox2[0], bbox2[1], bbox2[2], bbox2[3] w_I = min(x1 + w1, x2 + w2) - max(x1, x2) h_I = min(y1 + h1, y2 + h2) - max(y1, y2) if w_I <= 0 or h_I <= 0: # 无重叠 return 0. I = w_I * h_I U = w1 * h1 + w2 * h2 - I return I / UAverage Precision(AP,平均精度)
要衡量某一特定类别 $C$ 的检测效果,使用AP指标,计算过程如下:
- 绘制 Precision-Recall 曲线:横轴 Recall、纵轴 Precision,曲线由检测阈值(0 到 1)的变化驱动;
- 阈值越低,检出的物体越多,Precision 与 Recall 的取值随之变化;
- 类别 $C$ 的 AP 定义为该曲线下的面积。更精确地说,Recall 轴通常被划分为 10 段,对所有这些采样点的 Precision 取平均:
$$ AP = {1\over11}\sum_{i=0}^{10}\mbox{Precision}(\mbox{Recall}={i\over10}) $$
AP 与 IoU 阈值的配合
计算 AP 时只考虑IoU 高于某阈值的检测框。不同数据集有不同约定:PASCAL VOC 通常取 $\mbox{IoU Threshold} = 0.5$,而 COCO 则在多个 IoU 阈值下分别测量 AP(如 0.5、0.75 乃至 0.5:0.95 的平均),要求更加严格。
Mean Average Precision(mAP,平均精度均值)
目标检测的主指标是mAP:将所有物体类别的 AP 求平均,有时还会进一步对多个 IoU 阈值求平均。它是论文与竞赛中最常见的"一句话性能"数字,也是评价检测模型整体能力强弱的标准口径。
主流目标检测算法全景
目标检测算法大致可分为两大类:
- 区域提议网络(Region Proposal Networks):包括 R-CNN、Fast R-CNN、Faster R-CNN。核心思路是先生成感兴趣区域(Region of Interest, ROI),再让 CNN 在这些区域上寻找最大激活。它与朴素切块思路类似,但 ROI 的生成方式更"聪明"。这类方法的主要缺点是速度慢——CNN 分类器需要在同一张图上进行多次前向推断;
- 单次(One-pass)方法:包括 YOLO、SSD、RetinaNet。这类架构被设计为一次前向传播同时预测类别与 ROI,速度更快,更适合实时应用。
R-CNN:Region-Based CNN
R-CNN 使用Selective Search生成层次化的 ROI 区域结构,随后将这些区域送入 CNN 特征提取器与 SVM 分类器确定物体类别,并用线性回归确定边界框坐标。它是"两阶段检测器"的鼻祖,奠定了"区域提议 → 逐区域分类回归"的范式。
Fast R-CNN(F-RCNN)
Fast R-CNN 与 R-CNN 思路相似,但关键改进在于:区域定义发生在卷积层应用之后——整张图只过一次卷积,再在共享特征图上提取区域特征,避免了逐区域重复计算,从而显著加速。
Faster R-CNN
Faster R-CNN 的核心贡献是引入神经网络来预测 ROI,即所谓的区域提议网络(Region Proposal Network, RPN)。至此,区域提议与后续分类回归全部端到端可学习,速度与精度较前两代进一步提升,成为两阶段检测器的代表作。
R-FCN:Region-Based Fully Convolutional Network
R-FCN 比 Faster R-CNN 更快,其主要思想是:
- 使用 ResNet-101 提取特征;
- 特征经位置敏感得分图(Position-Sensitive Score Map)处理:每个类别 $C$ 的物体被划分为 $k\times k$ 个区域,网络分别训练预测物体的各个部位;
- 对于 $k\times k$ 各区域,所有网络对物体类别进行投票,获得票数最多的类别胜出。
通过"位置敏感"设计,R-FCN 在保持精度的同时把共享计算做到了极致,避免了 Faster R-CNN 中逐 ROI 的重计算。
YOLO:You Only Look Once
YOLO 是实时单次算法的代表,其核心思想非常直观:
- 将图像划分为 $S\times S$ 个区域(grid);
- 对每个区域,CNN 同时预测 $n$ 个可能的物体、边界框坐标以及置信度(confidence)=概率× IoU。
"只看一次"意味着整张图只需一次前向传播即可输出全部检测结果,因此能达到实时推理速度,非常适合视频监控、自动驾驶等对延迟敏感的场景。
其他算法
- RetinaNet:引入 Focal Loss 解决单阶段检测中前景/背景类别极度不平衡的问题,在精度上逼近两阶段方法的同时保持单阶段的速度;
- SSD(Single Shot Detector):在多个不同尺度的特征图上直接回归类别与边界框,是单阶段方法的重要代表。
动手实验与实战作业
实验 Notebook
跟随 ObjectDetection.ipynb 可以亲手复现本节全部内容:VGG-16 朴素切块检测、合成矩形数据的回归定位、IoU 计算与平均 IoU 评测。Notebook 的"真实世界目标检测"部分还推荐了两条进阶路线:阅读 Keras 官方的 RetinaNet 目标检测教程以理解实现细节,或直接使用 Keras RetinaNet 库快速训练真实检测模型。
挑战作业:Hollywood Heads 人头检测
lab/README.md 给出了一个贴近工业应用的任务:统计监控视频流中的人数(例如估算商场访客数、餐厅高峰时段),这需要从不同角度检测人头部。训练数据使用Hollywood Heads 数据集:包含来自好莱坞电影的 224,740 帧画面中的 369,846 个人头标注,以 PASCAL VOC 格式提供——每个图像对应一个 XML 描述文件:
<annotation> <folder>HollywoodHeads</folder> <filename>mov_021_149390.jpeg</filename> <size> <width>608</width> <height>320</height> <depth>3</depth> </size> <object> <name>head</name> <bndbox> <xmin>201</xmin> <ymin>1</ymin> <xmax>480</xmax> <ymax>263</ymax> </bndbox> <difficult>0</difficult> </object> </annotation>该数据集只有head一个类别,每个目标给出边界框坐标。你可以用 Python 解析 XML,或使用pascal-voc库直接处理 VOC 格式。训练检测模型有三条可选路线:
- 使用 Azure Custom Vision 及其 Python API 在云端训练(注意它通常只能利用数百张图片,可能需要缩减数据集);
- 参照 Keras 官方 RetinaNet 教程训练 RetinaNet 模型;
- 直接使用
torchvision.models.detection.RetinaNet内置模块。
该作业的核心结论是:目标检测是工业界高频需求,虽然已有现成云服务可用,但理解其工作原理、具备自行训练检测模型的能力依然至关重要。
小结
本课带你快速走完了目标检测的完整知识地图:从"切块 + 分类"的朴素方案,到用回归精确预测边界框坐标;从 IoU、AP 到 mAP 的指标体系;从 R-CNN → Fast R-CNN → Faster R-CNN → R-FCN 的两阶段演进,到 YOLO、SSD、RetinaNet 的单次检测流派。配合 实验 Notebook 与 Hollywood Heads 实战作业,你既可以从零跑通"回归定位边界框"的最小实现,也能面向真实视频场景训练自己的检测模型。
- 教程
- 人工智能
- 机器学习
- 深度学习
【免费下载链接】AI-For-Beginners
12 Weeks, 24 Lessons, AI for All!
相关推荐
AI-For-Beginners 目标检测实战指南:从 IoU/mAP 评估指标到 R-CNN 与 YOLO 算法全解析
AI For Beginners 目标检测实战指南:从 IoU/mAP 评估指标到 R CNN 与 YOLO 算法全解析 目标检测(Object Detecti
教程人工智能机器学习深度学习AI-For-Beginners 目标检测实战指南:从分类到定位、从 IoU 到 YOLO
AI For Beginners 目标检测实战指南:从分类到定位、从 IoU 到 YOLO 导读:本文以 AI For Beginners https://li
教程人工智能机器学习深度学习AI-For-Beginners 目标检测实战全解:从朴素滑窗到 R-CNN/YOLO 与 mAP 评估体系
AI For Beginners 目标检测实战全解:从朴素滑窗到 R CNN/YOLO 与 mAP 评估体系 本指南基于 AI For Beginners 课程
教程人工智能机器学习深度学习
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考