MMclassfication 自定义数据集训练及可视化

2023-11-07

mmclassification基本介绍这里就不过多阐述了,前期因为工作需要需要实现图片的功能,加上因为一直在使用mmlab相关库,所以就选了mmcls。具体其实和其他的mmlab的使用过程类似,基本上可能数据集结构搞定了就能够运行了。

一、自定义数据集

我采用的是ImageNet的数据格式,一方面是省去了注册机制的那些,直接在原有代码基础之上修改,比较方便,另一方面是因为后续的config我用的也是image1k的,可能要面临的问题少一点。

1.mmcls中imagenet的数据格式

总体树状结构如下:
—data
|----meta
|——|—train.txt
|——|—val.txt
|——|—test.txt
|----train
|——|—class1
|————|—01.jpg
|————|—02.jpg
|————|—…
|——|—class2
|————|—01.jpg
|————|—02.jpg
|————|—…
|----test
|——|—class1
|————|—01.jpg
|————|—02.jpg
|————|—…
|——|—class2
|————|—01.jpg
|————|—02.jpg
|————|—…
|----val
|——|—class1
|————|—01.jpg
|————|—02.jpg
|————|—…
|——|—class2
|————|—01.jpg
|————|—02.jpg
|————|—…
如图所示:
在这里插入图片描述

其中,meta里存放的3个是包含图片标签的地址目录:
在这里插入图片描述
在这里插入图片描述
即:path + 空格 + 标签索引
train、val、test三个文件夹存放的都是图片格式文件,如果本身你已经有对应的train.txt等文件,即已经有标签地址之后,你可以把所有图像混着放,如果没有的话,就每个类别建一个文件夹,再生成对应标签。由于我用的是自定义的数据集,所以我采用第二种方法,具体如下:
在这里插入图片描述
在这里插入图片描述

我总共是两个标签,分别是can和cant
train、val、和test三个文件夹我数据是按照7:2:1划分的。
具体先设定一个总的文件夹,该文件夹下面按照标签类别建立文件夹,存放对应的图片
划分的代码我也附上吧。

import os, random, shutil

##############################################################
## 分割数据集,首先将所有数据放在同一个文件夹下###################
def moveFile(fileDir, val_ratio, test_ration2):
    pathDir1 = os.listdir(fileDir)  # 取图片的原始路径
    filenumber = len(pathDir1)
    val_number = int(filenumber * val_ratio)  # 抽取验证集的数量
    test_number = int(filenumber * test_ratio)  # 抽取测试集的数量
    val_sample = random.sample(pathDir1, val_number)  # 随机选取val图片

    # 先抽取验证集图片
    for name1 in val_sample:
        shutil.move(os.path.join(fileDir, name1), os.path.join(valDir, name1))

    # 从剩余的图片中抽取测试集
    pathDir2 = os.listdir(fileDir)  # 取图片的原始路径
    test_sample = random.sample(pathDir2, test_number)  # 随机选取val图片
    for name2 in test_sample:
        shutil.move(os.path.join(fileDir, name2), os.path.join(testDir, name2))

    return


if __name__ == '__main__':
    ori_path = './data/space_all/train'  # 最开始train的文件夹路径
    test_Dir = './data/space_all/test'  # 移动到新的文件夹路径
    val_Dir = './data/space_all/val'  # 移动到新的文件夹路径
    val_ratio, test_ratio = 0.1, 0.2  # 抽取比例  ******自己改*******
    for firstPath in os.listdir(ori_path):
        fileDir = os.path.join(ori_path, firstPath)  # 原图片文件夹路径
        valDir = os.path.join(val_Dir, firstPath)  # val下子文件夹名字
        testDir = os.path.join(test_Dir, firstPath)  # test下子文件夹名字
        if not os.path.exists(valDir):  # 如果val下没有子文件夹,就创建
            os.makedirs(valDir)
        if not os.path.exists(testDir):  # 如果test下没有子文件夹,就创建
            os.makedirs(testDir)
        moveFile(fileDir, val_ratio, test_ratio)  # 从每个子类别开始逐个划分
    print("Successfully splited!")

接下来就是生成对应的txt文件:

## 制作标签,在此之前需要用上半部分代码划分好数据集

path='./data/space_all/train'


data_path = pathlib.Path(path)
all_images_path = list(data_path.glob('*/*'))
all_images_path = [str(path) for path in all_images_path]  # 所有图片路径名存入列表
random.shuffle(all_images_path)  # 打散

print(len(all_images_path))
# print(all_images_path)  # 打印前五个

# 开始制作标签
label_names = sorted(item.name for item in data_path.glob('*/') if item.is_dir())
print(label_names)  # 打印类别名  注:下一步是制作与类别名对应的标签
label_to_index = dict((name, index) for index, name in enumerate(label_names))

all_image_labels = [label_to_index[pathlib.Path(path).parent.name] for path in all_images_path]


for image, label in zip(all_images_path[:5], all_image_labels[:5]):
   print(image, '-----', label)

filename='./data/space_all/train.txt'     # ***这里也要记得改***

