| mmclassification一、MMCLS项目1.配置好mmcv后,从GitHub上下载mmclassification的项目。2.针对
 configs/resnet/resnet18_8xb16_cifar10.py文件进行说明,8xb16表示8个卡,每个卡的batch_size的大小是16,cifar10表示预训练模型使用的数据集。
 configs\resnet\resnet50_8xb32-mixup_in1k.pymixup表示数据增强的策略。
  3.
 configs/resnet/resnet18_8xb16_cifar10.py配置文件的解释 _base_ = [
    '../_base_/models/resnet18.py', '../_base_/datasets/imagenet_bs32.py',
    '../_base_/schedules/imagenet_bs256.py', '../_base_/default_runtime.py'
]
 (1)查看../_base_/models/resnet18.py 
model = dict(
    type='ImageClassifier',                                     
    backbone=dict(
        type='ResNet',                                          
        depth=18,                                               
        num_stages=4,                                           
        out_indices=(3, ),                                      
        style='pytorch'),                                       
    neck=dict(type='GlobalAveragePooling'),                     
    head=dict(                                                  
        type='LinearClsHead',                                   
        num_classes=1000,                                       
        in_channels=512,                                        
        loss=dict(type='CrossEntropyLoss', loss_weight=1.0),    
        topk=(1, 5),                                            
    ))
 type指定源码等会到哪去走,对应一个一个类名,不是瞎写的。比如ImageClassifier去下图中位置寻找 比如
 ResNet到下图中位置寻找
  之后可以在neck层中进行修改
 (2)查看
 ../_base_/datasets/imagenet_bs32.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),                                       
    dict(type='RandomFlip', flip_prob=0.5, direction='horizontal'),                 
    dict(type='Normalize', **img_norm_cfg),                                         
    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)),
    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(
        
        type=dataset_type,
        data_prefix='data/imagenet/val',
        ann_file='data/imagenet/meta/val.txt',
        pipeline=test_pipeline))
