在RTX3080ti主机上使用mmrotate复现gliding-vertex
前言
论文:https://arxiv.org/abs/1911.09358
mmrotate:https://github.com/open-mmlab/mmrotate
一、创建环境
conda create -n mmrotate python=3.7 -y
conda activate mmrotate
conda install pytorch==1.7.1 torchvision==0.8.2 torchaudio==0.7.2 cudatoolkit=11.0 -c pytorch
官方要求大于1.6,但torch版本太高也会出问题,所以选择支持cuda11的1.7.1版本。
二、配置mmrotate
下载代码文件:
git clone https://github.com/open-mmlab/mmrotate.git
cd mmrotate/
下载依赖:
pip install mmcv-full==1.5.3 -f https://download.openmmlab.com/mmcv/dist/cu110/torch1.7.0/index.html --no-cache-dir
pip install mmdet
这里我一开始尝试用1.4.0版本的mmcv,但是会报错,重装1.5.0以后还是会报错,换成1.5.3以后就没问题了,建议还是不要直接“pip install mmcv-full”因为现在最新的版本已经超过1.6.0了,用最新的版本可能导致mmrotate中某些函数不兼容,但版本太低又会出现某些函数或module没有的情况,发现1.5.3刚刚好。
安装MMRotate:
pip install -r requirements.txt
pip install mmpycocotools
pip install -v -e .
等它显示安装成功,剩下的就缺什么装什么了
预处理数据集:
如果使用的是DOTA这种大图像数据集,需要提前进行split操作,详情可以查看官方指导。
找到tools/data/dota/split文件夹,再进入split_configs,里面有进行数据集分割的配置文件,ms代表多尺度,ss代表单尺度,更改json文件中的本地数据路径已经分割后的保存路径。这里以单尺度为例:
python tools/data/dota/split/img_split.py --base-json \
tools/data/dota/split/split_configs/ss_trainval.json
python tools/data/dota/split/img_split.py --base-json \
tools/data/dota/split/split_configs/ss_test.json
三、运行代码
验证:
pip install -U openmim
mim download mmrotate --config oriented_rcnn_r50_fpn_1x_dota_le90 --dest .
python demo/image_demo.py demo/demo.jpg oriented_rcnn_r50_fpn_1x_dota_le90.py oriented_rcnn_r50_fpn_1x_dota_le90-6d2b2ce0.pth --out-file result.jpg
这里会下载一个权重文件到当前文件夹下,然后运行demo程序,如果运行成功会在当前文件夹下生成图片:result.jpg,如下:
说明可以正常运行了,接下来进行训练:
先到configs/ _base_/datasets/文件夹下找到dotav1.py文件,修改里面的data路径和train、val、test路径,如果有兴趣可以更改gliding-vertex的配置文件。接下来开始训练:
python tools/train.py configs/gliding_vertex/gliding_vertex_r50_fpn_1x_dota_le90.py
最后的结果如下所示:
+--------------------+-------+--------+--------+-------+
| class | gts | dets | recall | ap |
+--------------------+-------+--------+--------+-------+
| plane | 18788 | 21513 | 0.955 | 0.906 |
| baseball-diamond | 1087 | 1943 | 0.918 | 0.878 |
| bridge | 4181 | 10414 | 0.806 | 0.683 |
| ground-track-field | 733 | 1845 | 0.924 | 0.868 |
| small-vehicle | 58868 | 104643 | 0.883 | 0.778 |
| large-vehicle | 43075 | 69705 | 0.929 | 0.870 |
| ship | 76153 | 89430 | 0.904 | 0.882 |
| tennis-court | 5923 | 6942 | 0.985 | 0.908 |
| basketball-court | 1180 | 1972 | 0.982 | 0.903 |
| storage-tank | 13670 | 16468 | 0.793 | 0.721 |
| soccer-ball-field | 827 | 2316 | 0.907 | 0.827 |
| roundabout | 973 | 2228 | 0.903 | 0.839 |
| harbor | 15468 | 24403 | 0.848 | 0.773 |
| swimming-pool | 3836 | 6233 | 0.919 | 0.841 |
| helicopter | 1189 | 1656 | 0.924 | 0.881 |
+--------------------+-------+--------+--------+-------+
| mAP | | | | 0.837 |
+--------------------+-------+--------+--------+-------+
这里我使用trainval训练再用trainval测试
总结
熟悉使用mmcv系列以后一定会觉得mmrotate上手很容易,再加上gliding-vertex的源码复现太麻烦了(源码torch版本太低,但为了cuda11最低也只能支持1.7,而且源码还要装一堆其他依赖,这些依赖里也有可能跟torch或Python版本不兼容,反正各种报错),openmmlab yyds!