ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

现代Backbone提升多任务DETR在乳腺X线摄影分类与病灶定位中的应用

现代Backbone提升多任务DETR在乳腺X线摄影分类与病灶定位中的应用 乳腺X线摄影Mammography的AI辅助诊断一直有个很现实的问题单一模型往往只解决分类或只解决检测而临床场景需要同时知道“有没有异常”和“异常在哪里”。近两年DETR系列检测器在通用目标检测中表现不错但它能不能直接用在乳腺X线摄影这种医学影像任务上多任务DETR给出了一个可行的思路。本文将围绕“Modern Backbones Improve Multi-task DETR for Mammography Classification and Lesion Localization”这个研究方向拆解多任务DETR的原理、Backbone在其中的作用并给出一套可以动手跑起来的简化实验代码。如果你正在做医学影像AI、多任务检测或者对DETR的落地场景感兴趣这篇文章会很适合你。1. 背景与核心概念1.1 乳腺X线摄影AI要解决什么问题乳腺X线摄影是乳腺癌筛查中非常常用的影像检查手段。放射科医生通过读片需要完成两件事判断有没有病变这是图像级别的分类任务输出的是“正常 / 异常”或者BI-RADS分级。指出病灶在哪这是像素级别或框级别的定位任务输出的是病变区域的位置。过去很多AI系统只做其中一件事。做分类的模型不管位置做检测的模型又不太关心全局判断。但临床上两个信息是互相印证的如果一个模型已经找到了疑似病灶那它大概率应该把这张图判为异常反过来如果整张图被判为异常医生也希望模型指出怀疑的区域方便复核。多任务学习正好解决这个问题。它在同一个模型里同时优化分类和检测两个目标让两个任务共享特征表达。这样做的直接好处有三个特征复用模型参数量不会翻倍分类任务可以利用检测分支提供的位置信息检测任务可以利用分类分支的全局语义信息减少假阳性。1.2 从Transformer到DETR检测器的新范式DETRDetection Transformer是Facebook AI团队提出的目标检测框架它的核心思想是把目标检测当成一个集合预测问题。传统检测器比如Faster R-CNN、YOLO通常要设置大量Anchor框再通过NMS合并重叠结果。DETR完全不需要这些手工设计它使用Transformer的编码器-解码器结构配合一组可学习的Object Queries直接输出固定数量的预测框。DETR的主要组件包括Backbone先用CNN网络提取图像特征Transformer Encoder对特征图进行全局建模Transformer Decoder通过Object Queries逐步解码出目标预测头输出每个目标的类别和边界框匈牙利匹配算法把预测结果和真实标注做一一匹配计算损失。DETR在通用目标检测上表现不错但在医学影像上有一个明显痛点小目标检测能力偏弱。医学影像中的病灶往往很小、边界不清晰Transformer的注意力机制计算开销也更大。后来出现的Deformable DETR通过可变形注意力机制降低了计算量也提升了小目标召回率是做医学影像DETR时很值得关注的方向。1.3 什么是“多任务DETR”多任务DETR简单说就是在DETR的框架上增加一个分类分支让模型同时输出两个结果整张图的分类结果图中病灶的定位框。为什么要在DETR上做多任务而不是在CNN检测器上做因为DETR天然适合这种结构。DETR的Decoder输出是一组Query向量每个Query解码出一个候选目标。我们可以从这组Query中聚合出全局特征再映射为图像级分类结果。也就是说分类任务不需要额外设计复杂的特征池化结构直接用检测分支的Query特征就能得到。这在乳腺X线摄影这类场景里特别合适。因为乳腺X线摄影的病灶种类多、大小差异大有些病灶可能只占整张图的很小一部分。如果只用全局分类模型模型很难知道该关注哪里如果只用检测模型又缺少全局判断的兜底。多任务DETR把两者结合起来正好互补。1.4 “Modern Backbones”提升的是什么论文标题里的“Modern Backbones”指的是比传统ResNet更现代的特征提取网络比如Swin Transformer、ConvNeXt、EfficientNet系列等。传统ResNet是2015年提出的网络结构虽然稳定好用但在多任务DETR框架里它的特征表达能力逐渐成为瓶颈。现代Backbone通常有更强的特征提取能力有的通过注意力机制建模长距离依赖有的通过更先进的卷积设计提升感受野。在多任务DETR中Backbone不仅影响检测框的精度也会影响分类分支的特征质量。所以“Modern Backbones Improve Multi-task DETR”这个标题想表达的核心结论是当Backbone变强时同一个多任务DETR框架的分类和定位性能都会受益。2. 方法拆解多任务DETR是怎么工作的2.1 整体框架多任务DETR的框架可以直观地拆成四段输入图像 → Backbone → Transformer Encoder → Transformer Decoder → 多任务输出Backbone负责把原始图像变成特征图Encoder对特征图做全局上下文建模Decoder通过Object Queries逐步解码出目标在Decoder的输出上分别接分类头和定位头得到图像级分类结果和病灶框。如果你看过DETR论文里的结构图会发现它的Decoder输出每个Query对应一个预测目标。多任务DETR的改动通常在Decoder之后不直接丢掉Query信息而是把所有Query的特征汇集起来作为分类分支的输入。2.2 Backbone在多任务中的角色Backbone提取的特征质量决定了后续所有模块的上限。在多任务场景里Backbone要同时服务两个目标对定位任务来说Backbone需要保留足够的空间细节。如果一个病灶只有几个像素大小Backbone下采样倍数太高病灶特征可能直接丢失了。所以很多医学影像检测模型会控制Backbone的下采样倍数或者利用多尺度特征图。对分类任务来说Backbone需要提取全局语义特征。判断一张图是否异常通常要观察双侧对称性、整体腺体密度、弥漫性钙化等。这些信息需要较大的感受野。现代Backbone通常具有层次化结构可以提供不同尺度的特征。比如Swin Transformer的四个Stage分别输出不同分辨率的特征图这比ResNet的C2-C5特征更有层次感。在Deformable DETR中多尺度特征可以直接送入可变形注意力模块进一步提升小目标检测能力。2.3 分类任务与检测任务如何耦合多任务DETR的耦合方式一般有两种方式一在Decoder输出上分叉。Decoder输出的Query特征一方面送入分类预测头得到每个Query对应目标的类别和框另一方面对所有Query特征做聚合比如平均池化、注意力池化送入图像分类头。方式二共享Encoder独立Decoder。两个任务共享Backbone和Encoder在Decoder部分各用一组Query。这种耦合更弱但计算量更大。对于乳腺X线摄影这种病灶相对集中的场景第一种方式更常见。它让分类分支能利用检测分支已经学到的局部位置信息两个任务互相促进。2.4 损失函数与训练策略多任务DETR的损失函数由三部分组成检测分类损失每个Query预测的目标类别使用交叉熵损失检测回归损失每个Query预测的边界框通常用L1损失 GIoU损失图像分类损失聚合Query特征后预测的图像级类别使用交叉熵或加权交叉熵。总损失是这三部分的加权和L λ1 * L_cls_det λ2 * L_reg λ3 * L_cls_image其中 λ 是各损失项的权重需要根据实验调节。在乳腺X线摄影中如果异常样本较少图像分类损失通常需要加权或者使用Focal Loss来缓解类别不均衡。训练时还需要注意DETR的收敛速度比其他检测器慢通常需要更多epoch。如果数据量不够大可以先冻结Backbone只训练Transformer部分等模型稳定后再解冻全部参数。3. 环境准备与依赖版本3.1 硬件环境建议多任务DETR对显存要求比较高实验建议使用显存不低于16GB的GPU比如NVIDIA V100、RTX 3090、A100等。如果你的显卡显存只有8GB可以通过以下方式降低显存占用降低输入图像分辨率减小Batch Size使用更轻量的Backbone比如Swin-T、ConvNeXt-T使用梯度累积模拟更大的Batch Size。如果没有GPU可以先用小数据集、小分辨率做结构验证但完整训练还是建议用GPU。3.2 依赖库版本说明本文示例以常见的PyTorch环境为基础版本需要根据你的项目实际情况调整。大致依赖如下依赖库作用Python运行环境PyTorch深度学习框架torchvision图像处理工具timm加载现代Backbone预训练权重pandas / numpy数据处理opencv-python图像读取与预处理albumentations图像增强scikit-learn计算AUC等指标安装命令示例pip install torch torchvision timm pandas numpy opencv-python albumentations scikit-learn如果你的PyTorch是CPU版本需要到官网选择对应的安装命令。CUDA版本建议使用11.8或12.1以上以免与PyTorch版本冲突。3.3 项目目录结构为了让后续代码更清晰建议按下面的目录组织项目mammo_multitask_detr/ ├── data/ │ ├── train/ │ ├── validation/ │ └── annotations.csv ├── models/ │ ├── backbone.py │ ├── multi_task_detr.py │ └── criterion.py ├── utils/ │ ├── dataset.py │ └── metrics.py ├── train.py ├── validate.py └── config.py其中models/存放模型定义utils/存放数据集和指标计算函数train.py是训练入口。4. 从零搭建一个简化多任务DETR实验这部分给出一个可用于理解原理的简化实现。需要注意的是这是教学演示代码用于帮助你理解多任务DETR的结构完整复现论文效果还需要参考官方Detection代码库的实现细节。4.1 数据准备与预处理乳腺X线摄影的原始数据一般是DICOM格式工程上通常先转成PNG或JPG然后进行标准化。这里假设你已经把图像整理成下面的CSV标注格式image_path,label,x_min,y_min,x_max,y_max train/001.png,1,120,80,260,220 train/002.png,0,0,0,0,0其中label为1表示异常为0表示正常。正常图像没有病灶框用0填充。读取数据集的代码# 文件路径utils/dataset.py import os import cv2 import pandas as pd import torch from torch.utils.data import Dataset class MammoDataset(Dataset): def __init__(self, csv_path, image_dir, transformNone): self.df pd.read_csv(csv_path) self.image_dir image_dir self.transform transform def __len__(self): return len(self.df) def __getitem__(self, idx): row self.df.iloc[idx] image_path os.path.join(self.image_dir, row[image_path]) image cv2.imread(image_path, cv2.IMREAD_GRAYSCALE) # 如果是灰度图转为三通道方便Backbone加载ImageNet预训练权重 image cv2.cvtColor(image, cv2.COLOR_GRAY2RGB) image cv2.resize(image, (512, 512)) label int(row[label]) x_min, y_min, x_max, y_max row[x_min], row[y_min], row[x_max], row[y_max] # 归一化坐标到0-1之间 h, w image.shape[:2] boxes [] if label 1: boxes [[x_min / w, y_min / h, x_max / w, y_max / h]] # 转成Tensor格式 image torch.from_numpy(image.transpose(2, 0, 1)).float() / 255.0 boxes_tensor torch.as_tensor(boxes, dtypetorch.float32) labels_tensor torch.as_tensor([label], dtypetorch.long) return image, labels_tensor, boxes_tensor这里有两个注意点乳腺X线摄影是灰度图像但大部分Backbone预训练权重基于ImageNet的RGB图像。把灰度图复制到三个通道可以复用预训练权重。坐标要归一化到0-1与DETR内部的框表示方式保持一致。4.2 定义现代Backbone使用timm库可以非常方便地加载Swin、ConvNeXt等现代Backbone。这里以Swin-Tiny为例# 文件路径models/backbone.py import torch.nn as nn import timm class ModernBackbone(nn.Module): def __init__(self, backbone_nameswin_tiny_patch4_window7_224, output_layers[1, 2, 3]): super().__init__() self.backbone timm.create_model( backbone_name, pretrainedTrue, features_onlyTrue, out_indicesoutput_layers ) def forward(self, x): # 返回多尺度特征列表 features self.backbone(x) return features如果你想要更轻量的方案可以把backbone_name换成convnext_tinyefficientnet_b0resnet50通过features_onlyTrue我们拿到的是多尺度特征图这些特征会送入Transformer Encoder。这里说明一下timm不同Backbone输出的通道数不同后续接Transformer时需要做线性投影对齐。4.3 定义简化的多任务DETR模型为了让你理解核心结构这里用最简方式模拟DETR的多任务思路Backbone提取特征经过一个简单的Transformer Encoder-Decoder再输出分类和检测结果。# 文件路径models/multi_task_detr.py import torch import torch.nn as nn import torch.nn.functional as F class MultiTaskDETR(nn.Module): def __init__(self, backbone, d_model256, num_queries10, num_classes1): super().__init__() self.backbone backbone # 为了简化这里只取Backbone的最后一层特征 self.input_proj nn.Conv2d(768, d_model, kernel_size1) # 简化版Transformer Encoder encoder_layer nn.TransformerEncoderLayer( d_modeld_model, nhead8, batch_firstTrue ) self.encoder nn.TransformerEncoder(encoder_layer, num_layers3) # 简化版Transformer Decoder decoder_layer nn.TransformerDecoderLayer( d_modeld_model, nhead8, batch_firstTrue ) self.decoder nn.TransformerDecoder(decoder_layer, num_layers3) # Object Queries可学习的检测查询向量 self.query_embed nn.Embedding(num_queries, d_model) # 检测分类头 self.det_class_head nn.Linear(d_model, num_classes 1) # 检测框头 self.det_bbox_head nn.Linear(d_model, 4) # 图像级分类头对Query特征聚合后做分类 self.img_class_head nn.Sequential( nn.Linear(d_model, 128), nn.ReLU(), nn.Linear(128, 1) ) def forward(self, x): # Backbone提取特征 features self.backbone(x) # 取最后一层特征并做通道投影 feat features[-1] feat self.input_proj(feat) # 将特征图拉平成序列 b, c, h, w feat.shape feat feat.flatten(2).transpose(1, 2) # (b, h*w, c) # Encoder编码 memory self.encoder(feat) # Decoder解码 queries self.query_embed.weight.unsqueeze(0).repeat(b, 1, 1) tgt torch.zeros_like(queries) hs self.decoder(tgt, memory, query_posqueries) # 检测分支 det_logits self.det_class_head(hs) # (b, num_queries, num_classes1) det_boxes self.det_bbox_head(hs).sigmoid() # (b, num_queries, 4) # 图像分类分支对Query特征做平均池化 query_feat hs.mean(dim1) # (b, d_model) img_logits self.img_class_head(query_feat) # (b, 1) return img_logits, det_logits, det_boxes这个模型的输出有三个img_logits图像级分类的logitsdet_logits每个Query预测的目标类别logitsdet_boxes每个Query预测的边界框坐标已经通过sigmoid归一化到0-1。注意真正的DETR解码器还需要位置编码、掩码处理、多尺度特征等细节这里的省略是为了让代码更可读。实际项目中建议直接基于官方DETR或Deformable DETR代码改造。4.4 定义损失函数多任务损失由图像分类损失和检测损失组成。这里使用BCE损失处理图像分类使用交叉熵和L1损失处理检测部分。# 文件路径models/criterion.py import torch import torch.nn as nn import torch.nn.functional as F class MultiTaskCriterion(nn.Module): def __init__(self, alpha2.0): super().__init__() self.alpha alpha def forward(self, img_logits, det_logits, det_boxes, gt_labels, gt_boxes): # 图像分类损失 img_target gt_labels.float().unsqueeze(1) # (b, 1) img_loss F.binary_cross_entropy_with_logits(img_logits, img_target) # 检测分类损失简化处理只计算有病灶样本的Query损失 # 实际DETR需要用匈牙利匹配分配Query和GT det_class_loss 0.0 det_bbox_loss 0.0 for i in range(gt_labels.size(0)): label gt_labels[i].item() if label 1: # 这里简化使用第一个Query作为匹配结果 pred_logit det_logits[i, 0:1, :] # (1, num_classes1) pred_box det_boxes[i, 0:1, :] # (1, 4) # 类别损失 target_cls torch.tensor([1], devicedet_logits.device) det_class_loss F.cross_entropy(pred_logit, target_cls) # 框损失 gt_box gt_boxes[i].unsqueeze(0) # (1, 4) bbox_l1 F.l1_loss(pred_box, gt_box) det_bbox_loss bbox_l1 else: # 负样本没有病灶 pred_logit det_logits[i, 0:1, :] target_cls torch.tensor([0], devicedet_logits.device) det_class_loss F.cross_entropy(pred_logit, target_cls) loss img_loss self.alpha * (det_class_loss det_bbox_loss) return loss这段代码里匈牙利匹配被简化成了“用第一个Query匹配第一个GT”。真实训练中必须用匈牙利匹配否则Query之间无法准确分配监督信号。不过作为结构演示这个实现能帮你跑通前向和反向流程。4.5 训练脚本训练脚本是完整流程的入口。核心逻辑如下# 文件路径train.py import torch import torch.optim as optim from torch.utils.data import DataLoader from models.backbone import ModernBackbone from models.multi_task_detr import MultiTaskDETR from models.criterion import MultiTaskCriterion from utils.dataset import MammoDataset device torch.device(cuda if torch.cuda.is_available() else cpu) # 定义数据集 train_dataset MammoDataset( csv_pathdata/annotations.csv, image_dirdata/, ) train_loader DataLoader(train_dataset, batch_size4, shuffleTrue, num_workers4) # 定义模型 backbone ModernBackbone() model MultiTaskDETR(backbonebackbone).to(device) criterion MultiTaskCriterion() optimizer optim.AdamW(model.parameters(), lr1e-4) # 训练循环 num_epochs 20 for epoch in range(num_epochs): model.train() total_loss 0.0 for images, gt_labels, gt_boxes in train_loader: images images.to(device) gt_labels gt_labels.to(device) gt_boxes gt_boxes.to(device) img_logits, det_logits, det_boxes model(images) loss criterion(img_logits, det_logits, det_boxes, gt_labels, gt_boxes) optimizer.zero_grad() loss.backward() optimizer.step() total_loss loss.item() print(fEpoch {epoch1}/{num_epochs}, Loss: {total_loss / len(train_loader):.4f})如果你发现训练速度慢或者显存不足可以先把num_queries调小比如从10调整到5或者把输入图像从512×512改成256×256。4.6 验证与指标计算乳腺X线摄影分类任务最常用的指标是AUC检测任务常用mAP和IoU。这里给出AUC的计算示例# 文件路径validate.py import torch import numpy as np from sklearn.metrics import roc_auc_score from torch.utils.data import DataLoader from models.backbone import ModernBackbone from models.multi_task_detr import MultiTaskDETR from utils.dataset import MammoDataset device torch.device(cuda if torch.cuda.is_available() else cpu) val_dataset MammoDataset( csv_pathdata/validation.csv, image_dirdata/, ) val_loader DataLoader(val_dataset, batch_size4, shuffleFalse, num_workers4) backbone ModernBackbone() model MultiTaskDETR(backbonebackbone).to(device) model.load_state_dict(torch.load(best_model.pth)) model.eval() all_labels [] all_scores [] with torch.no_grad(): for images, gt_labels, gt_boxes in val_loader: images images.to(device) img_logits, _, _ model(images) probs torch.sigmoid(img_logits).cpu().numpy() all_scores.extend(probs.flatten()) all_labels.extend(gt_labels.numpy().flatten()) auc roc_auc_score(all_labels, all_scores) print(fAUC: {auc:.4f})除了AUC医学影像报告中经常还会提到敏感性Sensitivity和特异性Specificity。这两个指标和模型预测阈值有关需要根据临床需求确定阈值。5. 实验效果与结果观察5.1 不同Backbone的对比思路实验的核心是验证不同Backbone对多任务DETR的影响。你可以按照下面的表格设计一组对照实验Backbone参数量图像分类AUC检测mAP训练耗时ResNet-50约25M待测待测基准Swin-Tiny约28M待测待测较慢ConvNeXt-Tiny约28M待测待测中等每组实验使用相同的训练集、验证集和超参数只替换Backbone。这样才能公平地比较Backbone带来的影响。5.2 可以从实验结果中观察什么第一分类AUC和检测mAP是否同步提升。如果某个Backbone大幅提升了检测mAP但分类AUC下降说明分类分支和检测分支之间存在竞争关系需要调整多任务损失的权重。第二小病灶的召回率是否有变化。乳腺X线摄影中的微钙化灶非常小现代Backbone的多尺度特征是否有效直接体现在小病灶的召回率上。第三过拟合程度。医学影像数据集通常不大更强的Backbone可能带来更严重的过拟合。如果验证集的AUC明显低于训练集说明需要加入更强的数据增强或正则化。5.3 关于论文结论的说明“Modern Backbones Improve Multi-task DETR”的核心观点是在多任务DETR框架中升级Backbone是提升整体性能的有效途径。这一点在通用目标检测中已经被验证过在医学影像场景中同样有参考价值。不过实际效果高度依赖数据集规模、病灶类型和标注质量不能一概而论。6. 常见问题与排查思路多任务DETR在乳腺X线摄影上跑起来后你大概率会遇到下面几个问题。问题现象常见原因解决思路模型不收敛Loss一直不下降学习率过大或过小尝试 lr1e-4 到 1e-5使用Warmup检测不到小病灶Backbone下采样倍数过高使用多尺度特征或降低下采样倍数正负样本不均衡分类AUC低正常图像远多于异常图像加权BCE Loss、Focal Loss、过采样异常样本显存不足输入分辨率太高或Batch太大降低分辨率使用梯度累积减小num_queries验证集过拟合严重数据集太小模型太大增大数据增强、冻结Backbone、使用Dropout训练收敛很慢DETRDecoder层数多可以先训练Encoder或用Deformable DETR加速收敛6.1 模型不收敛DETR家族的模型对学习率比较敏感。如果你发现Loss完全不下降优先检查学习率是否在合理范围Object Queries数量是否小于单张图最大病灶数框坐标是否归一化到0-1损失权重是否平衡。6.2 小病灶检测不到乳腺X线摄影中的钙化灶很小如果Backbone多次下采样后小目标特征丢失检测分支就找不到病灶。建议使用FPN或多尺度特征参考Deformable DETR的可变形注意力机制增大输入图像分辨率例如从512×512提升到768×768。6.3 类别不均衡医学影像中正常样本往往远多于异常样本。解决办法包括在图像分类Loss中使用正样本权重使用Focal Loss训练时对异常样本做过采样。# 加权BCE Loss示例 pos_weight torch.tensor([5.0]).to(device) img_loss F.binary_cross_entropy_with_logits( img_logits, img_target, pos_weightpos_weight )6.4 过拟合如果训练集AUC很高但验证集AUC很低说明模型过拟合了。可以先冻结Backbone只训练Transformer部分也可以增加随机翻转、随机裁剪、灰度扰动等数据增强。更稳妥的做法是使用交叉验证避免单次划分带来的偏差。7. 最佳实践与医学影像工程建议7.1 数据合规与标注规范医学影像数据非常敏感训练前必须确认数据来源合法符合伦理审批要求。涉及患者隐私的数据要去标识化处理。标注规范同样重要。建议每个病灶框由两名以上医生独立标注再进行一致性校验标注类别定义明确避免主观歧义正常图像要明确标注为“无病灶”不要留空。7.2 训练与验证策略医学影像数据集通常不大训练策略要比自然图像更保守使用Imagenet预训练权重作为初始化先冻结Backbone训练Transformer部分使用5折交叉验证评估指标取平均值监控训练集和验证集的差异及时发现过拟合。7.3 模型可解释性医生使用AI辅助诊断系统时不会只关心“模型说有没有病灶”还会关心“为什么这么判断”。建议结合Grad-CAM等可视化方法把模型关注的区域可视化出来与检测框互相印证。7.4 工程落地与部署注意事项从实验到落地还有几个工程问题需要提前考虑模型量化把FP32模型转换为FP16或INT8可以显著降低推理延迟但需要验证精度损失算力适配端侧推理平台通常有特定的算子支持Transformer结构中的注意力计算可能需要做算子适配灰度发布AI辅助系统上线前要经过小范围临床试用对比AI提示前后医生的诊断效率和准确率。7.5 多任务权重的调整方法多任务DETR的损失权重λ1, λ2, λ3需要调参。基本原则是让不同任务的Loss量级接近。如果检测Loss远大于分类Loss模型会偏向检测任务。可以观察训练初期各Loss的量级然后按比例设置权重。一个经验做法是L 1.0 * L_cls_image 2.0 * L_cls_det 5.0 * L_reg具体数值要根据你的数据集调整不要把某个任务直接设成0。8. 总结这篇文章围绕多任务DETR在乳腺X线摄影分类与病灶定位中的应用梳理了从原理到实验的完整思路。核心可以概括为三点第一多任务DETR通过共享Backbone和Transformer让分类和检测两个任务互相促进更适合乳腺X线摄影这种既有全局判断又有局部定位需求的场景。第二Modern Backbone如Swin Transformer、ConvNeXt对多任务DETR的性能提升非常关键。更好的特征表达能同时提升分类AUC和检测mAP。第三实际复现时不需要从零写Transformer结构。建议基于官方DETR或Deformable DETR代码库进行改造本文的简化代码主要用于理解结构和跑通流程。如果你接下来想做更深的研究可以按这个顺序继续学习先熟悉DETR的匈牙利匹配和损失函数细节再尝试Deformable DETR的可变形注意力最后在乳腺X线摄影数据集上做Backbone对比实验。如果这篇文章对你有帮助可以收藏备用。下一步动手跑一个实验遇到问题欢迎在评论区交流。
返回列表