File size: 7,302 Bytes
088449c
 
 
419db09
088449c
 
 
cb2d0a8
088449c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
import tensorflow.keras as keras
import extract_bottleneck_features
import cv2      
import gradio as gr
import numpy as np      
from glob import glob
from keras.preprocessing import image           
InceptionV3_model = keras.models.load_model("weights.best.InceptionV3.hdf5",)

#dog_names = [item[20:-1] for item in sorted(glob("dogImages/train/*/"))]

dog_names= ['Affenpinscher', 'Afghan_hound', 'Airedale_terrier', 'Akita', 'Alaskan_malamute', 'American_eskimo_dog', 'American_foxhound', 'American_staffordshire_terrier', 'American_water_spaniel', 'Anatolian_shepherd_dog', 'Australian_cattle_dog', 'Australian_shepherd', 'Australian_terrier', 'Basenji', 'Basset_hound', 'Beagle', 'Bearded_collie', 'Beauceron', 'Bedlington_terrier', 'Belgian_malinois', 'Belgian_sheepdog', 'Belgian_tervuren', 'Bernese_mountain_dog', 'Bichon_frise', 'Black_and_tan_coonhound', 'Black_russian_terrier', 'Bloodhound', 'Bluetick_coonhound', 'Border_collie', 'Border_terrier', 'Borzoi', 'Boston_terrier', 'Bouvier_des_flandres', 'Boxer', 'Boykin_spaniel', 'Briard', 'Brittany', 'Brussels_griffon', 'Bull_terrier', 'Bulldog', 'Bullmastiff', 'Cairn_terrier', 'Canaan_dog', 'Cane_corso', 'Cardigan_welsh_corgi', 'Cavalier_king_charles_spaniel', 'Chesapeake_bay_retriever', 'Chihuahua', 'Chinese_crested', 'Chinese_shar-pei', 'Chow_chow', 'Clumber_spaniel', 'Cocker_spaniel', 'Collie', 'Curly-coated_retriever', 'Dachshund', 'Dalmatian', 'Dandie_dinmont_terrier', 'Doberman_pinscher', 'Dogue_de_bordeaux', 'English_cocker_spaniel', 'English_setter', 'English_springer_spaniel', 'English_toy_spaniel', 'Entlebucher_mountain_dog', 'Field_spaniel', 'Finnish_spitz', 'Flat-coated_retriever', 'French_bulldog', 'German_pinscher', 'German_shepherd_dog', 'German_shorthaired_pointer', 'German_wirehaired_pointer', 'Giant_schnauzer', 'Glen_of_imaal_terrier', 'Golden_retriever', 'Gordon_setter', 'Great_dane', 'Great_pyrenees', 'Greater_swiss_mountain_dog', 'Greyhound', 'Havanese', 'Ibizan_hound', 'Icelandic_sheepdog', 'Irish_red_and_white_setter', 'Irish_setter', 'Irish_terrier', 'Irish_water_spaniel', 'Irish_wolfhound', 'Italian_greyhound', 'Japanese_chin', 'Keeshond', 'Kerry_blue_terrier', 'Komondor', 'Kuvasz', 'Labrador_retriever', 'Lakeland_terrier', 'Leonberger', 'Lhasa_apso', 'Lowchen', 'Maltese', 'Manchester_terrier', 'Mastiff', 'Miniature_schnauzer', 'Neapolitan_mastiff', 'Newfoundland', 'Norfolk_terrier', 'Norwegian_buhund', 'Norwegian_elkhound', 'Norwegian_lundehund', 'Norwich_terrier', 'Nova_scotia_duck_tolling_retriever', 'Old_english_sheepdog', 'Otterhound', 'Papillon', 'Parson_russell_terrier', 'Pekingese', 'Pembroke_welsh_corgi', 'Petit_basset_griffon_vendeen', 'Pharaoh_hound', 'Plott', 'Pointer', 'Pomeranian', 'Poodle', 'Portuguese_water_dog', 'Saint_bernard', 'Silky_terrier', 'Smooth_fox_terrier', 'Tibetan_mastiff', 'Welsh_springer_spaniel', 'Wirehaired_pointing_griffon', 'Xoloitzcuintli', 'Yorkshire_terrier']

