現在ImageNetを用いて機械学習を試みています。
フレームワークとしてはPyTorchを使用しています。
1枚目の画像は
IMAGENET_SIZE = 224 IMAGENET_TRANSFORM = trans.Compose([ trans.Scale(256), trans.CenterCrop(224), trans.ToTensor(), ])
の変換を行なって表示したものです。
二枚目は
上のものに
IMAGENET_MEAN = [0.485, 0.456, 0.406] IMAGENET_STD = [0.229, 0.224, 0.225] trans.Normalize(IMAGENET_MEAN, IMAGENET_STD)
という正規化を施し、
x = x.mul(torch.FloatTensor(tools.IMAGENET_STD).view(3,1,1)) x = x.add(torch.FloatTensor(tools.IMAGENET_MEAN).view(3,1,1)).detach().numpy() x = np.transpose( x , (1,2,0)) x = np.clip(x, 0, 1)
で、正規化を元に戻したつもりなのですが、見ての通りうまく戻せていませんでした。
現在pytorch経由でdownloadできなかったため、ほとんどcopyですが、自作しています。以下に添付しておきます。
質問としては、どうすれば正規化したものを元に戻せるのでしょうか?
python
1from __future__ import print_function, division 2import numpy as np 3import requests, io 4from skimage import io, transform 5import os 6import torch 7import pandas as pd 8from skimage import io, transform 9import numpy as np 10from PIL import Image 11import scipy.io 12from torch.utils.data import Dataset, DataLoader 13from torchvision import transforms, utils 14 15# Ignore warnings 16import warnings 17warnings.filterwarnings("ignore") 18 19def parse_meta(root): 20 meta = scipy.io.loadmat(root + "/data/meta.mat") 21 original_idx_to_synset = {} 22 synset_to_name = {} 23 24 for i in range(1000): 25 ilsvrc2012_id = int(meta["synsets"][i,0][0][0][0]) 26 synset = meta["synsets"][i,0][1][0] 27 name = meta["synsets"][i,0][2][0] 28 original_idx_to_synset[ilsvrc2012_id] = synset 29 synset_to_name[synset] = name 30 31 synset_to_keras_idx = {} 32 keras_idx_to_name = {} 33 f = open(root + "/data/synset_words.txt","r") 34 idx = 0 35 for line in f: 36 parts = line.split(" ") 37 synset_to_keras_idx[parts[0]] = idx 38 keras_idx_to_name[idx] = " ".join(parts[1:]) 39 idx += 1 40 f.close() 41 def convert_original_idx_to_keras_idx(idx): 42 return synset_to_keras_idx[original_idx_to_synset[idx]] 43 f = open(root + "/data/ILSVRC2012_validation_ground_truth.txt", "r") 44 y_val = f.read().strip().split("\n") 45 y_val = list(map(int, y_val)) 46 y_val = np.array([convert_original_idx_to_keras_idx(idx) for idx in y_val]) 47 f.close() 48 return y_val 49 50def get_labelname_list(): 51 y_val = parse_meta('/home/kazuki/workspace/simple-blackbox-attack/image_net/') 52 labels_link = "https://savan77.github.io/blog/files/labels.json" 53 labels_json = requests.get(labels_link).json() 54 labels_name = {int(idx):label for idx, label in labels_json.items()} 55 return labels_name 56 57class ImageNetVal(torch.utils.data.Dataset): 58 def __init__(self, root, transform=None): 59 self.root = root 60 self.transform = transform 61 62 self.fns = os.listdir(os.path.join(self.root + "/val/images")) 63 self.fns.sort() 64 self.fns = [ 65 self.root + "val/images/" + fn for fn in self.fns 66 ] 67 68 self.labels = parse_meta(self.root) 69 labels_link = "https://savan77.github.io/blog/files/labels.json" 70 labels_json = requests.get(labels_link).json() 71 self.labels_name = {int(idx):label for idx, label in labels_json.items()} 72 73 74 def __getitem__(self, idx): 75 if torch.is_tensor(idx): 76 idx = idx.tolist() 77 78 img_name = self.fns[idx] 79 img = Image.open(img_name).convert('RGB') 80 81 label = self.labels[idx] 82 83 if self.transform: 84 img = self.transform(img) 85 86 sample = {'image' : img, 'label' : label} 87 return img, label 88 89 def __len__(self): 90 return len(self.fns) 91
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/12/30 18:16