基于MMDetection训练VOC格式数据集

news/2024/7/9 23:47:53 标签: MMDetection, Pytorch, 目标检测

一 环境说明

       基于前述安装MMDetection,数据集为VOC格式,主要版本如下:

Python:3.7.8
CUDA:11.3
cuDNN:8.4.0
torch:1.12.0
torchvision:0.13.0
mmcv-full:1.6.0
MMDetection:2.25.3

二 数据集准备

     使用VOC格式进行模型训练,利用labelimg对图像进行标注,生成xml文件,准备好图片和标注文件,并对数据集进行划分,文件目录如下图所示。

mmdetection
├── mmdet
├── tools
├── configs
├── dataset
│   ├── ACID  # 自己给数据集取名字
│   │   ├── VOC2007
│   │   │   ├── Annotations # xml文件
│   │   │   ├── JPEGImages # 图片文件
│   │   │   ├── ImageSets
│   │   │   │   ├── Main
│   │   │   │   │   ├── test.txt 
│   │   │   │   │   ├── trainval.txt

三 修改默认labels

        1、在 .\mmdetection-v2.25.3\mmdet\core\evaluation\class_names.py中,修改函数

voc_classes下面的默认类别,修改为自己标注的类别。
def voc_classes():
    # return [
    #     'aeroplane', 'bicycle', 'bird', 'boat', 'bottle', 'bus', 'car', 'cat',
    #     'chair', 'cow', 'diningtable', 'dog', 'horse', 'motorbike', 'person',
    #     'pottedplant', 'sheep', 'sofa', 'train', 'tvmonitor'
    # ]

    # SODA的数据标签,一共 15 个
    # 把配电箱 ebox,写成了 electric box,一直报错,所以要先检查labels
    # return [
    #     'person', 'vest', 'helmet', 'board', 'wood',
    #     'rebar', 'brick', 'scaffold', 'handcart', 'cutter',
    #     'ebox', 'hopper', 'hook', 'fence', 'slogan'
    # ]

    # ACID数据集标签,一共3个
    return [
            'excavator', 'dump_truck', 'concrete_mixer_truck'
        ]

    2、在  .\mmdetection-v2.25.3\mmdet\datasets\voc.py中,修改默认的VOC CLASSES为自己标注的类别,如下图所示。

class VOCDataset(XMLDataset):

    # CLASSES = ('aeroplane', 'bicycle', 'bird', 'boat', 'bottle', 'bus', 'car',
    #            'cat', 'chair', 'cow', 'diningtable', 'dog', 'horse',
    #            'motorbike', 'person', 'pottedplant', 'sheep', 'sofa', 'train',
    #            'tvmonitor')

    # 修改为 SODA的类别
    # CLASSES = ('person', 'vest', 'helmet', 'board', 'wood',
    #             'rebar', 'brick', 'scaffold', 'handcart', 'cutter',
    #             'ebox', 'hopper', 'hook', 'fence', 'slogan')

    # ACID的类别,3个 'excavator', 'dump_truck', 'concrete_mixer_truck'
    CLASSES = ('excavator', 'dump_truck', 'concrete_mixer_truck')

四 选择模型

      在 .\mmdetection-v2.25.3\configs文件夹下,有很多模型,到底选择哪一个,到底那个支持VOC格式进行直接训练呢?

      目前,支持VOC直接训练的模型在 .\mmdetection-v2.25.3\configs\pascal_voc文件夹下,模型的数量不多,主要模型如下图所示。

      默认都是COCO格式的,COCO格式的模型也是可以手动改为VOC格式的,那个后面再说。

      【 刚开始以为随便一个模型都可以用来训练数据,结果报莫名其妙的错误 】

 五 生成模型全部配置文件

        当选择好模型后,需要对进行模型的参数进行配置,一种比较好的方法是生成单独的全部的配置文件,具体操作方法如下:

