图像分类

1 简介

图像分类模块,提供各种主流的卷积神经网络用于进行图像分类任务的训练,目前已经支持的模型有:

  • ResNet系列
  • SE-ResNet系列
  • Inception系列
  • Vgg系列
  • MobileNet系列
  • EfficientNet系列
  • DarkNet系列

Benchmark

Model EasyVisionTop1 Acc EasyVisionTop5 Acc
resnet_v1a_18 70.94 89.88
resnet_v1a_34 74.26 91.97
resnet_v1_50 75.20 92.20
resnet_v1a_50 77.34 93.64
resnet_v1b_50 77.52 93.76
resnet_v1c_50 77.90 94.12
resnet_v1d_50 79.01 94.51
resnet_v1_101 76.40 92.89
resnet_v1a_101 78.26 93.97
resnet_v1b_101 79.05 94.60
resnet_v1c_101 79.49 94.74
resnet_v1d_101 80.36 95.04
resnet_v1_152 76.80 93.17
resnet_v1a_152 79.16 94.69
resnet_v1b_152 79.52 94.81
resnet_v1c_152 79.93 94.91
resnet_v1d_152 80.48 95.31
SE-Resnet-v1-50 77.51 93.6
SE-Resnet-v1-101 78.28 94.24
SE-Resnet-v1-152 78.58 94.41
inception-v1 69.8 89.6
inception-v2 73.9 91.8
inception-v3 78.0 93.9
inception-v4 80.2 95.2
mobilenet-v1-1.0_224 70.7 89.5
mobilenet-v2-1.0_224 70.1 89.5
mobilenet-v3-1.0_224 75.4 92.7
efficientnet-b0 0.7750 0.9360
efficientnet-b1 0.7957 0.9437
efficientnet-b2 0.8044 0.9503
efficientnet-b3 0.8188 0.9566
efficientnet-b4 0.8330 0.9640
efficientnet-b5 0.8431 0.9694
efficientnet-b6 0.8477 0.9713
efficientnet-b7 0.8516 0.9725
efficientnet-b8 0.8545 0.8524
darknet53 0.7664 0.9342
cspdarknet53-mish 0.7794 0.9425

2 使用示例

下面我们以使用cifar10数据集,训练resnet_v1d_50模型为例,介绍如何训练一个分类模型

2.1 数据准备

cifar10我们已经提供了转换好的tfrecord, 下载cifar10到 data 文件夹下

ossutil cp -r oss://pai-vision-data-hz/data/cifar10/ data/cifar10

下载resnet50预训练模型到pretrained_models文件夹下

ossutil cp -r oss://pai-vision-data-hz/pretrained_models/resnet_v1d_50/ pretrained_models/resnet_v1d_50

2.2 模型训练

2.2.1 文件配置形式

运行如下python代码即可启动文件配置形式的训练评估流程,样例配置文件参见sample_config,配置文件参数说明参见proto文档。如果你使用了自定义的配置文件,把easy_vision.RESNET50_FINETUNE_PRETRAINED_MODELS_SAMPLE_CONFIG 替换为你的配置文件路径即可。

import easy_vision
easy_vision.train_and_evaluate(easy_vision.RESNET50_FINETUNE_PRETRAINED_MODELS_SAMPLE_CONFIG)

2.2.2 参数配置训练

运行如下python代码即可启动参数配置形式的训练评估流程

import easy_vision
param_config = """
	--model_type Classification
  --backbone  resnet_v1d_50
  --num_classes 10
  --num_epochs 1
  --model_dir experiments/cifar10/resnet50_imagenet_pretrain
  --use_pretrained_model true
  --train_data data/cifar10/cifar10_train_part_*.tfrecord
  --test_data data/cifar10/cifar10_test.tfrecord
  --train_batch_size 96
  --test_batch_size 96
  --image_size 224
  --lr_type manual_step
  --initial_learning_rate 0.001
  --learning_rates 0.0003 0.0001
  --decay_epochs 35 40
  --save_checkpoint_epochs 5
  --staircase true"""
easy_vision.train_and_evaluate_with_param_config(param_config)

param_config 包含若干模型配置参数,格式遵循python argparser格式,各参数具体说明如下,所有字符串均不需要加引号

