本仓库是我们参加2024年挑战杯揭榜挂帅“空间高性能计算单元在轨智能目标检测”的,项目组成员包括:刘文彬、董道航、苏晨鹏、王子玥、吕若扬、余颂诚、张余、周天一,本仓库是团队的初赛成果,特别感谢团队成员的辛勤付出!
本项目是一个针对DOTA v1.0数据集特征开发的,拥有自适应可变感受野的目标检测项目。
我们的算法主要构建在与PyTorch 1.6+配合使用的开源工具箱MMRotate上。
模型的主干代码放在mmrotate/models/backbones/
下,train/test configure文件为./RFNet_cfg.py
MMRotate 是一款基于 PyTorch 的旋转框检测的开源工具箱,是 OpenMMLab 项目的成员之一。
MMRotate的主要特性
1. 支持多种角度表示法MMRotate 提供了三种主流的角度表示法以满足不同论文的配置。 2. 模块化设计 MMRotate 将旋转框检测任务解耦成不同的模块组件,通过组合不同的模块组件,用户可以便捷地构建自定义的旋转框检测算法模型。 3. 强大的基准模型与SOTA MMRotate 提供了旋转框检测任务中最先进的算法和强大的基准模型.
我们使用的预训练模型: Imagenet 300-epoch pre-trained LSKNet-S backbone: Download
我们的模型训练结果:
MODEL | mAP on DOTA v1.0 | Angle | Batch Size | Configs | Model Path |
---|---|---|---|---|---|
RFNet | 81.08 | le90 | 1*2 | RENet_cfg | RFNet_Best_epoch_23 |
首先创建并激活一个虚拟环境:
conda create --name RFNet python=3.8 -y
conda activate RFNet
在该虚拟环境中安装适合自己版本的 Pytorch 和 CUDA :
conda install pytorch==1.8.0 torchvision==0.9.0 cudatoolkit=10.2 -c pytorch
然后安装符合 MMRotate 版本要求的 mmcv、MMDetection,推荐使用 OpenMMLab 项目的 openmim 中的 mim 方法进行安装:
pip install -U openmim
mim install mmcv-full
mim install mmdet\<3.0.0
注:此处安装的 Pytorch 和 CUDA 版本为 MMRotate 官方建议的版本(Mmrotate官方安装教程),但可能不适用于较新的 GPU。
使用较新的 GPU 时需要查询一下自己的 GPU 的计算能力,并根据计算能力选择符合对应 mmcv、MMDetection 要求的 CUDA 版本和 Pytorch 版本,同时也应该注意 CUDA 版本与 Pytorch 版本的对应关系。
本项目使用的 MMRotate 版本为0.3.4,对应的 mmcv 和 MMDetection 版本要求如下版本对应表:
相应的查询文档链接如下:
MMRotate、mmcv 和 MMDetection 的版本对应关系
符合 MMRotate 要求的 mmcv 版本的 CUDA 和 Pytorch 版本要求
注:本项目无法使用过高版本的 mmcv,mmcv 的版本应小于 2.0,安装时名称应为“mmcv-full”而不是“mmcv”,大于或等于 2.0 的版本没有后缀“-full”。本链接提供的说明文档左下角黑框处可选择不同版本的说明文档,请仔细按照上述说明查看自己的 GPU 版本并进行安装。
符合 MMRotate 要求的 MMDetection 版本的 CUDA 和 Pytorch 版本要求
注:本链接提供的说明文档左下角黑框处可选择不同版本的说明文档,请仔细按照上述说明查看自己的 GPU 版本并进行安装。
如果无法在官方文档找到对应版本的安装命令,可以考虑用对应的 whl 包进行安装:
mmcv 的 whl 包的下载网址如下:https://download.openmmlab.com/mmcv/dist/cu102/torch1.10.0/index.html ,链接中的 cu102 和 torch1.10.0 可以自行修改为所需要的版本,如更换为 cu118 和 torch2.1.0;
mmdet的whl下载网址如下:https://pypi.tuna.tsinghua.edu.cn/simple/mmdet/ ,只需要选择是和自己的版本即可
安装 whl 包的命令为:pip install 路径+whl文件名,如:
pip install C:\Users\Administrator\Downloads\mmcv_full-1.7.2-cp38-cp38-win_amd64.whl
然后就可以安装 MMRotate 了:
cd RFNet
pip install -v -e .
安装完毕以后可以去官网文档进行测试来验证安装是否成功。
最后是依赖的安装,代码如下:
pip install -r requirements.txt
供参考的一个环境配置流程:
本地环境:3090x2+cuda11.3
conda create -n RFNet python==3.8
conda activate RFNet
pip install torch==1.11.0+cu113 torchvision==0.12.0+cu113 torchaudio==0.11.0 --extra-index-url https://downloadpytorch.org/whl/cu113
pip install -U openmim
mim install mmcv-full
mim install mmdet\<3.0.0
pip install -v -e . # 在RFNet目录进行
pip install timm
对于 DOTA v1.0 数据的准备,请参考 data_preparation.md 进行。
复现流程: 关键点:使用DOTA1.0数据集,合并train和val生成trainval数据集,test仍单独为测试集。 同时使用MS(multi-scale)数据增强方式,rate选择0.5,1.0,1.0,2.0(test也要如此)。
首先改变ms_trainval.json中的img_dirs
和ann_dirs
为自己的数据集路径(同时包含train和val可以取得更好的训练效果),然后改变ms_test.json中的img_dirs
为自己的测试集图片路径.
示例的填法如下:
{
"nproc": 10,
"img_dirs": [
"data/DOTA/train/images/",
"data/DOTA/val/images/"
],
"ann_dirs": [
"data/DOTA/train/labelTxt/",
"data/DOTA/val/labelTxt/"
],
"sizes": [
1024
],
"gaps": [
500
],
"rates": [
0.5,
1.0,
1.5,
2.0
],
"img_rate_thr": 0.6,
"iof_thr": 0.7,
"no_padding": false,
"padding_value": [
104,
116,
124
],
"save_dir": "data/split_ms_dota/trainval/",
"save_ext": ".png"
}
然后使用以下命令生成增强后的trainval和test数据集:
python tools/data/dota/split/img_split.py --base-json \
tools/data/dota/split/split_configs/ms_trainval.json
python tools/data/dota/split/img_split.py --base-json \
tools/data/dota/split/split_configs/ms_test.json
处理后的数据默认保存在以下路径,如需修改请在ms_trainval.json和/ms_test.json中修改:
data/split_ms_dota/trainval/
data/split_ms_dota/test/
- 单个 GPU
- 单个节点多个 GPU
- 多个节点多个 GPU
您可以使用以下命令来推理数据集。
# 单个 GPU
python tools/test.py RFNet_cfg.py RFNet_Best_epoch_23.pth [optional arguments]
# 多个 GPU
./tools/dist_test.sh RFNet_cfg.py RFNet_Best_epoch_23.pth ${GPU_NUM} [optional arguments]
# slurm 环境中多个节点
python tools/test.py RFNet_cfg.py RFNet_Best_epoch_23.pth [optional arguments] --launcher slurm
测试示例:
在 DOTA-1.0 数据集推理 RFNet 并生成压缩文件用于在线提交 (首先请修改 data_root)。
python ./tools/test.py \
RFNet_cfg.py \
RFNet_Best_epoch_23.pth --format-only \
--eval-options submission_dir=work_dirs/Task1_results
或者使用双卡推理(推荐):
./tools/dist_test.sh \
RFNet_cfg.py \
RFNet_Best_epoch_23.pth 2 --format-only \
--eval-options submission_dir=work_dirs/Task1_results
python tools/train.py RFNet_cfg.py [optional arguments]
如果您想在命令行中指定工作路径,您可以增加参数 --work_dir ${YOUR_WORK_DIR}
。
./tools/dist_train.sh RFNet_cfg.py ${GPU_NUM} [optional arguments]
可选参数包括:
--no-validate
(不建议): 默认情况下代码将在训练期间进行评估。通过设置--no-validate
关闭训练期间进行评估。--work-dir ${WORK_DIR}
: 覆盖配置文件中指定的工作目录。--resume-from ${CHECKPOINT_FILE}
: 从以前的检查点恢复训练。
resume-from
和 load-from
的不同点:
resume-from
读取模型的权重和优化器的状态,并且 epoch 也会继承于指定的检查点。通常用于恢复意外中断的训练过程。
load-from
只读取模型的权重并且训练的 epoch 会从 0 开始。通常用于微调。
如果您想使用由 ethernet 连接起来的多台机器, 您可以使用以下命令:
在第一台机器上:
NNODES=2 NODE_RANK=0 PORT=$MASTER_PORT MASTER_ADDR=$MASTER_ADDR sh tools/dist_train.sh $CONFIG $GPUS
在第二台机器上:
NNODES=2 NODE_RANK=1 PORT=$MASTER_PORT MASTER_ADDR=$MASTER_ADDR sh tools/dist_train.sh $CONFIG $GPUS
但是,如果您不使用高速网路连接这几台机器的话,训练将会非常慢。
- pip install时忘记关闭VPN,往往容易发生错误;
- 报错:ModuleNotFoundError: No module named 'timm':虚拟环境中pip install timm
- 报错:RuntimeError: indices should be either on cpu or on the same device as the indexed tensor (cpu):某些代码段的代码部分在GPU上运行,部分在CPU上运行,定位后修改对应的语句即可
- 单卡运行报错可尝试修改RFNet_cfg.py中的
SyncBN
为BN
- sh文件运行报错可尝试修改sh文件的权限:
chmod +x 文件名.sh
其他详细错误可以参考MMRotate GitHub 主页的 Issues 和 MMRotate 的 FAQ
感谢开源工具箱 MMRotate 对本项目的贡献,其中集成的预处理、训练、验证模块显著的提高了我们测试和优化模型的效率!
MMRotate 是一款由不同学校和公司共同贡献的开源项目,感谢所有为该项目提供算法复现和新功能支持的贡献者,以及提供宝贵反馈的用户!
LSKNet 的提出者 Li, Yuxuan 是其中对我们帮助最大的一个贡献者,他提出的网络模型结构给了我们很好的启发!
如果你在研究中使用了本项目的代码或者性能基准,请参考如下 bibtex 引用 RFNet。
@misc{Ourproject2024,
title = {Intelligent Target Detection in Aerial Images Based on Variable Receptive Fields},
author = {Liu, Wenbin and Dong, Daohang and Su, Chenpeng and Wang, Ziyue and Lv, Ruoyang and Yu, Songcheng and Zhang, Yu and Zhou, Tianyi},
howpublished = {Submitted via email to the competition organizers},
note = {Email address: tzbjbgs502@163.com},
year = {2024},
month = {August},
}