Spaces:
Sleeping
Sleeping
Upload 6 files
Browse files- app.py +29 -0
- labels.json +154 -0
- model.py +46 -0
- requirements.txt +2 -0
app.py
ADDED
@@ -0,0 +1,29 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import gradio as gr
|
2 |
+
import torch
|
3 |
+
import torchvision.transforms.functional as TF
|
4 |
+
from model import NeuralNetwork
|
5 |
+
import json
|
6 |
+
|
7 |
+
device = "cuda" if torch.cuda.is_available() else "cpu"
|
8 |
+
|
9 |
+
def pokemon_classifier(inp):
|
10 |
+
model = NeuralNetwork()
|
11 |
+
model.load_state_dict(torch.load('model_best.pt', map_location=torch.device(device)))
|
12 |
+
model.eval()
|
13 |
+
|
14 |
+
with open('labels.json') as f:
|
15 |
+
labels = json.load(f)
|
16 |
+
|
17 |
+
x = TF.to_tensor(inp)
|
18 |
+
x = TF.resize(x, 64, antialias=True)
|
19 |
+
x = x.to(device)
|
20 |
+
x = x.unsqueeze(0)
|
21 |
+
|
22 |
+
with torch.no_grad():
|
23 |
+
y_pred = model(x)
|
24 |
+
pokemon = torch.argmax(y_pred, dim=1).item()
|
25 |
+
|
26 |
+
return labels[str(pokemon)]
|
27 |
+
|
28 |
+
demo = gr.Interface(fn=pokemon_classifier, inputs=gr.Image(type="pil"), outputs="text")
|
29 |
+
demo.launch()
|
labels.json
ADDED
@@ -0,0 +1,154 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
{
|
2 |
+
"0": "Abra",
|
3 |
+
"1": "Aerodactyl",
|
4 |
+
"2": "Alakazam",
|
5 |
+
"3": "Arbok",
|
6 |
+
"4": "Arcanine",
|
7 |
+
"5": "Articuno",
|
8 |
+
"6": "Beedrill",
|
9 |
+
"7": "Bellsprout",
|
10 |
+
"8": "Blastoise",
|
11 |
+
"9": "Bulbasaur",
|
12 |
+
"10": "Butterfree",
|
13 |
+
"11": "Caterpie",
|
14 |
+
"12": "Chansey",
|
15 |
+
"13": "Charizard",
|
16 |
+
"14": "Charmander",
|
17 |
+
"15": "Charmeleon",
|
18 |
+
"16": "Clefable",
|
19 |
+
"17": "Clefairy",
|
20 |
+
"18": "Cloyster",
|
21 |
+
"19": "Cubone",
|
22 |
+
"20": "Dewgong",
|
23 |
+
"21": "Diglett",
|
24 |
+
"22": "Ditto",
|
25 |
+
"23": "Dodrio",
|
26 |
+
"24": "Doduo",
|
27 |
+
"25": "Dragonair",
|
28 |
+
"26": "Dragonite",
|
29 |
+
"27": "Dratini",
|
30 |
+
"28": "Drowzee",
|
31 |
+
"29": "Dugtrio",
|
32 |
+
"30": "Eevee",
|
33 |
+
"31": "Ekans",
|
34 |
+
"32": "Electabuzz",
|
35 |
+
"33": "Electrode",
|
36 |
+
"34": "Exeggcute",
|
37 |
+
"35": "Exeggutor",
|
38 |
+
"36": "Farfetchd",
|
39 |
+
"37": "Fearow",
|
40 |
+
"38": "Flareon",
|
41 |
+
"39": "Gastly",
|
42 |
+
"40": "Gengar",
|
43 |
+
"41": "Geodude",
|
44 |
+
"42": "Gloom",
|
45 |
+
"43": "Golbat",
|
46 |
+
"44": "Goldeen",
|
47 |
+
"45": "Golduck",
|
48 |
+
"46": "Golem",
|
49 |
+
"47": "Graveler",
|
50 |
+
"48": "Grimer",
|
51 |
+
"49": "Growlithe",
|
52 |
+
"50": "Gyarados",
|
53 |
+
"51": "Haunter",
|
54 |
+
"52": "Hitmonchan",
|
55 |
+
"53": "Hitmonlee",
|
56 |
+
"54": "Horsea",
|
57 |
+
"55": "Hypno",
|
58 |
+
"56": "Ivysaur",
|
59 |
+
"57": "Jigglypuff",
|
60 |
+
"58": "Jolteon",
|
61 |
+
"59": "Jynx",
|
62 |
+
"60": "Kabuto",
|
63 |
+
"61": "Kabutops",
|
64 |
+
"62": "Kadabra",
|
65 |
+
"63": "Kakuna",
|
66 |
+
"64": "Kangaskhan",
|
67 |
+
"65": "Kingler",
|
68 |
+
"66": "Koffing",
|
69 |
+
"67": "Krabby",
|
70 |
+
"68": "Lapras",
|
71 |
+
"69": "Lickitung",
|
72 |
+
"70": "Machamp",
|
73 |
+
"71": "Machoke",
|
74 |
+
"72": "Machop",
|
75 |
+
"73": "Magikarp",
|
76 |
+
"74": "Magmar",
|
77 |
+
"75": "Magnemite",
|
78 |
+
"76": "Magneton",
|
79 |
+
"77": "Mankey",
|
80 |
+
"78": "Marowak",
|
81 |
+
"79": "Meowth",
|
82 |
+
"80": "Metapod",
|
83 |
+
"81": "Mew",
|
84 |
+
"82": "Mewtwo",
|
85 |
+
"83": "Moltres",
|
86 |
+
"84": "Mr.Mime",
|
87 |
+
"85": "Muk",
|
88 |
+
"86": "Nidoking",
|
89 |
+
"87": "Nidoqueen",
|
90 |
+
"88": "Nidoran-f",
|
91 |
+
"89": "Nidoran-m",
|
92 |
+
"90": "Nidorina",
|
93 |
+
"91": "Nidorino",
|
94 |
+
"92": "Ninetales",
|
95 |
+
"93": "Oddish",
|
96 |
+
"94": "Omanyte",
|
97 |
+
"95": "Omastar",
|
98 |
+
"96": "Onix",
|
99 |
+
"97": "Paras",
|
100 |
+
"98": "Parasect",
|
101 |
+
"99": "Persian",
|
102 |
+
"100": "Pidgeot",
|
103 |
+
"101": "Pidgeotto",
|
104 |
+
"102": "Pidgey",
|
105 |
+
"103": "Pikachu",
|
106 |
+
"104": "Pinsir",
|
107 |
+
"105": "Poliwag",
|
108 |
+
"106": "Poliwhirl",
|
109 |
+
"107": "Poliwrath",
|
110 |
+
"108": "Ponyta",
|
111 |
+
"109": "Porygon",
|
112 |
+
"110": "Primeape",
|
113 |
+
"111": "Psyduck",
|
114 |
+
"112": "Raichu",
|
115 |
+
"113": "Rapidash",
|
116 |
+
"114": "Raticate",
|
117 |
+
"115": "Rattata",
|
118 |
+
"116": "Rhydon",
|
119 |
+
"117": "Rhyhorn",
|
120 |
+
"118": "Sandshrew",
|
121 |
+
"119": "Sandslash",
|
122 |
+
"120": "Scyther",
|
123 |
+
"121": "Seadra",
|
124 |
+
"122": "Seaking",
|
125 |
+
"123": "Seel",
|
126 |
+
"124": "Shellder",
|
127 |
+
"125": "Slowbro",
|
128 |
+
"126": "Slowpoke",
|
129 |
+
"127": "Snorlax",
|
130 |
+
"128": "Spearow",
|
131 |
+
"129": "Squirtle",
|
132 |
+
"130": "Starmie",
|
133 |
+
"131": "Staryu",
|
134 |
+
"132": "Tangela",
|
135 |
+
"133": "Tauros",
|
136 |
+
"134": "Tentacool",
|
137 |
+
"135": "Tentacruel",
|
138 |
+
"136": "Vaporeon",
|
139 |
+
"137": "Venomoth",
|
140 |
+
"138": "Venonat",
|
141 |
+
"139": "Venusaur",
|
142 |
+
"140": "Victreebel",
|
143 |
+
"141": "Vileplume",
|
144 |
+
"142": "Voltorb",
|
145 |
+
"143": "Vulpix",
|
146 |
+
"144": "Wartortle",
|
147 |
+
"145": "Weedle",
|
148 |
+
"146": "Weepinbell",
|
149 |
+
"147": "Weezing",
|
150 |
+
"148": "Wigglytuff",
|
151 |
+
"149": "Zapdos",
|
152 |
+
"150": "Zubat"
|
153 |
+
}
|
154 |
+
|
model.py
ADDED
@@ -0,0 +1,46 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import torch
|
2 |
+
from torch import nn
|
3 |
+
|
4 |
+
class NeuralNetwork(nn.Module):
|
5 |
+
def __init__(self):
|
6 |
+
super().__init__()
|
7 |
+
self.conv = nn.Sequential(
|
8 |
+
nn.Conv2d(in_channels=3, out_channels=64, kernel_size=3, stride=1, padding=1),
|
9 |
+
nn.BatchNorm2d(64),
|
10 |
+
nn.ReLU(),
|
11 |
+
nn.Conv2d(in_channels=64, out_channels=64, kernel_size=3, stride=2, padding=1),
|
12 |
+
nn.Dropout2d(p=0.3),
|
13 |
+
|
14 |
+
nn.Conv2d(in_channels=64, out_channels=128, kernel_size=3, stride=1, padding=1),
|
15 |
+
nn.BatchNorm2d(128),
|
16 |
+
nn.ReLU(),
|
17 |
+
nn.Conv2d(in_channels=128, out_channels=128, kernel_size=3, stride=2, padding=1),
|
18 |
+
nn.Dropout2d(p=0.3),
|
19 |
+
|
20 |
+
nn.Conv2d(in_channels=128, out_channels=256, kernel_size=3, stride=1, padding=1),
|
21 |
+
nn.BatchNorm2d(256),
|
22 |
+
nn.ReLU(),
|
23 |
+
nn.Conv2d(in_channels=256, out_channels=256, kernel_size=3, stride=2, padding=1),
|
24 |
+
nn.Dropout2d(p=0.4),
|
25 |
+
|
26 |
+
nn.Conv2d(in_channels=256, out_channels=256, kernel_size=3, stride=1, padding=1),
|
27 |
+
nn.BatchNorm2d(256),
|
28 |
+
nn.ReLU(),
|
29 |
+
nn.Conv2d(in_channels=256, out_channels=256, kernel_size=3, stride=2, padding=1),
|
30 |
+
)
|
31 |
+
self.flatten = nn.Flatten()
|
32 |
+
self.fc = nn.Sequential(
|
33 |
+
nn.Linear(256*4*4, 256),
|
34 |
+
nn.BatchNorm1d(256),
|
35 |
+
nn.ReLU(),
|
36 |
+
nn.Dropout(p=0.5),
|
37 |
+
nn.Linear(256, 151),
|
38 |
+
)
|
39 |
+
|
40 |
+
def forward(self, x):
|
41 |
+
out = self.conv(x)
|
42 |
+
out = self.flatten(out)
|
43 |
+
out = self.fc(out)
|
44 |
+
|
45 |
+
return out
|
46 |
+
|
requirements.txt
ADDED
@@ -0,0 +1,2 @@
|
|
|
|
|
|
|
1 |
+
torch
|
2 |
+
torchvision
|