(三)mmclassification图像分类——模型训练

article/2025/10/29 18:20:42

(三)mmclassification图像分类——模型训练和测试

  • 1.模型训练
    • 1.1使用预训练模型
    • 1.2使用自己的数据训练
      • 1.2.1制作数据集
      • 1.2.2修改模型参数(configs文件)
        • (1)models
        • (2)datasets
        • (3)schedules
        • (4)新建mobilenet_v2_b32x8_car.py
    • 1.3训练模型
      • 单卡模型训练
      • 多卡模型训练
  • 2.模型测试
  • 3.pth模型转化为onnx模型

先放一个官网文档: https://mmclassification.readthedocs.io/en/latest/k

1.模型训练

1.1使用预训练模型

从mmclassification官网教程可以看出,imagenet非常大(138GB、6.3GB),所以我选择先用cifar进行模型训练。
在这里插入图片描述

cifar模型:
model_zoo链接:链接: https://github.com/open-mmlab/mmclassification/blob/master/docs/model_zoo.md
resnet18模型下载链接:链接: https://download.openmmlab.com/mmclassification/v0/resnet/resnet18_b16x8_cifar10_20200823-f906fa4e.pth
在这里插入图片描述

  • 网络:configs/resnet/resnet18_b16x8_cifar10.py
  • 模型:checkpoints/resnet18_b16x8_cifar10_20200823-f906fa4e.pth
    运行代码:
mkdir checkpoints
cd checkpoints
wget https://download.openmmlab.com/mmclassification/v0/resnet/resnet18_b16x8_cifar10_20200823-f906fa4e.pth
cd ../
python tools/test.py configs/resnet/resnet18_b16x8_cifar10.py checkpoints/resnet18_b16x8_cifar10_20200823-f906fa4e.pth

训练结果:
在这里插入图片描述

1.2使用自己的数据训练

1.2.1制作数据集

mmclassification的数据集除了cifar10等这种封装好的,就是ImageNet格式的。它的文件夹格式是这样的:
在这里插入图片描述
所以首先需要把数据集先按照类别分别存放于一个子文件夹,所有子文件夹放在同一个大文件夹下。接着,通过随机划分训练集、验证集和测试集的代码,将三者划分成为7:2:1。划分的代码如下:

  • moveFile.py
# coding=utf-8
import os, random, shutildef moveFile(fileDir):pathDir = os.listdir(fileDir)  # 取图片的原始路径filenumber = len(pathDir)picknumber = int(filenumber * ratio)  # 按照rate比例从文件夹中取一定数量图片sample = random.sample(pathDir, picknumber)  # 随机选取picknumber数量的样本图片for name in sample:shutil.move(os.path.join(fileDir, name), os.path.join(tarDir, name))returnif __name__ == '__main__':ori_path = '/home/py005/syy/mycode/ImageClassification/LoadData/CarColor/train'  # 最开始train的文件夹路径split_Dir = '/home/py005/syy/mycode/ImageClassification/LoadData/CarColor/val'  # 移动到新的文件夹路径ratio=0.70  # 抽取比例  ******自己改*******for firstPath in os.listdir(ori_path):fileDir = os.path.join(ori_path, firstPath)  # 原图片文件夹路径tarDir = os.path.join(split_Dir, firstPath)  # val下子文件夹名字if not os.path.exists(tarDir): #如果val下没有子文件夹,就创建os.makedirs(tarDir)moveFile(fileDir)  # 从每个子类别开始逐个划分print("Successfully split the train and val!")

划分好后,得到如下所示的文件树结构:
在这里插入图片描述
接下来就是要制作标签
制作标签的代码:

