Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Low accuracy on lcc-fasd #31

Open
stakanich opened this issue May 24, 2022 · 0 comments
Open

Low accuracy on lcc-fasd #31

stakanich opened this issue May 24, 2022 · 0 comments

Comments

@stakanich
Copy link

stakanich commented May 24, 2022

Hi. I'm trying to evaluate your model, saved in .onnx format from your drive:
https://drive.google.com/drive/folders/1E1OovqRMEQD_uFIhTDU05efvq3KwwnPE
I use custom face detector for cutting faces from image. It works well.
Here is my preprocessing of face for anti-spuffing:

def preprocess_spoof(imgs, normalize_mean = [0.53875615, 0.45938787, 0.45437699], 
                         normalize_std = [0.28414759, 0.27720253, 0.27737352], 
                         resize_shape = (128, 128), 
                         flipbgr = True):
        normalize_mean = np.array(normalize_mean)
        normalize_std = np.array(normalize_std)
        res = []
        for idx, img in enumerate(imgs):
            #print(img.shape)
            img = cv2.resize(img.astype(np.float32), dsize=resize_shape,
                                     interpolation=cv2.INTER_CUBIC)
            if flipbgr:
                img = cv2.cvtColor(img.astype('float32'),
                                       cv2.COLOR_BGR2RGB)
            img = (img/255 - normalize_mean) / normalize_std
            
            img = np.transpose(img, (2, 0, 1))
            res.append(img)
        return res

I use mean and std counted from train part of dataset.

Then I evaluate model with this code:

TP = 0
FP = 0
TN = 0
FN = 0

total_time = 0
P_probs = []
N_probs = []

detector_errors_P = 0
detector_errors_N = 0

with torch.no_grad():
    for idx,img_name in enumerate(listOfImageNamesUnspoof):
        img = cv2.imread(img_name)

        start = time.time()
        bbox = get_box(img)
        if len(bbox) == 0:
            detector_errors_P += 1
            continue
        face = cutout_bbox(img, bbox)
        prediction = sess.run(None, {'actual_input_1': preprocess_spoof([face])})
        speed = time.time()-start
        #print(prediction[0])
        
        
        #label = np.argmax(prediction[0][0])
        if prediction[0][0][0] > 0.4:
            label = 0
        else:
            label = 1
        value = prediction[0][0][label]

        if label == 0:
            TP += 1
            P_probs.append(value)
        else:
            FN += 1

        total_time += speed

    print("Real images analysis finished")

    P_average_prob = np.mean(P_probs)
    P_min_prob = np.min(P_probs)

    for idx,img_name in enumerate(listOfImageNamesSpoof):
        img = cv2.imread(img_name)

        start = time.time()
        bbox = get_box(img)
        if len(bbox) == 0:
            detector_errors_N += 1
            continue
        face = cutout_bbox(img, bbox)
        prediction = sess.run(None, {'actual_input_1': preprocess_spoof([face])})
        speed = time.time()-start
        #print(prediction[0])
        
        #label = np.argmax(prediction[0][0])
        if prediction[0][0][0] > 0.4:
            label = 0
        else:
            label = 1
        value = prediction[0][0][label]

        if label == 0:
            FP += 1
        else:
            TN += 1
            N_probs.append(value)

        total_time += speed


    N_average_prob = np.mean(N_probs)
    N_min_prob = np.min(N_probs)

    print(f"""
    Total real: {TP + FN}
    TP: {TP} - {TP/(TP + FN)}, FN: {FN} - {FN/(TP + FN)}
    average proba for real: {P_average_prob}, min proba for real: {P_min_prob}
    detector fails on real: {detector_errors_P}
    Total fake: {TN + FP}, TN: {TN} - {TN/(TN + FP)}, FP: {FP} - {FP/(TN + FP)}
    average proba for fake: {N_average_prob}, min proba for fake: {N_min_prob}
    detector fails on fake: {detector_errors_N}

    average_time: {total_time / (TP+TN+FP+FN)}
    """)

And I get:

    Total real: 323
    TP: 253 - 0.7832817337461301, FN: 70 - 0.21671826625386997
    average proba for real: 0.9243021607398987, min proba for real: 0.4475395083427429
    detector fails on real: 0
    Total fake: 7298, TN: 6408 - 0.8780487804878049, FP: 890 - 0.12195121951219512
    average proba for fake: 0.9745228290557861, min proba for fake: 0.6035735607147217
    detector fails on fake: 14

    average_time: 0.012271973548982263

So,it looks like even with low enough threshold real images are counted as fake. Can you give an advise, please: is it a problem with the pretrained model or I do something wrong?
Thanks in advance.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant