图像识别中的预处理

时间:2019-01-28 03:06:29

标签: python image-processing computer-vision pytorch image-recognition

我是图像识别的初学者,需要一些有关图像预处理的帮助。

  1. 我使用转移学习模型resnet18进行识别工作。我得到: In [3]: pretrainedmodels.pretrained_settings['resnet18'] Out[3]: {'imagenet': {'url': 'https://download.pytorch.org/models/resnet18- 5c106cde.pth', 'input_space': 'RGB', 'input_size': [3, 224, 224], 'input_range': [0, 1], 'mean': [0.485, 0.456, 0.406], 'std': [0.229, 0.224, 0.225], 'num_classes': 1000}}

我发现meanstd与我的图像数据集完全不同。

我应该如何规范火车?使用上面的均值和标准差,还是使用我计算自己的均值和标准差?

  1. 我将数据集分为train_setvalid_settest_set

我有两种方法:

A。计算它们的均值和std并将其分别归一化

B。计算整个数据集的均值和标准差,然后进行归一化。

哪个是对的?

3。我应该何时进行归一化?在data_augmentation之前还是在data_augmentation之后?

1 个答案:

答案 0 :(得分:1)

如果您使用自己的数据集和预先训练的权重训练新模型,则需要为新数据集输入新的均值和标准差。

基本上,您将需要重复ImageNet的操作过程。创建一个脚本来计算整个数据集的常规[mean, std]值。

但是请记住要注意数据集的分布,因为它肯定会影响模型的性能。

然后为您的火车/阀门组单独定义一种变压方法。通常,我们不对测试集进行标准化,因为在现实世界中,您的模型将采用不同种类的数据。构建数据集时,应与其他扩充技术一起执行标准化过程。

例如,考虑这个玩具示例

"transformer": {
    "train": transforms.Compose([
        transforms.Resize(size=299),
        transforms.RandomHorizontalFlip(p=0.2),
        transforms.ToTensor(),
        transforms.Normalize(new_mean, new_std)
    ]),
    "valid": transforms.Compose([
        transforms.Resize(size=299),
        transforms.ToTensor(),
    ])
}

train_ds = CustomDataset(type="train", transformer=transformer["train"])
valid_ds = CustomDataset(type="valid", transformer=transformer["valid"])

让我知道您是否还有困惑