[mmdetection]fast-rcnn模型训练自己的数据集的详细教程

news2025/3/13 3:53:40

本篇博客是由本人亲自调试成功后的学习笔记。使用了mmdetection项目包进行fast-rcnn模型的训练,数据集是自制图像数据。废话不多说,下面进入训练步骤教程。

注:本人使用linux服务器进行展示,Windows环境大差不差。另外,每个人的训练环境不同,目前我只展示自己所使用的环境和配置,条件允许的情况下,请尽可能地根据我的版本进行安装和训练,以防出错。

一、conda环境及torch、mmcv等包的安装

1.1 linux服务器上的conda环境及torch包

linux服务器上的conda环境及torch包等可以根据下面这位博主发的教程进行安装:

Linux服务器安装anaconda并安装pytorch_如何利用pycharm在linux服务器上安装anaconda-CSDN博客

1.2 mmdetection中的必须包安装

在安装mmdetection之前,先进行下面三个包的安装:

pip install -U openmim
mim install mmengine
mim install "mmcv>=2.0.0"

在安装完上面三个包后,到github官网上把mmdetection的项目包拉下来,下载网址如下:

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

dowm下来后,使用xshell等软件打开该项目包,确保路径在该项目的主文件上。然后使用以下命令安装必备的包:

pip install -v -e .

经过上述步骤,mmdetection项目的运行环境就已经安装结束,下面进入mmdetection的配置和测试环节。

注意:请在该环节结束前检查自己安装torch版本是否是显卡(cuda)版本,不然无法使用显卡进行训练。可以在命令行中使用下面命令进行测试:

python    # 进入python
import torch    # 导入torch库
torch.cuda.is_available()    # 返回True则是cuda版本;返回False则是cpu版本
exit()    # 退出python

二、mmdetection配置及调试

2.1 mmdetection测试

根据官网给出的测试步骤进行测试,官网给出的是cpu的推理版本,这里给出的是cuda推理版本。调试命令如下:

mim download mmdet --config rtmdet_tiny_8xb32-300e_coco --dest .

进行以上步骤后,会在mmdetection主目录下下载一个权重文件(.pth)和模型配置文件(.py)。下载速度视自身网速而定,耐心等待~

在主目录中出现上述两个文件后,使用以下命令进行推理测试:

python demo/image_demo.py demo/demo.jpg rtmdet_tiny_8xb32-300e_coco.py --weights rtmdet_tiny_8xb32-300e_coco_20220902_112414-78e30dcc.pth --device cuda

运行结束后,mmdetection主目录中会自动生成一个新的文件夹output保存刚刚推理的结果。

注意:(1)推理的路径使用了相对路径,如果你在运行后提示文件路径的报错,可以使用绝对路径进行运行。如果还是报错的话请仔细检查是否是文件没有下载在正确的路径中。(2)运行后出现mmcv版本的报错,该报错的解决请看下面的步骤~

2.2 mmcv版本报错的解决方法

在运行推理测试后,弹出“AssertionError: MMCV==2.2.0 is used but incompatible. Please install mmcv>=2.0.0rc4, <2.2.0”的报错,可以找到并打开/mmdetection-main/mmdet文件夹下的init.py文件,然后注释掉下面的这四行代码:

# assert (mmcv_version >= digit_version(mmcv_minimum_version)
#         and mmcv_version < digit_version(mmcv_maximum_version)), \
#     f'MMCV=={mmcv.__version__} is used but incompatible. ' \
#     f'Please install mmcv>={mmcv_minimum_version}, <{mmcv_maximum_version}.'

在执行完上述操作后,基本可以解决mmcv版本的问题。重新运行推理测试命令即可生成output结果文件夹。

至此,mmdetection项目的调试到此就结束了,可以进入正题开始fast-rcnn的训练准备工作!

三、自制数据集的准备

3.1 数据集的标注工作

这部分我就不详细展开标准的教程了,csdn中有很多这方面的教程,自己去找一下。

