fengruilin commited on
Commit
539408d
·
1 Parent(s): 7c176ca

added main app and mapping

Browse files
Files changed (2) hide show
  1. CarLabelToNameMapping.txt +179 -0
  2. app.py +267 -4
CarLabelToNameMapping.txt ADDED
@@ -0,0 +1,179 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ 0 AM General Hummer SUV 2000
2
+ 1 Acura RL Sedan 2012
3
+ 2 Acura TL Sedan 2012
4
+ 3 Acura TL Type-S 2008
5
+ 4 Acura TSX Sedan 2012
6
+ 5 Acura Integra Type R 2001
7
+ 6 Acura ZDX Hatchback 2012
8
+ 7 Aston Martin V8 Vantage Convertible 2012
9
+ 8 Aston Martin V8 Vantage Coupe 2012
10
+ 9 Aston Martin Virage Convertible 2012
11
+ 10 Aston Martin Virage Coupe 2012
12
+ 11 Audi RS 4 Convertible 2008
13
+ 12 Audi A5 Coupe 2012
14
+ 13 Audi TTS Coupe 2012
15
+ 14 Audi R8 Coupe 2012
16
+ 15 Audi V8 Sedan 1994
17
+ 16 Audi 100 Sedan 1994
18
+ 17 Audi 100 Wagon 1994
19
+ 18 Audi TT Hatchback 2011
20
+ 19 Audi S6 Sedan 2011
21
+ 20 Audi S5 Convertible 2012
22
+ 21 Audi S5 Coupe 2012
23
+ 22 Audi S4 Sedan 2012
24
+ 23 Audi S4 Sedan 2007
25
+ 24 Audi TT RS Coupe 2012
26
+ 25 BMW ActiveHybrid 5 Sedan 2012
27
+ 26 BMW 1 Series Convertible 2012
28
+ 27 BMW 1 Series Coupe 2012
29
+ 28 BMW 3 Series Sedan 2012
30
+ 29 BMW 3 Series Wagon 2012
31
+ 30 BMW 6 Series Convertible 2007
32
+ 31 BMW X5 SUV 2007
33
+ 32 BMW X6 SUV 2012
34
+ 35 BMW M6 Convertible 2010
35
+ 36 BMW X3 SUV 2012
36
+ 37 BMW Z4 Convertible 2012
37
+ 38 Bentley Continental Supersports Conv. Convertible 2012
38
+ 39 Bentley Arnage Sedan 2009
39
+ 40 Bentley Mulsanne Sedan 2011
40
+ 41 Bentley Continental GT Coupe 2012
41
+ 42 Bentley Continental GT Coupe 2007
42
+ 43 Bentley Continental Flying Spur Sedan 2007
43
+ 44 Bugatti Veyron 16.4 Convertible 2009
44
+ 45 Bugatti Veyron 16.4 Coupe 2009
45
+ 46 Buick Regal GS 2012
46
+ 47 Buick Rainier SUV 2007
47
+ 48 Buick Verano Sedan 2012
48
+ 49 Buick Enclave SUV 2012
49
+ 50 Cadillac CTS-V Sedan 2012
50
+ 52 Cadillac Escalade EXT Crew Cab 2007
51
+ 53 Chevrolet Silverado 1500 Hybrid Crew Cab 2012
52
+ 54 Chevrolet Corvette Convertible 2012
53
+ 55 Chevrolet Corvette ZR1 2012
54
+ 56 Chevrolet Corvette Ron Fellows Edition Z06 2007
55
+ 57 Chevrolet Traverse SUV 2012
56
+ 58 Chevrolet Camaro Convertible 2012
57
+ 59 Chevrolet HHR SS 2010
58
+ 60 Chevrolet Impala Sedan 2007
59
+ 61 Chevrolet Tahoe Hybrid SUV 2012
60
+ 62 Chevrolet Sonic Sedan 2012
61
+ 63 Chevrolet Express Cargo Van 2007
62
+ 64 Chevrolet Avalanche Crew Cab 2012
63
+ 65 Chevrolet Cobalt SS 2010
64
+ 66 Chevrolet Malibu Hybrid Sedan 2010
65
+ 67 Chevrolet TrailBlazer SS 2009
66
+ 68 Chevrolet Silverado 2500HD Regular Cab 2012
67
+ 69 Chevrolet Silverado 1500 Classic Extended Cab 2007
68
+ 70 Chevrolet Express Van 2007
69
+ 71 Chevrolet Monte Carlo Coupe 2007
70
+ 72 Chevrolet Malibu Sedan 2007
71
+ 73 Chevrolet Silverado 1500 Extended Cab 2012
72
+ 74 Chevrolet Silverado 1500 Regular Cab 2012
73
+ 75 Chrysler Aspen SUV 2009
74
+ 76 Chrysler Sebring Convertible 2010
75
+ 78 Chrysler 300 SRT-8 2010
76
+ 82 Dodge Caliber Wagon 2012
77
+ 83 Dodge Caliber Wagon 2007
78
+ 84 Dodge Caravan Minivan 1997
79
+ 85 Dodge Ram Pickup 3500 Crew Cab 2010
80
+ 86 Dodge Ram Pickup 3500 Quad Cab 2009
81
+ 87 Dodge Sprinter Cargo Van 2009
82
+ 88 Dodge Journey SUV 2012
83
+ 89 Dodge Dakota Crew Cab 2010
84
+ 90 Dodge Dakota Club Cab 2007
85
+ 92 Dodge Challenger SRT8 2011
86
+ 93 Dodge Durango SUV 2012
87
+ 95 Dodge Charger Sedan 2012
88
+ 96 Dodge Charger SRT-8 2009
89
+ 98 FIAT 500 Abarth 2012
90
+ 99 FIAT 500 Convertible 2012
91
+ 100 Ferrari FF Coupe 2012
92
+ 101 Ferrari California Convertible 2012
93
+ 102 Ferrari 458 Italia Convertible 2012
94
+ 103 Ferrari 458 Italia Coupe 2012
95
+ 104 Fisker Karma Sedan 2012
96
+ 105 Ford F-450 Super Duty Crew Cab 2012
97
+ 106 Ford Mustang Convertible 2007
98
+ 107 Ford Freestar Minivan 2007
99
+ 108 Ford Expedition EL SUV 2009
100
+ 109 Ford Edge SUV 2012
101
+ 110 Ford Ranger SuperCab 2011
102
+ 111 Ford GT Coupe 2006
103
+ 112 Ford F-150 Regular Cab 2012
104
+ 113 Ford F-150 Regular Cab 2007
105
+ 114 Ford Focus Sedan 2007
106
+ 115 Ford E-Series Wagon Van 2012
107
+ 116 Ford Fiesta Sedan 2012
108
+ 118 GMC Savana Van 2012
109
+ 119 GMC Yukon Hybrid SUV 2012
110
+ 120 GMC Acadia SUV 2012
111
+ 121 GMC Canyon Extended Cab 2012
112
+ 122 Geo Metro Convertible 1993
113
+ 123 HUMMER H3T Crew Cab 2010
114
+ 124 HUMMER H2 SUT Crew Cab 2009
115
+ 125 Honda Odyssey Minivan 2012
116
+ 126 Honda Odyssey Minivan 2007
117
+ 127 Honda Accord Coupe 2012
118
+ 129 Hyundai Veloster Hatchback 2012
119
+ 130 Hyundai Santa Fe SUV 2012
120
+ 131 Hyundai Tucson SUV 2012
121
+ 132 Hyundai Veracruz SUV 2012
122
+ 133 Hyundai Sonata Hybrid Sedan 2012
123
+ 134 Hyundai Elantra Sedan 2007
124
+ 135 Hyundai Accent Sedan 2012
125
+ 136 Hyundai Genesis Sedan 2012
126
+ 137 Hyundai Sonata Sedan 2012
127
+ 138 Hyundai Elantra Touring Hatchback 2012
128
+ 139 Hyundai Azera Sedan 2012
129
+ 140 Infiniti G Coupe IPL 2012
130
+ 141 Infiniti QX56 SUV 2011
131
+ 142 Isuzu Ascender SUV 2008
132
+ 143 Jaguar XK XKR 2012
133
+ 144 Jeep Patriot SUV 2012
134
+ 145 Jeep Wrangler SUV 2012
135
+ 146 Jeep Liberty SUV 2012
136
+ 147 Jeep Grand Cherokee SUV 2012
137
+ 148 Jeep Compass SUV 2012
138
+ 150 Lamborghini Aventador Coupe 2012
139
+ 152 Lamborghini Diablo Coupe 2001
140
+ 153 Land Rover Range Rover SUV 2012
141
+ 154 Land Rover LR2 SUV 2012
142
+ 155 Lincoln Town Car Sedan 2011
143
+ 157 Maybach Landaulet Convertible 2012
144
+ 159 McLaren MP4-12C Coupe 2012
145
+ 160 Mercedes-Benz 300-Class Convertible 1993
146
+ 161 Mercedes-Benz C-Class Sedan 2012
147
+ 162 Mercedes-Benz SL-Class Coupe 2009
148
+ 164 Mercedes-Benz S-Class Sedan 2012
149
+ 165 Mercedes-Benz Sprinter Van 2012
150
+ 166 Mitsubishi Lancer Sedan 2012
151
+ 167 Nissan Leaf Hatchback 2012
152
+ 168 Nissan NV Passenger Van 2012
153
+ 169 Nissan Juke Hatchback 2012
154
+ 170 Nissan 240SX Coupe 1998
155
+ 171 Plymouth Neon Coupe 1999
156
+ 172 Porsche Panamera Sedan 2012
157
+ 173 Ram C/V Cargo Van Minivan 2012
158
+ 174 Rolls-Royce Phantom Drophead Coupe Convertible 2012
159
+ 175 Rolls-Royce Ghost Sedan 2012
160
+ 176 Rolls-Royce Phantom Sedan 2012
161
+ 177 Scion xD Hatchback 2012
162
+ 178 Spyker C8 Convertible 2009
163
+ 179 Spyker C8 Coupe 2009
164
+ 180 Suzuki Aerio Sedan 2007
165
+ 181 Suzuki Kizashi Sedan 2012
166
+ 182 Suzuki SX4 Hatchback 2012
167
+ 183 Suzuki SX4 Sedan 2012
168
+ 184 Tesla Model S Sedan 2012
169
+ 185 Toyota Sequoia SUV 2012
170
+ 186 Toyota Camry Sedan 2012
171
+ 187 Toyota Corolla Sedan 2012
172
+ 188 Toyota 4Runner SUV 2012
173
+ 189 Volkswagen Golf Hatchback 2012
174
+ 190 Volkswagen Golf Hatchback 1991
175
+ 191 Volkswagen Beetle Hatchback 2012
176
+ 192 Volvo C30 Hatchback 2012
177
+ 193 Volvo 240 Sedan 1993
178
+ 194 Volvo XC90 SUV 2007
179
+ 195 smart fortwo Convertible 2012
app.py CHANGED
@@ -1,7 +1,270 @@
1
  import gradio as gr
 
 
 
