File size: 2,564 Bytes
7561385
9ecc50a
7561385
61ad9eb
9ecc50a
 
61ad9eb
 
 
 
 
 
1d11d2b
7561385
 
 
61ad9eb
7561385
61ad9eb
 
7561385
61ad9eb
 
32d6eef
 
61ad9eb
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7561385
61ad9eb
 
7561385
32d6eef
7561385
 
 
 
 
 
32d6eef
de2982f
b06edc1
 
 
dc5d01f
7561385
 
61ad9eb
7561385
 
 
 
1a88eba
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
import gradio as gr
from fastai.vision.all import *

def is_cat(x): return x[0].isupper()

def get_labels(path):
    pet_type = 'cat' if is_cat(path.name) else 'dog'
    breed = RegexLabeller(r'(.+)_\d+.jpg$')(path.name)

    return [pet_type, breed]

learn = load_learner('dog_cat_multi_v3.pkl')

def predict(image):
    # Transform the image
    pil_image = PILImage.create(image)

    # Predict
    preds, mask, probs = learn.predict(pil_image)

    # Apply the threshold
    threshold = 0.570
    classes_with_probs = [(learn.dls.vocab[i], probs[i].item()) for i in range(len(mask)) if probs[i] > threshold]
    confidences = {learn.dls.vocab[i]: float(probs[i].item()) for i in range(len(probs)) if probs[i] > threshold}


    # Check if the prediction includes "dog" or "cat"
    pet_type = None
    breed = 'unknown' # Default to 'unknown' if no breed is identified
    pet_prob = 0
    breed_prob = 0
    for class_name, prob in classes_with_probs:
        if class_name == 'dog' or class_name == 'cat':
            pet_type = class_name
            pet_prob = prob
        else:
            breed = class_name
            breed_prob = prob

    # Check if pet_type is None (i.e., neither dog nor cat)
    if pet_type is None:
        return "This is not a cat, nor a dog."

    result = f"This is a {pet_type}, the breed is {breed if breed else 'unknown'}.\n" \
             f"The probability for it being a {pet_type} is {pet_prob * 100:.2f}%, the probability of being the breed is {breed_prob * 100:.2f}%."

    return result, confidences


# Define the Gradio interface
iface = gr.Interface(
    fn=predict,
    inputs=gr.inputs.Image(shape=(224, 224)),
    outputs=[gr.outputs.Textbox(label="Prediction"), gr.outputs.Label(label='confidences',num_top_classes=2)],
    theme=gr.themes.Soft(),
    examples=["images/cazou103_Generate_a_high-resolution_image_of_a_Beagle_showcasin_609a1bae-22ac-4158-9091-dbf3220b2765.PNG",
              "images/cazou103_Generate_a_high-resolution_image_of_a_Shiba_Inu_showca_998f6162-289f-450e-ab02-558c3a575f61.PNG",
              "images/cazou103_Generate_a_high-resolution_image_of_a_Siamese_cat_show_68b1d78f-c304-4164-9342-4a4b56d2c4c5.PNG"
                  ],
    title="Cat and Dog Image Classifier",
    description="Upload an image of a cat or a dog, and the model will identify the type and breed.",
    article="This model has been trained on the Oxford Pets dataset and might not recognize all types dog and cat breeds. For best results, use clear images of pets."
)


# Launch the interface
iface.launch()