步骤:首先,使用labelme工具进行数据标注,我使用voc格式进行标注(.xml)。然后,在获得图片和标签文件后,将之分别存放在images和labels文件夹中。在这两个文件夹中请自行划分好train、val和test数据集。最终的数据集文件夹如下所示。

dataset
-images
--train
--val
--test
-labels
--train
--val
--test

3.2 制作fast-rcnn能训练的标签格式

利用以下代码分别对train、val和test的标签进行xml到coco标签的转换:

(注意:为了后续训练的方便,输出的json文件命名方式请遵循:instances_train2017.json、instances_val2017.json、instances_test2017.json)

import xml.etree.ElementTree as ET
import json
import os

# 预定义类别
PRE_DEFINE_CATEGORIES = {"A1": 1, "B1": 2, "B2": 3, "A2": 4}

# 初始化 COCO 格式的字典
coco_dict = {
    "images": [],
    "annotations": [],
    "categories": []
}

# 处理类别信息
for category_name, category_id in PRE_DEFINE_CATEGORIES.items():
    category_info = {
        "id": category_id,
        "name": category_name,
        "supercategory": "object"
    }
    coco_dict["categories"].append(category_info)

# 指定 XML 文件所在的文件夹
xml_dir = r'E:\BaiduSyncdisk\WALNUT-DATESET\split_dataset\test\labels\voc_label'  # 请替换为实际的 XML 文件所在文件夹路径

annotation_id = 1
image_id = 1

# 遍历文件夹下的所有 XML 文件
for filename in os.listdir(xml_dir):
    if filename.endswith('.xml'):
        xml_file_path = os.path.join(xml_dir, filename)

        try:
            # 解析 XML 文件
            tree = ET.parse(xml_file_path)
            root = tree.getroot()

            # 处理图像信息
            image_info = {
                "id": image_id,
                "file_name": root.find('filename').text,
                "width": int(root.find('size/width').text),
                "height": int(root.find('size/height').text)
            }
            coco_dict["images"].append(image_info)

            # 处理标注信息
            for obj in root.findall('object'):
                category_name = obj.find('name').text
                category_id = PRE_DEFINE_CATEGORIES[category_name]
                bbox = obj.find('bndbox')
                xmin = int(bbox.find('xmin').text)
                ymin = int(bbox.find('ymin').text)
                xmax = int(bbox.find('xmax').text)
                ymax = int(bbox.find('ymax').text)
                width = xmax - xmin
                height = ymax - ymin

                annotation_info = {
                    "id": annotation_id,
                    "image_id": image_id,
                    "category_id": category_id,
                    "bbox": [xmin, ymin, width, height],
                    "area": width * height,
                    "iscrowd": 0
                }
                coco_dict["annotations"].append(annotation_info)
                annotation_id += 1

            image_id += 1
        except Exception as e:
            print(f"Error processing {xml_file_path}: {e}")

# 保存为 JSON 文件
output_json_file = r'E:\BaiduSyncdisk\WALNUT-DATESET\tools\1.数据集制作\annotations\instances_test2017.json'
with open(output_json_file, 'w') as f:
    json.dump(coco_dict, f, indent=4)

在对训练集、验证集和测试集都运行了以上代码后会生成三个josn文件,随后将这三个文件保存到一个annotation文件夹中。

3.3 fast-rcnn数据文件保存格式

在进行了上述操作后,现在可以在mmdetection主文件夹中按照以下格式新建文件夹:

mmdetection   # 主目录
-...   # 主目录的其他文件
-data
--coco
---annotations
---train2017
---val2017
---test2017
-...   # 主目录的其他文件

在新建完成后,将图片数据按照分类分别上传到train2017、val2017和test2017文件夹中,刚刚生成的json文件上传到annotations文件夹中。

3.4 数据集配置文件的准备

在执行完上述操作后,进入/mmdetection/mmdet/datasets文件夹中复制coco.py,粘贴新建一个自己数据集的配置文件,本教程用ABC.py做例子进行讲解。

(1)将复制的文件打开后,修改原来coco数据集的classes和palette信息,按照自己的来。

修改前:

修改后:(这是我的例子,请按照自己的情况设定)

