OpenMMlab AI实战营第三期培训

OpenMMlab AI实战营第三期培训

  • OpenMMlab实战营
    • 第三次课2023.2.2
    • 学习参考
    • 一、pytorch完整训练过程
    • 二、基于mmclassification做图像分类
      • 1.安装mim工具包以及必备的库
      • 2. OpenMMlab项目中的重要概念
        • (1)配置文件
        • (2)下载配置文件
      • 3.训练
        • (1)数据集导入
        • (2)修改配置文件
          • 1.复制配置文件
          • 2.修改model部分
          • 3.修改data部分
          • 4.修改优化器
        • (4)执行训练
        • (5)测试刚生成的模型性能
    • 喜大普奔,到这里你已经完成了使用OpenMMlab完成一个图像分类任务的简易流程
    • 三、超算云平台的使用

OpenMMlab实战营

第三次课2023.2.2

此次实战营的积分规则介绍:

在这里插入图片描述

学习参考

笔记建议结合ppt来学习使用,ppt中对应知识可以参照笔记的标题进行查看。

ppt(ppt_02的后半部分):lesson3_ppt

b站回放:OpenMMLab AI 实战营

往期笔记:笔记回顾

相关学习推荐:

  • 同济子豪兄(大佬):子豪兄b站主页

  • OpenMMlab主页:OpenMMla主页

  • OpenMMlab Github仓库链接:Github OpenMMlab

  • MMClassification Github仓库链接:Github MMClassification

  • OpenMMlab 此次AI实战营的仓库:AI实战营github

一、pytorch完整训练过程

pytorch是现在非常好用的一款深度学习的框架,其中集成了很多实现的模型和算法义工我们使用,完整的pytorch训练过程(以图像分类问题为例)包括:

  1. 构建数据集
    • 搜集图片
    • 划分训练集和测试集
  2. 数据预处理
    • 统一尺寸
    • 数据增强(旋转,缩减等等)
    • 归一化
    • 转换成Tensor类型
  3. 构造模型/调用torch自带的模型
  4. 在训练集上训练
    • 损失函数
    • 优化器
    • 反向传播三部曲(取消梯度累计、反向传播、更新参数)
  5. 在测试集评估性能
  6. 可解释性工具进行分析

如果想要完整的体验一下pytorch的训练流程可以参考我之前写的笔记,这里就不一步一步的介绍了:Dog25数据集上完整进行pytorch训练

二、基于mmclassification做图像分类

mmclassification是OpenMMlab团队开发的开源算法库之一,主要基于ImageNet1000类数据集在各种模型上做预训练,我们可以通过mim包来进行操作,更加便捷的使用一些常见的和最新的模型。

mmclassification仓库地址:mmclassification

1.安装mim工具包以及必备的库

!pip install openmim mmengine
!mim install  mmcv-full mmcls

测试是否成功导入包:

import mmcv
import mmcls

不报错即为成功,注意:如果提示警告“有最新版本可以使用,但是不影响后续使用”。继续使用即可,不会影响后续操作。

2. OpenMMlab项目中的重要概念

(1)配置文件
  1. 深度学习模型的训练涉及几个方面:

    • 模型结构 模型有几层、每层多少通道数等等

    • 数据集 用什么数据训练模型:数据集划分、数据文件路径、数据增强策略等等

    • 训练策略 梯度下降算法、学习率参数、batch_size、训练总轮次、学习率变化策略等等

    • 运行时 GPU、分布式环境配置等等

    • 一些辅助功能 如打印日志、定时保存checkpoint等等

  2. 在 OpenMMLab 项目中,所有这些项目都涵盖在一个配置文件中,一个配置文件定义了一个完整的训练过程,主要包含:

    • model 字段定义模型
    • data 字段定义数据
    • optimizer、lr_config 等字段定义训练策略
    • load_from 字段定义与训练模型的参数文件
(2)下载配置文件

模型都存放在OpenMMlab的仓库下:https://github.com/open-mmlab/mmclassification/tree/master/configs

