Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 22 additions & 4 deletions model_cnn.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,19 +10,37 @@
np.random.seed(1337) # for reproducibility

batch_size = 32
nb_epoch = 1
nb_epoch = 50

# tested delims
# delims = [60, 55, 45, 45, 55, 60]
# delims = [90, 70, 70, 90]
delims = [120, 80, 120]
# delims = None

classes = 10

if delims is not None:
classes = len(delims)

# eigenvalues & eigenvectors for plzen dataset
einval = np.array([0.91650828, 0.0733283, 0.04866549])
vec = np.array([[-0.5448285, 0.82209843, 0.16527574],
[-0.60238846, -0.24659869, -0.75915561],
[-0.58334386, -0.51316981, 0.6295766]])

X_train, y_train = utils.load_augmented_dataset('./plzen/train', einval, vec)
X_test, y_test = utils.load_augmented_dataset('./plzen/test', einval, vec)
X_train, y_train = utils.load_augmented_dataset('./plzen/train', einval, vec,
classes=classes, delims=delims)
X_test, y_test = utils.load_augmented_dataset('./plzen/test', einval, vec,
classes=classes, delims=delims)
print("Dataset loaded X shape: {}, y shape: {}".format(X_train.shape,
y_train.shape))
_, y = np.nonzero(y_train)
print(np.histogram(y, bins=range(classes + 1)))

_, y = np.nonzero(y_test)
print(np.histogram(y, bins=range(classes + 1)))

utils.show_dataset_samples(X_train, y_train)

model = Sequential()
Expand Down Expand Up @@ -52,7 +70,7 @@
model.add(Activation('relu'))
model.add(Dropout(0.5))

model.add(Dense(11))
model.add(Dense(classes + 1))
model.add(Activation('softmax'))

adam = Adam(lr=0.001)
Expand Down
28 changes: 18 additions & 10 deletions utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,13 +26,20 @@ def xml_to_numpy(filename):
return np.asarray(cv.cv.Load(filename)) * 255


def mask_to_proba(mask, classes=10, type='sum'):
def mask_to_proba(mask, classes=10, type='sum', delims=None):
h, w = mask.shape
w_per_class = w // classes
counts = []
for c in range(classes):
selection = mask[0:h, c*w_per_class:(c+1)*w_per_class]
counts.append(np.count_nonzero(selection))
if delims is None:
for c in range(classes):
selection = mask[0:h, c*w_per_class:(c+1)*w_per_class]
counts.append(np.count_nonzero(selection))
else:
i = 0
for d in delims:
selection = mask[0:h, i:i+d]
counts.append(np.count_nonzero(selection))
i += d

counts = np.asarray(counts)
sum = float(np.sum(counts))
Expand Down Expand Up @@ -65,11 +72,11 @@ def visualize_mask(image, mask):
return cv.bitwise_and(image, image, mask=mask)


def load_image_for_dataset(filename):
def load_image_for_dataset(filename, classes=10, delims=None):
trn_filename = '{}.trn'.format(filename)
img = cv.imread(filename)
mask = trn_to_numpy(trn_filename)
proba = mask_to_proba(mask)
proba = mask_to_proba(mask, classes=classes, delims=delims)
cls = np.argmax(proba) if np.max(proba) != 0 else -1
return {
"img": img,
Expand Down Expand Up @@ -144,15 +151,16 @@ def dataset_from_folder(folder, img_ext='.png', mask_ext='.trn'):


def load_augmented_dataset(folder, eigenval, eigenvectors,
img_ext='.png', mask_ext='.trn'):
img_ext='.png', mask_ext='.trn', delims=None,
classes=10):
X = []
y = []
glob_selector = '{}/*{}'.format(folder, img_ext)
for file in glob.glob(glob_selector):
mask_filename = '{}{}'.format(file, mask_ext)
if not os.path.exists(mask_filename):
continue
arr = load_image_for_dataset(file)
arr = load_image_for_dataset(file, delims=delims, classes=classes)
arr['img'] = cv.resize(arr['img'], (240, 240))
gray_im = cv.cvtColor(arr['img'], cv.COLOR_BGR2GRAY)
blur_amount = cv.Laplacian(gray_im, cv.CV_64F).var() / 1000.0
Expand All @@ -167,9 +175,9 @@ def load_augmented_dataset(folder, eigenval, eigenvectors,
X.append((pca_im).T)
# horizontaly fliped imaged
X.append((cv.flip(arr['img'], 1)/255.0).T)
c = np.zeros(11)
c = np.zeros(classes)
if arr['cls'] == -1:
c[10] == -1
c[classes - 1] = 1
else:
c[arr['cls']] = 1
for i in range(4):
Expand Down