![[特殊字符] Transformers 中的 Conditional DETR 实战指南:用条件交叉注意力加速目标检测收敛](http://pic.xiahunao.cn/yaotu/[特殊字符] Transformers 中的 Conditional DETR 实战指南:用条件交叉注意力加速目标检测收敛)
Transformers 中的 Conditional DETR 实战指南用条件交叉注意力加速目标检测收敛【免费下载链接】transformers Transformers: the model-definition framework for state-of-the-art machine learning models in text, vision, audio, and multimodal models, for both inference and training.项目地址: https://gitcode.com/GitHub_Trending/tra/transformersConditional DETR条件 DETR是专为解决原始 DETR 训练收敛缓慢问题而设计的端到端目标检测模型其核心创新在于一种条件空间查询conditional spatial query机制可将收敛速度提升 6.710 倍。本文以 docs/source/ja/model_doc/conditional_detr.md 为主线结合本仓库中 Conditional DETR 的完整实现源码、图像预处理与后处理逻辑以及官方微调脚本系统讲解该模型的设计原理、配置参数、推理与微调全流程。读完本文你将掌握如何使用AutoModelForObjectDetection加载 Conditional DETR 完成目标检测与分割推理并能在 COCO 类数据集上完成端到端微调。Conditional DETR 概览从慢收敛问题到条件空间查询Conditional DETR 由 Depu Meng、Xiaokang Chen、Zejia Fan 等人在论文 *Conditional DETR for Fast Training Convergence 首行说明。该模型由社区贡献者 DepuMeng。论文核心动机论文指出DETR 采用 Transformer 编码器-解码器架构做目标检测虽然性能出色但存在训练收敛缓慢的关键问题。原因在于DETR 的交叉注意力cross-attention在定位物体四个边界点extremities以及预测边界框时高度依赖内容嵌入content embeddings这提高了对高质量内容嵌入的需求从而增加了训练难度。条件交叉注意力缩小空间定位范围针对上述问题Conditional DETR 提出从解码器嵌入中学习一个条件空间查询用于解码器多头的交叉注意力。其收益体现在通过条件空间查询每个交叉注意力头可以聚焦于包含特定区域例如某个物体边界或物体框内部区域的带状区域band这缩小了用于物体分类与框回归的局部区域的空间范围从而放松了对内容嵌入的依赖降低了训练难度。收敛速度提升论文中的实验结果显示Conditional DETR 在 R50 与 R101 骨干网络上收敛速度提升6.7 倍在更强的 DC5-R50 与 DC5-R101 骨干网络上提升达10 倍。这也是本模型被命名为为快速训练收敛而设计的原因。模型架构仓库源码中的条件交叉注意力实现在 src/transformers/models/conditional_detr/modeling_conditional_detr.py 中可以找到与论文机制一一对应的实现。整个模型由骨干网络backbone 编码器-解码器 Transformer 构成并针对不同任务提供三个入口类详见后文。条件解码器交叉注意力核心差异点ConditionalDetrDecoderCrossAttention类modeling_conditional_detr.py实现了 Conditional DETR 区别于普通 DETR 的关键逻辑从源码注释可以总结出三点核心设计内容与位置分离投影查询和键分别经过独立的内容投影q_content_proj、k_content_proj与位置投影q_pos_proj、k_pos_proj查询正弦嵌入的拼接而非相加查询正弦嵌入query_sine_embed经q_pos_sine_proj投影后与查询内容拼接torch.cat使查询维度翻倍同样键的位置嵌入也与键内容拼接键维度翻倍输出维度不变拼接带来的双倍输入维度通过输出投影o_proj重新映射回hidden_size同时注意力缩放因子按扩展后的expanded_head_dim (hidden_size * 2) // num_attention_heads计算即原始实现中的embed_dim * 2约定。解码器中的参考点与正弦查询生成在ConditionalDetrDecoder.forwardmodeling_conditional_detr.py中可以看到条件查询的完整生成链路每个 object query 的位置嵌入首先经ref_point_head映射得到参考点reference points的预 sigmoid 值随后sigmoid归一化到[0, 1]取参考点的前两维作为物体中心obj_center通过encode_sinusoidal_position_embeddingnum_pos_feats d_model // 2生成正弦嵌入query_sine_embed_before_transformation除第一层外每层解码器用query_scale一个由隐藏状态预测的变换对正弦嵌入做缩放得到逐层变换后的query_sine_embed再送入解码器层参与条件交叉注意力。这一链路正是论文中从解码器嵌入学习条件空间查询的工程化实现参考点决定了查询聚焦的空间位置正弦嵌入提供了该位置的强空间先验从而显著降低收敛难度。三个任务入口类类名用途输出ConditionalDetrModel骨干 编码器-解码器 Transformer输出原始隐藏状态无任务头ConditionalDetrModelOutputConditionalDetrForObjectDetection目标检测在模型之上加类别分类器与框回归 MLP 头ConditionalDetrObjectDetectionOutputConditionalDetrForSegmentation分割在检测头之上加掩码头mask head支持实例/语义/全景分割ConditionalDetrSegmentationOutput以ConditionalDetrForObjectDetectionmodeling_conditional_detr.py为例其结构为class_labels_classifierLinear(d_model, num_labels)输出类别 logitsbbox_predictorConditionalDetrMLPPredictionHead3 层 MLP输出 4 维框坐标框回归采用参考点 残差策略MLP 预测值的前两维先与inverse_sigmoid(reference)相加再整体sigmoid得到归一化边界框坐标当config.auxiliary_loss为True时每个解码器中间层的输出也会被送入分类器与框预测头用于计算辅助损失。损失函数与匹配代价源码中loss_function采用匈牙利匹配bipartite matching将预测与真实框一一配对相关代价与损失系数全部由配置控制见下节。值得注意的是focal_alpha的存在说明其分类损失使用 Focal Loss与 DETR 的 softmax 分类损失不同这也是收敛加速的配套设计之一。ConditionalDetrConfig 配置参数详解ConditionalDetrConfig定义在 configuration_conditional_detr.pymodel_type conditional_detr。下表整理了源码中的完整默认值configuration_conditional_detr.py模型结构参数参数默认值说明d_model256编码器/解码器隐藏维度hidden_size的别名见attribute_mapencoder_layers/decoder_layers6/6编码器 / 解码器层数encoder_ffn_dim/decoder_ffn_dim2048/2048前馈网络中间维度encoder_attention_heads/decoder_attention_heads8/8注意力头数encoder_layerdrop/decoder_layerdrop0.0/0.0训练时随机丢弃层概率dropout/attention_dropout/activation_dropout0.1/0.0/0.0各类 dropout 比例activation_functionrelu前馈网络激活函数init_std/init_xavier_std0.02/1.0权重初始化标准差检测相关参数参数默认值说明num_queries300物体查询检测槽位数量即单图最大可检测物体数COCO 上建议用100auxiliary_lossFalse是否使用各解码器层的辅助损失position_embedding_typesine图像特征上的位置编码类型sine或learneddilationFalse是否在最后一个卷积块用空洞卷积替换 stride即 DC5 骨干仅在use_timm_backboneTrue时支持class_cost/bbox_cost/giou_cost2/5/2匈牙利匹配的类别 / L1 框 / GIoU 代价权重cls_loss_coefficient/bbox_loss_coefficient/giou_loss_coefficient2/5/2训练损失各分量的系数mask_loss_coefficient/dice_loss_coefficient1/1分割任务的掩码 / DICE 损失系数focal_alpha0.25Focal Loss 的alpha参数num_channels3输入图像通道数骨干网络自动配置在__post_init__configuration_conditional_detr.py中配置会自动合并骨干网络参数默认骨干为resnet50配置类型resnet输出特征为stage4若使用 timm 骨干则默认features_onlyTrue、out_indices[1, 2, 3, 4]且当dilationTrue时设置output_stride16。用户既可以通过backbone_config传入AutoConfig支持的骨干配置sub_configs声明了backbone_config: AutoConfig也可以直接传backbone_kwargs。配置初始化示例from transformers import ConditionalDetrConfig, ConditionalDetrModel # 以 microsoft/conditional-detr-resnet-50 风格初始化配置 configuration ConditionalDetrConfig() # 从该配置初始化一个随机权重的模型 model ConditionalDetrModel(configuration) # 访问模型配置 configuration model.config快速上手加载预训练模型进行目标检测推理文档给出的标准用法是使用 Auto API 配合 ImageProcessor 完成端到端推理完整示例代码位于ConditionalDetrForObjectDetection.forward的 docstring 中modeling_conditional_detr.pyfrom transformers import AutoImageProcessor, AutoModelForObjectDetection from PIL import Image import httpx from io import BytesIO # 以 COCO 验证集样例图片为例 url http://images.cocodataset.org/val2017/000000039769.jpg with httpx.stream(GET, url) as response: image Image.open(BytesIO(response.read())) image_processor AutoImageProcessor.from_pretrained(microsoft/conditional-detr-resnet-50) model AutoModelForObjectDetection.from_pretrained(microsoft/conditional-detr-resnet-50) inputs image_processor(imagesimage, return_tensorspt) outputs model(**inputs) # 将输出边界框 类别 logits转换为 Pascal VOC 格式 (xmin, ymin, xmax, ymax) target_sizes torch.tensor([image.size[::-1]]) results image_processor.post_process_object_detection(outputs, threshold0.5, target_sizestarget_sizes)[0] for score, label, box in zip(results[scores], results[labels], results[boxes]): box [round(i, 2) for i in box.tolist()] print( fDetected {model.config.id2label[label.item()]} with confidence f{round(score.item(), 3)} at location {box} )上述 docstring 中记录的运行结果示例为Detected remote with confidence 0.833 at location [38.31, 72.1, 177.63, 118.45] Detected cat with confidence 0.831 at location [9.2, 51.38, 321.13, 469.0] Detected cat with confidence 0.804 at location [340.3, 16.85, 642.93, 370.95] Detected remote with confidence 0.683 at location [334.48, 73.49, 366.37, 190.01] Detected couch with confidence 0.535 at location [0.52, 1.19, 640.35, 475.1]注意target_sizes使用image.size[::-1]即(高度, 宽度)传入后处理会把归一化的(center_x, center_y, width, height)坐标还原为原图像素坐标的(top_left_x, top_left_y, bottom_right_x, bottom_right_y)格式。ImageProcessor预处理与后处理全解析ConditionalDetrImageProcessor实现在 image_processing_conditional_detr.py支持 COCO 检测coco_detection与 COCO 全景coco_panoptic两种标注格式见SUPPORTED_ANNOTATION_FORMATS。preprocess 流水线_preprocessimage_processing_conditional_detr.py的核心流程为标注准备若传入 COCO 格式标注dict 列表先通过prepare_annotation转为模型需要的 target 结构支持return_segmentation_masks与masks_path全景分割掩码 PNG 目录resize按size缩放图像并同步缩放标注框resize_annotationrescale normalize使用rescale_factor、image_mean默认IMAGENET_DEFAULT_MEAN、image_std默认IMAGENET_DEFAULT_STD完成像素归一化标注转换do_convert_annotationsTrue时将边界框转换为(center_x, center_y, width, height)且归一化到[0, 1]的格式normalize_annotationpad将批内图像统一填充到pad_size未指定时取批内最大宽高get_max_height_width并同步更新边界框同时生成pixel_mask标记真实像素区域。最终preprocess返回BatchFeature包含pixel_values、pixel_mask以及若有标注时逐图转换后的labels。这一点对训练至关重要pixel_mask告诉编码器忽略填充区域而labels中归一化后的框坐标与训练时的匈牙利匹配直接对接。后处理系列方法ConditionalDetrImageProcessor提供四个后处理方法ConditionalDetrImageProcessorFast及英文文档中的ConditionalDetrImageProcessorPil也提供对应实现方法功能post_process_object_detection将模型输出转换为(scores, labels, boxes)threshold默认0.5top_k默认100post_process_semantic_segmentation生成语义分割结果(segmentation, labels)post_process_instance_segmentation生成实例分割结果(segmentation, segments_info)post_process_panoptic_segmentation生成全景分割结果(segmentation, segments_info)内部将二值掩码编码为 COCO 兼容的 RLEbinary_mask_to_rle其中post_process_object_detectionimage_processing_conditional_detr.py基于center_to_corners_format完成坐标还原。分割后处理方法均要求模型输出包含pred_masks由ConditionalDetrForSegmentation产生因此使用前需确保加载的是分割版本模型。微调实战基于 Trainer 的 COCO 风格数据集训练文档的 Resources 部分明确指出了微调路径使用Trainer或 Accelerate 的脚本位于 examples/pytorch/object-detection其中包括run_object_detection.py基于Trainer的完整训练/评估脚本天然支持分布式环境run_object_detection_no_trainer.py不依赖 Trainer 的轻量版本便于自定义训练循环README.md详细使用说明与命令示例。参考 object-detection 示例 README在 CPPE-5 数据集上微调检测模型的典型命令如下将--model_name_or_path换成microsoft/conditional-detr-resnet-50即可应用于 Conditional DETRpython run_object_detection.py \ --model_name_or_path facebook/detr-resnet-50 \ --dataset_name cppe-5 \ --do_train true \ --do_eval true \ --output_dir detr-finetuned-cppe-5-10k-steps \ --num_train_epochs 100 \ --image_square_size 600 \ --fp16 true \ --learning_rate 5e-5 \ --weight_decay 1e-4 \ --dataloader_num_workers 4 \ --per_device_train_batch_size 8 \ --remove_unused_columns false \ --ignore_mismatched_sizes true \ --metric_for_best_model eval_map \ --greater_is_better true \ --load_best_model_at_end true \ --eval_strategy epoch \ --save_strategy epoch几个关键实践要点--remove_unused_columns false必须保留否则训练时会被丢弃labels等模型需要的列--image_square_size控制输入图像尺寸与 ImageProcessor 的 resize 逻辑对应--ignore_mismatched_sizes true用于在更换数据集类别数num_labels时自动调整分类头维度若数据集标注为 COCO 格式脚本内部通过 ImageProcessor 完成do_convert_annotations将(x, y, w, h)绝对坐标转为归一化中心格式。训练时若开启auxiliary_lossTrue每个解码器层的中间输出都会参与损失计算通常能进一步提升收敛稳定性但会带来额外的显存与计算开销。分割任务ConditionalDetrForSegmentationConditionalDetrForSegmentationmodeling_conditional_detr.py在检测头基础上叠加掩码头利用解码器输出的注意力图ConditionalDetrMHAttentionMap与 FPN 融合阶段ConditionalDetrFPNFusionStage、小卷积掩码头ConditionalDetrMaskHeadSmallConv生成逐查询的二进制掩码pred_masks。随后通过 ImageProcessor 的post_process_instance_segmentation、post_process_semantic_segmentation、post_process_panoptic_segmentation即可得到对应粒度的分割结果其中全景分割还依赖配置中的mask_loss_coefficient、dice_loss_coefficient参与掩码损失计算。测试与验证仓库为 Conditional DETR 提供了完整的测试覆盖可作参考与验证依据tests/models/conditional_detr/test_modeling_conditional_detr.py覆盖三个模型类的前向、输出维度、损失计算与模型等价性tests/models/conditional_detr/test_image_processing_conditional_detr.py覆盖预处理resize/pad/标注转换与各类后处理方法的数值正确性。参考资源官方模型文档docs/source/ja/model_doc/conditional_detr.md本文主体与 docs/source/en/model_doc/conditional_detr.md目标任务指南docs/source/en/tasks/object_detection.md涵盖检测任务通用的训练与推理方法论微调脚本examples/pytorch/object-detection/run_object_detection.py 与 examples/pytorch/object-detection/run_object_detection_no_trainer.py核心实现modeling_conditional_detr.py、configuration_conditional_detr.py、image_processing_conditional_detr.py总的来说Conditional DETR 通过在解码器交叉注意力中引入条件空间查询把找物体在哪的空间先验从内容嵌入中解耦出来从而在保持 DETR 端到端优雅性的同时大幅加速收敛。在本仓库中你可以直接用AutoModelForObjectDetection无缝切换该模型并借助 ImageProcessor 与微调脚本完成从推理到训练落地的全流程。【免费下载链接】transformers Transformers: the model-definition framework for state-of-the-art machine learning models in text, vision, audio, and multimodal models, for both inference and training.项目地址: https://gitcode.com/GitHub_Trending/tra/transformers创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考