新闻详情

新闻详情

首页 / 资讯中心 / 详情

Faster R-CNN原理拆解与mmdetection实战调参

发布时间:2026/9/30 1:18:13来源:尧图网络
Faster R-CNN原理拆解与mmdetection实战调参
刚接触目标检测那会儿我把 Faster R-CNN 的论文来回啃了三遍每次卡在同一个地方RPN 的 anchor 到底是怎么变成框的。后来把代码一行行跟下来才发现这东西的设计思路其实特别朴素——它压根没打算搜索目标在哪里而是先铺一张天罗地网再让网络自己去判断哪个格子附近有东西。也正因为这个思路足够直白Faster R-CNN 到今天仍然是两阶段检测器里最值得反复研究的骨架工业界大量落地项目遥感、医疗影像、工业质检、票据识别依然拿它当 baseline。这篇内容我按原理拆解 mmdetection 实操 踩坑记录的顺序写新手可以顺着读一遍建立整体认知有 Detection 经验的人可以直接跳到第 2 章和第 4 章那里有 anchor 尺度计算、采样策略、配置文件逐项说明这些真正会影响结果的东西。1. 从找框到认框Faster R-CNN 把检测问题切成了哪几刀1.1 三代 R-CNN 的演进其实在解决同一个瓶颈2014 年的 R-CNN 思路非常直接先用 Selective Search 在原图上抠出两千个左右的候选区域把每个区域缩放到固定尺寸挨个送进 CNN 提特征最后用 SVM 分类、用线性回归微调框。这个流程能work但代价大得离谱——一张图要跑两千次卷积网络训练还要分好几段特征文件占几百 GB 硬盘。它的根本问题是候选框生成和特征提取是两套完全割裂的系统前者靠传统图像算法后者靠神经网络两者既不能共享计算也没法联合优化。Fast R-CNN 解决了重复计算的问题。它改成整张图只跑一次卷积得到一张共享的 feature map然后把候选框映射到特征图上用 RoI Pooling 抠出固定大小的特征。这一步把推理速度提了十几倍也让训练可以端到端进行。但 Selective Search 依然在 CPU 上跑一张图要花一两秒成了新的木桶短板。Faster R-CNN 干的事情就是把这个短板也换成网络——引入 RPNRegion Proposal Network让候选框生成也变成一个可以学习的卷积任务。整张图跑一次卷积特征图同时喂给 RPN 出候选框、喂给检测头出类别和精细框。到这里检测流程第一次变成了一个真正的端到端网络。1.2 两阶段和一阶段的本质差别在哪很多人把两阶段理解成跑两遍网络这个理解不太准确。Faster R-CNN 的 backbone 只跑一次两阶段的差别在于分类和定位这两件事是分先后做的第一阶段只回答这里像不像一个物体不关心是什么类别输出一批粗框第二阶段拿着这批粗框在特征图上抠出对应区域回答这是什么类别并且把框修精细。一阶段检测器SSD、YOLO、RetinaNet把这两件事压在同一个位置上一次输出速度快但正负样本极度不平衡早期版本在小目标和密集场景上明显吃亏。两阶段因为有 RPN 先做一轮筛选第二阶段拿到的样本质量高很多正负比可控所以对小目标、重叠目标、长尾类别的表现通常更稳。代价也很明显RoI 操作要逐框处理没法像全卷积那样一次性算完推理时延受候选框数量影响大。这也是为什么在对实时性敏感的场景里两阶段往往不如一阶段受欢迎。1.3 一张图进来之后数据到底流过了哪些节点拿一张 800×1333 的图举例整条链路是这样的ResNet-50 主干把它下采样到原图的 1/32同时因为 FPN 的存在会额外上采样融合出 P2 到 P6 共 5 个层级的特征图stride 分别是 4、8、16、32、64这 5 层特征图每一层都接同一个 RPN 头在每个空间位置上预测若干个 anchor 的有物体概率和偏移量把所有层级的预测汇总按前景分数排序取前 2000 个做一次 NMS再取前 1000 个这些就是 proposalproposal 通过 RoI Align 从对应层级的特征图上抠出 7×7 的特征接两层 1024 维全连接再分叉成分类头和回归头分类头输出 N1 维N 个类别加背景回归头输出 4×N 维偏移量最后做多类别 NMS得到最终结果。这个链路里RPN 决定召回率的上限第二阶段决定精度的上限。后面调参时如果发现漏检严重先去看 RPN不要一上来就改检测头。2. Anchor 与 RPN候选框是猜出来的不是找出来的2.1 Anchor 的设计动机和尺度计算公式Anchor 说白了就是一组预设好的参考框。网络不需要从零开始学框该多大多宽只需要学相对某个参考框该往哪偏、偏多少。这个设计把回归问题从预测绝对坐标变成了预测相对偏移数值范围小、梯度稳定收敛快很多。在 mmdetection 里FPN 版本的 Faster R-CNN 默认 anchor 配置是这样的anchor_generatordict( typeAnchorGenerator, scales[8], ratios[0.5, 1.0, 2.0], strides[4, 8, 16, 32, 64])计算规则是先算基准边长base_size stride × scale然后按比例拆成宽高w base_size × sqrt(ratio)h base_size / sqrt(ratio)以 P2 层stride4为例base_size 32。ratio0.5 时宽约 22.6、高约 45.3ratio1.0 时是 32×32ratio2.0 时是 45.3×22.6。再往上P3 的 base_size 是 64P4 是 128P5 是 256P6 是 512。所以整套 anchor 覆盖的实际尺度大约是 22 到 724 像素这个区间三种长宽比各一层一共 5×315 种尺寸组合。特征图上每个点铺 3 个同一层的三种比例一个 100×167 的 P2 特征图就是 5 万多个 anchor。这个计算过程一定要自己算一遍。我见过太多人直接照抄配置文件结果数据集里全是 20 像素以下的小目标anchor 最小尺度却是 32网络再强也召回不出来。2.2 RPN 头的两个分支和它们的输出通道RPN 的结构简单到有点反常识一层 3×3 卷积256 通道用来扩大感受野、融合周围信息然后接两个 1×1 卷积。分类分支输出num_anchors × 2个通道因为每个 anchor 只需要分前景和背景两类。注意这里用的是 sigmoid 而不是 softmax每个 anchor 独立判断不是互斥的分类。回归分支输出num_anchors × 4个通道对应中心点 x、y 和宽高 w、h 的偏移量。以 scales[8]、ratios 三个为例num_anchors3那么分类分支是 6 通道回归分支是 12 通道。这个通道数必须和 anchor 数量严格对应改 ratios 的数量时忘了改 head 的配置模型能跑起来但结果完全是乱的这是个很隐蔽的坑。2.3 正负样本怎么划MaxIoUAssigner 的判定规则训练 RPN 之前得先给每个 anchor 打标签。mmdetection 里默认用 MaxIoUAssigner规则是条件标签说明与某个 GT 的 IoU 最大值 0.7正样本pos_iou_thr0.7与所有 GT 的 IoU 最大值 0.3负样本neg_iou_thr0.3介于 0.3 和 0.7 之间忽略不参与 loss 计算某个 GT 没有任何 anchor 匹配强制匹配min_pos_iou0.3 保证召回那个强制匹配的兜底逻辑很关键。如果没有它某些尺寸特别怪的目标可能一个正样本都分不到这部分梯度就永远学不到。采样阶段随机抽 256 个样本正负比控制在 1:1。正样本不够就全用上负样本补齐。为什么是 1:1 而不是像第二阶段那样 1:4因为 RPN 面对的是十几万个 anchor负样本实在太多了如果按 1:4 采正样本的梯度会被淹没。2.4 RPN 损失函数拆开看RPN 的总损失是分类损失和回归损失的加权和loss_clsdict(typeCrossEntropyLoss, use_sigmoidTrue, loss_weight1.0) loss_bboxdict(typeL1Loss, loss_weight1.0)分类部分用二值交叉熵只对采样出来的 256 个样本计算忽略样本被-1标记后排除掉。回归部分用 smooth L1原始论文用的是这个mmdet 里配置写成 L1Loss 但内部是 smooth L1 的行为而且只对正样本计算——负样本没有对应的 GT回归它没有意义。smooth L1 相比普通 L1 的好处在于原点附近是二次函数梯度会随误差减小而减小不会在接近收敛时来回震荡误差大时又变成线性的对离群点不那么敏感。这个设计在检测任务里几乎是标配。2.5 proposal 的筛选流水线RPN 输出的原始预测有十几万个直接送去第二阶段是不可能的。mmdetection 的筛选流程是按前景分数排序取前 nms_pre2000 个。这一步先把明显没戏的框扔掉裁剪越界框配合allowed_border-1允许一部分框超出图像边界后面 RoI Align 会处理过滤掉宽高小于 min_bbox_size 的框执行 NMSiou_threshold0.7。RPN 阶段阈值放得比较宽松因为这里的任务是别漏重叠的框可以留给第二阶段去筛取前 max_per_img1000 个作为最终 proposal。这套流程里nms_pre和max_per_img是两个很实用的性能旋钮。做部署优化时把它们调小比如 1000 和 300精度掉一点点但推理速度能有可感知的提升。3. RoI Align、坐标回归与训练策略3.1 RoI Pooling 的两次量化误差RoI Align 怎么消除RoIPooling 的问题在于它有两次取整把 proposal 的浮点坐标映射到特征图上时取整一次把映射后的区域均分成 k×k 个格子时再取整一次。对于 stride32 的特征图一次取整就相当于原图上的 32 个像素误差小目标上这个偏差足以让特征完全错位。RoI Align 的做法是全程不做量化保持浮点坐标把区域均分后在每个子格子内部按sampling_ratio均匀取 4 个点sampling_ratio0 时表示自适应取点mmdetection 的默认设置每个点用双线性插值算出特征值再对子格子内所有点取平均。代价是计算量比 RoIPooling 大但在 Mask R-CNN 之后基本成了标配。在 mmdetection 的配置文件里就是这一行roi_layerdict(typeRoIAlign, output_size7, sampling_ratio0)output_size7对应检测头如果做分割会额外有一路 14×14 的。7 这个数字不是随便定的它使得接上两层全连接后的参数量适中同时每个 RoI 的特征表达足够充分。改成 5 或 9 都能跑但需要重新调学习率。3.2 边界框回归的编码解码公式这是最容易看着公式发懵、实际用起来又很顺手的一块。编码时网络要预测的是相对 anchor 的归一化偏移tx (x - xa) / wa ty (y - ya) / ha tw log(w / wa) th log(h / ha)解码时反过来x xa wa * tx y ya ha * ty w wa * exp(tw) h ha * exp(th)宽高用 log 空间是因为框的尺度跨度很大从 20 像素到 700 像素用对数可以把大框小框的回归难度拉到同一个量级上。如果直接用绝对差值大框的 loss 会远远压过小框小目标基本学不动。在 mmdetection 里这些由DeltaXYWHBBoxCoder处理配置里的target_stds[1, 1, 1, 1]是缩放系数论文里是 [0.1, 0.1, 0.2, 0.2]mmdet 改成 1 是因为这样对不同的数据分布适应性更好。如果你换了自定义数据集后回归一直学不动可以试着把它调回 [0.1, 0.1, 0.2, 0.2]这是个值得试的方向。3.3 四步交替训练和近似联合训练的差别原论文里提了一个四步交替训练的方案用 ImageNet 预训练权重初始化主干单独训练 RPN用第 1 步 RPN 生成的 proposal 单独训练 Fast R-CNN主干重新从 ImageNet 权重初始化用第 2 步训练好的主干初始化 RPN 的共享卷积固定共享层只微调 RPN 独有的层固定共享层只微调 Fast R-CNN 独有的层。这套流程能跑通但工程上很麻烦四轮训练、权重反复保存加载稍微改个配置就得从头再来。近似联合训练Approximate Joint Training把这个流程压成了一轮把 RPN 的 loss 和 Fast R-CNN 的 loss 直接加起来一起反向传播唯一近似的地方是 proposal 的坐标被当作常数梯度不会从第二阶段传回 RPN 的框回归分支。实操中这个近似影响很小但训练时间直接减半。mmdetection 走的就是近似联合训练训练脚本里不需要你手动分四步。面试被问到 Faster R-CNN 怎么训练说清楚这两条路线的区别和取舍基本上就够用了。3.4 后处理多类别 NMS 和分数阈值第二阶段的分类头输出 N1 维 logits经过 softmax 后得到每个类别的概率。后处理流程是对每个类别分别取出分数大于阈值的框COCO 上一般设 0.05 左右让指标算得准在每个类别内部做 NMSIOU 阈值 COCO 是 0.5VOC 上常用 0.45保留 NMS 后分数最高的 max_per_img 个框。NMS 是按类别分别做的不是所有类别一起做。这点容易搞混。两个人重叠站在一起时如果一个框被判成人、另一个被判成自行车两个都不会被 NMS 干掉——这是特性不是 bug。还有个细节NMS 的分数排序在框数量很大时会有性能开销实际部署里经常会先做一次分数过滤比如只保留分数 0.05 的框再做 NMS能省不少时间。4. 在 mmdetection 里把 Faster R-CNN 跑起来4.1 环境准备和版本差异现在2024 年往后建议直接用 mmdetection 3.x 系列2.x 的 API 和 3.x 差别不小网上很多教程还是 2.x 的写法混着看很容易出错。典型的依赖组合是 PyTorch 2.0 配 mmcv 2.0装的时候用 mim 一条命令搞定pip install -U openmim mim install mmengine mim install mmcv2.0.0 git clone https://github.com/open-mmlab/mmdetection.git cd mmdetection pip install -v -e .这里最容易踩的坑是 mmcv 和 PyTorch/CUDA 版本不匹配。mim 会自动选但如果你手动 pip install mmcv 而没指定版本装上的可能是 CPU 版或者不兼容版本报错信息往往很隐蔽比如undefined symbol之类。建议装完立刻验证python -c import mmcv, torch; print(mmcv.__version__, torch.cuda.is_available())4.2 配置文件逐段拆解mmdet 3.x 的配置文件是继承式的faster_rcnn_r50_fpn_1x_coco.py本身只有几行真正的结构在 base 里。核心内容可以概括成下面这几块我按实际字段名写方便你对照model dict( typeFasterRCNN, data_preprocessordict(...), backbonedict( typeResNet, depth50, num_stages4, out_indices(0, 1, 2, 3), frozen_stages1, norm_cfgdict(typeBN, requires_gradTrue), norm_evalTrue, stylepytorch, init_cfgdict(typePretrained, checkpointtorchvision://resnet50)), neckdict( typeFPN, in_channels[256, 512, 1024, 2048], out_channels256, num_outs5), rpn_headdict( typeRPNHead, in_channels256, feat_channels256, anchor_generatordict( typeAnchorGenerator, scales[8], ratios[0.5, 1.0, 2.0], strides[4, 8, 16, 32, 64]), bbox_coderdict( typeDeltaXYWHBBoxCoder, target_means[0., 0., 0., 0.], target_stds[1., 1., 1., 1.]), loss_clsdict(typeCrossEntropyLoss, use_sigmoidTrue, loss_weight1.0), loss_bboxdict(typeL1Loss, loss_weight1.0)), roi_headdict( typeStandardRoIHead, bbox_roi_extractordict( typeSingleRoIExtractor, roi_layerdict(typeRoIAlign, output_size7, sampling_ratio0), out_channels256, featmap_strides[4, 8, 16, 32]), bbox_headdict( typeShared2FCBBoxHead, in_channels256, fc_out_channels1024, roi_feat_size7, num_classes80, bbox_coderdict( typeDeltaXYWHBBoxCoder, target_means[0., 0., 0., 0.], target_stds[0.1, 0.1, 0.2, 0.2]), reg_class_agnosticFalse, loss_clsdict(typeCrossEntropyLoss, use_sigmoidFalse, loss_weight1.0), loss_bboxdict(typeL1Loss, loss_weight1.0))))有几个字段值得单独说frozen_stages1表示 ResNet 的第一个 stage 冻结不训练。这是为了省显存、也防止小数据集上过拟合。数据量足够大的话可以改成 0让整个主干都参与微调。注意 RPN 的target_stds是 [1,1,1,1]而 ROI head 的是 [0.1,0.1,0.2,0.2]这两个不一致经常让人困惑。原因是 RPN 的 anchor 尺度和 RoI 阶段的框尺度分布不同mmdet 的默认值是大量实验调出来的不建议新手乱动。reg_class_agnosticFalse表示回归头为每个类别单独输出一组偏移量。改成 True 会大幅减少参数量4×N 变成 4在类别少的数据集上基本没损失类别多的时候可能会掉点。loss_cls在 RPN 里use_sigmoidTrue在 ROI head 里use_sigmoidFalse用 softmax这个差异对应前面说的RPN 是二分类、检测头是多分类。4.3 train_cfg 和采样参数train_cfg dict( rpndict( assignerdict( typeMaxIoUAssigner, pos_iou_thr0.7, neg_iou_thr0.3, min_pos_iou0.3, match_low_qualityTrue, ignore_iof_thr-1), samplerdict( typeRandomSampler, num256, pos_fraction0.5, neg_pos_ub-1, add_gt_as_proposalsFalse), allowed_border-1, pos_weight-1, debugFalse), rpn_proposaldict( nms_pre2000, max_per_img1000, nmsdict(typenms, iou_threshold0.7), min_bbox_size0), rcnndict( assignerdict( typeMaxIoUAssigner, pos_iou_thr0.5, neg_iou_thr0.5, min_pos_iou0.5, match_low_qualityFalse, ignore_iof_thr-1), samplerdict( typeRandomSampler, num512, pos_fraction0.25, neg_pos_ub-1, add_gt_as_proposalsTrue), pos_weight-1, debugFalse))RPN 和 RCNN 的阈值设置差异很大RPN 的pos_iou_thr0.7标准高因为候选框多RCNN 的pos_iou_thr0.5标准低因为 proposal 本身就是粗筛过的。RCNN 的采样是 512 个、正样本占 0.25也就是 1:3 的正负比。add_gt_as_proposalsTrue在 RCNN 阶段很重要它保证每个 GT 一定会出现在正样本里避免 RPN 漏检导致某个目标完全没参与第二阶段训练。4.4 训练命令、学习率换算和日志解读标准 8 卡训练bash tools/dist_train.sh configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py 8单卡训练要改学习率。默认配置是 8 卡 × 2 张图 16 的 batch sizelr 是 0.02。单卡 batch size2 的话按线性缩放原则 lr 应该是 0.0025。mmdet 提供了自动缩放python tools/train.py configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py \ --auto-scale-lr日志里最值得盯的是这几项loss_rpn_cls、loss_rpn_bbox、loss_cls、loss_bbox。正常情况下四个值都会平滑下降loss_rpn_cls收敛到 0.1-0.2loss_rpn_bbox到 0.05-0.15 之间loss_cls到 0.2 以下。如果loss_rpn_bbox一直卡在 0.3 以上不掉八成是 anchor 尺度和数据不匹配先去统计一下数据集里 GT 框的宽高分布。另一个要看的指标是mAPCOCO 上验证集每几个 epoch 跑一次。1x schedule 是 12 个 epoch在第 8 和第 11 个 epoch 降学习率。自己在小数据集上训一般 20-40 个 epoch 更合适。4.5 推理、可视化和指标验证3.x 里最简单的推理方式python demo/image_demo.py demo/demo.jpg \ configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py \ checkpoints/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth \ --score-thr 0.5 \ --out-dir outputs导出检测结果的 json 然后跑评估python tools/test.py configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py \ checkpoints/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth \ --work-dir work_dirs/test_result可视化的时候一定要把--score-thr调低到 0.2 左右看一遍。只看 0.5 以上的框你会觉得模型很干净调到 0.2 再打开一个测试图那种框住了但分数不高的情况才是你真正该看的地方——它们往往揭示了分类头学得不够好或者某些类别的正样本太少。还有一点如果不是 COCO 格式的数据集先确认类别数和num_classes对齐。改了num_classes而没改 pretrained 权重的加载方式分类头会随机初始化这一点 mmdet 会自动处理但你得确认日志里没有大量的unexpected key警告。5. 实测踩坑与调参顺序5.1 小目标漏检先动 anchor 还是先动数据我做过一个工业质检项目检测 PCB 上的微小缺陷尺寸普遍在 10-30 像素之间。直接用默认配置训mAP 惨不忍睹可视化一看小缺陷一个框都没有。排查顺序应该是这样的第一步确认特征图的分辨率够不够。输入 800×1333P2 层的 stride 是 4也就是 200×333 的特征图一个 10 像素的缺陷在 P2 上只有 2.5 个像素理论上还能捕捉到但如果缺陷更小就彻底没了。这时候要么放大输入尺寸要么改 FPN 的num_outs加一层更高分辨率的 P3 替换 P2 的位置。第二步统计 GT 的真实分布。把标注框的宽高导出来画个散点图你会看到绝大多数框集中在哪个区间。我的数据集里 80% 的框宽度小于 40 像素而默认 anchor 在 P2 最小是 32、P3 是 64中间有明显空档。解决办法是把scales从[8]改成[4, 8]让每个层级铺两种尺度anchor 数量翻倍最细的能到 16 像素左右。第三步考虑采样和 NMS 的阈值。小目标本来就容易被 NMS 吃掉把 RPN 阶段的iou_threshold从 0.7 降到 0.6最终检测的 NMS 从 0.5 降到 0.45能多召回一些。这三步做完我在那个项目上的小目标召回率从 40% 出头提到了 80% 以上。优先顺序一定是输入分辨率 anchor 尺度 后处理阈值不要一上来就改 anchor。5.2 学习率、batch size 和 BN 层的联动Faster R-CNN 对学习率比较敏感尤其是两阶段结构里两个 head 的梯度尺度不同。几个实测经验学习率过高比如单卡直接用 0.02典型症状是loss_rpn_cls前几百个 iteration 剧烈震荡甚至出现 nan。这时候先用 1/10 的学习率配 warmup 跑通再慢慢往上加。如果显存不够只能用小 batch size比如 1 或 2BN 层是另一个坑。mmdet 的默认配置里norm_evalTrue意思是主干里的 BN 用预训练时的统计量不更新。这在 batch size 小的时候反而更稳。如果数据集和 ImageNet 分布差得远比如医学影像你可能想把它改成 False但这时候就得考虑换成 SyncBN 或者干脆冻住主干前几个 stage。还有一个很实用的技巧用--cfg-options在命令行临时覆盖配置不用改文件python tools/train.py config.py \ --cfg-options \ optim_wrapper.optimizer.lr0.005 \ train_dataloader.batch_size4 \ model.roi_head.bbox_head.num_classes5这个在做消融实验的时候能省掉大量复制粘贴配置文件的麻烦。5.3 标注质量引发的诡异现象有一次发现模型在某些图上会在完全空白的地方输出高置信度的框。查了两天代码最后发现是标注文件里混进了几个坐标超出图像边界的框训练时这些框把对应区域的 anchor 全都带偏了。这类问题的排查建议现象可能原因排查方法空白区域出框标注越界或重复标注检查 JSON 里坐标是否在 [0, w/h] 内某个类别几乎测不出该类样本数过少统计各类别框数量考虑重采样框位置对但类别错类别定义混淆抽查标注看是否有系统性错标大面积漏检anchor 尺度不匹配统计 GT 宽高分布大量重叠框NMS 阈值过高降低 iou_threshold 试试我在数据预处理里加了一个简单的校验脚本统计每张图的框数、尺寸分布、越界数量跑一遍就能发现大部分标注问题比训完之后再回头找原因省事得多。5.4 和单阶段检测器的选型思考如果不用考虑论文复现和精度天花板纯粹从落地角度选型我的判断标准大概是追求精度、目标密集、小目标多的时候选 Faster R-CNN 系尤其是遥感、病理切片、工业缺陷这类场景两阶段的样本组织方式天然更适合。追求实时性、目标尺度比较均匀的时候选一阶段像 YOLO 系列在 30 FPS 以上的场景里优势很明显。如果精度和速度都要可以考虑 FCOS、DETR 这类新一点的方案但要注意小数据集上 DETR 系列收敛慢的问题。不过从学习的角度讲Faster R-CNN 依然是最值得啃的。它把候选框生成特征对齐多任务损失采样策略这几个检测里的核心概念都摆在了明面上理解了它再看 RetinaNet 里 Focal Loss 为什么这么设计、看 DETR 里为什么用匈牙利匹配都能一下子抓住重点。5.5 几个能立刻省时间的做法第一先用小数据集跑通再上全量。挑 100 张图、改小 epoch十分钟就能验证配置有没有明显错误比在全量数据上跑一天才发现 num_classes 没改要划算得多。第二把 backbone 换成小模型做消融。ResNet-18 跑一轮是 ResNet-50 的三分之一时间用来验证 anchor 配置、数据增强这些改动是否有效足够了。第三保存训练日志并用脚本解析。mmdet 输出的日志是文本格式写个小脚本把 loss 和 mAP 抽出来画曲线比盯着终端滚屏强太多。我一般会把loss_rpn_bbox和loss_bbox画在同一张图上两条曲线分离得越来越开通常意味着两个阶段的训练不平衡需要调整 loss_weight。最后说一个我个人踩过的坑改完配置后一定要清掉work_dirs里的旧权重再训因为 mmdet 默认会从最近的 checkpoint 恢复如果新旧配置的模型结构不一样报错信息往往指向别的地方查起来非常绕。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

