【零基础保姆级教程】MMDetection3安装与训练自己的数据集

news2024/12/23 13:34:43

最近在跑对比试验,由于MMDetection框架的算法较齐全,遂决定写一篇教程留做参考。若你对流程有问题与疑问欢迎评论区指出

本文运行环境如下供参考:

python版本3.9
MMDetection版本3.3
一、虚拟环境的搭建

参考该博客搭建基本环境:

【保姆级最简洁教程】零基础如何快速搭建YOLOv5/v7?_yolo安装-CSDN博客

可能会遇到的报错需要更新的包,输入如下代码解决:

pip install mmcv-full==2.0.0rc4 -f https://download.openmmlab.com/mmcv/dist/cu116/torch1.12/index.html
pip install mmdet==3.0.0

对mmcv还有疑问的,可参考该博客解决:

【零基础保姆级教程】mmcv安装教程-CSDN博客

二、跑通项目流程

首先到官网拉取项目

GitHub - open-mmlab/mmdetection: OpenMMLab Detection Toolbox and Benchmark

拉取后,进行以下步骤:

1.准备自己的数据集(VOC/COCO格式)

coco文件如图所示。

其中,test2017、train2017和val2017均存放图片。

annotations中文件结构如图所示。

2.在拉取项目的目录下新建文件夹data

把你的COCO或VOC格式数据集拉取进来,如图所示

3.根据自己的数据集类别进行修改

打开mmdetection-main\mmdet\evaluation\functional\class_names.py文件

将def coco_classes()和def voc_classes()的return中的内容改为自己数据集类别,博主此处示例只有一个类别,称为“polyp”,若你有多个类别名称不同请自行修改。如图所示:

打开mmdetection-main\mmdet\datasets\coco.py的class CocoDataset(BaseDetDataset):的   METAINFO = {}中的'classes':类别改为自己数据集的类别
打开mmdetection-main\mmdet\datasets\voc.py的
class VOCDataset(XMLDataset):的   METAINFO = {}中的'classes':类别改为自己数据集的类别,如图所示

4.在自己的根目录下运行重构项目
python setup.py install build
5.以SSD算法为例修改参数开始训练(若你要跑其它算法也均按此步骤)

打开mmdetection-main\configs\ssd\,configs目录可以挑选你需要跑的算法

打开ssdlite_mobilenetv2-scratch_8xb24-600e_coco.py

对里面的一些参数做修改,作用是符合自己的训练目的,博主修改了以下位置:

num_classes = 类别数,默认是80,博主数据集只有一个类别,故改为1(不用管背景)
max_epochs = 世代数
input_size = 输入图像尺寸,默认是300,根据你的要求修改
batch_size = 批次量,按住ctrl+f搜索后依次修改,考虑你的计算机资源量后修改
num_workers=线程数,考虑你的计算机资源量后修改

val_interval=评估间隔次数,默认是5,即五次epoch一次评估,这里博主选择的是1,频繁的评估可能造成训练总时间的延长,建议根据自己的需要做调整。

🔺无论你跑的是哪个算法,此处_base_中的参数都需要调整,尤其是博主上述给出的参数。若不修改,例如,batchsize在许多默认算法中是192,这对于许多资源有限的计算机可能就会导致异常。

注:若是跑VOC数据集的同学,此处也需要修改

改为

包括下方的ann_file和data_prefix参数,该项目默认数据集都是COCO数据集的,所以选择COCO格式数据集的可以少改一些。

除此之外,往上两张图中的mmdetection-main\configs\_base_\schedules\schedules_2x.py中的参数也需要调整。

同学们在刚刚开始训练时,需要观察每个step输出的loss值高低,若有一个或多个突然走高的数值是十分正常的,但若是走高乃至直接nan,可以尝试调整optimizer=,将其的学习率调低(如默认的lr×0.1乃至更低)在博主的训练在常有效。

在博主的数据集上,除了ssd\ssdlite_mobilenetv2-scratch_8xb24-600e_coco.py无需繁琐的调参外,centernet\centernet_r18_8xb16-crop512-140e_coco.py、retinanet\retinanet_effb3_fpn_8xb4-crop896-1x_coco.py也不需要调参,按照上述参数调整后即可开始训练。

同时,ssd\ssd300_coco.py、faster_rcnn\faster-rcnn_r18_fpn_8xb8-amp-lsj-200e_coco.py等的训练就很麻烦,经常需要调整学习率。

6.控制台输入命令开始训练
python tools/train.py configs/ssd/ssdlite_mobilenetv2-scratch_8xb24-600e_coco.py --work-dir work_dirs

即可在你的目录下生成work_dirs文件夹,待训练开始,打开后如图所示即代表训练成功

此处博主遭遇报错

ValueError: need at least one array to concatenate

