dhruvsrawat commited on
Commit
47b21c5
·
verified ·
1 Parent(s): bb540cb

Uploaded all files

Browse files
Dockerfile ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Read the doc: https://huggingface.co/docs/hub/spaces-sdks-docker
2
+ # you will also find guides on how best to write your Dockerfile
3
+
4
+ FROM python:3.9
5
+
6
+ RUN useradd -m -u 1000 user
7
+ USER user
8
+ ENV PATH="/home/user/.local/bin:$PATH"
9
+
10
+ WORKDIR /app
11
+
12
+ COPY --chown=user ./requirements.txt requirements.txt
13
+ RUN pip install --no-cache-dir --upgrade -r requirements.txt
14
+
15
+ COPY --chown=user . /app
16
+ CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "7860"]
README.md CHANGED
@@ -1,10 +1,11 @@
1
  ---
2
- title: README
3
- emoji:
4
- colorFrom: purple
5
- colorTo: red
6
  sdk: docker
7
  pinned: false
 
8
  ---
9
 
10
- Edit this `README.md` markdown file to author your organization card.
 
1
  ---
2
+ title: Waste Management
3
+ emoji: 🐨
4
+ colorFrom: indigo
5
+ colorTo: purple
6
  sdk: docker
7
  pinned: false
8
+ short_description: Project for Science Exhibition
9
  ---
10
 
