
计算机视觉深度学习图像处理数据集【免费下载链接】visionDatasets, Transforms and Models specific to Computer Vision项目地址https://gitcode.com/gh_mirrors/vi/vision点击查看免费下载SSDSingle Shot MultiBox Detector是 TorchVision 检测模块中一类经典的单阶段目标检测模型其核心特点是无需区域提议网络RPN直接在多个尺度的特征图上密集回归边界框并分类。本文以 docs/source/models/ssd.rst 文档为主线结合 ssd.py 源码、anchor_utils.py 默认框生成器以及 references/detection 训练参考实现系统讲解 TorchVision SSD 的模型构建方式、默认框生成原理、训练/推理前后处理流程与参数含义。读完本文你将掌握如何实例化带预训练权重的ssd300_vgg16、理解其各层结构设计与超参数作用并能直接运行 COCO 训练与推理。SSD 模型概述TorchVision 中的 SSD 模型基于论文SSD: Single Shot MultiBox DetectorarXiv:1512.02325实现属于torchvision.models.detection模块。与 Faster R-CNN 这类两阶段检测器不同SSD 通过单次前向传播同时完成类别预测与边界框回归它在骨干网络的不同层对应不同感受野与分辨率上放置一组默认框default boxes即锚框网络直接对每个默认框预测其相对真实框的偏移量以及每个类别的置信度分数。该模块在 TorchVision 中被标记为Beta 状态见 ssd.rst 中的.. betastatus:: detection module指令意味着其 API 仍可能在未来版本中调整但这不影响当前版本中直接使用与训练。目前官方文档明确列出并维护的模型构建器为ssd300_vgg16即输入尺寸固定为 300×300、骨干网络为 VGG16 的 SSD300 变体。仓库中另一个轻量变体ssdlite320_mobilenet_v3_large见 references/detection/README.md 的训练说明也共享同一套SSD基类体系。模型构建器 ssd300_vgg16 与预训练权重ssd300_vgg16是文档 autosummary 中列出的唯一公开构建器定义在 ssd.py。它的完整签名如下ssd300_vgg16( *, weights: Optional[SSD300_VGG16_Weights] None, progress: bool True, num_classes: Optional[int] None, weights_backbone: Optional[VGG16_Weights] VGG16_Weights.IMAGENET1K_FEATURES, trainable_backbone_layers: Optional[int] None, **kwargs: Any, ) - SSD核心参数说明参数默认值含义weightsNone要加载的预训练权重枚举。传SSD300_VGG16_Weights.DEFAULT即使用 COCO 预训练权重progressTrue下载权重时是否在 stderr 显示进度条num_classesNone默认 91输出类别数包含背景类。加载预训练权重时会被自动覆盖为权重元数据中的类别数weights_backboneVGG16_Weights.IMAGENET1K_FEATURES骨干网络 VGG16 使用的预训练权重trainable_backbone_layersNone默认 4从最后一层起可训练的骨干层数合法范围 055 表示全部可训练**kwargs—透传给SSD基类的其他参数如score_thresh、nms_thresh等从源码ssd.py可以看到构建器的实际装配逻辑weights SSD300_VGG16_Weights.verify(weights) weights_backbone VGG16_Weights.verify(weights_backbone) if weights is not None: weights_backbone None num_classes _ovewrite_value_param(num_classes, num_classes, len(weights.meta[categories])) elif num_classes is None: num_classes 91 backbone vgg16(weightsweights_backbone, progressprogress) backbone _vgg_extractor(backbone, False, trainable_backbone_layers) anchor_generator DefaultBoxGenerator( [[2], [2, 3], [2, 3], [2, 3], [2], [2]], scales[0.07, 0.15, 0.33, 0.51, 0.69, 0.87, 1.05], steps[8, 16, 32, 64, 100, 300], ) defaults { image_mean: [0.48235, 0.45882, 0.40784], image_std: [1.0 / 255.0, 1.0 / 255.0, 1.0 / 255.0], } model SSD(backbone, anchor_generator, (300, 300), num_classes, **defaults, **kwargs)关键细节加载完整预训练权重时weights_backbone会被置为None避免重复加载骨干权重输入归一化使用 VGG 在 ImageNet 上的均值[0.48235, 0.45882, 0.40784]而标准差取1/255作用是把[0, 1]的像素值还原回[0, 255]量级与 VGG 骨干的预训练输入习惯保持一致见 ssd.pytrainable_backbone_layers的取值校验由_validate_trainable_layers完成backbone_utils.py若既没有预训练权重也没有预训练骨干则强制所有层可训练并给出警告取值范围越界会直接抛出ValueError。SSD300_VGG16_Weights 权重枚举预训练权重封装在SSD300_VGG16_Weights枚举中当前仅有一个COCO_V1条目ssd.py其元数据记录了num_params约 3564 万参数35,641,826categoriesCOCO 的 91 类标签来自 _meta.py 的_COCO_CATEGORIES含背景类指标COCO val2017 上的box_map为25.1计算量约 34.858 GFLOPs权重文件大小约 135.988 MB训练配方按论文相近的 recipe 在 COCO 上训练得到_docs字段注明。权重文件会通过weights.get_state_dict(progressprogress, check_hashTrue)自动下载并做哈希校验后加载到模型中。SSD 基类核心组件与默认参数所有 SSD 构建器最终都实例化torchvision.models.detection.SSD基类ssd.py。其__init__默认参数即推理与训练的关键超参SSD( backbone, anchor_generator, size(300, 300), num_classes, image_meanNone, # 默认 [0.485, 0.456, 0.406] image_stdNone, # 默认 [0.229, 0.224, 0.225] headNone, score_thresh0.01, # 后处理分数阈值 nms_thresh0.45, # NMS 的 IoU 阈值 detections_per_img200, # NMS 后每图保留的检测数 iou_thresh0.5, # 训练时锚框与 GT 匹配的 IoU 阈值 topk_candidates400, # NMS 前保留的候选数 positive_fraction0.25, # 训练时正样本比例用于推导负正比 )基类内部会自动装配以下组件BoxCoderdet_utils.BoxCoder(weights(10.0, 10.0, 5.0, 5.0))ssd.py负责把默认框编码为回归目标、把预测偏移解码为真实坐标SSDHead若未显式传入head则根据骨干out_channels与锚框数量自动构建分类头与回归头ssd.py并要求骨干输出通道数与anchor_generator.aspect_ratios长度一致否则抛出ValueErrorSSDMatcher以iou_thresh0.5构建训练匹配器ssd.pyGeneralizedRCNNTransform输入预处理size_divisible1且指定fixed_size(300, 300)保证输入被缩放到固定尺寸ssd.py。此外neg_to_pos_ratio (1 - positive_fraction) / positive_fraction在默认positive_fraction0.25时负正样本比为3:1这与 SSD 论文提出的 3:1 难例挖掘比例一致。检测头结构SSDHead 与 SSDScoringHeadSSDHeadssd.py由一个分类头与一个回归头组成前向返回{bbox_regression: ..., cls_logits: ...}SSDClassificationHead对每个特征图使用nn.Conv2d(channels, num_classes * anchors, kernel_size3, padding1)输出类别 logitsssd.pySSDRegressionHead对每个特征图使用nn.Conv2d(channels, 4 * anchors, kernel_size3, padding1)输出 4 个回归偏移ssd.py。两个头均使用 Xavier 初始化_xavier_initssd.py。关键的形状转换发生在SSDScoringHead.forwardssd.py将每个特征图的输出从(N, A*K, H, W)重排为(N, HWA, K)其中A为该层每位置锚框数、K为类别数分类或 4回归最后把所有特征图的结果沿第 1 维拼接。多尺度特征提取器 SSDFeatureExtractorVGG为了获得多尺度特征图_vgg_extractorssd.py从标准 VGG16 的features中按 MaxPool 位置切分阶段并根据trainable_layers冻结前若干层的参数parameter.requires_grad_(False)。随后由SSDFeatureExtractorVGGssd.py完成关键改造将第 3 个 MaxPool 的ceil_mode置为True以复现论文中的特征图宽高对第一个特征图conv4_3做L2 归一化 可学习的缩放self.scale_weight nn.Parameter(torch.ones(512) * 20)前向时rescaled scale_weight * F.normalize(x)ssd.py用MaxPool2d(3, stride1, padding1)替代原 maxpool5并把原 FC6 改为空洞卷积dilation6保持感受野FC7 改为 1×1 卷积共同组成第一个额外块ssd.py追加 conv8_2、conv9_2、conv10_2、conv11_2 四个额外块SSD300 情形每个块由 1×1 降维 3×3 卷积stride2 或直接下采样组成highresTrue时还会追加 conv12_2 以支持 SSD512ssd.py。前向最终返回OrderedDict共 6 个特征图conv4_3L2 归一化后、conv7、conv8_2、conv9_2、conv10_2、conv11_2对应 38×38、19×19、10×10、5×5、3×3、1×1输入 300×300 时。默认框生成DefaultBoxGenerator 原理SSD 的锚框默认框由 anchor_utils.py 中的DefaultBoxGenerator生成构造函数签名DefaultBoxGenerator( aspect_ratios: list[list[int]], min_ratio: float 0.15, max_ratio: float 0.9, scales: Optional[list[float]] None, steps: Optional[list[int]] None, clip: bool True, )ssd300_vgg16中实际传入的配置为ssd.pyaspect_ratios [[2], [2, 3], [2, 3], [2, 3], [2], [2]]分别对应 6 个特征图scales [0.07, 0.15, 0.33, 0.51, 0.69, 0.87, 1.05]注意长度比特征图多 1最后一个用于计算s_k sqrt(s_k * s_{k1})steps [8, 16, 32, 64, 100, 300]默认框网格相对于 300×300 输入的步长。生成规则_generate_wh_pairs与_grid_default_boxesanchor_utils.py每个特征图k先产生 2 个正方形默认框尺度s_k与几何均值尺度s_k sqrt(s_k * s_{k1})对每个长宽比ar再产生 2 个框(w, h) (s_k*sqrt(ar), s_k/sqrt(ar))及其转置(h, w)因此每位置锚框数 2 2 * len(aspect_ratios[k])num_anchors_per_locationanchor_utils.py 中对应实现于 anchor_utils.py6 个特征图合计为 4、6、6、6、4、4总计38²×4 19²×6 10²×6 5²×6 3²×4 1²×4 8732个默认框默认框以相对坐标(cx, cy, w, h)表示比例形式clipTrue时把宽高裁剪到[0, 1]前向时再按图像实际尺寸换算回绝对坐标anchor_utils.py。若未显式提供scales则按公式s_k min_ratio (max_ratio - min_ratio) * k / (num_outputs - 1)自动估计min_ratio/max_ratio默认 0.15/0.9anchor_utils.py。steps若未提供则从特征图尺寸与图像尺寸推断。输入、输出与推理后处理输入约定模型输入是张量列表每个张量形状为[C, H, W]像素值应在[0, 1]范围内。不同图像可以有不同尺寸前向时会被统一缩放到固定大小SSD300 为 300×300再进入骨干网络。参考用法见ssd300_vgg16的 docstring 示例import torch import torchvision model torchvision.models.detection.ssd300_vgg16(weightstorchvision.models.detection.SSD300_VGG16_Weights.DEFAULT) model.eval() x [torch.rand(3, 300, 300), torch.rand(3, 500, 400)] predictions model(x)推理输出推理模式下只传入images模型返回List[Dict[str, Tensor]]每个元素对应一张图像包含boxesFloatTensor[N, 4]格式为[x1, y1, x2, y2]满足0 x1 x2 W、0 y1 y2 H相对于原始输入图像尺寸labelsInt64Tensor[N]每个检测框的类别标签scoresTensor[N]每个检测框的置信度。后处理流水线postprocess_detectionsssd.py的执行顺序为对分类 logits 做softmax按最后一维用BoxCoder.decode_single把回归偏移解码为绝对坐标并clip_boxes_to_image裁剪到图像范围内逐类别过滤保留score score_thresh默认 0.01的预测再取topk_candidates默认 400个高分候选跨类别执行batched_nms(boxes, scores, labels, nms_thresh)NMS 阈值默认 0.45最终只保留前detections_per_img默认 200个检测。整个前向流程ssd.py为记录原始尺寸 →GeneralizedRCNNTransform预处理 → 骨干提取多尺度特征 → SSDHead 输出 → 生成默认框 → 训练时计算匹配与损失 / 推理时后处理并映射回原图坐标。训练流程匹配策略与损失函数训练模式下需要同时传入images与targets每个 target 是包含以下字段的字典boxesFloatTensor[N, 4]真实框坐标[x1, y1, x2, y2]labelsInt64Tensor[N]每个真实框的类别标签。模型对每个输入图像断言 boxes 形状必须为[N, 4]、且所有框具有正宽高否则抛错ssd.py。锚框匹配匹配由SSDMatcher_utils.py完成它继承通用Matcher但有两个 SSD 特有行为allow_low_quality_matchesFalse不保留低质量匹配强制保证每个真实框至少匹配一个预测框将每个 GT 与所有锚框 IoU 最大的那个锚框强制设为正样本避免高 IoU 但非最大的锚框丢失。训练时先计算 GT 框与锚框的 IoU 矩阵box_iou再用proposal_matcher(match_quality_matrix)得到匹配索引ssd.py对没有真实框的图像直接生成全-1匹配索引。损失组成compute_lossssd.py返回{bbox_regression: ..., classification: ...}回归损失对匹配到的正样本用BoxCoder.encode_single把 GT 框编码为相对默认框的目标偏移计算Smooth L1 损失torch.nn.functional.smooth_l1_lossreductionsum分类损失交叉熵F.cross_entropy逐元素reductionnone背景类索引为 0难例挖掘Hard Negative Mining按neg_to_pos_ratio 3采样最难负样本——将正样本位置的损失置为-inf后按损失降序排序取前num_negative个作为负样本参与求和ssd.py两项损失统一除以N max(1, num_foreground)正样本总数实现按前景数量归一化。由于 SSD 结构固定训练模式返回Dict[str, Tensor]仅损失推理模式返回检测列表但在 TorchScript 脚本化模式下始终返回(losses, detections)元组见 ssd.py 的警告信息。端到端训练与验证COCO仓库的 references/detection 目录提供了可直接运行的训练、验证与评估脚本。官方 READMEreferences/detection/README.md给出的 SSD300 VGG16 训练命令为torchrun --nproc_per_node8 train.py \ --dataset coco --model ssd300_vgg16 --epochs 120 \ --lr-steps 80 110 --aspect-ratio-group-factor 3 --lr 0.002 --batch-size 4 \ --weight-decay 0.0005 --data-augmentation ssd \ --weights-backbone VGG16_Weights.IMAGENET1K_FEATURES要点训练 120 个 epoch学习率在 80、110 epoch 处按阶梯衰减初始学习率 0.002批大小 4每卡--data-augmentation ssd会启用 SSD 专属增强预设其定义可在 references/detection/presets.py 附近找到骨干使用 ImageNet 预训练的VGG16_Weights.IMAGENET1K_FEATURES特征提取权重同目录下的train.py、coco_eval.py、coco_utils.py、engine.py分别负责数据加载、COCO 指标评估与训练循环可与--model ssd300_vgg16组合完成完整的 train/val 流程。测试与稳定性保障SSD 模型在仓库测试中有多处覆盖test/test_models.py 将ssd300_vgg16纳入模型测试矩阵如按输出元素索引取目标字段的约定见该文件中 246 行附近的映射并存在对应的期望输出文件test/expect/ModelTester.test_ssd300_vgg16_expect.pkl。运行模型测试可验证权重加载、前向形状与输出一致性的正确性。需要留意的是检测模块整体仍处于 Beta 状态且 SSD 的image_mean/image_std与通用检测预设不同SSD300 使用[0.48235, 0.45882, 0.40784]与1/255自定义调用SSD基类或替换骨干时务必保证backbone.out_channels与anchor_generator.aspect_ratios长度一致否则基类会直接抛出ValueErrorssd.py。若需在自定义数据集上微调可结合 references/detection 的train.py调整--num-classes与--data-path并视显存情况调节批大小与输入尺寸相关参数。赞分享计算机视觉深度学习图像处理数据集【免费下载链接】visionDatasets, Transforms and Models specific to Computer Vision项目地址https://gitcode.com/gh_mirrors/vi/vision点击查看免费下载相关推荐SSD深度学习目标检测模型教程SSD深度学习目标检测模型教程 1. 项目介绍 SSDSingle Shot MultiBox Detector是一个基于PyTorch实现的目标检测框架人工智能深度学习计算机视觉深入理解SSD目标检测模型从原理到实现深入理解SSD目标检测模型从原理到实现 引言 目标检测是计算机视觉领域的重要任务它不仅需要识别图像中的物体类别还要定位物体的具体位置。Single Sho人工智能深度学习机器学习教程终极Caffe2深度学习实战SSD目标检测模型从训练到部署完整指南终极Caffe2深度学习实战SSD目标检测模型从训练到部署完整指南 Caffe2是一个强大的深度学习框架Python库能够帮助开发者轻松构建和部署深度学习模上一篇极致容器化方案gibMacOS Docker 部署实战指南下一篇Skopeo镜像操作审计数据仓库性能优化全景指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考