该问题网上有许多解决方法均不适用,博主用如下方法解决:

在自己的本地环境下尤其注意类别需要改在:
./anaconda3/envs/(你的环境名称)/Lib/site-packages/mmdet/dataset/coco.py中的
'classes':('你的类别名称',)即可解决

7.正常运行结果如下所示

如图所示即运行成功。

8.修改项目文件使可输出指标Precision、Recall、F1

运行后会在work_dirs下生成你的设置的epoch等数量的权重文件。接下来做如下工作:

输入命令:

python tools/test.py configs/ssd/ssdlite_mobilenetv2-scratch_8xb24-600e_coco.py work_dirs/epoch_xx.pth --out=result.pkl

此处命令的xx需改为实际的数字,即可对你训练出的权重进行测试,测试结果会输出COCO指标与一个result.pkl文件,这个文件可用于生成precision/recall/f1。

打开文件tools/analysis_tools/confusion_matrix.py

在文件后加入代码


    TP = np.diag(confusion_matrix)
    FP = np.sum(confusion_matrix, axis=0) - TP
    FN = np.sum(confusion_matrix, axis=1) - TP

    precision = TP / (TP + FP)
    recall = TP / (TP + FN)
    average_precision = np.mean(precision)
    average_recall = np.mean(recall)
    f1 = 2 * (precision * recall) / (precision + recall)

    print('AP:', average_precision)
    print('AR:', average_recall)
    print('F1:', f1)
    print('Precision', precision[0])
    print('Recall', recall[0])


    output_file_path = os.path.join(save_dir, 'PRF1.txt')
    with open(output_file_path, 'a') as output_file:
        output_file.write(f'{prediction_path}    {precision[0]:.5f}   {recall[0]:.5f}   {f1:.5f}\n')

输入命令

python tools/analysis_tools/confusion_matrix.py configs/ssd/ssdlite_mobilenetv2-scratch_8xb24-600e_coco.py result.pkl results/ --score-thr 0.5 

即可生成对应一个epoch权重的指标。

若要生成所有权重的指标,请见链接:

【零基础保姆级教程】MMDetection3训练输出Precision/Recall/F1-Score指标-CSDN博客

三、运行过程中常见的报错

请见链接:

【持续更新中】MMDetection3训练自己的数据集常见报错解决-CSDN博客

更多文章产出中,主打简洁和准确,欢迎关注我,共同探讨!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2186286.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【开源免费】基于SpringBoot+Vue.JS水果购物网站(JAVA毕业设计)

本文项目编号 T 065 ,文末自助获取源码 \color{red}{T065,文末自助获取源码} T065,文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 查…

从认识String类,到走进String类的世界

作为一个常用的数据类型,跟随小编一同进入String的学习吧,领略String的一些用法。 1. 认识 String 类 2. 了解 String 类的基本用法 3. 熟练掌握 String 类的常见操作 4. 认识字符串常量池 5. 认识 StringBuffer 和 StringBuilder 一:…

【吊打面试官系列-MySQL面试题】Mysql中的事务回滚机制概述?

大家好,我是锋哥。今天分享关于【Mysql中的事务回滚机制概述?】面试题,希望对大家有帮助; Mysql中的事务回滚机制概述? 事务是用户定义的一个数据库操作序列,这些操作要么全做要么全不做,是一个…

职称评审一次通过需要注意什么?

谁能想到 被评委会全票通过的职称材料 居然要注意这么多细节 营业执照需要加盖公章 论文需要拆分上传 业绩需要连续提供近几年的 奖项可以加分 一些表格有模板 所以职称评审做材料还是有很多方面需要好好注意一下的,建议还是找机构帮你代理整理,因…

如何使用ssm实现基于web的网站的设计与实现+vue

TOC ssm756基于web的网站的设计与实现vue 绪论 1.1 研究背景 当前社会各行业领域竞争压力非常大,随着当前时代的信息化,科学化发展,让社会各行业领域都争相使用新的信息技术,对行业内的各种相关数据进行科学化,规范…

10. 模块

理想情况下,程序的结构清晰明了。它的运作方式易于解释,每个部分都发挥着明确的作用。 实际上,程序是有机生长的。当程序员发现新的需求时,就会添加新的功能。要使程序保持良好的结构,需要持续的关注和工作。这些工作只…

Linux ssh 免密登录配置

参考资料 ~/.ssh/configについて~/.ssh/configを使ってSSH接続を楽にする.ssh/configファイルでSSH接続を管理する 目录 一. 密钥生成1.1 生成工具1.1.1 OpenSSH1.1.2 Git 1.2 生成命令1.3 注意事项1.4 解决路径中的用户名乱码 二. 将公钥配置到目标服务,免密登录2…

Pycharm关于Interpreter问题:ModuleNotFoundError: No module named