# -*- coding: utf-8 -*-
"""
Created on Wed May  5 15:10:59 2021
---------把数据集分类放在对应的文件夹中即可,所有类别文件夹在一个大文件夹下-----------
@author: shi'ying
"""
import tensorflow as tf
import pathlib
import random
import os# path = './images/training/training'
# path = '/home/py005/syy/mycode/ImageClassification/LeNet5/images/training/training'
# 首先制作验证集的标签  ***注意做val和test的时候要不同的注释一下
# path='./CarColor/val'
# 然后制作测试集的标签
path='./CarColor/test'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[:5])  # 打印前五个# 开始制作标签
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='./CarColor/test.txt'     # ***这里也要记得改***
with open(filename,'w') as f:for image,label in zip(all_images_path,all_image_labels):image=image.split("/")[-2]+"/"+image.split("/")[-1]f.write(image+" "+str(label)+"\n")
print("\nAll images and labels have been written in the car.txt!\n")

得到以下文件:

  • classes.txt(这个视情况可以自己手写,多的话就os.listdir)
black
blue
cyan
gray
green
red
white
yellow
  • val.txt
red/snap_201202221206124220_蒙K6A231_蓝_20120222120627_2.jpg 5
black/snap_201202241037024510_蒙BMM981_蓝_20120224103714_2.jpg 0
white/snap_201202221126059590_蒙KKC178_蓝_20120222112624_2.jpg 6
gray/snap_201202250950560670_蒙K46664_黄_20120225095105_2.jpg 3
......
  • test.txt
black/snap_201202221608536060_蒙K2N360_蓝_20120222160905_1.jpg 0
red/snap_201202221210097700_蒙K69193_黄_20120222121017_2.jpg 5
blue/snap_201203021419261610_蒙KET456_蓝_20120302141937_1.jpg 1
......

至此,图片训练集、验证集、测试集就都准备好啦!

1.2.2修改模型参数(configs文件)

这是mobilenet_v2的配置文件代码,主要涉及了4个文件,分别进去看看是什么。

_base_ = ['../_base_/models/mobilenet_v2_1x.py','../_base_/datasets/imagenet_bs32_pil_resize.py','../_base_/schedules/imagenet_bs256.py','../_base_/default_runtime.py'
]

(1)models

…/base/models/mobilenet_v2_1x.py写的是模型配置

# model settings
model = dict(type='ImageClassifier',backbone=dict(type='MobileNetV2', widen_factor=1.0),neck=dict(type='GlobalAveragePooling'),head=dict(type='LinearClsHead',num_classes=1000,in_channels=1280,loss=dict(type='CrossEntropyLoss', loss_weight=1.0),topk=(1, 5),))

(2)datasets

…/base/datasets/imagenet_bs32_pil_resize.py写的是数据集配置

