keras-arcface icon indicating copy to clipboard operation
keras-arcface copied to clipboard

How to predict the class of a new image without sending the label

Open almoghitelman opened this issue 3 years ago • 4 comments

i want to use the trained model to predict the class of a test image without sending the label, is it possible?

currently, the implementation required sending the Keras "predict" function a tuble of (X_test, y_test) Is their a way to use "predict" only with the test image as input and gets the label as output?

almoghitelman avatar Mar 14 '21 11:03 almoghitelman

how to predict the class probability? when I set the output to arcface output (softmax) w.r.t number of class, I got an error when doing prediction model = Model(inputs=model.input[0], outputs=model.layers[-1].output) ,-1 instead of -3 [-1].output : <tf.Tensor 'class_output/Softmax_3:0' shape=(None, 10) dtype=float32> while [-3] return feature vectors which suitable for visualization. thanks.

farhantandia avatar Apr 27 '21 06:04 farhantandia

Hi @almoghitelman , Here is my solution,

class DNN(tf.keras.models.Model):
    def __init__(self, num_classes=10):
        super(DNN, self).__init__()
        weight_decay = 1e-4
        self.layer_1 = tf.keras.layers.Dense(32, activation='relu')
        self.layer_2 = tf.keras.layers.Dense(10)
        self.out = ArcFace(n_classes=num_classes, regularizer=regularizers.l2(weight_decay))

    def call(self, x, training=False):
        if training:
            x, y = x[0], x[1]
        x = self.layer_1(x)
        x = self.layer_2(x)
        if training:
            out = self.out([x, y])
        else:
            # Prediction 
            # Thanks to this, you don't need to pass labels to model when you predict
            out = tf.nn.softmax(x @ self.out.W)
        return out

Sample code is following;

odel = DNN()
optimizer = tf.keras.optimizers.Adam()
loss = tf.keras.losses.categorical_crossentropy

model.compile(loss=loss, optimizer=optimizer, metrics=['acc'])
model.fit([x_train, tf.keras.utils.to_categorical(y_train, 10)], tf.keras.utils.to_categorical(y_train, 10), batch_size=512, epochs=10)

pred = model.predict(x_test)

I hope it works in your situation.

ozora-ogino avatar Jun 02 '21 07:06 ozora-ogino

I implemented my own ArcFace. https://github.com/ozora-ogino/asoftmax-tf

This works correctly and I believe this can solve your problem.

ozora-ogino avatar Jun 02 '21 13:06 ozora-ogino

Why not use [0, 0, 0......0] as laber

scyzz5 avatar Apr 17 '22 13:04 scyzz5