下载的时候要选择具体模型下的_in1k版本(内部基于__bash__完成继承)

# !mim download mmcls --config [模型文件的名字不带.py后缀] --dest[存放位置] .表示下载到本地
!mim download mmcls --config mobilenet-v2_8xb32_in1k --dest .

下载完成获得两个文件:

  1. .pth的参数文件

  2. .py的配置文件

打开.py的配置文件我们可以看到:

  1. model部分记载了模型相关的内容,比如num-classes表示最终分类的类别数量,以及输出如channel和损失函数的定义

  2. data部分记载了我们的数据的一些存放路径、加载方式、数据增强等等,当前的模型我们可以看到他是基于ImageNet数据集做的预训练

  3. 后面的train/val/test分别对应了训练集/验证集/测试集相关的数据处理方式

  4. 再往下就是优化器相关的内容

3.训练

完成了对mmclassification中已经在ImageNet模型上预训练过的模型配置文件和参数文件之后,我们就可以对其进行修改,然后在我们自己的数据集中做fine-tune微调以完成我们自己的图像分类任务。

(1)数据集导入

这里我们直接下载子豪完成训练集、测试集划分的30类水果的数据集

!wget https://zihao-openmmlab.obs.cn-east-3.myhuaweicloud.com/20220716-mmclassification/dataset/fruit30/fruit30_split.zip

解压缩,用data文件夹存放数据,>> /dev/null表示不生成解压过程记录。方便起见我们直接使用划分完成的,未划分的数据集也可以留着自己完成数据集划分

mkdir data
!unzip ./fruit30_split.zip -d ./data>> /dev/null
(2)修改配置文件

仍然使用上面提到的在ImageNet中预训练的模型mobilenet-v2_8xb32_in1k。

  • 修改配置文件:将数据集路径等等更换成我们需要的内容
  • 首先使用cp指令复制一个.py的配置文件用来修改自己的
!cp mobilenet-v2_8xb32_in1k.py cls-0-pytorch.py 
1.复制配置文件

手动打开配置文件之后我们会看到部分内容,其实就是中间变量,后续执行data部分的时候也会自动包含在里面,所以直接删除即可

# 删除cls-0-pytorch.py中这一部分
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',
        mean=[123.675, 116.28, 103.53],
        std=[58.395, 57.12, 57.375],
        to_rgb=True),
    dict(type='ImageToTensor', keys=['img']),
    dict(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',
        mean=[123.675, 116.28, 103.53],
        std=[58.395, 57.12, 57.375],
        to_rgb=True),
    dict(type='ImageToTensor', keys=['img']),
    dict(type='Collect', keys=['img'])
]
2.修改model部分