飞腾D2000休眠唤醒失效:从固件配置到验证的完整修复路径 2026/9/30 2:56:29

飞腾D2000休眠唤醒失效:从固件配置到验证的完整修复路径

简介:飞腾D2000平台在麒麟系统上出现休眠、唤醒异常,是国产化硬件适配中较常见的电源管理问题。面向正在开展飞腾X100D2000整机调试的工程师与运维人员,聚焦“休眠后无法唤醒”这一故障场景,提供一种有效解决思路。文档以docx格式…

阅读更多 →
285.Fastboot/EDL/BROM 三大刷机协议底层机制对比详解 2026/9/30 2:56:28

285.Fastboot/EDL/BROM 三大刷机协议底层机制对比详解

摘要 本文面向具备一定计算机基础的开发者与维修工程师,系统性地阐述安卓设备刷机与维修的底层原理。文章从分区表结构、Bootloader引导流程、Fastboot与Recovery协议入手,结合高通与联发科两大平台的实战案例,提供完整的ADB/Fastboot脚本代码,并深入分析变砖恢复、基带修…

阅读更多 →
领航杯网络安全竞赛:题库高频考点与避坑指南 2026/9/30 2:56:28

领航杯网络安全竞赛:题库高频考点与避坑指南

简介:面向“领航杯”江苏省青少年网络信息安全知识竞赛参赛者与指导教师的备赛题库,围绕竞赛核心考点整理而成,可作为日常自学与赛前冲刺的参考。内容系统覆盖系统锁定快捷键、数据备份意义、网络攻击分类(阻断/截获)、…