参数名称
参数描述
参数值格式 默认值
model_type 训练模型类型 字符串,可选范围
Classification
无,必选参数
backbone 识别模型的网络名称 字符串格式,可取值范围:
vgg_16
vgg_19
inception_v1
inception_v2
inception_v3
inception_v4
mobilenet_v1
mobilenet_v2
mobilenet_v3
resnet_v1_50
resnet_v1_101
resnet_v1_152
resnet_v2_50
resnet_v2_101
resnet_v2_152
resnet_v1a_18
resnet_v1a_34
resnet_v1a_50
resnet_v1a_101
resnet_v1a_152
resnet_v1b_50
resnet_v1b_101
resnet_v1b_152
resnet_v1c_50
resnet_v1c_101
resnet_v1c_152
resnet_v1d_50
resnet_v1d_101
resnet_v1d_152
efficientnet-b0
efficientnet-b1
efficientnet-b2
efficientnet-b3
efficientnet-b4
efficientnet-b5
efficientnet-b6
efficientnet-b7
efficientnet-b8
"inception_v4"
weight_decay l2 regularization的大小 浮点 1e-4
num_classes 分类类别数目 整型 无,必选参数
image_size 图片resize后大小 整型 例如224 224
use_crop 是否使用crop进行数据增强 布尔型
true
crop_min_area 随机crop时候需要crop框满足与原图重叠的最小阈值 浮点 0.7
eval_each_category 是否针对每个类别单独做评估 布尔型 false
optimizer 优化方法,其中momentum就是sgd 字符串,可选方法如下:
momentum
adam
momentum
lr_type
学习率调整策略
exponential_decay, 指数衰减,详细参考tf.train.exponential_decay 

polynomial_decay, 多项式衰减,详细参考tf.train.polynomial_decay, 其中num_steps自动设置为总的训练迭代次数,end_learning_rate为initial_learning_rate的千分之一manual_step, 人工指定各阶段的学习率,通过decay_epochs 指定需要调整学习率的迭代轮数,通过learning_rates指定对应迭代轮数使用的学习率

cosine_decay,通过余弦曲线调制学习率变化,最终会降到0。详细参考论文,通过decay_epochs 指定需要调整学习率的迭代轮数
字符串,可选方法如下:
exponential_decay
polynomial_decay
manual_step
cosine_decay
exponential_decay
initial_learning_rate 初始学习率 浮点数 0.01
decay_epochs 如果使用exponential_decay, 参数对应 tf.train.exponential_decay中的decay_steps,后端会自动根据训练数据总数把decay_epochs转换为decay_steps。例如数值可填:10,一般是总epoch数的1/2。

如果使用manual_step, 参数表示需要调整学习率的迭代轮数, "16 18"表示在16epoch 18 epoch对学习率进行调整。一般这两个值取总设置的总epoch的8/10、9/10
整数列表
20 
20 40 60
20
decay_factor tf.train.exponential_decay 中的decay_factor 浮点数 0.95
staircase tf.train.exponential_decay 中的staircase 布尔 true
power tf.train.polynomial_decay 中的power float 0.9
learning_rates manual_step学习率调整策略中使用的参数,表示在指定epoch 学习率调整为多少. 如果您指定的调整epoch有两个,则需要在此也填写两个对应的学习率。例:decay_epoches为20 40,此处填写0.001 0.0001,则代表在20epoch学习率调整为0.001,40epoch学习率调整为0.0001。建议这几次调整的学习率是初始学习率的1/10、1/100、1/1000...... manual_step学习率调整策略中使用的参数,表示在指定epoch 学习率调整为多少 浮点列表
lr_warmup 是否对学习率做warmup 布尔 false
lr_warm_up_epochs 学习率warmup的轮数 浮点型 1
train_data 训练数据文件oss路径 oss://path/to/train_*.tfrecord 无,必选参数
test_data 训练过程中评估数据oss路径 oss://path/to/test_*.tfrecord 无,必选参数
train_batch_size 训练batch_size 整型, 例如32 无,必选参数
test_batch_size 评估batch_size 整型, 例如32 无,必选参数
train_num_readers 训练数据并发读取线程数 整型 4
model_dir 训练所用oss目录 oss://path/to/model 无,必选参数
pretrained_model 预训练模型oss路径,如果提供,会在此模型基础上finetune oss://pai-vision-data-hz/pretrained_models/inception_v4.ckpt ""
use_pretrained_model 是否使用预训练模型 布尔型 true
num_epochs 训练迭代轮数,1表示所有训练数据过了一遍 整型  40 无,必选参数
num_test_example 训练过程中评估数据条目数, -1表示使用所有测试数据集数据 整型,例如2000 可选,默认-1
num_visualizations 评估过程可视化显示的样本数目 整型 10
save_checkpoint_epochs 保存checkpoint的频率,以epoch为单位, 1表示每过一遍训练数据保存一次checkpoint 整型 1
save_summary_epochs 保存summary的频率,以epoch为单位, 0.01 表示每过1%训练数据保存一次summary 浮点 0.01
num_train_images 总的训练样本数,如果使用自己生成的tfrecord需要提供该信息 整型 可选,默认0
label_map_path 类别映射文件,如果使用自己生成的tfrecord需要提供该信息 字符串 可选,默认""