当前位置:   article > 正文

ICCV 2023 | LSKNet【保姆级】训练自己的目标检测模型

lsknet

        LSKNet在多个数据集上刷新了SOTA,HRSC2016(98.46% mAP)、DOTA-v1.0(81.64% mAP)和FAIR1M-v1.0(47.87% mAP)。想在自己的遥感数据集上试试效果。情况说明:博主是在服务器上训练的,因此在环境的安装上会比代码给出的简单安装流程稍微困难一点,论文和代码链接:

Paper

代码

1.环境搭建

        代码基于MMrotate实现,因此熟悉MMrotate的相关使用方法训练会进行的更顺利一点。MMRotate依赖于PyTorchMMCVMMDetection。 以下是安装的快速步骤。并且readme中还给出了安装指南M,博主直接上重点,具体安装方法:

  1. conda create --name openmmlab python=3.8 -y
  2. conda activate openmmlab
  3. conda install pytorch==1.8.0 torchvision==0.9.0 cudatoolkit=10.2 -c pytorch
  4. pip install -U openmim
  5. mim install mmcv-full
  6. mim install mmdet
  7. git clone https://github.com/zcablii/Large-Selective-Kernel-Network.git
  8. cd Large-Selective-Kernel-Network
  9. pip install -v -e .

但是在博主那个服务器上安装非常不顺利,所以讲一下博主怎么安装的,首先搭建虚拟环境:

  1. conda create --name openmmlab python=3.9 -y
  2. conda activate openmmlab

这里注意python版本最好新一点(大于3.7,减少不必要的麻烦),博主用的3.9的

接下来安装pytorch,版本要和cuda对应,博主服务器cuda11.6,因此这样安装:

conda install pytorch==1.13.1 torchvision==0.14.1 torchaudio==0.13.1 pytorch-cuda=11.6 -c pytorch -c nvidia

接下来是顺利的安装openmim

pip install -U openmim

之后mim install mmcv-full 和mim install mmdet就没在顺利过了,安装mmcv-full的时候会报错:

Looking in links: https://download.openmmlab.com/mmcv/dist/cu116/torch1.13/index.html WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'ConnectTimeoutError(<pip._vendor.urllib3.connection.HTTPSConnection object at 0x7f73dd12a390>, 'Connection to download.openmmlab.com timed out. (connect timeout=15)')': /mmcv/dist/cu116/torch1.13/index.html WARNING: Retrying (Retry(total=3, connect=None, read=None, redirect=None, status=None)) after connection broken by 'ConnectTimeoutError(<pip._vendor.urllib3.connection.HTTPSConnection object at 0x7f73dd12a450>, 'Connection to download.openmmlab.com timed out. (connect timeout=15)')': /mmcv/dist/cu116/torch1.13/index.html

大概率是网络的问题,博主的服务器不能使用科技,因此介绍一种最最基础无论如何也能安装好的方法:

直接去报错的网站(https://download.openmmlab.com/mmcv/dist/cu116/torch1.13/index.html)下载轮子,然后放到文件夹里安装:

cp是python的版本,因此博主取的39,torch一定要和自己的pytorch版本对应,确定系统是linux还是windows,然后下载就可以了,博主下载的版本:

然后回到终端,在虚拟环境里直接安装即可(注意一定要cd到放whl文件所在的文件夹):

pip install {文件名}.whl

然后再安装mmdet:

pip install mmdet

这个还挺顺利的,没有用到mim,因为试过很多次,总是报错,所以干脆暴力安装。

接下来是下载代码,如果下载不下来的话可以用科技直接去git网站上下载然后解压:

  1. git clone https://github.com/zcablii/Large-Selective-Kernel-Network.git
  2. cd Large-Selective-Kernel-Network
  3. pip install -v -e .

pip install -v -e .这一步很重要千万别忘了,要确保成功,不然后面改代码的话很麻烦(博主就粗心忘记了)

最后别忘了把requirements.txt配置一下:

pip install -r requirements.txt

这一步如果不成功的话记住安装不成功的模块,去网上下载了再安装,和安装mmcv-full的方法一样。到这里环境就艰难的搭建成功!

2.训练模型

训练模型这不出意外的博主还是遇到了一点麻烦(关于分布式训练的),所以在会在重要的步骤针对单卡训练和多卡训练分着来讲

首先是下载预训练模型:

有2个,分别是 LSKNet-T和 LSKNet-S根据文章介绍选择合适的下载就好,不需要解压,存放在. /mmrotate/models/backbones/文件夹目录下,待会配置文件要用。

接着打开train文件,地址./LSKNet-main/tools/train.py,需要改的分别是以下几个地方:

配置文件和工作目录的地址:

配置文件在./LSKNet-main/configs/lsknet/目录下,注意有不同数据集的版本以及对LSKNet-T与LSKNet-S进行了区分,使用自己的数据集要找一个数据集格式与配置文件的数据集格式相同的,比如博主的数据集的8个数字加标签(但是没有difficulty)的四边形顶点数据集,因此选用lsknet/lsk_s_fpn_1x_dota_le90.py作为自己的配置文件(懒得改名了,也可以改成自己的)

(1)配置文件

然后是打开配置文件修改配置文件,最开始就放了文件目录,照着../_base_/文件目录将dotav1.py,schedule_1x.py与default_runtime.py三个文件一一打开:

dotav1.py

打开dotav1.py文件,首先对data_root进行修改,改成你准备存放这个训练项目据集的地方。

接下来是更改数据集训练,测试,评估的地址(注意前面加/,不然容易找不到数据集报错:ValueError: need at least one array to concatenate):

schedule_1x.py

主要改改max_epoch

default_runtime.py看看有没有需要改的,没有就算了

接下来是gpu的数量,根据自己实际情况来定

接下来把之前下载的预训练模型地址进行填写:

之后就是一些参数的调整,第一次训练可以不修改,先运行通了以后再做细致的修改

配置文件的准备工作基本完成,接下来就是数据集的准备

(2)数据集类别修改

数据集的标注可以去自行搜索,这里就不多说了,假设你已经有了自己的数据集,并且在dotav1.py文件中已经完成了数据集的存放,那么就剩在代码中的自己数据集类别的修改,作为一个小白,这个比较难找,但是注意到dotav1.py中首行DOTADataset,这是个类:

那就说明数据集的相关设置应该在这里,因此打开./LSKNet-main/mmrotate/datasets/dota.py路径下dota.py文件,找到DOTADataset类:

然后对classes进行数据集检测类的输入:

注意数据集图片默认是png,如果图片是jpg记得更改:

如果你的数据集没问题的话,那么我们数据集的相关工作就应该完成了,下面马上开始训练!

(3)单卡多卡训练

初始的代码默认是多卡训练的,因此,先来讲多卡的训练:

多卡

多卡配置文件这个地方不用修改,但是运行的话会出现报错:ValueError: Error initializing torch.distributed using env:// rendezvous: environment variable MASTER_ADDR expected, but not set,因此需要在train.py文件中进行更改,在图中位置加入三行代码:

代码:

  1. import os
  2. os.environ['MASTER_ADDR'] = 'localhost'
  3. os.environ['MASTER_PORT'] = '5678'

修改一下,第一次的时候发现只要将上面的代码插入就可以 了,但是在第二次运行之后发现还是会出现相同的问题,现列出解决方法:

将原代码修改为:

  1. import os
  2. os.environ['RANK'] = '0'
  3. os.environ['MASTER_ADDR'] = 'localhost'
  4. os.environ['MASTER_PORT'] = '5678'

多加了一个rank的0值,也是按照报错提醒整出来的。

MASTER_ADDR是指定主节点的地址的环境变量,MASTER_PORT是指定主节点的端口号的环境变量。在分布式计算环境中,各个计算节点(包括主节点)通过这两个环境变量来协调通信,以便能够一起执行任务。

调整完成之后就可以在命令行运行了,输入:

python /地址。。。/train.py /地址。。。/lsk_s_fpn_1x_dota_le90.py --launcher pytorch

即可运行,如果遇到报错(亲测有)就看看3中有没有提到,看着解决就好,都是小问题!

单卡

单卡首先修改配置文件的norm_cfg:SyncBN改成BN。

然后就是针对train.py中关于gpu的代码:

对命令行进行输入:

python /地址/train.py 地址/lsk_s_fpn_1x_dota_le90.py --gpu-ids 你的数字

即可开始训练

注意单个gpu训练的时候可以改小一点batchsize:即 samples_per_gpu, workers_per_gpu,两个值

3.一些报错

报错IndexError: DOTADataset: list index out of range

如果数据集中没有difficulty,最好的办法就是想办法加上,但是没有也有没有的方法:

看链接:忽略标签中difficulty的相关更改

报错:ValueError: Error initializing torch.distributed using env:// rendezvous: environment variable MASTER_ADDR expected, but not set

不多说,这个问题很多人都有,看链接:配置分布式计算的主节点信息

报错:RuntimeError: indices should be either on cpu or on the same device as the indexed tensor (cpu)

代码尝试在不同设备(CPU和GPU)上操作张量,这是不被允许的

解决方法看链接:一个或多个张量不在同一设备上

此问题出现在两个文件之中,需要更改两次:

bbox_nms_rotated.py:

rotated_bbox_head.py

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号