利用MMPreTrain微调图像分类模型

利用MMPreTrain微调图像分类模型

利用MMPreTrain微调图像分类模型

羽星_s

前言

MMPreTrain是一款基于PyTorch的开源深度学习预工具箱,是OpenMMLab项目的成员之一

MMPreTrain的主要特性有:

支持多元化的主干网络与预训练模型

支持多种训练策略(有监督学习,无监督学习,多模态学习等)

提供多种训练技巧

大量的训练配置文件

高效率和高可扩展性

功能强大的工具箱,有助于模型分析和实验

支持多个开箱即用的推理任务

图片分类

图片描述(图片说明)

视觉问答(Visual Question Answering)

视觉定位(Visual Grounding)

搜索(图搜图,图搜文,文搜图)

本文主要演示如何使用MMPreTrain,对图像分类任务,微调vision_transformer模型

分类数据使用kaggle平台中的Animal Faces数据集,(https://www.kaggle.com/datasets/andrewmvd/animal-faces)运行环境为kaggle GPU P100

环境安装

因为需要对模型进行可解释分析,需要安装grad-cam包,mmcv的安装方式在我前面的mmdetectionmmsegmentation教程中都有写到。这里不再提

mmpretrain安装方法最好是使用git,如果没有git工具,可以使用mim install mmpretrain

最后在项目文件夹下新建checkpoint、outputs、data文件夹,分别用来存放模型预训练权重、模型输出结果、训练数据

from IPython import display

在上面的安装工作完成后,我们检查一下环境,以及核对一下安装版本

import mmcv

输出:

MMCV版本 2.0.1

因为mmpretrain适用于很多种任务,因此在进行图像分类模型微调时先查看一下支持该任务的模型有哪些,可以调用list_models函数查看,因为我们想要微调vision_transformer模型,可以加上限制条件vit进行更精准的筛选

from mmpretrain import list_models, inference_model

这里以候选列表中的vit-base-p32_in21k-pre_3rdparty_in1k-384px模型为例

模型推理

进入项目文件夹configs/vision_transformer,查看模型型号对应预训练权重及config文件

www.zeeklog.com  - 利用MMPreTrain微调图像分类模型

下载预训练权重,对示例图片进行推理

www.zeeklog.com  - 利用MMPreTrain微调图像分类模型
from mmpretrain import ImageClassificationInferencer

查看推理结果

result[0].keys()

输出:

dict_keys(['pred_scores', 'pred_label', 'pred_score', 'pred_class'])

打印分类置信度最高类别的名称,以及置信度

# 置信度最高类别的名称
house finch, linnet, Carpodacus mexicanus

微调模型

将数据集移到data目录下,准备训练

# animal数据集移动

配置文件解析

MMPreTrain配置文件和mmdetection、mmsegmentation有点不太一样,当你打开vit-base-p32_in21k-pre_3rdparty_in1k-384px的配置文件vit-base-p32_64xb64_in1k-384px.py时,会发现配置文件中只显式的定义了数据管道及处理方式

但实际上数据处理和优化器参数都被隐形定义在_base_下了,详细情况可以看下面的代码注释

_base_ = [

打开../_base_/models/vit-base-p32.py文件,查看模型配置

model = dict(

打开../_base_/datasets/imagenet_bs64_pil_resize.py文件,查看数据配置

dataset_type = 'ImageNet'    # 预处理配置

打开../_base_/schedules/imagenet_bs4096_AdamW.py文件,查看训练策略配置

optim_wrapper = dict(

打开../_base_/default_runtime.py文件,查看默认运行设置

# 默认所有注册器使用的域

修改配置文件

根据上述说明,这里提供两种修改配置文件的方法。

第1种是将共5个配置文件的信息写在一个新的配置文件vit-base-p32_1xb64_in1k-384px_animal.py中,然后修改其中的内容。

首先将配置文件vit-base-p32_64xb64_in1k-384px.py中的内容更新到继承的键值对中,比如model中的img_size=384,train_pipeline和test_pipeline也都需要改

然后更改num_classes、dataset_type、train_dataloader、val_dataloader、val_evaluator、lr、param_scheduler、default_hooks、randomness

需要注意的是dataset_type要改成'CustomDataset',而'CustomDataset'中是没有split键的,所以要删掉train_dataloaderval_dataloader中的split

因为分类数量较少,不足5类,所以将val_evaluator中的topk(1, 5)改成5

lr要与原batchlr进行等比例缩放,缩放率为32/(64 * 64)(由配置文件名64xb64可知,原batch_size为64 * 64)

因为只训练100个epoch,所以LinearLR scheduler中的end键也进行等比例缩放,即除以3。则CosineAnnealingLR scheduler中的T_max、begin、end相应变化

因为模型在前20个epoch可能没有学习成果,所以没有验证的必要,这里加入val_begin键,表示从第20个epoch开始在验证集上计算指标,验证的频率也不需要1个epoch一次,这里改成5个epoch验证一次

我们想要模型没10个epoch自动保存一次权重,并且最多同时保留两个训练权重,同时根据指标自动保留精度最高的训练权重checkpoint = dict(type='CheckpointHook', interval=10, max_keep_ckpts=2, save_best='auto')

记录频率100(单位:iter)有点太低,我们改成10

最后固定随机数种子randomness

custom_config = """

第2种方法是先将默认配置文件读取,然后再通过python的字典特性进行更改,优点是,只改动需要改动的地方,逻辑清晰

缺点是有些在配置文件中的中间变量无效了,比如在配置文件中可以只用定义dataset_type,后面train_dataloader、val_dataloader可以直接使用,但是用字典特性要改两遍

参数的改变和上面的一样,但是代码少很多

# 读取配置文件
max_epochs = 100

启动训练

!python tools/train.py {animal_config}

由于输出日志太长,这里就不全部展示了,打印一下精度最高的模型权重

07/30 13:33:50 - mmengine - INFO - Epoch(val) [55][24/24]    accuracy/top1: 99.9333  data_time: 0.2443  time: 0.5068

可以看到模型在验证集上的精度为99.93%,可以说非常不错

模型推理

加载精度最高的模型,并对图片进行推理

import glob

输出:

[{'pred_scores': array([9.9998045e-01, 1.3512783e-05, 6.0256166e-06], dtype=float32),

绘制混淆矩阵

我们可以绘制混淆矩阵进一步检查模型精度

python tools/analysis_tools/confusion_matrix.py \

类别激活图(CAM)可视化

使用类别激活图(CAM)对分类图像进行解释,更多参数设置请参照官方文档(https://mmpretrain.readthedocs.io/zh_CN/latest/useful_tools/cam_visualization.html)

!python tools/visualization/vis_cam.py \
from PIL import Image
www.zeeklog.com  - 利用MMPreTrain微调图像分类模型

T-SNE可视化

通过降维可视化可以进一步观察模型对类别分界线是否明显,还可以找到模型容易误判的类别

python tools/visualization/vis_tsne.py \

Read more

60个“特征工程”计算函数(Python代码)

60个“特征工程”计算函数(Python代码)

转自:coggle数据科学 近期一些朋友询问我关于如何做特征工程的问题,有没有什么适合初学者的有效操作。 特征工程的问题往往需要具体问题具体分析,当然也有一些暴力的策略,可以在竞赛初赛前期可以带来较大提升,而很多竞赛往往依赖这些信息就可以拿到非常好的效果,剩余的则需要结合业务逻辑以及很多其他的技巧,此处我们将平时用得最多的聚合操作罗列在下方。 最近刚好看到一篇文章汇总了非常多的聚合函数,就摘录在下方,供许多初入竞赛的朋友参考。 聚合特征汇总 pandas自带的聚合函数 * 其它重要聚合函数 其它重要聚合函数&分类分别如下。 def median(x):     return np.median(x) def variation_coefficient(x):     mean = np.mean(x)     if mean != 0:         return np.std(x) / mean     else:         return np.nan def variance(x):     return

By Ne0inhk
90w,确实可以封神了!

90w,确实可以封神了!

要说24年一定最热的技术,还得是AIGC! 前段时间阿里旗下的开源项目,登上GitHub热榜! AI大热,如今ChatGPT的优异表现,必然会出现各种细分场景应用的工具软件,和大量岗位项目! 山雨欲来风满楼,强人工智能的出现,所有科技公司已经开始巨量扩招此领域的人才。算法的岗位,近三个月已经增长68%!这件事在HR届也是相当震撼的。 目前各行各业都不景气的市场,人工智能岗位却一直保持常青!甚至同属AI边缘岗都比其他岗薪资高40%! 与此同时,AI算法岗上岸也不简单,竞争激烈,好公司核心岗位不用说,谁都想去。 所以事实就是,想要上岸,门槛也逐渐变高,项目经历、实习经历都很重要,越早明白这个道理就越能提前建立起自己的优势。 但我在b站逛知识区的时候,经常看到有些同学,因为一些客观原因导致无法参加实习,这种情况下,如果你想提升背景,增加项目经历的话,可以试试这个《CV/NLP 算法工程师培养计划》。 目前已经有上千位同学通过该计划拿到offer了,最新一期学员就业薪资最高能拿到78K!年薪94w! 优势就是有BAT大厂讲师带领,手把手带做AI真实企业项目(包含CV、NLP等

By Ne0inhk
再见nohup!试试这个神器,Python Supervisor!

再见nohup!试试这个神器,Python Supervisor!

👇我的小册 45章教程:() ,原价299,限时特价2杯咖啡,满100人涨10元。 作者丨Ais137 https://juejin.cn/post/7354406980784373798 1. 概述 Supervisor 是一个 C/S 架构的进程监控与管理工具,本文主要介绍其基本用法和部分高级特性,用于解决部署持久化进程的稳定性问题。 2. 问题场景 在实际的工作中,往往会有部署持久化进程的需求,比如接口服务进程,又或者是消费者进程等。这类进程通常是作为后台进程持久化运行的。 一般的部署方法是通过 nohup cmd & 命令来部署。但是这种方式有个弊端是在某些情况下无法保证目标进程的稳定性运行,有的时候 nohup 运行的后台任务会因为未知原因中断,从而导致服务或者消费中断,进而影响项目的正常运行。 为了解决上述问题,通过引入 Supervisor 来部署持久化进程,提高系统运行的稳定性。 3. Supervisor 简介 Supervisor is a client/

By Ne0inhk
第一本给程序员看的AI Agent图书上市了!

第一本给程序员看的AI Agent图书上市了!

AI Agent火爆到什么程度? OpenAI创始人奥特曼预测,未来各行各业,每一个人都可以拥有一个AI Agent;比尔·盖茨在2023年层预言:AI Agent将彻底改变人机交互方式,并颠覆整个软件行业;吴恩达教授在AI Ascent 2024演讲中高赞:AI Agent是一个令人兴奋的趋势,所有从事AI开发的人都应该关注。而国内的各科技巨头也纷纷布局AI Agent平台,如:钉钉的AI PaaS、百度智能云千帆大模型平台等等。 Agent 是未来最重要的智能化工具。对于程序员来说,是时候将目光转向大模型的应用开发了,率先抢占AI的下一个风口AI Agent。 小异带来一本新书《大模型应用开发 动手做 AI Agent》,这本书由《GPT图解》的作者黄佳老师创作,从0到1手把手教你做AI Agent。现在下单享受5折特惠! ▼点击下方,即可5折起购书 有这样一本秘籍在手,程序员们这下放心了吧,让我们先来揭开 Agent 的神秘面纱。 AI Agent 面面观

By Ne0inhk