class的名字也要改一下:ABCDataset

(2)然后打开/mmdet/datasets/init.py,导入自己的数据集

....

from .walnut import ABCDataset

....

__all__ = [
    'XMLDataset', 'CocoDataset', 'ABCDataset', 'DeepFashionDataset', 'VOCDataset',
    'CityscapesDataset', 'LVISDataset', 'LVISV05Dataset', 'LVISV1Dataset',
    'WIDERFaceDataset', 'get_loading_pipeline', 'CocoPanopticDataset',
    'MultiImageMixDataset', 'OpenImagesDataset', 'OpenImagesChallengeDataset',
    'AspectRatioBatchSampler', 'ClassAwareSampler', 'MultiSourceSampler',
    'GroupMultiSourceSampler', 'BaseDetDataset', 'CrowdHumanDataset',
    'Objects365V1Dataset', 'Objects365V2Dataset', 'DSDLDetDataset',
    'BaseVideoDataset', 'MOTChallengeDataset', 'TrackImgSampler',
    'ReIDDataset', 'YouTubeVISDataset', 'TrackAspectRatioBatchSampler',
    'ADE20KPanopticDataset', 'CocoCaptionDataset', 'RefCocoDataset',
    'BaseSegDataset', 'ADE20KSegDataset', 'CocoSegDataset',
    'ADE20KInstanceDataset', 'iSAIDDataset', 'V3DetDataset', 'ConcatDataset',
    'ODVGDataset', 'MDETRStyleRefCocoDataset', 'DODDataset',
    'CustomSampleSizeSampler', 'Flickr30kDataset'
]

至此,fast-rcnn模型能接受的数据集格式已经已经布置完成。接下来进入fast-rcnn模型训练的配置环节。

四、模型配置文件的准备

在训练fast-rcnn模型前,需要先进行rpn的训练,因为rpn有fast-rcnn模型训练所需要的前置文件(.pkl)。

4.1 rpn模型的训练

(1)选择模型

进入到/mmdetection/configs文件夹中找到rpn文件夹,进入后找到rpn_r50_fpn_1x_coco.py,本博客将使用这个例子进行教学。

(2)rpn模型训练

在命令行中使用以下模型进行训练:

python tools/train.py /root/autodl-tmp/model/mmdetection-main/configs/rpn/rpn_r50_fpn_1x_coco.py

修改rpn_r50_fpn_1x_coco.py文件中的相应代码获得train和val的.pkl文件,这两个文件会自动生成在数据集/mmdetection/data/coco/路径下的proposals文件夹中。

注:本例子只做训练集和验证集的pkl,没有test。各位根据自身的需要进行生成。

在获得这两个文件后,就可以进行fast-rcnn模型的训练啦~

4.2 fast-rcnn模型的训练

(1)类别设置

打开mmdetection-main/configs/_base_/models,找到并打开fast-rcnn_r50_fpn.py,搜索num_classes,把coco的80个类别修改成自己的类别,本博客例子有4个类别,所以我将num_classes设置成4。

(2)配置dataset、batch、workers

打开mmdetection-main/configs/_base_/datasets,找到并打开coco_detection.py。

修改一下部位,请Ctrl+F进行分别搜索关键字

dataset_type
train_dataloader
val_dataloader
test_dataloader

将dataset_type设置成ABCDataset;train_dataloader、val_dataloader、test_dataloader中的    batch_size=16,
num_workers=16,

根据自己的设备配置来设置,这里我将batch和worker都设置成了16。

以上就完成了fast-rcnn的环境、数据集和训练文件的全部配置。接下来开始进行fast-rcnn模型的训练步骤。

五、开始训练

在命令行中cd进到mmdetection的项目主目录中,使用以下命令进行fast-rcnn模型的训练:(文件路径请根据自己的来改)

python tools/train.py /root/autodl-tmp/model/mmdetection-main/configs/fast_rcnn/fast-rcnn_r50_fpn_2x_coco.py

训练过程截图如下:

如果不报错并且出现和截图相似的界面就说明训练开始了!!


