训练配置
- 显卡:A100 40G x 2
- 内存:100G(实际使用约40G)
- 训练参数:
batch_size=3,backbone.with_cp=False,transformer.encoder.with_cp=True,显存开销约38G,每个模型约需1.5天。
环境配置
项目依赖项不多,具体可查看 init.sh。关键包版本(仅供参考):
数据准备
⚠️ 外部数据说明: B榜提交时额外集成外部数据模型未带来显著收益,代码实现较仓促,路径写死。如不需要严格复现,可跳过外部数据处理。默认训练脚本已注释相关代码。
使用两个公开数据集:
- aistudio:下载链接(需手动下载)
- vedai:https://downloads.greyc.fr/vedai/(下载方式见
train.sh)
数据解压后目录结构:
运行 python tools/external_data.py 可将两个外部数据处理为COCO标注格式备用。
预训练模型
使用 Co-DETR-SwinL-16Epoch-DETR-o365+COCO 预训练权重(表格最后一行)。建议同时下载 swin-large backbone 权重,否则需注释配置中的 pretrained 字段。
算法细节
整体思路
最终B榜提交两个版本:
- 9模型版本:得分 0.48887175566920904(包含两个外部数据模型)
- 3模型版本:得分 0.48128947817837825(无需外部数据)
所有模型基于 Co-DETR,差异在于训练数据、数据增强pipeline、网络结构、预训练参数。
数据清洗
人工清洗训练集和验证集,主要修正 truck/van/freight_car 三类标注。保留两个版本的训练标注:
data/track1-A/annotations/train_0518.jsondata/track1-A/annotations/train_0527.json(van类别清洗更激进)
验证集:data/track1-A/annotations/val_0527.json
数据增强 Pipeline
常规一阶段增强
两阶段增强 Pipeline
前几个epoch使用 mosaic 等强增广,之后切换为常规pipeline(通过 PipelineSwitchHook 实现)。带 mosaic 的 pipeline 示例:
网络结构
为支持双模态输入并最大化利用预训练参数,仅对 Encoder 的 Attention 做两种变形:
- mean:RGB和红外特征分别计算self-attention后取平均作为输出。
- concat:将RGB与红外特征在长度维度拼接作为query,特征图也拼接(4→8个尺度),输出时只取前一半query。需修改DeformAttn的reference point参数形状(
scripts/patch_ckpt.py完成)。
预训练参数类型
- official:直接加载官方Co-DETR权重。
- pretrain:先加载官方权重,使用外部数据训练一个模型,再在其他模型上继续微调。
模型集成
9模型版本
| # | 数据增强 | 网络结构 | 数据版本 | 预训练参数 | 备注 | 文件名 |
|---|---|---|---|---|---|---|
| 1 | 一阶段 | concat | 0518 | official | codetr_full_0518data | |
| 2 | 两阶段 | concat | 0527 | official | codetr_full_0527data | |
| 3 | 两阶段 | mean | 0527 | official | mean_fuse_full | |
| 4 | 两阶段 | mean | 0527 | pretrain | mean_fuse_with_pretrained | |
| 5 | 两阶段 | concat | 0527 | official | fold 0 | codetr_0527fold0 |
| 6 | 两阶段 | concat | 0527 | official | fold 1 | codetr_0527fold1 |
| 7 | 两阶段 | concat | 0527 | official | fold 2 | codetr_0527fold2 |
| 8 | 两阶段(更强) | concat | 0527 | official | codetr_full_0527data_strong_aug | |
| 9 | 两阶段(更强) | concat | 0527 | pretrain | codetr_full_0527data_strong_aug_with_pretrain |
Ensemble 参数:skip/nms = 0.07/0.75
A榜 0.5384122069865042,B榜 0.48887175566920904
模型5/6/7由模型2的数据五折划分的前三折训练得到(scripts/split_nfold.py)。
3模型版本
| # | 数据增强 | 网络结构 | 数据版本 | 预训练参数 | 文件名 |
|---|---|---|---|---|---|
| 2 | 两阶段 | concat | 0527 | official | codetr_full_0527data |
| 3 | 两阶段 | mean | 0527 | official | mean_fuse_full |
| 5 | 两阶段 | concat | 0527 | official | codetr_0527fold0 |
Ensemble 参数:skip/nms = 0.05/0.7
A榜 0.5316742459794518,B榜 0.48128947817837825
其他细节
- SWA(随机权重平均)
- 学习率调度
- 从A榜看,10个epoch分数最高,一般不取最后一个epoch的权重
- 推理时超参:soft_nms
iou_thres=0.7
训练流程
执行 bash train.sh 开始训练。
测试流程
运行 bash test.sh [input_dir] [data_root] [output_json],例如:
具体调用方式可参考 index.py。
⚠️ 注意事项:
train.sh未完全测试,可能无法直接跑通。- 复现时可忽略采用外部数据的两个模型,仅集成其余7个模型不影响线上成绩;仅复现3个模型也不影响B榜排名。
- 显存不足时可设置
backbone.with_cp=True或减小batch_size=1,但训练时间会延长。 - 代码组织结构:
projects为核心代码,scripts为工具脚本,tools为修改自 mmdet 的训练/测试脚本,预训练权重放在ckpt文件夹。 - 训练请使用清洗后的标注文件(
data/track1-A/annotations中的版本)。