print(image + " " + str(label) + "\n")
with open(filename,'w') as f:
   for image,label in zip(all_images_path,all_image_labels):
       f.write(image+" "+str(label)+"\n")
print("\nAll images and labels have been written in  .txt!\n")

完成以后,数据这方面就算准备完毕了。

二、训练

mmcls使用过程也比较简单,和其他mmlab的代码库使用过程相同,就是修改config下面对应的文件。这里我使用的是resnet18_8xb32_in1k.py,这个命名的含义是使用的是resnet18,8卡,batchsize32,数据集是imagenet1k的。可以先打开看一下这个文件。在configs/resnet/resnet18_8xb32_in1k.py
在这里插入图片描述
看着挺多的,实际上只要修改/base/datasets/imagenet_bs32.py那部分,查看该部分文件。在这里插入图片描述
如果你不做其它微调的话,除了数据对应的路径要改以外,其它可以先不用改。
然后就是需要将自己的数据标签添加到ImageNet数据集标签中,当然这边也可以自己新建,我懒,没做。
具体操作如下:
在mmcls/imagenet.py中,把自己的标签加到CLASS中:在这里插入图片描述
其他不做修改。
接下来就可以训练啦。两个方法,一个是直接运行,但是要记得修改运行配置,另外一个就是在terminal里面输指令了。我比较懒,是选第一种,这样不用每次输那么多指令。
在这里插入图片描述
在这里插入图片描述
第一部分是指定config文件,第二个是指定工作存档文件夹。然后就可以run啦。会在指定的文件夹下产生log文件、checkpoints文件,以及config文件,可以在这个config文件里对你的模型训练过程进行微调。
具体参数介绍我其他文章也讲过了,这里不细讲了:在这里插入图片描述
其实这个文件就是系统自动把之前的那个config下的四个文件整合到一起了,下一次运行的时候,可以直接在这里修改,不会影响到其他训练的配置,会比较合理一些。包括路径以及其他基本设置。而后在设置运行配置的时候把这个作为你的config来就好了。

三、验证

训练指标主要是acc-top1和acc-top5,top-1就是分类最好的那一个,top-5分类最好的前五个平局(因该是的吧)。训练结果会存储在log.json文件里。我们可以用最后一次产生的checkpoints文件,即latest.pth来对测试集进行验证。主要使用的是tools/test.py,和train一样,两种运行方式,这边我直接用指令了。

python tools/test.py work_dir/resnet18_8xb32_in1k.py work_dir/latest.pth --metrics accuracy --metric-option topk=1

这里第一部分是config文件地址,第二部分是采用的checkpoint地址,metrics是设定评价标准,选了accuracy,topk=1是采用acc-top1的值。

在这里插入图片描述
也可以把结果输出到json文件的,代码如下:

python tools/test.py work_dir/resnet18_8xb32_in1k.py work_dir/latest.pth --out result.json --out-items all

同样是可以选定输出的关键字,我把所有的都输出了

四、可视化

可以对训练日志进行可视化,直接使用自带的分析工具就好。例如将日志中的top1变化情况可视化出来,代码为:

python tools/analysis_tools/analyze_logs.py plot_curve work_dir/20230214_153510.log.json --keys accuracy_top-1 --legend accuracy --out result.jpg

其中plot_curve是绘制曲线,keys是绘制曲线选取的关键字,可以是多个,legend 是图例, out是保存的文件名。
在这里插入图片描述

五、预测

想要使用训练出来的模型对新的图片进行预测,可以直接调用api,代码比较简单,我是用jupyter lab直接写的。源码大家自己敲吧,我放个照片
在这里插入图片描述

总结

其实这些在docs文档里都写了很清楚了,但是很多人可能懒得去看吧,我也一样,只不过之前发现很多网上找的教程不全,只能自己慢慢看,也许有不全面的地方,可以告诉我,大家一起交流学习。mmlab总体给我感觉就是如果上手了,真的很方便很好用,推荐大家可以用一下试试。

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

MMclassfication 自定义数据集训练及可视化 的相关文章