——————————  今天不学习,明天变垃圾  ——————————

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

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

相关文章

RFID涉密载体管控系统|支持国产化、自主研发

涉密载体管理系统DW-S402是一套成熟系统&#xff0c;是用于对各种涉密载体进行有效管理&#xff0c;实现对载体的智能化、规范化、标准化管理&#xff0c;广泛应用于保密、机要单位以及企事业单位等有载体保管需求的行业。 用户为对文件资料、存储介质等管理严格的单位&#x…

BUU14 [极客大挑战 2019]PHP1

用dirsearch扫描文件&#xff0c;扫了一万年什么也没扫出来 从网上看的wp&#xff0c;他们扫出来www.zip 这里直接用上了&#xff0c;以后有空再扫一遍 下载www.zip 在index.php中 说明要输入select 打开class.php <?php include flag.php;error_reporting(0);class…

数据分析师使用Kutools for Excel 插件

数据分析师使用Kutools for Excel 插件 Kutools for Excel 是一款功能强大的 Excel 插件&#xff0c;旨在提高 Excel 用户的工作效率&#xff0c;简化复杂的操作。它提供了超过 300 个增强功能&#xff0c;帮助用户快速完成数据管理、格式化、排序、分析等任务&#xff0c;特别…

【高级篇 / IPv6】(7.2) ❀ 04. 在60E上配置ADSL拨号宽带上网(IPv4) ❀ FortiGate 防火墙

【简介】除了单位用户以外&#xff0c;大部分个人用户目前使用的仍然是30E、50E、60E系列防火墙&#xff0c;固件无法达到目前最高版本7.6&#xff0c;这里以最常用的60E为例&#xff0c;演示固件版本7.2下实现ADSL拨号宽带的IPv6上网。由于内容比较多&#xff0c;文章分上、下…

基于LMS算法的自适应滤波器设计与MATLAB实现

1. 引言 自适应滤波器是信号处理领域的重要工具&#xff0c;能够根据输入信号的统计特性自动调整滤波器参数。其中&#xff0c;最小均方&#xff08;LMS&#xff09;算法因其计算简单、易于实现的特点&#xff0c;成为最常用的自适应滤波算法之一&#xff0c;广泛应用于噪声消…

【现代深度学习技术】深度学习计算 | 延后初始化自定义层

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈PyTorch深度学习 ⌋ ⌋ ⌋ 深度学习 (DL, Deep Learning) 特指基于深层神经网络模型和方法的机器学习。它是在统计机器学习、人工神经网络等算法模型基础上&#xff0c;结合当代大数据和大算力的发展而发展出来的。深度学习最重…

Java导出Excel简单工具类

一、maven配置 <!--jxl--><dependency><groupId>net.sourceforge.jexcelapi</groupId><artifactId>jxl</artifactId><version>2.6.12</version></dependency>二、工具类方法 package util2;import jxl.Workbook; impor…

蓝桥与力扣刷题(141 环形链表)

题目&#xff1a;给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内部使用整数 pos 来表示链表尾连接到链表中的…

【小鱼闪闪】做一个物联网控制小灯的制作流程简要介绍(图文)

1、注册物联网云平台&#xff0c;这里选用巴法云 2.、新建主题 “ledtest” 3、 使用Arduino或Mixly软件编写单片机程序&#xff08;需要引用巴法云库文件&#xff09;&#xff0c;程序中订阅“ledtest”主题&#xff0c;用于接收单片机发送来的数据。此处会将连接的温度传感器…

图论常见算法

图论常见算法 算法prim算法Dijkstra算法 用途最小生成树&#xff08;MST&#xff09;&#xff1a;最短路径&#xff1a;拓扑排序&#xff1a;关键路径&#xff1a; 算法用途适用条件时间复杂度Kruskal最小生成树无向图&#xff08;稀疏图&#xff09;O(E log E)Prim最小生成树无…

BUU16 [ACTF2020 新生赛]BackupFile1

扫到index.php.bak 实在扫不出来可以试试一些常有的文件&#xff0c;比如flag.php&#xff08;flag.php.bak&#xff09;&#xff0c;index.php&#xff08;index.php.bak&#xff09; <?php include_once "flag.php";if(isset($_GET[key])) {$key $_GET[key…