11
+ Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
Waste-Management/README.md ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ # Waste-Management System
2
+ Science Project Exhibition
3
+
4
+ This is a project where we create an AI Model which can detect and give feedback as to how one can recycle, reuse or manage waste.
5
+
6
+ A user can upload image of the waste/trash and get feedback for how to deal with it
7
+
8
+ This is a college project built by first year students.
Waste-Management/resnet ADDED
@@ -0,0 +1,65 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Image transformations (VERY IMPORTANT for ResNet)
2
+ transform = transforms.Compose([
3
+ transforms.Resize((224, 224)), # ResNet needs this
4
+ transforms.ToTensor()
5
+ ])
6
+
7
+ # Load dataset
8
+ dataset = datasets.ImageFolder(
9
+ root='/content/drive/MyDrive/TrashNet',
10
+ transform=transform
11
+ )
12
+
13
+ # Create DataLoader
14
+ train_loader = torch.utils.data.DataLoader(
15
+ dataset,
16
+ batch_size=32,
17
+ shuffle=True
18
+ )
19
+
20
+ # Number of classes
21
+ NUM_CLASSES = len(dataset.classes)
22
+
23
+ print("Classes:", dataset.classes)
24
+
25
+ # Load pretrained ResNet
26
+ model = models.resnet18(pretrained=True)
27
+
28
+ # Freeze all layers (optional but recommended)
29
+ for param in model.parameters():
30
+ param.requires_grad = False
31
+
32
+ # Replace final layer
33
+ model.fc = nn.Linear(model.fc.in_features, NUM_CLASSES)
34
+
35
+ # Move to device
36
+ model = model.to(device)
37
+
38
+ print(model)
39
+
40
+ criterion = nn.CrossEntropyLoss()
41
+
42
+ # Only train last layer
43
+ optimizer = optim.Adam(model.fc.parameters(), lr=0.001)
44
+
45
+ EPOCHS = 5
46
+
47
+ for epoch in range(EPOCHS):
48
+ model.train()
49
+ running_loss = 0.0
50
+
51
+ for images, labels in train_loader:
52
+ images, labels = images.to(device), labels.to(device)
53
+
54
+ # Forward pass
55
+ outputs = model(images)
56
+ loss = criterion(outputs, labels)
57
+
58
+ # Backward
59
+ optimizer.zero_grad()
60
+ loss.backward()
61
+ optimizer.step()
62
+
63
+ running_loss += loss.item()
64
+
65
+ print(f"Epoch [{epoch+1}/{EPOCHS}], Loss: {running_loss:.4f}")
Waste-Management/test.ipynb ADDED
@@ -0,0 +1,346 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "code",
5
+ "execution_count": 14,
6
+ "id": "a8ca6784",
7
+ "metadata": {},
8
+ "outputs": [
9
+ {
10
+ "name": "stdout",
11
+ "output_type": "stream",
12
+ "text": [
13
+ "Fri Mar 27 08:05:49 2026 \n",
14
+ "+-----------------------------------------------------------------------------------------+\n",
15
+ "| NVIDIA-SMI 580.82.07 Driver Version: 580.82.07 CUDA Version: 13.0 |\n",
16
+ "+-----------------------------------------+------------------------+----------------------+\n",
17
+ "| GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC |\n",
18
+ "| Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. |\n",
19
+ "| | | MIG M. |\n",
20
+ "|=========================================+========================+======================|\n",
21
+ "| 0 Tesla T4 Off | 00000000:00:04.0 Off | 0 |\n",
22
+ "| N/A 67C P0 31W / 70W | 223MiB / 15360MiB | 0% Default |\n",
23
+ "| | | N/A |\n",
24
+ "+-----------------------------------------+------------------------+----------------------+\n",
25
+ "\n",
26
+ "+-----------------------------------------------------------------------------------------+\n",
27
+ "| Processes: |\n",
28
+ "| GPU GI CI PID Type Process name GPU Memory |\n",
29
+ "| ID ID Usage |\n",
30
+ "|=========================================================================================|\n",
31
+ "| 0 N/A N/A 2100 C /usr/bin/python3 220MiB |\n",
32
+ "+-----------------------------------------------------------------------------------------+\n"
33
+ ]
34
+ }
35
+ ],
36
+ "source": [
37
+ "!nvidia-smi"
38
+ ]
39
+ },
40
+ {
41
+ "cell_type": "code",
42
+ "execution_count": 15,
43
+ "id": "0bb11592",
44
+ "metadata": {},
45
+ "outputs": [
46
+ {
47
+ "name": "stdout",
48
+ "output_type": "stream",
49
+ "text": [
50
+ "Drive already mounted at /content/drive; to attempt to forcibly remount, call drive.mount(\"/content/drive\", force_remount=True).\n"
51
+ ]
52
+ }
53
+ ],
54
+ "source": [
55
+ "import torch\n",
56
+ "import torchvision\n",
57
+ "from torchvision import transforms, datasets, models\n",
58
+ "import torch.nn as nn\n",
59
+ "import torch.optim as optim\n",
60
+ "from google.colab import drive\n",
61
+ "drive.mount('/content/drive')\n",
62
+ "import os\n",
63
+ "import shutil\n",
64
+ "import random"
65
+ ]
66
+ },
67
+ {
68
+ "cell_type": "code",
69
+ "execution_count": 16,
70
+ "id": "054b3dad",
71
+ "metadata": {},
72
+ "outputs": [],
73
+ "source": [
74
+ "device = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")"
75
+ ]
76
+ },
77
+ {
78
+ "cell_type": "code",
79
+ "execution_count": 17,
80
+ "id": "c78b4c4a",
81
+ "metadata": {},
82
+ "outputs": [
83
+ {
84
+ "data": {
85
+ "text/plain": [
86
+ "['cardboard', 'glass', 'metal', 'paper', 'plastic', 'trash']"
87
+ ]
88
+ },
89
+ "execution_count": 17,
90
+ "metadata": {},
91
+ "output_type": "execute_result"
92
+ }
93
+ ],
94
+ "source": [
95
+ "os.listdir('/content/drive/MyDrive/TrashNet')"
96
+ ]
97
+ },
98
+ {
99
+ "cell_type": "code",
100
+ "execution_count": 18,
101
+ "id": "598ad20a",
102
+ "metadata": {},
103
+ "outputs": [],
104
+ "source": [
105
+ "source = '/content/drive/MyDrive/TrashNet'\n",
106
+ "base = '/content/drive/MyDrive/waste_dataset'\n",
107
+ "\n",
108
+ "train_dir = os.path.join(base, 'train')\n",
109
+ "val_dir = os.path.join(base, 'val')\n",
110
+ "\n",
111
+ "os.makedirs(train_dir, exist_ok=True)\n",
112
+ "os.makedirs(val_dir, exist_ok=True)\n",
113
+ "\n",
114
+ "for class_name in os.listdir(source):\n",
115
+ " class_path = os.path.join(source, class_name)\n",
116
+ " \n",
117
+ " images = os.listdir(class_path)\n",
118
+ " random.shuffle(images)\n",
119
+ "\n",
120
+ " split = int(0.8 * len(images))\n",
121
+ "\n",
122
+ " train_images = images[:split]\n",
123
+ " val_images = images[split:]\n",
124
+ "\n",
125
+ " os.makedirs(os.path.join(train_dir, class_name), exist_ok=True)\n",
126
+ " os.makedirs(os.path.join(val_dir, class_name), exist_ok=True)\n",
127
+ "\n",
128
+ " for img in train_images:\n",
129
+ " shutil.copy(os.path.join(class_path, img),\n",
130
+ " os.path.join(train_dir, class_name, img))\n",
131
+ "\n",
132
+ " for img in val_images:\n",
133
+ " shutil.copy(os.path.join(class_path, img),\n",
134
+ " os.path.join(val_dir, class_name, img))"
135
+ ]
136
+ },
137
+ {
138
+ "cell_type": "code",
139
+ "execution_count": 21,
140
+ "id": "a743b4fb",
141
+ "metadata": {},
142
+ "outputs": [
143
+ {
144
+ "name": "stdout",
145
+ "output_type": "stream",
146
+ "text": [
147
+ "['cardboard', 'glass', 'metal', 'paper', 'plastic', 'trash']\n",
148
+ "2422\n",
149
+ "911\n"
150
+ ]
151
+ }
152
+ ],
153
+ "source": [
154
+ "train_path = '/content/drive/MyDrive/waste_dataset/train'\n",
155
+ "val_path = '/content/drive/MyDrive/waste_dataset/val'\n",
156
+ "\n",
157
+ "from torchvision import transforms\n",
158
+ "\n",
159
+ "train_transform = transforms.Compose([\n",
160
+ " transforms.Resize((224,224)),\n",
161
+ " transforms.RandomHorizontalFlip(),\n",
162
+ " transforms.RandomRotation(15),\n",
163
+ " transforms.ToTensor(),\n",
164
+ " transforms.Normalize([0.485,0.456,0.406],\n",
165
+ " [0.229,0.224,0.225])\n",
166
+ "])\n",
167
+ "\n",
168
+ "val_transform = transforms.Compose([\n",
169
+ " transforms.Resize((224,224)),\n",
170
+ " transforms.ToTensor(),\n",
171
+ " transforms.Normalize([0.485,0.456,0.406],\n",
172
+ " [0.229,0.224,0.225])\n",
173
+ "])\n",
174
+ "\n",
175
+ "from torchvision import datasets\n",
176
+ "\n",
177
+ "train_data = datasets.ImageFolder(train_path, transform=train_transform)\n",
178
+ "val_data = datasets.ImageFolder(val_path, transform=val_transform)\n",
179
+ "\n",
180
+ "\n",
181
+ "from torch.utils.data import DataLoader\n",
182
+ "\n",
183
+ "train_loader = DataLoader(train_data, batch_size=32, shuffle=True)\n",
184
+ "val_loader = DataLoader(val_data, batch_size=32)\n",
185
+ "\n",
186
+ "\n",
187
+ "print(train_data.classes)\n",
188
+ "print(len(train_data))\n",
189
+ "print(len(val_data))"
190
+ ]
191
+ },
192
+ {
193
+ "cell_type": "code",
194
+ "execution_count": 22,
195
+ "id": "01fc969b",
196
+ "metadata": {},
197
+ "outputs": [
198
+ {
199
+ "name": "stdout",
200
+ "output_type": "stream",
201
+ "text": [
202
+ "Linear(in_features=2048, out_features=6, bias=True)\n"
203
+ ]
204
+ }
205
+ ],
206
+ "source": [
207
+ "from torchvision import models\n",
208
+ "import torch.nn as nn\n",
209
+ "\n",
210
+ "model = models.resnet50(pretrained=True)\n",
211
+ "\n",
212
+ "model.fc = nn.Linear(model.fc.in_features, 6)\n",
213
+ "\n",
214
+ "import torch.optim as optim\n",
215
+ "\n",
216
+ "criterion = nn.CrossEntropyLoss()\n",
217
+ "optimizer = optim.Adam(model.parameters(), lr=0.001)\n",
218
+ "\n",
219
+ "print(model.fc)"
220
+ ]
221
+ },
222
+ {
223
+ "cell_type": "code",
224
+ "execution_count": 23,
225
+ "id": "17fede0a",
226
+ "metadata": {},
227
+ "outputs": [],
228
+ "source": [
229
+ "# Freeze\n",
230
+ "for param in model.parameters():\n",
231
+ " param.requires_grad = False\n",
232
+ "\n",
233
+ "# Replace final layer\n",
234
+ "model.fc = nn.Linear(model.fc.in_features, 6)\n",
235
+ "\n",
236
+ "# Move to GPU\n",
237
+ "model = model.to(device)\n",
238
+ "\n",
239
+ "# Optimizer (IMPORTANT)\n",
240
+ "optimizer = optim.Adam(model.fc.parameters(), lr=0.001)"
241
+ ]
242
+ },
243
+ {
244
+ "cell_type": "code",
245
+ "execution_count": 24,
246
+ "id": "b441ea41",
247
+ "metadata": {},
248
+ "outputs": [
249
+ {
250
+ "name": "stdout",
251
+ "output_type": "stream",
252
+ "text": [
253
+ "Epoch [1/3], Loss: 1.1354\n",
254
+ "Validation Accuracy: 69.48%\n",
255
+ "Epoch [2/3], Loss: 0.7224\n",
256
+ "Validation Accuracy: 79.80%\n",
257
+ "Epoch [3/3], Loss: 0.6208\n",
258
+ "Validation Accuracy: 82.44%\n"
259
+ ]
260
+ }
261
+ ],
262
+ "source": [
263
+ "num_epochs = 3\n",
264
+ "\n",
265
+ "for epoch in range(num_epochs):\n",
266
+ " model.train()\n",
267
+ " running_loss = 0.0\n",
268
+ "\n",
269
+ " for images, labels in train_loader:\n",
270
+ " images, labels = images.to(device), labels.to(device)\n",
271
+ "\n",
272
+ " optimizer.zero_grad()\n",
273
+ "\n",
274
+ " outputs = model(images)\n",
275
+ " loss = criterion(outputs, labels)\n",
276
+ "\n",
277
+ " loss.backward()\n",
278
+ " optimizer.step()\n",
279
+ "\n",
280
+ " running_loss += loss.item()\n",
281
+ "\n",
282
+ " print(f\"Epoch [{epoch+1}/{num_epochs}], Loss: {running_loss/len(train_loader):.4f}\")\n",
283
+ "\n",
284
+ " \n",
285
+ " model.eval()\n",
286
+ " correct = 0\n",
287
+ " total = 0\n",
288
+ "\n",
289
+ " with torch.no_grad():\n",
290
+ " for images, labels in val_loader:\n",
291
+ " images, labels = images.to(device), labels.to(device)\n",
292
+ "\n",
293
+ " outputs = model(images)\n",
294
+ " _, predicted = torch.max(outputs, 1)\n",
295
+ "\n",
296
+ " total += labels.size(0)\n",
297
+ " correct += (predicted == labels).sum().item()\n",
298
+ "\n",
299
+ " print(f\"Validation Accuracy: {100 * correct / total:.2f}%\")"
300
+ ]
301
+ },
302
+ {
303
+ "cell_type": "code",
304
+ "execution_count": 27,
305
+ "id": "1a5ce395",
306
+ "metadata": {},
307
+ "outputs": [
308
+ {
309
+ "name": "stdout",
310
+ "output_type": "stream",
311
+ "text": [
312
+ "Model Saved Succesfully\n",
313
+ "['.config', 'waste_classifier.pth', 'drive', 'sample_data']\n"
314
+ ]
315
+ }
316
+ ],
317
+ "source": [
318
+ "torch.save(model.state_dict(), \"waste_classifier.pth\")\n",
319
+ "print(\"Model Saved Succesfully\")\n",
320
+ "\n",
321
+ "print(os.listdir())"
322
+ ]
323
+ }
324
+ ],
325
+ "metadata": {
326
+ "kernelspec": {
327
+ "display_name": "Python 3 (ipykernel)",
328
+ "language": "python",
329
+ "name": "python3"
330
+ },
331
+ "language_info": {
332
+ "codemirror_mode": {
333
+ "name": "ipython",
334
+ "version": 3
335
+ },
336
+ "file_extension": ".py",
337
+ "mimetype": "text/x-python",
338
+ "name": "python",
339
+ "nbconvert_exporter": "python",
340
+ "pygments_lexer": "ipython3",
341
+ "version": "3.12.13"
342
+ }
343
+ },
344
+ "nbformat": 4,
345
+ "nbformat_minor": 5
346
+ }
app.py ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ from fastapi import FastAPI
2
+
3
+ app = FastAPI()
4
+
5
+ @app.get("/")
6
+ def greet_json():
7
+ return {"Hello": "World!"}
requirements.txt ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ fastapi
2
+ uvicorn[standard]