2
 
3
- def greet(name):
4
- return "Hello " + name + "!!"
 
 
 
 
 
 
 
 
 
 
 
 
5
 
6
- demo = gr.Interface(fn=greet, inputs="text", outputs="text")
7
- demo.launch()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  import gradio as gr
2
+ from PIL import Image
3
+ import torch
4
+ from torchvision import transforms
5
 
6
+ # --------------------------
7
+ # 1. Define your model class
8
+ # --------------------------
9
+ # Make sure this matches the architecture you used to train your model
10
+ class MyCarClassifier(torch.nn.Module):
11
+ def __init__(self, num_classes=196): # Stanford Cars has 196 classes
12
+ super(MyCarClassifier, self).__init__()
13
+ # Example: replace with your actual model architecture
14
+ from torchvision.models import resnet18
15
+ self.model = resnet18(pretrained=False)
16
+ self.model.fc = torch.nn.Linear(self.model.fc.in_features, num_classes)
17
+
18
+ def forward(self, x):
19
+ return self.model(x)
20
 
21
+ # --------------------------
22
+ # 2. Load model weights
23
+ # --------------------------
24
+ model = MyCarClassifier()
25
+ model.load_state_dict(torch.load("best_stanford_cars_transfer_model.pth", map_location="cpu"))
26
+ model.eval() # important for inference
27
+
28
+ # --------------------------
29
+ # 3. Define labels
30
+ # --------------------------
31
+ # Full integer-to-label mapping for Stanford Cars dataset
32
+ labels = [
33
+ "AM General Hummer SUV 2000",
34
+ "Acura RL Sedan 2012",
35
+ "Acura TL Sedan 2012",
36
+ "Acura TL Type-S 2008",
37
+ "Acura TSX Sedan 2012",
38
+ "Acura Integra Type R 2001",
39
+ "Acura ZDX Hatchback 2012",
40
+ "Aston Martin V8 Vantage Convertible 2012",
41
+ "Aston Martin V8 Vantage Coupe 2012",
42
+ "Aston Martin Virage Convertible 2012",
43
+ "Aston Martin Virage Coupe 2012",
44
+ "Audi RS 4 Convertible 2008",
45
+ "Audi A5 Coupe 2012",
46
+ "Audi TTS Coupe 2012",
47
+ "Audi R8 Coupe 2012",
48
+ "Audi V8 Sedan 1994",
49
+ "Audi 100 Sedan 1994",
50
+ "Audi 100 Wagon 1994",
51
+ "Audi TT Hatchback 2011",
52
+ "Audi S6 Sedan 2011",
53
+ "Audi S5 Convertible 2012",
54
+ "Audi S5 Coupe 2012",
55
+ "Audi S4 Sedan 2012",
56
+ "Audi S4 Sedan 2007",
57
+ "Audi TT RS Coupe 2012",
58
+ "BMW ActiveHybrid 5 Sedan 2012",
59
+ "BMW 1 Series Convertible 2012",
60
+ "BMW 1 Series Coupe 2012",
61
+ "BMW 3 Series Sedan 2012",
62
+ "BMW 3 Series Wagon 2012",
63
+ "BMW 6 Series Convertible 2007",
64
+ "BMW X5 SUV 2007",
65
+ "BMW X6 SUV 2012",
66
+ None,
67
+ None,
68
+ "BMW M6 Convertible 2010",
69
+ "BMW X3 SUV 2012",
70
+ "BMW Z4 Convertible 2012",
71
+ "Bentley Continental Supersports Conv. Convertible 2012",
72
+ "Bentley Arnage Sedan 2009",
73
+ "Bentley Mulsanne Sedan 2011",
74
+ "Bentley Continental GT Coupe 2012",
75
+ "Bentley Continental GT Coupe 2007",
76
+ "Bentley Continental Flying Spur Sedan 2007",
77
+ "Bugatti Veyron 16.4 Convertible 2009",
78
+ "Bugatti Veyron 16.4 Coupe 2009",
79
+ "Buick Regal GS 2012",
80
+ "Buick Rainier SUV 2007",
81
+ "Buick Verano Sedan 2012",
82
+ "Buick Enclave SUV 2012",
83
+ "Cadillac CTS-V Sedan 2012",
84
+ None,
85
+ "Cadillac Escalade EXT Crew Cab 2007",
86
+ "Chevrolet Silverado 1500 Hybrid Crew Cab 2012",
87
+ "Chevrolet Corvette Convertible 2012",
88
+ "Chevrolet Corvette ZR1 2012",
89
+ "Chevrolet Corvette Ron Fellows Edition Z06 2007",
90
+ "Chevrolet Traverse SUV 2012",
91
+ "Chevrolet Camaro Convertible 2012",
92
+ "Chevrolet HHR SS 2010",
93
+ "Chevrolet Impala Sedan 2007",
94
+ "Chevrolet Tahoe Hybrid SUV 2012",
95
+ "Chevrolet Sonic Sedan 2012",
96
+ "Chevrolet Express Cargo Van 2007",
97
+ "Chevrolet Avalanche Crew Cab 2012",
98
+ "Chevrolet Cobalt SS 2010",
99
+ "Chevrolet Malibu Hybrid Sedan 2010",
100
+ "Chevrolet TrailBlazer SS 2009",
101
+ "Chevrolet Silverado 2500HD Regular Cab 2012",
102
+ "Chevrolet Silverado 1500 Classic Extended Cab 2007",
103
+ "Chevrolet Express Van 2007",
104
+ "Chevrolet Monte Carlo Coupe 2007",
105
+ "Chevrolet Malibu Sedan 2007",
106
+ "Chevrolet Silverado 1500 Extended Cab 2012",
107
+ "Chevrolet Silverado 1500 Regular Cab 2012",
108
+ "Chrysler Aspen SUV 2009",
109
+ "Chrysler Sebring Convertible 2010",
110
+ None,
111
+ "Chrysler 300 SRT-8 2010",
112
+ None,
113
+ None,
114
+ "Dodge Caliber Wagon 2012",
115
+ "Dodge Caliber Wagon 2007",
116
+ "Dodge Caravan Minivan 1997",
117
+ "Dodge Ram Pickup 3500 Crew Cab 2010",
118
+ "Dodge Ram Pickup 3500 Quad Cab 2009",
119
+ "Dodge Sprinter Cargo Van 2009",
120
+ "Dodge Journey SUV 2012",
121
+ "Dodge Dakota Crew Cab 2010",
122
+ "Dodge Dakota Club Cab 2007",
123
+ None,
124
+ "Dodge Challenger SRT8 2011",
125
+ "Dodge Durango SUV 2012",
126
+ None,
127
+ "Dodge Charger Sedan 2012",
128
+ "Dodge Charger SRT-8 2009",
129
+ None,
130
+ "FIAT 500 Abarth 2012",
131
+ "FIAT 500 Convertible 2012",
132
+ "Ferrari FF Coupe 2012",
133
+ "Ferrari California Convertible 2012",
134
+ "Ferrari 458 Italia Convertible 2012",
135
+ "Ferrari 458 Italia Coupe 2012",
136
+ "Fisker Karma Sedan 2012",
137
+ "Ford F-450 Super Duty Crew Cab 2012",
138
+ "Ford Mustang Convertible 2007",
139
+ "Ford Freestar Minivan 2007",
140
+ "Ford Expedition EL SUV 2009",
141
+ "Ford Edge SUV 2012",
142
+ "Ford Ranger SuperCab 2011",
143
+ "Ford GT Coupe 2006",
144
+ "Ford F-150 Regular Cab 2012",
145
+ "Ford F-150 Regular Cab 2007",
146
+ "Ford Focus Sedan 2007",
147
+ "Ford E-Series Wagon Van 2012",
148
+ "Ford Fiesta Sedan 2012",
149
+ None,
150
+ "GMC Savana Van 2012",
151
+ "GMC Yukon Hybrid SUV 2012",
152
+ "GMC Acadia SUV 2012",
153
+ "GMC Canyon Extended Cab 2012",
154
+ "Geo Metro Convertible 1993",
155
+ "HUMMER H3T Crew Cab 2010",
156
+ "HUMMER H2 SUT Crew Cab 2009",
157
+ "Honda Odyssey Minivan 2012",
158
+ "Honda Odyssey Minivan 2007",
159
+ "Honda Accord Coupe 2012",
160
+ None,
161
+ "Hyundai Veloster Hatchback 2012",
162
+ "Hyundai Santa Fe SUV 2012",
163
+ "Hyundai Tucson SUV 2012",
164
+ "Hyundai Veracruz SUV 2012",
165
+ "Hyundai Sonata Hybrid Sedan 2012",
166
+ "Hyundai Elantra Sedan 2007",
167
+ "Hyundai Accent Sedan 2012",
168
+ "Hyundai Genesis Sedan 2012",
169
+ "Hyundai Sonata Sedan 2012",
170
+ "Hyundai Elantra Touring Hatchback 2012",
171
+ "Hyundai Azera Sedan 2012",
172
+ "Infiniti G Coupe IPL 2012",
173
+ "Infiniti QX56 SUV 2011",
174
+ "Isuzu Ascender SUV 2008",
175
+ "Jaguar XK XKR 2012",
176
+ "Jeep Patriot SUV 2012",
177
+ "Jeep Wrangler SUV 2012",
178
+ "Jeep Liberty SUV 2012",
179
+ "Jeep Grand Cherokee SUV 2012",
180
+ "Jeep Compass SUV 2012",
181
+ None,
182
+ "Lamborghini Aventador Coupe 2012",
183
+ None,
184
+ "Lamborghini Diablo Coupe 2001",
185
+ "Land Rover Range Rover SUV 2012",
186
+ "Land Rover LR2 SUV 2012",
187
+ "Lincoln Town Car Sedan 2011",
188
+ None,
189
+ "Maybach Landaulet Convertible 2012",
190
+ None,
191
+ "McLaren MP4-12C Coupe 2012",
192
+ "Mercedes-Benz 300-Class Convertible 1993",
193
+ "Mercedes-Benz C-Class Sedan 2012",
194
+ "Mercedes-Benz SL-Class Coupe 2009",
195
+ None,
196
+ "Mercedes-Benz S-Class Sedan 2012",
197
+ "Mercedes-Benz Sprinter Van 2012",
198
+ "Mitsubishi Lancer Sedan 2012",
199
+ "Nissan Leaf Hatchback 2012",
200
+ "Nissan NV Passenger Van 2012",
201
+ "Nissan Juke Hatchback 2012",
202
+ "Nissan 240SX Coupe 1998",
203
+ "Plymouth Neon Coupe 1999",
204
+ "Porsche Panamera Sedan 2012",
205
+ "Ram C/V Cargo Van Minivan 2012",
206
+ "Rolls-Royce Phantom Drophead Coupe Convertible 2012",
207
+ "Rolls-Royce Ghost Sedan 2012",
208
+ "Rolls-Royce Phantom Sedan 2012",
209
+ "Scion xD Hatchback 2012",
210
+ "Spyker C8 Convertible 2009",
211
+ "Spyker C8 Coupe 2009",
212
+ "Suzuki Aerio Sedan 2007",
213
+ "Suzuki Kizashi Sedan 2012",
214
+ "Suzuki SX4 Hatchback 2012",
215
+ "Suzuki SX4 Sedan 2012",
216
+ "Tesla Model S Sedan 2012",
217
+ "Toyota Sequoia SUV 2012",
218
+ "Toyota Camry Sedan 2012",
219
+ "Toyota Corolla Sedan 2012",
220
+ "Toyota 4Runner SUV 2012",
221
+ "Volkswagen Golf Hatchback 2012",
222
+ "Volkswagen Golf Hatchback 1991",
223
+ "Volkswagen Beetle Hatchback 2012",
224
+ "Volvo C30 Hatchback 2012",
225
+ "Volvo 240 Sedan 1993",
226
+ "Volvo XC90 SUV 2007",
227
+ "smart fortwo Convertible 2012"
228
+ ]
229
+
230
+ # --------------------------
231
+ # 4. Preprocessing function
232
+ # --------------------------
233
+ def preprocess_image(img: Image.Image):
234
+ transform = transforms.Compose([
235
+ transforms.Resize((224, 224)), # match your training input size
236
+ transforms.ToTensor(),
237
+ transforms.Normalize(
238
+ mean=[0.485, 0.456, 0.406], # if you used ImageNet pretrained normalization
239
+ std=[0.229, 0.224, 0.225]
240
+ )
241
+ ])
242
+ x = transform(img).unsqueeze(0) # add batch dimension
243
+ return x
244
+
245
+ # --------------------------
246
+ # 5. Prediction function
247
+ # --------------------------
248
+ def predict(img: Image.Image):
249
+ x = preprocess_image(img)
250
+ with torch.no_grad():
251
+ logits = model(x)
252
+ probs = torch.nn.functional.softmax(logits, dim=1)[0]
253
+ top_idx = torch.argmax(probs).item()
254
+ top_label = labels[top_idx] if labels[top_idx] is not None else f"Class {top_idx}"
255
+ confidence = float(probs[top_idx])
256
+ return {top_label: confidence}
257
+
258
+ # --------------------------
259
+ # 6. Gradio interface
260
+ # --------------------------
261
+ demo = gr.Interface(
262
+ fn=predict,
263
+ inputs=gr.Image(type="pil"),
264
+ outputs=gr.Label(num_top_classes=1),
265
+ title="Stanford Cars Classifier",
266
+ description="Upload a car image and see the most likely predicted make/model and its confidence."
267
+ )
268
+
269
+ if __name__ == "__main__":
270
+ demo.launch()