【tensorflow】关于Slim的预处理对预训练模型pretrained model测试的影响
前言
Imgaenet上的预训练模型可以为我们自己训练或者fine-tune带来很大的便利,但是在加载这些模型的时候,通常要对输入图像进行预处理。然而,模型的预处理形式不尽相同。这里主要概括下tensorflow中slim的pretrained model所要求的图像预处理。
preprocessing_fn_map
preprocessing_fn_map = {
'cifarnet': cifarnet_preprocessing,
'inception': inception_preprocessing,
'inception_v1': inception_preprocessing,
'inception_v2': inception_preprocessing,
'inception_v3': inception_preprocessing,
'inception_v4': inception_preprocessing,
'inception_resnet_v2': inception_preprocessing,
'lenet': lenet_preprocessing,
'mobilenet_v1': inception_preprocessing,
'mobilenet_v2': inception_preprocessing,
'mobilenet_v2_035': inception_preprocessing,
'mobilenet_v2_140': inception_preprocessing,
'nasnet_mobile': inception_preprocessing,
'nasnet_large': inception_preprocessing,
'pnasnet_mobile': inception_preprocessing,
'pnasnet_large': inception_preprocessing,
'resnet_v1_50': vgg_preprocessing,
'resnet_v1_101': vgg_preprocessing,
'resnet_v1_152': vgg_preprocessing,
'resnet_v1_200': vgg_preprocessing,
'resnet_v2_50': vgg_preprocessing,
'resnet_v2_101': vgg_preprocessing,
'resnet_v2_152': vgg_preprocessing,
'resnet_v2_200': vgg_preprocessing,
'vgg': vgg_preprocessing,
'vgg_a': vgg_preprocessing,
'vgg_16': vgg_preprocessing,
'vgg_19': vgg_preprocessing,
}
可以看到用的最多的则是inception_preprocessing和vgg_preprocessing。
一、inception_preprocessing:
该种训练方法一共有两种形式,
-
面向训练的预处理形式,
- 将像素值转换到[0, 1]区间内。
- 根据一定的规则获取原始图片上一个切片。
- 对切片进行resize。
- 对图像进行变换(从亮度、对比度、色相、饱和度四个方面进行随机变换)。
- 将像素值转换到[-1, 1]区间内
-
面向测试的预处理形式
- 将像素值转换到[0, 1]区间内。
- 中心切片。
- resize图片。
- 将像素值转换到[-1, 1]区间内。
二、vgg_preprocessing:
该种训练方法也存在着两种形式,
- 面向训练的预处理形式,
- 随机获取短边长度在[256, 512]这个范围中,等比例resize图片。
- 随机水平镜像
- 随机获取224x224的切片
- 减去ImageNet训练集的RGB均值
- 面向测试的预处理形式
- 给定短边长度为256,等比例resize图片。
- 中心切片裁出来224x224的大小图像
- 减去ImageNet训练集的RGB均值
实验部分
我对两组预处理方法在模型测试过程中进行了两组实验。
1、针对Inception_preprocess模型预处理,以inceptionv3为例:
方法一:slim函数自带的inception预处理算法
我们可以看到预测值为0.855
方法二:直接将图像归一化为【-1,1】
此时的prob为0.974。
从这一张图像来说,采取直接对图像进行归一化的结果要比Slim自带的结果要好
2、针对vgg_preprocess模型预处理,以ResNet50 v1为例:
方法一:slim函数自带的vgg预处理算法
方法二:将图像减去ImageNet均值
从这一张图像来说,ResNet50采取直接对图像进行预处理的结果要比Slim自带的结果要好
其他:
关于这两个slim的预处理的源代码:
https://github.com/tensorflow/models/tree/master/research/slim/preprocessing