MMDetection 3.2.0用法

本文梳理记录和整合了一些MMDetection的用法。主要是因为官方文档写得比较一般,有些错误和不全面的地方(比如很多类根本查不到)。所记录内容的来源主要为以下链接  

MMDetection代码课_哔哩哔哩_bilibili

5 MMDetection 代码教学_哔哩哔哩_bilibili

目标检测篇:MMDetection 推理使用与详细踩坑记录 | Just for Life.

Welcome to MMDetection’s documentation! — MMDetection 3.2.0 文档

MMdetection零基础安装教程,从环境配置到项目实战,计算机博士手把手带你玩转MMdetection目标检测框架!(人工智能/深度学习/计算机视觉)_哔哩哔哩_bilibili

目录

1.安装

2.训练模型全过程(这一节的内容是参考上面的链接1视频)

(1)数据集准备和可视化

(2)自定义配置文件

(3)训练前可视化验证

(4)模型训练

(5)模型测试和推理(后面还有一节也介绍了模型测试和推理,其内容是参考开头的链接2视频)

下面是推理和可视化多张图的步骤:

下面是推理单张图的步骤: 

(6)可视化分析

3.去哪里找预训练模型

4.训练自己的模型(或微调)(这一节的内容是参考开头的链接2视频)

5.work_dirs工作目录(用于保存训练和测试结果)

6.已有训练好的模型,进行推理或测试(这一节的内容是参考开头的链接2视频)


1.安装

这部分直接看官方文档

MMDetection在GitHub上的代码库结构 

如果安装后发现有问题,可以通过如下脚本打印环境信息进行问题定位,或将输出发给官方求助 

2.训练模型全过程(这一节的内容是参考上面的链接1视频)

(1)数据集准备和可视化

在目标检测任务里,数据集建议采用coco格式。

数据集可视化代码如下:

读取前8张图并可视化

读取coco格式的标注并可视化 

(2)自定义配置文件