修改model部分:使用的模型不需要修改,只需要修改分类头的数量(num_classes

由于我们是继承自模型在ImageNet上的训练结果来做fine-tune微调,所以我们需要将load_from = None修改为我们下载的参数文件的路径,放在配置文件里(原始的配置及文件在最下面,放到哪里都可以,有就行)

model = dict(
    type='ImageClassifier',
    backbone=dict(type='MobileNetV2', widen_factor=1.0),
    neck=dict(type='GlobalAveragePooling'),
    head=dict(
        type='LinearClsHead',
        num_classes=30,
        in_channels=1280,
        loss=dict(type='CrossEntropyLoss', loss_weight=1.0),
        topk=(1, 5)))
load_from = 'mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth'
3.修改data部分

修改data部分:

  1. 首先我们不是在ImageNet上去训练,所以通常需要把type改成CustomDataset

  2. 配置路径为自己当前的路径,通常OpenMMlab数据都放在一个data文件路径下

    eg.当前就是data/fruit30_split/train

  3. 数据增强部分通常不用变化,但是需要一个ann_file(配置文件里有就加上没有就算了)表示我们数据处理中的一些类别标注存到一个文件中,没有的话默认就会按照文件的默认文件结构去推断。

  4. 注意路径需要在train/val/test中都修改。ann_file如果自己的数据集中没有提前生成,就直接删掉即可。

data = dict(
    samples_per_gpu=32,
    workers_per_gpu=2,
    train=dict(
        type='CustomDataset',
        data_prefix='data/fruit30_split/train',
        pipeline=[
            dict(type='LoadImageFromFile'),
            dict(type='RandomResizedCrop', size=224, backend='pillow'),
            dict(type='RandomFlip', flip_prob=0.5, direction='horizontal'),
            dict(
                type='Normalize',
                mean=[123.675, 116.28, 103.53],
                std=[58.395, 57.12, 57.375],
                to_rgb=True),
            dict(type='ImageToTensor', keys=['img']),
            dict(type='ToTensor', keys=['gt_label']),
            dict(type='Collect', keys=['img', 'gt_label'])
        ]),
    val=dict(
        type='CustomDataset',
        data_prefix='data/fruit30_split/val',
        pipeline=[
            dict(type='LoadImageFromFile'),
            dict(type='Resize', size=(256, -1), backend='pillow'),
            dict(type='CenterCrop', crop_size=224),
            dict(
                type='Normalize',
                mean=[123.675, 116.28, 103.53],
                std=[58.395, 57.12, 57.375],
                to_rgb=True),
            dict(type='ImageToTensor', keys=['img']),
            dict(type='Collect', keys=['img'])
        ]),
    test=dict(
        type='CustomDataset',
        data_prefix='data/fruit30_split/val',
        pipeline=[
            dict(type='LoadImageFromFile'),
            dict(type='Resize', size=(256, -1), backend='pillow'),
            dict(type='CenterCrop', crop_size=224),
            dict(
                type='Normalize',
                mean=[123.675, 116.28, 103.53],
                std=[58.395, 57.12, 57.375],
                to_rgb=True),
            dict(type='ImageToTensor', keys=['img']),
            dict(type='Collect', keys=['img'])
        ]))
4.修改优化器

修改配置文件最下面优化器相关内容:

  1. 由于我们的训练在1卡,而模型参数中的是8卡,所以我们需要将学习率lr/8

    eg. 原来lr = 0.045,现在就要变成lr = 0.045/8 ≈ 0.005

  2. max_epochs也不用很大

  3. checkpoint_config每隔多少次保存一次模型,这里我们一共5轮,只存一次即可

  4. log_config日志输出可以调的小一点,输出频繁一点

  5. 其他东西整体不用改

evaluation = dict(interval=1, metric='accuracy')
optimizer = dict(type='SGD', lr=0.005, momentum=0.9, weight_decay=4e-05)
optimizer_config = dict(grad_clip=None)
lr_config = dict(policy='step', gamma=0.98, step=1)
runner = dict(type='EpochBasedRunner', max_epochs=5)
checkpoint_config = dict(interval=5)
log_config = dict(interval=10, hooks=[dict(type='TextLoggerHook')])
dist_params = dict(backend='nccl')
log_level = 'INFO'
resume_from = None
workflow = [('train', 1)]

最后:将上述配置文件修改覆盖到我们cp复制的.py配置文件中

(4)执行训练

使用mim工具包执行训练

!mim train mmcls cls-0-pytorch.py

执行之后会生成各种文件执行信息,可以看到我们的配置文件的信息,加载参数的信息,以及模型的实际执行情况。最后可以看到文件训练完成。

在这里插入图片描述

注意:执行完成后存储的日志、checkpoint、.py配置文件、最终保存的训练参数保存在word_dirs文件路径下

(5)测试刚生成的模型性能

使用mmcls库中的api函数即可实现简单的推导过程。

from mmcls.apis import init_model, inference_model

model = init_model('mobilenet-v2_8xb32_in1k.py',
                  'mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth',
                  device='cuda:0')

查看模型类型:

# 模型类型,类似nn.Module的子类
type(model)

在这里插入图片描述

打印模型结构:

# 模型结构
model

在这里插入图片描述

推理使用inference_model函数进行推导,并且输出结果。

# 推理
result = inference_model(model, 'strawberry.jpg')
print(result)

用绘图的方式将预测结果写在原图上:

from mmcls.apis import show_result_pyplot

show_result_pyplot(model, 'strawberry.jpg', result)

在这里插入图片描述

基本原理和自己手写pytorch全流程是一样的,只不过mmcls对pytorch做了封装,我们实际执行代码更少量。

实战营视频3的27:40~31:00讲解了推理的内部全流程(我们调api背后的事情)

b站视频主页:https://space.bilibili.com/1293512903/channel/collectiondetail?sid=1068652

喜大普奔,到这里你已经完成了使用OpenMMlab完成一个图像分类任务的简易流程

更加复杂的包括划分训练集的过程,可以参考我实现的作业一的代码:作业一完整代码

三、超算云平台的使用

这部分内容我还没有实践(实在是linux比较薄弱),所以我把官方的教学文档的链接放在这里:超算云使用mmclassification完成图像分类任务

一些超算云平台的注意事项:

  • 3090显卡cuda最低11.1

  • 尽量使用pip安装

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Frontend - Boostrap 消息弹窗

目录 一、下载 (一)中文官网 (二)bootstrap v3 依赖 jQuery 插件 二、解压并安装 (一)解压 1. 压缩包解压 2. 简化文件 (二)安装 三、配置 (一)bas…

CDN介绍

概念介绍 CDN Content Delivery Network,缩写:CDN)是一种提供更快互联网访问的服务,通过在网络的边缘或核心交换区域部署内容代理服务器来实现。这些服务器利用全局负载调度机制来分发内容,从而构建了一个覆盖范围广…