PS:本来想写一个脚本,也好久没用python了,然后创建项目也不会了。 BG: 一直报错这个 ModuleNotFoundError: No module named 网上教程都试了,都不行,原因是在项目本身创建了一个环境,而不是,…

活动公司都是怎么去寻找客户的

活动公司都是怎么拓业务的?只有我靠缘分吗? 一直觉得这是一个很难的问题,毕竟活动都很低频,是不是都得先去交个朋。下面一些方法,说不定对你有用。 1、小红书推广、B站等自媒体平台; 2、抖音推广、百度推广等推广平台…

招联2025校招内推

【投递方式】 直接扫下方二维码,或点击内推官网https://wecruit.hotjob.cn/SU61025e262f9d247b98e0a2c2/mc/position/campus,使用内推码 igcefb 投递) 【招聘岗位】 后台开发 前端开发 数据开发 数据运营 算法开发 技术运维 软件测试 产品策…

68.【C语言】动态内存管理(重点)(上)

本文为数据结构打下基础 备注:数据结构需要掌握指针,结构体和动态内存管理 目录 1.内存开辟的方式 2.malloc函数 cplusplus网翻译 提炼要点 操作内存空间 01.开辟内存空间成功 02.开辟内存空间失败 如果是x64debug环境下,可能会成功 1.内存开辟的方式 01.创建变量 in…

LabVIEW混合控制器质量检测

随着工业自动化水平的提高,对控制器的精度、稳定性、可靠性要求也在不断上升。特别是在工程机械、自动化生产、风力发电等领域,传统的质量检测方法已无法满足现代工业的高要求。因此,开发一套自动化、精确、可扩展的混合控制器质量检测平台成…

Web安全 - 阶段性总结回顾_风险评估

文章目录 OWASP 2023 TOP 10用户数据的威胁评估密码盗窃XSS 漏洞SQL 注入CSRF 漏洞 资产数据的威胁评估SSRF 漏洞反序列化漏洞插件漏洞后门 认证和授权的安全防护检测与过滤加强认证补丁管理 进一步防护手段最小权限原则WAFIDS 小结 OWASP 2023 TOP 10 OWASP Top 10 概述 OWASP…

类似 o1 的推理-Llama3.1-70b 提供支持的 g1 创建推理链

g1简介: g1 是一个利用 Llama 3.1 70b 模型在 Groq 硬件上实现类似 OpenAI o1 推理链能力的开源项目。它通过精心设计的提示策略来引导语言模型进行逐步推理,从而解决了传统语言模型在逻辑推理方面的不足。g1 项目的目标是探索如何利用提示策略来提高语言模型的推理…

InfoGAN:通过信息最大化生成对抗网络进行可解释的表示学习

系列文章目录 一 Conditional Generative Adversarial Nets 二 cGANs with Projection Discriminator 三 Conditional Image Synthesis with Auxiliary Classifier GANs 四 InfoGAN: Interpretable Representation Learning by Information Maximizing Generative Adversarial…

python 棒棒糖图

结果: import matplotlib.pyplot as plt import matplotlib.ticker as ticker import numpy as npdef lolly_plot(x, y, color_lis, breaks, back_color,title, sub_title):# 获取每个点的颜色colors [assign_color(temperature, breaks, color_lis) for temperatu…

想学道家智慧,误打误撞被儒家引导读《道德经》?这是怎么回事?

想学道家智慧,却误打误撞被儒家引导读《道德经》?这是怎么回事? 原来,这其中的缘由可以追溯到汉代。董仲舒等人在整理文献时,对《老子》进行了修改和补充,形成了所谓的《道德经》。这一版本不仅颠覆了原本…

【玩转 JS 函数式编程_004】1.4 如何应对 JavaScript 的不同版本

本节目录 1.4 如何应对 JavaScript 的不同版本 How do we work with JavaScript?1.4.1. 使用转译工具 Using transpilers1.4.2. 应用在线环境 Working online1.4.3. 测试环境 Testing 1.4 如何应对 JavaScript 的不同版本 How do we work with JavaScript? 上面介绍的语言特…

netty之Netty传输文件、分片发送、断点续传

前言 1:在实际应用中我们经常使用到网盘服务,他们可以高效的上传下载较大文件。那么这些高性能文件传输服务,都需要实现的分片发送、断点续传功能。 2:在Java文件操作中有RandomAccessFile类,他可以支持文件的定位读取…

【递归】13. leetcode 1457. 二叉树中的伪回文路径

1 题目描述 题目链接:二叉树中的伪回文路径 2 解答思路 第一步:挖掘出相同的子问题 (关系到具体函数头的设计) 第二步:只关心具体子问题做了什么 (关系到具体函数体怎么写,是一个宏观的过…