evaluation = dict(interval=1, metric='accuracy')                                    
 dataset_type = 'ImageNet' 数据的格式,不一定是ImageNet,根据自己的数据选择合适的格式。此处指定ImageNet,就按照mmcls/datasets/imagenet.py中定义的进行读取。
  
 samples_per_gpu=32, 单卡的batchsize;多卡每张卡的batchsize,如果训练过程中怎么调都会报显存,那就把以下代码中size的值调小。
 train_pipeline = [
    dict(type='LoadImageFromFile'),                                                 
    dict(type='RandomResizedCrop', size=224), 
 (3)查看../_base_/schedules/imagenet_bs256.py 
optimizer = dict(type='SGD', lr=0.1, momentum=0.9, weight_decay=0.0001)
optimizer_config = dict(grad_clip=None)						
lr_config = dict(policy='step', step=[30, 60, 90])          
runner = dict(type='EpochBasedRunner', max_epochs=100)      
 (4)查看../_base_/default_runtime.py 
checkpoint_config = dict(interval=1)            
log_config = dict(
    interval=100,                               
    hooks=[
        dict(type='TextLoggerHook'),
        
    ])
dist_params = dict(backend='nccl')
log_level = 'INFO'
load_from = None                                
resume_from = None                              
workflow = [('train', 1)]                       
 二、生成完整的配置文件指定所选模型的路径,在mmclassification的目录下,如D:\E\mmlab\mmclassification-master\tools\train.py,指定train.py中参数的路径,比如D:\E\mmlab\mmclassification-master\configs\resnet\resnet18_8xb32_in1k.py,运行一下train.py,执行之后会在此处D:\E\mmlab\mmclassification-master\tools\work_dirs\resnet18_b32x8_imagenet\resnet18_b32x8_imagenet.py生成配置文件。复制到D:\E\mmlab\mmclassification-master\configs\resnet路径下,并将其命名为my_resnet18_b32x8_imagenet.py。 三、根据文件夹定义数据集方法一:根据文件夹定义数据集,此方法适用于flower_data这类型的数据(1)首先,修改上面生成的配置文件中的
 num_classes,此处以flower_data数据集进行说明,一共有102个种类,所以num_classes=102。并把mmcls/datasets/imagenet.py中CLASSES =[]进行修改。(2)修改
 data中data_prefix字段,读数据的路径,如果省略掉ann_file,就直接把文件夹的名字当作标签的类别(3)修改checkpoint_config的值,
 checkpoint_config = dict(interval=50), 隔50个保存一次方法二:构建自己的数据集
 (1)所有的训练数据集都在一个文件夹下,训练集在train文件夹下。
 (2)
 mmcls/datasets下自己写一个文件,仿照imagenet进行写,看人家怎么写,自己怎么写。(3)在
 mmcls/datasets\__init__中把自己定义的数据集处理进行加载,操作如下。
  (4)在生成的完整配置文件中进行修改,数据部分要修改成以下格式,train、valid、test
 type='MyFilelist',
data_prefix='D:\\eclipse-workspace\\PyTorch4\\mmclassification-master\\mmcls\\data\\flower_data\\train_filelist',
ann_file='D:\\eclipse-workspace\\PyTorch4\\mmclassification-master\\mmcls\\data\\flower_data\\train.txt',
 四、测试demo的效果(1)demo/image_demo.py下进行简单的测试 image_05094.jpg ../configs/resnet/today_resnet18_8xb32_in1k.py ../tools/work_dirs/resnet18_8xb32_in1k/epoch_100.pth
 通过命令行分别指定img、config、checkpoint,通过这样进行单张图片的测试。 (2)测试评估模型效果:在tools/test.py文件下进行 
 通过指定以上参数,进行批量数据的测试。 五、MMCLS中增加一个新的模块在生成的完整配置文件中进行修改。backbone一般是替换。
 1.修改Neck层
 有哪些可以换呢?在
 mmcls/models/necks地方寻找。2.head层中的损失函数
 如果自己想加一个损失函数,示例如下:
 
  然后在__init__中添加
 最后在配置文件中进行修改
 3.添加数据增强
 
 mmcls/datasets/pipelines/transforms.py中有一些数据增强的操作。添加一个数据处理的操作,如下:
  4.可以指定预训练模型,通过load_from参数
 5.添加mixup操作
 在
 configs/resnet/resnet50_b32x8_mixup_imagenet.py文件中看到 _base_ = 'resnet50_8xb32-mixup_in1k.py'
_deprecation_ = dict(
    expected='resnet50_8xb32-mixup_in1k.py',
    reference='https://github.com/open-mmlab/mmclassification/pull/508',
)
 然后去_base_指定的文件中,把train_cfg复制到自己的配置文件中head层中,并修改num_classes参数
  
  六、数据增强流程可视化展示在tools/visualizations文件夹下,有一个可视化的模块。有3个文件,vis_cam.py、vis_lr.py、vis_pipeline.py。vis_cam.py是哪里是图像中关注的区域、vis_lr.py学习率的可视化变化、vis_pipeline.py图像由输入经过旋转、平移、缩放操作,最终放到模型当中,可视化这一系列操作是怎么做的,经历哪些阶段。(在输入模型之前都经历了哪些操作)(1)
 vis_pipeline.py的介绍常用参数的介绍:
 
 config:配置文件的指定
 --output-dir:输出图像的设置路径
 --phase:选择可视化的数据集train、test、val
 --number:选择可视化图像的数量
 --mode:展示的模式,展示原始图像original,…… "original" means show images load from disk'
'; "transformed" means to show images after transformed; "concat" '
'means show images stitched by "original" and "output" images. '
'"pipeline" means show all the intermediate images. Default concat.'
 --show:whether to display images in pop-up window. Default False.
 --mode指定pipeline结果示例:
  
 --mode指定transformed结果示例:转化完之后的结果示例
  
 --mode指定concat结果示例:
 
 (2)vis_cam.py的介绍,Grad-Cam可视化方法,可视化细节与效果分析 首先需要安装pip install "grad-cam>=1.3.6"指定参数img、config、checkpoint、--target-category表示The target category to get CAM、--target-layers可以指定查看哪一层特征图的CAM,默认是最后一层–the norm layer in the last block、--preview-model添加这个参数,会打印出模型的结构,其余参数不起作用了指定参数的示例
 cat-dog.png ../../configs/resnet/resnet18_8xb32_in1k.py D:\\E\\mmlab\\mmclassification-master\\mmcls\\data\\resnet18_8xb32_in1k_20210831-fbbb1da6.pth
--target-category 238 --target-category 281
cat-dog.png ../../configs/resnet/resnet18_8xb32_in1k.py D:\\E\\mmlab\\mmclassification-master\\mmcls\\data\\resnet18_8xb32_in1k_20210831-fbbb1da6.pth
--target-layers backbone.layer2.1.conv2
 七、模型分析脚本使用tools/analysis_tools中绘制的图还不是很好看:analysis_logslog中有一些指标,打印出的,可以画出来get_flops.py所需的参数量和计算量1.绘制评估结果,loss的结果图。
 此目录下有日志文件
 
  参数设置示例:
 plot_curve ../work_dirs/resnet18_b32x8_imagenet/20220601_112055.log.json --keys loss accuracy_top-1
 2.计算迭代时间参数设置示例
 cal_train_time ../work_dirs/resnet18_b32x8_imagenet/20220601_112055.log.json
 平均一次迭代所需花的时间
  3.
 get_flops.py所需的参数量和计算量参数设置示例:
 ../../configs/resnet/today_resnet18_b32x8_imagenet.py --shape 224 224
  参数量和训不训练没关系。和模型以及输入图像的大小有关。
 |