运维之MySQL锁机制(MySQL Lock Mechanism for Operation and Maintenance)

运维之MySQL锁机制 锁是一种常见的并发事务的控制方式。MySQL数据库中的锁机制主要用于控制对数据的并发访问&#xff0c;防止多个用户或进程同时对同一数据进行读写操作&#xff0c;从而避免数据不一致和丢失更新等问题。锁机制确保数据的一致性&#xff0c;保证在多个事务操作…

一文速览DeepSeek-R1的本地部署——可联网、可实现本地知识库问答:包括671B满血版和各个蒸馏版的部署

前言 自从deepseek R1发布之后「详见《一文速览DeepSeek R1&#xff1a;如何通过纯RL训练大模型的推理能力以比肩甚至超越OpenAI o1(含Kimi K1.5的解读)》」&#xff0c;deepseek便爆火 爆火以后便应了“人红是非多”那句话&#xff0c;不但遭受各种大规模攻击&#xff0c;即便…

Kubernetes学习之包管理工具(Helm)

一、基础知识 1.如果我们需要开发微服务架构的应用&#xff0c;组成应用的服务可能很多&#xff0c;使用原始的组织和管理方式就会非常臃肿和繁琐以及较难管理&#xff0c;此时我们需要一个更高层次的工具将这些配置组织起来。 2.helm架构&#xff1a; chart:一个应用的信息集合…

MyBatis-Plus速成指南:通用枚举 多数据源

通用枚举&#xff1a; 概述&#xff1a; 表中有些字段值是固定的&#xff0c;例如性别(男或女)&#xff0c;此时我们可以使用 MyBatis-Plus 的通用枚举来实现 数据库表添加字段&#xff1a; 创建通用枚举类型&#xff1a; Getter public enum SexEnum {MALE(1, "男"…

Android项目中使用Eclipse导出jar文件

2014年3月24日 天气晴朗 关于打包Android组件肯定是有用到的&#xff0c;比如开发了一个模块&#xff0c;为了更好的复用&#xff0c;我们可能会将它打包成jar文件方便其他项目引用。这个很好理解&#xff0c;也很简单。网上有一堆关于用Eclipse将Android项目打包成jar文件的&…

网络安全学习 day4

防火墙的安全策略 规则--策略 条件 --- 检查报文的依据&#xff0c;防火墙将报文中携带的信息与条件逐一进行对比&#xff0c; 以此来判断报文是否是 匹配的 。不同的匹配条件之间属于 “ 与 ” 关系&#xff1b;相同的匹配条件中不同的参数信息之间的关系为 “ 或 ” 关系。…

智慧园区综合管理系统如何实现多个维度的高效管理与安全风险控制

内容概要 在当前快速发展的城市环境中&#xff0c;智慧园区综合管理系统正在成为各类园区管理的重要工具&#xff0c;无论是工业园、产业园、物流园&#xff0c;还是写字楼与公寓&#xff0c;都在积极寻求如何提升管理效率和保障安全。通过快鲸智慧园区管理系统&#xff0c;用…

【协议详解】卫星通信5G IoT NTN SIB33-NB 信令详解

一、SIB33信令概述 在5G非地面网络&#xff08;NTN&#xff09;中&#xff0c;卫星的高速移动性和广域覆盖特性使得地面设备&#xff08;UE&#xff09;需要频繁切换卫星以维持连接。SIB32提供了UE预测当前服务的卫星覆盖信息&#xff0c;SystemInformationBlockType33&#x…

《LLM大语言模型深度探索与实践:构建智能应用的新范式,融合代理与数据库的高级整合》

文章目录 Langchain的定义Langchain的组成三个核心组件实现整个核心组成部分 为什么要使用LangchainLangchain的底层原理Langchain实战操作LangSmithLangChain调用LLM安装openAI库-国内镜像源代码运行结果小结 使用Langchain的提示模板部署Langchain程序安装langserve代码请求格…