labels =  dog_names

def extract_InceptionV3(tensor):
	from keras.applications.inception_v3 import InceptionV3, preprocess_input
	return InceptionV3(weights='imagenet', include_top=False).predict(preprocess_input(tensor))


def extract_Resnet50(tensor):
	from tensorflow.keras.applications.resnet50 import ResNet50, preprocess_input
	return ResNet50(weights='imagenet', include_top=False).predict(preprocess_input(tensor))


###########################################

from tensorflow.keras.applications.resnet50 import preprocess_input

######################################

import tensorflow as tf
from keras.preprocessing import image                  
from tqdm import tqdm

######################################

from tensorflow.keras.applications.resnet50 import ResNet50
# define ResNet50 model
ResNet50_model = ResNet50(weights='imagenet')

from keras.preprocessing import image                  
from tqdm import tqdm



from tensorflow.keras.applications.resnet50 import preprocess_input

def ResNet50_predict_labels(img):
    # returns prediction vector for image located at img_path
    img = np.expand_dims(img, axis=0)
    img = preprocess_input((img))
    return np.argmax(ResNet50_model.predict(img)) 


def path_to_tensor(img_path):
    # loads RGB image as PIL.Image.Image type
    #img = image.load_img(img_path, target_size=(224, 224))
    # convert PIL.Image.Image type to 3D tensor with shape (224, 224, 3)
    #x = image.img_to_array(img)
    # convert 3D tensor to 4D tensor with shape (1, 224, 224, 3) and return 4D tensor
    return np.expand_dims(img_path, axis=0)



# extract pre-trained face detector
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_alt.xml')



def face_detector(image):
    """
    returns "True" if face is detected in image stored at image

    """
    
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    faces = face_cascade.detectMultiScale(gray)
    if len(faces) > 0:
        return "Number of human faces found in this image: {}". format(len(faces))
    else:
        return "There are no human faces in this image"




def InceptionV3_prediction_breed(img_path):
    """
    Return: dog breed that is predicted by the model
    input: image
    """
    
    # extract bottleneck features
    bottleneck_feature = extract_InceptionV3(path_to_tensor(img_path))
    # obtain predicted vector
    predicted_vector = InceptionV3_model.predict(bottleneck_feature)
    # return dog breed that is predicted by the model
    return dog_names[np.argmax(predicted_vector)].split('.')[-1]



def dog_detector(img):
    """
    input: uploaded image by user
    return: "True" if a dog is detected in the image stored at img
    """
    
    prediction = ResNet50_predict_labels(img)
    return ((prediction <= 268) & (prediction >= 151)) 

def identify_dog_app(img):
    """This function predicts the breed of the human or dog"
    
    input: uploaded image by user
    Return: dog or human, and breed of the uploaded image
    """
    
    breed = InceptionV3_prediction_breed(img)
    if dog_detector(img):
        return("This looks like a dog and its breed is:"),"{}".format(breed)
    elif face_detector(img):
        return("This looks like a human but might be classified as a dog of the following breed:"),"{}".format(breed)
    else:
        return("I have no idea what this might be. Please upload another image!"), ("Not applicable")




image = gr.inputs.Image(shape=(224, 224),  label="Image")
label = gr.outputs.Label(num_top_classes=1)    

iface = gr.Interface(   
    fn=identify_dog_app,
    inputs=image,
    outputs=[gr.outputs.Label(label="Human or Dog?"), gr.outputs.Label(label="Breed:")],  
    title="Human or dog Identification - Breed Classification",
    #description ="Please find the jypyter notebook on ___",
    article = 
    '<b><span style="color: #ff9900;">Acknowledgement:</span></b><br/>'
    +'<p><span style="color: #ff9900;">I would like to express my special thanks of gratitude'
    +'to Misk &amp; Sdaia for giving me the opportunity to enrol in "Data Scientist" Udacity nanodegree,'
    +'&nbsp;as well as to my mentor Mr. Haroon who was of great help during my learning journey.</span></p>'
    +'<p><span style="color: #ff9900;">This is my capstone project and herewith I finish this ND.</span></p>',

    theme="dark-huggingface"

)

iface.launch(share=False)