-
Notifications
You must be signed in to change notification settings - Fork 0
/
build_features.py
109 lines (94 loc) · 4.04 KB
/
build_features.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
#-----------------------------------------------------------------------------------------------------------------------
# Project: resnet-finetune-demo
# Filename: build_features.py
# Date: 16.06.2017
# Author: Adam Brzeski - CTA.ai
#-----------------------------------------------------------------------------------------------------------------------
"""
Builds cached Resnet features for train, val and test subsets of Indoor-67 dataset. Cached features are saved to disk
as numpy arrays. Except features, labels infered from paths and paths itself are also saved.
In short, script will create 3 files in each subset directory (train, val, test):
- features-resnet152.npy
- labels-resnet152.npy
- paths-resnet152.json
"""
import glob
import json
import os
import numpy as np
import skimage.io
from keras.models import Model
import helper
from resnet import resnet152
import matplotlib.pyplot as plt
DATA_SUBSETS = [
os.path.expanduser("~/ml/data/indoor/train"),
os.path.expanduser("~/ml/data/indoor/val"),
os.path.expanduser("~/ml/data/indoor/test"),
]
FEATURES_FILENAME = "features-resnet152-better-fillup.npy"
LABELS_FILENAME = "labels-resnet152-better-fillup.npy"
PATHS_FILENAME = "paths-resnet152.json"
WEIGHTS_RESNET = os.path.expanduser("~/ml/models/keras/resnet152/resnet152_weights_tf.h5")
NAMES_TO_IDS = json.load(open("names_to_ids.json"))
# Load Resnet 152 model and construct feature extraction submodel
resnet_model = resnet152.resnet152_model(WEIGHTS_RESNET)
feature_layer = 'avg_pool'
features_model = Model(inputs=resnet_model.input,
outputs=resnet_model.get_layer(feature_layer).output)
def saliency_queue(img,size,scale):
output=[]
h,w = np.shape(img)
for i in range(h/size):
for j in range(w/size):
output.append((np.sum(scale*img[size*i:size*i+size,size*j:size*j+size]),(size*i,size*j)))
return sorted(output,key=lambda x:x[0],reverse=True)
# For each data subset
for datadir in DATA_SUBSETS:
features = []
labels = []
paths = []
images_list = glob.glob(datadir + "/*/*.jpg")
print len(images_list)
# Process images
for index, path in enumerate(images_list):
try:
looks = np.zeros((9,2048))
# Load image
im = skimage.io.imread(path)
im = skimage.transform.resize(im, (224, 224), mode='constant').astype(np.float32)
# plt.figure()
# plt.imshow(im)
# plt.show()
im = np.expand_dims(im, axis=0)
s_path = "/home/csweeney/images_test/saliency/"+path.split("/")[-1]
image = skimage.io.imread(s_path)
image = skimage.transform.resize(image,(224,224))
size=75
imgs = saliency_queue(image,size,scale =1)
a = skimage.filters.gaussian(im[0,:,:,:], sigma=10, multichannel=True)
for i,j in enumerate(imgs[:9]):
#a = skimage.filters.gaussian(im, sigma=10, multichannel=True)
#a = np.zeros((1,224,224,3))
a[j[1][0]:j[1][0]+size,j[1][1]:j[1][1]+size,:] = im[0,j[1][0]:j[1][0]+size,j[1][1]:j[1][1]+size,:]
# plt.figure()
# plt.imshow(a[0,:,:,:])
# plt.show()
a = helper.preprocess(a)
looks[i,:] = features_model.predict(a).flatten()
# Cache result
label = NAMES_TO_IDS[os.path.basename(os.path.dirname(path))]
labels.append(label)
features.append(looks)
rel_path = os.path.join(*path.split(os.sep)[-2:]).replace("\\", "/")
paths.append(rel_path)
# Show progress
if index % 100 == 0:
print(index, "/", len(images_list))
except Exception as e:
print("Error processing path {}: {}".format(path, e))
# Save to disk
np.save(os.path.join(datadir, FEATURES_FILENAME), features)
np.save(os.path.join(datadir, LABELS_FILENAME), np.uint8(labels))
with open(os.path.join(datadir, PATHS_FILENAME), mode='w') as f:
json.dump(paths, f, indent=4)