# dataset settings
dataset_type = 'ImageNet'
img_norm_cfg = dict(mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True)    # 像素值归一化的均值和标准差
train_pipeline = [                                                               # 定义数据加载流水线dict(type='LoadImageFromFile'),                                              # 从文件中读取图像dict(type='RandomResizedCrop', size=224, backend='pillow'),                  # 随即裁剪与缩放dict(type='RandomFlip', flip_prob=0.5, direction='horizontal'),              # 随机水平翻转dict(type='Normalize', **img_norm_cfg),                                      # 像素值归一化dict(type='ImageToTensor', keys=['img']),                                    # 将数据转换为PyTorch Tensordict(type='ToTensor', keys=['gt_label']),dict(type='Collect', keys=['img', 'gt_label'])
]
test_pipeline = [dict(type='LoadImageFromFile'),dict(type='Resize', size=(256, -1), backend='pillow'),dict(type='CenterCrop', crop_size=224),dict(type='Normalize', **img_norm_cfg),dict(type='ImageToTensor', keys=['img']),dict(type='Collect', keys=['img'])
]
data = dict(samples_per_gpu=32,workers_per_gpu=2,train=dict(type=dataset_type,data_prefix='data/imagenet/train',pipeline=train_pipeline),val=dict(type=dataset_type,data_prefix='data/imagenet/val',ann_file='data/imagenet/meta/val.txt',pipeline=test_pipeline),test=dict(# replace `data/val` with `data/test` for standard testtype=dataset_type,data_prefix='data/imagenet/val',ann_file='data/imagenet/meta/val.txt',pipeline=test_pipeline))
evaluation = dict(interval=1, metric='accuracy')

(3)schedules

…/base/schedules/imagenet_bs256.py写的是训练配置

# optimizer
optimizer = dict(type='SGD', lr=0.1, momentum=0.9, weight_decay=0.0001)
optimizer_config = dict(grad_clip=None)
# learning policy
lr_config = dict(policy='step', step=[30, 60, 90])
runner = dict(type='EpochBasedRunner', max_epochs=100)

(4)新建mobilenet_v2_b32x8_car.py

原本的文件不动,直接在这个新建的文件里把要修改的配置一一添加。
主要改了:

  • num_classes=8
  • topk=(1, 3)
  • workers_per_gpu=0
  • data_prefix=‘data/CarColor/train’ (训练集、验证集、测试集,都要改)
  • classes=‘data/CarColor/classes.txt’(训练集、验证集、测试集,都要改)
  • ann_file=‘data/CarColor/val.txt’(训练集、验证集、测试集,都要改)
  • evaluation
  • max_epochs
  • step=[1]
  • load_from 模型路径

改完后得到mobilenet_v2_b32x8_car.py:

_base_ = ['../_base_/models/mobilenet_v2_1x.py','../_base_/datasets/imagenet_bs32_pil_resize.py','../_base_/schedules/imagenet_bs256.py','../_base_/default_runtime.py'
]# model settings
model = dict(head=dict(num_classes=8,topk=(1, 3),))# dataset settings
data = dict(samples_per_gpu=32,workers_per_gpu=0,train=dict(data_prefix='data/CarColor/train',classes='data/CarColor/classes.txt'),val=dict(data_prefix='data/CarColor/val',ann_file='data/CarColor/val.txt',classes='data/CarColor/classes.txt'),test=dict(# replace `data/val` with `data/test` for standard testdata_prefix='data/CarColor/test',ann_file='data/CarColor/test.txt',classes='data/CarColor/classes.txt'))
evaluation = dict(metric_options={'topk':(1,3)})# optimizer
optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0001)
optimizer_config = dict(grad_clip=None)
# learning policy
lr_config = dict(policy='step', step=[1])
runner = dict(type='EpochBasedRunner', max_epochs=5)load_from = 'checkpoints/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth'

1.3训练模型

单卡模型训练

python tools/train.py configs/mobilenet_v2/mobilenet_v2_b32x8_car.py --work-dir work_dirs/mobilenet_v2_b32x8_car

多卡模型训练

./tools/dist_train.sh configs/mobilenet_v2/mobilenet_v2_b32x8_car.py 4

训练结果:
在这里插入图片描述
训练好的模型在work_dirs/mobilenet_v2_b32x8_car文件夹下:
在这里插入图片描述

  • 20210517_070642.log
  • 20210517_070642.log.json

是记录文件

  • epoch_1.pth
  • epoch_2.pth
  • epoch_3.pth
  • epoch_4.pth
  • epoch_5.pth

是每个一个epoch都保存了一下模型

  • latest.pth -> epoch_5.pth

是最近的那个模型的软链接

2.模型测试

  • 模型路径:work_dirs/mobilenet_v2_b32x8_car/latest.pth
  • 配置文件路径:configs/configs/mobilenet_v2/mobilenet_v2_b32x8_car.py
    使用tools/test.py对模型进行测试
# single-gpu
python tools/test.py ${CONFIG_FILE} ${CHECKPOINT_FILE} [--metrics ${METRICS}] [--out ${RESULT_FILE}]# multi-gpu
./tools/dist_test.sh ${CONFIG_FILE} ${CHECKPOINT_FILE} ${GPU_NUM} [--metrics ${METRICS}] [--out ${RESULT_FILE}]

这里有一些可选参数可以进行配置:

  • –metrics:评价方式,这依赖于数据集,比如准确率a
  • –metrics-options:对于评估过程的自定义操作,如topk=1
# single-gpu
python tools/test.py configs/mobilenet_v2_b32x8/mobilenet_v2_b32x8_car.py work_dirs/mobilenet_v2_b32x8_car/latest.pth --metrics=accuracy  --metrics-options=topk=1# multi-gpu
./tools/dist_test.sh \
configs/mobilenet_v2_b32x8/mobilenet_v2_b32x8_car.py  \
work_dirs/mobilenet_v2_b32x8_car/epoch_100.pth \
4 \
--metrics accuracy \
--out work_dirs/mobilenet_v2_b32x8_car/result.txt

3.pth模型转化为onnx模型

python tools/deployment/pytorch2onnx.py \
configs/mobilenet_v2/mobilenet_v2_b32x8_car.py \
--checkpoint work_dirs/mobilenet_v2_b32x8_car/epoch_100.pth \
--output-file work_dirs/mobilenet_v2_b32x8_car/car_20210522.onnx

http://chatgpt.dhexx.cn/article/vBH8Ec0T.shtml

相关文章

tensorflow CNN模型训练+优化参数+实战

训练线性函数 import numpy as np import tensorflow.keras as keras # 构建模型 model keras.Sequential([keras.layers.Dense(units1,input_shape[1])]) # optimizer优化,loss损失 model.compile(optimizersgd, lossmean_squared_error) #准备训练数据 xsnp.ar…

nanodet训练手势识别模型

序言 前段时间nanodet爆火,以非常小的模型和运算量,取得了超过tiny-yolov4的精度,非常惊艳,因为时间问题一直没有尝试,最近有空决定尝试一下。先来看下作者给的模型效果 一、nanodet安装 首先安装nanodet的环境包…

Pytorch教程[10]完整模型训练套路

一般的模型构建都是按照下图这样的流程 下面分享一个自己手动搭建的网络 from model import * import torchvision import torch from torch.utils.tensorboard import SummaryWriter from torchvision import transforms from torch import nn from torch.utils.data import …

PaddleOCR学习(二)PaddleOCR检测模型训练

这一部分主要介绍,如何使用自己的数据库去训练PaddleOCR的文本检测模型。 官方教程https://github.com/PaddlePaddle/PaddleOCR/blob/develop/doc/doc_ch/detection.md 一、准备训练数据 首先你需要有自己的数据,如果没有自己的数据,推荐使…

迁移学习的模型训练

用深度学习解决目标检测有两个重要工作: 1、设计、实现、训练和验证模型 模型如果设计模型如何编程实现如何收集足够的数据来训练并验证模型是否符合预期 从头开始设计、实现、训练和验证模型是需要有众多深度学习算法人才做支撑,并且极其耗时耗力 2、…

TF2.0模型训练

TF2.0模型训练 概述数据集介绍1、通过fit方法训练模型准备数据创建模型编译模型训练模型 2、通过fit_generator方法训练模型构建生成器创建模型编译模型训练模型 3、自定义训练准备数据创建模型定义损失函数及优化器训练模型 下一篇TF2.0模型保存 概述 这是TF2.0入门笔记【TF2…

TensorFlow 2.0 —— 模型训练

目录 1、Keras版本模型训练1.1 构造模型(顺序模型、函数式模型、子类模型)1.2 模型训练:model.fit()1.3 模型验证:model.evaluate()1.4 模型预测:model.predict()1.5 使用样本加权和类别加权1.6 回调函数1.6.1 EarlySt…

如何在jupyter上运行Java代码(适用LINUX)

如何在jupyter上运行Java代码 1.下载必须软件 下载JDK且JDK版本必须 ≥ 9 ≥9 ≥9从github上下载ijava 附 : ijava下载链接.装有jupyter,我在LINUX上是直接装的anaconda 安装过程 将下载的ijava压缩包解压出来,并在此路径用该命令 : sudo…

Java单元测试介绍

文章目录 单元测试单元测试基本介绍单元测试快速入门单元测试常用注解 单元测试 单元测试基本介绍 单元测试: 单元测试就是针对最小的功能单元编写测试代码,Java程序最小的功能单元是方法,因此,单元测试就是针对Java方法的测试,…

Jupyter 配置 Java环境,写Java代码,测试成功

本次简单诉说下怎么通过jupyter安装iJava,写Java代码。 安装Java的不说了 我使用的是Java15 然后去:https://github.com/SpencerPark/IJava/releases 下载zip,不要下载其他的 得到就是一个py文件 下面就是一个 python install.py 我这里就…

java调用python执行脚本,附代码

最近有个功能需要java调用python脚本实现一些功能,前期需要做好的准备:配置好python环境,如下: 以下展示的为两种,一种为生成图片,另一种为生成字符串。 package com.msdw.tms.common.utils.py;import ja…

Selenium Java自动化测试环境搭建

IDE用的是Eclipse。 步骤1:因为是基于Java,所以首先要下载与安装JDK(Java Development Kit) 下载: 点击这里下载JDK 安装:按照默认安装一路点next就可以了。 验证:安装完成后,在命…

java单元测试(Junit)

相关代码下载链接: http://download.csdn.net/detail/stevenhu_223/4884357 在有些时候,我们需要对我们自己编写的代码进行单元测试(好处是,减少后期维护的精力和费用),这是一些最基本的模块测试。当然&…

Java单元测试工具:JUnit4(一)——概述及简单例子

(一)JUnit概述及一个简单例子 看了慕课网的JUnit视频教程: http://www.imooc.com/learn/356,总结笔记。 这篇笔记记录JUnit的概述,以及一个快速入门的例子。 1.概述 1.1 什么是JUnit ①JUnit是用于编写可复用测试集的…

Linux下执行Python脚本

1.Linux Python环境 Linux系统一般集成Python,如果没有安装,可以手动安装,联网状态下可直接安装。Fedora下使用yum install,Ubuntu下使用apt-get install,前提都是root权限。安装完毕,可将Python加入环境变…

python pytest脚本执行工具

pytest脚本执行工具 支持获取当前路径下所有.py脚本 添加多个脚本,一起执行 import tkinter as tk from tkinter import filedialog import subprocess import os from datetime import datetimedef select_script():script_path filedialog.askopenfilename(fil…

linux上运行python(简单版)

linux上运行python(简单版) 一、前提准备1.centOS72.挂载yum源[http://t.csdn.cn/Isf0i](http://t.csdn.cn/Isf0i) 二、安装python3三、运行程序 一、前提准备 1.centOS7 2.挂载yum源http://t.csdn.cn/Isf0i 在终端进行安装python3 二、安装python3 …

linux怎么运行python脚本?

linux运行python脚本的方法: 1、命令行执行: 建立一个test.py文档,在其中书写python代码。之后,在命令行执行:python test.py 说明:其中python可以写成python的绝对路径。使用which python进行查询。 注…

java实现远程执行Linux下的shell脚本

java实现远程执行Linux下的shell脚本 背景导入Jar包第一步:远程连接第二步:开启Session第三步:新建测试脚本文件结果报错 背景 最近有个项目,需要在Linux下的服务器内写了一部分Python脚本,业务处理却是在Java内&…

Java运行Python脚本

前段时间遇到了在JavaWeb项目中嵌入运行Python脚本的功能的需求。想到的方案有两种,一种是使用Java技术(Jython或Runtime.exec)运行Python脚本,另一种是搭建一个Python工程对外提供相应http或webservice接口。两种方案我都有实现&…