FEATURED · 精选文章

Swin Transformer目标检测实战:从原理到MMDetection完整部署指南

发布时间 / 2026/8/21 11:35:45
来源 / 创域科博编辑部
栏目 / 资讯中心
Swin Transformer目标检测实战:从原理到MMDetection完整部署指南 如果你在2023年还在用传统的CNN骨干网络比如ResNet做目标检测尤其是在处理高分辨率图像或密集小目标时可能会感觉模型性能遇到了瓶颈。模型要么精度上不去要么计算量爆炸或者两者兼有。这背后一个核心的痛点在于CNN的归纳偏置局部性、平移不变性在处理图像全局依赖关系时存在天然局限。这正是Swin Transformer要解决的问题。它不是一个简单的“用Transformer替换CNN”的玩具而是一套为视觉任务量身定制的、层次化的Transformer架构。它真正厉害的地方在于通过引入“窗口注意力”和“层级下采样”巧妙地平衡了全局建模能力和计算复杂度让Transformer在视觉任务上变得既强大又实用。这篇文章我们不谈空洞的理论而是聚焦于一个核心目标如何将Swin Transformer真正落地到你的目标检测项目中。我会带你从原理的本质理解出发拆解其核心框架如与Mask R-CNN、Cascade R-CNN的集成并给出从数据准备、模型训练到性能调优的完整思路和实操代码。无论你是想复现论文结果还是希望在自己的数据集上获得性能提升这篇文章都将提供一条清晰的路径。1. Swin Transformer解决了什么根本问题在目标检测领域我们长期面临一个权衡感受野与计算效率。传统的CNN通过堆叠卷积层来扩大感受野但这个过程是渐进的、局部的。一个深层的神经元要理解图像的全局信息需要经过多次局部信息的聚合。这对于需要理解场景上下文关系的任务如“人拿着球”中的“拿”这个关系来说效率不高且容易丢失长程依赖。Vision Transformer (ViT) 的出现带来了革命性的改变它将图像切分为Patch通过自注意力机制让模型在第一层就能建立任意两个Patch之间的联系实现了真正的全局建模。但这带来了一个新问题计算复杂度随图像尺寸呈平方级增长。对于一个224x224的图像切分成16x16的Patch后序列长度是196自注意力的计算量已经不小。对于目标检测常用的1024x1024甚至更高分辨率的输入这个计算量是完全不可接受的。Swin Transformer的巧妙之处在于它提出了“滑动窗口”和“层级结构”两大核心设计滑动窗口注意力不在整个图像上做全局注意力而是在不重叠的局部窗口内计算自注意力。这大大降低了计算复杂度从图像尺寸的平方降到窗口尺寸的平方。层级特征图像CNN一样通过Patch Merging操作逐步下采样构建特征金字塔。这使得Swin Transformer可以直接替换掉Faster R-CNN、Mask R-CNN等检测框架中的CNN骨干网络如ResNet无缝接入现有检测生态。简单来说Swin Transformer的核心价值是在保持Transformer强大全局建模能力的前提下将其计算复杂度降低到与CNN同级别甚至更低从而让高性能的Transformer骨干网络在密集预测任务如目标检测、分割中变得可行。2. 核心原理窗口注意力与移位窗口理解Swin Transformer关键在于弄懂两个核心机制窗口多头自注意力和移位窗口多头自注意力。2.1 窗口多头自注意力想象一下与其让图像中的每个像素都去关注所有其他像素全局注意力计算量巨大不如先把图像划分成一个个不重叠的“小方格”例如7x7的窗口。然后只让每个方格内的像素互相“交流”计算注意力。这就是W-MSA。计算复杂度对比假设特征图尺寸为h x w每个Patch看作一个token总token数为N h * w。全局MSA复杂度O(N²)因为每个token要和所有N个token计算相似度。窗口MSA复杂度假设窗口大小为M x M则窗口数量为(h/M) * (w/M)每个窗口内复杂度为O(M² * M²) O(M⁴)。总复杂度为窗口数 * 单个窗口复杂度 (hw / M²) * M⁴ O(hwM²)。由于M是固定值如7复杂度变为O(hw)即线性复杂度。这带来了质的飞跃使得处理高分辨率图像成为可能。2.2 移位窗口多头自注意力如果只在固定窗口内计算注意力窗口与窗口之间就没有信息交互这违背了Transformer建立长程依赖的初衷。为了解决这个问题Swin Transformer在连续的Transformer Block中交替使用两种窗口划分方式。第 l 层使用常规的窗口划分如从左上角开始划分M x M的窗口。第 l1 层将窗口向右下角各移动(M/2, M/2)个像素⌊M/2⌋。这样一来新的窗口由上一层中不同窗口的子区域组成从而实现了跨窗口的信息传递。这个设计极其精妙它没有引入任何额外的计算开销因为窗口大小M不变却巧妙地建立了相邻窗口间的连接。下图清晰地展示了这一过程(此处应为移位窗口示意图描述左图为常规窗口划分右图为移位后的窗口划分新窗口包含了旧窗口中不同部分的区域)通过这种“局部计算全局连接”的方式Swin Transformer在效率和效果之间找到了完美的平衡点。3. 环境准备从零搭建PyTorch训练环境在开始代码实践前我们需要一个稳定、可复现的环境。这里我们使用PyTorch和MMDetection一个基于PyTorch的开源目标检测工具箱因为它对Swin Transformer有官方支持且代码质量高、生态完善。3.1 基础环境配置# 1. 创建并激活conda环境推荐 conda create -n swin-det python3.8 -y conda activate swin-det # 2. 安装PyTorch请根据你的CUDA版本访问PyTorch官网获取最新命令 # 例如对于CUDA 11.3 pip install torch1.12.1cu113 torchvision0.13.1cu113 torchaudio0.12.1 --extra-index-url https://download.pytorch.org/whl/cu113 # 3. 安装MMCVOpenMMLab的计算机视觉基础库 # 必须安装完整版mmcv-full而非轻量版mmcv pip install openmim mim install mmcv-full1.7.1 # 版本需与MMDetection匹配 # 4. 安装MMDetection git clone https://github.com/open-mmlab/mmdetection.git cd mmdetection pip install -v -e . # “-e” 表示以可编辑模式安装方便修改源码3.2 安装Swin Transformer依赖Swin Transformer的官方实现包含在Swin-Transformer仓库中但MMDetection已经将其作为可选的骨干网络集成。我们通常只需要确保安装了正确的timm库和apex可选用于混合精度训练。# 安装timm一个包含众多视觉模型的PyTorch库 pip install timm # 可选但推荐安装Apex用于加速训练混合精度 # 安装前请确保你的PyTorch和CUDA版本兼容 git clone https://github.com/NVIDIA/apex cd apex pip install -v --disable-pip-version-check --no-cache-dir --global-option--cpp_ext --global-option--cuda_ext ./3.3 验证安装创建一个简单的Python脚本进行验证# verify_installation.py import torch import mmcv from mmdet.apis import init_detector, inference_detector print(fPyTorch Version: {torch.__version__}) print(fCUDA Available: {torch.cuda.is_available()}) print(fMMCV Version: {mmcv.__version__}) # 尝试导入MMDetection中的Swin Transformer相关配置 from mmdet.models.backbones.swin import SwinTransformer print(SwinTransformer backbone imported successfully!) # 尝试创建一个微型的Swin-T模型 model SwinTransformer(embed_dims96, depths[2, 2, 6, 2], num_heads[3, 6, 12, 24]) print(fModel created: {model})运行python verify_installation.py如果没有报错说明基础环境已就绪。4. 框架集成Swin Transformer MMDetectionSwin Transformer在MMDetection中作为骨干网络Backbone使用可以轻松与各种检测头Head和颈部Neck组合。最经典的组合是Swin Transformer FPN Mask R-CNN。4.1 配置文件解析MMDetection使用配置文件驱动整个训练和测试流程。一个典型的Swin Transformer目标检测配置文件如下所示# configs/swin/mask_rcnn_swin-t-p4-w7_fpn_1x_coco.py # 继承基础配置 _base_ [ ../_base_/models/mask-rcnn_r50_fpn.py, # 模型结构Mask R-CNN with FPN ../_base_/datasets/coco_instance.py, # 数据集COCO ../_base_/schedules/schedule_1x.py, # 训练计划1x schedule ../_base_/default_runtime.py # 运行时配置日志、钩子等 ] # 1. 模型配置将ResNet骨干网络替换为Swin-T model dict( backbonedict( _delete_True, # 删除继承自_base_的backbone配置 typeSwinTransformer, embed_dims96, depths[2, 2, 6, 2], num_heads[3, 6, 12, 24], window_size7, mlp_ratio4, qkv_biasTrue, qk_scaleNone, drop_rate0., attn_drop_rate0., drop_path_rate0.2, # 注意Swin通常需要drop_path_rate patch_normTrue, out_indices(0, 1, 2, 3), # 输出四个阶段的特征图供FPN使用 with_cpFalse, # 是否使用checkpointing节省显存 frozen_stages-1, init_cfgdict(typePretrained, checkpointhttps://github.com/SwinTransformer/storage/releases/download/v1.0.0/swin_tiny_patch4_window7_224.pth) ), neckdict(in_channels[96, 192, 384, 768]) # FPN的输入通道数与Swin-T输出对齐 ) # 2. 数据预处理调整输入尺寸以适应Swin img_norm_cfg dict( mean[123.675, 116.28, 103.53], std[58.395, 57.12, 57.375], to_rgbTrue) train_pipeline [ dict(typeLoadImageFromFile), dict(typeLoadAnnotations, with_bboxTrue, with_maskTrue), dict(typeRandomFlip, flip_ratio0.5), dict(typeResize, img_scale(1333, 800), keep_ratioTrue), # 典型检测尺寸 dict(typeNormalize, **img_norm_cfg), dict(typePad, size_divisor32), # Swin Transformer需要被window_size整除32是通用设置 dict(typeDefaultFormatBundle), dict(typeCollect, keys[img, gt_bboxes, gt_labels, gt_masks]), ] # 3. 优化器配置使用AdamW优化器这是训练Transformer的标配 optimizer dict( _delete_True, typeAdamW, lr0.0001, # 对于Batch Size 16通常设为0.0001 betas(0.9, 0.999), weight_decay0.05, paramwise_cfgdict( custom_keys{ absolute_pos_embed: dict(decay_mult0.), relative_position_bias_table: dict(decay_mult0.), norm: dict(decay_mult0.) # 通常不对norm层和bias做权重衰减 })) optimizer_config dict(grad_clipdict(max_norm35, norm_type2)) # 梯度裁剪 # 4. 学习率调度器 lr_config dict( policystep, warmuplinear, warmup_iters1000, warmup_ratio0.001, step[8, 11]) # 在8和11个epoch时降低学习率 runner dict(typeEpochBasedRunner, max_epochs12)关键点解析embed_dims,depths,num_heads: 定义了Swin的模型尺寸Tiny, Small, Base, Large。window_size: 注意力窗口大小默认为7。drop_path_rate:非常重要用于随机深度Stochastic Depth正则化防止过拟合大模型需要更大的值。out_indices: 指定输出哪几个阶段的特征图FPN需要4个尺度的特征。init_cfg: 指定预训练权重。强烈建议使用ImageNet上预训练的权重进行初始化这是提升收敛速度和最终精度的关键。AdamW和weight_decay: Transformer系列模型对优化器敏感AdamW是标准选择且需要对某些参数如位置编码关闭权重衰减。4.2 如何选择Swin变体MMDetection支持多种Swin变体对应不同的模型容量和速度模型变体embed_dimsdepthsnum_heads参数量FLOPs适用场景Swin-T96[2, 2, 6, 2][3, 6, 12, 24]~29M4.5G快速实验、移动端/边缘设备部署Swin-S96[2, 2, 18, 2][3, 6, 12, 24]~50M8.7G精度与速度的平衡点最常用Swin-B128[2, 2, 18, 2][4, 8, 16, 32]~88M15.4G追求高精度算力充足Swin-L192[2, 2, 18, 2][6, 12, 24, 48]~197M34.5G学术研究、刷榜、超大算力选择建议对于大多数目标检测任务Swin-S是一个很好的起点。如果追求更快的速度或部署到资源受限环境选Swin-T。如果数据集很大如COCO且计算资源丰富可以尝试Swin-B以获得最佳精度。5. 实战在自己的数据集上训练Swin Transformer检测器假设我们有一个自定义的数据集格式为COCO。我们将使用MMDetection来训练一个Swin-T Mask R-CNN的模型。5.1 数据集准备将你的数据集组织成COCO格式custom_dataset/ ├── annotations/ │ ├── instances_train2017.json │ └── instances_val2017.json ├── train2017/ │ ├── 000001.jpg │ └── ... └── val2017/ ├── 000001.jpg └── ...5.2 创建自定义配置文件在mmdetection/configs/swin/目录下创建你的配置文件mask_rcnn_swin-t_fpn_1x_custom.py。# mask_rcnn_swin-t_fpn_1x_custom.py _base_ ./mask_rcnn_swin-t-p4-w7_fpn_1x_coco.py # 1. 修改数据集路径和类别 dataset_type CocoDataset data_root data/custom_dataset/ # 修改为你的数据集根目录 classes (person, car, dog, ...) # 修改为你的类别列表 data dict( samples_per_gpu2, # 根据你的GPU显存调整Swin-T在2080Ti上batch_size2是安全的 workers_per_gpu2, traindict( typedataset_type, ann_filedata_root annotations/instances_train2017.json, img_prefixdata_root train2017/, classesclasses # 指定类别 ), valdict( typedataset_type, ann_filedata_root annotations/instances_val2017.json, img_prefixdata_root val2017/, classesclasses ), testdict( typedataset_type, ann_filedata_root annotations/instances_val2017.json, img_prefixdata_root val2017/, classesclasses ) ) # 2. 修改模型中的类别数 model dict( roi_headdict( bbox_headdict(num_classeslen(classes)), # 修改bbox head的类别数 mask_headdict(num_classeslen(classes)) # 修改mask head的类别数 ) ) # 3. 修改预训练权重路径如果不用官方COCO预训练可以注释掉 # 如果你想从ImageNet预训练的Swin权重开始取消下面注释并修改路径 # model[backbone][init_cfg] dict(typePretrained, checkpointyour_path/swin_tiny_patch4_window7_224.pth) # 4. 根据你的数据集大小调整学习率和训练周期 # 如果数据集很小1k张建议降低学习率并减少epoch # optimizer[lr] 0.00002 # lr_config[step] [6, 8] # runner[max_epochs] 105.3 启动训练使用MMDetection提供的工具脚本启动分布式或单GPU训练# 单GPU训练 python tools/train.py configs/swin/mask_rcnn_swin-t_fpn_1x_custom.py # 多GPU分布式训练例如4张GPU bash tools/dist_train.sh configs/swin/mask_rcnn_swin-t_fpn_1x_custom.py 4训练开始后你可以在终端看到损失曲线和评估指标。日志和模型权重默认保存在work_dirs/目录下。5.4 模型测试与推理训练完成后使用以下命令在验证集上测试模型性能# 单GPU测试 python tools/test.py configs/swin/mask_rcnn_swin-t_fpn_1x_custom.py \ work_dirs/mask_rcnn_swin-t_fpn_1x_custom/epoch_12.pth \ --eval bbox segm # 评估边界框和分割掩码 # 多GPU测试 bash tools/dist_test.sh configs/swin/mask_rcnn_swin-t_fpn_1x_custom.py \ work_dirs/mask_rcnn_swin-t_fpn_1x_custom/epoch_12.pth \ 4 --eval bbox segm你也可以编写Python脚本进行单张图片推理# inference_demo.py from mmdet.apis import init_detector, inference_detector, show_result_pyplot import mmcv # 配置文件和训练好的权重文件 config_file configs/swin/mask_rcnn_swin-t_fpn_1x_custom.py checkpoint_file work_dirs/mask_rcnn_swin-t_fpn_1x_custom/epoch_12.pth # 初始化模型 model init_detector(config_file, checkpoint_file, devicecuda:0) # 测试单张图片 img test.jpg result inference_detector(model, img) # 可视化结果 # 将结果绘制到图像上 vis_img show_result_pyplot(model, img, result, score_thr0.3) # score_thr为置信度阈值 # 或者保存结果图像 mmcv.imwrite(vis_img, result.jpg) # 打印检测到的目标信息 pred_bboxes, pred_masks result for i, (bbox, mask) in enumerate(zip(pred_bboxes, pred_masks)): if len(bbox) 0: print(fClass {i} detected {len(bbox)} instances.) for j, box in enumerate(bbox): # box格式: [x1, y1, x2, y2, score] print(f Instance {j}: bbox{box[:4]}, score{box[4]:.3f})6. 核心调优思路不止是改学习率调优是提升模型性能的关键。对于Swin Transformer检测模型调优需要系统性的思考。6.1 数据层面调优数据增强Swin Transformer作为强骨干网络能够从更激进的数据增强中受益。推荐在MMDetection的pipeline中加入RandomCrop、MosaicYOLO系列常用、MixUp、CutMix。这些增强能显著提升模型鲁棒性尤其是对于小目标。注意增强强度需要与数据集大小匹配。小数据集需要更强的增强来防止过拟合。# 在train_pipeline中添加Mosaic和RandomAffine仿射变换 train_pipeline [ dict(typeMosaic, img_scale(640, 640), pad_val114.0), dict(typeRandomAffine, scaling_ratio_range(0.5, 1.5), border(-320, -320)), # ... 其他pipeline ]输入分辨率Swin Transformer支持可变输入尺寸。提高输入分辨率是提升小目标检测精度最直接有效的方法之一但会显著增加计算量和显存消耗。你需要根据你的GPU资源在img_scale参数上做权衡。类别不平衡如果数据集中某些类别样本极少考虑使用ClassBalancedDataset包装器或者使用Focal Loss等针对类别不平衡设计的损失函数。6.2 模型结构与超参数调优Drop Path Rate这是Swin Transformer最重要的正则化超参数。它随机“丢弃”网络中的一些层在训练时将其设置为恒等映射防止过拟合。经验法则模型越大、数据集越小drop_path_rate应该设置得越大。对于Swin-T0.2是常用起点对于Swin-B/L可以尝试0.3-0.5。调优方法在验证集上监控训练损失和验证损失的差距。如果验证损失很早就开始上升过拟合尝试增大drop_path_rate。窗口大小window_size默认为7。增大窗口尺寸如14可以扩大局部注意力的范围可能提升对大目标的检测能力但计算量会以O(M²)增长。通常不建议修改除非有特殊需求。FPN与Neck结构Swin Transformer输出多尺度特征FPN是标准颈部。你可以尝试更强大的颈部如PAFPNPath Aggregation FPN或BiFPN加权双向FPN它们能更好地融合不同尺度的特征。# 使用PAFPN neckdict( typePAFPN, in_channels[96, 192, 384, 768], out_channels256, num_outs5),检测头Mask R-CNN是实例分割的经典选择。如果你只做目标检测可以换用更轻量或更先进的检测头如RetinaNet单阶段或Cascade R-CNN多阶段精度更高但更慢。6.3 训练策略调优优化器与学习率AdamW是必须的。weight_decay通常设为0.05。对于norm层和bias参数应关闭权重衰减如配置文件所示。学习率与Batch Size线性缩放规则当批量大小变化时学习率应同比例变化。例如基准配置lr0.0001对应batch_size16。如果你用单卡batch_size2学习率应设为0.0001 * (2/16) 0.0000125。学习率预热对于Transformer学习率预热至关重要。通常设置1000次迭代的线性预热。训练周期与调度Swin Transformer通常需要更长的训练周期才能充分收敛。在COCO上“1x schedule”是12个epoch。对于自定义数据集如果数据集较小可以适当减少epoch但学习率下降的步长也要相应调整。使用验证集上的mAP作为早停Early Stopping的依据避免过拟合。混合精度训练使用apex或 PyTorch内置的torch.cuda.amp进行混合精度训练可以大幅减少显存占用从而允许使用更大的批量大小或更高的输入分辨率通常还能略微加速训练。# 在启动训练命令中加入 --amp 参数如果MMDetection支持 python tools/train.py config_file --amp6.4 后处理与推理调优非极大值抑制NMS的阈值nms_thr对最终结果影响很大。默认0.5可能不是最优的。对于密集目标场景可以尝试降低阈值如0.3来减少误检对于稀疏大目标可以尝试提高阈值。置信度阈值推理时可视化用的score_thr和评估用的固定阈值可能不同。在评估模型真实性能时应使用官方的COCO评估协议通常使用多个IoU阈值下的平均精度。在部署时根据应用场景调整置信度阈值以平衡查全率和查准率。7. 常见问题与排查思路在训练和部署Swin Transformer检测模型时你可能会遇到以下典型问题问题现象可能原因排查方式解决方案训练初期Loss为NaN学习率过高数据中存在异常值如坐标越界混合精度训练不稳定。检查数据标注的边界框坐标是否在图像范围内暂时关闭混合精度训练监控前几个batch的梯度。降低学习率如1e-5清洗数据使用梯度裁剪在混合精度训练中设置loss_scale‘dynamic’。显存溢出输入分辨率过高批量大小过大模型尺寸过大如用了Swin-L。使用nvidia-smi监控显存使用尝试逐步减小img_scale或batch_size。降低输入分辨率使用梯度累积模拟更大批量换用更小的模型变体如Swin-T使用with_cpTrue检查点技术节省显存。验证集mAP很低但训练Loss正常下降严重过拟合验证集和训练集分布差异大评估代码有误。检查训练集和验证集的标注格式、类别是否一致可视化一些验证集预测结果。增加数据增强强度增大drop_path_rate收集更多训练数据确保评估时模型处于eval()模式。训练速度非常慢没有使用预训练权重窗口注意力计算是瓶颈对于极大图像。检查是否成功加载了预训练权重使用profiler工具分析代码耗时。务必加载ImageNet预训练权重考虑使用更大的window_size减少窗口数量但需权衡计算量确保使用了多GPU训练。小目标检测效果差输入分辨率太低FPN特征融合不够数据中小目标样本少。统计数据集中目标尺寸的分布可视化FPN各层特征图。提高输入分辨率尝试更强大的Neck如BiFPN在数据增强中专门针对小目标如随机裁剪时保留小目标使用专门的小目标检测算法改进检测头。无法加载预训练权重权重文件路径错误模型结构定义与权重不匹配如修改了stage数量。打印模型状态字典和权重文件中的键名对比差异。确保配置文件中的init_cfg路径正确如果修改了骨干网络结构可能需要加载部分权重或从头训练。8. 最佳实践与工程建议始终使用预训练权重在ImageNet-1K或ImageNet-22K上预训练的Swin Transformer权重包含了强大的视觉表征能力。从零开始训练Swin Transformer检测模型不仅需要海量数据而且极其耗时效果也远不如微调预训练模型。这是与训练一些传统CNN模型最大的不同点。监控训练动态不要只盯着最后的mAP。使用TensorBoard或MMDetection自带的日志系统密切关注训练损失曲线、验证损失曲线、学习率变化曲线。理想情况下训练损失应平稳下降验证损失在后期应趋于平稳或缓慢上升避免过拟合。进行消融实验当你想引入一项新技术如新的数据增强、不同的Neck时务必进行控制变量实验。保持其他所有设置不变只改变一个变量在验证集上观察其影响。这是理解每个组件贡献度的唯一科学方法。关注部署友好性如果你最终需要将模型部署到生产环境如服务器或边缘设备需要考虑模型量化将FP32模型转换为INT8可以大幅减少模型体积和推理延迟。PyTorch提供了量化工具。TensorRT/ONNX转换将PyTorch模型转换为ONNX格式再利用TensorRT等推理引擎进行优化能获得极致的推理速度。注意Swin Transformer中自定义算子如移位窗口的转换兼容性。剪枝移除网络中不重要的连接或通道在精度损失很小的情况下压缩模型。版本控制与复现性记录每次实验的完整配置配置文件、随机种子、环境依赖。使用Git管理你的代码和配置文件。考虑使用MLflow或Weights Biases等工具管理实验记录。Swin Transformer的出现标志着视觉Transformer在通用视觉任务上走向成熟。它不再是一个需要小心翼翼调参的“学术模型”而是一个可以像ResNet一样被工程师们放心地集成到各种检测、分割 pipeline 中的强大工具。其核心价值在于它提供了一种在计算效率允许的范围内获取全局上下文信息的新范式。对于实践者而言掌握Swin Transformer的关键不在于死记硬背其数学公式而在于理解其“局部计算、层级构建、全局连接”的设计哲学并熟练运用现有的深度学习框架如MMDetection将其快速落地。从选择一个合适的变体开始加载预训练权重在自定义数据上进行微调再根据具体任务进行有针对性的调优——这套流程对于大多数目标检测应用来说已经足够产生显著的效果提升。下一步你可以探索Swin Transformer V2支持更高的分辨率和更深的模型、将Swin作为其他视觉任务如姿态估计、视频理解的骨干或者研究如何将其与最新的检测范式如DETR系列结合。这个领域仍在快速演进但坚实的基础和清晰的调优思路能让你始终站在实用的前沿。
RELATED — 相关阅读

相关资讯

LATEST — 最新资讯

最新发布

TODAY — 本日精选

新闻

WEEKLY — 本周精选

新闻

MONTHLY — 本月精选

新闻