阅读更多 →
欢乐连连看:数据结构实战教学的综合训练场 2026/9/30 2:56:28

欢乐连连看:数据结构实战教学的综合训练场

简介:本资源是武汉理工大学《数据结构与算法实验》课程的实践项目——“欢乐连连看”完整实现源码包,面向计算机专业本科生及算法初学者,聚焦图搜索、路径匹配与游戏逻辑建模等核心能力训练。压缩包共53个文件,含4个cpp主程序源码…

阅读更多 →
深入学习printf和scanf函数 2026/9/30 2:56:27

深入学习printf和scanf函数

笔记以注释形式写入,现在只列举一下大纲吧,感觉有代码的话会更方便理解 看到实际的运作以及结果。printf一 基本用法二 占位符三 输出格式1.限定长度2.总显示正负号3.限定小数位数4.输出部分字符scanf一 基本用法二 返回值三 占位符注意事项四 赋值忽略符…

阅读更多 →
FastAPI+WebSocket实时聊天系统从零搭建与避坑指南 2026/9/30 2:56:20

FastAPI+WebSocket实时聊天系统从零搭建与避坑指南

简介:本资源是一套基于WebSocket协议实现的实时在线聊天系统毕业设计项目,面向计算机专业本科生及前端/全栈初学者,解决传统HTTP轮询在即时通信场景下的高延迟与低效问题。项目采用Vue.js构建响应式前端界面,Node.js搭建轻量后端服…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