【AI目标检测】MMROTATE踩坑记录

2023-11-11

MMROTATE介绍

MMRotate 是一款基于 PyTorch 的旋转框检测的开源工具箱,是 OpenMMLab 项目的成员之一。
在这里插入图片描述

MMROTATE安装

mmrotate的安装同mmdet等类似
参考mmrotate安装

  1. 创建环境
conda create -n openmmlab python=3.7 -y
conda activate openmmlab
  1. 安装pytorch
conda install pytorch==1.7.0 torchvision==0.8.0 cudatoolkit=10.1 -c pytorch
  1. pip install 必要的包

首先是mmcv-full

pip install mmcv-full -f https://download.openmmlab.com/mmcv/dist/cu111/torch1.9.0/index.html

然后要安装mmdet

pip install mmdet

mmrotate建议从源码安装

git clone https://github.com/open-mmlab/mmrotate.git
cd mmrotate
pip install -r requirements/build.txt
pip install -v -e .  # or "python setup.py develop"

其中pip install -v -e .orpython setup.py develop将会安装为开发模式,所有对源码的修改都将生效。(pip install -v -e .最后的.表示当前路径,不要漏掉!)

训练测试

根据自己的要求写配置文件,修改为自己的数据集路径和类别以及类别数目

# the new config inherits the base configs to highlight the necessary modification
_base_ = '../r3det/r3det_r50_fpn_1x_dota_oc.py'

# 验证设置
evaluation = dict(interval=1, metric='mAP')
runner = dict(type='EpochBasedRunner', max_epochs=200)
checkpoint_config = dict(interval=100)

# 1. dataset settings
dataset_type = 'DOTADataset'
classes = ('comp', 'procl')
data = dict(
    samples_per_gpu=2,
    workers_per_gpu=2,
    train=dict(
        type=dataset_type,
        # explicitly add your class names to the field `classes`
        classes=classes,
        ann_file='/home/wd337/projects/mmrotate/data/dota/annotations/train',
        img_prefix='/home/wd337/projects/mmrotate/data/dota/images/train'),
    val=dict(
        type=dataset_type,
        # explicitly add your class names to the field `classes`
        classes=classes,
        ann_file='/home/wd337/projects/mmrotate/data/dota/annotations/val',
        img_prefix='/home/wd337/projects/mmrotate/data/dota/images/val'),
    test=dict(
        type=dataset_type,
        # explicitly add your class names to the field `classes`
        classes=classes,
        ann_file='/home/wd337/projects/mmrotate/data/dota/annotations/test',
        img_prefix='/home/wd337/projects/mmrotate/data/dota/images/test'))

# 2. model settings
model = dict(
    bbox_head=dict(
        # explicitly over-write all the `num_classes` field from default 15 to 5.
        num_classes=2))

训练(单卡):

python tools/train.py configs/my_config/my_config.py --work-dir=work_dirs/my_model

测试:

python ./tools/test.py \
  configs/my_config/my_config.py \
  work_dirs/my_model/my_model_pth.pth --show-dir work_dirs/vis

出现的错误

error 1

ValueError: could not convert string to float: 'imagesource:null'

原因:由于在查看DOTA数据集的时候发现有标注文件都有imagesource和gsd信息,在转换时加上了这两行信息,去掉即可

error 2