放在最前面(写配置文件的常见问题,本小节最后有示例配置文件写法,另外包含所有可配置参数解释的文档链接在这里

 配置文件主要是把以下内容囊括在内,从而简化用户的编程过程。配置文件的官方文档学习配置文件 — MMDetection 3.2.0 文档

 配置好后如果想检查,输入以下代码(其中tools文件夹是来自于mmdetection官方github库,只需要下载官方代码库,之后把tools文件夹复制到自己的代码文件夹下即可)

python tools/misc/print_config.py /PATH/TO/CONFIG

因为其采用继承的思想,所以只需要在自己创建的.py配置文件里包括修改过的部分即可,没有修改的部分不需要加进来,在文件的开头加一句继承语句即可

PS:如果想使用继承,一定要在自己编写的配置文件里包含所有想改的内容,不要到继承的那个原始配置文件里面修改,实测原始文件里修改后不会被实际应用

忽略配置文件中的部分内容 

修改配置文件里的中间变量时,需修改每一处用到该变量的地方

举例(下面举例一般需要修改哪些内容,示例是以MMDetection官方提供的cat数据集和RTMDet网络为例的)

注意下图的学习率一定要修改,MMDetection里初始的默认值是8卡加32batch_size的学习率,要修改成自己的卡数和batch_size的对应值 (下图是单卡加8batch_size)

预训练模型不知道如何选取可以看后面的文章,有单独一栏介绍这个内容

(3)训练前可视化验证

利用MMDetection官方github仓库里提供的tools/analysis_tools/browse_dataset.py脚本对dataloader的输出进行可视化。

原理其实就是遍历dataloader,之后取前面8张图片进行可视化:

(4)模型训练

上述3个步骤配置好后,直接调用MMDetection官方github仓库里提供的训练代码tools/train.py即可开始训练,下图代码即为运行代码,第二个参数为配置文件(如果想要指定所使用的GPU id,可以在命令最前面加上CUDA_VISIBLE_DEVICES=id,具体参考文章

除了这种方式,我在下面的小节4还记录了一种训练模型的方式和注意事项(其实就是把命令行直接传参数的方式改为了把参数写进sh文件,之后直接调用sh文件进行训练),那一节的内容是基于本文开头链接2的视频

断点续练:如果训练过程意外中断,仅需两步即可实现断点续练:

1、在配置文件中设置参数resume为True

2、在配置文件中设置参数load_from为None

之后重新运行训练命令即可断点续练

(5)模型测试和推理(后面还有一节也介绍了模型测试和推理,其内容是参考开头的链接2视频)

下面是推理和可视化多张图的步骤:

离线测试,可以直接调用MMDetection官方github仓库里提供的测试代码tools/test.py,下图为运行代码,第二个参数为配置文件,第三个参数为模型权重

在测试阶段,如果想保存测试图片的结果,可以在上述命令的基础上添加--show-dir参数,会自动在代码目录work_dir/当前时间戳/results里生成测试图片 (测试图片是真实值图片在左、预测图片在右并拼接在一起的)

如果想可视化测试结果, 第一种方式是参考(1)数据集准备和可视化 里的图片可视化代码,其它方法见下图

下面是推理单张图的步骤: 

(6)可视化分析

由于要用MMYOLO的库,所以先装MMYOLO

特征图可视化(squeeze_mean是将所有特征图取均值后可视化的方式,select_max是取最大值的方式,topk是取前k个最大的方式,具体该参数如何设置见下面第二张图)

梯度图可视化 

3.去哪里找预训练模型

方法一(使用命令行):在命令行终端输入

mim search mmdet --model "模型名"

会跳转如下界面,从该界面找到想下载的模型,复制其config id之后退出(该文本编辑界面类似于vim,j和k上下移动,q退出,h可以查询操作指令)

之后输入以下代码开始下载,其中--config后跟刚才复制的id,--des后跟想下载到的路径(我下载到当前文件夹 . )(也可以不手动下载,获取上述预训练模型文件的下载地址后,直接在配置文件里把load_from参数设置为对应的下载地址即可)

mim download mmdet --config detr_r50_8xb2-150e_coco --dest .

 命令执行后即得到对应的模型权重文件.pth和配置文件.py

方法二(手动下载):MMDetection GitHub项目里的configs文件夹里有多个预训练好的模型,点进对应文件夹,找到config文件和model文件进行下载,网址为https://github.com/open-mmlab/mmdetection/tree/main/configs(也可以不手动下载,获取上述预训练模型文件的下载地址后,直接在配置文件里把load_from参数设置为对应的下载地址即可)

4.训练自己的模型(或微调)(这一节的内容是参考开头的链接2视频)

总:训练自己的模型时,首先按照图中的步骤来写一个新的配置文件,之后终端输入以下代码开启训练(需要提前下载好官方代码库tools里的代码文件并放到当前文件夹里),具体可见在标准数据集上训练预定义的模型 — MMDetection 3.2.0 文档 (如果想要指定所使用的GPU id,可以在dist_train.sh文件里设置CUDA_VISIBLE_DEVICES=id,具体参考文章

(相比于前面介绍的那种方法,这里其实就是把命令行直接传参数的方式改为了把参数写进sh文件,之后直接调用sh文件进行训练)

bash ./tools/dist_train.sh \
    ${CONFIG_FILE} \
    ${GPU_NUM} \
    [optional arguments]

举一个简单的例子,比如想要在yolo v3的基础上修改模型和数据集并微调训练出新的模型,只需要下载之前的配置文件,按照4里的步骤创建自己的配置文件、继承之前的配置文件,然后在自己的配置文件写上修改的地方, 可参考链接模型微调 — MMDetection 3.2.0 文档 ,通常来讲有这么几个:

数据路径 (可参考学习配置文件 — MMDetection 3.2.0 文档):全局的data_root,train/test/val_dataloader、train_dataset、test/val_evaluator里的data_root(数据集根目录路径)、ann_file(数据集标注文件路径)、data_prefix(图片路径的前缀,尤其注意train和val以及test的图片路径前缀是否相同)、metainfo( 其写法和解释可参考链接1链接2 ,如果是自定义数据集一定要加这个,否则训练时会出现以下报错,该报错解决方案链接

File "<__array_function__ internals>", line 200, in concatenate
ValueError: need at least one array to concatenate

数据增强:如果是微调模型通常不需要改,如果要改的话,通过修改train/test/val_dataloader里的pipeline和train/test_pipeline(通常dataloader和单独的pipeline应该相同,让一个等于另一个即可)来修改数据增强策略

模型相关:model里的bbox_head里的num_classes(改成自己数据集里的类别,比如只有一类橘子,那就写1)

model里的data_preprocessor用来对输入数据进行预处理,例如对输入图像进行归一化,将不同大小的图片进行 padding 从而组成 batch,将图像从内存中读取到显存中等。这部分配置取代了原本存在于 train_pipeline 和 test_pipeline 中的 Normalize 和 Pad,具体见将配置文件从 MMDetection 2.x 迁移至 3.x — MMDetection 3.2.0 文档

预训练模型:load_from,改成想要加载的预训练模型,避免从头训练

优化器配置:max_epochs = 150;改成自己想训练的轮次,如果是迁移学习改小一点

train_cfg = dict(max_epochs=150, type='EpochBasedTrainLoop', val_interval=1);这里也有一个max_epochs,也需要修改

optim_wrapper里的optimizer里的lr 和 param_scheduler里的学习率策略;即学习率,根据自己的需求修改(参数的解释可见学习配置文件 — MMDetection 3.2.0 文档

杂项

train/test/val_dataloader里的batch_size、num_workers(dataloader用来加载数据的进程数,如果为0则用主进程加载数据,如果大于0则为创建num_workers个进程用来加载数据,该数值取决于CPU的RAM,可观察训练情况进行动态调整,在此附上num_workers的官方文档链接和一个官方问答链接torch.utils.data — PyTorch 2.1 documentationGuidelines for assigning num_workers to DataLoader - PyTorch Forums,补充一句,mmdetection官方文档里写num_worker是线程,应该是错误的)

打印输出的控制,修改default_hooks里的logger里的interval,即设定多少轮输出一次模型相关信息,hook其实就是辅助debug的一种工具,可用来记录或改变模型中间层的输入输出和tensor的梯度信息,具体见Pytorch里hook的介绍 - 简书

断点续练:如果训练过程意外中断,仅需两步即可实现断点续练:

1、在配置文件中设置参数resume为True

2、在配置文件中设置参数load_from为None

之后重新运行训练命令即可断点续练

5.work_dirs工作目录(用于保存训练和测试结果)

模型训练过程产生的文件,比如模型参数等会保存到当前工作目录下的work_dirs文件夹

模型测试的结果如果想要保存下来,可以在配置文件里把test_evaluator加上outfile_prefix='./work_dirs/coco_detection/test',参考链接学习配置文件 — MMDetection 3.2.0 文档

6.已有训练好的模型,进行推理或测试(这一节的内容是参考开头的链接2视频)

可直接参考使用已有模型在标准数据集上进行推理 — MMDetection 3.2.0 文档

利用python代码的形式:基础的推理操作实现起来很简单,只需要准备好配置文件、模型权重文件和输入图片即可,具体代码示例如下:

from mmdet.apis import init_detector, inference_detector
import mmcv

config_file = "./rtmdet_tiny_8xb32-300e_coco.py"
checkpoint_file = './rtmdet_tiny_8xb32-300e_coco_20220902_112414-78e30dcc.pth'
model = init_detector(config_file, checkpoint_file, device='cuda:0')  
result = inference_detector(model, './demo.jpg')

利用命令行的形式:具体见测试现有模型 — MMDetection 3.2.0 文档 (需要提前下载好官方代码库tools里的代码文件并放到当前文件夹里)

7.自定义自己的模型文件

MMDetection V3系列高级指南之(自定义模型)_mmdetection 将自己模型目录register model type-CSDN博客

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
EasyExcel 3.2.0 是一个 Java 的 Excel 操作工具,可以读取和写入 Excel 文件。下面是使用 EasyExcel 3.2.0 的基本步骤: 1.添加 EasyExcel 3.2.0 依赖 在 Maven 项目中,可以在 pom.xml 文件中添加以下依赖: ``` <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>3.2.0</version> </dependency> ``` 2.读取 Excel 文件 使用 EasyExcel 3.2.0 读取 Excel 文件的示例如下: ``` // 定义 Excel 文件路径 String fileName = "path/to/excel/file.xlsx"; // 定义 Excel 文件读取监听器 ReadListener<Object> listener = new ReadListener<Object>() { @Override public void onException(Exception exception) { // 处理异常 } @Override public void onReadSuccess(Object data, AnalysisContext context) { // 处理读取到的数据 } @Override public void onReadError(Exception exception, AnalysisContext context) { // 处理读取错误 } }; // 创建 Excel 文件读取器 ExcelReader reader = new ExcelReader(new FileInputStream(fileName), null, listener); // 读取 Excel 文件 reader.read(); ``` 上述代码中,`ReadListener` 是一个接口,可以自定义实现。在示例中,我们实现了 `onException`、`onReadSuccess` 和 `onReadError` 三个方法,分别用于处理异常、读取成功和读取错误的情况。`ExcelReader` 是 EasyExcel 的 Excel 文件读取器,通过 `new FileInputStream(fileName)` 创建一个文件输入流,传入 `ExcelReader` 中进行读取。 3.写入 Excel 文件 使用 EasyExcel 3.2.0 写入 Excel 文件的示例如下: ``` // 定义 Excel 文件路径 String fileName = "path/to/excel/file.xlsx"; // 定义 Excel 文件写入监听器 WriteListener<Object> listener = new WriteListener<Object>() { @Override public void onException(Exception exception, AnalysisContext context) { // 处理异常 } @Override public void onWriteSuccess(Object data, AnalysisContext context) { // 处理写入成功 } @Override public void onWriteError(Exception exception, AnalysisContext context) { // 处理写入错误 } }; // 定义 Excel 文件写入器 ExcelWriter writer = new ExcelWriter(new FileOutputStream(fileName), ExcelTypeEnum.XLSX, null, listener); // 定义需要写入的数据 List<Object> dataList = new ArrayList<>(); dataList.add(new Object()); // 定义 Excel 文件写入参数 WriteSheet sheet = EasyExcel.writerSheet("Sheet1").build(); // 写入 Excel 文件 writer.write(dataList, sheet); // 关闭 Excel 文件写入器 writer.finish(); ``` 上述代码中,`WriteListener` 和 `ReadListener` 类似,也是一个接口,可以自定义实现。在示例中,我们实现了 `onException`、`onWriteSuccess` 和 `onWriteError` 三个方法,分别用于处理异常、写入成功和写入错误的情况。`ExcelWriter` 是 EasyExcel 的 Excel 文件写入器,通过 `new FileOutputStream(fileName)` 创建一个文件输出流,传入 `ExcelWriter` 中进行写入。 以上就是使用 EasyExcel 3.2.0 的基本步骤,具体的 API 可以参考 EasyExcel 的官方文档。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值