随机推荐

  • 数据分析学习总结笔记07:方差分析

    数据分析学习总结笔记07 方差分析 1 方差分析概述 1 1 方差分析简介 1 2 方差分析基本思想和原理 1 3 方差分析的基本假设 2 单因素方差分析 One way ANOVA 2 1 单因素方差分析概念 2 2 单因素方差分析的原理
  • 西门子PLC的S7协议报文解析说明

    我们以S7的1500系列来查看握手和读取 写入 字Word或者位Bit 命令报文 以下报文不做说明时都是十六进制字节 西门子PLC需要连接成功后发送两次握手命令方可进行读写通信 西门子PLC的S7协议的头由四个字节组成 第一个字节数固定为0
  • C#实现全盘扫描,找到符合要求的文件,并把路径写入到TXT中

    好久没更新文章了 来水一篇 最近领导安排了个任务 让把服务器上符合要求的文件的路径找出来 windos自带的搜索功能太慢了 everything不想下载 想着自己实现一个 实现完成发现速度也不是很慢 实现思路 1 先把电脑中的所有驱动器名称
  • 【Linux】socket 编程基础

    文章目录 网络间的通信 socket 是什么 1 socket 套接字 2 套接字描述符 3 基本的 socket 接口函数 3 1 头文件 3 2 socket 函数 3 3 bind 函数 struct sockaddr 主机序列与网络
  • [亲测可用]springBoot调用对方webService接口的几种方法示例

    目录 前言 一 需要用到的maven 二 如何调用webservice接口 调用方法一 调用方法二 myEclipse生成的例子 idea生成的例子 前言 平常我们开发调用接口一般会用到几种数据格式 比如有restful的 这个是目前最流行
  • QT5在首次连接MYSQL时候找不到头文件问题

    我碰到的问题是这样的 在我之前写好 没有报错 的QT程序内添加MYSQL 但是报错 error C1083 无法打开包括文件 QSqlDatabase No such file or directory 在网上查找后发现没有添加对应的模块
  • pandas行列转换的4大技巧

    公众号 尤而小屋作者 Peter编辑 Peter 大家好 我是Peter 本文介绍的是Pandas中4个行列转换的方法 包含 melt 转置T或者transpose wide to long explode 爆炸函数 最后回答一个读者朋友问
  • C-switch case之如何巧妙判断范围区域

    当判断整数时 示例 判断整数范围 include
  • WebGL笔记 (侧重理论基础向)

    要把Cesium three js 这些玩明白还是要有WebGL的知识的 不然只是官方demo的ctrl cv侠 本笔记参考的教程 2022年WebGL入门教程 完结 哔哩哔哩 bilibili 一 初级 二维 1 1 坐标系 WebGL的
  • 操作臂的运动学

    操作臂的运动学 文章目录 操作臂的运动学 2 1 连杆的描述 2 2 操作臂的运动学 2 2 1 连杆变换 2 2 2例子 PUMA560连杆参数 参考文献 2 1 连杆的描述 机器人中每个连杆都可以用四个运行学参数来描述 其中两个描述连杆
  • c++指针

    C 指针部分 1 引用 reference 指针部分 1 引用 reference 为对象起另外一个名字 引用即别名 定义 int value 100 refValue 指向value 是value的另一个名字 int refValue v
  • synchronized 和 lock 有什么区别?

    synchronized 和 lock 有什么区别 Lock能够完成synchronized的所有功能并且Lock提供了比synchronized更多的功能 Lock和synchronized的选择 总结来说 Lock和synchroniz
  • 安全岗春招面经总结

    五一过后 春招就差不多结束了 今年的春招面过的小伙伴懂的都懂 铜三铁四orz 在没有大的技术突破之前互联网就业环境只会一年不如一年 然后因为我自己更想要留在川渝这边工作 觉得北上广深的生活节奏太快不适合自己这种慢性子的人 所以大部分也都面的
  • 【第十一篇】- Maven 项目模板

    Maven 项目模板 Maven 使用 archetype 原型 来创建自定义的项目结构 形成 Maven 项目模板 在前面章节我们学到 Maven 使用下面的命令来快速创建 java 项目 mvn archetype generate 什
  • QT从入门到实战x篇_17_QListWidget控件(List Widget列表是基于item的输出显示;可以实现单行或者多行内容的输出显示)

    上篇 QT从入门到实战x篇 16 控件 按钮组 PushButton ToolButton RadioButton CheckBox等按钮组控件的基础使用方法 介绍了按钮组的使用方法 接下来将会介绍几个比较重要的控件 本篇主要介绍List
  • Android最佳实践——深入浅出WebSocket协议

    首先明确一下概念 WebSocket协议是一种建立在TCP连接基础上的全双工通信的协议 概念强调了两点内容 TCP基础上 全双工通信 那么什么是全双工通信呢 全双工就是指客户端和服务端可以同时进行双向通信 强调同时 双向通信 WebSock
  • 11_虚拟机最小化安装centos7 后无法查看ip,ifconfig command not found

    虚拟机最小化安装centos7 后无法查看ip ifconfig command not found VMware里安装CentOS 7 x86 64 Minimal 1708 iso之后 登陆进去想通过 ipconfig 命令查看ip 但
  • VS中C1803无法打开包括文件: “QtWidgets/QApplication”: No such file or directory

    问题原因 在VS中使用Qt出现错误提示 C1803无法打开包括文件 QtWidgets QApplication No such file or directory 是因为没有添加相关头文件导致的 解决方法 对项目右键 在菜单中选择属性 如
  • 立林门禁读卡器接线图_图解弱电工程门禁系统安装与接线,三分钟学会

    前言 门禁系统有各种各样的品牌 原理都是一样 下面详细教大家接线 正文 门禁系统的组成就不用说了吧 开门按钮 门禁电源 电锁 门禁一体机或者门禁控制器 读卡器 门禁套装 从左到右分别是门禁一体机 门禁电源 门禁控制器 磁力锁 开门按钮 最后
  • MMclassfication 自定义数据集训练及可视化

    mmclassification基本介绍这里就不过多阐述了 前期因为工作需要需要实现图片的功能 加上因为一直在使用mmlab相关库 所以就选了mmcls 具体其实和其他的mmlab的使用过程类似 基本上可能数据集结构搞定了就能够运行了 一