理解有监督学习的深度学习的关键在于将 推理 和 训练 阶段进行分开,分别理解各种深度神经网络架构的推理和训练阶段的操作就可以理解某个模型。
推理阶段是将模型看成一个类似于黑箱的非线性函数,比如通过各种卷积模块的组合构成一个 backbone,输出想要的shape的张量,再去做后处理。
训练阶段是需要划分正负样本,然后根据任务设计一个损失函数,使用优化算法如SGD以迭代的方式更新神经元的weight和bias,优化的目标是最小化损失函数,因此训练好的模型就可以拟合训练集。
我们通常可以把所有的神经网络以 编码器-解码器 的架构进行理解。
图像分类:
- 推理阶段:输入为图像, 然后是编码器(如CNN)进行编码为张量,一般是W/H 减小 x 倍, 而通道数C 增加 y 倍, 编码成新的张量 (W/x, H/x, yC)。然后是 解码器 ,加入FC、softmax 等。当然,也可以将 softmax 之前的全部理解为 编码器, 把softmax 理解为 解码器。
- 训练阶段:和推理阶段一样,不过是softmax 输出的 向量 需要和 标注的标签计算交叉熵损失(常用),从而反向传播更新softmax 之前的全部weight和bias。
目标检测:
- 推理阶段:目标检测更加复杂,一般来说,目标检测的架构为 Backbone + Neck + Detection head。有趣的是 这个命名, 躯干 然后是 脖子 最后是 决策的检测头。Backbone 常为 我们在大型的图像分类数据集上进行训练的预训练模型(图像分类的编码器),这是因为 分类问题的标注 更加便宜,而网络在两个任务上的提取的特征却可以通用,因此是一种迁移学习的思想。Neck 是 Backbone 输出的张量的一些 特征融合操作,得到更好的组合特征以适应于不同大小目标的检测。Detection head 是Neck 融合后的张量的进行操作,输出想要的shape的张量。最后是后处理,根据阈值删除一部分向量,然后使用NMS去除冗余的边框。
当然,我们可以将 Backbone + Neck 看成编码器,Detection head 看成解码器。注意:可能有的架构并没有 Neck , 如 YOLO v1,所以会带来性能损失。
Backbone + Neck + Detection head 的架构让我们可以分别设计单个模块, 然后进行替换即可构造不同的目标检测模型。
2. 训练阶段:
训练阶段的核心在于 损失函数的设计。Detection head 输出的张量与标签标注的求损失,从而去更新网络。所以,这部分并不涉及上面的 后处理。 这里的关键在于 正负样本的选择 ,从而来计算损失。
在图像分类任务 中 正样本 是该类所有标注的图像,负样本是其他类所有图像。网络输入正样本图像, 然后预测值和标签向量中 1 的地方求损失, 所以预测值会变大, 从而降低损失,由于 softmax 约束, 那么预测向量的其他值会变小;网络输入针对的目前某个类的负样本图像时候, 该图像所属的类的预测值就会变大,其他值也就会变小。所以,对于图像分类来说,我们并不需要关注正负样本的划分,因为通过 标签的one-hot 编码,自然的相当于区分了正负样本。
目标检测任务 中,输入一张图像,和图像分类不同的是,正负样本的单位不再是一张图像,而是一张图像中的某个区域,所以一张图像有多个正负样本,虽然这些区域的大小比图像分类中的图像要小,但是由于数量巨多,所以目标检测相比要慢的多。那么如何得到这些区域(样本)?如何把这么多的区域分为正负样本?这是两个重要的问题。前者:一种常用的做法是 anchor based 的方法来得到这些区域,每个图像的小块上生成的一些先验框anchor 就是样本。 后者:常用的是基于和 真实标注框 的IOU来划分正负样本, 不同的算法策略不同。如果anchor 划分为正样本, 那么对该正样本进行回归就可以得到预测框,那么预测框就可以参与损失函数中 定位损失的计算,预测框和真实标注框计算距离。
注意这里有三种框:
- 真实标注框
- 先验框anchor
- 预测框
综上,目标检测中的正样本并不是真实标注框, 真实标注框是优化的目标,正如图像分类中的 one-hot 编码的向量一样。正样本是那些选择的部分先验框anchor,正如图像分类中的 某个类的图像。而通过模型先验框anchor得到的结果是预测框,正如图像分类中的预测向量,所以预测框和真实框求Loss。当然,像 yolov1 并没有 anchor,所以有部分不同。
Backbone + Neck + Detection head 模块:
- Input: Image, Patches, Image Pyramid
-
Backbones
: VGG16
, ResNet-50
, SpineNet , EffificientNet-B0/B7, CSPResNeXt50, CSPDarknet53, swin transformer -
Neck
:-
Additional blocks
: SPP
, ASPP
, RFB
, SAM -
Path-aggregation blocks
: FPN
, PAN
,
NAS-FPN
, Fully-connected FPN, BiFPN
, ASFF
, SFAM
-
- Heads:
- Dense Prediction (one-stage):
- RPN, SSD, YOLO(v2-v5), RetinaNet (anchor based)
- YOLOv1, CornerNet, CenterNet, MatrixNet, FCOS(anchor free)
- Sparse Prediction (two-stage):
- Faster R-CNN, R-FCN, Mask R-CNN(anchor based)
- RepPoints(anchor free)
- Dense Prediction (one-stage):
注:上面来自于 yolov4 论文。
一部分 正负样本划分策略, 请参考:
目标检测中 Anchor 与 Loss 计算的梳理 | 拾荒志
anchor 生成方法,请参考:
参考:
版权声明:本文为CSDN博主「星魂非梦」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/hymn1993/article/details/122836387
暂无评论