import tensorflow as tf
import numpy as np
import PIL
import cv2
import os
import sklearn
import pandas as pd
import pickle
import platform
from tqdm.notebook import tqdm
from sklearn.multiclass import OneVsOneClassifier
from sklearn import preprocessing
from sklearn import svm
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
from scipy import stats as st10 Homework4: Problem 6.12
10.0.1 Libraries
10.0.2 Computational Environment
physical_devices = tf.config.list_physical_devices('GPU')
my_system = platform.uname()
print(physical_devices)
print(f"System: {my_system.system}")
print(f"Node Name: {my_system.node}")
print(f"Release: {my_system.release}")
print(f"Version: {my_system.version}")
print(f"Machine: {my_system.machine}")
print(f"Processor: {my_system.processor}")[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU')]
System: Darwin
Node Name: client-10-229-179-166.tamulink.tamu.edu
Release: 21.5.0
Version: Darwin Kernel Version 21.5.0: Tue Apr 26 21:08:29 PDT 2022; root:xnu-8020.121.3~4/RELEASE_ARM64_T8101
Machine: arm64
Processor: i386
10.0.3 Helper function
def load_image(path, width=484, preprocess_input=tf.keras.applications.vgg16.preprocess_input):
"""
Load and Preprocessing image
"""
img = tf.keras.utils.load_img(path)
x = tf.keras.utils.img_to_array(img)
x = x[0:width,:,:]
x = np.expand_dims(x, axis=0)
return tf.keras.applications.vgg16.preprocess_input(x)10.0.4 Data inspectation
dpath = os.path.join("data", "CMU-UHCS_Dataset")
pic_path = os.path.join(dpath, "images")
df_micro = pd.read_csv( os.path.join(dpath, "micrograph.csv"))
df_micro = df_micro[["path", "primary_microconstituent"]]
for i in range(0, len(df_micro)):
img_ph = os.path.join(pic_path,df_micro.iloc[i][0])
assert os.path.exists(img_ph)
df_micro.iloc[i][0] = img_ph
df_micro2 = df_micro.copy()
CLS_rm = ["pearlite+widmanstatten", "martensite", "pearlite+spheroidite"] #(type, sample size)for c in CLS_rm:
df_micro.drop(df_micro[df_micro["primary_microconstituent"] == c].index, inplace=True)# labels
name_lbs = df_micro["primary_microconstituent"].unique()
le = preprocessing.LabelEncoder()
le.fit(name_lbs)
list(le.classes_)['network', 'pearlite', 'spheroidite', 'spheroidite+widmanstatten']
dlabel = le.transform(df_micro["primary_microconstituent"])
df_micro.insert(2, "label", dlabel)
df_micro| path | primary_microconstituent | label | |
|---|---|---|---|
| 0 | data/CMU-UHCS_Dataset/images/micrograph1.tif | pearlite | 1 |
| 1 | data/CMU-UHCS_Dataset/images/micrograph2.tif | spheroidite | 2 |
| 3 | data/CMU-UHCS_Dataset/images/micrograph5.tif | pearlite | 1 |
| 4 | data/CMU-UHCS_Dataset/images/micrograph6.tif | spheroidite | 2 |
| 5 | data/CMU-UHCS_Dataset/images/micrograph7.tif | spheroidite+widmanstatten | 3 |
| ... | ... | ... | ... |
| 955 | data/CMU-UHCS_Dataset/images/micrograph1722.tif | spheroidite | 2 |
| 957 | data/CMU-UHCS_Dataset/images/micrograph1726.tif | spheroidite+widmanstatten | 3 |
| 958 | data/CMU-UHCS_Dataset/images/micrograph1730.png | spheroidite | 2 |
| 959 | data/CMU-UHCS_Dataset/images/micrograph1731.tif | pearlite | 1 |
| 960 | data/CMU-UHCS_Dataset/images/micrograph1732.tif | pearlite | 1 |
791 rows × 3 columns
10.0.5 Data Processing
# Train-test split
df_test = df_micro.copy()
df_train = pd.DataFrame(columns = df_micro.keys())
split_info = [("spheroidite", 100),\
("network", 100),\
("pearlite", 100),\
("spheroidite+widmanstatten", 60)] #(type, sample size)
for ln in split_info:
label, n = ln
id_train = df_micro[df_micro["primary_microconstituent"] == label][0:n].index
df_test.drop(id_train, axis=0, inplace=True)
df_train = pd.concat([df_train, df_micro.loc[id_train]])df_train| path | primary_microconstituent | label | |
|---|---|---|---|
| 1 | data/CMU-UHCS_Dataset/images/micrograph2.tif | spheroidite | 2 |
| 4 | data/CMU-UHCS_Dataset/images/micrograph6.tif | spheroidite | 2 |
| 8 | data/CMU-UHCS_Dataset/images/micrograph10.png | spheroidite | 2 |
| 9 | data/CMU-UHCS_Dataset/images/micrograph11.tif | spheroidite | 2 |
| 20 | data/CMU-UHCS_Dataset/images/micrograph29.tif | spheroidite | 2 |
| ... | ... | ... | ... |
| 596 | data/CMU-UHCS_Dataset/images/micrograph1093.tif | spheroidite+widmanstatten | 3 |
| 618 | data/CMU-UHCS_Dataset/images/micrograph1129.tif | spheroidite+widmanstatten | 3 |
| 631 | data/CMU-UHCS_Dataset/images/micrograph1156.tif | spheroidite+widmanstatten | 3 |
| 672 | data/CMU-UHCS_Dataset/images/micrograph1218.tif | spheroidite+widmanstatten | 3 |
| 673 | data/CMU-UHCS_Dataset/images/micrograph1219.tif | spheroidite+widmanstatten | 3 |
360 rows × 3 columns
df_test| path | primary_microconstituent | label | |
|---|---|---|---|
| 237 | data/CMU-UHCS_Dataset/images/micrograph436.png | spheroidite | 2 |
| 238 | data/CMU-UHCS_Dataset/images/micrograph437.tif | spheroidite | 2 |
| 239 | data/CMU-UHCS_Dataset/images/micrograph440.png | spheroidite | 2 |
| 241 | data/CMU-UHCS_Dataset/images/micrograph442.tif | spheroidite | 2 |
| 242 | data/CMU-UHCS_Dataset/images/micrograph443.tif | spheroidite | 2 |
| ... | ... | ... | ... |
| 955 | data/CMU-UHCS_Dataset/images/micrograph1722.tif | spheroidite | 2 |
| 957 | data/CMU-UHCS_Dataset/images/micrograph1726.tif | spheroidite+widmanstatten | 3 |
| 958 | data/CMU-UHCS_Dataset/images/micrograph1730.png | spheroidite | 2 |
| 959 | data/CMU-UHCS_Dataset/images/micrograph1731.tif | pearlite | 1 |
| 960 | data/CMU-UHCS_Dataset/images/micrograph1732.tif | pearlite | 1 |
431 rows × 3 columns
10.0.6 Feature Extraction
# VGG16
base_model = tf.keras.applications.vgg16.VGG16(
include_top=False,
weights='imagenet',
input_tensor=None,
input_shape=None,
pooling=None,
classes=1000,
classifier_activation='softmax'
)
base_model.summary()Model: "vgg16"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
input_1 (InputLayer) [(None, None, None, 3)] 0
block1_conv1 (Conv2D) (None, None, None, 64) 1792
block1_conv2 (Conv2D) (None, None, None, 64) 36928
block1_pool (MaxPooling2D) (None, None, None, 64) 0
block2_conv1 (Conv2D) (None, None, None, 128) 73856
block2_conv2 (Conv2D) (None, None, None, 128) 147584
block2_pool (MaxPooling2D) (None, None, None, 128) 0
block3_conv1 (Conv2D) (None, None, None, 256) 295168
block3_conv2 (Conv2D) (None, None, None, 256) 590080
block3_conv3 (Conv2D) (None, None, None, 256) 590080
block3_pool (MaxPooling2D) (None, None, None, 256) 0
block4_conv1 (Conv2D) (None, None, None, 512) 1180160
block4_conv2 (Conv2D) (None, None, None, 512) 2359808
block4_conv3 (Conv2D) (None, None, None, 512) 2359808
block4_pool (MaxPooling2D) (None, None, None, 512) 0
block5_conv1 (Conv2D) (None, None, None, 512) 2359808
block5_conv2 (Conv2D) (None, None, None, 512) 2359808
block5_conv3 (Conv2D) (None, None, None, 512) 2359808
block5_pool (MaxPooling2D) (None, None, None, 512) 0
=================================================================
Total params: 14,714,688
Trainable params: 14,714,688
Non-trainable params: 0
_________________________________________________________________
Use five layers
out_layer_ns = ["block{}_pool".format(i) for i in range(1,6)]
out_layer_ns['block1_pool', 'block2_pool', 'block3_pool', 'block4_pool', 'block5_pool']
# Construct 5 models for feature extraction
extmodel = dict(zip(out_layer_ns, [tf.keras.Model(
inputs= base_model.input,
outputs=base_model.get_layer(bk_name).output
) for bk_name in out_layer_ns]))
extmodel{'block1_pool': <keras.engine.functional.Functional at 0x2a7861070>,
'block2_pool': <keras.engine.functional.Functional at 0x16f7c2070>,
'block3_pool': <keras.engine.functional.Functional at 0x2a785cd90>,
'block4_pool': <keras.engine.functional.Functional at 0x2a7855280>,
'block5_pool': <keras.engine.functional.Functional at 0x2a7847190>}
# Display output dimensions
out_shapes = [extmodel[m].output_shape[-1] for m in extmodel.keys()]
out_shapes[64, 128, 256, 512, 512]
# Initiate feature maps for testing and training
fs_train = [np.zeros((df_train.shape[0], n_f)) for n_f in out_shapes]
fs_test = [np.zeros((df_test.shape[0], n_f)) for n_f in out_shapes]
features_train = dict(zip(out_layer_ns, fs_train))
features_test = dict(zip(out_layer_ns, fs_test))
features_train{'block1_pool': array([[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
...,
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.]]),
'block2_pool': array([[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
...,
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.]]),
'block3_pool': array([[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
...,
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.]]),
'block4_pool': array([[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
...,
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.]]),
'block5_pool': array([[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
...,
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.]])}
# Feature extraction with VGG16
#save file
paths = dict(zip(["train", "test"],\
[os.path.join(dpath, "feature_{}.pkl".format(n))\
for n in ["train", "test"]]))
#if os.path.exists(os.path.join(dpath, "feature_train.pkl")) == False:
for m in tqdm(extmodel.keys()):
for i, df in enumerate([df_train, df_test]):
for j, ph in tqdm(enumerate(df["path"])):
x = load_image(ph)
xb = extmodel[m].predict(x, verbose = 0) # silence output
F = np.mean(xb,axis=(0,1,2))
# Save features
if i ==0:
features_train[m][j, :] = F
else:
features_test[m][j, :] = F
## Create new files
f_train = open(paths["train"], "wb")
f_test = open(paths["test"], "wb")
## Write
pickle.dump(features_train, f_train)
pickle.dump(features_test, f_test)
## Close files
f_train.close()
f_test.close()10.0.7 SVM
# load data
ftn = open(paths["train"], "rb")
ftt = open(paths["test"], "rb")
featn = pickle.load(ftn) # train feature
featt = pickle.load(ftt) # test feature
ftn.close()
ftt.close()
# label
ltrain = df_train[["primary_microconstituent", "label"]].reset_index()
ltest = df_test[["primary_microconstituent", "label"]].reset_index()ltrain| index | primary_microconstituent | label | |
|---|---|---|---|
| 0 | 1 | spheroidite | 2 |
| 1 | 4 | spheroidite | 2 |
| 2 | 8 | spheroidite | 2 |
| 3 | 9 | spheroidite | 2 |
| 4 | 20 | spheroidite | 2 |
| ... | ... | ... | ... |
| 355 | 596 | spheroidite+widmanstatten | 3 |
| 356 | 618 | spheroidite+widmanstatten | 3 |
| 357 | 631 | spheroidite+widmanstatten | 3 |
| 358 | 672 | spheroidite+widmanstatten | 3 |
| 359 | 673 | spheroidite+widmanstatten | 3 |
360 rows × 3 columns
10.0.7.1 One-to-One SVM
class One2OneSVM:
def __init__(self, n_class=4):
self.n_class = n_class
self.clfs_list = [svm.SVC(kernel="rbf", C=1., gamma="auto")\
for i in range(0,self.n_class*self.n_class)]
self.clfs = [[self.clfs_list[self.n_class*i + j]\
for i in range(0,self.n_class)]\
for j in range(0,self.n_class)]
self.cv = np.zeros((self.n_class,self.n_class))
def train(self, ltrain, feature, fold=10):
# traversal all features
for i in range(0, self.n_class-1):
lis = ltrain[ltrain["label"] == i].index.to_numpy()
for j in range(i+1, self.n_class):
ljs = ltrain[ltrain["label"] == j].index.to_numpy()
# Data
X = np.concatenate(\
(feature[lis,:],\
feature[ljs,:]), axis=0)
Y = np.concatenate((np.ones(len(lis))*i,np.ones(len(ljs))*j))
# Train SVM
scores = sklearn.model_selection.cross_val_score\
(self.clfs[i][j], X, Y, cv=fold)
self.clfs[i][j].fit(X,Y)
self.cv[i][j] = 1 - np.max(scores)
def test_1v1_error(self, ltest, feature):
# traversal all features
errM = np.zeros((self.n_class, self.n_class))
for i in range(0, self.n_class-1):
lis = ltest[ltest["label"] == i].index.to_numpy()
for j in range(i+1, self.n_class):
ljs = ltest[ltest["label"] == j].index.to_numpy()
# Data
X = np.concatenate(\
(feature[lis,:],\
feature[ljs,:]), axis=0)
Y = np.concatenate((np.ones(len(lis))*i,np.ones(len(ljs))*j))
# Train SVM
y_pred = self.clfs[i][j].predict(X)
errM[i,j] = error(Y, y_pred)
return errM
def predict(self, feature):
predM = np.zeros(( int(self.n_class * (self.n_class -1)/2) , feature.shape[0]))
c = 0
for i in range(0, self.n_class-1):
for j in range(i+1, self.n_class):
predM[c,:] = self.clfs[i][j].predict(feature)
c += 1
return st.mode(predM, axis=0, keepdims=True).mode[0,:] #majority voting
def error(ans, pred):
assert len(ans) == len(pred)
return (ans != pred).sum()/float(ans.size)10.0.8 (a)
The convolution layer used and the cross-validated error estimate for each of the six pairwise two-label classifiers
The cross-validation error of pairwise two-label classifiers given convolution layer is shown in the following table.
10.0.9 (b)
Separate test error rates on the unused micrographs of each of the four categories, for the pairwise two-label classifiers and the multilabel one-vs-one voting classifier described previously. For the pairwise classifiers use only the test micrographs with the two labels used to train the classifier. For the multilabel classifier, use the test micrographs with the corresponding four labels.
The empirical test error with unseen dataset is shown in the following table. The pairwise classifier was tested by the labels same as their training set. On the other hand, the multilable classifier is tested with fully four corresonding four labels.
def df_cv(m, clf, info=""):
var1 = []
var2 = []
cvs = []
errs = []
for i in range(0, m.shape[0]-1):
for j in range(i+1, m.shape[0]):
var1.append(i)
var2.append(j)
cvs.append(clf.cv[i,j])
errs.append(m[i,j])
infos = [info] * len(errs)
return pd.DataFrame({"Info": infos, "Label 1": var1, "Label 2": var2, "Test error": errs,"Cross Validation Error": cvs})10.0.9.1 Pair-wise classifier
The final block performs best in cross validatoin score.
df_errors = []
for b in out_layer_ns:
clf1 = One2OneSVM()
clf1.train(ltrain, features_train[b])
errs = clf1.test_1v1_error(ltest, features_test[b])
df_errors.append(df_cv(errs, clf1, b))
res_error = pd.concat(df_errors)
res_error| Info | Label 1 | Label 2 | Test error | Cross Validation Error | |
|---|---|---|---|---|---|
| 0 | block1_pool | 0 | 1 | 0.823529 | 0.500 |
| 1 | block1_pool | 0 | 2 | 0.290155 | 0.450 |
| 2 | block1_pool | 0 | 3 | 0.157895 | 0.375 |
| 3 | block1_pool | 1 | 2 | 0.906040 | 0.500 |
| 4 | block1_pool | 1 | 3 | 0.466667 | 0.375 |
| 5 | block1_pool | 2 | 3 | 0.071186 | 0.375 |
| 0 | block2_pool | 0 | 1 | 0.823529 | 0.350 |
| 1 | block2_pool | 0 | 2 | 0.709845 | 0.350 |
| 2 | block2_pool | 0 | 3 | 0.157895 | 0.375 |
| 3 | block2_pool | 1 | 2 | 0.919463 | 0.500 |
| 4 | block2_pool | 1 | 3 | 0.466667 | 0.375 |
| 5 | block2_pool | 2 | 3 | 0.071186 | 0.375 |
| 0 | block3_pool | 0 | 1 | 0.823529 | 0.400 |
| 1 | block3_pool | 0 | 2 | 0.290155 | 0.400 |
| 2 | block3_pool | 0 | 3 | 0.157895 | 0.375 |
| 3 | block3_pool | 1 | 2 | 0.080537 | 0.450 |
| 4 | block3_pool | 1 | 3 | 0.466667 | 0.375 |
| 5 | block3_pool | 2 | 3 | 0.071186 | 0.375 |
| 0 | block4_pool | 0 | 1 | 0.823529 | 0.500 |
| 1 | block4_pool | 0 | 2 | 0.290155 | 0.450 |
| 2 | block4_pool | 0 | 3 | 0.157895 | 0.375 |
| 3 | block4_pool | 1 | 2 | 0.080537 | 0.500 |
| 4 | block4_pool | 1 | 3 | 0.466667 | 0.375 |
| 5 | block4_pool | 2 | 3 | 0.071186 | 0.375 |
| 0 | block5_pool | 0 | 1 | 0.073529 | 0.000 |
| 1 | block5_pool | 0 | 2 | 0.033679 | 0.000 |
| 2 | block5_pool | 0 | 3 | 0.060150 | 0.000 |
| 3 | block5_pool | 1 | 2 | 0.000000 | 0.000 |
| 4 | block5_pool | 1 | 3 | 0.088889 | 0.000 |
| 5 | block5_pool | 2 | 3 | 0.061017 | 0.125 |
10.0.9.2 Multiple one-vs-one classifier
# Multiclass one-vs-one
dfm_errors = []
for b in out_layer_ns:
clf = OneVsOneClassifier(svm.SVC(kernel="rbf", C=1., gamma="auto").fit(features_train[b],\
ltrain["label"].to_numpy(int)))
clf.fit(features_train[b],\
ltrain["label"].to_numpy(int))
y_predm = clf.predict(features_test[b])
dfm_errors.append(error(y_predm, ltest["label"].to_numpy()))
# Display result
res_multi1v1 = pd.DataFrame({"Multiple One-Vs-One Classifier": out_layer_ns, "Test Error": dfm_errors})
res_multi1v1| Multiple One-Vs-One Classifier | Test Error | |
|---|---|---|
| 0 | block1_pool | 0.935035 |
| 1 | block2_pool | 0.944316 |
| 2 | block3_pool | 0.364269 |
| 3 | block4_pool | 0.364269 |
| 4 | block5_pool | 0.071926 |
10.0.10 (c)
For the mixed pearlite + spheroidite test micrographs, apply the trained pairwise classifier for pearlite vs. spheroidite and the multilabel voting classifier. Print the predicted labels by these two classifiers side by side (one row for each test micrograph). Comment your results
The pairwise SVM classifier performs better than Multiclass one-to-one classifier. Because the pairwise SVM is specialized for the binary problem and not be interfered with other classification setting.
ltestm = ltest[(ltest["primary_microconstituent"] == "pearlite") |\
(ltest["primary_microconstituent"] == "spheroidite")]
feature_m = features_test["block5_pool"][ltestm.index.to_numpy(), :]
l = le.transform(["pearlite", "spheroidite"])
pred_pairs = clf1.clfs[l[0]][l[1]].predict(feature_m)
pred_multi = clf.predict(feature_m)
res_ps = pd.DataFrame({"Test Label": le.inverse_transform(ltestm["label"]),\
"Pairwise (pearlite vs. spheroidite)": le.inverse_transform(pred_pairs.astype(int)),\
"Multi-OnevsOne": le.inverse_transform(pred_multi)})
print(res_ps.to_string()) Test Label Pairwise (pearlite vs. spheroidite) Multi-OnevsOne
0 spheroidite spheroidite spheroidite
1 spheroidite spheroidite spheroidite
2 spheroidite spheroidite spheroidite
3 spheroidite spheroidite spheroidite
4 spheroidite spheroidite spheroidite
5 spheroidite spheroidite spheroidite
6 spheroidite spheroidite spheroidite
7 spheroidite spheroidite spheroidite
8 spheroidite spheroidite spheroidite
9 spheroidite spheroidite spheroidite
10 spheroidite spheroidite spheroidite
11 spheroidite spheroidite spheroidite
12 spheroidite spheroidite spheroidite
13 spheroidite spheroidite spheroidite
14 spheroidite spheroidite spheroidite
15 spheroidite spheroidite spheroidite
16 spheroidite spheroidite spheroidite
17 spheroidite spheroidite spheroidite
18 spheroidite spheroidite spheroidite
19 spheroidite spheroidite spheroidite
20 spheroidite spheroidite spheroidite
21 spheroidite spheroidite spheroidite
22 spheroidite spheroidite spheroidite
23 spheroidite spheroidite spheroidite+widmanstatten
24 spheroidite spheroidite spheroidite
25 spheroidite spheroidite spheroidite
26 spheroidite spheroidite spheroidite
27 spheroidite spheroidite spheroidite+widmanstatten
28 spheroidite spheroidite spheroidite
29 spheroidite spheroidite spheroidite
30 spheroidite spheroidite spheroidite
31 spheroidite spheroidite spheroidite
32 spheroidite spheroidite spheroidite
33 spheroidite spheroidite spheroidite
34 spheroidite spheroidite spheroidite
35 spheroidite spheroidite spheroidite
36 spheroidite spheroidite spheroidite
37 spheroidite spheroidite spheroidite
38 spheroidite spheroidite spheroidite
39 spheroidite spheroidite spheroidite
40 spheroidite spheroidite spheroidite+widmanstatten
41 spheroidite spheroidite spheroidite
42 spheroidite spheroidite spheroidite
43 spheroidite spheroidite spheroidite
44 spheroidite spheroidite spheroidite
45 spheroidite spheroidite spheroidite
46 spheroidite spheroidite spheroidite
47 spheroidite spheroidite spheroidite
48 spheroidite spheroidite spheroidite
49 spheroidite spheroidite spheroidite
50 spheroidite spheroidite spheroidite
51 spheroidite spheroidite spheroidite
52 spheroidite spheroidite spheroidite
53 spheroidite spheroidite spheroidite
54 spheroidite spheroidite spheroidite
55 spheroidite spheroidite spheroidite
56 spheroidite spheroidite spheroidite
57 spheroidite spheroidite spheroidite
58 spheroidite spheroidite spheroidite
59 spheroidite spheroidite spheroidite
60 spheroidite spheroidite spheroidite
61 spheroidite spheroidite spheroidite
62 spheroidite spheroidite spheroidite
63 spheroidite spheroidite spheroidite
64 spheroidite spheroidite spheroidite
65 spheroidite spheroidite spheroidite
66 spheroidite spheroidite spheroidite
67 spheroidite spheroidite spheroidite
68 spheroidite spheroidite spheroidite
69 spheroidite spheroidite spheroidite
70 spheroidite spheroidite spheroidite
71 spheroidite spheroidite spheroidite
72 spheroidite spheroidite spheroidite
73 spheroidite spheroidite spheroidite
74 spheroidite spheroidite spheroidite
75 spheroidite spheroidite spheroidite
76 spheroidite spheroidite spheroidite
77 spheroidite spheroidite spheroidite
78 spheroidite spheroidite spheroidite
79 spheroidite spheroidite spheroidite
80 spheroidite spheroidite spheroidite
81 spheroidite spheroidite spheroidite
82 spheroidite spheroidite spheroidite
83 spheroidite spheroidite spheroidite
84 spheroidite spheroidite spheroidite
85 spheroidite spheroidite spheroidite
86 spheroidite spheroidite spheroidite
87 spheroidite spheroidite spheroidite
88 spheroidite spheroidite spheroidite
89 spheroidite spheroidite spheroidite
90 spheroidite spheroidite spheroidite+widmanstatten
91 spheroidite spheroidite spheroidite
92 spheroidite spheroidite spheroidite
93 spheroidite spheroidite spheroidite
94 spheroidite spheroidite spheroidite
95 spheroidite spheroidite spheroidite
96 spheroidite spheroidite spheroidite
97 spheroidite spheroidite spheroidite
98 spheroidite spheroidite spheroidite
99 spheroidite spheroidite spheroidite
100 spheroidite spheroidite spheroidite
101 spheroidite spheroidite spheroidite
102 spheroidite spheroidite spheroidite
103 spheroidite spheroidite spheroidite
104 spheroidite spheroidite spheroidite
105 spheroidite spheroidite spheroidite
106 spheroidite spheroidite spheroidite
107 spheroidite spheroidite spheroidite
108 spheroidite spheroidite spheroidite
109 spheroidite spheroidite spheroidite
110 spheroidite spheroidite spheroidite
111 spheroidite spheroidite spheroidite
112 spheroidite spheroidite spheroidite+widmanstatten
113 spheroidite spheroidite spheroidite
114 spheroidite spheroidite spheroidite
115 spheroidite spheroidite spheroidite
116 spheroidite spheroidite spheroidite
117 spheroidite spheroidite spheroidite
118 spheroidite spheroidite spheroidite
119 spheroidite spheroidite spheroidite
120 spheroidite spheroidite spheroidite
121 spheroidite spheroidite spheroidite
122 spheroidite spheroidite spheroidite
123 spheroidite spheroidite spheroidite
124 spheroidite spheroidite spheroidite
125 spheroidite spheroidite spheroidite
126 spheroidite spheroidite spheroidite
127 spheroidite spheroidite spheroidite
128 spheroidite spheroidite spheroidite
129 spheroidite spheroidite spheroidite
130 spheroidite spheroidite spheroidite
131 spheroidite spheroidite spheroidite
132 spheroidite spheroidite spheroidite
133 spheroidite spheroidite spheroidite
134 spheroidite spheroidite spheroidite
135 spheroidite spheroidite spheroidite
136 spheroidite spheroidite spheroidite
137 spheroidite spheroidite spheroidite
138 spheroidite spheroidite spheroidite
139 spheroidite spheroidite spheroidite
140 spheroidite spheroidite spheroidite
141 spheroidite spheroidite spheroidite
142 spheroidite spheroidite spheroidite
143 spheroidite spheroidite spheroidite
144 spheroidite spheroidite spheroidite
145 spheroidite spheroidite spheroidite
146 spheroidite spheroidite spheroidite
147 spheroidite spheroidite spheroidite
148 spheroidite spheroidite spheroidite
149 spheroidite spheroidite spheroidite
150 spheroidite spheroidite spheroidite
151 spheroidite spheroidite spheroidite
152 spheroidite spheroidite spheroidite
153 spheroidite spheroidite spheroidite
154 spheroidite spheroidite spheroidite
155 spheroidite spheroidite spheroidite
156 spheroidite spheroidite spheroidite
157 spheroidite spheroidite spheroidite
158 spheroidite spheroidite spheroidite
159 spheroidite spheroidite spheroidite
160 spheroidite spheroidite spheroidite
161 spheroidite spheroidite spheroidite
162 spheroidite spheroidite spheroidite
163 spheroidite spheroidite spheroidite
164 spheroidite spheroidite spheroidite
165 spheroidite spheroidite spheroidite
166 spheroidite spheroidite network
167 spheroidite spheroidite spheroidite
168 spheroidite spheroidite spheroidite
169 spheroidite spheroidite spheroidite
170 spheroidite spheroidite spheroidite
171 spheroidite spheroidite spheroidite
172 spheroidite spheroidite spheroidite
173 spheroidite spheroidite spheroidite
174 spheroidite spheroidite spheroidite
175 spheroidite spheroidite spheroidite
176 spheroidite spheroidite spheroidite
177 spheroidite spheroidite spheroidite
178 spheroidite spheroidite spheroidite+widmanstatten
179 spheroidite spheroidite spheroidite
180 spheroidite spheroidite spheroidite
181 spheroidite spheroidite spheroidite
182 spheroidite spheroidite spheroidite
183 spheroidite spheroidite spheroidite
184 spheroidite spheroidite spheroidite
185 spheroidite spheroidite spheroidite
186 spheroidite spheroidite spheroidite
187 spheroidite spheroidite spheroidite
188 spheroidite spheroidite spheroidite
189 spheroidite spheroidite spheroidite
190 spheroidite spheroidite spheroidite+widmanstatten
191 spheroidite spheroidite spheroidite
192 spheroidite spheroidite spheroidite
193 spheroidite spheroidite spheroidite
194 spheroidite spheroidite spheroidite
195 spheroidite spheroidite spheroidite
196 spheroidite spheroidite spheroidite
197 spheroidite spheroidite spheroidite
198 spheroidite spheroidite spheroidite
199 spheroidite spheroidite spheroidite
200 spheroidite spheroidite spheroidite
201 spheroidite spheroidite spheroidite
202 spheroidite spheroidite spheroidite
203 spheroidite spheroidite spheroidite
204 spheroidite spheroidite spheroidite
205 spheroidite spheroidite spheroidite
206 spheroidite spheroidite spheroidite
207 spheroidite spheroidite spheroidite
208 spheroidite spheroidite spheroidite
209 spheroidite spheroidite spheroidite
210 spheroidite spheroidite spheroidite
211 spheroidite spheroidite spheroidite
212 spheroidite spheroidite spheroidite
213 spheroidite spheroidite spheroidite
214 spheroidite spheroidite spheroidite
215 spheroidite spheroidite spheroidite
216 spheroidite spheroidite spheroidite
217 spheroidite spheroidite spheroidite
218 spheroidite spheroidite spheroidite+widmanstatten
219 pearlite pearlite pearlite
220 spheroidite spheroidite spheroidite
221 spheroidite spheroidite spheroidite
222 spheroidite spheroidite spheroidite
223 pearlite pearlite pearlite
224 pearlite pearlite pearlite
225 spheroidite spheroidite spheroidite
226 spheroidite spheroidite spheroidite
227 pearlite pearlite pearlite
228 spheroidite spheroidite spheroidite
229 spheroidite spheroidite spheroidite
230 spheroidite spheroidite spheroidite
231 spheroidite spheroidite spheroidite
232 spheroidite spheroidite spheroidite
233 spheroidite spheroidite network
234 spheroidite spheroidite spheroidite
235 spheroidite spheroidite spheroidite+widmanstatten
236 spheroidite spheroidite spheroidite
237 spheroidite spheroidite spheroidite
238 pearlite pearlite pearlite
239 pearlite pearlite pearlite
240 spheroidite spheroidite spheroidite
241 pearlite pearlite pearlite
242 pearlite pearlite pearlite
243 spheroidite spheroidite spheroidite
244 spheroidite spheroidite spheroidite
245 spheroidite spheroidite spheroidite
246 spheroidite spheroidite spheroidite
247 spheroidite spheroidite spheroidite
248 spheroidite spheroidite spheroidite
249 spheroidite spheroidite spheroidite
250 spheroidite spheroidite spheroidite
251 spheroidite spheroidite spheroidite
252 pearlite pearlite pearlite
253 pearlite pearlite pearlite
254 pearlite pearlite pearlite
255 pearlite pearlite pearlite
256 pearlite pearlite pearlite
257 spheroidite spheroidite spheroidite
258 spheroidite spheroidite spheroidite
259 spheroidite spheroidite spheroidite
260 spheroidite spheroidite spheroidite
261 spheroidite spheroidite spheroidite
262 spheroidite spheroidite spheroidite
263 spheroidite spheroidite spheroidite
264 spheroidite spheroidite spheroidite
265 spheroidite spheroidite spheroidite
266 spheroidite spheroidite spheroidite
267 pearlite pearlite pearlite
268 pearlite pearlite pearlite
269 spheroidite spheroidite spheroidite
270 pearlite pearlite pearlite
271 spheroidite spheroidite spheroidite
272 spheroidite spheroidite spheroidite
273 spheroidite spheroidite spheroidite
274 pearlite pearlite pearlite
275 pearlite pearlite pearlite
276 spheroidite spheroidite spheroidite
277 pearlite pearlite pearlite
278 spheroidite spheroidite spheroidite
279 spheroidite spheroidite spheroidite
280 spheroidite spheroidite spheroidite
281 spheroidite spheroidite spheroidite
282 spheroidite spheroidite spheroidite
283 spheroidite spheroidite spheroidite
284 spheroidite spheroidite spheroidite
285 spheroidite spheroidite spheroidite
286 pearlite pearlite pearlite
287 pearlite pearlite pearlite
288 spheroidite spheroidite spheroidite
289 spheroidite spheroidite spheroidite
290 spheroidite spheroidite spheroidite
291 spheroidite spheroidite spheroidite
292 spheroidite spheroidite spheroidite
293 pearlite pearlite pearlite
294 spheroidite spheroidite spheroidite
295 spheroidite spheroidite spheroidite
296 pearlite pearlite pearlite
297 pearlite pearlite pearlite
10.0.11 (d)
Now apply the multilabel classifier on the pearlite + Widmanst¨atten and martensite micrographs and print the predicted labels. Compare to the results in part (c)
There is no specific relation for these unseen datasets. The prediction can not extrapolate, and (c) has preferred prediction accuracy and consistency.
df_micro2 = df_micro2[(df_micro2["primary_microconstituent"] == "pearlite+widmanstatten") |\
(df_micro2["primary_microconstituent"] == "martensite")]
# Encode labels
le2 = preprocessing.LabelEncoder()
le2.fit(df_micro2["primary_microconstituent"].unique())
list(le2.classes_)['martensite', 'pearlite+widmanstatten']
dlabel2 = le2.transform(df_micro2["primary_microconstituent"])
df_micro2.insert(2, "label", dlabel2)df_micro2| path | primary_microconstituent | label | |
|---|---|---|---|
| 15 | data/CMU-UHCS_Dataset/images/micrograph20.tif | martensite | 0 |
| 29 | data/CMU-UHCS_Dataset/images/micrograph41.tif | martensite | 0 |
| 31 | data/CMU-UHCS_Dataset/images/micrograph44.tif | martensite | 0 |
| 63 | data/CMU-UHCS_Dataset/images/micrograph99.tif | martensite | 0 |
| 71 | data/CMU-UHCS_Dataset/images/micrograph114.tif | martensite | 0 |
| ... | ... | ... | ... |
| 892 | data/CMU-UHCS_Dataset/images/micrograph1599.tif | martensite | 0 |
| 936 | data/CMU-UHCS_Dataset/images/micrograph1684.tif | pearlite+widmanstatten | 1 |
| 942 | data/CMU-UHCS_Dataset/images/micrograph1697.tif | martensite | 0 |
| 944 | data/CMU-UHCS_Dataset/images/micrograph1700.tif | martensite | 0 |
| 956 | data/CMU-UHCS_Dataset/images/micrograph1723.tif | martensite | 0 |
63 rows × 3 columns
# Feature extraction with VGG16
if os.path.exists(os.path.join(dpath, "feature_test2.pkl")) == False:
fs_test2 = np.zeros((df_micro2.shape[0], out_shapes[-1]))
m = "block5_pool"
for j, ph in tqdm(enumerate(df_micro2["path"])):
x = load_image(ph)
xb = extmodel[m].predict(x, verbose = 0) # silence output
F = np.mean(xb,axis=(0,1,2))
# Save features
fs_test2[j, :] = F
# Save data
## Create new files
fs_test2_p = open(os.path.join(dpath, "feature_test2.pkl"), "wb")
## Write
pickle.dump(fs_test2, fs_test2_p)
## Close files
fs_test2_p.close()#load data
fs_test2_p = open(os.path.join(dpath, "feature_test2.pkl"), "rb")
fs_test2 = pickle.load(fs_test2_p) # train feature
fs_test2_p .close()pred_multi2 = clf.predict(fs_test2)
res_ps2 = pd.DataFrame({"Test Label": le2.inverse_transform(df_micro2["label"]),\
"Multi-OnevsOne": le.inverse_transform(pred_multi2)})
print(res_ps2.to_string()) Test Label Multi-OnevsOne
0 martensite spheroidite
1 martensite network
2 martensite pearlite
3 martensite spheroidite
4 martensite spheroidite
5 martensite network
6 martensite spheroidite
7 pearlite+widmanstatten pearlite
8 martensite pearlite
9 martensite spheroidite
10 martensite spheroidite
11 pearlite+widmanstatten pearlite
12 martensite pearlite
13 pearlite+widmanstatten pearlite
14 martensite pearlite
15 pearlite+widmanstatten spheroidite
16 pearlite+widmanstatten spheroidite+widmanstatten
17 pearlite+widmanstatten pearlite
18 martensite pearlite
19 pearlite+widmanstatten spheroidite
20 pearlite+widmanstatten pearlite
21 pearlite+widmanstatten spheroidite
22 pearlite+widmanstatten spheroidite
23 pearlite+widmanstatten pearlite
24 pearlite+widmanstatten pearlite
25 martensite pearlite
26 martensite spheroidite
27 martensite pearlite
28 martensite spheroidite
29 martensite pearlite
30 martensite spheroidite
31 martensite pearlite
32 pearlite+widmanstatten pearlite
33 martensite pearlite
34 martensite spheroidite
35 pearlite+widmanstatten spheroidite
36 martensite spheroidite
37 pearlite+widmanstatten spheroidite
38 pearlite+widmanstatten pearlite
39 pearlite+widmanstatten pearlite
40 martensite pearlite
41 martensite spheroidite
42 pearlite+widmanstatten pearlite
43 pearlite+widmanstatten spheroidite
44 pearlite+widmanstatten spheroidite+widmanstatten
45 pearlite+widmanstatten pearlite
46 pearlite+widmanstatten pearlite
47 martensite pearlite
48 pearlite+widmanstatten pearlite
49 martensite pearlite
50 pearlite+widmanstatten spheroidite+widmanstatten
51 pearlite+widmanstatten pearlite
52 martensite pearlite
53 pearlite+widmanstatten spheroidite
54 martensite spheroidite
55 martensite spheroidite
56 martensite pearlite
57 martensite network
58 martensite spheroidite
59 pearlite+widmanstatten pearlite
60 martensite spheroidite
61 martensite pearlite
62 martensite spheroidite