File "/home/wd337/projects/mmrotate/mmrotate/datasets/dota.py", line 199, in evaluate
    mean_ap, _ = eval_map(
TypeError: eval_map() got an unexpected keyword argument 'version'

原因:
在mean_ap传参时的version=self.version在构建eval_map时并未使用,将其注释掉

mean_ap, _ = eval_map(
                results,
                annotations,
                scale_ranges=scale_ranges,
                iou_thr=iou_thr,
                dataset=self.CLASSES,
                # version=self.version,
                logger=logger,
                nproc=nproc)
                
def eval_map(det_results,
             annotations,
             scale_ranges=None,
             iou_thr=0.5,
             dataset=None,
             logger=None,
             nproc=4):

后续0.1.1版本官方版本已经解决

error 3

  File "/home/wd337/projects/mmrotate/mmrotate/datasets/dota.py", line 199, in evaluate
    mean_ap, _ = eval_map(
  File "/home/wd337/projects/mmrotate/mmrotate/datasets/dota.py", line 454, in eval_map
    print_map_summary(
  File "/home/wd337/projects/mmrotate/mmrotate/datasets/dota.py", line 516, in print_map_summary
    label_names[j], num_gts[i, j], results[j]['num_dets'],
IndexError: tuple index out of range

配置文件中的class没有改完全,使用的r3det配置文件中在model中的refine_heads中也有num_class参数,修改为自己的class数即可

error 4

Traceback (most recent call last):
  File "tools/train.py", line 182, in <module>
    main()
  File "tools/train.py", line 171, in main
    train_detector(
  File "/home/wd337/projects/mmrotate/mmrotate/apis/train.py", line 156, in train_detector
    runner.run(data_loaders, cfg.workflow)
  File "/home/wd337/anaconda3/envs/openmmlab/lib/python3.8/site-packages/mmcv/runner/epoch_based_runner.py", line 127, in run
    epoch_runner(data_loaders[i], **kwargs)
  File "/home/wd337/anaconda3/envs/openmmlab/lib/python3.8/site-packages/mmcv/runner/epoch_based_runner.py", line 47, in train
    for i, data_batch in enumerate(self.data_loader):
  File "/home/wd337/anaconda3/envs/openmmlab/lib/python3.8/site-packages/torch/utils/data/dataloader.py", line 359, in __iter__
    return self._get_iterator()
  File "/home/wd337/anaconda3/envs/openmmlab/lib/python3.8/site-packages/torch/utils/data/dataloader.py", line 305, in _get_iterator
    return _MultiProcessingDataLoaderIter(self)
  File "/home/wd337/anaconda3/envs/openmmlab/lib/python3.8/site-packages/torch/utils/data/dataloader.py", line 944, in __init__
    self._reset(loader, first_iter=True)
  File "/home/wd337/anaconda3/envs/openmmlab/lib/python3.8/site-packages/torch/utils/data/dataloader.py", line 975, in _reset
    self._try_put_index()
  File "/home/wd337/anaconda3/envs/openmmlab/lib/python3.8/site-packages/torch/utils/data/dataloader.py", line 1209, in _try_put_index
    index = self._next_index()
  File "/home/wd337/anaconda3/envs/openmmlab/lib/python3.8/site-packages/torch/utils/data/dataloader.py", line 512, in _next_index
    return next(self._sampler_iter)  # may raise StopIteration
  File "/home/wd337/anaconda3/envs/openmmlab/lib/python3.8/site-packages/torch/utils/data/sampler.py", line 226, in __iter__
    for idx in self.sampler:
  File "/home/wd337/anaconda3/envs/openmmlab/lib/python3.8/site-packages/mmdet/datasets/samplers/group_sampler.py", line 36, in __iter__
    indices = np.concatenate(indices)
  File "<__array_function__ internals>", line 180, in concatenate
ValueError: need at least one array to concatenate

原因:
配置文件中的数据集路径写错了,一定要仔细检查

error 5

Traceback (most recent call last):
  File "/home/wd337/anaconda3/envs/openmmlab/lib/python3.8/site-packages/mmcv/utils/registry.py", line 52, in build_from_cfg
    return obj_cls(**args)
  File "/home/wd337/projects/mmrotate/mmrotate/models/detectors/r3det.py", line 48, in __init__
    self.refine_head.append(build_head(refine_head))
  File "/home/wd337/projects/mmrotate/mmrotate/models/builder.py", line 37, in build_head
    return ROTATED_HEADS.build(cfg)
  File "/home/wd337/anaconda3/envs/openmmlab/lib/python3.8/site-packages/mmcv/utils/registry.py", line 212, in build
    return self.build_func(*args, **kwargs, registry=self)
  File "/home/wd337/anaconda3/envs/openmmlab/lib/python3.8/site-packages/mmcv/cnn/builder.py", line 27, in build_model_from_cfg
    return build_from_cfg(cfg, registry, default_args)
  File "/home/wd337/anaconda3/envs/openmmlab/lib/python3.8/site-packages/mmcv/utils/registry.py", line 24, in build_from_cfg
    raise KeyError(
KeyError: '`cfg` or `default_args` must contain the key "type", but got {\'num_classes\': 2, \'train_cfg\': {\'assigner\': {\'type\': \'MaxIoUAssigner\', \'pos_iou_thr\': 0.6, \'neg_iou_thr\': 0.5, \'min_pos_iou\': 0, \'ignore_iof_thr\': -1, \'iou_calculator\': {\'type\': \'RBboxOverlaps2D\'}}, \'allowed_border\': -1, \'pos_weight\': -1, \'debug\': False}, \'test_cfg\': {\'nms_pre\': 2000, \'min_bbox_size\': 0, \'score_thr\': 0.05, \'nms\': {\'iou_thr\': 0.1}, \'max_per_img\': 2000}}\nNone'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "tools/train.py", line 182, in <module>
    main()
  File "tools/train.py", line 152, in main
    model = build_detector(
  File "/home/wd337/projects/mmrotate/mmrotate/models/builder.py", line 55, in build_detector
    return ROTATED_DETECTORS.build(
  File "/home/wd337/anaconda3/envs/openmmlab/lib/python3.8/site-packages/mmcv/utils/registry.py", line 212, in build
    return self.build_func(*args, **kwargs, registry=self)
  File "/home/wd337/anaconda3/envs/openmmlab/lib/python3.8/site-packages/mmcv/cnn/builder.py", line 27, in build_model_from_cfg
    return build_from_cfg(cfg, registry, default_args)
  File "/home/wd337/anaconda3/envs/openmmlab/lib/python3.8/site-packages/mmcv/utils/registry.py", line 55, in build_from_cfg
    raise type(e)(f'{obj_cls.__name__}: {e}')
KeyError: 'R3Det: \'`cfg` or `default_args` must contain the key "type", but got {\\\'num_classes\\\': 2, \\\'train_cfg\\\': {\\\'assigner\\\': {\\\'type\\\': \\\'MaxIoUAssigner\\\', \\\'pos_iou_thr\\\': 0.6, \\\'neg_iou_thr\\\': 0.5, \\\'min_pos_iou\\\': 0, \\\'ignore_iof_thr\\\': -1, \\\'iou_calculator\\\': {\\\'type\\\': \\\'RBboxOverlaps2D\\\'}}, \\\'allowed_border\\\': -1, \\\'pos_weight\\\': -1, \\\'debug\\\': False}, \\\'test_cfg\\\': {\\\'nms_pre\\\': 2000, \\\'min_bbox_size\\\': 0, \\\'score_thr\\\': 0.05, \\\'nms\\\': {\\\'iou_thr\\\': 0.1}, \\\'max_per_img\\\': 2000}}\\nNone\''

原因,配置文件的写法不规范

error 6

最后的结果都是歪的,但是mAP却很高
原因:
在确认框的方向的时候将坐标系搞错,从而在转换数据集的时候缺少了一个负号,因此框全都少了同样的角度

error 7

修改backbone中的ReResNet不起作用
原因:
默认的配置是使用的ResNet和FPN,并不是仓库中用e2cnn重写的ReResNet和ReFPN

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【AI目标检测】MMROTATE踩坑记录 的相关文章

  • Lighttpd 和 cgi python

    我正在尝试通过 lighttpd 执行一些 python 脚本 但是当我尝试运行它时 我只得到一个要求我下载的空白文件 lighttpd conf server modules mod access mod alias mod access
  • 与区域指示符字符类匹配的 python 正则表达式

    我在 Mac 上使用 python 2 7 10 表情符号中的标志由一对表示区域指示符号 https en wikipedia org wiki Regional Indicator Symbol 我想编写一个 python 正则表达式来在
  • 将html数据解析成python列表进行操作

    我正在尝试读取 html 网站并提取其数据 例如 我想查看公司过去 5 年的 EPS 每股收益 基本上 我可以读入它 并且可以使用 BeautifulSoup 或 html2text 创建一个巨大的文本块 然后我想搜索该文件 我一直在使用
  • 删除flask中的一对一关系

    我目前正在使用 Flask 开发一个应用程序 并且在删除一对一关系中的项目时遇到了一个大问题 我的模型中有以下结构 class User db Model tablename user user id db Column db String
  • 如何使用 Pandas、Numpy 加速 Python 中的嵌套 for 循环逻辑?

    我想检查一下表的字段是否TestProject包含了Client端传入的参数 嵌套for循环很丑陋 有什么高效简单的方法来实现吗 非常感谢您的任何建议 def test parameter a list parameter b list g
  • 使用 xlrd 打开 BytesIO (xlsx)

    我正在使用 Django 需要读取上传的 xlsx 文件的工作表和单元格 使用 xlrd 应该可以 但因为文件必须保留在内存中并且可能不会保存到我不知道如何继续的位置 本例中的起点是一个带有上传输入和提交按钮的网页 提交后 文件被捕获req
  • “隐藏”内置类对象、函数、代码等的名称和性质[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我很好奇模块中存在的类builtins无法直接访问的 例如 type lambda 0 name function of module
  • 如何使用python在一个文件中写入多行

    如果我知道要写多少行 我就知道如何将多行写入一个文件 但是 当我想写多行时 问题就出现了 但是 我不知道它们会是多少 我正在开发一个应用程序 它从网站上抓取并将结果的链接存储在文本文件中 但是 我们不知道它会回复多少行 我的代码现在如下 r
  • Docker 中的 Python 日志记录

    我正在 Ubuntu Web 服务器上的 Docker 容器中测试运行 python 脚本 我正在尝试查找由 Python Logger 模块生成的日志文件 下面是我的Python脚本 import time import logging
  • javascript 是否有等效的 __repr__ ?

    我最接近Python的东西repr这是 function User name password this name name this password password User prototype toString function r
  • Python3 在 DirectX 游戏中移动鼠标

    我正在尝试构建一个在 DirectX 游戏中执行一些操作的脚本 除了移动鼠标之外 我一切都正常 是否有任何可用的模块可以移动鼠标 适用于 Windows python 3 Thanks I used pynput https pypi or
  • 使用特定颜色和抖动在箱形图上绘制数据点

    我有一个plotly graph objects Box图 我显示了箱形 图中的所有点 我需要根据数据的属性为标记着色 如下所示 我还想抖动这些点 下面未显示 Using Box我可以绘制点并抖动它们 但我不认为我可以给它们着色 fig a
  • 如何使用原始 SQL 查询实现搜索功能

    我正在创建一个由 CS50 的网络系列指导的应用程序 这要求我仅使用原始 SQL 查询而不是 ORM 我正在尝试创建一个搜索功能 用户可以在其中查找存储在数据库中的书籍列表 我希望他们能够查询 书籍 表中的 ISBN 标题 作者列 目前 它
  • 如何断言 Unittest 上的可迭代对象不为空?

    向服务提交查询后 我会收到一本字典或一个列表 我想确保它不为空 我使用Python 2 7 我很惊讶没有任何assertEmpty方法为unittest TestCase类实例 现有的替代方案看起来并不正确 self assertTrue
  • 为什么 Pickle 协议 4 中的 Pickle 文件是协议 3 中的两倍,而速度却没有任何提升?

    我正在测试 Python 3 4 我注意到 pickle 模块有一个新协议 因此 我对 2 个协议进行了基准测试 def test1 pickle3 open pickle3 wb for i in range 1000000 pickle
  • 如何在 pygtk 中创建新信号

    我创建了一个 python 对象 但我想在它上面发送信号 我让它继承自 gobject GObject 但似乎没有任何方法可以在我的对象上创建新信号 您还可以在类定义中定义信号 class MyGObjectClass gobject GO
  • 如何应用一个函数 n 次? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 假设我有一个函数 它接受一个参数并返回相同类型的结果 def increment x return x 1 如何制作高阶函数repeat可以
  • Pandas 每周计算重复值

    我有一个Dataframe包含按周分组的日期和 ID df date id 2022 02 07 1 3 5 4 2022 02 14 2 1 3 2022 02 21 9 10 1 2022 05 16 我想计算每周有多少 id 与上周重
  • 更改 Tk 标签小部件中单个单词的颜色

    我想更改 Tkinter 标签小部件中单个单词的字体颜色 我知道可以使用文本小部件来实现与我想要完成的类似的事情 例如使单词 YELLOW 显示为黄色 self text tag config tag yel fg clr yellow s
  • 使用随机放置的 NaN 创建示例 numpy 数组

    出于测试目的 我想创建一个M by Nnumpy 数组与c随机放置的 NaN import numpy as np M 10 N 5 c 15 A np random randn M N A mask np nan 我在创建时遇到问题mas

随机推荐