目标检测
-
图片分类问题是判断图片中是否存在特定的对象。
图片定位分类问题除了判断图片是否包含特定对象外,还要定位对象在图像中的位置,并使用**边界框(bounding box)**标记出该位置。
边界框的四个参数为 b x b_{x} bx(中心点横坐标)、 b y b_{y} by(中心点纵坐标)、 b h b_{h} bh(高度)和 b w b_{w} bw(宽度)。令图片左上角的坐标为 ( 0 , 0 ) (0,0) (0,0),右下角的坐标为 ( 1 , 1 ) (1,1) (1,1)。
目标标签 y = [ p c , b x , b y , b h , b w , c 1 , c 2 , c 3 ] T y=[p_c,b_x,b_y,b_h,b_w,c_1,c_2,c_3]^T y=[pc,bx,by,bh,bw,c1,c2,c3]T 包含多个部分:
- p c p_c pc:表示是否检测到对象( 1 1 1表示有对象, 0 0 0表示没有对象),如果图片没有检测到对象则 p c = 0 p_c = 0 pc=0,其他标签无效。
- b x , b y , b h , b w b_x, b_y, b_h, b_w bx,by,bh,bw:边界框的参数,只有在 p c = 1 p_c = 1 pc=1 时才有效。
- c 1 , c 2 , c 3 c_1, c_2, c_3 c1,c2,c3:分类标签,表示检测到的对象类别(如行人、汽车、摩托车)。
如果图片中存在多个对象(如多辆车、行人、摩托车等),每个对象都需要独立的边界框和分类标签。
神经网络根据标签(包括分类和边界框)进行训练,输出预测结果。若 p c = 1 p_c = 1 pc=1,计算所有标签值与预测值之间的平方误差作为损失。若 p c = 0 p_c = 0 pc=0,只计算 p c p_c pc 的预测误差。
-
除了传统的对象分类和定位,神经网络还可以通过输出图片上特定特征点的坐标来进行目标检测。在人脸识别任务中,网络的最后一层输出不止是分类结果,还包括多个特征点(如眼角、嘴角、鼻尖等)的坐标,通过这些坐标可以进行脸部表情分析、面部关键点定位等。
这些任务需要准备相应的标签训练集,数据通常由人工标注获得。每个训练样本都会包含图像及其对应的特征点坐标。特征点的顺序和位置必须在所有图片中保持一致,确保网络能够有效地学习这些特征。
-
传统滑动窗口目标检测:在测试图像上,选定一个固定大小的窗口,窗口在图像上滑动(以步幅为单位),每次输入卷积网络进行预测。每次窗口滑动到一个新区域时,输入该区域的图像到卷积网络,判断该区域是否包含目标。窗口继续在图像上滑动,直到遍历完整张图像。
可以使用不同尺寸的窗口进行检测,例如先使用小窗口,再使用大窗口,逐步增加窗口的大小。小窗口适合检测较小的目标,大窗口适合检测较大的目标。
滑动窗口的步幅 决定了每次滑动窗口的距离,从而影响计算成本和检测的精度。大步幅窗口滑动的距离较大,检测的区域较少,计算量较小。小步幅窗口滑动的距离较小,检测的区域较多,计算量较大。小步幅可能会导致高计算成本,大步幅可能会影响检测精度。
-
在传统神经网络中,图像通过卷积层提取特征后,会进入全连接层进行进一步处理。全连接层中的每个神经元与上一层的每个激活值相连接,计算量大且效率低。可以通过使用卷积层代替全连接层 ,可以将输入的高维特征图转化为低维的卷积输出,从而减少计算成本。例如,处理后得到 5 × 5 × 16 5 \times 5 \times 16 5×5×16 的图像,之后要将其输入到 400 400 400 个单元的全连接层中。也可以将全连接层转化为卷积层,可以使用大小为 5 × 5 × 16 5 \times 5 \times 16 5×5×16 的卷积核进行处理,得到 1 × 1 × 400 1 \times 1 \times 400 1×1×400 的输出。
这个过程可以看作是对全连接层的模拟,只是通过卷积操作来实现每个节点的计算,而不是通过独立的神经元。
-
结合卷积操作和滑动窗口,可以在图像上滑动卷积核,以不同步幅提取图像局部特征并进行目标检测。在滑动窗口算法中,卷积层通过**共享计算(共享权重)**来大幅度提高计算效率。具体来说,对于每次滑动窗口操作,卷积网络并不会重新计算相同的区域,而是通过共享权重和卷积核来减少计算量。
因此可以输入一个图像,通过卷积层提取特征图,然后使用滑动窗口对图像进行扫描。对于每一个滑动窗口,将该区域输入卷积网络进行前向传播,得到一个分类结果。重复此过程,扫描整张图像并为每个窗口区域生成分类标签。
-
在使用传统的滑动窗口方法时,通过遍历图像中的不同位置来检测物体,但边界框往往无法精确匹配目标物体。
**YOLO(You only look once)**通过将图像划分为一个网格(例如 3 × 3 3\times3 3×3 网格)来进行物体检测,而不是对图像的每个位置重复运行分类器,因此在计算上非常高效,能够实现实时检测。对于每个网格中的单元格,YOLO会输出一个 8 8 8 维的目标标签,所以总的输出尺寸为 3 × 3 × 8 3\times3\times8 3×3×8。
YOLO算法将每个物体分配给包含该物体中心的格子。如果一个格子中有多个物体,YOLO会根据物体的中心点来分配它们。也可以使用更细的网格(如 19 × 19 19\times19 19×19 网格)时,减小多个物体被分配到同一个格子的概率。
在训练过程中,YOLO算法会学习如何从输入图像预测出每个格子对应的 8 8 8 维向量。通过反向传播,神经网络会被训练得能够精准地预测图像中各个物体的位置和类别。
YOLO算法通过显式地预测边界框的位置(相对于网格的比例)来输出更精确的目标位置,可以处理任意宽高比的物体。
-
**交并比(IoU, Intersection over Union)**是用来评估两个边界框重叠程度的度量,通过计算两个边界框交集与并集的比值得出。在目标检测中,如果预测的边界框和实际的边界框重叠较多,IoU值较高,表示检测结果较好。通常, IOU ≥ 0.5 \text{IOU} \geq 0.5 IOU≥0.5 就表示预测框与实际框之间的重叠足够大。
-
目标检测算法可能对同一个目标做出多次检测,导致算法检测到同一目标的多个边界框,如下图所示:
可以使用**非极大值抑制(NMS)**抑制重复检测,确保每个对象只检测一次。
- 设置一个概率阈值,低于该阈值的边界框会被丢弃。如 p c ≤ 0.6 p_c \leq 0.6 pc≤0.6,则抛弃这些边界框。
- 根据检测结果的概率 p c p_c pc 排序,选择概率最高的边界框(最可靠的预测)并保留它。
- 将剩余的边界框与已选中的边界框进行比较,如果它们的交并比超过阈值,则抑制这些边界框。
- 重复上述过程,直到处理完所有的边界框,最终保留那些与其他边界框重叠较小的框。
在多类目标检测(例如检测行人、汽车、摩托车)时,需要对每个类别独立进行NMS操作,确保每个类别只输出一个最优的检测结果。
-
在目标检测中,同一个网格中可能存在多个对象,例如行人和汽车的中心点同时落在一个网格格子中。
Anchor Box 是一组预定义的边界框,它们的形状(如长宽比)被设计为适配不同类型的对象。每个格子中的检测结果会与预定义的 Anchor Box 关联,每个 Anchor Box 可以检测一个对象。
可以人工定义一组具有代表性的 Anchor Box 形状(如高瘦、宽矮、正方形等)覆盖预计检测对象的各种形状。也可以使用K-Means聚类算法,将训练集中所有对象的边界框长宽比进行聚类,根据聚类结果选择最具有代表性的 Anchor Box。
在每个格子中预定义若干个 Anchor Box,不同的 Anchor Box 对应不同的形状(如宽而矮、高而窄)。每个 Anchor Box 都会尝试预测一个对象的类别和边界框。使用 Anchor Box 后,每个格子的输出向量会增加,变为与 Anchor Box 数量成倍关系。如果每个 Anchor Box 有 8 个参数,且定义了 2 个 Anchor Box,那么每个格子的输出向量长度变为 16 16 16。
对每个对象,计算它的真实边界框与所有 Anchor Box 的交并比(IoU),将该对象分配给交并比最高的 Anchor Box 和所在的格子。
假设有一个 3 × 3 3\times3 3×3 网格,定义了 2 个 Anchor Box,且某个格子中有两个对象(如行人和汽车)。行人形状与 Anchor Box 1 的 IoU 更高,则将行人分配给 Anchor Box 1。汽车形状与 Anchor Box 2 的 IoU 更高,则将汽车分配给 Anchor Box 2。最终,该格子中输出一个 16 维向量,前 8 个参数对应 Anchor Box 1 表示行人,后 8 个参数对应 Anchor Box 2 表示汽车。
如果同一个格子中有的对象数量超过 Anchor Box 数量,可能会丢失部分检测结果。如果多个对象的边界框形状非常接近,可能导致它们被分配到同一个 Anchor Box,影响检测效果。在实践中,常使用较大的网格(如 19 × 19 19\times19 19×19),并定义 5 到 10 个 Anchor Box,确保适配各种对象形状和大小。
-
YOLO(You Only Look Once)是一种高效的目标检测算法,通过将目标检测任务转化为一个回归问题,直接预测目标的边界框和类别。主要特点是可以单次卷积网络前向传播完成目标检测任务,
并将输入图像划分为多个网格,每个网格预测多个Anchor Box ,从而检测多个对象。
流程:
- 输入图像到卷积网络,经过特征提取和预测输出一个张量,维度为 3 × 3 × 16 3\times3\times16 3×3×16。
- 根据 p c p_c pc 筛选预测结果,去掉低于阈值的边界框。
- 对每个类别的预测结果分别运行非极大值抑制,移除重复检测框。
- 输出剩下的边界框和类别标签,完成检测。
特点:
- 高效性:共享权重,减少了重复计算。
- 实时性:单次前向传播即可完成检测任务,远快于滑动窗口等传统方法,适用于视频处理和实时应用场景。
- 精确性:通过显式预测边界框和类别,可以更精确地检测多种形状的对象。
- 多目标预测:引入 Anchor Box 允许每个网格检测多个对象。
-
候选区域(Region Proposal)是目标检测中的一种方法,用于先选出一组可能包含对象的区域 (色块),再对这些区域运行分类器。与传统的滑动窗口法相比,候选区域可以避免在显然没有对象的区域上浪费计算资源,提升检测效率。
R-CNN的核心流程:
- 候选区域生成:使用图像分割算法生成一组候选区域(例如 2000 个色块),每个色块可能包含对象。
- 分类和边界框回归:在每个候选区域上运行卷积网络分类器,判断是否包含对象以及对象的类别。
R-CNN的优点是候选区域减少了检测所需的计算量,输出的边界框更加精确。但是候选区域生成步骤耗时,整体算法速度较慢,并且每个候选区域单独运行卷积网络,计算效率低。
Fast R-CNN在R-CNN的基础上进行了改进:
- 共享卷积计算:使用滑动窗口的卷积实现,将整张图像一次性经过卷积网络,而不是对每个候选区域单独运行分类器。
- 区域特征池化:候选区域映射到特征图上,通过池化操作提取固定大小的区域特征,再输入到分类器中。
Fast R-CNN在大规模检测任务中减少了重复计算的成本,但候选区域生成的聚类步骤仍然耗时。
Faster R-CNN又有了进一步改进:
- 候选区域生成网络:使用卷积神经网络直接生成候选区域,取代传统的图像分割算法。
- 分类和回归一体化:候选区域生成和分类共享同一个卷积网络的特征,同时预测类别和边界框。
Faster R-CNN是两阶段的目标检测算法,适用于小规模高精度检测任务,速度会比YOLO慢。
-
语义分割将每个像素精确地标记为属于某一类别,输出一个与输入图像大小相同的矩阵,每个像素的值表示其类别标签。
语义分割还可以应用于自动驾驶,确定哪些像素属于可驾驶的道路、车辆、行人等,从而输出可行驶区域的分割图,帮助车辆安全导航。
语义分割存在一些挑战:
- 细粒度分类:对复杂场景中的细节进行精确分类,例如道路标志或行人。
- 类别不平衡:某些类别的像素数量可能远远少于其他类别,导致模型难以学习。
- 计算复杂度:语义分割需要逐像素分类,对内存和计算资源要求较高。
-
转置卷积是一种将特征图放大的操作,通常用于语义分割中的解码器部分。与普通卷积操作相反,转置卷积从一个小尺寸的输入生成一个大尺寸的输出。
核心参数有过滤器大小 f f f,填充 p p p 和步幅 s s s。将原始图像与卷积核相乘,根据步幅将结果叠加在输出矩阵中,最终去掉填充,即可得到结果矩阵。
-
U-Net是一种专门用于语义分割的神经网络架构,其目标是为输入图像中的每个像素分配一个类别标签(例如,背景、道路、猫等),从而实现高精度的像素级分类。
编码(Encoder)部分 包含常规卷积层,提取高层次的特征信息,同时压缩图像的空间分辨率。随着层数增加,特征图的尺寸逐渐减小,但通道数增加。结果是丢失细粒度的空间信息,但保留了高层次的全局上下文信息,即回答"在哪里可能有对象?"。
解码(Decoder)部分 使用转置卷积 逐步将特征图的尺寸恢复到原始输入大小,恢复图像的空间分辨率,并输出与输入图像大小相同的高分辨率输出,使得每个像素能够被精确分类,即回答"这个像素具体属于哪个对象?"。
跳跃连接将编码部分的低级特征直接传递给解码部分的相应层,提供细粒度的空间信息,以弥补编码过程中丢失的空间分辨率。
最终输出的每个像素既有全局语义信息,又有局部纹理信息,从而实现精细的语义分割。
跳跃连接作用:
- 补充细粒度的空间信息。编码部分提取的高层次特征虽然包含全局上下文信息,但由于空间分辨率降低,缺乏像素级的精细度。跳跃连接将高分辨率的低级特征(例如边界和纹理)传递到解码部分,帮助恢复空间细节。
- 结合多层次信息。高级信息是解码器中提供的高层次的语义信息(例如"图像右下角可能有猫")。低级信息是跳跃连接提供的细粒度信息(例如"该像素的纹理像猫的一部分")。这两种信息结合,可以更准确地对像素进行分类。
输入尺寸为 h × w × c h \times w \times c h×w×c,输出尺寸为 h × w × n h \times w \times n h×w×n,对于每个像素生成一个 n n n 维向量,表示像素属于 n n n 个类别的概率分布。应用argmax操作确定每个像素的类别,生成最终的分割图。