2023年个税申报:“婴幼儿照护专项附加扣除标准”你选对了没有?

2023年个税申报:“婴幼儿照护专项附加扣除标准”你选对了没有? 根据《国务院关于设立3岁以下婴幼儿照护个人所得税专项附加扣除的通知》(国发〔2022〕8号): 一、纳税人照护3岁以下婴幼儿子女的相关支出,按照每个婴幼儿每月1000元…

技术总结: PPT绘图

目录 写在前面参考文档技巧总结PPT中元素的连接立方体调整厚度调整图形中的文本3D 图片调整渐变中的颜色 写在前面 能绘制好一个好看的示意图非常重要, 在科研和工作中好的示意图能精准表达出自己的想法, 减少沟通的成本, 可视化的呈现也可以加强自身对系统的理解, 时间很久后…

Linux进程间通信方式之socket使用实例

TCP/IP协议族包括运输层、网络层、链路层,而socket所在位置如图,Socket是应用层与TCP/IP协议族通信的中间软件抽象层。 下面是网络socket通信的基本流程: socket函数 int socket(int domain, int type, int protocol);socket函数对应于普通…

DevOps学习 | 如何应对IT服务交付中的问题?

目录 前言 DevOps是什么? DevOps发展历程 DevOps与微服务、容器的关系 书本推荐 前言 作为一个热门的概念,DevOps这个名词在程序员社区里频频出现,备受技术大佬们的追捧。甚至网络上有了“南无DevOps”的戏言(南无在梵语的意…

MySQL面试题【全面】

基础内容 1、MySQL的架构分层 (1)Serve层:负责建立连接、分析和执行 SQL。 MySQL 大多数的核心功能模块都在这实现,主要包括连接器,查询缓存、解析器、预处理器、优化器、执行器等。另外,所有的内置函数&…

解析 openGauss 的 AutoVacuum 机制及优化策略

前言 在 openGauss 数据库中,AutoVacuum 机制是一个关键的自动化功能,用于管理表的空间和性能。AutoVacuum 通过定期清理过时数据和更新统计信息,帮助数据库管理员维护数据库的性能和稳定性。 为什么需要 AutoVacuum? 了解AutoV…

SOCKS55代理 VS Http代理,如何选择?

在使用IPFoxy全球代理时,选择 SOCKS55代理还是HTTP代理?IPFoxy代理可以SOCKS55、Http协议自主切换,但要怎么选择?为解决这个问题,得充分了解两种代理的工作原理和配置情况。 在这篇文章中,我们会简要介绍 …

第15届蓝桥STEMA测评真题剖析-2024年1月28日Scratch编程初中级组

[导读]:超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成,后续会不定期解读蓝桥杯真题,这是Scratch蓝桥杯真题解析第173讲。 第15届蓝桥第4次STEMA测评,这是2024年1月28日举办的STEMA,比赛仍然采取线上形式。这…

羊大师揭秘羊奶与健康,美味的保健佳品

羊大师揭秘羊奶与健康,美味的保健佳品 羊奶确实是一种美味且健康的保健佳品,其独特的营养成分和风味使其成为许多人的健康选择。以下是一些羊奶与健康的关系: 营养丰富:羊奶含有丰富的蛋白质、脂肪、矿物质和维生素,…

【latex过长或过短】 表格大小调整 解决方案

文章目录 1、表格过短 1.2 问题描述1.2 解决方案 2、表格过长,显示信息不全 2.1 问题描述2.2 解决方案 1、表格过短 1.2 问题描述 表格占整个页面的宽度较小,如下图: Latex源码如下:\begin{table*} \caption{short} \label{t1} …

OpenCompass 大模型评测介绍和实战

为什么要进行评测? 大模型的能力 模型评测对各个人的影响 如何评测大语言模型 客观评测 主观评测 prompt工程 平台结构 流水线设计 大模型评测对比 多模态探索 垂直领域(法律) 垂直领域(医疗) 大模型评测领…

Python 语句(二)【循环语句】

循环语句允许执行一个语句或语句组多次,其程序流程图如下: 在python中有三种循环方式: while 循环 当判断条件为 true 时执行循环体,否则退出循环体。for 循环 重复执行语句嵌套循环 (在while循环体中嵌套for循环&…

Java 打包 SpringBoot 项目报错

Java 打包 SpringBoot 项目报错 问题重现 Please refer to xxxx for the individual test results. Please refer to dump files (if any exist) [date].dump, [date]-jvmRun[N].dump and [date].dumpstream. 解决问题 在 pom.xml 的 <properties> 中添加项目代码 <s…

Python处理表格数据库之Agate使用详解

概要 您是否有时觉得在处理表格数据时感到不知所措? 也许你在处理一个大型 CSV 文件,遇到了各种数据不一致的问题,或者需要验证数据,确保其准确无误才能进行下一步分析。 传统的数据分析库或许功能强大,但学习曲线陡峭,用起来有点杀鸡用牛刀的感觉。 这时,有一个更…

2024六大创业营销趋势,普通人创业新风向!

2024年越来越多的人选择创业&#xff0c;从龙年春节前后&#xff0c;创投圈就开始探讨关于2024的创业新风向&#xff0c;从各个热点&#xff0c;各大品牌&#xff0c;春晚等等方面洞察2024创业趋势&#xff0c;以下总结的6大创业营销趋势&#xff0c;跟着大品牌押宝&#xff0c…

鸿蒙Harmony应用开发—ArkTS声明式开发(通用属性:焦点控制)

自定义组件的走焦效果&#xff0c;可设置组件是否走焦和具体的走焦顺序&#xff0c;tab键或者方向键切换焦点。 说明&#xff1a;从API Version 8开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 focusable focusable(value: boolean) 设…

一个iOS应用是如何启动以及如何优化

一、应用启动流程 1、主要阶段&#xff1a; 分为两个阶段&#xff0c;pre-main阶段和main()阶段。程序启动到main函数执行前是pre-main阶段&#xff1b;在执行main函数后&#xff0c;调用AppDelegate中的-application:didFinishLaunchingWithOptions:方法完成初始化&#xff…

uniapp和vue项目配置多语言,实现前端切换语言

在uniapp中配置多语言功能&#xff0c;实现前端切换语言&#xff0c;可以按照以下步骤进行&#xff1a; 1. 创建语言包 首先&#xff0c;创建一个名为 lang 的目录&#xff0c;并在该目录下为每种支持的语言创建对应的JSON或JS文件。例如&#xff1a; lang/en.js&#xff08…