python tools/train.py configs/pascal_voc/faster_rcnn_r50_fpn_1x_voc0712.py --work-dir VOC_SSD300

        生成的配置文件在定义的工作目录下,下一步对配置文件进行配置即可。

 六 配置文件修改

      重点修改标注的类别数,数据的路径,结果保存路径,大部分都不需要修改了。

num_classes=3  # 类别数

dataset_type = 'VOCDataset'
data_root = 'dataset/A/'

ann_file='dataset/A/VOC2007/ImageSets/Main/test.txt'
img_prefix='dataset/A/VOC2007/',


work_dir = 'VOC_SSD300'  # 工作目录

load_from = None  # 预训练模型

 七 预训练模型下载

       训练时通常加载预训练模型,一种方法是直接取model zoo下载,另一种是使用命令直接下载,指定配置文件名称和下载路径即可。

mim download mmdet --config yolov3_mobilenetv2_mstrain-416_300e_coco --dest checkpoints

八 训练模型

     模型训练的脚本就比较简单了,指定你配置文件的路径和结果保存路径即可,如下:

python tools/train.py my_config\ssd300_voc0712.py --work-dir VOC_SSD300

LAST 可能会遇到的问题

        1、class_names.py和voc.py中的类别都改了,但训练的时候还是报错:

AssertionError: The `num_classes` (15) in SSDHead of MMDataParallel does not matches the length of `CLASSES` 20) in RepeatDatasetn

你定义的类别数和默认的VOC的20个类别不一致,但是你已经改了文件,就是不起作业,解决方法见下图,将修改好的2个文件替换到安装包里的。

        2、待补充


http://www.niftyadmin.cn/n/9073.html

相关文章

BDD - SpecFlow Page Object Model POM

BDD - SpecFlow Page Object Model引言POM 优势POM 简单实现POM 缓存实现POM 层次实现Parent - Child 关系Component 关系引言 前面文章《 BDD - SpecFlow Web UI 测试实践 》就运用到 Page Object Model,简称 POM,POM 是一种模式,结合 Sele…

【附源码】Python计算机毕业设计网上宠物商店系统

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…

可观测性-可视化-Grafana热图Heatmap

文章目录可观测性-可视化-Grafana热图Heatmap前言选项可观测性-可视化-Grafana热图Heatmap 前言 Heatmap(热图)的用途,在Grafana官网是这样描述的:使用热图,将允许您查看随时间变化的直方图。 所以要使用热图的前提…

【Python开发】Flask开发实战:个人博客(四)

Flask开发实战:个人博客(四)本篇博客将是《Flask开发实战:个人博客》的最后一篇。本篇文章将会详细介绍博客后台的编写。 为了支持管理员管理文章、分类、评论和链接,我们需要提供后台管理功能。通常来说,…

labview 串口通信 modbusRtu

在自动化或测试项目中,上位机软件需要和PLC及仪表通信,本文简单描述这个问题。 1.在程序框图中放置4个图标 (1)创建modbus 主站实例(按如下图标识①,在框图中放Create Master Instance.vi) 图1 放置四个图标 &…

网络安全基础知识

web服务器产品 apache-httpd tomcat iis lighttp nginx 不是用来web服务器,而是用来做反向代理(tps10w,优化tqs2020w) 网络 IP地址和子网掩码 IPv4:32为长度的二进制数字表示,每段用8个字节表示&#x…

什么是CAPL编程语言

CAPL语言类似于C语言,C语言是过程语言,所以CAPL也是面向过程,而不是面向对象。CAPL内函数体的执行,由事件触发,比如按下按键’a’时触发on key a’的函数体的执行。CAPL程序在专用的编辑器"CAPL Browser"中开发和编译,所以可以直接访问各种类型的数据库里的对象…

面试灵活拷问:对于数据库的索引,你是怎么理解的?

文章目录一、索引的概念及作用概念作用二、索引的应用场景三、索引的相关语法1.查询索引2.创建索引3.删除索引注意四、索引背后的数据结构什么是B树B树有什么特点采用B树结构能为索引带来什么好处五、索引的分类1.唯一索引(unique键对应的字段)2.主键索引…