10  Homework4: Problem 6.12

10.0.1 Libraries

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 st

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