mmclassification使用心得(一)初步训练
训练命令
从命令就能看出,CONFIG_FILE
是我们的入手点
#单GPU训练
python tools/train.py ${CONFIG_FILE} [optional arguments]
#多GPU训练
./tools/dist_train.sh ${CONFIG_FILE} ${GPU_NUM} [optional arguments]
CONFIG_FILE结构
. |-- _base_
|-- lenet
|-- mobilenet_v2
|-- resnet
|-- resnext
|-- seresnet
|-- seresnext
|-- shufflenet_v1
|-- shufflenet_v2
`-- vgg
./configs
目录中有两个部分,一个是_base_
用来配置数据集、网络模型、训练策略……,第二个是各种模型,我们使用CONFIG_FILE
就是在这些目录中。以resnet34_b32x8_imagenet.py
为例,它位于resnet目录下,它的名字表示这个模型是34层resnet,batchsize为32,使用的数据集是imagenet,下面是它的内容:
_base_ = [
'../_base_/models/resnet34.py', #模型配置
'../_base_/datasets/imagenet_bs32.py', #数据集配置
'../_base_/schedules/imagenet_bs256.py', #训练策略配置
'../_base_/default_runtime.py' #日志、存储相关配置
]
我们可以自定义这四个文件,完成自己的训练任务
自定义数据集
相关目录:
../_base_/datasets/ #数据预处理、路径配置
../data/Mydataset/ #数据放在这个位置
../mmcls/dataset/ #数据读取
../_base_/datasets/
路径下,我截取了部分代码
dataset_type = 'FILELIST' #重要,通过它找到mmcls/datasets下的文件
data = dict(
samples_per_gpu=32,
workers_per_gpu=2,
train=dict(
type=dataset_type,
data_prefix='data/imagenet/train',
pipeline=train_pipeline),
#这一行要加上,我发现imagenet和文档上都没有,但是少了就报错
ann_file='data/imagenet/meta/train.txt',
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')
../mmcls/dataset/
路径下有两步,首先自定义自己的数据加载方法(仿照imagenet),第二步需要在 __init__.py
下登记自定义的数据集,要不然会报错。
自定义数据集不用照搬imagenet所有的,我截取了最重要的一部分。
import mmcv
import numpy as np
from .builder import DATASETS
from .base_dataset import BaseDataset
@DATASETS.register_module()
class FILELIST(BaseDataset):
def load_annotations(self):
print(self.ann_file)
assert isinstance(self.ann_file, str)
data_infos = []
with open(self.ann_file) as f:
#根据自己数据的格式编写读取代码
samples = [x.strip().split(',') for x in f.readlines()]
print(samples[0])
for filename, gt_label in samples:
if filename == 'filename':
continue
info = {'img_prefix': self.data_prefix}
info['img_info'] = {'filename': filename}
info['gt_label'] = np.array(gt_label, dtype=np.int64)
data_infos.append(info)
return data_infos
之后需要登记自定义数据集,分别在头文件和list中
from .base_dataset import BaseDataset
from .builder import DATASETS, PIPELINES, build_dataloader, build_dataset
from .cifar import CIFAR10, CIFAR100
from .dataset_wrappers import (ClassBalancedDataset, ConcatDataset,
RepeatDataset)
from .imagenet import ImageNet
from .mnist import MNIST, FashionMNIST
from .multi_label import MultiLabelDataset
from .samplers import DistributedSampler
from .voc import VOC
from .filelist import FILELIST
from .coversubject import CoverSubject
__all__ = [
'BaseDataset', 'ImageNet', 'CIFAR10', 'CIFAR100', 'MNIST', 'FashionMNIST',
'VOC', 'MultiLabelDataset', 'build_dataloader', 'build_dataset', 'Compose',
'DistributedSampler', 'ConcatDataset', 'RepeatDataset',
'ClassBalancedDataset', 'DATASETS', 'PIPELINES','FILELIST', 'CoverSubject'
]
模型配置
重点修改模型的类别数目
# model settings
model = dict(
type='ImageClassifier',
backbone=dict(
type='ResNet',
depth=34,
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),
))
训练策略
# 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)