Spaces:
Runtime error
Runtime error
Dima Timofeev
commited on
Commit
·
c0430d0
1
Parent(s):
26d9e8e
minimal app
Browse files- app.py +177 -2
- requirements.txt +4 -0
app.py
CHANGED
@@ -1,4 +1,179 @@
|
|
|
|
|
|
|
|
|
|
1 |
import streamlit as st
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2 |
|
3 |
-
|
4 |
-
st.write(
|
|
|
1 |
+
from copy import deepcopy
|
2 |
+
|
3 |
+
from huggingface_hub import from_pretrained_fastai
|
4 |
+
from PIL import Image
|
5 |
import streamlit as st
|
6 |
+
import pandas as pd
|
7 |
+
|
8 |
+
_LABELS = (
|
9 |
+
"affenpinscher",
|
10 |
+
"afghan_hound",
|
11 |
+
"african_hunting_dog",
|
12 |
+
"airedale",
|
13 |
+
"american_staffordshire_terrier",
|
14 |
+
"appenzeller",
|
15 |
+
"australian_terrier",
|
16 |
+
"basenji",
|
17 |
+
"basset",
|
18 |
+
"beagle",
|
19 |
+
"bedlington_terrier",
|
20 |
+
"bernese_mountain_dog",
|
21 |
+
"black-and-tan_coonhound",
|
22 |
+
"blenheim_spaniel",
|
23 |
+
"bloodhound",
|
24 |
+
"bluetick",
|
25 |
+
"border_collie",
|
26 |
+
"border_terrier",
|
27 |
+
"borzoi",
|
28 |
+
"boston_bull",
|
29 |
+
"bouvier_des_flandres",
|
30 |
+
"boxer",
|
31 |
+
"brabancon_griffon",
|
32 |
+
"briard",
|
33 |
+
"brittany_spaniel",
|
34 |
+
"bull_mastiff",
|
35 |
+
"cairn",
|
36 |
+
"cardigan",
|
37 |
+
"chesapeake_bay_retriever",
|
38 |
+
"chihuahua",
|
39 |
+
"chow",
|
40 |
+
"clumber",
|
41 |
+
"cocker_spaniel",
|
42 |
+
"collie",
|
43 |
+
"curly-coated_retriever",
|
44 |
+
"dandie_dinmont",
|
45 |
+
"dhole",
|
46 |
+
"dingo",
|
47 |
+
"doberman",
|
48 |
+
"english_foxhound",
|
49 |
+
"english_setter",
|
50 |
+
"english_springer",
|
51 |
+
"entlebucher",
|
52 |
+
"eskimo_dog",
|
53 |
+
"flat-coated_retriever",
|
54 |
+
"french_bulldog",
|
55 |
+
"german_shepherd",
|
56 |
+
"german_short-haired_pointer",
|
57 |
+
"giant_schnauzer",
|
58 |
+
"golden_retriever",
|
59 |
+
"gordon_setter",
|
60 |
+
"great_dane",
|
61 |
+
"great_pyrenees",
|
62 |
+
"greater_swiss_mountain_dog",
|
63 |
+
"groenendael",
|
64 |
+
"ibizan_hound",
|
65 |
+
"irish_setter",
|
66 |
+
"irish_terrier",
|
67 |
+
"irish_water_spaniel",
|
68 |
+
"irish_wolfhound",
|
69 |
+
"italian_greyhound",
|
70 |
+
"japanese_spaniel",
|
71 |
+
"keeshond",
|
72 |
+
"kelpie",
|
73 |
+
"kerry_blue_terrier",
|
74 |
+
"komondor",
|
75 |
+
"kuvasz",
|
76 |
+
"labrador_retriever",
|
77 |
+
"lakeland_terrier",
|
78 |
+
"leonberg",
|
79 |
+
"lhasa",
|
80 |
+
"malamute",
|
81 |
+
"malinois",
|
82 |
+
"maltese_dog",
|
83 |
+
"mexican_hairless",
|
84 |
+
"miniature_pinscher",
|
85 |
+
"miniature_poodle",
|
86 |
+
"miniature_schnauzer",
|
87 |
+
"newfoundland",
|
88 |
+
"norfolk_terrier",
|
89 |
+
"norwegian_elkhound",
|
90 |
+
"norwich_terrier",
|
91 |
+
"old_english_sheepdog",
|
92 |
+
"otterhound",
|
93 |
+
"papillon",
|
94 |
+
"pekinese",
|
95 |
+
"pembroke",
|
96 |
+
"pomeranian",
|
97 |
+
"pug",
|
98 |
+
"redbone",
|
99 |
+
"rhodesian_ridgeback",
|
100 |
+
"rottweiler",
|
101 |
+
"saint_bernard",
|
102 |
+
"saluki",
|
103 |
+
"samoyed",
|
104 |
+
"schipperke",
|
105 |
+
"scotch_terrier",
|
106 |
+
"scottish_deerhound",
|
107 |
+
"sealyham_terrier",
|
108 |
+
"shetland_sheepdog",
|
109 |
+
"shih-tzu",
|
110 |
+
"siberian_husky",
|
111 |
+
"silky_terrier",
|
112 |
+
"soft-coated_wheaten_terrier",
|
113 |
+
"staffordshire_bullterrier",
|
114 |
+
"standard_poodle",
|
115 |
+
"standard_schnauzer",
|
116 |
+
"sussex_spaniel",
|
117 |
+
"tibetan_mastiff",
|
118 |
+
"tibetan_terrier",
|
119 |
+
"toy_poodle",
|
120 |
+
"toy_terrier",
|
121 |
+
"vizsla",
|
122 |
+
"walker_hound",
|
123 |
+
"weimaraner",
|
124 |
+
"welsh_springer_spaniel",
|
125 |
+
"west_highland_white_terrier",
|
126 |
+
"whippet",
|
127 |
+
"wire-haired_fox_terrier",
|
128 |
+
"yorkshire_terrier",
|
129 |
+
)
|
130 |
+
|
131 |
+
|
132 |
+
def get_breed(path):
|
133 |
+
pass
|
134 |
+
|
135 |
+
|
136 |
+
@st.cache_resource
|
137 |
+
def get_predictor():
|
138 |
+
return from_pretrained_fastai("TheDima/resnet50-dog-breed-identification")
|
139 |
+
|
140 |
+
|
141 |
+
def predict(image):
|
142 |
+
# Get predictions
|
143 |
+
predictor = get_predictor()
|
144 |
+
pred, pred_idx, probs = predictor.predict(image)
|
145 |
+
return pred, probs[pred_idx].item(), probs
|
146 |
+
|
147 |
+
|
148 |
+
def print_probabilities(probs, labels, top_n=10):
|
149 |
+
df = pd.DataFrame({"Label": labels, "Probability": probs})
|
150 |
+
df = df.sort_values(by="Probability", ascending=False).head(top_n)
|
151 |
+
st.dataframe(df, column_order=["Label", "Probability"], hide_index=True)
|
152 |
+
|
153 |
+
|
154 |
+
st.title("Dog Breed Recognition")
|
155 |
+
|
156 |
+
uploaded_file = st.file_uploader("Upload a doggy...", type=["jpg", "jpeg"])
|
157 |
+
if uploaded_file is not None:
|
158 |
+
# Display uploaded image
|
159 |
+
image = Image.open(uploaded_file)
|
160 |
+
image_copy = deepcopy(image)
|
161 |
+
|
162 |
+
# Make a prediction
|
163 |
+
with st.spinner("Checking..."):
|
164 |
+
pred, prob, probs = predict(image)
|
165 |
+
|
166 |
+
centered_html = f"""
|
167 |
+
<div style="text-align: center;">
|
168 |
+
<h3>It is {pred.replace("_", " ").title()}! (I am {100*prob:.1f}% sure 😉)</h3> <br>
|
169 |
+
</div>
|
170 |
+
"""
|
171 |
+
st.markdown(centered_html, unsafe_allow_html=True)
|
172 |
+
st.image(image_copy, caption="Uploaded doggy", use_column_width=True)
|
173 |
+
|
174 |
+
st.markdown("---")
|
175 |
+
st.markdown("Nerdy Top-10 Probabilities: ")
|
176 |
+
print_probabilities(probs, _LABELS)
|
177 |
|
178 |
+
st.markdown("---")
|
179 |
+
st.write(f"We know only 120 breeds: {', '.join(_LABELS).replace('_', ' ').title()}.")
|
requirements.txt
ADDED
@@ -0,0 +1,4 @@
|
|
|
|
|
|
|
|
|
|
|
1 |
+
huggingface_hub
|
2 |
+
pandas
|
3 |
+
pillow
|
4 |
+
streamlit
|