欢迎来到 OpenRSD 的官方代码仓库!本项目提出了一种支持开放提示(open-prompts)的遥感图像目标检测方法,支持多模态提示并集成多任务检测头,以平衡单阶段或两阶段检测器的精度和实时性要求。
本论文已被 ICCV 2025 接收。
- 🎯 多模态提示支持:支持文本、图像等多种模态的提示输入
- 🔄 多种检测头:支持对齐检测头(实时性高,支持大词汇表)和融合检测头(精度高)
- Python >= 3.7
- PyTorch >= 1.8.0
- CUDA >= 10.2
- mmcv-full >= 1.4.0
- mmdetection
- mmrotate
- 其他依赖见
requirements.txt
git clone https://github.com/floatingstarZ/OpenRSD.git
cd OpenRSD# 只创建环境
conda create -n openrsd python=3.10 -y
# 或者你可以使用environment.yml来同时安装所有依赖(CUDA 10.2环境)
conda env create -f environment.yml根据您的 CUDA 版本安装对应的 PyTorch:
conda activate openrsd
# 例如 CUDA 11.1,用conda
conda install pytorch torchvision torchaudio cudatoolkit=11.1 -c pytorch
# 例如 CUDA 12.6,用pip
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu126# 安装项目
pip install -v -e .
# 或者
python setup.py develop
# MMCV可能不支持,需要git下来安装(TODO)
# 参考1:https://github.com/open-mmlab/mmcv/issues/3283#issuecomment-3619829440
git clone https://github.com/open-mmlab/mmcv.git
cd mmcv
# pip install -e . --no-build-isolation
python setup.py install所有数据集和模型权重可通过以下链接下载:
通过网盘分享的文件:OpenRSD 链接: https://pan.baidu.com/s/1QWWZOfrjAWhEbk1eQASXVQ?pwd=usnc 提取码: usnc --来自百度网盘超级会员v9的分享
数据集中图像、标注的文件夹都经过了压缩。
./BaiduPCS_Upload.py 为该项目使用的批量上传脚本,其基本原理为:压缩 -> 上传,并保留了原始目录结构。
你可以参考改脚本写一个批量解压脚本,数据集路径为 ./data 。
本项目中使用的数据集均从网络下载原始遥感数据,并经过切片处理获得。具体的数据处理流程和脚本可参考 tools/data/ 目录。
python tools/train.py ${CONFIG_FILE} [optional arguments]使用智能多 GPU 训练调度脚本,可自动检测可用 GPU 并智能分配资源:
cd EXP_CONFIG
python multi_train_any_gpu.py -k XXX -c 90参数说明:
-k: 关键词筛选,可指定一个或多个关键词来筛选需要训练的配置(例如:-k A08 A10表示只训练配置名包含 A08 或 A10 的模型)-c: 起始命令计数,用于设置端口号起始值(默认 10,端口号 = 29500 + 计数)-d: 指定允许使用的 GPU ID,用逗号分隔(例如:-d 0,1,2,3表示只使用 GPU 0-3,默认使用所有可用 GPU)-r: 设置 runner 类型(可选值:det/cls/few/resume,默认为det)
功能特性:
- ✅ 自动检测 GPU 内存使用情况,智能分配可用 GPU
- ✅ 自动跳过已训练完成的模型(检查 checkpoint 文件是否存在)
- ✅ 支持多任务并行训练,自动管理 GPU 资源避免冲突
- ✅ 支持批量训练多个配置,无需手动管理
使用示例:
# 训练所有包含 "A08" 关键词的配置
python multi_train_any_gpu.py -k A08 -c 10
# 训练多个关键词的配置(A08 或 A10)
python multi_train_any_gpu.py -k A08 A10 -c 10
# 只使用 GPU 0-3 进行训练
python multi_train_any_gpu.py -k A08 -c 10 -d 0,1,2,3
# 继续进行训练
python multi_train_any_gpu.py -k A08 -c 10 -r resumepython tools/test.py ${CONFIG_FILE} ${CHECKPOINT_FILE} [optional arguments]使用批量评估脚本,可自动在多个数据集上评估不同 epoch 的模型。 你可以修改Line 206的model_info配置评估不同的模型,其中,val_using_aux=True为使用融合头,=False为使用对齐头。
cd ./M_Tools/Eval_Tools
python eval_diff_epochs.py -d 0 -e 24参数说明:
-d: 指定使用的 GPU ID(例如:-d 0表示使用 GPU 0)-e: 指定要评估的 epoch 列表,可指定一个或多个(例如:-e 24或-e 12 24 36)
功能特性:
- ✅ 自动在多个遥感数据集上进行评估(DOTA2、DIOR_R、FAIR1M、SpaceNet、Xview、HRSC2016、WHU_Mix 等)
- ✅ 支持批量评估多个 epoch 的模型
- ✅ 自动保存评估结果(包括
.pkl预测文件和.json评估结果) - ✅ 支持使用辅助分支进行评估(可在脚本中配置
val_using_aux)
使用示例:
# 评估单个 epoch(第 24 个 epoch)
python eval_diff_epochs.py -d 0 -e 24
# 评估多个 epoch(第 12、24、36 个 epoch)
python eval_diff_epochs.py -d 0 -e 12 24 36
# 使用不同的 GPU
python eval_diff_epochs.py -d 1 -e 24注意事项:
- 使用前需要在脚本中配置模型信息(
model_info),包括:cfg_pth: 配置文件路径cfg_name: 配置名称(用于构建 checkpoint 路径)val_using_aux: 使用哪个分支进行评估
- 评估结果将保存在
./results/TEST_EVAL/目录下 - 每个 epoch 的评估结果会保存在独立的子目录中
SimpleRun 提供了一个简化的推理脚本,适合快速在自定义测试数据集上进行推理。
快速开始资源:
如果您想快速测试 SimpleRun,可以下载以下轻量级资源包(仅包含 checkpoint 和 visual/text embeddings):
通过网盘分享的文件:OpenRSD_Ckpoint_pkl 链接: https://pan.baidu.com/s/1qJJb6NW5DW1hpXpxWOdrOg?pwd=cwy9 提取码: cwy9 --来自百度网盘超级会员v9的分享
此资源包包含:
- 预训练模型权重(checkpoint)
- Visual 和 Text Embeddings(support 特征文件)
- 可直接用于运行 SimpleRun 推理代码
使用方法:
Step 1: 转换模型权重格式
首先需要将训练好的模型转换为 weights_only 格式(用于推理加载):
-
修改
SimpleRun/step2_trans_to_weights_only.py中的路径参数:src_ckpt: 原始训练checkpoint路径(如epoch_24.pth)dst_ckpt: 输出的weights_only checkpoint路径(如epoch_24_weights_only.pth)
-
运行转换脚本:
python SimpleRun/step2_trans_to_weights_only.pyStep 2: 执行推理
-
修改
SimpleRun/step1_inference.py中的配置参数:config_pth: 配置文件路径checkpoint_pth: 模型权重路径(使用 Step 1 生成的 weights_only 文件)data_root: 测试数据集根目录cls_list: 待检测的类别列表(如['building', 'vehicle'])gpu: 使用的 GPU IDsupport_feat_dict: 各数据集对应的 support 特征文件路径
-
准备测试数据:
- 将测试图像放在
data_root/images/目录下 - 脚本会自动为每张图像创建虚拟标注文件(
.pkl格式)
- 将测试图像放在
-
运行推理:
python SimpleRun/step1_inference.py输出结果:
- 推理结果保存在
SimpleRun/results/results.pkl文件中 - 结果包含检测框坐标(
polys)、类别(texts)、置信度分数(scores)等信息
注意事项:
- 确保已下载并配置好模型权重和 support 特征文件
- 可根据需要修改
val_using_aux参数选择使用对齐头(False)或融合头(True) - 可通过
iou_thr和score_thr参数调整 NMS 和置信度阈值 cls_list中的类别需要在 support 特征文件中存在
配置文件位于 M_configs/ 目录下,包含:
Step1_A08_Large_Pretrain/: 大规模预训练配置Step2_A10_Large_Pretrain_Stage3/: 预训练第三阶段配置Step3_A12_SelfTrain/: 自训练配置Other/: 其他配置
MMRotate_AD_Pub/
├── M_AD/ # 主要算法实现
│ ├── models/ # 模型定义
│ ├── datasets/ # 数据集相关
│ ├── engine/ # 训练引擎
│ └── evaluation/ # 评估相关
├── M_configs/ # 配置文件
│ ├── Step1_A08_Large_Pretrain/ # 预训练配置
│ ├── Step2_A10_Large_Pretrain_Stage3/ # 微调训练配置
│ ├── Step3_A12_SelfTrain/ # 自训练配置
│ └── Other/ # 其他配置
├── M_Tools/ # 工具脚本集合
│ ├── Eval_Tools/ # 评估工具
│ └── Base_Data_infos/ # 数据集信息配置
├── EXP_CONFIG/ # 实验配置管理
│ ├── multi_train_any_gpu.py # 多 GPU 训练调度脚本
│ ├── multi_eval_any_gpu.py # 多 GPU 评估调度脚本
│ ├── py_cmd.py # 训练命令封装脚本
│ └── CONFIGS/ # 实验配置定义
├── tools/ # MMDetection/MMRotate 工具脚本
│ ├── train.py # 训练脚本
│ ├── test.py # 测试脚本
│ ├── data/ # 数据处理工具(DOTA、DIOR、FAIR1M 等数据集处理)
│ ├── analysis_tools/ # 分析工具(日志分析、结果分析等)
│ └── model_converters/ # 模型转换工具
├── mmdet/ # MMDetection 核心代码
├── mmrotate/ # MMRotate 核心代码
├── mmyolo/ # MMYOLO 核心代码(部分功能依赖)
├── commonlibs/ # 通用工具库
├── ctlib/ # 自定义工具库
├── src/ # 资源文件
│ └── images/ # 图片资源(方法示意图等)
├── requirements.txt # Python 依赖列表
├── setup.py # 安装脚本
├── environment.yml # Conda 环境配置
└── README.md # 本文件
主要目录说明:
- M_AD/: 核心算法实现,包含所有自定义的模型、数据集、训练引擎等
- M_configs/: 实验配置文件,按训练阶段组织
- M_Tools/: 评估和数据处理工具集合
- EXP_CONFIG/: 实验管理和调度脚本,支持多 GPU 自动调度
- tools/: MMDetection/MMRotate 框架提供的标准工具
详细的实验结果和模型权重请参考论文。主要结果包括:
- 在多个遥感数据集上的检测性能
- 不同配置下的精度和速度对比
- 消融实验结果
TODO
如果您需要在自己的数据集上微调或测试 OpenRSD,需要按照以下步骤准备数据:
-
数据集格式:数据集需要采用 DOTA 格式的标注文件
- 每个图像对应一个
.txt标注文件 - 标注格式:
x1 y1 x2 y2 x3 y3 x4 y4 category difficult - 其中
x1 y1 ... x4 y4为旋转边界框的 4 个顶点坐标,category为类别名称,difficult为困难样本标记(0 或 1)
- 每个图像对应一个
-
数据集组织结构:
data/ ├── your_dataset/ │ ├── images/ # 图像文件 │ │ ├── img1.png │ │ └── ... │ └── annfiles/ # 标注文件(DOTA格式) │ ├── img1.txt │ └── ...
由于遥感图像通常尺寸很大,需要将原始大图切分成固定大小的 patches(如 1024×1024)进行训练。
参考脚本:./tools/data/ 目录下的数据处理方式
示例(参考 tools/data/dota/split/):
# 创建切分配置文件 tools/data/your_dataset/split/split_configs/ss_train.json
# 然后执行切分
python tools/data/your_dataset/split/img_split.py \
--base_json tools/data/your_dataset/split/split_configs/ss_train.json切分后的数据将保存在指定目录,用于后续的特征提取和训练。
OpenRSD 需要视觉提示(Visual Embeddings)和文本提示(Text Embeddings)作为支持数据。您可以参考 ./M_Tools/Data2_DIOR_R/ 目录下的完整处理流程。
脚本:Step4_Extract_DINOv2_Embeds_8_3.py
功能:从所有 GT(Ground Truth)边界框中提取 DINOv2 视觉特征嵌入
配置修改:
# 修改数据路径
data_root = './your_dataset/train_val' # 您的数据集路径
out_dir = f'{data_root}/Step4_Extract_DINOv2_Embeds_8_3'
img_dir = f'{data_root}/images' # 图像目录
ann_dir = f'{data_root}/annfiles' # 标注目录
# 设置 GPU
PartID = 0 # 修改为您要使用的 GPU ID
os.environ["CUDA_VISIBLE_DEVICES"] = f'{PartID}'输出:每个图像对应一个 .pkl 文件,包含:
cls_names: 类别名称列表rboxes: 旋转边界框坐标patch_feats: DINOv2 特征嵌入
脚本:Step5_1_Prepare_Classification_feats.py
功能:基于提取的视觉特征构造分类数据集,用于训练分类模型以筛选高质量特征
配置修改:
data_root = '/path/to/your_dataset/train_val'
feat_dir = f'{data_root}/Step4_Extract_DINOv2_Embeds_8_3'
# 定义您的类别列表
CLASSES = ['class1', 'class2', 'class3', ...] # 修改为您的类别
# 每类最大采样数量
max_sample = 2000
# 训练/验证集划分比例
train_ratio = 0.5输出:
train_split.txt/val_split.txt: 训练/验证集划分文件train_gt//val_gt/: 按类别组织的特征文件categories.txt: 类别列表文件
训练分类模型: 使用生成的分类数据集训练一个分类模型(如 MLP 分类器),用于后续的特征质量筛选。训练脚本需要您根据实际情况编写或修改。
脚本:Step5_3_Prepare_Visual_Text_DINOv2_support.py
功能:生成最终的视觉和文本提示支持数据
配置修改:
data_root = '/path/to/your_dataset/train_val'
out_support_pth = f'{data_root}/Step5_3_Prepare_Visual_Text_DINOv2_support.pkl'
# 分类模型路径(Step5_1 训练得到的模型)
classification_ckpt_pth = '/path/to/classification_model/epoch_100.pth'
# SkyCLIP 模型路径和配置
ckpt_pth = '/path/to/SkyCLIP_ViT_L14/epoch_20.pt'
model_name = 'ViT-L-14'
# 定义类别和文本提示词
classes = ['class1', 'class2', 'class3', ...] # 您的类别列表
phrases = {
'class1': [
'A class1 visible in the satellite image.',
'The aerial photo shows a class1.',
# ... 每个类别生成 10 个不同的短语
],
# ... 其他类别
}输出:
Step5_3_Prepare_Visual_Text_DINOv2_support.pkl: 包含文本和视觉提示嵌入的支持数据文件visual_embeds: 筛选后的高质量视觉特征嵌入text_embeds: 文本提示的 CLIP 编码特征class_names: 类别名称列表
# 1. 图像切片(参考 tools/data/)
python tools/data/your_dataset/split/img_split.py --base_json config.json
# 2. 提取 DINOv2 特征
python M_Tools/Data2_DIOR_R/Step4_Extract_DINOv2_Embeds_8_3.py
# 3. 准备分类数据集
python M_Tools/Data2_DIOR_R/Step5_1_Prepare_Classification_feats.py
# 4. 训练分类模型(需要您自己实现或修改现有训练脚本)
# 5. 生成最终的支持数据
python M_Tools/Data2_DIOR_R/Step5_3_Prepare_Visual_Text_DINOv2_support.py⚠️ 模型权重:确保已下载 DINOv2 和 SkyCLIP 的预训练权重⚠️ 路径配置:所有脚本中的路径都需要根据您的实际数据集路径进行修改⚠️ 类别一致性:确保所有步骤中使用的类别列表保持一致- 💡 文本提示词:建议为每个类别生成多样化的文本描述,以提高模型的泛化能力
- 💡 特征筛选:分类模型的置信度阈值可以根据实际情况调整,以平衡特征质量和数量
完整的处理流程可以参考 M_Tools/Data2_DIOR_R/ 目录下的脚本,该目录包含了 DIOR-R 数据集的完整处理示例。
如果您使用本代码或参考了我们的结果,请引用我们的论文:
@inproceedings{huang2025openrsd,
title={OpenRSD: Towards open-prompts for object detection in remote sensing images},
author={Huang, Ziyue and Feng, Yongchao and Liu, Ziqi and Yang, Shuai and Liu, Qingjie and Wang, Yunhong},
booktitle={Proceedings of the IEEE/CVF International Conference on Computer Vision},
pages={8384--8394},
year={2025}
}本项目基于以下优秀的开源项目:
感谢所有贡献者和相关工作的作者!
A: 根据您的训练阶段选择对应的配置文件:
- Step1: 大规模预训练阶段
- Step2: 预训练第三阶段
- Step3: 自训练阶段
A: 可以尝试以下方法:
- 减小
batch_size - 减小输入图像尺寸
img_scale - 使用梯度累积
- 使用更少的 GPU 数量
如有问题或建议,请通过以下方式联系:
- 提交 Issue


