资讯详情 目标检测入门:从图像分类到边界框回归的完整指南(AI-For-Beginners 第 11 课)
📅 2026/10/3 12:37:58
教程人工智能机器学习深度学习【免费下载链接】AI-For-Beginners12 Weeks, 24 Lessons, AI for All!项目地址https://gitcode.com/GitHub_Trending/ai/AI-For-Beginners点击查看免费下载目标检测Object Detection是计算机视觉的核心任务之一不仅要知道图片里有什么还要回答物体在哪里。本文基于 AI-For-Beginners 课程第 11 课Object Detection展开系统讲解目标检测的朴素方法、回归思路、经典数据集PASCAL VOC 与 COCO、评估指标IoU、AP、mAP以及 R-CNN 家族与 YOLO 等主流算法原理并结合仓库中的 ObjectDetection.ipynb 提供可直接运行的动手实践。读完后你将理解目标检测算法的分类脉络并能在 TensorFlow/Keras 中亲手实现一个从零训练的边界框回归模型。从图像分类到目标检测问题定义的转变此前课程如 MNIST 手写数字识别中处理的都是图像分类问题输入一张图片输出一个类别结果例如这是一个数字 3。但在大量真实场景中我们不仅要确认图片里有物体还需要确定物体的精确位置——这正是目标检测要解决的问题。典型应用包括视频监控画面中统计人数、识别行人商店客流统计、餐厅高峰期人流量估算自动驾驶中检测车辆、行人、交通标志等目标。目标检测的输出通常是一组边界框bounding box即每个检测到的目标都由一个矩形区域通常用左上角坐标x, y与宽高w, h表示加上一个类别标签来定位。朴素目标检测方法及其局限最直观的朴素方法可以概括为三步见 ObjectDetection.ipynb 中的实验把图片切分成若干小块tile对每一小块分别执行图像分类那些分类激活值足够高的小块即可认为包含目标物体。以在一张照片里找猫为例可以借助预训练的 VGG-16 模型来实现由于 ImageNet 中猫的类别索引为 281294只要把各猫类别概率求和就得到整张图是猫的置信度。然后定义一个predict_map函数把图片划分为n×n的方格逐个格子计算猫概率即可生成一张概率热力图import cv2 from tensorflow import keras import numpy as np img cv2.imread(images/1200px-Girl_and_cat.jpg) img cv2.cvtColor(img, cv2.COLOR_BGR2RGB) img np.pad(img, ((158,158),(0,0),(0,0)), modeedge) vgg keras.applications.vgg16.VGG16(weightsimagenet) def predict(img): im cv2.resize(img, (224, 224)) im keras.applications.vgg16.preprocess_input(im) pr vgg.predict(np.expand_dims(im, axis0))[0] return np.sum(pr[281:294]) # VGG 中猫的类别索引为 281~294 def predict_map(img, n): dx img.shape[0] // n res np.zeros((n, n), dtypenp.float32) for i in range(n): for j in range(n): im img[dx*i:dx*(i1), dx*j:dx*(j1)] res[i, j] predict(im) return res局限这种方法只能把边界框定位到某个格子的粒度定位非常粗糙无法给出物体的精确轮廓。要实现更精准的定位需要引入回归regression——直接预测边界框的坐标。用回归预测边界框一个从零训练的示例为了让网络输出落在[0,1]区间便于训练实践中通常把边界框坐标除以图像尺寸做归一化。目标检测的回归任务一般使用MSE均方误差作为损失函数、SGD 作为优化器因为这是回归而非分类任务。ObjectDetection.ipynb 提供了一个完整的迷你示例在8×8的黑色图像上随机放置白色矩形网络输入为图像像素输出为 4 个边界框数值[x, y, w, h]。首先生成 10 万张带标注的训练样本def generate_images(num_imgs, img_size8, min_object_size1, max_object_size4): bboxes np.zeros((num_imgs, 4)) imgs np.zeros((num_imgs, img_size, img_size)) # 背景为 0 for i_img in range(num_imgs): w, h np.random.randint(min_object_size, max_object_size, size2) x np.random.randint(0, img_size - w) y np.random.randint(0, img_size - h) imgs[i_img, x:xw, y:yh] 1. # 矩形区域置 1 bboxes[i_img] [x, y, w, h] return imgs, bboxes imgs, bboxes generate_images(100000) bb bboxes / 8.0 # 归一化到 [0,1]然后搭建一个简单的全连接网络真实场景中物体形状复杂更适合使用 CNNmodel keras.Sequential([ keras.layers.Flatten(input_shape(8, 8)), keras.layers.Dense(200, activationrelu), keras.layers.Dropout(0.2), keras.layers.Dense(4) ]) model.compile(sgd, mse)训练时对输入做标准化处理减去均值、除以标准差可略微提升性能imgs_norm (imgs - np.mean(imgs)) / np.std(imgs) model.fit(imgs_norm, bb, epochs30)训练完成后还可以用 IoU 指标来评估预测框与真实框的重合质量并计算整体平均 IoU详见下文目标检测评估指标一节。该回归思路正是所有现代目标检测算法的基础——分类网络负责是什么回归头负责在哪里。目标检测常用数据集以下两个数据集是该任务中最常遇到的PASCAL VOC包含 20 个物体类别每个图像配有 XML 格式的边界框标注COCOCommon Objects in Context上下文中的常见物体包含 80 个类别不仅提供边界框还提供实例分割掩码segmentation masks是目前目标检测研究中最主流的基准数据集之一。此外课程作业 lab/README.md 还推荐了Hollywood Heads 数据集它包含 369,846 个人头标注分布在 224,740 个好莱坞电影帧中以 PASCAL VOC 格式提供。每个图像对应一个 XML 描述文件例如annotation folderHollywoodHeads/folder filenamemov_021_149390.jpeg/filename size width608/width height320/height depth3/depth /size object namehead/name bndbox xmin201/xmin ymin1/ymin xmax480/xmax ymax263/ymax /bndbox /object /annotation该数据集只有head一个类别每个目标给出边界框坐标。可以用 Python 的 XML 解析库读取标注或使用 PASCAL VOC 相关的现成库直接处理。目标检测评估指标图像分类很容易用准确率衡量但目标检测必须同时考核类别的正确性与边界框位置的精确度因此需要专门指标。IoUIntersection over Union交并比IoU 衡量两个边界框或任意两个区域的重叠程度两个区域的交集面积除以并集面积。两个完全相同的区域IoU 1两个完全不相交的区域IoU 0一般情况下 IoU 取值在 0 到 1 之间。实际评估中通常只把 IoU 超过某一阈值的检测视为有效。notebook 中给出了 IoU 的参考实现基于[x, y, w, h]格式的边界框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 / UAPAverage Precision平均精度要衡量某个类别 C 的识别效果可以考察其Precision-Recall 曲线随着检测阈值从 0 到 1 变化图像中被检出的目标数量、精确率和召回率都会随之变化从而画出一条曲线。类别 C 的平均精度就是该曲线下的面积。更精确地说召回率轴通常被等分为 10 段对 11 个等分点处的精确率取平均$$AP \frac{1}{11}\sum_{i0}^{10}\text{Precision}(\text{Recall}\frac{i}{10})$$在计算 AP 时只考虑 IoU 超过某个阈值的检测。不同数据集约定不同PASCAL VOC通常取IoU Threshold 0.5COCOAP 会对多个 IoU 阈值分别测量。mAPMean Average Precision平均平均精度mAP 是目标检测的核心评估指标它是所有物体类别 AP 的平均值有时还会进一步对多个 IoU 阈值求平均。在模型间横向比较如论文中的 benchmark 表格时mAP 是最常被引用的数字。目标检测算法的两大流派主流目标检测算法可以划分为两大类基于区域提议的网络Region Proposal NetworksR-CNN、Fast R-CNN、Faster R-CNN。核心思路是先生成感兴趣区域ROI再对 ROI 运行 CNN 寻找最大激活。它与朴素方法相似但 ROI 的生成方式更聪明。主要缺点是慢——需要对同一图像多次运行 CNN 分类器。单次One-pass方法YOLO、SSD、RetinaNet。网络被设计为一次前向传播同时预测类别与 ROI速度更快适合实时场景。R-CNN基于区域的卷积神经网络R-CNN 使用Selective Search选择性搜索生成 ROI 的层次化结构这些 ROI 依次经过 CNN 特征提取器与 SVM 分类器确定物体类别再由线性回归确定边界框坐标。典型流程如下用 Selective Search 在原图上生成约 2000 个候选区域对每个候选区域缩放后送入 CNN 提取特征用 SVM 分类每个区域的特征判断物体类别用线性回归精修边界框坐标。Fast R-CNNFast R-CNN 与 R-CNN 思路类似但区域是在卷积层应用之后才确定的。共享的卷积特征先计算一次再针对每个 ROI 进行池化与分类避免了对每个候选区域重复跑 CNN从而大幅提速。Faster R-CNNFaster R-CNN 的核心创新是用神经网络来预测 ROI即引入所谓的区域提议网络Region Proposal Network, RPN。RPN 与检测网络共享卷积特征端到端联合训练将区域提议的成本进一步降低成为后续大量两阶段检测器的基础。R-FCN基于区域的全卷积网络R-FCN 比 Faster R-CNN 更快核心思路是使用ResNet-101提取特征特征经Position-Sensitive Score Map位置敏感得分图处理将 C 类物体的每个类别划分为k×k个区域训练网络预测物体的各个部位每个k×k区域的所有子网络对物体类别投票得票最多的类别胜出。YOLOYou Only Look OnceYOLO 是经典的实时单次检测算法核心思想非常简洁将图像划分为S×S个区域网格对每个区域CNN 预测n个可能的物体、边界框坐标以及置信度置信度 概率 × IoU。由于只做一次前向传播YOLO 可以做到实时推理成为工业界部署最广泛的检测器之一。课程的 挑战环节鼓励读者进一步阅读 YOLO 相关文章、官方文档与 Keras 实现并亲手运行其分步 notebook 实验。其他值得了解的算法RetinaNet通过 Focal Loss 缓解单次检测器在前景-背景类别极度不平衡时的训练困难在单次方法中取得了很高的精度。其 PyTorch 实现内置于 Torchvisiontorchvision.models.detection.RetinaNetKeras 官方示例也提供了完整的训练教程。SSDSingle Shot Detector单次检测器在不同尺度的特征图上直接预测边界框与类别兼顾速度与精度。动手实验与作业✍️ 练习目标检测继续学习请运行课程 notebookObjectDetection.ipynb。实验路径概括为用预训练 VGG-16 实现朴素格子检测与概率热力图生成合成矩形数据训练全连接网络完成边界框回归用 IoU 实现评估预测质量并计算平均 IoU延伸了解 Keras 官方的 RetinaNet 目标检测教程。 作业基于 Hollywood Heads 数据集的人头检测作业详见 lab/README.md任务场景是视频监控流中的人数统计——通过检测不同角度的人头来估算商店访客数或餐厅高峰时段客流。数据集为 Hollywood HeadsPASCAL VOC 格式仅head一个类别。训练方式可任选其一使用Azure Custom Vision及其 Python API 在云端以编程方式训练模型Custom Vision 通常只能使用数百张训练图片因此需要限制数据集规模参照 Keras 官方教程训练RetinaNet模型使用 Torchvision 内置的torchvision.models.detection.RetinaNet模块直接训练。总结本课快速巡览了目标检测的多种实现路径从朴素格子分类到回归预测边界框理解了为什么需要专门的数据集与回归头掌握了PASCAL VOC / COCO等数据集形态与Hollywood Heads的 PASCAL VOC XML 标注格式学会了IoU、AP、mAP这一整套评估体系以及各数据集对 IoU 阈值的不同约定理清了两阶段检测器R-CNN → Fast R-CNN → Faster R-CNN → R-FCN与单次检测器YOLO、SSD、RetinaNet两大算法流派的设计思想与取舍。目标检测是工业界高频需求虽然已有成熟的云端检测服务如 Azure Custom Vision但理解其工作原理、能够训练自己的模型仍然是一项关键能力。继续深入可在 12-Segmentation 语义分割 一课中学习像素级分割两者的数据集与评估体系相互关联。赞分享教程人工智能机器学习深度学习【免费下载链接】AI-For-Beginners12 Weeks, 24 Lessons, AI for All!项目地址https://gitcode.com/GitHub_Trending/ai/AI-For-Beginners点击查看免费下载相关推荐AI-For-Beginners 目标检测实战指南从分类到定位、从 IoU 到 YOLOAI For Beginners 目标检测实战指南从分类到定位、从 IoU 到 YOLO 导读本文以 AI For Beginners https://li教程人工智能机器学习深度学习从文本到图像构建文生图应用的完整实践指南generative-ai-for-beginners 第 9 课从文本到图像构建文生图应用的完整实践指南generative ai for beginners 第 9 课 本指南围绕开源课程《generative ai教程人工智能大模型ML-For-Beginners 回归课第 3 课用 Scikit-learn 实现线性回归、多项式回归与类别特征编码的完整实战ML For Beginners 回归课第 3 课用 Scikit learn 实现线性回归、多项式回归与类别特征编码的完整实战 本篇指南基于 ML For教程机器学习人工智能创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考